MCP server for design system component introspection and token retrieval
This STDIO-only MCP server has only 2 tools with minimal complexity. Both tools have basic schema definitions and descriptions, but lack critical context for LLM tool selection. The getComponentProps tool accepts a 'name' parameter with a string type but no description of what constitutes valid component names or where components are located. The getTokens tool has no input schema at all (empty input object). Descriptions are functional but generic (103 chars and 85 chars respectively), well below the 194-char baseline for A-tier tools. Neither tool documents output structure for LLM planning. Error handling exists but is minimal: getComponentProps returns isError=true with a text message, while getTokens lacks proper error categorization. The implementation uses ts-morph to parse TypeScript, but this internal complexity is never exposed to the LLM, it only sees the end result as JSON text. No pagination, no field constraints, no guidance on when to call which tool. Tool composition is straightforward (two independent read-only tools), but the interface does not match user intent patterns from the rubric (e.g., 'I want to see what props Button accepts' would need an intermediate lookup, since the tool requires a hardcoded filename format). STDIO transport caps the protocol readiness score at 50 regardless of other factors.
Retrieves the properties (props) interface of a design system component by analyzing its TypeScript source file
Retrieves all design system tokens from JSON files in the design-system/tokens directory
getTokens has no input schema. The tool definition shows 'async ()' with no Zod schema, making it impossible for LLMs to understand what parameters (if any) it accepts.
Descriptions are generic and lack LLM-optimization guidance. getComponentProps: 'Retrieves the properties (props) interface of a design system component by analyzing its TypeScript source file' (103 chars) does not explain WHEN to use this tool, what the 'name' parameter should be (component filename? import path?), or what fields the LLM should expect in the output. getTokens: 'Retrieves all design system tokens from JSON files in the design-system/tokens directory' (85 chars) does not explain what tokens are or when the agent should call this vs getComponentProps. Baseline for A-tier tools is 194 chars; both fall well short.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 40 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 35 | - | v1 |
Parameter 'name' in getComponentProps has no description. The rubric states: 'Add a non-empty description to every input parameter. LLMs cannot infer parameter meaning from names alone.' The 'name' parameter is ambiguous: is it 'Button' or 'button' or './Button.tsx' or 'components/Button'? What if the component doesn't exist, does the LLM retry with a different case or ask the user?
Output schemas are not documented. Both tools return JSON text wrapped in a single content item with type='text'. The LLM does not know: (a) what fields exist in the returned JSON, (b) whether the response is paginated or capped, (c) how to extract component names from the tokens result for reuse in getComponentProps. Rubric: 'Document the output schema. LLMs need to know what fields to expect so they can plan downstream tool calls and extract the right data.'
Error responses do not guide recovery. When getComponentProps returns isError=true with message 'Component Button not found', the LLM does not know: (a) should it retry with a different name, (b) should it call getTokens to discover available components, (c) is the component in a different directory? Rubric: 'Error responses must tell the LLM what to do next.'
Tool composition lacks discoverability. The tools do not establish a clear relationship. If an LLM wants to 'show me all components', it has no discovery tool. It must call getTokens (which returns design tokens, not component names), then guess at component names for getComponentProps. This violates the pattern: 'Ensure tool A's output contains the IDs and references tool B needs.' getTokens should include available component names, or a third discovery tool should list them.