MCP server for DrugBank pharmaceutical database access providing comprehensive drug information including search, interactions, pathways, and chemical properties
Single unified tool 'drugbank_info' with 16 methods bundled into one parameter enum. Tool has a comprehensive description (1,200+ chars) and a well-structured JSON Schema with all parameters typed and described. However, the mega-tool design violates single-responsibility principle, 16 distinct operations (search_by_name, get_drug_details, etc.) should be separate tools so LLMs can reason about intent independently. Schema is complete and valid, but descriptions lack actionable guidance on when to use each method. No output schema documented. Error handling not visible in provided code. Parameter descriptions are adequate but generic ('Search query', 'DrugBank ID'). No examples of actual response structures.
Access comprehensive pharmaceutical data from DrugBank database (13,000+ drugs). Available methods: 1. search_by_name - Search drugs by name (fuzzy matching) Parameters: query (required), limit (optional, default: 20) Example: { "method": "search_by_name", "query": "aspirin" } 2. get_drug_details - Get complete drug information by DrugBank ID Parameters: drugbank_id (required) Example: { "method": "get_drug_details", "drugbank_id": "DB00945" } 3. search_by_indication - Find drugs by medical indication Parameters: query (required), limit (optional, default: 20) Example: { "method": "search_by_indication", "query": "pain" } 4. search_by_target - Find drugs by target protein/enzyme Parameters: target (required), limit (optional, default: 20) Example: { "method": "search_by_target", "target": "COX-2" } 5. get_drug_interactions - Get drug-drug interactions Parameters: drugbank_id (required) Example: { "method": "get_drug_interactions", "drugbank_id": "DB00945" } 6. search_by_atc_code - Search by ATC classification code Parameters: code (required), limit (optional, default: 20) Example: { "method": "search_by_atc_code", "code": "N02BA" } 7. get_pathways - Get metabolic pathways for a drug Parameters: drugbank_id (required) Example: { "method": "get_pathways", "drugbank_id": "DB00945" } 8. search_by_structure - Search by chemical structure (SMILES/InChI) Parameters: smiles or inchi (required), limit (optional, default: 20) Example: { "method": "search_by_structure", "smiles": "CC(=O)Oc1ccccc1C(=O)O" } 9. get_products - Get market products for a drug Parameters: drugbank_id (required), country (optional) Example: { "method": "get_products", "drugbank_id": "DB00945", "country": "US" } 10. search_by_category - Search drugs by category Parameters: category (required), limit (optional, default: 20) Example: { "method": "search_by_category", "category": "Anti-inflammatory" } 11. get_external_identifiers - Get cross-database identifiers (PubChem, ChEMBL, KEGG, etc.) Parameters: drugbank_id (required) Example: { "method": "get_external_identifiers", "drugbank_id": "DB00945" } 12. search_by_halflife - Find drugs by elimination half-life range (in hours) Parameters: min_hours (optional), max_hours (optional), limit (optional, default: 20) Example: { "method": "search_by_halflife", "min_hours": 12, "max_hours": 48 } 13. get_similar_drugs - Find drugs similar to a given drug (by shared targets, categories, ATC codes) Parameters: drugbank_id (required), limit (optional, default: 20) Example: { "method": "get_similar_drugs", "drugbank_id": "DB00945" } 14. search_by_carrier - Find drugs by carrier protein (proteins that transport drugs in the body) Parameters: carrier (required), limit (optional, default: 20) Example: { "method": "search_by_carrier", "carrier": "Albumin" } 15. search_by_transporter - Find drugs by transporter protein (membrane proteins that move drugs across cells) Parameters: transporter (required), limit (optional, default: 20) Example: { "method": "search_by_transporter", "transporter": "P-glycoprotein" } 16. get_salts - Get salt forms for a drug (e.g., hydrochloride, sulfate) Parameters: drugbank_id (required) Example: { "method": "get_salts", "drugbank_id": "DB00945" }
Mega-tool anti-pattern: 16 distinct operations bundled into a single tool via method enum. LLMs cannot reason about intent when search_by_name, get_drug_details, and get_pathways are all the same tool. Should be 16 separate tools (search_drugs_by_name, get_drug_details, get_drug_pathways, etc.) following verb_noun convention.
No output schema documented. Tool description lists 16 methods but does not specify what each returns (fields, types, structure). LLMs cannot plan downstream calls or extract data without knowing response shape.
Parameter descriptions lack method-specific guidance. 'Search query (for search_by_name, search_by_indication)' is generic. Should explain: 'Fuzzy-matched drug name or indication (e.g., aspirin, pain relief). Used by search_by_name and search_by_indication methods.'
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 47 | <=2025-11-25 | v2 |
No error handling guidance visible. Tool description does not explain what happens on invalid drugbank_id, malformed SMILES, or empty results. LLMs need recovery hints: 'If drugbank_id not found, try search_by_name() first.'
No pagination or result limits documented. Tool accepts 'limit' parameter (default 20) but description does not state max results, whether pagination is supported, or how to fetch next page. Large result sets risk context window exhaustion.