mcp-spec-nav
mcp-spec-nav is a local, read-only MCP server that indexes the source code of a chosen repository so an AI coding agent can search, read, and trace code across services.
Survey the repo (
spec_nav_services): list discovered projects/services underSPEC_NAV_ROOTwith file and function counts and a coverage summary.Find existing logic (
spec_nav_find_functions): ranked candidates by describing behaviour in words, matched against names, signatures, docs, paths, calls and bodies (lexical, cross-service).Find behavioural duplicates (
spec_nav_similar_functions): locate functions that behave like a candidate, a draft (code), or an existing function, whatever they are named.Browse the catalog (
spec_nav_functions): list functions/methods/constructors/accessors with signatures, kinds, line ranges, exports, docs and stable ids — filtered and paged.Read code precisely (
spec_nav_read_function): get exact source, signature, docs and used imports for up to 10 functions per call, without reading whole files.Find callers (
spec_nav_callers): list call sites, dynamic uses and unresolved usages before changing a signature — type-checked in TS/JS/Vue/Svelte/Astro, evidence-based elsewhere.Map a pattern (
spec_nav_map): run one regex across every supported source file, each hit tagged with its enclosing function (paged, with hit counts).Trace cross-service flows (
spec_nav_trace_flow): follow HTTP client → route → handler, RPC call → handler, and event/topic → consumers, upstream or downstream, with evidence, confidence and unresolved gaps.
It only reads code: the agent decides what to reuse and makes the edits. Search is lexical, and results are candidates rather than proof of completeness.
Parses Astro component script blocks for the function catalog, ranked function search and exact function reading, with callers resolved through the type checker, and reports any files it could not scan.
Evidence-based navigation of C and C++ sources: function search, exact function reading and call-site listing resolved by same file/class, qualifier, include or alias evidence, with ambiguous, likely and dynamic usages reported apart.
Evidence-based navigation of Elixir code: finds existing functions by name or behaviour, reads their definitions with doc comments and imports, and reports call sites with the evidence used to bind them plus dynamic uses such as event names.
Analyzes JavaScript code with the same type-checked caller resolution and function catalog as TypeScript, covering named functions, arrow/function expressions assigned to variables or properties and CommonJS exports, plus ranked function search and pattern mapping with the enclosing function of each match.
Evidence-based code navigation for Kotlin: locates existing functions by words, calls or behavioural similarity, reads their exact source and documentation, and enumerates call sites with evidence-based binding and dynamic uses flagged separately.
Evidence-based navigation of PHP source: function/method search, exact function reading, caller inspection with per-site binding reasons, and regex mapping of a concept across files tagged with the enclosing function.
Evidence-based navigation of Python code: ranks existing functions and classes by name, path, docstring, calls and body, reads a function's exact source and imports, and lists call sites bound by evidence (same file/class, qualifier, import, alias, receiver type) with dynamic uses such as getattr or event names reported separately. Also traces FastAPI/Flask routes, requests/httpx/aiohttp calls and event consumers across services.
Evidence-based navigation of Ruby code: finds and reads functions and methods, resolves call sites using same file/class, qualifier, import or alias evidence with a stated reason per site, and lists unresolved, likely and ambiguous usages as well as dynamic uses like send(:x) before changing a method.
Evidence-based code navigation for Rust: searches the function catalog by words or behaviour, reads exact function source with signatures and doc comments, and reports call sites with the binding evidence used and any dynamic or unresolved usages.
Evidence-based navigation of Scala source: function search across services, exact function reading, call-site listing with per-site binding evidence, and pattern mapping that attributes each match to its enclosing function.
Parses Svelte components (script blocks and templates) and resolves callers with the TypeScript type checker, so calls through aliases, re-exports or default imports are found while same-named methods on other classes are excluded; flow tracing also covers SvelteKit file routes.
Evidence-based navigation of Swift code: ranked candidate search for existing logic, exact function reading, and caller/usage inspection with binding evidence and unresolved references reported before a signature change.
Provides type-checked static analysis of TypeScript source code: ranked search for existing functions by words, calls or behaviour, exact function reading (signature, doc comment, imports, source), exhaustive caller lookup resolved with the TypeScript type checker (finds aliases, re-exports, default imports, obj"name", call/apply; excludes same-named methods on other classes), regex mapping to enclosing functions, and cross-service flow tracing over HTTP routes, RPC calls and events.
mcp-spec-nav — MCP Server for AI Code Search and Navigation
English · Tiếng Việt · 简体中文

