loading…
Search for a command to run...
loading…
A minimal MCP server providing a normalized API for code navigation and repository inspection through tools like symbol searching and call tracing. It enables A
A minimal MCP server providing a normalized API for code navigation and repository inspection through tools like symbol searching and call tracing. It enables AI agents to perform structured analysis of codebases by mapping endpoints, inspecting file trees, and tracing symbol relationships.
Workspace-only MCP server for structural code navigation and repository inspection. It exposes a stable public code.* tool surface for finding symbol definitions, tracing upstream callers for impact analysis, tracing downstream execution flow before logic changes, listing routes/endpoints, searching text, and inspecting workspace trees without opening files blindly.
npm: @navigation-agent/mcp-server
The server runs via npx.
rg) — optional, only needed for code.search_textclaude mcp add navigation-agent npx -- -y @navigation-agent/mcp-server
Add to ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"navigation-agent": {
"type": "local",
"command": ["npx", "-y", "@navigation-agent/mcp-server"],
"enabled": true
}
}
}
Add to ~/.gemini/settings.json:
{
"mcpServers": {
"navigation-agent": {
"command": "npx",
"args": ["-y", "@navigation-agent/mcp-server"]
}
}
}
Add to ~/.cursor/mcp.json or .cursor/mcp.json:
{
"mcpServers": {
"navigation-agent": {
"command": "npx",
"args": ["-y", "@navigation-agent/mcp-server"]
}
}
}
codex mcp add navigation-agent -- npx -y @navigation-agent/mcp-server
Or add to ~/.codex/config.toml:
[mcp_servers.navigation-agent]
command = "npx"
args = ["-y", "@navigation-agent/mcp-server"]
By default the server analyzes the current working directory. To pin a specific project, set NAVIGATION_MCP_WORKSPACE_ROOT in your MCP config.
This table MUST stay in the README because it is the fastest way to understand the public support surface.
| Capability | Java | TypeScript / JavaScript | PHP | Python | Rust | Go | All Files |
|---|---|---|---|---|---|---|---|
code.inspect_tree |
✅ Verified on real Spring project tree | ✅ Verified on real React Router project tree | ✅ Verified on examples/php tree |
✅ Verified on examples/python tree |
✅ Verified on this repository | ✅ Verified on examples/go tree |
✅ |
code.find_symbol |
✅ Verified on real Spring code | ✅ Verified on real React Router code | ✅ Verified on examples/php symbols |
✅ Verified on examples/python symbols |
✅ Verified on this repository | ✅ Verified on examples/go method lookup |
— |
code.search_text |
✅ Verified on real Spring code | ✅ Verified on real React Router code | ✅ Verified on examples/php source |
✅ Verified on examples/python source |
✅ Verified on this repository | ✅ Verified on examples/go text search |
✅ |
code.list_endpoints |
✅ Verified on real Spring REST / GraphQL code | ✅ Verified on real React Router route modules | ⚠️ Stub implementation (framework-agnostic) | ✅ Verified on examples/python FastAPI-style routes |
⚠️ Correctly returns no endpoints for this Rust engine project | ⚠️ Responds, but the current Go example has no useful endpoint detection yet | — |
code.trace_flow |
✅ Verified on real Spring code | ✅ Verified on real React Router route flow | ✅ Verified end-to-end on examples/php |
✅ Verified end-to-end on examples/python deep recursive trees |
✅ Verified on this repository with qualified Rust symbols | ✅ Verified end-to-end on examples/go |
— |
code.trace_callers |
✅ Verified on real Spring code | ✅ Verified on real React Router helper callers | ✅ Verified end-to-end on examples/php |
✅ Verified end-to-end on examples/python recursive impact analysis |
✅ Verified on this repository with qualified Rust symbols | ✅ Verified end-to-end on examples/go |
— |
Legend:
Important:
JavaProjectIndex::build).The public contract exposes exactly these six tools:
code.inspect_treecode.list_endpointscode.find_symbolcode.search_textcode.trace_flowcode.trace_callersUse snake_case parameters such as max_depth, include_hidden, and file_pattern.
Use this workflow whenever you need to understand behavior or impact inside the workspace:
code.find_symbol — resolve the exact defining file first.code.trace_callers — inspect upstream impact before renaming, deleting, or changing a signature.code.trace_flow — inspect downstream execution before changing logic.read only the files returned by the trace results that actually matter.Rule of thumb:
code.trace_callers for who depends on this?code.trace_flow for what does this reach or invoke?Concrete workspace example:
{
"symbol": "create_order",
"language": "python",
"kind": "function",
"path": "examples/python"
}
{
"path": "examples/python/app/api/endpoints.py",
"symbol": "create_order",
"language": "python",
"recursive": true,
"max_depth": 3
}
{
"path": "examples/python/app/api/endpoints.py",
"symbol": "create_order",
"language": "python"
}
Expected agent behavior:
code.find_symbol first when the defining file is not already knowncode.trace_callers first when the risk is breaking callerscode.trace_flow next when the risk is changing downstream behaviorread the traced files you actually needReact Router example:
{
"symbol": "action",
"kind": "function",
"framework": "react-router",
"path": "app/routes"
}
{
"path": "app/routes/change-password.tsx",
"symbol": "action",
"framework": "react-router",
"recursive": true,
"max_depth": 2
}
{
"path": "app/routes/change-password.tsx",
"symbol": "action",
"framework": "react-router"
}
code.search_text response stylecode.search_text is optimized for agents:
line plus exact spanstopFiles highlights the densest files firstbefore / after text is intentionally omitted from the public response to reduce noise and token costExample shape:
{
"fileCount": 3,
"matchCount": 19,
"totalFileCount": 3,
"totalMatchCount": 19,
"topFiles": [
{
"path": "examples/go/internal/http/handlers/user_handler.go",
"language": "go",
"matchCount": 11
}
],
"items": [
{
"path": "examples/go/internal/http/handlers/user_handler.go",
"language": "go",
"matchCount": 11,
"matches": [
{
"line": 28,
"spans": [{ "colInit": 23, "colEnd": 32 }]
}
]
}
]
}
{
"symbol": "RootUserGraphQLController",
"language": "java",
"kind": "class"
}
{
"path": "app/routes/change-password.tsx",
"symbol": "action",
"framework": "react-router"
}
{
"path": "src/main/java/com/example/FooController.java",
"symbol": "getFoo",
"framework": "spring"
}
These checks were verified against real projects instead of toy stubs:
~/sias/app/back)code.inspect_tree works on real module treescode.find_symbol works on real Spring classescode.search_text works on real Java sourcecode.list_endpoints inventories framework-detectable Spring REST controllers and GraphQL resolvers as likely public entrypointscode.trace_flow works on real controller/resolver entrypointscode.trace_callers works on Java use cases and can identify probable public entrypointsVerified example:
RootUserGraphQLController#getUsersByDependencyRootGetUserUseCase#getUsers~/sias/app/front)code.inspect_tree works on real route treescode.find_symbol works on route-module exportscode.search_text works on real route filescode.list_endpoints inventories React Router route-module loader / action exports as likely route entrypointscode.trace_flow works for same-file route flow extractioncode.trace_callers works for same-file helpers and marks route exports as probable entrypointsVerified example:
app/routes/change-password.tsx#actiongetUserIdAndTokenFromSession, changeMyPassword, getSession, commitSession, getRoleRoutegetRoleRoute <- actionexamples/python)code.inspect_tree works on Python module treescode.find_symbol works on Python classes, functions, and methodscode.search_text works on Python source filescode.list_endpoints inventories FastAPI-style route decorators (@router.get, @app.post, etc.) as likely public API entrypointscode.trace_flow works end-to-end for multi-module Python scenarios, capturing deep recursive trees including branching calls, instance methods (self), and cross-file resolution.code.trace_callers works end-to-end for impact analysis, supporting recursive reverse-tracing across the entire workspace.Verified example (Forward Trace):
app/api/endpoints.py#create_orderorder_service.process_order(...) -> _handle_payment(...) -> payment_service.authorize_payment(...)AuditService, InventoryService, ProductRepository, etc.Verified example (Backward Trace):
app/services/audit.py#log_actionUserService, OrderServiceapp/api/endpoints.py (get_user, create_order)code.inspect_tree works on real Rust source treescode.find_symbol works on Rust types/functionscode.search_text works on real Rust sourcecode.trace_flow works on real Rust methods when queried with the correct qualified symbolcode.trace_callers works on real Rust methods when queried with the correct qualified symbolNotes:
code.list_endpoints returned zero results on this repository, which is expected for the chosen validation target because it is not a Rust web appVerified example:
crates/navigation-engine/src/capabilities/trace_flow.rs#JavaProjectIndex::buildSelf::new_empty(), index.scan_project(workspace_root), and index.is_empty()JavaProjectIndex::scan_project <- JavaProjectIndex::build./examples/go)Real behavior today against examples/go:
code.inspect_tree workscode.search_text workscode.find_symbol works for method lookup such as CreateUsercode.trace_flow works end-to-end on the example app and returns the recursive internal call treecode.trace_callers works end-to-end on the example app, including callback/method-value references and interface-to-implementation reverse matchescode.list_endpoints still returns no useful entrypoint inventory for the current Go exampleCurrent public language filters:
typescriptjavascriptgojavapythonrustCurrent public framework filters:
react-routerspringEvery tool returns the same top-level envelope:
{
"tool": "code.trace_flow",
"status": "ok",
"summary": "Traced 5 callees for 'action' from 'app/routes/change-password.tsx'.",
"data": {},
"errors": [],
"meta": {
"query": {},
"resolvedPath": "app/routes/change-password.tsx",
"truncated": false,
"counts": {},
"detection": {}
}
}
Status meanings:
ok — request succeeded, including zero-result successpartial — request succeeded but was truncated/prunederror — request failed and includes stable error codesNotes:
code.trace_flow returns a rooted recursive tree under data.rootcode.trace_callers returns direct callers plus recursive reverse-trace metadatacode.search_text returns compact grouped matches and topFiles, not full context blocksThis repository has two main layers:
TypeScript MCP runtime (packages/mcp-server/)
code.* contractRust engine (crates/navigation-engine/)
crates/navigation-engine/src/bin/Important:
packages/mcp-server/src/bin/ contains the runtime entrypoint (navigation-mcp.ts)crates/navigation-engine/src/bin/, not in the TypeScript runtimeKey local commands:
npm install
npm --workspace @navigation-agent/mcp-server run check
npm --workspace @navigation-agent/mcp-server run test
cargo test --manifest-path crates/navigation-engine/Cargo.toml
Useful local runtime checks:
npx tsx packages/mcp-server/src/bin/navigation-mcp.ts --describe-tools
npx tsx packages/mcp-server/src/bin/navigation-mcp.ts --transport stdio-legacy --workspace-root /path/to/workspace
MIT
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"navigation-agent-mcp": {
"command": "npx",
"args": []
}
}
}