osnova
OfficialOsnova is a read-only MCP server that answers structural questions about an indexed repository — symbol search, text search, call graph, impact and test discovery — with exact file:line evidence and explicit omission counts.
osnova_ground— keyword/identifier search for definitions, returningfile:line, kind, span and signature; optional source inlining (lean=false,full=true); also resolves a verb+path (e.g.GET /users) to route registration and handler for Express, NestJS, Flask, FastAPI.osnova_thread— regex or literal (fixed=true) text search over indexed text, grouped by enclosing definition and ranked by dependents; 10 matches per group, 50 groups by default, exact totals and omission counts.osnova_outline— the definitions of one file with signature and line span, clipped to 4096 code units, so you can learn a file's shape without reading it.osnova_warp— call graph traversal: callers (direction=in, default) or callees (direction=out), 1–2+ hops of depth, per-symbol caps orfull=true, precise call-site lines; useful before changing a signature or deleting code.osnova_groundwork— one-shot repository map: directory clusters, hubs and hotspots under 2048 code units, for orienting in an unfamiliar repo.osnova_footing— task context forunderstand/change/review: seed definitions, connecting callers/callees and touching test files, under 4096 code units; seeds from a question or explicit qualified symbols, filterable by symbol kind.osnova_settle— change impact: from a diff, a base ref, or (by default) uncommitted changes vs HEAD, it lists the symbols touched and their indexed dependents to a chosen depth; a base ref is indexed from its tree without checkout.osnova_plumb— verifies a claimed list ofpath:linecall sites against the index, separating confirmed edges from name-only matches, non-calls, and dependents the claim omitted.osnova_tests— given symbols, finds test files in two tiers (resolved call/reference edges vs import-only leads); given a test file, lists the non-test symbols it calls and files it imports.osnova_unreferenced— lists definitions with no resolved incoming edge from outside their own body, with counts of unresolved same-name leads and identifier mentions; entry points excluded, exported definitions optional. Candidates only, never proof.
Indexes C++ codebases to provide symbol search, call graph navigation, and change impact analysis.
Indexes Dart codebases to provide symbol search, call graph navigation, and change impact analysis.
Indexes Elixir codebases to provide symbol search, call graph navigation, and change impact analysis.
Indexes JavaScript codebases to provide symbol search, call graph navigation, and change impact analysis.
Indexes Kotlin codebases to provide symbol search, call graph navigation, and change impact analysis.
Indexes OCaml codebases to provide symbol search, call graph navigation, and change impact analysis.
Indexes PHP codebases to provide symbol search, call graph navigation, and change impact analysis.
Indexes Python codebases to provide symbol search, call graph navigation, and change impact analysis.
Indexes Ruby codebases to provide symbol search, call graph navigation, and change impact analysis.
Indexes Rust codebases to provide symbol search, call graph navigation, and change impact analysis.
Indexes Scala codebases to provide symbol search, call graph navigation, and change impact analysis.
Indexes Swift codebases to provide symbol search, call graph navigation, and change impact analysis.
Indexes TypeScript codebases to provide symbol search, call graph navigation, and change impact analysis.
Indexes Zig codebases to provide symbol search, call graph navigation, and change impact analysis.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@osnovawhere do we validate tokens?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Osnova
A deterministic code map for AI coding agents. Osnova indexes a repository into a symbol and call graph with tree-sitter, then serves it to any MCP client or from the command line. Same input, same output, byte for byte. No embeddings, no telemetry, and no network connection unless you type osnova update-check. Twenty languages, seven of them (TypeScript, JavaScript, Python, Go, Rust, Java, C#) with deep adapters.
Osnova is the Slavic word for base or foundation. That is the job: give an agent solid ground to stand on before it edits code.
Quick start
Node.js 22.13 or newer. Serve a repository to any MCP client:
npx -y @getdomovoi/osnova mcp --workspace /path/to/repoAfter npm install -g @getdomovoi/osnova, one command per kind of agent: claude wires Claude Code (MCP entry, session, prompt and stop hooks, and the skill); agents wires every installed harness that reads AGENTS.md (Codex, OpenCode, Kilo, Pi, Cursor), each with its hooks, plugin or extension, plus one shared skill in ~/.agents/skills/. Each previews its changes; --apply writes them, backing up every file it changes.
osnova setup claude --apply
osnova setup agents --applyOr add the MCP entry by hand; replace osnova with npx -y @getdomovoi/osnova when there is no global install.
{ "mcpServers": { "osnova": { "command": "osnova", "args": ["mcp"] } } }Related MCP server: ThingForce Graph Studio
What you get back
osnova warp src/api.ts#refreshWorkspace on this repository, cut to twelve lines (test/docs-readme-warp.test.ts fails when the first two no longer reproduce):
function src/api.ts#refreshWorkspace: 83 indexed edges
reach: d1 callers 83 in 14 files (3 dirs); d2 +16 in 2 files; unresolved same-name 10; tests 18
d1 calls src/cli/cli.ts#ensureIndex:78 [import-binding]
d1 calls src/cli/hook.ts#runHook:191,203,225,240 [import-binding]
d1 calls src/mcp/server.ts#createOsnovaMcpServer.refresh:297 [import-binding]
d1 calls test/verification-fastpath.test.ts#<module>:37,47,48,51,53,57,58,64,68,74,78,85,110,114,132,145,154,166,171,197 [re-export-binding]
via src/index.ts:65 refreshWorkspace -> src/api.ts (export refreshWorkspace)
This does not prove absence of callers or that deletion is safe.
unresolved evidence (10); not confirmed relationships
candidates for refreshWorkspace (2, unverified): src/api.ts#refreshWorkspace, test/mcp-watch.test.ts#refreshWorkspace
d1 calls refreshWorkspace test/artifact-format9.test.ts:78,85,104,120,140 [binding-blocked]
d1 calls refreshWorkspace scripts/perf.mjs:485,486,491 [import-target-unresolved]Each confirmed line names the caller, its lines and the evidence that tied the call to this definition: an import binding, a same-file definition, a re-export chain with its hop, or an identified receiver. Calls the index could not tie to a definition are listed apart as unresolved evidence, with the same-name candidates it found and the reason it stopped, so a name match is never mistaken for a caller. The reach line gives exact counts, not scores, and when the list outgrows its budget a capped: line and an omitted: footer count what was left out.
How much of the graph is exact
A call site counts as resolved when the index ties it to one definition through evidence it can name; everything else stays unresolved with a reason. These are the shares on the pinned checkouts under benchmarks/corpora/, recorded in benchmarks/results/resolution-coverage-2026-09-21b.json; the last column leaves out calls through packages outside the repository and calls to builtins, which can never resolve locally, and the reference defines every column.
Corpus | Languages | Call sites | Resolved | Share | Excluding externals |
click | all | 6593 | 2903 | 44.0% | 62.4% |
cobra | all | 4374 | 1980 | 45.3% | 88.9% |
gson | all | 23382 | 8473 | 36.2% | 56.7% |
humanizer | all | 30517 | 7798 | 25.6% | 51.3% |
pyright | all | 58578 | 30070 | 51.3% | 74.5% |
ripgrep | all | 13387 | 6121 | 45.7% | 71.6% |
zod | all | 53417 | 21630 | 40.5% | 73.2% |
Per-language rows are in the reference. osnova coverage reports the same numbers for your own repository, per language and per reason.
Resolved is not the same as right, so the call edges are also scored against each language's type checker or compiler. Every call site in six pinned checkouts was sent to the checker for the callee's declarations, and each osnova edge was marked true when the definition it names contains that declaration and false when it does not. Measured at 0.12.0:
Corpus | Checker | Decided edges | False | False-edge rate | In-repo sites covered |
click | pyright 1.1.414 | 2883 | 0 | 0% | 90.4% |
zod | TypeScript 5.9.3 | 21593 | 4 | 0.02% | 78.2% |
cobra | go/types, Go 1.27.1 | 1980 | 0 | 0% | 87.5% |
ripgrep | rust-analyzer 1.98.1 | 6066 | 29 | 0.48% | 85.8% |
humanizer | Roslyn 5.9.0 | 7363 | 3 | 0.04% | 62.2% |
gson | javac 27 | 8133 | 4 | 0.05% | 72.3% |
Java and C# overloads share one symbol in the index, so a call edge names the overload it binds only when the written argument count fits exactly one declaration of the type, its partial parts and its declared base classes; when it fits several or none, the edge keeps the method and names no declaration, and the oracle leaves it out of both rates (2526 edges on gson, 602 on humanizer). 0.11.0 named the last overload declared for every call, recorded a call at the first line of its call expression, and lost the rest of a C# file after a primary constructor or a raw string; it measured gson 2045 false edges (24.75%), humanizer 617 (8.25%) and ripgrep 112 (2.06%). Of the 29 left on ripgrep, 11 are functions declared once per #[cfg] branch, 6 are a test module's function named like its parent's, and 5 are calls to a local closure or parameter named like a function elsewhere. A call whose target has one declaration that fits keeps it even when a base type is outside the index, where an unseen base overload could be the one the compiler binds; this limit is kept because withdrawing those edges cost 10 recall points on humanizer for one fewer false edge. Every false edge is classified by cause in benchmarks/results/type-checker-oracle-2026-09-30.json with the method and its limits. The scripts that produce these numbers are in benchmarks/oracle/.
Grep versus the graph
The reason to keep a call graph instead of running a text search is not speed. It is that the first regex a person types is wrong more often than it looks, and nobody notices. Nine call-site sets in six languages were verified line by line; each cell shows sites found (precision / recall), and the method lists what each side got wrong.
Corpus | Target | Verified sites | Text search | Resolved graph |
click |
| 13 | 12 (0.92 / 0.85) | 12 (1.00 / 0.92) |
pyright |
| 28 | 5 (0.80 / 0.14) | 28 (1.00 / 1.00) |
cobra |
| 30 | 30 (1.00 / 1.00) | 30 (1.00 / 1.00) |
cobra |
| 12 | 13 (0.92 / 1.00) | 12 (1.00 / 1.00) |
humanizer |
| 18 | 19 (0.74 / 0.78) | 18 (1.00 / 1.00) |
ripgrep |
| 12 | 32 (0.38 / 1.00) | 12 (1.00 / 1.00) |
ripgrep |
| 26 | 26 (1.00 / 1.00) | 26 (1.00 / 1.00) |
gson |
| 10 | 29 (0.34 / 1.00) | 10 (1.00 / 1.00) |
gson |
| 27 | 43 (0.63 / 1.00) | 27 (1.00 / 1.00) |
The graph never returned a site that was not a call of the target. The record is benchmarks/results/grep-vs-graph-2026-09-21.json.
The ten tools
The names play on the foundation image. The CLI uses the same names without the prefix: osnova ground and osnova_ground are the same query.
Tool | Meaning | Does |
| the ground you stand on | Keyword search: ranked definitions with exact |
| the thread you follow through the cloth | Text search: regex or literal matches grouped by symbol |
| the outline of one part | Signatures and line spans for one file |
| the threads that hold the weave | Call graph: callers and callees, direct or transitive |
| the groundwork under everything | Repository map: directory clusters, hubs and hotspots |
| the footing you build on | Task context: definitions, relationships and candidate tests around a question |
| how the ground settles after a change | Change impact: the symbols a diff touches and their indexed dependents |
| the plumb line dropped straight through | Check claims: which listed call sites the index confirms, and which dependents were left out |
| the cloth pulled to see what holds | Tests: the test files that reference a symbol, or the symbols one test file reaches |
| threads left loose at the edge | Definitions with no indexed caller, each with its leads; candidates, never proof |
Every MCP response opens with its index generation, says when the index is partial, and counts what its budget left out; the budgets, and which CLI subcommands carry the generation, are in the reference.
Hooks and clients
One global install serves every repository and every client: one entry in each client's global config, nothing per project, nothing written inside your repository. osnova setup claude and osnova setup agents show the diff and write nothing until --apply; agents skips a harness whose config folder is missing, --only codex,pi narrows it, and a skill or plugin file you edited is kept and reported. --uninstall reverses either family the same way, previewing first. The table lists the per-client form, for one piece at a time. What each hook prints, when it stays quiet, and what the trials measured are in the reference.
Client | How to wire | What it adds |
Claude Code |
| MCP entry plus session, prompt and stop hooks; |
Claude Code, as a plugin |
| The same MCP entry, hooks and skill, run through |
Codex |
| MCP entry plus the same three hooks; trust them in |
Cursor |
| MCP entry plus the stop hook as a follow-up message |
OpenCode |
| MCP entry plus a plugin that appends starting points to each message; the tool guidance comes from the MCP instructions |
Kilo |
| MCP entry plus the same plugin |
Pi |
| MCP entry through |
In CI
The action runs osnova settle --base-ref against the pull request base and lists every indexed dependent of the symbols the pull request changed; the report is indexed structural evidence only, so a missing dependent is not proof that nothing depends on the change.
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: getdomovoi/osnova@v0.12.0
with:
depth: "2"Inputs and the local form are in the reference.
What osnova does not do
No type inference and no dynamic dispatch. Edges come from syntax: direct calls, imports, name references, declared heritage (a written superclass or interface name) and framework routes (a registration whose receiver binds to a listed framework import, with the verb and the literal path written at the site), with lexical binding and receiver hints for TypeScript, JavaScript and Python. Resolution is heuristic and says so.
No route table. A
routesedge is one registration site tied to one handler; prefixes from mounts, blueprints and controllers are recorded on their own edges and never composed into a full path, a computed path records no path, and an inline closure or a wrapped handler records the route with no target. Express, NestJS, Flask and FastAPI are read; gin, axum, Django, Spring, ASP.NET, Rails and file-based routers are not.That boundary has a measured price. Scored against a type checker on two pinned corpora, the calls osnova does not resolve are mostly calls whose receiver type is never written down: 2945 of 6359 missed sites on zod and 164 of 307 on click are a plain name carrying no annotation, and another 1478 on zod are a call result or a property chain. Only 349 missed sites on zod and 10 on click have a type written at the receiver's declaration, and 248 of those 349 are a single library idiom. Resolving every one of them would move recall from 76.9% to 78.2% on zod and from 90.4% to 90.7% on click, so the boundary costs roughly one recall point rather than ten. The full census is in
benchmarks/results/receiver-boundary-census-2026-09-21.json.No semantic search.
osnova_groundis fielded lexical ranking over definitions. It is fast, deterministic and explainable, and it will not match a paraphrase.No proof of safety. An empty caller list means the index found no caller, not that none exists.
No cost claims. Agent trials so far show correctness parity with and without the graph on small tasks. A benchmark that separates the two is in progress.
How it stays honest
Every query refreshes the index from the working tree first, uncommitted edits included, and reports its generation.
Every clipped output says how much was clipped. Every ranked list says how many candidates it dropped. Partial indexes say so on every response.
Every hit carries a
file:linespan, a source hash and an index generation, so you can check what the agent cites.Every benchmark result in
benchmarks/results/is frozen with its corpus fingerprint, and rejected experiments stay on record next to accepted ones.The cache verifies a SHA-256 over the structural core before parsing it and hash-checks each source text on read. Nothing is written outside it.
CLI
Every tool is a subcommand: osnova build <root>, osnova warp <symbol>, osnova settle --base-ref <ref>, plus coverage, check, doctor, setup and mcp. The full list is in the reference.
Library
import { buildIndex, ask, callersDetailed, renderMapCard } from "@getdomovoi/osnova". The structured APIs return complete results with omission counts; the text budgets apply to CLI and MCP presentation only. Every export is in the reference.
Contributing
Bug reports, language adapters, benchmark corpora and agent trials are all welcome. Read CONTRIBUTING.md for the gates a change must pass: lint, typecheck, tests, build, perf budgets and package smoke.
pnpm install
pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm perfDeterminism is the core invariant. A change that makes incremental refresh differ from a full rebuild by one byte is a bug.
License
Apache-2.0
Privacy: PRIVACY.md. Security policy and reporting: SECURITY.md.
Available Tools
10 toolsosnova_footingARead-onlyIdempotent
Task context: for one task, the seed definitions (inlined when 40 lines or shorter), the callers and callees that connect them, and the test files that touch them, under 4096 code units with exact omission counts. Use once at the start of a change or review that spans more than one file; for a single known symbol use ground or warp instead.
| Name | Required | Description | Default |
|---|---|---|---|
| in | No | Restrict to a file or directory path (repo-relative) | |
| task | No | Task shape (default understand) | |
| depth | No | Relationship walk depth (default 3) | |
| kinds | No | Only seed question hits of these symbol kinds (default: every kind, real definitions before 1-line constants, type aliases and test-file symbols) | |
| limit | No | Maximum retrieval seeds (default 8) | |
| symbols | No | Seed qualified names (file#Class.method) instead of a question | |
| question | No | Natural-language or keyword query used to pick seed symbols (ignored when symbols is given) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: it returns a bounded context (under 4096 code units), inlines seed definitions only when 40 lines or shorter, and reports exact omission counts. It doesn't mention performance or error behavior, but the key output characteristics are disclosed.
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 tight sentences: the first packs the output content and size constraint, the second gives the usage rule and alternatives. No filler words, though the first sentence is noun-heavy and requires careful parsing.
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 read-only retrieval tool with a fully described schema and explicit safety annotations, the description covers purpose, scope, output bounds, and when/when-not. No output schema exists, but the size limit and omission counts are stated. It lacks detail on failure modes or response shape, which is acceptable given the structured coverage.
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 schema already documents all seven parameters with defaults, enums, and semantics. The description only broadly refers to 'seed definitions' and 'callers/callees' without adding syntax, format, or inter-parameter behavior beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
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 (retrieve/assemble) and resource (task context: seed definitions, callers/callees, test files) with a size bound and omission counts. It clearly distinguishes itself from siblings by naming ground and warp as alternatives for single symbols. The purpose is clear, though the quirky companion tool names and the dense phrasing slightly obscure it.
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 it ('once at the start of a change or review that spans more than one file') and when not to ('for a single known symbol use ground or warp instead'). This is exactly the kind of routing guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
osnova_groundARead-onlyIdempotent
Search: find definitions by keyword or identifier. Each hit gives exact file:line, kind, definition span and signature, without source lines. Pass lean=false to inline the whole definition when it is 40 lines or shorter and an 8-line excerpt otherwise, or full=true to inline whole definitions. Start here when you do not know where code lives. A verb and path (GET /users) finds the route registration and its handler for Express, NestJS, Flask and FastAPI.
| Name | Required | Description | Default |
|---|---|---|---|
| in | No | Restrict to a file or directory path (repo-relative) | |
| full | No | Inline whole definitions instead of 8-line excerpts | |
| lean | No | Default true: keep file:line, kind, definition span and signature without source; false inlines source; an explicit true overrides full | |
| limit | No | Maximum hits (default 8) | |
| question | Yes | Natural-language or keyword query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover read-only, idempotent, non-destructive safety. The description adds output-format behavior: lean vs full inlining and defaults. It doesn't cover rate limits, auth, or failure modes, but for a read-only search this is adequate.
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?
Front-loaded with the core purpose and output format, then parameter behavior. Some redundancy between the initial list and later detail, but overall tight and useful.
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 read-only search tool with full schema coverage and no output schema, this description covers purpose, output shape, parameter interactions, and a usage entry point. It lacks sibling differentiation, which is the main gap.
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 schema already documents parameters. The description explains the interaction between lean and full (lean=false inlines if <=40 lines or an 8-line excerpt; full=true inlines whole), which adds value beyond schema descriptions.
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?
Clearly states it is a search tool that finds definitions by keyword or identifier, and adds specific behavior: it returns file:line, kind, definition span, and signature. The mention of route registration for frameworks distinguishes it from a generic text search.
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?
Tells the agent to start here when code location is unknown, which gives a clear use context. It doesn't explicitly compare to sibling tools like osnova_groundwork or osnova_outline, but the routing is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
osnova_groundworkARead-onlyIdempotent
Repository map: directory clusters, hubs and hotspots in under 2048 code units. Use once when the repository is unfamiliar; do not follow it with an outline of every directory.
| Name | Required | Description | Default |
|---|---|---|---|
| maxDirs | No | Maximum directory clusters (default 8) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this read-only, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuine behavioral context beyond them: the output budget (under 2048 code units) and the composition of the result (clusters, hubs, hotspots), plus the 'use once' sequencing constraint.
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, front-loaded with what the tool returns, then the usage rule. Every clause carries information; the size bound and the anti-pattern warning both earn their 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 read-only, zero-required-parameter summary tool with no output schema, the description covers purpose, scope, output composition and usage discipline, which is sufficient for correct invocation. It stops short of describing the shape or ordering of the returned map, which a description-only tool could mention.
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?
There is one optional parameter with 100% schema description coverage, so the schema already documents maxDirs and its default of 8. The description's reference to 'directory clusters' loosely matches the parameter, but adds no syntax or behavior beyond the schema; baseline 3 applies.
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 resource and its contents: a repository map of directory clusters, hubs and hotspots, bounded to under 2048 code units. It also distinguishes itself from the sibling osnova_outline by warning against following it with an outline of every directory.
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 gives a clear triggering condition ('use once when the repository is unfamiliar') plus an explicit anti-pattern ('do not follow it with an outline of every directory'), which implicitly routes the agent away from osnova_outline. The alternative is described behaviorally rather than named by tool, so it stops short of the explicit routing a 5 requires.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
osnova_outlineARead-onlyIdempotent
Outline: the definitions of one file with signature and line span, selected by connectivity to fit 4096 code units, with an exact count of any omitted. Use instead of reading a whole file to learn its shape; read only the span you need afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Repo-relative file path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description goes further by disclosing the 4096 code-unit selection budget and that omissions are exactly counted, which tells the agent output may be incomplete by design.
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, front-loaded with the purpose before the usage instruction, and every clause carries information. The first sentence is dense and comma-embedded, which slightly slows parsing but wastes no words.
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?
With no output schema, the description must explain returns, and it does: definitions, signatures, line spans, and an omission count. Combined with annotations covering the safety profile and full schema coverage on the single parameter, an agent has what it needs to call this 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?
Only one parameter, and schema coverage is 100% with the description 'Repo-relative file path'. The description adds no syntax or format detail beyond the schema, so the baseline of 3 for full schema coverage applies.
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 verb and resource ('Outline: the definitions of one file') plus the exact output shape (signature and line span, selection by connectivity, 4096 code-unit budget, count of omitted). This is clearly distinguishable from the sibling tools that read, test, or warp code.
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 says 'Use instead of reading a whole file to learn its shape; read only the span you need afterwards,' which gives both a positive trigger and a follow-up workflow. It does not name which sibling implements the whole-file read, so the alternative is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
osnova_plumbARead-onlyIdempotent
Check claims: given a symbol and a list of path:line call sites an agent believes depend on it, says which are confirmed by the index, which are name matches only, which have no call, and which indexed dependents were left out. Use before declaring a caller list complete. Confirmed means an indexed resolved edge, not runtime proof.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Depth the claimed list was made at (default 1); pass 2 when the claim covers callers of callers | |
| sites | Yes | Claimed call sites as repo-relative path:line | |
| symbol | Yes | Symbol name or qualified name (file#Class.method) | |
| direction | No | in = callers of the symbol (default), out = callees |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds important behavioral nuance by clarifying that 'confirmed' means an indexed resolved edge, not runtime proof, and that it can surface omitted dependents. It doesn't describe output format, but no output schema exists, so this is a minor gap.
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 first sentence front-loads the core operation and classification outcomes; the second gives usage advice; the third defines 'confirmed.' It is slightly dense but every sentence contributes.
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 read-only verification tool with no output schema, the description covers purpose, the four classification outcomes, usage timing, and the meaning of 'confirmed.' It could specify output structure, but the agent has enough to invoke and interpret 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 each parameter's meaning and default. The description restates the core inputs (symbol and path:line sites) but adds no format or constraint details beyond the schema, so 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?
The description states a specific verification purpose: given a symbol and claimed call sites, it classifies each as confirmed, name match only, no call, or omitted indexed dependent. This is distinct from the sibling tools (which appear to be discovery/index tools), and an agent can tell immediately what the tool does.
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 says 'Use before declaring a caller list complete,' which gives one clear context, but there are no alternatives named and no explicit when-not-to-use guidance. For a tool whose siblings include likely related graph tools, more routing guidance would help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
osnova_settleARead-onlyIdempotent
Change impact: given the output of git diff, the symbols the diff touches and their indexed dependents to the requested depth (default 1), under 4096 code units with exact omission counts. Use once after editing, before declaring done, to find callers the tests do not cover; with no arguments it checks every uncommitted change against HEAD. A diff alone compares against the current index only, so deleted symbols are not visible; with baseRef (a git commit or ref) it indexes that commit's tree under the cache and compares it with the current index, computing the diff with git when none is given.
| Name | Required | Description | Default |
|---|---|---|---|
| diff | No | Unified diff text with a/ b/ or plain repo-relative paths (omit both diff and baseRef to settle uncommitted changes against HEAD) | |
| depth | No | Dependent walk depth (default 1) | |
| baseRef | No | Git commit or ref to compare against; its tree is indexed under the cache without a checkout |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, and non-open-world traits. The description adds substantial behavioral detail: output truncation under 4096 code units with exact omission counts, cache indexing of baseRef trees, diff computation when none is given, and the limitation that a diff alone cannot show deleted symbols.
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 three dense sentences that are front-loaded with purpose, followed by usage and caveats. Every sentence contributes, though the nested clauses make it slightly harder to parse than ideal.
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 complex change-impact tool with no output schema, the description covers what is returned (symbols and dependents, with omission counts), when to use it, how arguments behave, and key limitations. Annotations carry the safety profile, so the remaining context is sufficient.
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 meaningful semantics beyond the schema: no-argument behavior settles uncommitted changes against HEAD, diff alone compares only against the current index, and baseRef indexes a commit tree under the cache without checkout.
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 states a specific analysis: given a git diff, it computes touched symbols and indexed dependents at a depth, with output limits. It distinguishes itself from a plain diff by explaining index-based comparison, but it does not explicitly differentiate from sibling tools like osnova_tests or osnova_unreferenced.
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?
Usage is explicit: 'Use once after editing, before declaring done, to find callers the tests do not cover,' and no-argument behavior is defined. It lacks explicit when-not-to-use guidance and does not name alternative sibling tools for comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
osnova_testsARead-onlyIdempotent
Tests: given symbols, the indexed test files for each one in two separate tiers with separate counts: files with a resolved call or reference edge to the symbol (exact file:line and resolution basis), then files that only import the symbol's file and contain no indexed call or reference to it. An empty resolved tier is stated on its own line; import-only files are leads, not tests of the symbol. Given one test file, the non-test symbols it calls and the files it imports. Exactly one of symbols or file. Use before editing to find the tests to run. No indexed test is not proof of no test, and a listed test is not coverage.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Repo-relative test file whose symbols under test to list | |
| limit | No | Maximum test files per symbol (default 20) or symbols per file (default 50) | |
| symbols | No | Symbol names or qualified names (file#Class.method) to find tests for | |
| includeImportOnly | No | With symbols: also list test files that only import the symbol's file (default true); false lists only files with a resolved edge |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, etc., so safety and idempotency are covered. The description adds valuable context beyond annotations: it explains the two-tier result structure, that an empty resolved tier is stated on its own line, that import-only files are leads not tests, and provides an important caveat about the limitations ('No indexed test is not proof of no test, and a listed test is not coverage'). It doesn't discuss rate limits or auth, but none are relevant here.
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 dense paragraph that packs a lot of information, but it's not front-loaded with a clear summary sentence. The purpose is buried after listing tier details. It could be better structured with a leading sentence stating the core function, then details. However, it is not overly verbose.
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?
Given the complexity of the tool (dual-mode, two-tier results) and the lack of an output schema, the description does a good job covering return semantics and caveats. It could be improved by explaining what happens when both parameters are omitted (since required parameters is 0), but it largely addresses what an agent needs to know.
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 four parameters thoroughly. The description adds a bit of meaning by clarifying the mutual exclusivity ('Exactly one of symbols or file') and the tier interpretation, but it doesn't add new syntax or format details for parameters. Baseline 3 is appropriate when the schema does the heavy lifting.
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 states the tool's purpose: finding indexed test files for given symbols across two tiers, and conversely listing symbols under test for a given file. It specifies the exact dual-mode behavior precisely. It does not distinguish this tool from its siblings (e.g., doesn't say why to use this over osnova_unreferenced or osnova_ground).
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 gives clear usage context: 'Use before editing to find the tests to run.' It also specifies the mutual exclusivity constraint: 'Exactly one of symbols or file.' However, it doesn't compare to sibling tools or state when NOT to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
osnova_threadARead-onlyIdempotent
Text search: regex or literal matches over indexed text, grouped by the enclosing definition and ranked by how much else depends on it. Shows up to 10 matches per group and 50 groups by default (limit raises the group cap); totals and omission counts are exact, so you know what was left out.
| Name | Required | Description | Default |
|---|---|---|---|
| in | No | Restrict to a file or directory path (repo-relative) | |
| fixed | No | Treat pattern as literal text | |
| limit | No | Maximum groups (default 50) | |
| pattern | Yes | Regex pattern (or literal text with fixed=true) | |
| ignoreCase | No | Case-insensitive matching |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description builds on top of that with real operational detail: grouping by enclosing definition, dependency-based ranking, a 10-matches-per-group cap, a 50-group default that `limit` raises, and the guarantee that totals and omission counts are exact. The completeness guarantee in particular tells the agent it can trust pagination boundaries, which is exactly the kind of context annotations cannot express.
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, both front-loaded with the most important information (search semantics first, caps and completeness second). Every clause earns its place: the parenthetical about `limit` and the omission-count guarantee both change how an agent would call or interpret the tool. No filler, no restatement of the 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?
There is no output schema, so the description carries the burden of explaining return shape, and it does so reasonably: groups, matches per group, default caps, and exact totals/omission counts. What is missing is the concrete structure of a returned group or match (fields, identifiers), but for a read-only search tool with fully documented parameters this is close to 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?
Schema description coverage is 100%, so a baseline of 3 applies and the schema already documents pattern, fixed, in, limit, and ignoreCase. The description goes one step further by clarifying that `limit` raises the *group* cap rather than the per-group match count, resolving an ambiguity in the terse schema text. That is a modest but genuine addition beyond the structured fields.
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 and resource (text search with regex/literal matching over indexed text) and adds distinctive mechanics: results grouped by enclosing definition and ranked by dependents. That separates it from a generic search. It does not, however, name or contrast against any sibling tool (osnova_ground, osnova_outline, etc.), so the agent still must guess how it relates to the rest of the family.
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?
Usage is only implied: the agent can infer this is the tool for finding text occurrences in indexed code. There is no explicit when-to-use, when-not-to-use, or pointer to an alternative tool for a different search style. For a search tool in a family of ten opaque siblings, more routing guidance would help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
osnova_unreferencedARead-onlyIdempotent
Unreferenced candidates: definitions with no resolved call or reference edge from outside their own body in a non-test file, sorted by file and line, each with the count of unresolved same-name call sites (leads that may reach it), test-file sites and identifier mentions in non-test files. Entry points (main, default exports, index.* files, package.json bin files, test files, constructors, Python dunders) are never listed; exported definitions are listed only with includeExported. Candidates only: no indexed caller is not proof of no caller.
| Name | Required | Description | Default |
|---|---|---|---|
| kinds | No | Symbol kinds to examine (default function, method, class: the kinds the index records edges to; constants, types and interfaces receive no edges, so asking for them lists nearly all of them) | |
| limit | No | Maximum candidates (default 50); the omitted count is exact | |
| scope | No | Repo-relative path prefix to examine (default: whole index) | |
| includeExported | No | Also list exported definitions, which external consumers may reach (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: it explains that results are sorted by file and line, describes what each result entry contains (unresolved same-name call site counts, test-file sites, identifier mentions), details the exclusion rules for entry points, and warns about the interpretation limit. This goes well beyond the readOnly/idempotent annotations. However, it doesn't discuss pagination behavior or performance characteristics.
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 dense but efficient — it front-loads the core purpose and packs substantial qualification, exclusion rules, and interpretation caveats into a compact span. There's minimal waste, though the parenthetical enumerations make it slightly heavy to parse in one pass.
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?
Given the complexity (a code-analysis query tool with nuanced semantics), no output schema, and the need to explain what 'unreferenced' means and its limitations, the description covers the essential ground: output format, exclusion rules, parameter effects, and a crucial interpretation caveat. It could be improved with a brief note on pagination or typical use case, but the core is solid.
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 four parameters thoroughly. The description adds meaning by explaining why certain kinds are excluded by default ('constants, types and interfaces receive no edges, so asking for them lists nearly all of them') and clarifying that 'the omitted count is exact' for the limit parameter. This enriches understanding beyond raw schema text.
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 resource ('unreferenced candidates: definitions with no resolved call or reference edge from outside their own body in a non-test file') with clear precision about what is and isn't included. The sibling tools have opaque names (groundwork, outline, warp, etc.), and while no sibling is named explicitly, the semantic specificity of 'unreferenced candidates' makes the tool's purpose unambiguous.
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 provides strong contextual guidance: it clarifies what constitutes an entry point that's never listed, explains the includeExported flag's purpose, and includes a caveat ('Candidates only: no indexed caller is not proof of no caller'). However, it doesn't explicitly name alternative tools or state when an agent might prefer an alternative approach. The guidance is about interpretation, not tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
osnova_warpARead-onlyIdempotent
Call graph: who calls a symbol (direction=in, default) or what it calls (direction=out), with exact call-site file:line. Accepts file#Class.method, Class.method or a bare name. Use before changing a signature or deleting code. An empty list means no indexed caller, not proof that none exists.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Print every call site with no per-symbol cap or summary (default false); output is still clipped at 16,384 code units | |
| depth | No | Hops to walk from the symbol (default 1); 2 also lists callers of callers, or callees of callees with direction=out | |
| symbol | Yes | Symbol name or qualified name (file#Class.method) | |
| direction | No | in = callers (default), out = callees |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive behavior, so safety is covered. The description adds genuinely useful behavioral context beyond annotations: the exact return format (file:line), the accepted input forms, and a crucial caveat that an empty list means 'no indexed caller, not proof that none exists.' It does not describe pagination or the non-full mode summary behavior, which the schema handles.
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 tight sentences, front-loaded with the core purpose, then usage, then an important caveat. Every sentence earns its place with zero 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?
For a read-only query tool with full schema coverage and no output schema, the description provides everything needed: what it returns, how to call it, when to use it, and a critical interpretation caveat about empty results. 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 parameters like full, depth, and direction are already fully documented in the schema. The description reinforces direction and accepted symbol formats but adds little beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
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?
Opens with 'Call graph:' and states both directions (who calls a symbol, what it calls) with exact output format 'file:line'. A specific verb+resource that is immediately distinguishable from sibling tools like osnova_outline or osnova_ground.
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?
Explicit when-to-use: 'Use before changing a signature or deleting code.' Names the default direction inline. This directly ties the tool to a developer workflow, leaving little ambiguity about when to invoke it.
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.
10 tool updates
v0.12.0- First observed
osnova_footing - First observed
osnova_ground - First observed
osnova_groundwork - First observed
osnova_outline - First observed
osnova_plumb - First observed
osnova_settle - First observed
osnova_tests - First observed
osnova_thread - First observed
osnova_unreferenced - First observed
osnova_warp
TDQS
Scored across 10 tools
Each tool has a clearly distinct purpose: repository overview, file outline, symbol search, text search, call graph, task context, change impact, claim checking, test discovery, and unreferenced audit. No two tools overlap in function or output, so an agent can select the right tool without confusion.
All names are a single lowercase word with the osnova_ prefix, which is consistent and readable. However, the terms are metaphorical and domain-specific rather than predictable verb_noun patterns, making them less immediately intuitive than standard naming conventions.
Ten tools is well-scoped for a code intelligence server, covering discovery, navigation, analysis, and validation without redundancy. Each tool earns its place by addressing a distinct code-understanding need.
The set covers a broad range of code intelligence tasks from exploration to change validation, with strong attention to edge cases. It lacks direct tools for editing code or generating diffs, but those may be outside the server's scope.
Maintenance
Related MCP Connectors
Ask a codebase what calls what: search, blast radius, paths between symbols, and diffs.
Search indexed code, trace dependencies, assess change impact, and recall repository memory.
Persistent memory, hybrid search and a goal graph for AI agents, over stdio or remote HTTP.
Code intelligence for coding agents: semantic, AST, graph, and full-text search. 279+ languages.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceServes a repo-indexing engine over stdio with tools for scanning, graph analysis, symbol extraction, caller lookup, and grep.698 npm1MIT
- AlicenseNot gradedqualityCmaintenanceEnables people and AI agents to query local code repositories as graphs through stdio MCP tools for project listing, search, dependency tracing, impact analysis, bridge detection, node inspection, bounded code reading, and optional LSP definition/reference lookups.MIT
- AlicenseNot gradedqualityAmaintenanceServes a repository's code knowledge graph over stdio (MCP) so coding agents can look up symbols, trace callers and callees, compute blast radius, list file symbols, run hybrid lexical-plus-graph search, and get citation-grounded answers from file:line evidence instead of guessing from text chunks. All tools work offline straight from the graph, with prose synthesis only when an OpenAI-compatible LLM endpoint is configured.13MIT
- AlicenseNot gradedqualityBmaintenanceEnables coding agents to find code by behavior across an authorized repository, returning exact source excerpts with paths and line numbers. It exposes a single semantic search tool over stdio so agents can locate relevant code without knowing file names or symbols.57 npmMIT