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.
SCOPEWALKER_ALLOWED_ROOTS=/abs/path1,/abs/path2takes precedence when set. Otherwise the server uses the workspace roots your MCP client shares, and falls back to the current working directory and system temp when the client shares none.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_thresholdsSize ThresholdsBRead-onlyIdempotent
Finds files/functions exceeding size thresholds. Use limit to control output.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File or directory to analyze; must be inside the allowed roots | |
| limit | No | Max violations returned per list (default 20) | |
| max_depth | No | Max directory depth to descend (default unlimited) | |
| max_files | No | Stop after scanning this many files (default unlimited) | |
| extensions | No | Only scan these extensions, e.g. [".ts", ".py"] (default all supported) | |
| include_hidden | No | Include dotfiles and dot-directories (default false) | |
| max_file_lines | No | Flag files longer than this many lines (default 300) | |
| ignore_patterns | No | Extra gitignore-style patterns to exclude, relative to path | |
| max_function_lines | No | Flag functions longer than this many lines (default 100) |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| _meta | No | |
| summary | Yes | |
| thresholds | Yes | |
| violations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so safety is well covered. The description adds that it detects violations and that limit controls output size, but does not describe scanning scope defaults or output ordering.
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, purpose front-loaded, with no wasted wording. The limit sentence is brief and does not distract from the main purpose.
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?
An output schema exists, so return values need not be explained, and the schema richly documents all parameters. However, with nine parameters and many sibling tools, the description lacks routing guidance about when to choose this tool over alternatives.
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 every parameter documented including defaults and bounds. The description only restates 'Use limit to control output,' adding no meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: finds files/functions exceeding size thresholds. This is clear enough to distinguish from counting tools like get_line_counts, but it does not explicitly name or contrast any sibling tool.
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 only guidance is 'Use limit to control output,' which is a parameter-level instruction rather than when/when-not to use this tool. There is no mention of alternatives such as get_line_counts or get_complexity_metrics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_dead_codeDead CodeARead-onlyIdempotent
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 | File or directory to analyze; must be inside the allowed roots | |
| limit | No | Max items returned per result list (default 20) | |
| max_depth | No | Max directory depth to descend (default unlimited) | |
| max_files | No | Stop after scanning this many files (default unlimited) | |
| extensions | No | Only scan these extensions, e.g. [".ts", ".py"] (default all supported) | |
| include_hidden | No | Include dotfiles and dot-directories (default false) | |
| ignore_patterns | No | Extra gitignore-style patterns to exclude, relative to path |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| _meta | No | |
| summary | Yes | |
| dead_code | Yes | |
| is_directory | Yes | |
| unreferenced_exports | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the bar is low. The description still adds real value by distinguishing 'dead_code' (proven unreachable in the scan) from 'unreferenced_exports' (may be used outside it), which warns the agent off false positives. It does not mention scan cost or truncation behavior, but that is minor here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the core purpose is front-loaded ahead of the interpretive caveat. Nothing could be trimmed without losing 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?
With an output schema present, the description need not explain return values, and the parameter schema is fully documented. The one gap is that it says nothing about where the tool fits relative to the other code-analysis siblings, which the surrounding toolset makes relevant.
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 defaults, ranges, and examples already present for path, limit, max_depth, extensions, and ignore_patterns. The description adds no parameter-level detail, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Finds declared symbols that nothing references') and quantifies scope with the 'within the scan' qualifier. It is clearly distinct from siblings like get_code_smells or get_code_inventory, though it never names an alternative explicitly.
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 when-to-use or when-not-to-use guidance, and no sibling is named as an alternative. The second sentence explains how to interpret results rather than when to reach for this tool, leaving selection between it and get_code_inventory/get_code_smells to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_code_inventoryCode InventoryCRead-onlyIdempotent
Lists classes, functions, methods, and exports. Use extensions to filter.
| Name | Required | Description | Default |
|---|---|---|---|
| grep | No | Keep files or symbols whose path or name contains this text (case-insensitive) | |
| path | Yes | File or directory to analyze; must be inside the allowed roots | |
| limit | No | Max files returned (default 20) | |
| max_depth | No | Max directory depth to descend (default unlimited) | |
| max_files | No | Stop after scanning this many files (default unlimited) | |
| extensions | No | Only scan these extensions, e.g. [".ts", ".py"] (default all supported) | |
| include_hidden | No | Include dotfiles and dot-directories (default false) | |
| ignore_patterns | No | Extra gitignore-style patterns to exclude, relative to path | |
| include_private | No | Include private and unexported symbols (default false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| _meta | No | |
| summary | Yes | |
| inventory | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered elsewhere. The description adds no behavioral context of its own: no scan/recursion behavior, no note about default limits or hidden-file handling, and no output shape beyond the resource list.
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 with the core purpose front-loaded and no filler. The second sentence is largely duplicative of the extensions schema description, keeping it just below a 5.
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?
An output schema exists, so return values need no explanation, and the schema documents every parameter. However, for a 9-parameter scanning tool sitting among closely related siblings, the description omits the guidance needed to pick it correctly and says nothing about scanning defaults or scope limits.
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% across all nine parameters, including the extensions filter the description mentions, so the schema already does the heavy lifting. The one sentence about extensions is redundant with the structured field rather than additive, which lands this at the baseline 3.
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 gives a concrete verb ('Lists') plus the resource set (classes, functions, methods, exports), so an agent immediately knows what comes back. It does not distinguish itself from the sibling get_functions, which the same agent may also consider, so it stops 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 only guidance is 'Use extensions to filter,' which is a parameter tip rather than a when-to-use rule. Nothing says when this tool is preferable to get_functions or the other inventory-style siblings, and no prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_code_smellsCode SmellsBRead-onlyIdempotent
Finds TODO/FIXME/HACK/BUG markers and unsafe casts in code.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File or directory to analyze; must be inside the allowed roots | |
| limit | No | Max files returned (default 20) | |
| types | No | Smell types to detect (default all) | |
| max_depth | No | Max directory depth to descend (default unlimited) | |
| max_files | No | Stop after scanning this many files (default unlimited) | |
| extensions | No | Only scan these extensions, e.g. [".ts", ".py"] (default all supported) | |
| include_text | No | Include each marker's comment text (default false) | |
| include_hidden | No | Include dotfiles and dot-directories (default false) | |
| ignore_patterns | No | Extra gitignore-style patterns to exclude, relative to path |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| _meta | No | |
| files | Yes | |
| summary | Yes | |
| is_directory | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is clear. The description adds that it finds specific marker types and unsafe casts, which is useful content context. It does not add behavioral details beyond the schema and annotations, such as default hidden-file handling or output shape, but with annotations covering the safety profile a 3 is appropriate.
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 with zero filler. It states the core purpose immediately without unnecessary elaboration.
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 nine parameters, an output schema, and rich annotations, so the description need not explain returns or safety. However, for a scanning tool with several siblings, the description is thin on usage context and does not help an agent choose between this and find_dead_code or get_code_inventory. It is minimally adequate but leaves clear selection gaps.
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 nine parameters are fully documented in the schema. The description mentions only a subset of the detectable types (TODO/FIXME/HACK/BUG and unsafe casts), adding no syntax or format details beyond what the schema provides. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Finds') and names the target artifacts: TODO/FIXME/HACK/BUG markers and unsafe casts. This distinguishes it from many siblings such as get_line_counts or get_complexity_metrics. However, it does not explicitly differentiate from the closest sibling, find_dead_code, leaving a small ambiguity.
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 alternatives. Sibling tools like find_dead_code and get_code_inventory overlap in static analysis scope, but the description offers no conditions, exclusions, or routing advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_complexity_metricsComplexity MetricsBRead-onlyIdempotent
Returns complexity metrics (nesting, params, cognitive, per-function cyclomatic). Use limit/summary_only to control output.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File or directory to analyze; must be inside the allowed roots | |
| limit | No | Max files returned, most complex first (default 20) | |
| max_depth | No | Max directory depth to descend (default unlimited) | |
| max_files | No | Stop after scanning this many files (default unlimited) | |
| extensions | No | Only scan these extensions, e.g. [".ts", ".py"] (default all supported) | |
| summary_only | No | Return summary totals without per-item details (default false) | |
| include_hidden | No | Include dotfiles and dot-directories (default false) | |
| ignore_patterns | No | Extra gitignore-style patterns to exclude, relative to path |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| _meta | No | |
| files | Yes | |
| summary | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered and the description does not contradict it. The description adds useful domain content by naming the metric families computed, but says nothing about scan cost, timeout behavior, or ordering semantics beyond what the schema already documents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core purpose front-loaded and no filler. The second sentence trades some terseness for usefulness, though it would earn its place better if it addressed when to use the tool rather than only how to shrink output.
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 an output schema available and annotations carrying the safety profile, the definition is not required to explain return values, and it correctly lists computed metrics. However, for a tool among nine analysis siblings with no usage routing, the description leaves the agent guessing about when this is the right choice and what the metric values mean 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 every parameter including path, max_depth, max_files, extensions and ignore_patterns is already documented in the schema. The description's mention of limit/summary_only repeats schema information without adding format, default, or interaction details, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Returns') and resource ('complexity metrics') and enumerates the metric kinds (nesting, params, cognitive, per-function cyclomatic), which meaningfully separates it from siblings like get_line_counts and get_code_smells. It stops short of naming a sibling explicitly, so differentiation is inferential rather than stated.
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 only guidance is 'Use limit/summary_only to control output,' which is parameter advice, not when-to-use guidance. There is no indication of when to reach for this tool over check_thresholds or get_code_smells, nor any stated prerequisites despite the path being constrained to allowed roots.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_documentation_coverageDocumentation CoverageCRead-onlyIdempotent
Finds undocumented functions/classes. Use limit/summary_only to control output.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File or directory to analyze; must be inside the allowed roots | |
| limit | No | Max undocumented items returned (default 20) | |
| max_depth | No | Max directory depth to descend (default unlimited) | |
| max_files | No | Stop after scanning this many files (default unlimited) | |
| min_lines | No | Ignore functions shorter than this many lines (default 1) | |
| extensions | No | Only scan these extensions, e.g. [".ts", ".py"] (default all supported) | |
| summary_only | No | Return summary totals without per-item details (default false) | |
| include_hidden | No | Include dotfiles and dot-directories (default false) | |
| ignore_patterns | No | Extra gitignore-style patterns to exclude, relative to path |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| _meta | No | |
| by_file | Yes | |
| summary | Yes | |
| coverage | Yes | |
| truncated | No | |
| undocumented_items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds only a vague "control output" hint and never discloses that scanning is bounded by allowed roots or that unlimited max_files/max_depth defaults could be expensive. Beyond the annotations it contributes very little behavioral context.
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 with the purpose front-loaded and no filler. It is efficiently sized, though the second sentence is arguably redundant with the schema and the terseness leaves gaps.
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?
An output schema exists, so return-value explanation is not required, and the 100% schema coverage plus annotations cover most mechanics. However, for a 9-parameter analysis tool with many siblings, the absence of any usage or scoping guidance leaves the description only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including limit and summary_only is already documented with types, defaults and bounds. The description's mention of limit/summary_only merely restates schema content and adds no syntax or format detail. Baseline 3 applies when the schema carries the full load.
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: "Finds undocumented functions/classes." This clearly separates it from data-gathering siblings like get_functions or get_line_counts, though it does not explicitly name an alternative tool. The purpose is unambiguous without opening the schema.
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 when-to-use/when-not guidance and no mention of alternatives or prerequisites despite eight sibling tools. "Use limit/summary_only to control output" is parameter advice, not usage context, so an agent gets no help deciding when this tool beats get_code_smells or get_code_inventory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_functionsFunctionsCRead-onlyIdempotent
Returns function/method info. Use detail=lines for line counts per function.
| Name | Required | Description | Default |
|---|---|---|---|
| grep | No | Keep files or functions whose path or name contains this text (case-insensitive) | |
| path | Yes | File or directory to analyze; must be inside the allowed roots | |
| limit | No | Max files returned (default 20) | |
| detail | No | counts: functions per file; lines: lines per function (default counts) | |
| sort_by | No | Sort order (default count_desc for counts, lines_desc for lines) | |
| max_depth | No | Max directory depth to descend (default unlimited) | |
| max_files | No | Stop after scanning this many files (default unlimited) | |
| min_lines | No | Lines mode only: skip functions shorter than this many lines | |
| extensions | No | Only scan these extensions, e.g. [".ts", ".py"] (default all supported) | |
| include_hidden | No | Include dotfiles and dot-directories (default false) | |
| ignore_patterns | No | Extra gitignore-style patterns to exclude, relative to path |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| _meta | No | |
| files | Yes | |
| summary | Yes | |
| is_directory | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds no behavioral context beyond that — nothing about scan cost, depth/file traversal limits, or what 'info' is produced — so it does little work the agent couldn't infer.
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 padding, and the core capability leads. It is efficient, though the terseness edges toward under-specification rather than disciplined 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?
An output schema exists and the input schema is fully documented, so the agent can call it, but for an 11-parameter analyzer the description omits operating scope (allowed roots), result granularity, and any relation to sibling analysis tools. Adequate but with clear gaps.
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 11 parameters, both enums, and defaults are already documented in the schema. The description's only addition is restating the detail=lines mode, which the schema already explains; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names the resource (functions/methods) but the verb is the generic 'Returns ... info', which doesn't say what kind of info or what analysis is performed. Nothing in the text distinguishes it from siblings like get_line_counts, get_complexity_metrics, or get_code_inventory, which are the closest overlaps.
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 only guidance is a parameter hint ('Use detail=lines for line counts per function'), which points at behavior rather than when to pick this tool over get_line_counts or get_complexity_metrics. There is no stated context, no exclusions, and no alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_line_countsLine CountsBRead-onlyIdempotent
Returns file line counts (code/blank/comment). Use extensions to filter.
| Name | Required | Description | Default |
|---|---|---|---|
| grep | No | Keep files whose path contains this text (case-insensitive) | |
| path | Yes | File or directory to analyze; must be inside the allowed roots | |
| limit | No | Max files returned (default 20) | |
| sort_by | No | Sort by total lines or path (default lines_desc) | |
| extensions | No | Only scan these extensions, e.g. [".ts", ".py"] (default all supported) | |
| include_hidden | No | Include dotfiles and dot-directories (default false) | |
| ignore_patterns | No | Extra gitignore-style patterns to exclude, relative to path |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| _meta | No | |
| files | Yes | |
| summary | Yes | |
| is_directory | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and a closed-world scope, so the safety profile is covered. The description adds the count categories and the extension-filtering hint, but says nothing about the allowed-roots constraint, sort/default behavior, or scan cost on large trees.
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 with no filler, front-loading the return semantics before the filtering hint. Slightly under-specified rather than padded, which costs little here.
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?
An output schema exists, so return-value details are rightly omitted, and annotations cover safety. However, for a 7-parameter tool with path scoping, ignore patterns, and limits, the description leaves the agent to infer filtering and scope behavior entirely from the 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%, so all seven parameters are already documented in the schema. The description only echoes the extensions filter and adds no format or interaction details beyond it, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Returns file line counts') and adds the useful breakdown of code/blank/comment. It is distinct enough from metric-oriented siblings like get_complexity_metrics, but does not explicitly name what it is not or how it differs from them.
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 only guidance is 'Use extensions to filter,' which points at a parameter rather than saying when this tool is the right choice. There is no when-to-use, when-not-to-use, or reference to alternatives among the many sibling analysis tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_prop_drillingProp DrillingBRead-onlyIdempotent
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 | File or directory to analyze; must be inside the allowed roots | |
| limit | No | Max parameters returned (default 20) | |
| max_depth | No | Max directory depth to descend (default unlimited) | |
| max_files | No | Stop after scanning this many files (default unlimited) | |
| extensions | No | Only scan these extensions, e.g. [".ts", ".py"] (default all supported) | |
| summary_only | No | Return summary totals without per-item details (default false) | |
| exclude_common | No | Exclude common parameter names like id, key, className (default false) | |
| include_hidden | No | Include dotfiles and dot-directories (default false) | |
| ignore_patterns | No | Extra gitignore-style patterns to exclude, relative to path | |
| min_occurrences | No | Minimum function occurrences to flag (default 3) |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| _meta | No | |
| summary | Yes | |
| is_directory | Yes | |
| threaded_parameters | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered and the description need not restate it. It adds the analysis semantics (chains of functions, parameter names) but nothing about scope of scanning, cost, or what the findings look like. Adequate but thin for a static-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?
Two short sentences, front-loaded with the definition and followed by a brief output-control hint. Nothing is padded, though the second sentence largely echoes schema defaults rather than earning much new 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?
Safety is covered by annotations, return shape by the output schema, and all 10 parameters by a fully documented schema, so the structural gaps are small. The remaining hole is usage framing: an agent learns what the tool detects but not when to reach for it over the other eight code-analysis siblings.
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%, covering path, limit, max_depth, max_files, extensions, summary_only, exclude_common, include_hidden, ignore_patterns, and min_occurrences with defaults and bounds. The description mentions only limit and summary_only and adds no syntax, default, or interaction detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific detection target (parameter threading / prop drilling) and the mechanism (parameter names passed through chains of functions), which separates it from siblings like get_code_smells or get_complexity_metrics. It stops short of naming any sibling explicitly, so differentiation is conceptual rather than direct.
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 only guidance is 'Use limit/summary_only to control output', which is a parameter hint rather than a when-to-use rule. It never says when this analysis is preferable to get_code_smells or get_functions, nor any prerequisite or exclusion conditions.
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.4.0- Changed
check_thresholds11 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / extensions / descriptionPrevious value: -"Filter by extensions"New value: +"Only scan these extensions, e.g. [\".ts\", \".py\"] (default all supported)" - changed
Input schema / properties / ignore_patterns / descriptionPrevious value: -"Exclude patterns"New value: +"Extra gitignore-style patterns to exclude, relative to path" - changed
Input schema / properties / include_hidden / descriptionPrevious value: -"Include hidden"New value: +"Include dotfiles and dot-directories (default false)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max violations"New value: +"Max violations returned per list (default 20)" - changed
Input schema / properties / max_depth / descriptionPrevious value: -"Max depth"New value: +"Max directory depth to descend (default unlimited)" - changed
Input schema / properties / max_file_lines / descriptionPrevious value: -"File line threshold"New value: +"Flag files longer than this many lines (default 300)" - changed
Input schema / properties / max_files / descriptionPrevious value: -"Max files to scan"New value: +"Stop after scanning this many files (default unlimited)" - changed
Input schema / properties / max_function_lines / descriptionPrevious value: -"Function line threshold"New value: +"Flag functions longer than this many lines (default 100)" - changed
Input schema / properties / path / descriptionPrevious value: -"Target path"New value: +"File or directory to analyze; must be inside the allowed roots" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "_meta": { + "additionalProperties": false, + "properties": { + "funding": { + "type": "string" + }, + "item_count": { + "type": "number" + }, + "response_size_chars": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "item_count", + "response_size_chars", + "funding" + ], + "type": "object" + }, + "path": { + "type": "string" + }, + "summary": { + "additionalProperties": false, + "properties": { + "file_violations": { + "type": "number" + }, + "files_checked": { + "type": "number" + }, + "files_skipped": { + "type": "number" + }, + "function_violations": { + "type": "number" + }, + "functions_checked": { + "type": "number" + }, + "scan_complete": { + "type": "boolean" + } + }, + "required": [ + "files_checked", + "functions_checked", + "file_violations", + "function_violations", + "files_skipped", + "scan_complete" + ], + "type": "object" + }, + "thresholds": { + "additionalProperties": false, + "properties": { + "max_file_lines": { + "type": "number" + }, + "max_function_lines": { + "type": "number" + } + }, + "required": [ + "max_file_lines", + "max_function_lines" + ], + "type": "object" + }, + "violations": { + "additionalProperties": false, + "properties": { + "oversized_files": { + "items": { + "additionalProperties": false, + "properties": { + "exceeds_by": { + "type": "number" + }, + "lines": { + "type": "number" + }, + "path": { + "type": "string" + } + }, + "required": [ + "path", + "lines", + "exceeds_by" + ], + "type": "object" + }, + "type": "array" + }, + "oversized_functions": { + "items": { + "additionalProperties": false, + "properties": { + "exceeds_by": { + "type": "number" + }, + "function_name": { + "type": "string" + }, + "lines": { + "type": "number" + }, + "path": { + "type": "string" + }, + "start_line": { + "type": "number" + } + }, + "required": [ + "path", + "function_name", + "lines", + "exceeds_by", + "start_line" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "oversized_files", + "oversized_functions" + ], + "type": "object" + } + }, + "required": [ + "path", + "thresholds", + "violations", + "summary" + ], + "type": "object" +}
- Changed
find_dead_code9 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / extensions / descriptionPrevious value: -"Filter by extensions"New value: +"Only scan these extensions, e.g. [\".ts\", \".py\"] (default all supported)" - changed
Input schema / properties / ignore_patterns / descriptionPrevious value: -"Exclude patterns"New value: +"Extra gitignore-style patterns to exclude, relative to path" - changed
Input schema / properties / include_hidden / descriptionPrevious value: -"Include hidden"New value: +"Include dotfiles and dot-directories (default false)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results per list"New value: +"Max items returned per result list (default 20)" - changed
Input schema / properties / max_depth / descriptionPrevious value: -"Max depth"New value: +"Max directory depth to descend (default unlimited)" - changed
Input schema / properties / max_files / descriptionPrevious value: -"Max files to scan"New value: +"Stop after scanning this many files (default unlimited)" - changed
Input schema / properties / path / descriptionPrevious value: -"Target path"New value: +"File or directory to analyze; must be inside the allowed roots" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "_meta": { + "additionalProperties": false, + "properties": { + "funding": { + "type": "string" + }, + "item_count": { + "type": "number" + }, + "response_size_chars": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "item_count", + "response_size_chars", + "funding" + ], + "type": "object" + }, + "dead_code": { + "items": { + "additionalProperties": false, + "properties": { + "file": { + "type": "string" + }, + "line": { + "type": "number" + }, + "name": { + "type": "string" + }, + "type": { + "anyOf": [ + { + "enum": [ + "class", + "function", + "interface", + "enum", + "constant" + ], + "type": "string" + }, + { + "const": "method", + "type": "string" + } + ] + } + }, + "required": [ + "file", + "name", + "type", + "line" + ], + "type": "object" + }, + "type": "array" + }, + "is_directory": { + "type": "boolean" + }, + "path": { + "type": "string" + }, + "summary": { + "additionalProperties": false, + "properties": { + "dead_code_found": { + "type": "number" + }, + "files_scanned": { + "type": "number" + }, + "files_skipped": { + "type": "number" + }, + "scan_complete": { + "type": "boolean" + }, + "symbols_checked": { + "type": "number" + }, + "unreferenced_exports_found": { + "type": "number" + } + }, + "required": [ + "files_scanned", + "files_skipped", + "scan_complete", + "symbols_checked", + "dead_code_found", + "unreferenced_exports_found" + ], + "type": "object" + }, + "unreferenced_exports": { + "items": { + "additionalProperties": false, + "properties": { + "file": { + "type": "string" + }, + "line": { + "type": "number" + }, + "name": { + "type": "string" + }, + "type": { + "anyOf": [ + { + "enum": [ + "class", + "function", + "interface", + "enum", + "constant" + ], + "type": "string" + }, + { + "const": "method", + "type": "string" + } + ] + } + }, + "required": [ + "file", + "name", + "type", + "line" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "path", + "is_directory", + "dead_code", + "unreferenced_exports", + "summary" + ], + "type": "object" +}
- Changed
get_code_inventory11 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / extensions / descriptionPrevious value: -"Filter by extensions"New value: +"Only scan these extensions, e.g. [\".ts\", \".py\"] (default all supported)" - changed
Input schema / properties / grep / descriptionPrevious value: -"Filter by keyword"New value: +"Keep files or symbols whose path or name contains this text (case-insensitive)" - changed
Input schema / properties / ignore_patterns / descriptionPrevious value: -"Exclude patterns"New value: +"Extra gitignore-style patterns to exclude, relative to path" - changed
Input schema / properties / include_hidden / descriptionPrevious value: -"Include hidden"New value: +"Include dotfiles and dot-directories (default false)" - changed
Input schema / properties / include_private / descriptionPrevious value: -"Include private symbols"New value: +"Include private and unexported symbols (default false)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results"New value: +"Max files returned (default 20)" - changed
Input schema / properties / max_depth / descriptionPrevious value: -"Max depth"New value: +"Max directory depth to descend (default unlimited)" - changed
Input schema / properties / max_files / descriptionPrevious value: -"Max files to scan"New value: +"Stop after scanning this many files (default unlimited)" - changed
Input schema / properties / path / descriptionPrevious value: -"Target path"New value: +"File or directory to analyze; must be inside the allowed roots" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "_meta": { + "additionalProperties": false, + "properties": { + "funding": { + "type": "string" + }, + "item_count": { + "type": "number" + }, + "response_size_chars": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "item_count", + "response_size_chars", + "funding" + ], + "type": "object" + }, + "inventory": { + "items": { + "additionalProperties": false, + "properties": { + "file": { + "type": "string" + }, + "items": { + "items": { + "additionalProperties": false, + "properties": { + "exported": { + "type": "boolean" + }, + "line": { + "type": "number" + }, + "methods": { + "items": { + "additionalProperties": false, + "properties": { + "line": { + "type": "number" + }, + "name": { + "type": "string" + }, + "visibility": { + "enum": [ + "public", + "private", + "protected" + ], + "type": "string" + } + }, + "required": [ + "name", + "line", + "visibility" + ], + "type": "object" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "type": { + "enum": [ + "class", + "function", + "interface", + "enum", + "constant" + ], + "type": "string" + } + }, + "required": [ + "name", + "type", + "line", + "exported" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "file", + "items" + ], + "type": "object" + }, + "type": "array" + }, + "path": { + "type": "string" + }, + "summary": { + "additionalProperties": false, + "properties": { + "exported_symbols": { + "type": "number" + }, + "total_classes": { + "type": "number" + }, + "total_files": { + "type": "number" + }, + "total_functions": { + "type": "number" + }, + "total_methods": { + "type": "number" + } + }, + "required": [ + "total_files", + "total_classes", + "total_functions", + "total_methods", + "exported_symbols" + ], + "type": "object" + } + }, + "required": [ + "path", + "inventory", + "summary" + ], + "type": "object" +}
- Changed
get_code_smells11 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / extensions / descriptionPrevious value: -"Filter by extensions"New value: +"Only scan these extensions, e.g. [\".ts\", \".py\"] (default all supported)" - changed
Input schema / properties / ignore_patterns / descriptionPrevious value: -"Exclude patterns"New value: +"Extra gitignore-style patterns to exclude, relative to path" - changed
Input schema / properties / include_hidden / descriptionPrevious value: -"Include hidden"New value: +"Include dotfiles and dot-directories (default false)" - changed
Input schema / properties / include_text / descriptionPrevious value: -"Include comment text"New value: +"Include each marker's comment text (default false)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results"New value: +"Max files returned (default 20)" - changed
Input schema / properties / max_depth / descriptionPrevious value: -"Max depth"New value: +"Max directory depth to descend (default unlimited)" - changed
Input schema / properties / max_files / descriptionPrevious value: -"Max files to scan"New value: +"Stop after scanning this many files (default unlimited)" - changed
Input schema / properties / path / descriptionPrevious value: -"Target path"New value: +"File or directory to analyze; must be inside the allowed roots" - changed
Input schema / properties / types / descriptionPrevious value: -"Smell types to detect"New value: +"Smell types to detect (default all)" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "_meta": { + "additionalProperties": false, + "properties": { + "funding": { + "type": "string" + }, + "item_count": { + "type": "number" + }, + "response_size_chars": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "item_count", + "response_size_chars", + "funding" + ], + "type": "object" + }, + "files": { + "items": { + "additionalProperties": false, + "properties": { + "path": { + "type": "string" + }, + "smells": { + "items": { + "additionalProperties": false, + "properties": { + "line": { + "type": "number" + }, + "path": { + "type": "string" + }, + "text": { + "type": "string" + }, + "type": { + "enum": [ + "todo", + "fixme", + "hack", + "xxx", + "bug", + "unused", + "deprecated", + "unsafe_cast" + ], + "type": "string" + } + }, + "required": [ + "path", + "line", + "type", + "text" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "path", + "smells" + ], + "type": "object" + }, + "type": "array" + }, + "is_directory": { + "type": "boolean" + }, + "path": { + "type": "string" + }, + "summary": { + "additionalProperties": false, + "properties": { + "by_type": { + "additionalProperties": { + "type": "number" + }, + "propertyNames": { + "enum": [ + "todo", + "fixme", + "hack", + "xxx", + "bug", + "unused", + "deprecated", + "unsafe_cast" + ], + "type": "string" + }, + "required": [ + "todo", + "fixme", + "hack", + "xxx", + "bug", + "unused", + "deprecated", + "unsafe_cast" + ], + "type": "object" + }, + "files_with_smells": { + "type": "number" + }, + "total_files_scanned": { + "type": "number" + }, + "total_smells": { + "type": "number" + } + }, + "required": [ + "total_files_scanned", + "files_with_smells", + "total_smells", + "by_type" + ], + "type": "object" + } + }, + "required": [ + "path", + "is_directory", + "files", + "summary" + ], + "type": "object" +}
- Changed
get_complexity_metrics10 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / extensions / descriptionPrevious value: -"Filter by extensions"New value: +"Only scan these extensions, e.g. [\".ts\", \".py\"] (default all supported)" - changed
Input schema / properties / ignore_patterns / descriptionPrevious value: -"Exclude patterns"New value: +"Extra gitignore-style patterns to exclude, relative to path" - changed
Input schema / properties / include_hidden / descriptionPrevious value: -"Include hidden"New value: +"Include dotfiles and dot-directories (default false)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results"New value: +"Max files returned, most complex first (default 20)" - changed
Input schema / properties / max_depth / descriptionPrevious value: -"Max depth"New value: +"Max directory depth to descend (default unlimited)" - changed
Input schema / properties / max_files / descriptionPrevious value: -"Max files to scan"New value: +"Stop after scanning this many files (default unlimited)" - changed
Input schema / properties / path / descriptionPrevious value: -"Target path"New value: +"File or directory to analyze; must be inside the allowed roots" - changed
Input schema / properties / summary_only / descriptionPrevious value: -"Summary only"New value: +"Return summary totals without per-item details (default false)" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "_meta": { + "additionalProperties": false, + "properties": { + "funding": { + "type": "string" + }, + "item_count": { + "type": "number" + }, + "response_size_chars": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "item_count", + "response_size_chars", + "funding" + ], + "type": "object" + }, + "files": { + "items": { + "additionalProperties": false, + "properties": { + "functions": { + "items": { + "additionalProperties": false, + "properties": { + "cognitive_complexity": { + "type": "number" + }, + "cyclomatic_complexity": { + "type": "number" + }, + "line": { + "type": "number" + }, + "name": { + "type": "string" + }, + "nesting_depth": { + "type": "number" + }, + "severity": { + "enum": [ + "high", + "extreme" + ], + "type": "string" + } + }, + "required": [ + "name", + "line", + "cyclomatic_complexity", + "cognitive_complexity", + "nesting_depth", + "severity" + ], + "type": "object" + }, + "type": "array" + }, + "hotspots": { + "items": { + "additionalProperties": false, + "properties": { + "function": { + "type": "string" + }, + "issue": { + "type": "string" + }, + "line": { + "type": "number" + }, + "recommendation": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "function", + "line", + "issue", + "value", + "recommendation" + ], + "type": "object" + }, + "type": "array" + }, + "metrics": { + "additionalProperties": false, + "properties": { + "avg_cyclomatic_complexity": { + "type": "number" + }, + "avg_nesting_depth": { + "type": "number" + }, + "avg_parameters": { + "type": "number" + }, + "cognitive_complexity": { + "type": "number" + }, + "dependency_count": { + "type": "number" + }, + "function_count": { + "type": "number" + }, + "max_cognitive_complexity": { + "type": "number" + }, + "max_cyclomatic_complexity": { + "type": "number" + }, + "max_nesting_depth": { + "type": "number" + }, + "max_parameters": { + "type": "number" + } + }, + "required": [ + "max_nesting_depth", + "avg_nesting_depth", + "max_parameters", + "avg_parameters", + "dependency_count", + "cognitive_complexity", + "function_count", + "max_cyclomatic_complexity", + "avg_cyclomatic_complexity", + "max_cognitive_complexity" + ], + "type": "object" + }, + "path": { + "type": "string" + } + }, + "required": [ + "path", + "metrics", + "functions", + "hotspots" + ], + "type": "object" + }, + "type": "array" + }, + "path": { + "type": "string" + }, + "summary": { + "additionalProperties": false, + "properties": { + "files_analyzed": { + "type": "number" + }, + "high_complexity_files": { + "type": "number" + }, + "high_complexity_functions": { + "type": "number" + }, + "most_complex_file": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "cognitive_complexity": { + "type": "number" + }, + "path": { + "type": "string" + } + }, + "required": [ + "path", + "cognitive_complexity" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "most_complex_function": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "cyclomatic_complexity": { + "type": "number" + }, + "function": { + "type": "string" + }, + "line": { + "type": "number" + }, + "path": { + "type": "string" + } + }, + "required": [ + "path", + "function", + "line", + "cyclomatic_complexity" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "total_hotspots": { + "type": "number" + } + }, + "required": [ + "files_analyzed", + "high_complexity_files", + "high_complexity_functions", + "total_hotspots", + "most_complex_file", + "most_complex_function" + ], + "type": "object" + } + }, + "required": [ + "path", + "files", + "summary" + ], + "type": "object" +}
- Changed
get_documentation_coverage11 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / extensions / descriptionPrevious value: -"Filter by extensions"New value: +"Only scan these extensions, e.g. [\".ts\", \".py\"] (default all supported)" - changed
Input schema / properties / ignore_patterns / descriptionPrevious value: -"Exclude patterns"New value: +"Extra gitignore-style patterns to exclude, relative to path" - changed
Input schema / properties / include_hidden / descriptionPrevious value: -"Include hidden"New value: +"Include dotfiles and dot-directories (default false)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results"New value: +"Max undocumented items returned (default 20)" - changed
Input schema / properties / max_depth / descriptionPrevious value: -"Max depth"New value: +"Max directory depth to descend (default unlimited)" - changed
Input schema / properties / max_files / descriptionPrevious value: -"Max files to scan"New value: +"Stop after scanning this many files (default unlimited)" - changed
Input schema / properties / min_lines / descriptionPrevious value: -"Min function lines"New value: +"Ignore functions shorter than this many lines (default 1)" - changed
Input schema / properties / path / descriptionPrevious value: -"Target path"New value: +"File or directory to analyze; must be inside the allowed roots" - changed
Input schema / properties / summary_only / descriptionPrevious value: -"Summary only"New value: +"Return summary totals without per-item details (default false)" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "_meta": { + "additionalProperties": false, + "properties": { + "funding": { + "type": "string" + }, + "item_count": { + "type": "number" + }, + "response_size_chars": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "item_count", + "response_size_chars", + "funding" + ], + "type": "object" + }, + "by_file": { + "items": { + "additionalProperties": false, + "properties": { + "documented": { + "type": "number" + }, + "path": { + "type": "string" + }, + "percentage": { + "type": "number" + }, + "undocumented": { + "type": "number" + } + }, + "required": [ + "path", + "documented", + "undocumented", + "percentage" + ], + "type": "object" + }, + "type": "array" + }, + "coverage": { + "additionalProperties": false, + "properties": { + "documented": { + "type": "number" + }, + "percentage": { + "type": "number" + }, + "undocumented": { + "type": "number" + } + }, + "required": [ + "documented", + "undocumented", + "percentage" + ], + "type": "object" + }, + "path": { + "type": "string" + }, + "summary": { + "additionalProperties": false, + "properties": { + "files_analyzed": { + "type": "number" + }, + "files_skipped": { + "type": "number" + }, + "fully_documented_files": { + "type": "number" + }, + "scan_complete": { + "type": "boolean" + }, + "total_symbols": { + "type": "number" + }, + "zero_documentation_files": { + "type": "number" + } + }, + "required": [ + "files_analyzed", + "files_skipped", + "scan_complete", + "total_symbols", + "fully_documented_files", + "zero_documentation_files" + ], + "type": "object" + }, + "truncated": { + "additionalProperties": false, + "properties": { + "items": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "items", + "total" + ], + "type": "object" + }, + "undocumented_items": { + "items": { + "additionalProperties": false, + "properties": { + "line": { + "type": "number" + }, + "lines": { + "type": "number" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "type": { + "enum": [ + "function", + "class", + "method" + ], + "type": "string" + } + }, + "required": [ + "path", + "name", + "type", + "line" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "path", + "coverage", + "undocumented_items", + "by_file", + "summary" + ], + "type": "object" +}
- Changed
get_functions13 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / detail / descriptionPrevious value: -"Detail level"New value: +"counts: functions per file; lines: lines per function (default counts)" - changed
Input schema / properties / extensions / descriptionPrevious value: -"Filter by extensions"New value: +"Only scan these extensions, e.g. [\".ts\", \".py\"] (default all supported)" - changed
Input schema / properties / grep / descriptionPrevious value: -"Filter by keyword"New value: +"Keep files or functions whose path or name contains this text (case-insensitive)" - changed
Input schema / properties / ignore_patterns / descriptionPrevious value: -"Exclude patterns"New value: +"Extra gitignore-style patterns to exclude, relative to path" - changed
Input schema / properties / include_hidden / descriptionPrevious value: -"Include hidden"New value: +"Include dotfiles and dot-directories (default false)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results"New value: +"Max files returned (default 20)" - changed
Input schema / properties / max_depth / descriptionPrevious value: -"Max depth"New value: +"Max directory depth to descend (default unlimited)" - changed
Input schema / properties / max_files / descriptionPrevious value: -"Max files to scan"New value: +"Stop after scanning this many files (default unlimited)" - changed
Input schema / properties / min_lines / descriptionPrevious value: -"Min lines (lines mode)"New value: +"Lines mode only: skip functions shorter than this many lines" - changed
Input schema / properties / path / descriptionPrevious value: -"Target path"New value: +"File or directory to analyze; must be inside the allowed roots" - changed
Input schema / properties / sort_by / descriptionPrevious value: -"Sort order"New value: +"Sort order (default count_desc for counts, lines_desc for lines)" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "_meta": { + "additionalProperties": false, + "properties": { + "funding": { + "type": "string" + }, + "item_count": { + "type": "number" + }, + "response_size_chars": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "item_count", + "response_size_chars", + "funding" + ], + "type": "object" + }, + "files": { + "items": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "function_count": { + "type": "number" + }, + "functions": { + "items": { + "additionalProperties": false, + "properties": { + "line": { + "type": "number" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "line" + ], + "type": "object" + }, + "type": "array" + }, + "language": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "path", + "language", + "function_count", + "functions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "functions": { + "items": { + "additionalProperties": false, + "properties": { + "end_line": { + "type": "number" + }, + "lines": { + "additionalProperties": false, + "properties": { + "blank": { + "type": "number" + }, + "code": { + "type": "number" + }, + "comment": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "code", + "blank", + "comment" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "start_line": { + "type": "number" + } + }, + "required": [ + "name", + "start_line", + "end_line", + "lines" + ], + "type": "object" + }, + "type": "array" + }, + "language": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "path", + "language", + "functions" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "is_directory": { + "type": "boolean" + }, + "path": { + "type": "string" + }, + "summary": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "files_with_no_functions": { + "type": "number" + }, + "total_files_analyzed": { + "type": "number" + }, + "total_functions": { + "type": "number" + } + }, + "required": [ + "total_files_analyzed", + "total_functions", + "files_with_no_functions" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "average_lines_per_function": { + "type": "number" + }, + "functions_over_50_lines": { + "type": "number" + }, + "largest_function": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "file": { + "type": "string" + }, + "lines": { + "type": "number" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "file", + "lines" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "total_functions": { + "type": "number" + } + }, + "required": [ + "total_functions", + "average_lines_per_function", + "largest_function", + "functions_over_50_lines" + ], + "type": "object" + } + ] + } + }, + "required": [ + "path", + "is_directory", + "files", + "summary" + ], + "type": "object" +}
- Changed
get_line_counts9 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / extensions / descriptionPrevious value: -"Filter by extensions"New value: +"Only scan these extensions, e.g. [\".ts\", \".py\"] (default all supported)" - changed
Input schema / properties / grep / descriptionPrevious value: -"Filter by keyword"New value: +"Keep files whose path contains this text (case-insensitive)" - changed
Input schema / properties / ignore_patterns / descriptionPrevious value: -"Exclude patterns"New value: +"Extra gitignore-style patterns to exclude, relative to path" - changed
Input schema / properties / include_hidden / descriptionPrevious value: -"Include hidden"New value: +"Include dotfiles and dot-directories (default false)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results"New value: +"Max files returned (default 20)" - changed
Input schema / properties / path / descriptionPrevious value: -"Target path"New value: +"File or directory to analyze; must be inside the allowed roots" - changed
Input schema / properties / sort_by / descriptionPrevious value: -"Sort order"New value: +"Sort by total lines or path (default lines_desc)" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "_meta": { + "additionalProperties": false, + "properties": { + "funding": { + "type": "string" + }, + "item_count": { + "type": "number" + }, + "response_size_chars": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "item_count", + "response_size_chars", + "funding" + ], + "type": "object" + }, + "files": { + "items": { + "additionalProperties": false, + "properties": { + "lines": { + "additionalProperties": false, + "properties": { + "blank": { + "type": "number" + }, + "code": { + "type": "number" + }, + "comment": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "code", + "blank", + "comment" + ], + "type": "object" + }, + "path": { + "type": "string" + } + }, + "required": [ + "path", + "lines" + ], + "type": "object" + }, + "type": "array" + }, + "is_directory": { + "type": "boolean" + }, + "path": { + "type": "string" + }, + "summary": { + "additionalProperties": false, + "properties": { + "total_blank_lines": { + "type": "number" + }, + "total_code_lines": { + "type": "number" + }, + "total_comment_lines": { + "type": "number" + }, + "total_files": { + "type": "number" + }, + "total_lines": { + "type": "number" + } + }, + "required": [ + "total_files", + "total_lines", + "total_code_lines", + "total_blank_lines", + "total_comment_lines" + ], + "type": "object" + } + }, + "required": [ + "path", + "is_directory", + "files", + "summary" + ], + "type": "object" +}
- Changed
get_prop_drilling10 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / extensions / descriptionPrevious value: -"Filter by extensions"New value: +"Only scan these extensions, e.g. [\".ts\", \".py\"] (default all supported)" - changed
Input schema / properties / ignore_patterns / descriptionPrevious value: -"Exclude patterns"New value: +"Extra gitignore-style patterns to exclude, relative to path" - changed
Input schema / properties / include_hidden / descriptionPrevious value: -"Include hidden"New value: +"Include dotfiles and dot-directories (default false)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results"New value: +"Max parameters returned (default 20)" - changed
Input schema / properties / max_depth / descriptionPrevious value: -"Max depth"New value: +"Max directory depth to descend (default unlimited)" - changed
Input schema / properties / max_files / descriptionPrevious value: -"Max files to scan"New value: +"Stop after scanning this many files (default unlimited)" - changed
Input schema / properties / path / descriptionPrevious value: -"Target path"New value: +"File or directory to analyze; must be inside the allowed roots" - changed
Input schema / properties / summary_only / descriptionPrevious value: -"Return only summary without per-parameter details (default false)"New value: +"Return summary totals without per-item details (default false)" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "_meta": { + "additionalProperties": false, + "properties": { + "funding": { + "type": "string" + }, + "item_count": { + "type": "number" + }, + "response_size_chars": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "item_count", + "response_size_chars", + "funding" + ], + "type": "object" + }, + "is_directory": { + "type": "boolean" + }, + "path": { + "type": "string" + }, + "summary": { + "additionalProperties": false, + "properties": { + "files_analyzed": { + "type": "number" + }, + "highest_occurrence": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "count": { + "type": "number" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "count" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "threaded_parameters_found": { + "type": "number" + }, + "total_parameters_scanned": { + "type": "number" + } + }, + "required": [ + "files_analyzed", + "total_parameters_scanned", + "threaded_parameters_found", + "highest_occurrence" + ], + "type": "object" + }, + "threaded_parameters": { + "items": { + "additionalProperties": false, + "properties": { + "files": { + "items": { + "type": "string" + }, + "type": "array" + }, + "forwarding_evidence": { + "type": "number" + }, + "functions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "occurrences": { + "type": "number" + }, + "risk": { + "enum": [ + "high", + "medium", + "low" + ], + "type": "string" + } + }, + "required": [ + "name", + "occurrences", + "files", + "functions", + "forwarding_evidence", + "risk" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "path", + "is_directory", + "threaded_parameters", + "summary" + ], + "type": "object" +}
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 analysis concern, but get_functions and get_code_inventory both enumerate functions/methods, and check_thresholds overlaps with get_line_counts and get_complexity_metrics since it operates on the same size/complexity data. Descriptions provide enough nuance to pick correctly in most cases, but the boundaries are not perfectly crisp.
Seven of nine tools follow a clean get_noun pattern, with only check_thresholds and find_dead_code deviating. The verb choice is semantically sensible (check for threshold comparison, find for searching), so the deviation is minor and readable rather than chaotic.
Nine tools is well-scoped for a code-analysis server, with each tool covering a distinct metric or scan type. No tool feels redundant padding or trivially thin.
The surface covers a broad set of static-analysis concerns: inventory, size, complexity, documentation, smells, dead code, and prop drilling. Minor gaps remain (e.g. cross-file dependency/import-cycle analysis or a raw symbol-reference lookup), but core codebase auditing workflows are well supported.
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.156 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.413 PyPI3MIT