MCP server that traces call graphs, maps HTTP routes, and analyzes TypeScript/Next.js codebases
The server defines 7 tools with explicit Zod schemas and descriptions. However, most tool descriptions are generic (10-40 chars), lack implementation detail, and omit critical context about what each tool returns or when to use it. Parameter descriptions are present but minimal. Most critically, output schemas are undocumented, the LLM cannot predict what structure these tools return, making composition and chaining difficult. Error handling is basic (catch and stringify). Tool names are clear (verb-noun style), but several suffer from vagueness about scope and dependencies.
List all discovered HTTP routes in the project.
List HTTP calls in the code that do not match any known route.
Trace a React component by name to find its dependencies and call graph.
Trace the call graph for an HTTP endpoint by URL pattern and optional method.
Trace the call graph starting from a specific file and line number.
Find all callers and callees of a given file (and optionally a specific symbol).
Find which handler function processes a given URL.
No output schemas documented. All tools return { content: [{ type: 'text', text }] } but the actual JSON structure inside that text field is undocumented. LLM cannot predict what fields to extract from trace_from, trace_endpoint, etc., forcing it to parse free-form text responses.
Tool descriptions are too short (10-40 chars) and lack actionable context. 'Trace the call graph starting from a specific file and line number' (60 chars) omits: What format is the output? What does 'trace' mean, function calls, imports, dependencies? When would an LLM use this vs trace_endpoint? Does depth=20 mean 20 levels or 20 nodes?
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 8 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 40 | - | v1 |
Parameter descriptions lack format and constraint details. 'file' parameter says 'Absolute or relative path' but does not specify: What happens if the file doesn't exist? Are glob patterns supported? Case-sensitive or not? Must it be a TypeScript file?
'trace_component' and 'trace_endpoint' describe finding dependencies but do not explain whether they return a single object, an array, or a nested graph structure. Vague output shape forces LLM to guess and parse unstructured JSON.
Error messages are basic string concatenation ('Error: ' + message). No categorization of retryable vs fatal errors, no recovery guidance. If a trace fails, the LLM does not know: Should I try a different line number? A different file? Is the engine still warming up?
The 'what_calls' tool name is ambiguous, does it return callers or callees? Description says 'Find all callers and callees' but does not clarify which field in the response contains which. LLM cannot reliably distinguish.
'depth' parameter in trace_from has no maximum documented. Passing depth=10000 could cause a timeout or memory explosion. No guidance on reasonable values.
list_routes and list_unmatched accept no parameters and return no pagination. If a project has 500+ routes, the response bloats the context window. No limit enforcement or cursor support.