MCP server exposing bioinformatics pipelines with enforced provenance
Three tools with complete input schemas and reasonable descriptions. Naming follows verb_noun convention (molecule_properties, fingerprint, similarity_search). Descriptions are adequate (50-150 chars) but lack actionable context for LLM selection. Parameters are typed with constraints (n_bits 64-8192, radius 1-4, threshold 0-1, top_k 1-1000), but descriptions are minimal, e.g., 'SMILES string of the molecule' repeats the parameter name without explaining what SMILES is or when to use it. Output schemas are not documented in the source; tool handlers return ToolResult objects with payload dicts, but the structure is inferred from code rather than formally declared. Error handling returns structured ToolResult with exit_status and complete flags, but error messages lack recovery guidance (e.g., 'RDKit could not parse' does not suggest next steps). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all three being read-only operations.
Compute an ECFP fingerprint for a SMILES string, as hex.
Compute RDKit descriptors for a SMILES string.
Top-k Tanimoto neighbours from the configured fpsearch index. Returns the engine's own pruning report alongside the hits.
Parameter descriptions lack actionable context. 'SMILES string of the molecule' repeats the name without explaining what SMILES is, when to use it, or valid formats. LLMs cannot infer domain knowledge.
Output schemas are not formally documented. Tool handlers return ToolResult with payload dicts (e.g., {smiles, canonical_smiles, molecular_weight, ...}), but the structure is inferred from code. LLMs need explicit schema declarations to plan downstream calls.
Error messages lack recovery guidance. 'RDKit could not parse' and 'fpsearch failed' do not tell the LLM what to do next. Should suggest: 'Invalid SMILES. Try a simpler structure or call search_similar_molecules() instead.'
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | <=2025-11-25 | v2 |
Tool descriptions do not explain when to use each tool or how they compose. 'Compute RDKit descriptors' is what it does, but not when an LLM should call it vs. fingerprint or similarity_search. Missing dependency hints.
No tool annotations despite all three tools being read-only. Adding readOnlyHint=true would signal to agents that these calls are safe to retry and have no side effects.