This is a multi-server repository with 31 tools spanning 4 distinct domains (D2 diagrams, OpenStreetMap, memory, task management). Quality is highly inconsistent across tools. Many lack input schemas, descriptions are often generic or missing, and parameter documentation is sparse. Only 13 of 31 tools have visible input schemas in the provided code. Error handling is absent or minimal. The repository shows engineering competence in infrastructure (multi-transport support, Makefile targets) but lacks disciplined tool API design. Average tool score: 42 across sampled definitions.
Most descriptions are generic or under-specified. Examples: d2__create__mlc 'Create a new D2 diagram from D2 syntax' lacks WHAT parameters it requires, WHEN to call it vs other creation tools, and what the return value contains. d2__export__mlc 'Export a D2 diagram to SVG or other formats' doesn't specify which formats are supported or how to select them.
Add explicit input schemas (JSON Schema with type, required, properties) to all 10 D2 oracle tools and task mutation tools. Example: d2__create__mlc should declare {"d2_syntax": {"type": "string", "description": "Valid D2 diagram syntax. See https://d2lang.com/tour/syntax for reference."}, "filename": {"type": "string", "description": "Output file name (e.g. 'architecture.svg'). Format determined by extension."}}
Expand tool descriptions from generic 1-liners to 50-150 character explanations: WHEN to use (distinguishing similar tools), WHAT it does, prerequisites. Example for d2__export__mlc: 'Export a rendered D2 diagram to image or PDF format. Returns byte payload. Call after d2__create__mlc or d2__render_artifact__mlc to generate final output.'
Document output schemas for all tools. For OpenStreetMap: geocode_address should document {"latitude": number, "longitude": number, "name": string, "bounding_box": {"min_lat", "min_lon", "max_lat", "max_lon"}} so LLM knows what fields to expect.
Rename tools to verb_noun convention without double-underscore and 'mlc' suffixes: memory__memorize__mlc → store_memory, memory__search_nodes__mlc → search_memory, task__task_create__mlc → create_task, task__task_update__mlc → update_task. This reduces LLM parsing overhead.
For find_nearby_places, search_category, and similar discovery tools: add enum constraints or descriptions for 'categories' param. Example: categories enum: ['restaurant', 'cafe', 'school', 'hospital', 'parking', 'ev_charging']. Or document 'OpenStreetMap amenity tags, e.g. amenity=restaurant, amenity=parking. See https://wiki.openstreetmap.org/wiki/Map_Features.'
Score history
Overall score trend
↑ 1 points across a rubric change (v1 → v2)
50/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
D
50
2026-07-28+
v2
2026-03-09
F
49
-
v1
d2__oracle_rename__mlcwrite35/100
Rename an element in a D2 diagram using Oracle API
d2__oracle_serialize__mlcread only33/100
Serialize a D2 diagram graph state back to D2 text using Oracle API
d2__oracle_set__mlcwrite35/100
Set attributes on a D2 diagram element using Oracle API
Destructive tools (d2__oracle_delete__mlc, memory__memorize__mlc for overwrites, task operations) lack error handling and confirmation patterns. No dry-run support or recovery guidance documented.
Parameter descriptions are minimal or absent. Examples: d2__diagram_generation__mlc accepts 'requirement' string but doesn't explain format (free text? structured JSON? example patterns?). find_nearby_places 'categories' param is undocumented on allowed values, LLM must guess valid category names.
Memory and task tools use opaque naming conventions (memory__memorize__mlc, task__task_create__mlc) with double underscores and 'mlc' suffixes that violate verb_noun convention. Names obscure intent; LLM must parse naming to understand 'memorize' is store/write, 'create' is create.
No pagination or limit enforcement documented for list/search tools. find_nearby_places accepts 'limit' param with default=10, but no max enforced. OpenStreetMap search_category and others not capped, risk of context window exhaustion.
Add error handling and recovery guidance to destructive operations. d2__oracle_delete__mlc should document: 'Deletes are irreversible. Returns success/failure. If deletion fails, check error message for reason (element not found, invalid path, etc.) and suggest recovery steps.'
Implement pagination for list/search tools. Add 'offset' and 'limit' params (default limit=20, max=100) and document return structure includes 'total_count' and 'next_offset' so LLM can iterate without context explosion.
Document return types for all write operations (create_*, update_*, delete_*). Example: task__task_create__mlc should return {"task_id": string, "created_at": ISO8601 string, "status": "pending"} so LLM can chain to task__task_get__mlc or task__task_update__mlc without extra lookups.
Add tool annotations (readOnlyHint, destructiveHint, idempotentHint) using mark3labs/mcp-go schema support. Example: d2__oracle_delete__mlc should set destructiveHint=true; geocode_address should set readOnlyHint=true. This signals to LLM which operations have side effects.