MCP server for querying Metal-Organic Framework databases
Single tool 'mofty' has a comprehensive schema with all 10 parameters typed and described. Tool name lacks action verb (should be 'query_mof' or 'search_mof'). Description is detailed (280+ chars) but reads as API documentation rather than LLM-optimized guidance. Parameter descriptions are technical but lack usage hints, constraints, and examples of valid values. No output schema documented. Error handling present but minimal. Composition is sound (single responsibility), but naming and description clarity need improvement for agent discoverability.
Query Metal-Organic Framework databases. id: identifier — "refcode:SAHYIK", "mofid:[Zn]...", "name:MOF-5", or bare string query: FTS5 full-text search ("CO2 uptake", always AND with filters) elements: element filter, AND logic ("Zn", "Zn,Cu" = contains both) lcd: largest cavity diameter, Å ("3..9", ">5", "<12") pld: pore limiting diameter, Å sa: surface area, m²/g vf: void fraction, 0–1 isotherms: gas filter ("CO2", "CH4") — search: MOFs with data; detail: scope display database: subset filter ("CoRE", "hMOF", "CSD", "QMOF", "MP") sort: sort order ("lcd", "!sa", "!lcd,sa", "relevance") page: page number (10 results/page) No args → shape of entire database (collections, property ranges, top elements). id provided → single MOF detail (id wins; other filters ignored except isotherms). Any filter → search with results + shape on page 1.
Tool name 'mofty' does not start with action verb. Should be 'query_mof', 'search_mof', or 'get_mof' to signal intent to LLM.
No output schema documented. LLM cannot predict response structure or plan downstream operations. Must document return type (e.g., markdown string with fields: name, refcode, properties, isotherms, hints).
Parameter descriptions are technical API docs, not LLM-optimized. E.g., 'lcd' says 'largest cavity diameter, Å ("3..9", ">5", "<12")' but does not explain when to use it or what it filters. Add: 'Filter MOFs by largest cavity diameter in Ångströms. Use range syntax: "3..9" (3 to 9), ">5" (greater than 5), "<12" (less than 12).'
Parameter 'sort' accepts free-form strings ('lcd', '!sa', '!lcd,sa', 'relevance') without enum constraint. LLM may hallucinate invalid sort keys. Declare as enum: ["lcd", "!lcd", "sa", "!sa", "relevance"] with description of ! prefix meaning descending.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 50 | 2026-07-28+ | v2 |
Parameter 'database' accepts free-form strings without enum. Should be enum: ["CoRE", "hMOF", "CSD", "QMOF", "MP"] to prevent invalid queries.