nexus-mcp-ci
Nexus-MCP is a local, private code intelligence MCP server that gives AI agents token-efficient search, graph analysis, and persistent memory over a codebase.
Indexing & status:
indexa project, checkstatus/healthto see freshness, memory use, and engine availabilityHybrid code search:
searchcombines vector/BM25/graph fusion with optional reranking to find relevant code by natural language or keywordSymbol lookup & explanation:
find_symbolandexplainreturn definitions, relationships, and quality metrics instead of reading whole filesCall-graph analysis:
graphtraces callers/callees and supports transitive impact analysis before refactoringProject mapping:
mapgives summaries, architecture layers, dependencies, entry points, and hub symbolsCode quality analysis:
analyzereports complexity, smells, dependency metrics, and an overall quality scorePersistent memory:
memorystores, searches, and deletes project notes/decisions across sessions (6 memory types, TTL support)
Offers local-first code intelligence capabilities as an alternative to GitHub's cloud-based MCP server, providing hybrid search, code graph analysis, and semantic memory without requiring API keys or cloud dependencies.
Nexus-MCP
Hybrid search + code graph + semantic memory in a single local MCP server — under 350 MB RAM.
Nexus-MCP is a code intelligence server for the Model Context Protocol. It gives AI agents precise, token-efficient answers about your codebase without cloud dependencies: no API keys, no data egress, no subscriptions.
pip install nexus-mcp-ci
claude mcp add nexus-mcp-ci -- nexus-mcp-ciThe Problem It Solves
AI coding agents are token-inefficient by default. An agent trying to understand verify_credentials() typically:
Glob("src/**/*.py")→ 120 files returned, agent reads the most likely 8 → ~12,000 tokensGrep("verify_credentials")→ 3 matches, agent reads surrounding context → ~4,000 tokensRead("auth/middleware.py")→ full 400-line file to understand callers → ~3,000 tokens
Total: ~19,000 tokens, 3+ tool calls, no graph relationships.
With Nexus-MCP:
explain("verify_credentials")→ symbol definition + all callers + all callees + complexity metrics → ~1,500 tokens, 1 tool call
Or for discovery:
search("credential verification flow")→ top-10 semantically relevant chunks across the codebase → ~2,000 tokens, 1 tool call
Estimated savings: 30–60% token reduction per coding session. The exact numbers depend on codebase size and task type — see the benchmarks table below.
Related MCP server: embecode
Quickstart (60 seconds)
# 1. Install
pip install nexus-mcp-ci
# 2. Register with Claude Code
claude mcp add nexus-mcp-ci -- nexus-mcp-ci
# 3. Verify (in any Claude Code session)
# Claude will automatically use nexus-mcp-ci tools when CLAUDE.md instructs itThen drop a CLAUDE.md in your project root:
## Code Navigation
Use nexus-mcp-ci tools before built-in file tools:
- Start sessions with `mcp__nexus-mcp__status`; run `index` if needed
- `search` before `Read/Grep`
- `explain` instead of reading a file to understand a symbol
- `impact` before any refactorThat's it. Claude will index your project on first use and use Nexus-MCP tools automatically.
How It Works
Indexing Pipeline (8 steps)
Source files
│
├─ Step 1: Discover ──────── walk tree, filter by ext/size/.gitignore
│
├─ Step 2: Parse symbols ─── tree-sitter (parallel ThreadPool)
│ extracts: functions, classes, methods
│ captures: name, signature, docstring, line_start/end, language
│
├─ Step 3: Parse graph ────── ast-grep (sequential for consistency)
│ extracts: call edges, import edges, inheritance edges
│ output: UniversalGraph(nodes=[], edges=[])
│
├─ Step 4: Transfer graph ── populate rustworkx PyDiGraph
│ O(1) node lookup by name, Rust-backed traversal
│
├─ Step 5: Chunk ──────────── Symbol → CodeChunk
│ deterministic IDs: SHA256(file_path + symbol_name + line)
│ avoids duplicate inserts on incremental reindex
│
├─ Step 6: Embed ──────────── bge-small-en: 384-dim (default) or jina-code: 768-dim via ONNX
│ lazy-loaded, unloaded after indexing (try/finally)
│ GPU/MPS auto-detected; falls back to CPU
│
├─ Step 7: Store ──────────── write to LanceDB `chunks` table (12-col PyArrow schema)
│ rebuild native FTS (Tantivy) index after write
│
└─ Step 8: Cleanup ────────── unload model, persist metadata (mtimes for incremental)
save rustworkx graph to SQLite (warm-start recovery)Incremental reindex: mtime-based — only changed files are re-processed. Corrupt index detection triggers automatic full rebuild.
Search Pipeline
search("how does auth work")
│
├─► vector_engine.search(query, n=30) ← cosine similarity on 768-dim embeddings
│ "auth" finds "verify_credentials", "token_check"
│
├─► bm25_engine.search(query, n=30) ← Tantivy FTS on same LanceDB table
│ fast exact-keyword matching
│
├─► graph_engine.boost(query, n=30) ← structural relevance score
│ hub symbols (high in/out degree) boosted
│
└─► fusion.merge(v_results, b_results, g_results)
│
│ Reciprocal Rank Fusion: score = Σ weight_i / (k + rank_i)
│ default weights: vector=0.5, bm25=0.3, graph=0.2
│
├─► reranker.rerank(top_20) ← FlashRank (optional, 4MB ONNX model, <10ms)
│
└─► token_budget.truncate() ← summary / detailed / full
│
└─► Top-N chunks, scored, formattedTechnology Stack
Layer | Technology | Decision Rationale |
Vector store | LanceDB | mmap disk-backed → ~20–50 MB overhead vs ChromaDB's in-memory model. Native Tantivy FTS means one store for both vector and BM25. (ADR-002) |
Embeddings | bge-small-en (default) or ONNX Runtime + jina-code | bge-small-en is lightweight (384-dim, no trust_remote_code). jina-code is code-specific (161M params, 8192 seq len) on ONNX (~50 MB vs PyTorch ~500 MB). Lazy-load/unload keeps RAM flat after indexing. (ADR-003) |
Graph engine | rustworkx PyDiGraph | Rust-backed, O(1) node lookup, PageRank + centrality algorithms. Thread-safe with RLock. (ADR-006) |
Symbol parser | tree-sitter 0.21.3 | 25+ languages, incremental parsing, AST-level symbol extraction with metadata. Parallel via ThreadPool. (ADR-005) |
Graph parser | ast-grep | Structural pattern matching for call/import/inheritance edges. Sequential run for graph consistency. (ADR-005) |
Chunking | Symbol-based | One chunk per function/class. Deterministic SHA256 IDs prevent duplicate inserts. (ADR-008) |
Re-ranker | FlashRank (optional) | 4 MB ONNX cross-encoder, <10 ms on CPU for top-20. Graceful passthrough if not installed. |
Persistence | SQLite + LanceDB | Graph in SQLite (warm-start recovery), vectors+FTS in LanceDB, mtimes in JSON. Zero-config. |
MCP framework | FastMCP 2.0 | Stdio transport, automatic tool registration, schema generation. |
Token Efficiency
Measured against equivalent agentic file-browsing workflows on a ~10,000-line Python codebase:
Task | Without Nexus-MCP | With Nexus-MCP | Reduction |
Find relevant code (agent reads 5–10 files) | 5,000–15,000 tokens | 500–2,000 tokens | 70–90% |
Understand a symbol (grep + read + trace callers) | 3,000–8,000 tokens, 3–5 calls | 800–2,000 tokens, 1 call | 60–75% |
Assess change impact (manual transitive trace) | 10,000–20,000 tokens | 1,000–3,000 tokens | 80–85% |
Tool descriptions in context (2 MCP servers) | ~1,700 tokens (17 tools) | ~700 tokens (10 tools) | ~60% |
Search precision (keyword-only needs retries) | 2–3 searches × 2,000 tokens | 1 hybrid search × 1,500 tokens | 60–75% |
Typical session savings: 15,000–40,000 tokens (30–60%) compared to file-browsing agents.
Three Verbosity Levels
Every tool respects a verbosity parameter — agents request exactly the detail they need:
Level | Token Budget | What's Included |
| ~500 tokens | Counts, scores, file:line pointers only |
| ~2,000 tokens | Signatures, types, line ranges, docstrings |
| ~8,000 tokens | Full code snippets, all relationships, metadata |
The 10 Tools
v2.0.0 breaking change: find_callers/find_callees/impact merged into
graph, overview/architecture merged into map, and remember/recall/forget
merged into memory — see CHANGELOG for the old→new mapping and
ADR-017 for why. Fewer, richer tools route
better under MCP Tool Search than many thin ones.
Discovery & Indexing
Tool | Use When |
| First action in any session. Supports comma-separated multi-folder paths. Incremental by default, reports progress as it runs, and starts a debounced auto-reindex watcher ( |
| Check index health: symbol count, chunk count, memory usage, engine availability, and a |
| Liveness probe — uptime, which engines are ready. |
| Replaces |
Search
Tool | Use When |
| Primary code discovery. |
Graph Analysis
Tool | Use When |
| Look up a specific symbol. |
|
|
| Replaces |
| Code quality: cyclomatic complexity, cognitive complexity, code smells, dependency metrics. |
Memory
Tool | Use When |
|
|
Install
From PyPI (recommended)
pip install nexus-mcp-ci
# GPU (CUDA) support — adds ONNX CUDA execution provider
pip install nexus-mcp-ci[gpu]
# FlashRank reranker — adds ~4MB cross-encoder for better search quality
pip install nexus-mcp-ci[reranker]
# Both
pip install nexus-mcp-ci[gpu,reranker]From Source
git clone https://github.com/jaggernaut007/Nexus-MCP.git
cd Nexus-MCP
./setup.sh # creates venv, installs, verifies
# or
pip install -e ".[dev]"Python 3.10–3.12 supported. Python 3.13+ is not yet supported by the current dependency stack, and the packaged Glama/Docker build uses Python 3.12 for compatibility. Optional: rg (ripgrep) for 100% search coverage fallback on unindexed files.
The optional
jina-codemodel requires ONNX Runtime. If you see ONNX/Optimum errors:pip install "sentence-transformers[onnx]" "optimum[onnxruntime]>=1.19.0"The default
bge-small-enmodel needs neither ONNX nortrust_remote_code.
MCP Client Setup
Claude Code
# Minimal
claude mcp add nexus-mcp-ci -- nexus-mcp-ci
# With the code-specific embedding model (requires trust_remote_code)
claude mcp add nexus-mcp-ci -e NEXUS_EMBEDDING_MODEL=jina-code -- nexus-mcp-ci
# GPU embeddings
claude mcp add nexus-mcp-ci -e NEXUS_EMBEDDING_DEVICE=cuda -- nexus-mcp-ci
# Virtualenv install — pass the full binary path
claude mcp add nexus-mcp-ci -- /path/to/.venv/bin/nexus-mcp-ciClaude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
{
"mcpServers": {
"nexus-mcp-ci": {
"command": "nexus-mcp-ci",
"args": [],
"env": {
"NEXUS_EMBEDDING_MODEL": "jina-code"
}
}
}
}Cursor / Windsurf / Cline / Any MCP Client
{
"nexus-mcp-ci": {
"command": "nexus-mcp-ci",
"transport": "stdio"
}
}Agent Integration Patterns
CLAUDE.md boilerplate (drop into project root)
## Code Intelligence — nexus-mcp-ci
Every code task in this project MUST follow this workflow:
1. **Session start**: `mcp__nexus-mcp__status` → if not indexed, `mcp__nexus-mcp__index`
2. **Before any file read**: `mcp__nexus-mcp__search` to locate relevant code
3. **To understand a symbol**: `mcp__nexus-mcp__explain` (not Read)
4. **Before refactoring**: `mcp__nexus-mcp__impact` to assess blast radius
5. **For project orientation**: `mcp__nexus-mcp__overview` or `mcp__nexus-mcp__architecture`Typical agent tool-call sequence
# Session start
status() → "indexed: True, 8,412 chunks, 1,203 symbols, 87 MB"
# Code discovery
search("JWT token validation", mode="hybrid", n=10)
→ auth/jwt.py:42 validate_token() score=0.94
→ auth/middleware.py:18 require_auth() score=0.87
→ tests/test_auth.py:91 test_valid_jwt() score=0.81
# Deep symbol understanding
explain("validate_token")
→ definition, docstring, params, complexity
→ callers: [require_auth, login_required, api_key_check]
→ callees: [decode_jwt, check_expiry, verify_signature]
→ quality: complexity=6, smells=[], maintainability=A
# Pre-refactor safety check
impact("validate_token")
→ direct callers: 3 symbols
→ transitive impact: 12 symbols across 4 files
→ high-risk: auth/middleware.py (5 dependents)Multi-folder monorepo indexing
# Index multiple roots in one call — processed sequentially, shared engines
index(path="packages/api/src,packages/shared/src,packages/cli/src")
# Or use the paths parameter for additional roots
index(path="packages/api/src", paths="packages/shared/src,packages/cli/src")Configuration
All settings via NEXUS_ environment variables:
Variable | Default | Description |
|
|
|
|
|
|
|
| Index storage directory |
|
| Auto-reindex on file change via a debounced watcher, started after |
|
| Seconds between |
|
| Skip files larger than this |
|
| Max chars per code chunk |
|
| Memory budget target |
|
|
|
|
| Vector score weight in RRF |
|
| BM25 score weight in RRF |
|
| Graph score weight in RRF |
|
|
|
|
| Enable per-tool token-bucket rate limiting |
|
| Structured audit logging with correlation IDs |
|
| Required for jina-code; set |
|
| Logging level |
|
|
|
Embedding Models
Model | Key | Dims | Max Seq | Backend |
|
BGE Small EN v1.5 (default) |
| 384 | 512 | PyTorch | No |
Jina Embeddings v2 Code |
| 768 | 8,192 | ONNX | Yes |
After changing model, re-index. Embeddings from different models are incompatible.
Comparison
vs. Other MCP Servers
Feature | Nexus-MCP | Sourcegraph MCP | Greptile MCP | GitHub MCP | tree-sitter MCP |
Fully local / private | ✅ | ❌ infra required | ❌ cloud | ❌ cloud | ✅ |
Semantic (vector) search | ✅ | ❌ keyword only | ✅ LLM-based | ❌ | ❌ |
Keyword (BM25) search | ✅ | ✅ | — | ✅ | ❌ |
Hybrid fusion (RRF) | ✅ | ❌ | ❌ | ❌ | ❌ |
Code graph (call/import) | ✅ rustworkx | ✅ SCIP | ❌ | ❌ | ❌ |
Re-ranking | ✅ FlashRank | ❌ | — | ❌ | ❌ |
Semantic memory (persistent) | ✅ 6 types | ❌ | ❌ | ❌ | ❌ |
Change impact analysis | ✅ | partial | ❌ | ❌ | ❌ |
Token-budgeted responses | ✅ 3 levels | ❌ | ❌ | ❌ | ❌ |
Languages | 25+ | 30+ | many | many | many |
Cost | Paid license | $$$ | $40/mo | $10–39/mo | Free |
API keys required | No | Yes | Yes | Yes | No |
vs. AI Code Tools
Capability | Nexus-MCP | Cursor | Copilot @workspace | Cody | Continue.dev | Aider |
IDE-agnostic | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
MCP-native | ✅ | partial | ❌ | ❌ | ✅ client | ❌ |
Fully local | ✅ | partial | ❌ | partial | ✅ | ✅ |
Hybrid search | ✅ | unknown | unknown | keyword | yes | ❌ |
Code graph | ✅ | unknown | unknown | ✅ SCIP | basic | ❌ |
Semantic memory | ✅ persistent | ❌ | ❌ | ❌ | ❌ | ❌ |
Token-budgeted output | ✅ | — | — | — | — | — |
Open source | ❌ all rights reserved | ❌ | ❌ | partial | ✅ | ✅ |
Cost | Paid license | $20–40/mo | $10–39/mo | $0–49/mo | Free | Free |
Development
git clone https://github.com/jaggernaut007/Nexus-MCP.git
cd Nexus-MCP
pip install -e ".[dev]"
pytest -v # 441 tests
pytest -m "not slow" # skip performance benchmarks
pytest tests/test_search.py # single module
ruff check . # lintProject Structure
src/nexus_mcp/
├── server.py # FastMCP entrypoint — 10 tools, input validation, graceful shutdown
├── config.py # Settings (NEXUS_ env prefix)
├── state.py # Global singleton SessionState
├── core/
│ ├── models.py # Symbol, ParsedFile, CodebaseIndex, Memory
│ ├── graph_models.py # UniversalNode, Relationship
│ ├── interfaces.py # IParser, IEngine protocols
│ └── exceptions.py # NexusException hierarchy
├── parsing/
│ ├── treesitter_parser.py # Symbol extraction (parallel)
│ ├── astgrep_parser.py # Structural graph extraction (sequential)
│ ├── language_registry.py # 25+ language definitions
│ └── file_watcher.py # Debounced watchdog for live reindex
├── engines/
│ ├── vector_engine.py # LanceDB cosine similarity search
│ ├── bm25_engine.py # LanceDB native FTS (Tantivy)
│ ├── graph_engine.py # rustworkx PyDiGraph with RLock
│ ├── fusion.py # Reciprocal Rank Fusion
│ └── reranker.py # FlashRank (optional, graceful degradation)
├── indexing/
│ ├── pipeline.py # 8-step indexing pipeline
│ ├── embedding_service.py # ONNX Runtime, GPU/MPS auto-detect
│ ├── parallel_indexer.py # ThreadPool over files
│ └── chunker.py # Symbol → CodeChunk with deterministic IDs
├── memory/
│ └── memory_store.py # LanceDB-backed memory, TTL, 6 types
├── analysis/
│ └── code_analyzer.py # Cyclomatic/cognitive complexity, smells
├── security/
│ ├── permissions.py # READ/MUTATE/WRITE tool categories
│ └── rate_limiter.py # Token-bucket, per-tool, thread-safe
└── middleware/
└── audit.py # Structured audit logs, correlation IDs, field redactionAdding a New Tool
Add the handler function to
server.pydecorated with@mcp.tool()Add inline validation (
_validate_*helpers inserver.py) for any new inputAdd permission category to
security/permissions.pyWrite tests in
tests/Update
self_test/demo_mcp.pyto exercise the tool
Adding a New Language
Add entry to
parsing/language_registry.pywith the tree-sitter grammarAdd structural patterns to
parsing/astgrep_parser.pyfor call/import extractionAdd test fixtures in
tests/fixtures/
Self-Test
Verify your installation exercises all 10 tools end-to-end:
python self_test/demo_mcp.py # built-in sample project
python self_test/demo_mcp.py /path/to/project # your own codebaseExpected output: all 10 tools exercised with pass/fail per tool and a summary.
Known Limitations
Sequential graph parsing: ast-grep runs sequentially (not parallel) to keep the call graph consistent. This is the main indexing bottleneck on large codebases.
bge-small-en uses PyTorch: The lightweight model uses PyTorch instead of ONNX, so it doesn't benefit from the same ~50 MB footprint as jina-code.
No incremental graph updates: Graph is rebuilt in full on incremental reindex (only vector/BM25 are incremental at the chunk level).
No SSE transport: Only stdio transport is currently supported.
Language coverage: 25+ languages, but structural relationship extraction (callers/callees) is most accurate for Python, TypeScript, JavaScript, Go, and Rust. Other languages may have partial graph edges.
Static call graph only:
find_callers/find_callees/impactare built from static parsing, not runtime tracing — dynamic dispatch, monkey-patching, and calls made through callbacks/closures/reflection won't show up as edges. Treatimpactas a lower bound on blast radius in highly dynamic code.Auto-reindex has a detection lag: with the file watcher enabled (default), edits are picked up after a short debounce, and
status()/search()run a throttled staleness check as a backstop — not an instant, per-call guarantee of freshness.
Architecture Decision Records
Key decisions are documented in docs/adr/:
ADR | Decision |
Merge two MCP servers into one | |
LanceDB over ChromaDB | |
ONNX Runtime over PyTorch for embeddings | |
bge-small-en as default embedding model | |
Dual parser: tree-sitter + ast-grep | |
rustworkx for graph algorithms | |
12-column PyArrow schema for LanceDB | |
Symbol-based chunking with deterministic IDs | |
8-step indexing pipeline | |
Graph tools API: serialization, ambiguity handling | |
Graceful shutdown, corruption recovery, JSON logging | |
READ/MUTATE/WRITE permission categories | |
Pydantic v2 I/O schemas — superseded by ADR-016 (never wired in, deleted) | |
Token-bucket rate limiting (off by default) | |
Auto-watch + throttled staleness detection | |
Removal of unused Pydantic schemas (supersedes ADR-013) | |
Tool consolidation 15→10, action-aware permission categories |
Documentation
Installation Guide — Prerequisites, client-specific setup, troubleshooting
Architecture — Data flow, component design, memory budget analysis
Usage Guide — Full tool reference with examples
Developer Guide — Contributing, adding tools/engines/languages
Research Notes — Library evaluations and technology deep-dives
Acknowledgments
Nexus-MCP consolidates two earlier open-source projects:
CodeGrok MCP by rdondeti (Ravitez Dondeti, MIT) — Contributed the symbol extraction pipeline, embedding service, parallel indexer, core data models, and memory retrieval system.
code-graph-mcp by entrepeneur4lyf — Contributed the ast-grep structural parser, rustworkx graph engine, complexity analysis, and relationship extraction.
Source files retain "Ported from" attribution in their module docstrings. See ADR-001 for the consolidation rationale.
License
PolyForm Noncommercial License 1.0.0. Free to use, copy, modify, and distribute for any noncommercial purpose. Commercial use requires a separate license — contact Shreyas Jagannath to inquire.
Versions published before 2.0.1 (0.1.0, 0.1.1, 2.0.0) remain available under their original MIT terms for anyone who obtained them under that license.
Available Tools
10 toolsanalyzeAnalyzeA
Use for code review or quality assessment — preferred over manually
reading files to eyeball complexity, since it computes cyclomatic/
cognitive complexity, dependency analysis, code smells (long/complex
functions, large classes, dead code), and an overall quality score in
one call. Read-only; requires an index (see index). Optionally scope
to a subdirectory or file via path to keep results focused and fast
on large codebases — omit it to analyze the whole indexed codebase.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Optional relative path to filter analysis (subdirectory or file) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it declares the operation read-only, requires an existing index, and clarifies whole-codebase behavior when path is omitted. It stops short of describing failure modes if the index is missing or stale, but this is adequate for a read-only analysis tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the primary use case, then metrics, safety, prerequisite, and path guidance. No filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, what the tool computes, read-only behavior, the index prerequisite, and the one parameter's semantics, including default behavior. An output schema is present, so not describing return values is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents path as an optional filter, and the description adds real value: omitting path means analyzing the whole indexed codebase, while providing it keeps results focused and fast on large codebases. That goes beyond simply restating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (the indexed codebase) and enumerates concrete analyses: cyclomatic/cognitive complexity, dependency analysis, code smells, and a quality score. This is clearly distinct from siblings like status, search, or explain, which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use the tool ('code review or quality assessment') and explicitly positions it as preferred over manually reading files. It also gives the prerequisite to use the index and explains how the optional path keeps analysis focused and fast, though it does not explicitly exclude sibling tools like explain or graph.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explainExplainA
Use for onboarding to an unfamiliar symbol — combines its call-graph relationships, related code found via semantic search, and quality metrics in one call, so Read is often unnecessary. Use verbosity='summary' for a quick look, 'full' when you need everything.
| Name | Required | Description | Default |
|---|---|---|---|
| verbosity | No | Output detail level: 'summary', 'detailed', or 'full' | detailed |
| symbol_name | Yes | Name of the symbol to explain |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It communicates that this is a single aggregated call combining multiple data sources and that it can replace Read, which is meaningful behavioral context. It does not explicitly state read-only, but the nature of 'onboarding' and 'explain' makes mutation highly unlikely.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, no filler. The core use case is front-loaded, and the verbosity guidance is a practical addition that earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is nearly complete for a two-parameter read-style tool with an output schema. It covers purpose, use case, an alternative tool, and parameter usage. The only notable gap is a lack of explicit routing against search/find_symbol in the provided sibling list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining when to use verbosity='summary' versus 'full', which goes beyond the schema's simple 'Output detail level' text. It does not add much for symbol_name, but the schema already sufficiently defines it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('explain'), a specific resource ('an unfamiliar symbol'), and the concrete components of the result: call-graph relationships, related code via semantic search, and quality metrics. This clearly distinguishes it from sibling tools like search or find_symbol.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use it for onboarding to an unfamiliar symbol and points out that Read is often unnecessary, giving clear context. However, it does not explicitly state when a sibling tool like search or find_symbol should be preferred instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_symbolFind SymbolA
Use to look up a specific function/class/symbol by name — preferred over Grep since it returns the definition plus its call-graph relationships in one call. Set exact=False for fuzzy substring matching when unsure of the exact name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Symbol name (e.g. 'create_server', 'TokenBudget') | |
| exact | No | True for exact match, False for fuzzy substring |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It discloses that the tool returns the definition plus call-graph relationships, which is valuable. However, it does not state whether the operation is read-only, whether authentication or indexing is required, or any side-effect profile. The returned data is partly covered by the output schema, but safety and prerequisites are left implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence states purpose and advantage, the second gives parameter guidance. Every word earns its place, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter lookup tool with an output schema present, the description covers the primary use case, the key decision about fuzzy matching, and the differentiating value over Grep. It doesn't explain prerequisites like whether an index exists, but given the tool's simplicity and the schema's completeness, this is a minor gap rather than a fail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds a decision rule for the exact parameter: 'Set exact=False for fuzzy substring matching when unsure of the exact name.' This goes beyond the schema's mechanical descriptions to tell the agent when to change the default, adding real usage semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'look up a specific function/class/symbol by name'. It also differentiates from Grep by adding 'preferred over Grep since it returns the definition plus its call-graph relationships in one call', giving an agent a clear reason to choose this tool over an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description names Grep as the alternative and states the condition that makes this tool preferable. It also advises when to flip exact to false ('when unsure of the exact name'). It doesn't explicitly address other siblings like search or conditions when this tool should not be used, which keeps it from a 5, but the guidance is concrete and useful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphGraphA
Use to trace who calls a function (direction='callers'), what it calls (direction='callees'), or — with transitive=True — the full transitive blast radius of changing it. MUST use transitive=True before refactoring or editing a widely-shared symbol; grep can't show transitive impact.
| Name | Required | Description | Default |
|---|---|---|---|
| direction | No | 'callers' (who calls this) or 'callees' (what this calls) | callers |
| max_depth | No | Max traversal depth when transitive=True (default 10) | |
| transitive | No | True = full transitive closure for change-impact analysis (MUST use before refactoring a shared symbol). Only valid with direction='callers'. | |
| symbol_name | Yes | Name of the function/symbol to trace |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It discloses the transitive blast-radius behavior and the critical refactoring caveat. It does not mention output format or potential cost, but the presence of an output schema and the concise warning make it adequately transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three focused sentences, each earning its place. The core behavior is stated first, then the critical warning about transitive mode, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the key decision drivers: what the tool does, how direction works, and when transitive mode is mandatory. Required parameters and defaults are already in the schema, and an output schema exists, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds semantic value beyond the schema by framing transitive=True as necessary for change-impact analysis and explaining the conceptual blast radius. This extra context helps an agent choose parameter values correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action — tracing a function's callers or callees — and clearly distinguishes the tool from generic search or symbol lookup siblings. The direction parameter is explained inline, making the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use the tool, when to set transitive=True, and contrasts it with grep, which cannot reveal transitive impact. This gives an agent actionable decision rules for using it before refactoring.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
healthHealthA
Use for liveness/readiness probes only (uptime, which engines are up)
— not for checking whether the index is fresh or complete; use status
for that.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It clearly defines the scope of behavior (liveness/readiness only) and what it does not cover. It does not describe side effects, but a health probe is implicitly read-only and the output schema is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence that front-loads the primary purpose and uses a dash to add the exclusion and sibling reference. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter liveness tool, the description provides complete selection guidance. The output schema covers return details, and the sibling list plus explicit status reference makes context complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing for the description to explain. The schema already documents this with an empty object and additionalProperties: false, matching the baseline for parameter-free tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose: liveness/readiness probes covering uptime and engine availability. It explicitly distinguishes itself from status, so an agent can tell them apart immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear when-to-use rule and an explicit exclusion: not for index freshness or completeness, with the alternative tool 'status' named. This leaves no ambiguity about routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
indexIndexA
Use first on any new or changed codebase, before any other tool —
everything except status/health requires an index. Supports
comma-separated paths for multi-folder/monorepo indexing (processed
sequentially to keep RAM low). Incremental by default once an index
exists, and reports live progress instead of blocking silently. After
this completes, a file watcher keeps the index fresh automatically
(NEXUS_AUTO_WATCH) — re-running index manually is rarely needed.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to the codebase directory (or comma-separated paths) | |
| paths | No | Additional comma-separated paths to index |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It reveals incremental behavior, low-memory sequential processing, live progress reporting, and automatic file watching, all beyond what the schema provides. No behavioral aspect is hidden or contradicted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: prerequisite guidance, multi-folder syntax, memory rationale, incremental/progress behavior, and the watcher note. The critical 'Use first' instruction is front-loaded, and the text is dense without being bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a setup/indexing tool: it explains prerequisites, invocation timing, performance characteristics, statefulness, and automatic maintenance. Since an output schema exists, return values need not be described in prose, and the context signals show a simple 2-parameter interface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline applies. The description reinforces that comma-separated paths are supported and adds the sequential-processing context, but it does not significantly expand on the schema's already-clear parameter descriptions. It earns a baseline 3 for not degrading clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose: build/refresh an index for a codebase, and explicitly frames it as the first step before almost all other tools. It distinguishes itself from siblings by noting that everything except 'status'/'health' requires an index, making its role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Use first on any new or changed codebase, before any other tool.' It also clarifies when not to run it manually by mentioning that a file watcher automatically keeps the index fresh, and identifies the two tools ('status'/'health') that do not require indexing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mapMapA
PREFERRED over Glob/ls/manual browsing for project understanding. Use 'summary' for a quick project orientation, 'architecture' for design/dependency structure, 'full' for both in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | 'summary' (files/languages/quality/top-modules), 'architecture' (layers/dependencies/classes/entry points/hub symbols), or 'full' (both) | summary |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral transparency burden. It conveys efficiency ('quick', 'both in one call') and scope ('project understanding'), but it does not explicitly state that the tool is read-only, whether it has side effects, or what permissions or costs might apply. The non-destructive nature is strongly implied but not stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, information-dense sentences with the preference statement front-loaded. Every sentence earns its place, and no content is unnecessarily repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter and an output schema, invocation details are complete and the mode rules are actionable. The main gap is the lack of guidance for choosing between map and overlapping siblings such as graph or analyze, but the 'project understanding' framing covers most relevant use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single detail parameter is already fully described in the schema, so the baseline is 3. The description adds task-oriented meaning by mapping each value to a use case ('quick project orientation', 'design/dependency structure') and by noting the efficiency of full in one call, which goes slightly beyond the schema's field listing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies map as the tool for project understanding, with summary, architecture, and full modes. It does not state an explicit verb+resource like 'Generate a project map', and it does not distinguish itself from siblings such as graph or analyze, but it is far from vague or tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says map is PREFERRED over Glob/ls/manual browsing for project understanding and gives precise mode-selection rules: summary for quick orientation, architecture for design/dependency structure, full for both. This is clear when-to-use guidance with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memoryMemoryA
Persist and retrieve project context across sessions. Use action='store' to save a decision/note, action='search' to find memories by semantic similarity, action='delete' to clean up by ID, tags, or type.
| Name | Required | Description | Default |
|---|---|---|---|
| ttl | No | Time-to-live for action='store': 'permanent', 'month', 'week', 'day', 'session' | permanent |
| tags | No | Comma-separated tags (all actions) | |
| limit | No | Max results (action='search', default 5) | |
| query | No | Natural language search query (action='search') | |
| action | Yes | 'store' (was remember), 'search' (was recall), or 'delete' (was forget) | |
| content | No | Memory content to store (action='store') | |
| project | No | Project name for scoping (action='store') | default |
| memory_id | No | Specific memory ID to delete (action='delete') | |
| memory_type | No | Type/filter, e.g. 'note', 'decision' (store: type; search/delete: filter) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses cross-session persistence, semantic-similarity search, and destructive cleanup behavior. It could mention irreversible deletion or TTL expiry more explicitly, but the core behavioral traits are visible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The primary purpose is front-loaded, and the action mappings are compact and scannable. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with nine parameters and no annotations, the description covers the essential decision points: which action to select and what each action accomplishes. The output schema exists and the parameter schema covers the remaining details, so the description is sufficiently complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all nine parameters. The description adds conceptual grouping around actions but does not provide additional parameter-level detail beyond what the schema states, which is exactly the baseline-3 scenario.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb-resource pair: 'Persist and retrieve project context across sessions.' It then enumerates three concrete actions (store, search, delete), each tied to a specific purpose, so an agent can distinguish this memory tool from generic siblings like search and status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent exactly when to use each action: save a decision/note, find memories by semantic similarity, or clean up by ID/tags/type. It lacks explicit exclusions or comparisons to sibling tools, so it is clear but does not fully meet the 'when-not and alternatives' bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearchA
Use for any "where is/how does/find" code question — preferred over
Grep/Glob, and usually answerable from the returned code_snippet without
a follow-up Read. Falls back to live grep automatically when hybrid
results are sparse. Returns a non-null warning if the index looked
stale (a background reindex is triggered; results still return now).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Search mode: 'hybrid', 'vector', or 'bm25' | hybrid |
| limit | No | Max results (default 10, max 100) | |
| query | Yes | Natural language or code query (e.g. 'retry logic') | |
| rerank | No | FlashRank reranking (default True) | |
| language | No | Filter by language (e.g. 'python') | |
| live_grep | No | Force live-grep fallback (rg/grep) | |
| symbol_type | No | Filter by type (e.g. 'function', 'class') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it delivers meaningful context: automatic fallback to live grep, stale-index warning semantics, background reindex triggering, and results still returning. It does not cover read-only/safety explicitly, but for a search tool this is substantial disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense, purposeful sentences with no filler. The primary use case and preference guidance are front-loaded, followed by behavior and warning semantics — every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers when to use the tool, fallback behavior, and warning semantics, and an output schema exists to document return values. It is slightly short on how mode/rerank/grep parameters interact with the described fallback, but overall an agent has enough context to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters. The description adds contextual value by mentioning 'hybrid results', 'code_snippet', and 'warning', but it does not explain parameter meanings beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific use case ('where is/how does/find code question') and names the preferred alternative (Grep/Glob), making the tool's purpose and differentiation clear. It also signals that results are often self-sufficient via 'code_snippet', so an agent knows what this tool is for and what it returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to use this tool versus Grep/Glob and notes the automatic live-grep fallback. It does not explicitly contrast with sibling tools like find_symbol or graph, but the stated query-type guidance is strong enough to route most calls correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusStatusA
Use at the start of a session, or when unsure if search results might be stale. Reports whether a codebase is indexed, index size/engine availability, memory usage, and a stale/staleness_warning pair if files changed since the last index (a background reindex is auto-triggered).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains what the tool reports and discloses that a background reindex is auto-triggered when files change, which is a meaningful side-effect an agent should know about.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that starts with the key usage guidance and then enumerates the reported fields. Every clause earns its place; there is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no parameters and an output schema, so the description need not explain return values in depth. It covers purpose, usage timing, reported metrics, staleness behavior, and the auto-reindex side effect, making it complete for an agent to decide when and why to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so parameter semantics are not applicable. The baseline for zero-parameter tools is 4, and the description appropriately focuses on behavior rather than parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Reports') and a precise resource scope: codebase index status, including index size, engine availability, memory usage, and staleness information. It clearly distinguishes itself from sibling tools like search and index by centering on index health and staleness.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: at the start of a session or when search results might be stale. It does not name alternative tools explicitly, but the use cases are clear enough to guide an agent away from search or index tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
- Added
graph - Added
search - Added
status
7 tool updates
v1.0.4- First observed
analyze - First observed
explain - First observed
find_symbol - First observed
health - First observed
index - First observed
map - First observed
memory
TDQS
Scored across 10 tools
Each tool has a clearly distinct responsibility: index/status/health manage the index lifecycle, map/search/find_symbol/graph/explain serve different code-comprehension needs, analyze covers quality, and memory handles persistent context. Even the potentially overlapping status/health pair is explicitly differentiated by freshness vs liveness.
Tool names are consistently lowercase and concise, mostly single imperative verbs. The pattern is slightly uneven because find_symbol uses verb_noun and memory is a noun rather than an action, but there are no mixed casing conventions or vague generic names.
Ten tools is well within the ideal scope for a code-intelligence server. Each tool covers a meaningful capability without redundancy, and the count feels neither thin nor bloated.
The set covers the full workflow of indexing, monitoring, searching, navigating, analyzing, explaining, and retaining project context. Minor gaps exist—there is no explicit unindex/forget tool or a way to list all indexed codebases—but core workflows have no dead ends.
Maintenance
Related MCP Connectors
Persistent memory and cross-session learning for AI coding assistants (hosted remote MCP).
Multiple MCP tools, persistent graph memory, token-saving data pointers, and more.
An MCP server that gives your AI access to the source code and docs of all public github repos
Related MCP Servers
- AlicenseAqualityAmaintenanceLocal MCP server for semantic code search using Tree-sitter AST parsing, local embeddings, and hybrid search; enables indexing and querying codebases entirely offline.5MIT
- AlicenseAqualityDmaintenanceLocal-first MCP server for semantic + keyword hybrid code search. Zero external services, no API keys required.2MIT
- AlicenseAqualityCmaintenanceAn MCP server that recommends UI components and utility methods from private code repositories using AI to enhance code reuse and development efficiency.46 npm1MIT
- FlicenseAqualityDmaintenanceSelf-hosted hybrid code search MCP server with text, symbol, and semantic search layers. Runs locally, no third-party MCP servers, LSP, or SaaS.8-