MCP server for generating enterprise-grade architecture diagrams via AI image providers
Diagram Forge shows solid effort in parameter constraints and descriptions, but several tools lack comprehensive schema documentation and error guidance. The 6 tools vary in quality: generate_diagram and edit_diagram have complete enums and constraints, but output schemas are not documented in the code. list_templates, list_styles, and provider_health lack input schema detail. get_usage_report has good parameters but missing output specification. Error handling is present but generic, responses show basic error dict structure but lack recovery guidance or actionable next steps per the pattern:recovery-guide rubric. Tool naming is verb-forward and appropriate (generate_, edit_, list_, provider_, get_). Descriptions are adequate (80-150 chars) but could be more LLM-optimized per pattern:tool-description baseline (target 50-200 chars). The server uses FastMCP (modern), proper parameter validation (e.g., enums for diagram_type, resolution, aspect_ratio), and includes smart output_path rejection logic to prevent silent failures, this shows security awareness. However, the codebase truncates before showing tool implementations, so return schemas are inferred rather than explicitly visible.
Edit an existing diagram using an AI provider's edit/variation capability.
Generate an architecture diagram from a text prompt.
Generate cost and usage report for diagram generations.
List all available style reference images.
List all available diagram templates with their metadata.
Check health and connectivity of configured image generation providers.
Output schemas not documented in visible code. generate_diagram, edit_diagram, list_templates, list_styles, provider_health, and get_usage_report all lack explicit return type documentation. LLMs cannot plan downstream tool calls or extract fields without knowing the response structure.
Error handling lacks recovery guidance. The _run_tool and _run_tool_async wrappers return generic error dicts with only 'status', 'error', 'tool', and 'elapsed_ms'. Per pattern:recovery-guide, errors should tell the LLM what to do next (e.g., 'Provider not found. Check provider_health() to see available providers').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 65 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
list_templates and list_styles have empty input schemas ({}) but lack explicit documentation of what they return (structure, field names, pagination). A discovery tool should explain 'Call this first to see available X' and document the response structure.
provider_health parameter 'provider' is nullable and optional but lacks clear guidance on what happens when omitted. The description says 'all if not specified' but does not clarify the response structure (per-provider status dict vs list vs single status).
generate_diagram 'provider' and 'model' parameters accept 'auto' and nullable, but descriptions are verbose disclaimers ('LEAVE AS DEFAULT', 'LEAVE UNSET unless benchmarking') rather than actionable LLM guidance. LLMs do not follow imperative instructions well, use parameter constraints and smart defaults instead.
No explicit pagination or result limits documented. list_templates and list_styles may return unbounded lists. Per pattern:paginated-result and mxe:enforce-result-limits, all list tools should return total_count, limit, and guidance on pagination.