An MCP server for Penrose that provides tools for creating and manipulating mathematical diagrams through the Model Context Protocol
The Penrose MCP server provides 4 tools with explicit schemas and basic descriptions, but has significant gaps in parameter documentation, output schema clarity, and error handling guidance. Tool names follow verb_noun conventions (create_*, generate_*), which is good. However, most parameters lack individual descriptions, they are defined in the schema with minimal context. Output schemas are not documented in the tool descriptions, forcing LLMs to infer what fields they'll receive. Error handling is absent: there are no recovery hints, no invalid-input guidance, and no classification of error types. The server implements resources correctly and has in-memory storage, but the tool interface itself is underspecified for production use.
Create domain-specific language (DSL) definitions
Define visual representation rules
Define mathematical objects and relationships
Generate diagram from domain/substance/style
Parameter descriptions are missing or minimal throughout all tools. Schema properties like 'predicates', 'args', 'selector', 'properties', 'constraints' have type definitions but no descriptions. LLMs cannot infer meaning from names alone and will guess wrong on complex parameters like 'constraints' (CSS vs mathematical syntax?).
Output schemas are not documented in any tool description. Agents cannot plan downstream calls or extract data when they don't know what fields will be returned. For example, create_domain should state it returns {name, types, status} or similar; generate_diagram should document the format (SVG string? JSON object? File path?).
Error handling is absent. Tool descriptions do not explain what errors can occur, how to recover, or which errors are retryable. For example, if generate_diagram fails because a referenced domain does not exist, the LLM has no guidance. There are no error categorizations or recovery hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 59 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 20 | - | v1 |
'variation' parameter in generate_diagram is present in the schema but completely undescribed. What are valid values? What does it control? Is it optional? This ambiguity will cause LLM confusion and errors.
No validation constraints on free-form string parameters. For example, 'name' in create_domain and 'domain' in create_substance accept any string, there are no length limits, pattern requirements, or character restrictions documented. This invites hallucinated invalid values.
No idempotency guarantees documented. If an LLM retries create_domain with the same parameters, will it create a duplicate or return the existing one? This ambiguity risks silent duplication or unexpected overwrites.