TypeScript code navigation MCP server — AI agents find symbols, callers, and hierarchies by name instead of reading files. Reduces Claude Code token usage 54–67%. Works with Claude Code, Cursor, and Codex.
specter-tree has well-structured tool definitions with consistent naming (verb_noun pattern), clear descriptions (avg 120 chars), and complete input schemas with Zod validation. However, output schemas are not documented in the visible code, parameter descriptions lack constraint details (ranges, formats, enums), and error handling lacks recovery guidance. 18 tools are explicitly registered with proper JSON Schema, but responses are not shaped for LLM consumption, they return raw database/AST results without pagination, field filtering, or chaining IDs.
Build a compact structural flow from a symbol, file, or route path, including middleware for route entrypoints. Exactly one of symbol_name, file_path, or route_path must be provided.
Find a TypeScript symbol by exact name. Returns file path, line, kind, and signature.
Rank the most likely edit locations for a symbol using declarations, callers, implementors, and subclasses.
Force immediate re-index of a file, bypassing the 300ms debounce. Use after writing a file to ensure queries see the latest symbols.
Find all call sites for a named function or method. Best-effort — DI and dynamic dispatch may be missing.
List all symbols declared in a specific file.
Output schemas not documented. No visible return type definitions for any tool, LLMs cannot plan downstream calls or extract required fields (e.g., does find_symbol return line numbers? file paths? signatures?). Violates pattern:tool and pattern:response-shaper.
Parameter descriptions lack constraint details. 'limit' params have no min/max stated in descriptions (only in Zod schema, invisible to LLM). 'max_depth' in explain_flow says 'default 3, max 4' but no minimum. 'query' in search_symbols has no length or format guidance. Violates pattern:constrained-input.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | <=2025-11-25 | v2 |
Get full inheritance/implementation hierarchy for a class: what it extends, what it implements, and what extends/implements it.
Find all classes that implement a given TypeScript interface.
Get all methods, properties, and constructors defined in a class.
Find files this file imports from and files that import this file.
Resolve a URL path to its handler file using framework file conventions.
Trigger a full project scan, indexing all .ts/.tsx files. Skips files whose content hash has not changed.
Read a dot-notation config key from project config files (vite.config.ts, drizzle.config.ts, tsconfig.json, etc.). Does NOT read .env files.
Resolve a named export from a barrel or module file to the file where it is declared.
Search TypeScript symbols by partial name using LIKE matching.
Bind specter-tree to the active workspace root, build the index for that project, and start watching it for changes.
Return a compact structural summary of a file: exports, declarations, imports, and top-level effects.
Trace the middleware chain for a route path. Supports Express (app.use), Next.js (middleware.ts), and SvelteKit (hooks.server.ts + layout files).
No error recovery guidance. Tools validate input with Zod but error responses are not visible in code. If a symbol is not found or a file path is invalid, the LLM receives a raw error with no suggestion for next steps (e.g., 'Symbol not found. Try search_symbols() with a partial name.'). Violates pattern:recovery-guide.
No pagination or result limits documented. search_symbols accepts 'limit' (1-100, default 20) but other list-like tools (get_file_symbols, get_methods, get_callers) have no visible limit parameter. Large codebases could return thousands of symbols, exhausting context. Violates pattern:paginated-result.
Tool composition gaps. explain_flow requires 'exactly one of symbol_name, file_path, or route_path' but this constraint is only in the description, not enforced in the schema (no oneOf). LLMs may pass multiple or none, causing ambiguous failures. Violates pattern:tool-chain.