Molecular Property Profiling Workflow
SkillMonitoring & opsComprehensive molecular property analysis covering basic info, hydrophobicity, H-bonding, structural complexity, topology, drug-likeness, charge distribution, and complexity metrics.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Molecular Property Profiling Workflow skill
What this skill tells your AI
The instructions your AI receives, as published by spectrai-initiative/innoclaw in .claude/skills/molecular-property-profiling/SKILL.md and read by ahel’s review.
Usage
1. MCP Server Definition
Use the same DrugSDAClient class as defined in previous skills.
2. Comprehensive Molecular Property Analysis
This workflow computes a comprehensive set of molecular descriptors across 8 different categories, providing a complete molecular profile for QSAR modeling, drug discovery, and molecular analysis.
Workflow Steps:
- Basic Properties - Molecular formula, weight, atom counts, bond counts
- Hydrophobicity - LogP, molar refractivity, lipophilicity descriptors
- Hydrogen Bonding - H-bond donors/acceptors, TPSA
- Structural Complexity - Ring counts, aromatic rings, rotatable bonds
- Topological Descriptors - Chi indices, Kappa shape indices
- Drug Chemistry - QED score, Lipinski violations
- Charge Properties - Gasteiger charges, formal charge
- Complexity Metrics - Molecular complexity, asphericity
Implementation:
from collections import defaultdict
def merge_lists_by_smiles(*lists):
"""Merge multiple descriptor lists by SMILES key"""
merged = defaultdict(dict)
for lst in lists:
for d in lst:
smiles = d['smiles']
merged[smiles].update(d)
return list(merged.values())
client = DrugSDAClient("https://scp.intern-ai.org.cn/api/v1/mcp/2/DrugSDA-Tool")
if not await client.connect():
print("connection failed")
return
## Input: List of SMILES strings
smiles_list = [
'Nc1nnc(S(=O)(=O)NCCc2ccc(O)cc2)s1',
'COc1ccc2c(=O)cc(C(=O)N3CCN(c4ccc(F)cc4)CC3)oc2c1',
'CCCC1CCC(CC(=O)Cl)(C2CCCCC2)CC1'
]
## Step 1: Calculate basic molecular properties
result = await client.session.call_tool(
"calculate_mol_basic_info",
arguments={"smiles_list": smiles_list}
)
basic_metrics = client.parse_result(result)['metrics']
## Step 2: Calculate hydrophobicity descriptors
result = await client.session.call_tool(
"calculate_mol_hydrophobicity",
arguments={"smiles_list": smiles_list}
)
hydrophobicity_metrics = client.parse_result(result)['metrics']
## Step 3: Calculate hydrogen bonding properties
result = await client.session.call_tool(
"calculate_mol_hbond",
arguments={"smiles_list": smiles_list}
)
hbond_metrics = client.parse_result(result)['metrics']
## Step 4: Calculate structural complexity
result = await client.session.call_tool(
"calculate_mol_structure_complexity",
arguments={"smiles_list": smiles_list}
)
structure_metrics = client.parse_result(result)['metrics']
## Step 5: Calculate topological descriptors
result = await client.session.call_tool(
"calculate_mol_topology",
arguments={"smiles_list": smiles_list}
)
topology_metrics = client.parse_result(result)['metrics']
## Step 6: Calculate drug chemistry properties
result = await client.session.call_tool(
"calculate_mol_drug_chemistry",
arguments={"smiles_list": smiles_list}
)
chemistry_metrics = client.parse_result(result)['metrics']
## Step 7: Calculate charge properties
result = await client.session.call_tool(
"calculate_mol_charge",
arguments={"smiles_list": smiles_list}
)
charge_metrics = client.parse_result(result)['metrics']
## Step 8: Calculate complexity metrics
result = await client.session.call_tool(
"calculate_mol_complexity",
arguments={"smiles_list": smiles_list}
)
complexity_metrics = client.parse_result(result)['metrics']
## Merge all descriptors by SMILES
complete_profiles = merge_lists_by_smiles(
basic_metrics,
hydrophobicity_metrics,
hbond_metrics,
structure_metrics,
topology_metrics,
chemistry_metrics,
charge_metrics,
complexity_metrics
)
## Display results
for profile in complete_profiles:
print(f"\nSMILES: {profile['smiles']}")
print(f"Molecular Formula: {profile['molecular_formula']}")
print(f"Molecular Weight: {profile['molecular_weight']:.2f}")
print(f"LogP: {profile['logp']:.2f}")
print(f"QED Score: {profile['qed']:.4f}")
print(f"H-Bond Donors: {profile['num_h_donors']}")
print(f"H-Bond Acceptors: {profile['num_h_acceptors']}")
print(f"TPSA: {profile['tpsa']:.2f}")
print(f"Lipinski Violations: {profile['lipinski_rule_of_5_violations']}")
await client.disconnect()
Descriptor Categories
1. Basic Properties
molecular_formula: Molecular formulamolecular_weight: Molecular weight (Da)num_heavy_atoms: Count of non-hydrogen atomsnum_atoms,num_bonds: Total atom and bond countsformal_charge: Overall formal charge
2. Hydrophobicity
logp: Partition coefficient (lipophilicity)molar_refractivity: Molar refractivityfraction_csp3: Fraction of sp3 carbons (saturation)
3. Hydrogen Bonding
num_h_donors: H-bond donor countnum_h_acceptors: H-bond acceptor counttpsa: Topological polar surface area (Ų)
4. Structural Complexity
num_rings,num_aromatic_rings: Ring countsnum_rotatable_bonds: Flexible bondsnum_heteroatoms: Non-C/H atoms
5. Topological Descriptors
chi0v-chi4v: Chi connectivity indiceskappa1-kappa3: Kappa shape indiceshall_kier_alpha: Hall-Kier alpha value
6. Drug Chemistry
qed: Quantitative Estimate of Drug-likeness (0-1)lipinski_rule_of_5_violations: Lipinski violations (0-4)
7. Charge Properties
min/max/avg_gasteiger_charge: Gasteiger partial chargesgasteiger_charge_range: Charge distribution range
8. Complexity Metrics
molecular_complexity: Bertz complexity indexaromatic_proportion: Fraction of aromatic atomsasphericity: 3D shape asphericity
Input/Output
Input:
smiles_list: List of SMILES strings
Output:
- List of dictionaries, each containing 50+ molecular descriptors for one molecule
Applications
- QSAR Modeling: Use descriptors as features for predictive models
- Drug Discovery: Screen compounds by drug-likeness and physicochemical properties
- Chemical Space Analysis: Visualize and cluster molecules by properties
- Lead Optimization: Track property changes during optimization
- Virtual Screening: Filter libraries by desired property ranges
Property Filters for Drug-likeness
Typical ranges for oral drug candidates:
- Molecular Weight: 150-500 Da
- LogP: 0-5
- H-Bond Donors: ≤ 5
- H-Bond Acceptors: ≤ 10
- TPSA: 20-140 Ų
- Rotatable Bonds: ≤ 10
- QED Score: > 0.5
Signals
- GitHub stars
- 391
- Forks
- 28
- Last commit
- Aug 2026
ahel recommends instead
Advanced
- Catalog kind
- skill
- Gateway key
molecular-property-profiling-spectrai-initiative- Source
- github.com/spectrai-initiative/innoclaw