mcp-spec-nav is a local MCP server for AI coding agents such as Claude Code. It reads the source code of the repository you choose and lets the agent:
find existing functions across services and shared packages — by words, by what they call, or by behavioural similarity to a draft;
read a function exactly: source, signature, documentation and the imports it uses;
find callers before a change — type-checked in TypeScript/JavaScript/Vue, evidence-based in Python, Go, Java, Kotlin, Swift and other languages, with dynamic uses listed;
map a pattern across supported source files, with the enclosing function of each match;
trace flows across services from source code — HTTP client → route → handler, RPC call → handler, event/topic → consumers — with the evidence for each link and what could not be resolved (static analysis, supported frameworks).
The problem it addresses: before writing new logic or changing a function, an agent needs to know what already exists and what depends on it. With grep alone it can miss code written under other names, rewrite logic that already exists, or edit same-named calls on another class.
The MCP only reads code. Your coding agent decides what to reuse, edits the files and runs the tests. The MCP does not guarantee that every related function will be found.
When it helps
Scenario | Value of the MCP |
Logic is spread across multiple services | High: searches broadly and helps reduce missed code. |
You want to reuse functions instead of rewriting them | High, when the query finds the right candidates. |
You change function parameters and need to find callers | Useful. |
You follow a request or event from one service to another | Useful for the supported frameworks: static links with evidence; unknowns are reported, not guessed. |
You make a simple edit within one file | Limited benefit; may add tool calls. |
Every model turn with the MCP installed also carries its tool definitions (~3.8k tokens in the benchmark), so on small, single-concept changes the gain is small. In live runs on real tasks in a private production monorepo, the spec-nav setup (MCP + workflow instructions + a hook that blocks recursive grep) finished tasks about 28% sooner (about 32% on cross-service tasks) with about the same token use and average code quality 8.5/10. It did not reduce tool calls, and on small single-service tasks it costs more tokens. The MCP installed on its own has not been measured yet (Benchmark).
Related MCP server: codeweave-mcp
Example: change an order fee
docs/examples/order-fee is a runnable four-file example. Task: raise the handling fee from 5 to 7 and let every caller waive it. The output below comes from running the tools on before/, trimmed.
1. Find existing logic — MCP, spec_nav_find_functions with { "query": "order handling fee total" }:
#1 score 3.05 billing/fees.ts:35-43 (service ., typescript)
[function, exported] calculateTotal
why: handling→body fee→path(stem:fees) total→name2. Read the implementation — MCP, spec_nav_read_function with { "file": "billing/fees.ts", "name": "calculateTotal" }:
35| export function calculateTotal(subtotal) {
39| const handlingFee = HANDLING_FEE;
42| return subtotal + handlingFee;
43| }3. Find every caller — MCP, spec_nav_callers with { "symbol": "calculateTotal", "file": "billing/fees.ts" }:
"total": 3, "exhaustive": true,
"targets": [{ "file": "billing/fees.ts", "line": 35, "resolvedBy": "type checker" }],
"sites": [
{ "file": "billing/previewInvoice.ts", "line": 3, "enclosing": "previewInvoice", "resolution": "resolved" },
{ "file": "checkout/createOrder.ts", "line": 3, "enclosing": "createOrder", "resolution": "resolved" },
{ "file": "orders/updateOrder.ts", "line": 3, "enclosing": "updateOrder", "resolution": "resolved" }4. Follow it across services — MCP. spec_nav_callers counts direct calls only and says so: calls through HTTP/RPC/queues are not counted. In the multi-service example docs/examples/order-flow, spec_nav_trace_flow with { "file": "services/checkout/src/handlers/createOrder.ts", "name": "createOrderHandler", "direction": "both" } shows who reaches the handler and where the total goes:
steps: 5 (5 resolved) — this page 1-5 — COMPLETE
gaps: none found among the supported adapters.
#1 d1 ↑ HTTP POST http://checkout:3000/api/orders → POST /api/orders [resolved · high]
from services/storefront/src/checkout-client.ts:3 submitOrder
#2 d1 ↓ call createOrderHandler → calculateTotal [resolved · high]
#4 d2 ↓ EVENT event order.created → event order.created (kafka) [resolved · medium]
to services/invoicing/src/consumer.ts:12 handleOrderCreated5. Edit the code — coding agent: sets HANDLING_FEE to 7, adds an options parameter to calculateTotal, and forwards waiveHandlingFee from the three callers. The result is in after/.
6. Run the tests — coding agent:
node --test docs/examples/order-fee/verify.mjs # 6 tests passQuick start (Claude Code)
Requirements: Node.js 18+, npm/npx, Git, and a local checkout of the repository to scan. The first installation needs network access.
1. Create .mcp.json at the root of the target repository. If it already exists, add the spec-nav entry to its mcpServers and keep the other servers.
{
"mcpServers": {
"spec-nav": {
"command": "npx",
"args": ["-y", "github:khoitd-voyager/mcp-spec-nav"],
"env": {
"SPEC_NAV_ROOT": "/Users/you/code/your-repo"
}
}
}
}Replace /Users/you/code/your-repo with the absolute path of the code to scan (the monorepo root to cover every service) — not the installation directory of mcp-spec-nav.
2. Open Claude Code in that repository, restart the session, run /mcp and check that spec-nav is connected. Approve the configuration if your client asks.
3. Send Claude:
Use spec-nav to list the services in this repository.
Show the resolved repository root and any files it could not scan.Check that the root and services match your project before continuing.
4. Try a real task:
I want to add a parameter to calculateFee. Use spec-nav to find its declaration,
read the implementation and check its callers before planning the change.
Report any callers you could not resolve.Installing an MCP makes its tools available; it does not ensure the agent uses them. Add the CLAUDE.md section so Claude uses them during normal coding. More prompts, the Claude Desktop extension (no Node.js needed) and installing from a local checkout: Installation.
Tools
Tool | Use it when you want to… |
| Check the scan root, discovered projects, counts and coverage. |
| Find ranked candidates for existing logic across services. |
| Find functions that behave like a candidate or a draft, whatever they are named. |
| Read one candidate's exact source and context. |
| Browse the function catalog with filters and pagination. |
| Inspect calls, references, dynamic uses and unresolved usages before a change. |
| Find regex matches with the enclosing function. |
| Follow HTTP, RPC and event links between services, upstream or downstream, with evidence and what is unresolved. |
Arguments, JSON examples, pagination, coverage and result statuses: Tool reference.
Supported languages
TypeScript, JavaScript, Python, Go, Java, C#, Ruby, Rust, PHP, C, C++, Scala, Elixir, Bash, Kotlin, Swift, and Vue/Svelte/Astro components (script blocks). Callers are type-checked in TS/JS/Vue/Svelte/Astro and evidence-based in every other supported language. Cross-service flows are traced for TypeScript/JavaScript and Python frameworks only. Extensions and parsing details: Supported languages.
Benchmark
Live LLM run on a private production monorepo
Claude Code on real feature and bug-fix requests in a private TypeScript monorepo (4 backend services that call each other over HTTP, a storefront and an admin app), running a 4-step spec workflow (/discuss → /resolve-solution → /create → /ship) with and without the spec-nav setup. Claude Sonnet 5.5 and Claude Opus 5.5, the same model for both setups on each task; recorded 2026-10-16 to 2026-10-18.
The spec-nav setup is the MCP plus workflow instructions plus a hook that blocks recursive grep over source code and points to
spec_nav_map. There is no edit gate: the agent is never forced to call a tool before editing. The hooks are indocs/examples/hooks/; see Hooks.
With the spec-nav setup | All tasks | Larger, cross-service tasks |
Time per task | −28% (13.7 → 9.9 min) | −32% |
Tokens | +5% (about the same) | +2% |
Average code quality (answer key, 1–10) | 8.5 | 8.6 |
Tasks finished sooner | 83% | 100% |
The setup did not reduce tool calls: the agent usually made more calls, grouped into fewer model turns. Time is what changes. On the smaller tasks the gain is about 8% in time for about 37% more tokens. One run per task, an LLM grader that is not blind; read the report before quoting these numbers.
Simulated agents
All results below come from simulated agents: deterministic policies, not an LLM, so the differences come from the tools. One agent has only Grep/Read/Edit (like Claude Code's built-in tools), the other has spec-nav plus Read/Edit. The no-MCP side is given an LLM's synonym knowledge and the same generous scoring. Each session is a whole feature request: reuse existing logic, change a function's signature and update every caller, change a constant everywhere, then read and edit every file. Repositories: a seeded synthetic monorepo (answers planted by the generator) and immich@cc7fd67 (answers from TypeScript findReferences, doc comments and ripgrep). Tokens are estimated at 3.5 characters/token.
Synthetic, 100 sessions | Synthetic, 50 large sessions | immich (real), 20 sessions | immich (real), 10 large sessions | |
Context per session, no MCP → MCP | 31k → 24k (−25%) | 92k → 71k (−24%) | 116k → 98k (−16%) | 302k → 227k (−25%) |
…of which search phase | −57% | −55% | −70% | −69% |
Input tokens with prompt caching | −18% | −26% | −16% | −38% |
Tool calls (model turns) | −10% | −9% | −2% | −20% |
Existing function reused | 97% → 99% | 90% → 95% | 55% → 90% | 40% → 93% |
Callers complete, nothing extra | 100% → 100% | 100% → 100% | 85% → 90% | 53% → 73% |
Wrong edits per session | 0 → 0 | 0 → 0 | 0.3 → 0.2 | 14.4 → 2.4 |
Session fully correct | 97% → 99% | 70% → 86% | 50% → 85% | 0% → 30% |
Tool time incl. MCP cold start | +4.1 s | +6.1 s | +3.2 s | +6.6 s |
Reading what you will edit costs the same either way; the saving is in the search phase. Quality gains come from finding code under other names (reuse) and from not editing same-named calls on other classes (callers).
Large repository — VS Code (14,306 files, ~4.5M lines, 154k catalogued functions), Apple M4: first index 31 s, then find_functions 2.6–4.3 s, map 0.5–1.8 s, similar_functions 0.9 s, read_function 0.15 s; callers 10 s for an ordinary function (isEqualOrParent), 26 s and 3.1 GB RAM for FileService.readFile, a name mentioned in hundreds of files (12 s when asked again; 0.7.0 on the same machine: 42 s, then 78 s, 3.6 GB). Server memory 0.7–0.9 GB outside callers.
Cross-service flows (no agent, no LLM) — spec_nav_trace_flow on generated repositories (14 services each, 5 held-out seeds, 598 labelled call sites): 100% precision with 0 wrong links (linking by name only: 136 wrong links), 100% recall (84% in 0.7.0, which did not follow calls made through a wrapper function or urljoin). First call ~0.1 s (0.7 s on a 1,000-file repository), then 1–10 ms per call. The generator and the adapters share an author, so this checks the linking rules, not coverage of real code.
Method, assumptions and limitations: bench/README.md. Reports: live · synthetic · immich · VS Code timings · flows · all results.
Limits
Search is lexical. Words, called names, abbreviations, synonym and concept lists, IDF.
spec_nav_similar_functionsfinds same-behaviour code under unrelated names only when it shares calls or vocabulary; two implementations with nothing in common are missed. Results are candidates, not proof that nothing else exists.Translation. Vietnamese written with diacritics is matched through a built-in dictionary of ~100 common domain terms; other words are not translated. Use English keywords for English-named code.
Reuse. Check exports, behavior and package/service dependencies yourself.
Callers. Outside TS/JS, binding is by evidence (imports, qualifiers, declared receiver types), not a type checker: inferred types, inheritance and overloads can leave sites
likely/ambiguous. Names built at runtime, HTTP/RPC/queue calls and external repositories are not traced byspec_nav_callers(for HTTP/RPC/events between services, seespec_nav_trace_flow).Flows. Static, from source: links are inferred, never observed, and only for the supported frameworks. Not traced: gRPC, GraphQL, WebSockets, other queues (BullMQ, RabbitMQ, SQS…), Go, Java and other languages, generated API clients, wrappers more than three tiers deep, service discovery and configuration other than docker-compose, and more — see Not traced.
Function forms. Inline anonymous callbacks are not individually catalogued (JS/TS counts them in coverage). JS/TS destructuring assignments, dynamic property assignments, factory-created functions,
Object.assign/Object.definePropertyand some chained assignments are not fully covered. Other-language assigned lambdas/closures are not catalogued.Files. Dart, Lua, Objective-C, SQL and other unsupported source types are not parsed (they are counted in coverage). Dependency/build directories, hidden directories, virtualenvs, declaration files, minified JS and supported files over 1.5 MB are excluded.
Types. Return types are reported when explicitly written; they are not inferred by the catalog.
Large repos. Measured on VS Code (14k files): first index ~31 s, searches seconds. TS/JS callers type-check only files that mention the name — and, when many do, only those with an import path to a declaration — in batches, following imports two steps; a very common name takes tens of seconds and ~3 GB, and calls whose receiver type lies further away are reported
unresolved.Dependencies. TS/JS type resolution is best with dependencies installed (
node_modules); without them, library types are unknown and more calls end upunresolved.
The server reads the current local checkout. No search API key is required, and its search does not send code to an external search service. Results are returned to your connected coding agent; that client's model/data handling settings still apply.
Documentation
Installation — Claude Code, Claude Desktop extension,
CLAUDE.mdsection, local checkoutHooks — two example Claude Code hooks (block recursive grep, batch code reads) and how to write your own
Tool reference — arguments, JSON examples, reading the results
Trace flows across services — frameworks, link statuses, confidence, gaps
Development — tests, packaging the extension, benchmarks, website
License
MIT. See LICENSE.
Available Tools
8 toolsTool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.8.0- Changed
spec_nav_callers1 field changed- changed
Input schema / properties / searchServices / descriptionPrevious value: -"Limit to these services/directories, relative to SPEC_NAV_ROOT (e.g. \"services/api\", \"packages\"). \".\" is the root project's own files. Omit to cover the whole repo — the default."New value: +"Services/directories relative to the root (e.g. \"services/api\"); \".\" is the root project's own files. Default: the whole repo."
- Changed
spec_nav_find_functions4 fields changed- changed
Input schema / properties / file / descriptionPrevious value: -"Only files whose path contains this (or matches it, with * globs)."New value: +"Only files whose path contains this, matches it as a * glob, or as a regex (/…/, or a value with | ( ^ $ \\, e.g. \"services/(order|payment)\")." - added
Input schema / properties / queriesAdded value: +{ + "description": "Up to 5 phrasings (synonyms, another language), ranked together in one call; each result says which matched.", + "items": { + "type": "string" + }, + "maxItems": 5, + "type": "array" +} - changed
Input schema / properties / services / descriptionPrevious value: -"Limit to these services/directories, relative to SPEC_NAV_ROOT (e.g. \"services/api\", \"packages\"). \".\" is the root project's own files. Omit to cover the whole repo — the default."New value: +"Services/directories relative to the root (e.g. \"services/api\"); \".\" is the root project's own files. Default: the whole repo." - removed
Input schema / requiredRemoved value: -[ - "query" -]
- Changed
spec_nav_functions2 fields changed- changed
Input schema / properties / file / descriptionPrevious value: -"Only files whose path contains this (or matches it, with * globs)."New value: +"Only files whose path contains this, matches it as a * glob, or as a regex (/…/, or a value with | ( ^ $ \\, e.g. \"services/(order|payment)\")." - changed
Input schema / properties / services / descriptionPrevious value: -"Limit to these services/directories, relative to SPEC_NAV_ROOT (e.g. \"services/api\", \"packages\"). \".\" is the root project's own files. Omit to cover the whole repo — the default."New value: +"Services/directories relative to the root (e.g. \"services/api\"); \".\" is the root project's own files. Default: the whole repo."
- Changed
spec_nav_map6 fields changed- added
Input schema / properties / contextAdded value: +{ + "description": "Lines shown before and after each hit, like grep -C (default 0; above 10 is read as 10).", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / fileAdded value: +{ + "description": "Only files whose path contains this, matches it as a * glob, or as a regex (/…/, or a value with | ( ^ $ \\, e.g. \"services/(order|payment)\").", + "type": "string" +} - added
Input schema / properties / includeTextAdded value: +{ + "description": "Also search config, docs and other text files (default true).", + "type": "boolean" +} - changed
Input schema / properties / pageSize / descriptionPrevious value: -"Max hits per page (pages are also cut at ~30k characters)."New value: +"Max hits per page (summary: max functions); pages are also cut at ~30k characters." - changed
Input schema / properties / services / descriptionPrevious value: -"Limit to these services/directories, relative to SPEC_NAV_ROOT (e.g. \"services/api\", \"packages\"). \".\" is the root project's own files. Omit to cover the whole repo — the default."New value: +"Services/directories relative to the root (e.g. \"services/api\"); \".\" is the root project's own files. Default: the whole repo." - added
Input schema / properties / viewAdded value: +{ + "description": "\"detail\" (default): every matching line. \"summary\": hits grouped by function, with counts and line numbers; a short result is shown in full.", + "enum": [ + "detail", + "summary" + ], + "type": "string" +}
- Changed
spec_nav_read_function6 fields changed- added
Input schema / properties / aroundAdded value: +{ + "description": "Lines either side of each of `lines` (default 15, max 60).", + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / cursor / descriptionPrevious value: -"nextCursor from the previous part: continues there even if the function moved; refuses if it changed."New value: +"nextCursor from the previous part; refuses if the function changed." - changed
Input schema / properties / functions / descriptionPrevious value: -"Read up to 10 functions at once, each by `id` or `file`+`name` (+ `line`). Use instead of the single-function fields below."New value: +"Up to 10 functions, each by `id` or `file`+`name` (+`line`), or only windows with `lines`. Instead of the single-function fields." - added
Input schema / properties / functions / items / properties / aroundAdded value: +{ + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / functions / items / properties / linesAdded value: +{ + "items": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "maxItems": 40, + "type": "array" +} - added
Input schema / properties / linesAdded value: +{ + "description": "Read only ±`around` lines around these file lines. With `file` alone: windows anywhere in the file.", + "items": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "maxItems": 40, + "type": "array" +}
- Changed
spec_nav_similar_functions1 field changed- changed
Input schema / properties / services / descriptionPrevious value: -"Limit to these services/directories, relative to SPEC_NAV_ROOT (e.g. \"services/api\", \"packages\"). \".\" is the root project's own files. Omit to cover the whole repo — the default."New value: +"Services/directories relative to the root (e.g. \"services/api\"); \".\" is the root project's own files. Default: the whole repo."
1 tool update
v0.7.0- Changed
spec_nav_read_function7 fields changed- changed
Input schema / properties / cursor / descriptionPrevious value: -"nextCursor from the previous part: continues there even if the code moved; refuses if it changed."New value: +"nextCursor from the previous part: continues there even if the function moved; refuses if it changed." - changed
Input schema / properties / file / descriptionPrevious value: -"Path relative to the repo root. Alone (no `name`): the whole file."New value: +"Path relative to the repo root." - changed
Input schema / properties / fromLine / descriptionPrevious value: -"Continue a long function, class or file from this file line."New value: +"Continue a long function from this file line." - changed
Input schema / properties / functions / descriptionPrevious value: -"Read up to 10 at once: a function by `id` or `file`+`name` (+ `line`), a class by `file` + its name, a whole file by `file` alone. Use instead of the single-read fields below."New value: +"Read up to 10 functions at once, each by `id` or `file`+`name` (+ `line`). Use instead of the single-function fields below." - changed
Input schema / properties / line / descriptionPrevious value: -"A line inside the function or class, to disambiguate."New value: +"A line inside the function, to disambiguate." - changed
Input schema / properties / maxLines / descriptionPrevious value: -"Lines per part (default 400 for a function, 1000 for a class or file)."New value: +"Lines per part (default 400)." - changed
Input schema / properties / name / descriptionPrevious value: -"Function: qualified (\"OrderService.calculateFee\"), short, or exported name. Class: its name (\"OrderService\") — the whole class."New value: +"Qualified (\"OrderService.calculateFee\"), short, or exported name."
1 tool update
v0.6.0- Changed
spec_nav_read_function7 fields changed- changed
Input schema / properties / cursor / descriptionPrevious value: -"nextCursor from the previous part: continues there even if the function moved; refuses if it changed."New value: +"nextCursor from the previous part: continues there even if the code moved; refuses if it changed." - changed
Input schema / properties / file / descriptionPrevious value: -"Path relative to the repo root."New value: +"Path relative to the repo root. Alone (no `name`): the whole file." - changed
Input schema / properties / fromLine / descriptionPrevious value: -"Continue a long function from this file line."New value: +"Continue a long function, class or file from this file line." - added
Input schema / properties / functionsAdded value: +{ + "description": "Read up to 10 at once: a function by `id` or `file`+`name` (+ `line`), a class by `file` + its name, a whole file by `file` alone. Use instead of the single-read fields below.", + "items": { + "additionalProperties": false, + "properties": { + "file": { + "type": "string" + }, + "id": { + "type": "string" + }, + "line": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / line / descriptionPrevious value: -"A line inside the function, to disambiguate."New value: +"A line inside the function or class, to disambiguate." - changed
Input schema / properties / maxLines / descriptionPrevious value: -"Lines per part (default 400)."New value: +"Lines per part (default 400 for a function, 1000 for a class or file)." - changed
Input schema / properties / name / descriptionPrevious value: -"Qualified (\"OrderService.calculateFee\"), short, or exported name."New value: +"Function: qualified (\"OrderService.calculateFee\"), short, or exported name. Class: its name (\"OrderService\") — the whole class."
8 tool updates
v0.4.0- First observed
spec_nav_callers - First observed
spec_nav_find_functions - First observed
spec_nav_functions - First observed
spec_nav_map - First observed
spec_nav_read_function - First observed
spec_nav_services - First observed
spec_nav_similar_functions - First observed
spec_nav_trace_flow
TDQS
Scored across 8 tools
Most tools target distinct operations: regex text search (map), behavior-keyword search (find_functions), structural similarity (similar_functions), catalog listing (functions), full read (read_function), call sites (callers), flow tracing (trace_flow), and service listing (services). The main risk is overlap among map, find_functions, and similar_functions, but the descriptions explicitly differentiate them (regex vs lexical vs call/body comparison) and cross-reference each other. Boundaries are clear enough that misselection is unlikely.
Every tool uses the same snake_case style under a uniform spec_nav_ prefix, with predictable noun/verb phrases (find_functions, read_function, trace_flow, callers). No mixing of camelCase or alternate conventions. The convention is consistent and readable throughout.
Eight tools is well-scoped for a read-only code navigation server, with each tool covering a distinct navigation concern (search, discovery, similarity, catalog, read, callers, flow, services). No tool feels redundant or padded.
The surface covers the core navigation lifecycle: discover, list, read, find similar, find callers, and trace cross-service flows, plus a service inventory. Gaps are minor: no dependency/import-graph or class-hierarchy tool, and non-call symbol references (constants, types) aren't directly searchable, but agents can largely work around these with map and functions.
Maintenance
Related MCP Connectors
An MCP server that gives your AI access to the source code and docs of all public github repos
MCP server for building and testing AI agents with multi-model experimentation and insights.
Hosted code graph over MCP: exact callers, dependencies, and cross-repo blast radius for AI agents.
MCP server for AI agent profiles and smart notes. 60+ coding prompt packs with expert personas.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server that transforms codebases into intelligent, queryable knowledge bases, enabling AI assistants to perform semantic search, explore architecture, and analyze code relationships.166-
- AlicenseNot gradedqualityDmaintenanceAn MCP server that gives AI agents structured code understanding and precise code intelligence via local indexing of AST, call graphs, and semantic search.42 npm4Apache 2.0
- AlicenseAqualityDmaintenanceAn MCP server that helps AI agents comprehend a codebase by providing tools for navigating, searching, and understanding code structure and history.10MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI agents to navigate and understand codebases through file descriptions, semantic search, and code recommendations without repeatedly scanning files.MIT