Scopewalker MCP
Scopewalker MCP is a local, read-only MCP server that analyzes codebase size, structure, complexity, documentation, and code-quality risks using nine tree-sitter/tokei-powered tools.
get_line_counts — per-file code/blank/comment line counts with extension filters, sorting, and project-wide totals
get_functions — list functions/methods with per-file counts or per-function line metrics, including a
min_linesfilter for oversized functionsget_complexity_metrics — nesting depth, parameter counts, cognitive complexity, cyclomatic complexity, and hotspot flags
check_thresholds — flag files and functions exceeding configurable size limits
get_code_inventory — list classes, functions, methods, interfaces/types, enums, and constants with export status
get_documentation_coverage — coverage percentage plus undocumented functions, classes, and methods
get_code_smells — detect TODO/FIXME/HACK/BUG/UNUSED/DEPRECATED comments and unsafe TypeScript casts via AST analysis
get_prop_drilling — find parameter names threaded through many functions/files with risk ratings
find_dead_code — identify unreferenced symbols and private methods, separated into proven dead code and unreferenced exports
Integrates with GitHub Copilot in VS Code to provide codebase health analysis and complexity metrics.
Allows OpenAI Codex CLI to access codebase analysis tools such as threshold checks, complexity metrics, and code smell detection.
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., "@Scopewalker MCPcheck thresholds in the src directory"
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.
Scopewalker MCP
AI agents will happily create 1000+ line source files and add a 20th parameter to a function call, even if there's a rule file telling them not to. Scopewalker exists to enforce stricter codebase standards.
It's a local MCP server (open source, runs over stdio, makes no network calls) that exposes 9 read-only tools:
get_line_counts- per-file line counts (total, code, blank, comment) with sorting, extension filters, and project-wide totalsget_functions- function and method detection; per-file counts, or per-function line metrics viadetail=lineswith amin_linesfilter for hunting oversized functionsget_complexity_metrics- max/average nesting depth and parameter counts (JSX props included), import counts, a per-file cognitive-complexity score, and per-function cyclomatic complexity with high/extreme severity bands, plus hotspots flagged for deeply nested or over-parameterized functionscheck_thresholds- flags files and functions exceeding size thresholds (defaults: 300 lines per file, 100 per function)get_code_inventory- classes with their methods, functions, interfaces/types, enums, and constants, each marked exported or not; private symbols hidden by defaultget_documentation_coverage- coverage percentage plus every function, class, or method missing a doc comment (JSDoc, Python docstrings, Rust///, and other per-language formats)get_code_smells- TODO/FIXME/HACK/XXX/BUG/UNUSED/DEPRECATED markers found by scanning actual comments via the AST (no false positives from string literals), plusas unknown as/as any asdouble casts in TypeScriptget_prop_drilling- parameter names threaded through many functions and files, with forwarding evidence and a high/medium/low risk ratingfind_dead_code- unreferenced top-level symbols and private methods, split into certaindead_codeand human-judgmentunreferenced_exports
It's tree-sitter (parsing) + tokei (line counting) + fast-glob (file discovery) under the hood; nothing is custom-parsed. Tested on macOS with Claude Code, but should work with Cursor, VS Code, Windsurf, Antigravity CLI, Codex, or anything else that speaks MCP.
See TOOLS.md for the quick reference, docs/ for per-tool parameters and example responses, and docs/usage-examples.md for a guide to wiring Scopewalker into skills, subagents, and AGENTS.md.
Safety Defaults
No network access: All analysis runs locally over stdio: no data leaves your machine, no API keys or external services involved.
Path scoping: All tools only operate inside allowed roots (defaults: current working directory and system temp). Override with
SCOPEWALKER_ALLOWED_ROOTS=/abs/path1,/abs/path2.Large file guard: AST-based tools skip files larger than 1 MB to avoid excessive memory/CPU use. Tokei-based line counts do not enforce this limit.
Input ceilings:
max_filescaps at 10000,max_depthat 64,limitat 5000.Symlinks: Directory scans do not follow symbolic links.
Output limits: Tools default to returning 20 files/items unless
limitis set.Comment redaction:
get_code_smellsredacts comment text by default; passinclude_text: trueto return snippets explicitly.
Related MCP server: flyto-indexer
Requirements
Node.js 22+
tokei - Install via
brew install tokeiorcargo install tokei
Installation
Scopewalker is published to npm as scopewalker-mcp; no clone or build needed. Configure your MCP client to run it via npx (examples below), or install it globally with npm install -g scopewalker-mcp.
To build from source instead, see Development.
Configuration
Claude Code
claude mcp add --scope user scopewalker-mcp -- npx -y scopewalker-mcpOr add to ~/.claude.json:
{
"mcpServers": {
"scopewalker-mcp": {
"command": "npx",
"args": ["-y", "scopewalker-mcp"]
}
}
}See Claude Code MCP documentation for details.
Claude Desktop
Download scopewalker-mcp.mcpb from the latest release and open it with Claude Desktop (or drag it into Settings > Extensions) for one-click installation.
Cursor
Add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):
{
"mcpServers": {
"scopewalker-mcp": {
"command": "npx",
"args": ["-y", "scopewalker-mcp"]
}
}
}Or configure via File > Preferences > Cursor Settings > MCP.
See Cursor MCP documentation for details.
VS Code (GitHub Copilot)
Add to .vscode/mcp.json in your workspace:
{
"servers": {
"scopewalker-mcp": {
"command": "npx",
"args": ["-y", "scopewalker-mcp"]
}
}
}Requires VS Code 1.102+ with Agent Mode enabled.
See VS Code MCP documentation for details.
Windsurf
Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"scopewalker-mcp": {
"command": "npx",
"args": ["-y", "scopewalker-mcp"]
}
}
}Or configure via Windsurf Settings > Cascade > Manage MCPs.
See Windsurf MCP documentation for details.
Antigravity CLI
Add to ~/.gemini/config/mcp_config.json (global) or
.agents/mcp_config.json (per project):
{
"mcpServers": {
"scopewalker-mcp": {
"command": "npx",
"args": ["-y", "scopewalker-mcp"]
}
}
}Use /mcp inside the prompt panel to check server status and reload the
config.
See Antigravity CLI MCP documentation for details.
For Gemini CLI, add the same mcpServers configuration
to ~/.gemini/settings.json. See Gemini CLI MCP documentation.
OpenAI Codex CLI
Add to ~/.codex/config.toml:
[mcp_servers.scopewalker-mcp]
command = "npx"
args = ["-y", "scopewalker-mcp"]Or use the CLI:
codex mcp add scopewalker-mcp -- npx -y scopewalker-mcpSee Codex MCP documentation for details.
Usage
Once configured, the assistant calls Scopewalker's tools on its own; no special syntax needed. Ask things like:
"Check this repo against our size thresholds before I commit"
"Which functions in
src/have the highest cognitive complexity?""Find undocumented exports in
src/auth""Are there any TODO/FIXME/HACK markers left in this module?"
"Show me functions that take more than 5 parameters"
It picks the right tool and parameters for the request.
This repo enforces shared quality requirements through its skills and agents:
.claude/skills/review-changes/SKILL.md: fails reviews on unresolved size, complexity, smell, prop-drilling, or dead-code findings.claude/agents/standards-enforcer.md: fixes actionable findings and verifies them with rescans and tests.claude/skills/polish/SKILL.md: carries unresolved findings through the pipeline and verifies the final state.claude/agents/docs-reality-sync.md: usesget_code_inventoryandget_functionsto keep docs in sync with code
Development
To run from source instead of npm:
git clone https://github.com/timohaa/scopewalker-mcp.git
cd scopewalker-mcp
npm install
npm run buildThen point your MCP client at the build output, e.g. claude mcp add --scope user scopewalker-mcp -- node /path/to/scopewalker-mcp/dist/index.js.
npm run build # Build the project
npm run check # Version sync + lint + typecheck
npm run test # Run tests
npm run test:coverage # Run tests with coverageSee CONTRIBUTING.md for contribution guidelines and docs/patterns.md for tool registration, error handling, and testing patterns.
Supported Languages
The AST-based tools (everything except get_line_counts) parse:
TypeScript/JavaScript (
.ts,.tsx,.js,.jsx,.mjs,.cjs)Python (
.py)Go (
.go)Rust (
.rs)Java (
.java)C/C++ (
.c,.h,.cpp,.cc,.cxx,.hpp)Ruby (
.rb)
get_line_counts runs through tokei, so it reports on every language tokei recognizes. See docs/tools-overview.md for what is detected per language.
License
MIT
Available Tools
9 toolscheck_thresholdsC
Finds files/functions exceeding size thresholds. Use limit to control output.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Target path | |
| limit | No | Max violations | |
| max_depth | No | Max depth | |
| max_files | No | Max files to scan | |
| extensions | No | Filter by extensions | |
| include_hidden | No | Include hidden | |
| max_file_lines | No | File line threshold | |
| ignore_patterns | No | Exclude patterns | |
| max_function_lines | No | Function line threshold |
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 only states the tool's purpose and does not describe side effects, whether it modifies anything, performance implications, or what 'size thresholds' means by default. For a read-only scanning tool, this is a notable 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 description is concise, using two short sentences with no redundancy. It front-loads the core function and includes a brief usage tip. This is efficient, though it sacrifices depth for brevity.
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?
Despite having 9 parameters and no output schema, the description fails to explain return formats, default thresholds, recursion behavior, or how filters interact. An agent would likely need to experiment or inspect sibling tools to fully understand the output. The lack of behavioral details makes it incomplete for a complex scanning tool.
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 9 parameters. The description adds value by hinting at the 'limit' parameter's role in controlling output, but it does not elaborate on other parameters like max_depth, extensions, or ignore_patterns. The baseline of 3 is appropriate given the schema's thoroughness.
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 ('finds') and resource ('files/functions') with a condition ('exceeding size thresholds'), making the core purpose clear. However, it does not differentiate from sibling tools like get_line_counts or get_code_smells, which might also involve size or threshold analysis. The clarity is adequate but not exemplary.
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 offers minimal usage guidance: 'Use limit to control output.' It does not explain when to use this tool versus alternatives, nor does it mention any prerequisites or exclusions. An agent would need to infer the intended use case from the tool name and schema alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_dead_codeC
Finds declared symbols that nothing references. dead_code is proven unreachable within the scan; unreferenced_exports may be used outside it.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Target path | |
| limit | No | Max results per list | |
| max_depth | No | Max depth | |
| max_files | No | Max files to scan | |
| extensions | No | Filter by extensions | |
| include_hidden | No | Include hidden | |
| ignore_patterns | No | Exclude patterns |
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 a meaningful behavioral nuance—that dead_code is proven unreachable while unreferenced_exports may be used outside the scan—but it does not address other aspects like read-only nature, side effects, performance, or result format. The coverage is minimal.
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 wasted words. The core purpose is front-loaded, and the second sentence clarifies the output categories. Highly efficient and well-structured.
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 and no annotations, the description leaves important context missing: what the results look like (e.g., file paths, symbol names), how limit and depth interact, and whether the scan is read-only. The description is too sparse for a 7-parameter tool without an output schema.
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%, meaning all 7 parameters are documented in the schema. The description adds no parameter-specific details beyond that. Baseline 3 is appropriate because the schema handles parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: finding declared symbols that nothing references. It specifies the resource (declared symbols) and the action (finds unreferenced ones). It also adds nuance by distinguishing dead_code from unreferenced_exports, but it does not explicitly differentiate from sibling tools like get_code_smells or get_code_inventory, so it falls short of a 5.
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?
There is no guidance on when to use this tool versus the alternative code-analysis siblings. The description does not mention any exclusions, alternatives, or context that would help an agent decide between find_dead_code and other similar tools. This is a clear gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_code_inventoryC
Lists classes, functions, methods, and exports. Use extensions to filter.
| Name | Required | Description | Default |
|---|---|---|---|
| grep | No | Filter by keyword | |
| path | Yes | Target path | |
| limit | No | Max results | |
| max_depth | No | Max depth | |
| max_files | No | Max files to scan | |
| extensions | No | Filter by extensions | |
| include_hidden | No | Include hidden | |
| ignore_patterns | No | Exclude patterns | |
| include_private | No | Include private symbols |
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. 'Lists' implies a read-only operation, but the description does not state whether the operation is safe, how it handles large codebases, or what the response structure is. It also does not disclose potential performance implications or the meaning of 'extensions' beyond a vague filter hint.
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 short sentences, front-loading the primary action and then giving a filtering hint. It is concise with no filler. However, it could be slightly more structured to include usage context, but as-is it is efficient.
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 9 parameters, no output schema, and no annotations, the description is insufficiently complete. It does not explain what the output looks like, how results are ordered, or any default behaviors. It also does not provide guidance on when to use this vs. more specific tools like get_functions, leaving an agent to infer the tool's role. This is a significant gap for a complex inventory tool.
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 parameters already have descriptions. The tool description adds only a minor hint about using extensions to filter, which slightly reinforces the extension parameter but does not add substantive meaning beyond the schema. The baseline of 3 is appropriate because the schema handles parameter semantics fully.
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 'lists' and identifies the resource as classes, functions, methods, and exports. It clearly indicates the tool produces an inventory of code symbols. However, it does not explicitly distinguish from siblings like get_functions, which might lead to ambiguity, but the broad scope is reasonably clear.
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 only says 'Use extensions to filter,' which is a usage hint for filtering but not guidance on when to choose this tool over alternatives. It does not mention when not to use it or compare to siblings like get_functions or get_code_smells. No context about the appropriate scenario is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_code_smellsB
Finds TODO/FIXME/HACK/BUG markers and unsafe casts in code.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Target path | |
| limit | No | Max results | |
| types | No | Smell types to detect | |
| max_depth | No | Max depth | |
| max_files | No | Max files to scan | |
| extensions | No | Filter by extensions | |
| include_text | No | Include comment text | |
| include_hidden | No | Include hidden | |
| ignore_patterns | No | Exclude patterns |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It only says the tool 'Finds...' and gives no details on traversal, default scope, whether hidden/ignored files are included, or what the result shape is. 'Finds' weakly implies a read-only scan, but that is not made explicit.
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?
A single compact sentence with no filler; the core artifact types are front-loaded before the location phrase. It earns its place even though more behavioral detail is missing.
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 9-parameter scan tool with no output schema and no annotations, the description is too thin: it omits return format, default limit/depth behavior, and guidance on selecting between this and find_dead_code or get_complexity_metrics. The schema documents parameters but nothing about result semantics.
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 every parameter. The description's mention of TODO/FIXME markers doubles the 'types' enum, adding marginal semantic color but no new syntax, defaults, or constraints.
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+resource ('Finds ... markers and unsafe casts in code') and enumerates concrete artifact types (TODO/FIXME/HACK/BUG, unsafe casts). This clearly differentiates it from sibling analysis tools like get_line_counts, find_dead_code, and get_complexity_metrics.
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?
No when-to-use guidance, no exclusions, and no mention of alternatives among the sibling tools. An agent must infer that this is for code-quality inspection rather than, say, dead code or complexity analysis.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_complexity_metricsC
Returns complexity metrics (nesting, params, cognitive, per-function cyclomatic). Use limit/summary_only to control output.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Target path | |
| limit | No | Max results | |
| max_depth | No | Max depth | |
| max_files | No | Max files to scan | |
| extensions | No | Filter by extensions | |
| summary_only | No | Summary only | |
| include_hidden | No | Include hidden | |
| ignore_patterns | No | Exclude patterns |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It only states that metrics are returned and lists the types, but does not mention read-only nature, directory scanning behavior, potential performance implications, or error handling. The agent gets no sense of side effects or constraints beyond the return value, which is insufficient for a complex analysis tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence that front-loads the primary purpose and lists the metric types. There is no filler or repetition. It could be improved with a short usage note, but as is, it is efficiently written and easy to parse.
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 8 parameters but the description does not explain the return structure, default limits, or how the metrics are aggregated (per-function vs overall). The metric list helps, but without an output schema or explicit behavioral notes, an agent may not know whether results are a list, map, or include counts. The description covers the essentials but leaves gaps for a complex tool.
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 a minor hint about using limit and summary_only to control output, which is slightly redundant with the schema's own descriptions ('Max results', 'Summary only'). It does not provide deeper semantics like default values or interaction between parameters, so it stays at baseline.
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 complexity metrics and enumerates specific metric types (nesting, params, cognitive, per-function cyclomatic), which provides a clear verb+resource. However, it does not explicitly differentiate from sibling tools like get_code_smells or check_thresholds, so it misses the sibling-distinguishing element for a 5.
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 includes a parameter tip ('Use limit/summary_only to control output') but offers no guidance on when to use this tool versus alternatives. There is no statement of conditions for use, no exclusions, and no mention of other tools. This falls short of even clear context, let alone explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_documentation_coverageC
Finds undocumented functions/classes. Use limit/summary_only to control output.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Target path | |
| limit | No | Max results | |
| max_depth | No | Max depth | |
| max_files | No | Max files to scan | |
| min_lines | No | Min function lines | |
| extensions | No | Filter by extensions | |
| summary_only | No | Summary only | |
| include_hidden | No | Include hidden | |
| ignore_patterns | No | Exclude patterns |
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 disclosing behavior. 'Finds' implies a read-only scan, but the description does not explain what counts as undocumented, what the output looks like, whether hidden files are included by default, or any side effects. This is a significant gap for a scanning tool with nine parameters.
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 short sentences with no filler. It front-loads the core purpose and then directs attention to the most relevant output-control parameters, making it efficient and easy to parse.
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 complexity nine parameters, no output schema, and no annotations, the description is too sparse. An agent would not know what the result format is, what the default behavior is, which parameters are optional in practice, or what criteria define 'undocumented'. The description does not compensate for the missing structured metadata.
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 parameters, meeting the baseline of 3. The description adds minimal added value by pointing to limit and summary_only as output controls, but it does not explain their semantics beyond what the schema already provides.
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 ('Finds undocumented functions/classes') and identifies the tool's core purpose, which is clear and distinct from siblings like get_functions or find_dead_code. However, it does not explicitly differentiate itself from sibling tools by naming alternatives or contrasting scopes, so it falls just short of a 5.
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 like get_documentation_coverage, get_code_inventory, or find_dead_code. It only mentions limit/summary_only for controlling output, which is parameter-level advice, not usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_functionsA
Returns function/method info. Use detail=lines for line counts per function.
| Name | Required | Description | Default |
|---|---|---|---|
| grep | No | Filter by keyword | |
| path | Yes | Target path | |
| limit | No | Max results | |
| detail | No | Detail level | |
| sort_by | No | Sort order | |
| max_depth | No | Max depth | |
| max_files | No | Max files to scan | |
| min_lines | No | Min lines (lines mode) | |
| extensions | No | Filter by extensions | |
| include_hidden | No | Include hidden | |
| ignore_patterns | No | Exclude patterns |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It conveys that this is a read-style operation ('Returns') and reveals one mode of behavior (detail=lines). However, it does not disclose scanning behavior, defaults, or what counts vs. lines actually means beyond the brief hint.
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 short sentences, no filler. The main purpose is front-loaded and the parameter tip is direct. 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 an 11-parameter tool with no output schema and no annotations, the description is minimally adequate. The schema documents all parameters, and the description adds one useful detail-mode hint. However, it does not clarify the default behavior, what 'info' includes, or how it relates to sibling tools like get_line_counts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining that detail=lines yields 'line counts per function,' which is more meaningful than the schema's bare 'Detail level.' That semantic clarification justifies above-baseline scoring.
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 clear verb and resource: it 'Returns function/method info,' which is genuinely informative. It does not explicitly differentiate from siblings like get_line_counts or get_code_inventory, so it misses the top score, but the core 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?
'Use detail=lines for line counts per function' gives a concrete usage instruction for a parameter, implying a use case. However, it does not say when to choose this tool over the closely related sibling get_line_counts, nor does it mention any exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_line_countsB
Returns file line counts (code/blank/comment). Use extensions to filter.
| Name | Required | Description | Default |
|---|---|---|---|
| grep | No | Filter by keyword | |
| path | Yes | Target path | |
| limit | No | Max results | |
| sort_by | No | Sort order | |
| extensions | No | Filter by extensions | |
| include_hidden | No | Include hidden | |
| ignore_patterns | No | Exclude patterns |
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. The description only states the return type (line counts) and a filtering hint. It does not disclose whether the operation is read-only, whether it scans recursively, how hidden files are handled by default, or any performance implications. For a tool with 7 parameters, this is a significant 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 description is two short sentences with no wasted words. The core purpose is front-loaded. It is concise, though it could add a bit more behavioral context without becoming bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters, no annotations, and no output schema, the description is too thin. It does not explain return value structure, default behaviors (e.g., whether hidden files are included by default), or how filters interact. An agent would need to inspect the schema carefully and still might not know when to choose this over sibling tools.
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 parameters. The description adds minimal value beyond the schema, only mentioning extensions as a filter. Baseline 3 is appropriate because the schema does the heavy lifting, but the description does not clarify relationships between parameters (e.g., grep vs ignore_patterns) or default 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 states a specific verb and resource: 'Returns file line counts (code/blank/comment).' This clearly identifies what the tool does. It does not explicitly differentiate from siblings, but the resource (line counts) is distinct enough among the listed siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a brief usage hint: 'Use extensions to filter.' This implies the tool is for counting lines and can be filtered, but it does not explicitly state when to use this tool versus alternatives like get_code_inventory or get_complexity_metrics. No exclusions or alternative routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_prop_drillingB
Detects parameter threading (prop drilling) by finding parameter names passed through chains of functions. Use limit/summary_only to control output.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Target path | |
| limit | No | Max results | |
| max_depth | No | Max depth | |
| max_files | No | Max files to scan | |
| extensions | No | Filter by extensions | |
| summary_only | No | Return only summary without per-parameter details (default false) | |
| exclude_common | No | Exclude common parameter names like id, key, className (default false) | |
| include_hidden | No | Include hidden | |
| ignore_patterns | No | Exclude patterns | |
| min_occurrences | No | Minimum function occurrences to flag (default 3) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of explaining behavior. It discloses the core heuristic approach ('finding parameter names passed through chains of functions'), which is useful. However, it does not explain return format, whether results are summary + per-parameter details, false-positive risks, or what 'prop drilling' detection entails in practice.
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 first sentence states purpose and mechanism; the second quickly points to the key output controls. Every sentence earns its place and the core information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 10 parameters and no output schema, and there are no annotations to fill gaps. The description does not explain what the output looks like, how chains are defined, what summary-only mode returns, or which fields like max_depth, max_files, and include_hidden affect results in practice.
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 10 parameters. The description adds only a minor hint by naming limit and summary_only as output controls, but this does not meaningfully improve on the existing parameter 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?
The description uses a specific verb ('Detects') and a clear resource ('parameter threading (prop drilling)'), and it explains the mechanism ('finding parameter names passed through chains of functions'). This distinguishes it from sibling tools like get_line_counts or get_functions, even without naming an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says 'Use limit/summary_only to control output' but gives no guidance on when to use this tool versus alternatives such as get_code_smells or find_dead_code. There is no statement of when-not-to-use, and no explicit differentiation from sibling analysis tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v1.3.0- Changed
check_thresholds10 fields changed- added
Input schema / properties / extensions / items / maxLengthAdded value: +32 - added
Input schema / properties / extensions / items / patternAdded value: +"^\\.?[A-Za-z0-9_+-]+$" - added
Input schema / properties / extensions / maxItemsAdded value: +100 - added
Input schema / properties / ignore_patterns / items / maxLengthAdded value: +512 - added
Input schema / properties / ignore_patterns / maxItemsAdded value: +100 - changed
Input schema / properties / limit / maximumPrevious value: -9007199254740991New value: +5000 - changed
Input schema / properties / max_depth / maximumPrevious value: -9007199254740991New value: +64 - changed
Input schema / properties / max_file_lines / maximumPrevious value: -9007199254740991New value: +10000 - changed
Input schema / properties / max_files / maximumPrevious value: -9007199254740991New value: +10000 - changed
Input schema / properties / max_function_lines / maximumPrevious value: -9007199254740991New value: +10000
- Added
find_dead_code - Changed
get_code_inventory8 fields changed- added
Input schema / properties / extensions / items / maxLengthAdded value: +32 - added
Input schema / properties / extensions / items / patternAdded value: +"^\\.?[A-Za-z0-9_+-]+$" - added
Input schema / properties / extensions / maxItemsAdded value: +100 - added
Input schema / properties / ignore_patterns / items / maxLengthAdded value: +512 - added
Input schema / properties / ignore_patterns / maxItemsAdded value: +100 - changed
Input schema / properties / limit / maximumPrevious value: -9007199254740991New value: +5000 - changed
Input schema / properties / max_depth / maximumPrevious value: -9007199254740991New value: +64 - changed
Input schema / properties / max_files / maximumPrevious value: -9007199254740991New value: +10000
- Changed
get_code_smells8 fields changed- added
Input schema / properties / extensions / items / maxLengthAdded value: +32 - added
Input schema / properties / extensions / items / patternAdded value: +"^\\.?[A-Za-z0-9_+-]+$" - added
Input schema / properties / extensions / maxItemsAdded value: +100 - added
Input schema / properties / ignore_patterns / items / maxLengthAdded value: +512 - added
Input schema / properties / ignore_patterns / maxItemsAdded value: +100 - changed
Input schema / properties / limit / maximumPrevious value: -9007199254740991New value: +5000 - changed
Input schema / properties / max_depth / maximumPrevious value: -9007199254740991New value: +64 - changed
Input schema / properties / max_files / maximumPrevious value: -9007199254740991New value: +10000
- Changed
get_complexity_metrics8 fields changed- added
Input schema / properties / extensions / items / maxLengthAdded value: +32 - added
Input schema / properties / extensions / items / patternAdded value: +"^\\.?[A-Za-z0-9_+-]+$" - added
Input schema / properties / extensions / maxItemsAdded value: +100 - added
Input schema / properties / ignore_patterns / items / maxLengthAdded value: +512 - added
Input schema / properties / ignore_patterns / maxItemsAdded value: +100 - changed
Input schema / properties / limit / maximumPrevious value: -9007199254740991New value: +5000 - changed
Input schema / properties / max_depth / maximumPrevious value: -9007199254740991New value: +64 - changed
Input schema / properties / max_files / maximumPrevious value: -9007199254740991New value: +10000
- Changed
get_documentation_coverage9 fields changed- added
Input schema / properties / extensions / items / maxLengthAdded value: +32 - added
Input schema / properties / extensions / items / patternAdded value: +"^\\.?[A-Za-z0-9_+-]+$" - added
Input schema / properties / extensions / maxItemsAdded value: +100 - added
Input schema / properties / ignore_patterns / items / maxLengthAdded value: +512 - added
Input schema / properties / ignore_patterns / maxItemsAdded value: +100 - changed
Input schema / properties / limit / maximumPrevious value: -9007199254740991New value: +5000 - changed
Input schema / properties / max_depth / maximumPrevious value: -9007199254740991New value: +64 - changed
Input schema / properties / max_files / maximumPrevious value: -9007199254740991New value: +10000 - changed
Input schema / properties / min_lines / maximumPrevious value: -9007199254740991New value: +10000
- Changed
get_functions9 fields changed- added
Input schema / properties / extensions / items / maxLengthAdded value: +32 - added
Input schema / properties / extensions / items / patternAdded value: +"^\\.?[A-Za-z0-9_+-]+$" - added
Input schema / properties / extensions / maxItemsAdded value: +100 - added
Input schema / properties / ignore_patterns / items / maxLengthAdded value: +512 - added
Input schema / properties / ignore_patterns / maxItemsAdded value: +100 - changed
Input schema / properties / limit / maximumPrevious value: -9007199254740991New value: +5000 - changed
Input schema / properties / max_depth / maximumPrevious value: -9007199254740991New value: +64 - changed
Input schema / properties / max_files / maximumPrevious value: -9007199254740991New value: +10000 - changed
Input schema / properties / min_lines / maximumPrevious value: -9007199254740991New value: +10000
- Changed
get_line_counts6 fields changed- added
Input schema / properties / extensions / items / maxLengthAdded value: +32 - added
Input schema / properties / extensions / items / patternAdded value: +"^\\.?[A-Za-z0-9_+-]+$" - added
Input schema / properties / extensions / maxItemsAdded value: +100 - added
Input schema / properties / ignore_patterns / items / maxLengthAdded value: +512 - added
Input schema / properties / ignore_patterns / maxItemsAdded value: +100 - changed
Input schema / properties / limit / maximumPrevious value: -9007199254740991New value: +5000
- Changed
get_prop_drilling9 fields changed- added
Input schema / properties / extensions / items / maxLengthAdded value: +32 - added
Input schema / properties / extensions / items / patternAdded value: +"^\\.?[A-Za-z0-9_+-]+$" - added
Input schema / properties / extensions / maxItemsAdded value: +100 - added
Input schema / properties / ignore_patterns / items / maxLengthAdded value: +512 - added
Input schema / properties / ignore_patterns / maxItemsAdded value: +100 - changed
Input schema / properties / limit / maximumPrevious value: -9007199254740991New value: +5000 - changed
Input schema / properties / max_depth / maximumPrevious value: -9007199254740991New value: +64 - changed
Input schema / properties / max_files / maximumPrevious value: -9007199254740991New value: +10000 - changed
Input schema / properties / min_occurrences / maximumPrevious value: -9007199254740991New value: +1000
3 tool updates
v1.0.5- Changed
get_code_inventory1 field changed- removed
Input schema / properties / group_byRemoved value: -{ - "description": "Grouping method", - "enum": [ - "file", - "type", - "directory" - ], - "type": "string" -}
- Changed
get_complexity_metrics1 field changed- removed
Input schema / properties / metricsRemoved value: -{ - "description": "Metrics to calculate", - "items": { - "enum": [ - "nesting_depth", - "parameters", - "dependencies", - "cognitive" - ], - "type": "string" - }, - "type": "array" -}
- Changed
get_documentation_coverage2 fields changed- removed
Input schema / properties / require_param_docsRemoved value: -{ - "description": "Require param docs", - "type": "boolean" -} - removed
Input schema / properties / require_return_docsRemoved value: -{ - "description": "Require return docs", - "type": "boolean" -}
8 tool updates
v1.0.4- First observed
check_thresholds - First observed
get_code_inventory - First observed
get_code_smells - First observed
get_complexity_metrics - First observed
get_documentation_coverage - First observed
get_functions - First observed
get_line_counts - First observed
get_prop_drilling
TDQS
Scored across 9 tools
Most tools target a distinct static-analysis concern (line counts, complexity, smells, dead code), and the descriptions clarify their purpose with filters and detail options. There is slight overlap between get_functions and get_code_inventory, and between line-count reporting and threshold checking, but an agent can usually disambiguate with context.
Tool names consistently use lowercase snake_case and mostly follow a get_<noun> pattern such as get_line_counts and get_complexity_metrics. The deviations check_thresholds and find_dead_code still use clear verb_noun naming, so the overall pattern remains predictable.
Nine tools is a well-scoped size for a code-analysis MCP server. Each tool covers a distinct inspection area without unnecessary redundancy or bloat.
The tool set covers the major static-analysis workflows: size, structure, functions, complexity, code smells, documentation coverage, prop drilling, and dead code. A minor possible gap is dependency or import-level analysis, but the surface appears largely complete for its stated scope.
Maintenance
Related MCP Connectors
MCP server for building and testing AI agents with multi-model experimentation and insights.
Analytics for MCP servers. Find out which of your tools agents get wrong. MCPulse shows you which tools AI agents retry, which come back empty, and which they never call at all. Two lines inside your own server. It never sees your arguments or your results. getmcpulse.com
An MCP server that gives your AI access to the source code and docs of all public github repos
MCP server for AI agent profiles and smart notes. 60+ coding prompt packs with expert personas.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that analyzes codebases and generates contextual prompts, making it easier for AI assistants to understand and work with code repositories.18MIT

flyto-indexerofficial
AlicenseNot gradedqualityAmaintenanceMCP server that gives AI assistants impact analysis, cross-project reference tracking, and code health scoring.47 PyPI4Apache 2.0- AlicenseCqualityDmaintenanceAn MCP server that analyzes local or remote GitHub repositories, providing intelligent code context and structure to AI coding assistants.1013MIT
- AlicenseAqualityDmaintenanceAn MCP server that provides local code quality analysis for AI coding assistants, supporting file analysis, git diff review, and full project scanning with quality scoring.43MIT