lodesman
Lodesman is an MCP server that puts a real language server behind coding agents, answering compiler-grade code-intelligence questions by returning code, not just locations.
Get repository context:
project_infoconfirms which repo the server is bound to.Find symbols and definitions:
find_symbol,find_definition,document_symbols,get_symbol_body, andexplain_symbollocate and describe code without reading whole files.Trace usage and impact:
find_referencesreturns real call/usage sites with surrounding code;blast_radiusshows what breaks if a symbol changes.Explore polymorphism:
find_implementationsfinds concrete implementations or overrides of interfaces/abstract members.Edit safely:
rename_symbolrenames compiler-recognized symbols project-wide, with a dry-run preview by default and optionalapply=true.Verify changes:
checkreturns compiler diagnostics for a file from the already-running language server, without a full build.All answers are gated on the language server being ready, and missing capabilities are reported rather than faked as empty results.
Provides compiler-grade code intelligence for TypeScript projects, including finding symbols, definitions, references, implementations, renaming, and compiler diagnostics.
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., "@lodesmanwhat uses RagQueryService?"
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.
Lodesman
Compiler-grade code intelligence over MCP. Lodesman puts a real language server behind your coding agent's tools, so "who calls this?" is answered by the compiler rather than by a text search.
A lodesman is the pilot who comes aboard and steers a ship through waters the captain doesn't know. That is the job: an agent dropped into an unfamiliar repository, guided by something with local knowledge.
Status: alpha. The tool surface is still growing and not every tool is finished. If you hit something broken, an issue is genuinely useful — see Status.
Why
An agent's dominant cost is reading files into context, and a tool that returns
coordinates makes that worse, not better — Program.cs — L135 forces the
agent to read the file anyway.
Measured on a real C# repository, answering "what uses RagQueryService":
approach | cost |
read the three files involved | 1745 lines, ~17.7k tokens |
the 3 references, with ±6 lines of code each | ~36 lines, ~370 tokens |
~48× cheaper, and it is a better answer. So Lodesman's tools return code, not locations. A location is a promise of future cost; the code is the answer.
The second reason is correctness. An agent cannot tell a true "no results" from a broken query, so a plausible empty answer is the most dangerous thing a navigation tool can produce. Lodesman gates every answer on the language server actually being ready, and distinguishes "none" from "couldn't tell".
Related MCP server: codebase-rag
Install
Requires Python 3.11+.
uvx lodesman-mcp # run without installing
pipx install lodesman-mcp # or install itWire it into Claude Code
claude mcp add lodesman --scope user -- uvx lodesman-mcpOr, for any MCP client, in the config directly:
{
"mcpServers": {
"lodesman": {
"command": "uvx",
"args": ["lodesman-mcp"]
}
}
}With no arguments Lodesman binds to the working directory it is launched in, which is what MCP clients give it. One user-scoped entry therefore works across every project — no per-project configuration.
To point it somewhere explicitly:
lodesman-mcp /path/to/repo --language csharpFirst run
The language server itself is downloaded on first use into ~/.solidlsp
(override with SOLIDLSP_HOME). For C# this pulls Roslyn from NuGet and can
take several minutes. Later runs reuse it and start in seconds.
The server process starts immediately; the language server behind it starts lazily on the first tool call and is then kept warm for the life of the process. That is the whole design: a cold Roslyn costs minutes, a warm one answers in milliseconds and tracks your edits incrementally.
Verify your install
python scripts/smoke_test.py /path/to/repo --language csharpThis starts a real language server against a real repository and proves it answers the two questions everything else is built on — what symbols are in this file, and who references this symbol — with cross-file results the compiler agrees with.
Tools
tool | what it answers |
| which repository this server bound to, and how |
| find a symbol by name anywhere in the project |
| where is this defined |
| what actually uses this, with the surrounding code |
| concrete implementations of an interface or abstract member |
| outline one file: its types, methods and fields |
| the full source of one declaration, by name |
| resolved type, signature and documentation |
| what breaks if this symbol changes |
| rename everywhere, using the compiler's understanding |
| compiler diagnostics for one file, from the warm server |
blast_radius and check are the two that exist specifically because agents
edit code they haven't read: one tells you the cost of a change before you make
it, the other verifies it afterwards without a full build.
rename_symbol is a dry run by default and lists every file it would touch.
Pass apply=true to write; it reports how many files actually changed on disk.
Tools depend on what the language server behind them implements. pyright, for
instance, does not serve textDocument/implementation, so find_implementations
reports that rather than pretending the answer is "none" — a distinction that
matters more to an agent than to a person.
How it binds to a project
One server process serves one repository, chosen at startup: the path you pass, or the working directory if you pass nothing.
The language is detected by counting source files under that root and taking the
majority. Pass --language when that guess is wrong — a repo with a TypeScript
frontend and a C# backend has to be told which one you mean:
lodesman-mcp . --language typescriptStatus
Alpha. The tool surface is still growing, and not every tool is finished.
Lodesman inherits SolidLSP's language coverage, and runs wherever its language servers do. Not every language and platform combination has been exercised yet, so if you try one and it breaks, please open an issue — a report with the language, the OS and the stderr output is the most useful thing you can send. Testing help is very welcome.
Known issues
None currently open.
Fixed in 0.3.1:
rename_symbol(apply=true)reported success while writing nothing to disk. It now writes, preserves CRLF line endings, handles UTF-16 column offsets, and reports the number of files whose bytes actually changed.Language detection descended into dot-directories, so starting a server in a home directory could bind it to a "project" made of
.cacheand.local.Pointing the server at a directory with no recognized source files produced an unhandled traceback, which an MCP client renders as "failed to connect".
Tools taking a
fileargument did not verify the path stayed inside the repository.The per-project cache key was case-folded on every platform, so on a case-sensitive filesystem two distinct repositories could share one cache.
Development
git clone https://github.com/florpan/lodesman
cd lodesman
pip install -e . # or: uv pip install -e .
python -m unittest discover -t . -s testsInstall before running the tests. Nothing in the suite asserts against a third-party library, but importing the server pulls in the vendored SolidLSP and therefore its dependencies, so on a bare interpreter the modules fail at the loader rather than at an assertion.
That runs the unit tests and the integration tests that need no language server — startup, language detection, the tool surface, and path containment, which is enforced before any language server is contacted. A couple of seconds, no downloads.
The rename tests drive a real language server and are opt-in, because a cold machine has to download one first:
LODESMAN_INTEGRATION=1 python -m unittest discover -t . -s testsThey skip rather than fail if no working language server is available. Note
that "no language server" is narrower than it sounds: SolidLSP launches pyright
through uvx, which brings its own runtime, so the Python tests run on any
machine with uv even without node — only the TypeScript ones need node. Good
for coverage, but the two conditions are not the same claim.
The language contract
tests/integration/languages.py holds one fixture project per language
lodesman auto-detects, all modelling the same thing — a Record type, a Store
interface, two implementations, and a second file that uses them — so the
assertions are identical across languages and only the syntax differs. Each
language then gets the same contract asserted against it: find a symbol, outline
a file, resolve a definition, find cross-file references, return a body, explain
a symbol, answer or decline implementations, and rename to disk without
disturbing line endings.
The set is tied to EXTENSION_LANGUAGES rather than to a popularity list, and a
test enforces that: adding a language to the detector without adding a fixture
fails the suite. The suite cannot fall behind what the server claims to do.
How much of it runs depends on what is installed, which varies a lot:
language | needs |
C# | nothing — Roslyn fetches .NET and itself |
Python | uv |
TypeScript / JavaScript | node, npm |
PHP | node, npm — intelephense analyses PHP from node |
references and rename need | |
Go | go, and |
Rust | rustup, and |
Java | a JDK |
Ruby | ruby, and |
C / C++ | clangd |
Kotlin | a JDK and kotlin-language-server |
Swift | a Swift toolchain |
Anything unavailable skips with a reason naming the missing tool. CI runs the full matrix, one job per language, so a per-language regression is caught even though no single machine can run them all.
Not every server implements the whole protocol, and one gates parts of it
commercially. Where a capability is missing the contract does not go soft — it
asserts the opposite property, that lodesman reports the absence rather than
returning an empty result as though it were an answer. On unlicensed PHP,
find_references must say the result is inconclusive and rename_symbol must
refuse and leave the tree untouched. A confident wrong answer is the one
failure mode an agent cannot recover from.
To run them against a published release instead of the working tree:
LODESMAN_PKG=lodesman-mcp@0.3.1 UVX_FLAGS=--refresh \
LODESMAN_INTEGRATION=1 python -m unittest discover -t . -s testsUVX_FLAGS is separate because uv's own flags must precede the package name —
anything after it is forwarded to lodesman-mcp and rejected by its argument
parser.
There is also a standalone check against a repository of your own:
python scripts/smoke_test.py <repo> --language csharpBuilt on SolidLSP
The language-server client layer is SolidLSP,
MIT, vendored unmodified under src/lodesman/_vendor/. It is bundled rather
than depended on because it is not published to PyPI independently of the Serena
application, which is GPL and is not included here.
Everything Lodesman does lives outside that tree — the project anchoring, the readiness gate, the cross-file indexing wait, symbol ranking, and the decision to return code instead of coordinates were all solved by calling SolidLSP differently, never by editing it. That rule is what keeps re-syncing with upstream cheap.
See NOTICE.md for full attribution.
License
MIT — see LICENSE.
Bundled third-party code, its copyright holders and its license texts are listed in NOTICE.md. Everything bundled is MIT-licensed.
Available Tools
11 toolsblast_radiusA
What breaks if this symbol changes: everything that references it, then everything that references those, to the given depth. Run before changing a signature or deleting anything.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Symbol name | |
| depth | No | Hops to follow, 1-4 (default 2) | |
| max_queries | No | Query budget (default 60) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the recursive traversal behavior and the depth parameter, which is useful. However, with no annotations provided, the description carries the full burden of behavioral disclosure. It doesn't mention whether this is a read-only operation, whether it executes code, or what the output format looks like. The 'max_queries' parameter hints at a query budget but the description doesn't explain what happens when the budget is exhausted.
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 zero waste. The core behavior is front-loaded ('What breaks if this symbol changes'), and the usage guidance is a natural second sentence. 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 read-only analysis tool with 100% schema coverage, the description is nearly complete. It explains the transitive behavior, the depth parameter, and when to use it. The only gap is the lack of detail about the output format and what happens when max_queries is hit, but these are minor given the schema covers the parameters.
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 three parameters. The description adds context for 'depth' by explaining the transitive hops behavior, but doesn't add meaning beyond the schema for 'name' or 'max_queries'. Baseline 3 is appropriate since 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 uses a specific verb ('breaks') and resource ('symbol'), and clearly states the transitive behavior ('everything that references it, then everything that references those, to the given depth'). It distinguishes itself from siblings like find_references by emphasizing the recursive blast-radius analysis rather than just direct references.
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 states when to use this tool: 'Run before changing a signature or deleting anything.' This provides clear context and implies it is a pre-refactoring safety check, distinguishing it from alternatives like find_references or rename_symbol.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
checkA
Compiler diagnostics for one file, from the already-running language server — errors and warnings in milliseconds, without a build. Run this after editing to confirm the change compiles.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Path relative to the repo root | |
| limit | No | Max diagnostics (default 40) | |
| severity | No | Lowest severity to report: 1 errors only, 2 errors+warnings (default), 3 adds info, 4 adds style hints. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It adds meaningful context beyond the schema: the tool depends on an already-running language server, is non-build invariant, and returns diagnostics in milliseconds. This implies a read-only, non-destructive operation, which is sufficient for this tool type.
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 zero filler. The first sentence front-loads the purpose and key differentiators (fast, no build, language server), and the second adds a concrete usage trigger. 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 simple diagnostics tool with no output schema and no annotations, the description covers what it returns (errors/warnings), when to use it (after editing), and its precondition (already-running language server). The only minor omission is explicit behavior if the server is not running, but that is not critical for invoking 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 baseline is 3. The description adds no additional meaning for file, limit, or severity beyond what the schema already documents; it does not compensate for any gaps because there are none.
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 verb and resource ('compiler diagnostics for one file') and distinguishes the tool from the symbol-focused sibling tools (find_symbol, find_references, etc.). The phrase 'errors and warnings in milliseconds, without a build' precisely scopes 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?
The description gives explicit workflow guidance: 'Run this after editing to confirm the change compiles.' It does not name alternatives or exclusions, but the sibling set is all symbol-navigation tools, so there is no realistic alternative to confuse it with. The 'without a build' and 'already-running language server' context clarifies when it is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_symbolsA
Outline one file: every type, method, and field it declares, with line numbers. The API surface of the file without reading its body.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Path relative to the repo root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It accurately describes the operation as outlining symbols and notes it does not read the file body, which is a useful behavioral detail. However, it does not explicitly state that the operation is non-destructive or mention any side effects, though for a read-only tool this is minor.
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, zero filler. The core action ('outline one file') is front-loaded, and the clarifying phrase about the API surface is concise and valuable.
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 one-parameter tool with no output schema, the description is largely complete: it specifies what is returned (symbols with line numbers) and what is not done (reading the body). Minor gaps like handling of large files or edge cases are not critical for basic usage.
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% for the single 'file' parameter, which is already documented as 'Path relative to the repo root'. The description adds no additional parameter-specific guidance, so the baseline of 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 verb ('outline') and resource ('one file'), and clearly enumerates the output ('every type, method, and field it declares, with line numbers'). It differentiates from siblings by specifying the scope is the entire file's API surface, not a single symbol or body.
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 implies usage (when you want a file's API surface without reading its body) but does not explicitly mention when not to use it or name alternatives like find_symbol or get_symbol_body. The context is clear but exclusions are left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_symbolA
What a symbol is: resolved type, signature and documentation, plus its declaration line. Answers 'what does this call do' without opening the file.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Symbol name |
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 explicitly lists the output components (resolved type, signature, documentation, declaration line) and implies a read-only, non-mutating lookup by saying 'without opening the file.' It does not mention prerequisites like project indexing or error behavior, but for a simple explanation tool, the core behavior is 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?
The description is two concise sentences with no filler. The first sentence front-loads the output contents, and the second gives the practical use case. Both sentences 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 single-parameter, read-only tool with no output schema, the description covers what the tool returns, why an agent would use it, and the expected input via schema. It could further specify naming conventions or failure behavior, but the information provided is sufficient for correct selection and invocation in most 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?
Schema coverage for the single parameter is 100%, with the schema describing 'name' as 'Symbol name'. The description adds overall context about what the tool does with the symbol but does not provide additional detail about name format, qualification, or matching rules. Baseline 3 applies since the schema already documents the parameter sufficiently.
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 what the tool does: it explains what a symbol is by returning resolved type, signature, documentation, and declaration line. It also frames the specific use case ('what does this call do') and differentiates itself from siblings like find_symbol and get_symbol_body by emphasizing semantic explanation over locating or retrieving source 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?
The description provides clear guidance on when to use the tool: when you need to understand what a call or symbol does without opening the file. However, it does not explicitly name alternative tools or state when not to use it, so it falls short of full exclusion-based guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_definitionA
Jump to where a symbol is defined, resolved by the language server.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Symbol name to look up |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that resolution is handled by the language server and implies a read-only navigation action, but it does not mention failure cases, response shape, or any side effects. This is adequate for a simple lookup but leaves some behavioral ambiguity.
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 communicates the action, target, and resolution mechanism without any filler. Every word contributes value.
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 one-parameter read-only tool, the description covers the core behavior. However, there is no output schema and no explanation of what 'jump' returns (e.g., location, range), nor any guidance on prerequisites like an active language server. This leaves some gaps for an agent deciding how to handle the response.
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 covers the single parameter 'name' with 'Symbol name to look up' at 100% coverage. The description's phrase 'where a symbol is defined' adds minimal semantic context beyond the schema, so a baseline of 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 action ('Jump to where a symbol is defined') and a clear resource (the symbol's definition). The word 'definition' inherently distinguishes this from siblings like find_references and find_implementations, and 'resolved by the language server' adds technical precision.
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 no guidance on when to use this tool versus alternatives, no exclusions, and no mention of prerequisites. It simply states what the tool does without situational cues.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_implementationsA
Find the concrete implementations of an interface or abstract member, or the overrides of a virtual one. Answers 'what actually runs when this is called', which references alone cannot tell you.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Interface or member name | |
| limit | No | Max results (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the disclosure burden. It clarifies that results are runtime implementations rather than mere reference locations, but it does not explicitly state read-only behavior, scope limits, or behavior when no implementations exist. 'Find' implies a safe read operation, but that is 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?
Two sentences with no filler. The core action and resource are front-loaded, and the second sentence earns its place by distinguishing the tool from reference-based siblings.
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 read-only tool with no output schema, the description provides enough context about what the results represent and when to use it. The exact return shape is implied rather than stated, but the tool name and description make it reasonably predictable.
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% and documents both name and limit. The description adds real meaning to `name` by specifying that it can be an interface, abstract member, or virtual member, and by explaining the nature of the result. It appropriately avoids repeating the limit 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 verb and resource: finding concrete implementations or overrides. It also differentiates from siblings like find_references with the phrase 'what actually runs when this is called', giving the tool a precise semantic identity.
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 embeds a clear usage trigger: when references alone cannot tell you what actually runs, use this tool. It does not explicitly list exclusions or compare against find_definition, but it provides enough directional guidance to select among the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_referencesA
Find everything that references a symbol — the real call/usage sites the compiler sees, including dependency-injection registrations and interface implementations that a text search misses. Run this before renaming, changing a signature, or deleting.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Optional: file containing the symbol | |
| line | No | Optional: 1-based line of the symbol | |
| name | Yes | Symbol name to look up | |
| limit | No | Max results (default 50) | |
| include_code | No | Show the source at each reference (default true). Leave it on: without it you must open each file to use the answer. |
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 that the tool performs compiler-level static analysis (not just text matching) and that it includes DI registrations and interface implementations. It does not mention side effects or permissions, but as a find operation it is implicitly read-only. The description adds useful behavioral context beyond the schema.
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 establishes the core functionality, and the second gives actionable usage guidance. It is front-loaded with the primary purpose and 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?
The tool has five parameters, no output schema, and no annotations. The description covers the purpose and usage guidance but does not describe the return structure beyond the hint in the include_code parameter. Given the simplicity of the tool and the schema's parameter details, the description is largely complete, though a brief mention of the returned data (e.g., list of file/line/code) would improve 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?
Schema description coverage is 100%, so the schema already fully documents all five parameters. The description adds no additional parameter-specific information beyond what the schema provides, so it meets the baseline without extra value.
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 ('Find everything that references a symbol') and clarifies that it includes compiler-visible sites like dependency-injection registrations and interface implementations, which differentiates it from text search and sibling tools like find_implementations. The purpose is unambiguous and the resource is well-defined.
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 states when to use it: 'Run this before renaming, changing a signature, or deleting.' It also implies a contrast with text search by saying it finds what a text search misses. However, it does not explicitly name alternatives or when not to use it, but the directive is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_symbolA
Find a symbol by name anywhere in the project, resolved by the language server rather than by text search. Returns each match with its file and line.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Symbol name or fragment | |
| limit | No | Max results (default 25) |
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 of behavioral disclosure. It does mention that resolution is via the language server rather than text search, and that results include file and line. It does not explicitly state that the operation is read-only, but that is strongly implied by 'find'. It also omits any potential caveats such as index availability or performance trade-offs, which would be useful for a tool with no annotation safety profile.
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 exactly two sentences, front-loaded with the primary action and scope. Every word contributes value, and there is no redundant information. It is a model of concise, efficient writing.
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 tool with two parameters and no output schema, the description provides sufficient context to call it correctly: it tells you what input is expected, what it does, and what the output contains (file and line). It could mention the project-wide scope explicitly, but that is already in the first sentence. The only missing piece is explicit routing to sibling tools, but that falls under usage guidelines rather than completeness.
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%, with both 'name' and 'limit' clearly described in the schema. The description adds no additional meaning beyond what the schema already provides, such as matching semantics or the meaning of the limit. This meets the baseline but does not exceed 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 clearly states the tool finds a symbol by name anywhere in the project, distinguishes itself from text search by noting it's language-server resolved, and implies a different purpose from sibling tools like find_definition or find_references. The verb-resource pairing is specific and 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?
Usage is implied: you use this when you have a symbol name and want to locate it. However, it does not explicitly state when not to use it or mention any of the sibling tools as alternatives, leaving the agent to infer the distinction from the tool names and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_symbol_bodyA
The full source of one declaration, by name — a method, class or function — without reading the file it lives in. Use this instead of opening a file to look at a single member.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Symbol name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that the tool returns the full source of one declaration and does not require opening the containing file. It does not explain error behavior or edge cases, but for a simple read-oriented tool it gives meaningful behavioral insight.
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 compact sentences, front-loaded with the core purpose, with no filler. Every word adds information, and the usage guidance is succinctly appended.
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 tool's low complexity (one required parameter) and no output schema, the description conveys the return value ('full source') and the input semantics sufficiently. It omits error conditions and resolution scope, but for this straightforward getter, the description is largely 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 schema already describes the 'name' parameter as 'Symbol name' with 100% coverage, so the baseline is 3. The description adds value by specifying that the name must be a method, class, or function declaration, clarifying the accepted symbol kinds and the intent that it is a declaration name, not a file path.
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 returns the full source of one declaration (method, class, or function) identified by name, which is a specific verb+resource. It distinguishes the tool from simply reading a file, though it does not explicitly differentiate from sibling tools like find_symbol or find_definition.
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 explicit guidance: 'Use this instead of opening a file to look at a single member.' This gives a clear invocaton context and identifies an alternative to avoid. However, it does not address sibling tools or edge cases like when the symbol is not found.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_infoA
Which repository this server bound to, and how. Answers cheaply without starting the language server — use it first to confirm the server is pointed at the project you think it is.
| Name | Required | Description | Default |
|---|---|---|---|
No 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 'answers cheaply without starting the language server,' which is a meaningful behavioral trait. It does not fully describe the return shape or error modes, but for a zero-parameter informational query this is reasonably 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?
The description is a single, well-structured sentence that front-loads the core purpose and then adds the cheapness and usage guidance. Every clause earns its place with no redundant information.
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, no-output-schema tool, this description is complete: it explains what the tool reports, how to use it first, and why it is useful. The agent has everything needed 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 exactly zero parameters, and the schema coverage is trivially 100%. The baseline for zero-parameter tools is 4, and the description has no need to explain parameter behavior.
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 the tool's resource ('which repository this server bound to') and its informational purpose, including 'how' the binding is established. It also distinguishes this tool from the symbol-oriented siblings by focusing on server configuration state rather than code navigation.
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 usage guidance: 'use it first to confirm the server is pointed at the project you think it is.' It clearly explains when to invoke it, though it does not explicitly state when not to use it, but no obvious alternative among the sibling tools directly competes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_symbolA
Rename a symbol everywhere, using the compiler's own understanding rather than text replacement — so it renames the right things and leaves unrelated same-named symbols alone. Defaults to a dry run showing what would change.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Current symbol name | |
| apply | No | Write the changes. Omit or false to preview only. | |
| new_name | Yes | New name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits, and it does disclose the most critical one: 'Defaults to a dry run showing what would change.' This tells the agent that by default no mutation occurs and that apply=true is required to write changes. It also explains the semantic behavior (renames only the right symbols). However, it does not disclose potential side effects of applying (e.g., whether changes are reversible, file scope, or confirmation requirements), which would be expected for a mutation tool with zero annotation coverage.
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 zero fluff. The core purpose is front-loaded in the first sentence, and the critical dry-run default is stated immediately after. Every clause earns its place; there is no redundant information. The structure leads with what the tool does, then clarifies its safety behavior.
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 of this complexity, the description covers the essential context: purpose, semantic accuracy, and default preview behavior. It does not explain what happens when apply is true (beyond the schema's 'Write the changes') or any prerequisites or consequences, but the dry-run default mitigates risk. Given no annotations and no output schema, the description is reasonably complete but could explicitly mention that applying is a permanent mutation.
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 all three parameters (name, new_name, apply) are already documented in the schema. The description's mention of 'dry run' is consistent with the apply parameter's schema text, but it adds no new semantic information beyond what the schema already provides. The description does not clarify parameter formats, constraints, or relationships, so it stays at the baseline for full coverage.
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 renames a symbol everywhere using compiler semantics rather than text replacement, explicitly distinguishing it from a naive search-and-replace. The verb 'rename' and resource 'symbol' are specific, and the contrast with text replacement sets it apart from any generic editing tool. Sibling tools like find_symbol and find_references are for lookup, so this tool's unique purpose is 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 implies when to use this tool (when a semantic rename is needed) but does not explicitly state when not to use it or mention any sibling alternatives. The phrase 'rather than text replacement' gives a comparative guideline, but it does not address how this tool relates to find_references or other siblings, leaving the agent to infer that rename is the right choice. This is acceptable but not fully explicit.
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.
11 tool updates
v0.3.0- First observed
blast_radius - First observed
check - First observed
document_symbols - First observed
explain_symbol - First observed
find_definition - First observed
find_implementations - First observed
find_references - First observed
find_symbol - First observed
get_symbol_body - First observed
project_info - First observed
rename_symbol
TDQS
Scored across 11 tools
Most tools have distinct purposes, but a few overlap conceptually (e.g., find_symbol vs find_definition, explain_symbol vs get_symbol_body). The descriptions are detailed enough to reduce confusion, but an agent might still hesitate when selecting between similar navigation actions.
The majority follow a consistent verb_noun pattern (find_symbol, find_references, rename_symbol, etc.), but a few deviate: project_info, check, and blast_radius are not verb-first. The naming is still readable and predictable overall, just with minor inconsistencies.
With 11 tools, the server covers a comprehensive set of code navigation and analysis operations without being bloated. Each tool addresses a specific need, and the count fits well within the ideal range for a focused domain.
The tool set covers the full lifecycle of symbol exploration: finding, defining, referencing, implementing, renaming, inspecting, and checking diagnostics. It includes advanced features like blast radius and document outlines, leaving no obvious dead ends for common code navigation workflows.
Related MCP Connectors
Code intelligence for coding agents: semantic, AST, graph, and full-text search. 279+ languages.
Codebase intelligence for AI agents — dead code, blast radius, ownership.
Codebase graphs, caller impact analysis, and recorded project context for AI coding agents.
Code intelligence platform for AI agents. 20 tools for architecture, security & impact analysis.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceSupercharges AI coding agents with a pre-indexed semantic code graph, enabling instant symbol relationships, impact analysis, and context retrieval across 20+ languages.70,850 npm71,313MIT
- AlicenseNot gradedqualityBmaintenanceEnables LLM agents to efficiently understand and navigate a codebase by providing semantic search over symbols and a reference graph, replacing expensive grep/glob calls with structured tools like definition lookup, caller/callee queries, and change-impact analysis.2MIT
- AlicenseNot gradedqualityAmaintenanceProvides live, graph-verified code intelligence for AI agents, including call graphs, dependency awareness, and safety gates on edits to prevent breaking changes.16MIT
- AlicenseAqualityAmaintenanceEnables AI coding agents to query a semantic cross-repository code graph for symbols, references, callers, dependencies, and change impact across registered repositories.111221Apache 2.0