Skip to main content
Glama

decisions-mcp

Let your AI agent scan huge codebases for a fraction of a cent — without reading them.

An MCP server that gives any coding agent — Claude Code, Claude Desktop, Cursor, VS Code, Codex, Windsurf — access to tiny decision models on OpenRouter: Jev by default, Cloudflare Clef, Mercury Decide, Liquid D1 and every other model behind the Decisions API. The agent describes what it's looking for; the model sifts through every line and points to the exact spot.

CI Node MCP License

English · Русский


Why

Your agent needs to find a bug somewhere in 80 files. Reading them costs ~270k tokens of its context. With this server it asks "where does this happen?" and gets back ~1k tokens: the file, the line range, and the code. Then it reads and fixes just that — it's already an LLM, it doesn't need another one.

Decision models don't write text. They score and pick: yes/no with a probability, one of N options, a level on a scale. That's exactly what's needed to narrow down a search — and it costs $0.02–0.05 per 1M input tokens, output free.

Related MCP server: Glancey

How it works

flowchart LR
    A["Agent: 'valid tokens get<br/>401 Token has expired'"] --> B[locate_in_files]
    B --> C["Pass 1 · Jev scores<br/>every chunk of every file"]
    C --> D["Pass 2 · Jev re-scores<br/>~40-line windows in the top chunks"]
    D --> E["bearerAuth.js:31-70 · 0.97<br/>+ the code"]
    E --> A

Nothing is truncated: large files are split into overlapping chunks and all of them are scored, so a bug in the middle of a 20k-line file is still found.

Benchmarks

Measured on the compiled MCP TypeScript SDK 1.32.1 — 87 files, ~230k tokens — with ground truth that can be checked mechanically. Reproduce with npm run bench; raw results are in bench/results.

  • Bug — 6 one-line bugs planted one at a time (inverted comparisons, an off-by-one, a wrong constant), in 6 different files. The model gets only the symptom, half of them in Russian. file #1 — the buggy file ranks first; line window #1 — the top ~40-line window contains the bug.

  • Facts — 6 yes/no questions for every file (calls fetch, defines a class, throws, uses timers, uses zod, async), checked with regexes.

  • Classify — client / server / shared / examples for 71 files, with paths anonymized so the model has to read the code.

Model

Bug: file #1

Bug: file top-3

Bug: line window #1

Bug: line top-3

Facts acc

Facts F1

Classify acc

Cost

Time

inception/mercury-decide

6/6

6/6

6/6

6/6

99%

0.96

85%

$0.0313

88s

cloudflare/clef

6/6

6/6

6/6

6/6

99%

0.97

83%

$0.0889

139s

openai/gpt-6-luna-decisions

6/6

6/6

6/6

6/6

97%

0.89

79%

$0.1760

47s

perplexity/pplx-decider-v1.1-27b

6/6

6/6

5/6

6/6

99%

0.97

85%

$0.0443

65s

nace-ai/drex-v2.0

6/6

6/6

5/6

6/6

99%

0.94

72%

$0.0907

63s

liquid/d1

6/6

6/6

5/6

6/6

98%

0.93

72%

$0.0436

54s

typesafe/jev-1.13

6/6

6/6

4/6

5/6

98%

0.91

87%

$0.0775

53s

microsoft/microsoft-decision-1

6/6

6/6

4/6

5/6

99%

0.96

80%

$0.0658

57s

nace-ai/drex-v1.5

6/6

6/6

4/6

5/6

98%

0.91

76%

$0.0597

59s

cloudflare/clef-omni

6/6

6/6

3/6

5/6

99%

0.97

75%

$0.2532

49s

cloudflare/clef-flash

5/6

6/6

3/6

5/6

97%

0.92

69%

$0.0425

75s

togethercomputer/tev1-4b-experimental

4/6

4/6

3/6

4/6

99%

0.96

73%

$0.0945

61s

jaredpalmer/kev-4b

4/6

4/6

2/6

3/6

98%

0.95

73%

$0.0639

134s

scaledown/classify-1

4/6

5/6

1/6

3/6

98%

0.96

66%

$0.0916

115s

respan/span-01-lite

2/6

4/6

2/6

3/6

89%

0.75

n/a

$0.0000

57s

upstage/solar-decide

1/6

3/6

1/6

2/6

94%

0.88

69%

$0.1341

631s

upstage/solar-decide-flash

1/6

2/6

1/6

1/6

90%

0.83

66%

$0.1336

116s

Takeaways

  • Every top-10 model found the right file for all 6 bugs on the first try, out of 87 files.

  • inception/mercury-decide is the best all-rounder and the cheapest model that handles every task: perfect bug localization, 0.96 facts F1, about $0.03 for the whole benchmark. cloudflare/clef matches it on localization and ties for the best facts score. Jev 1.13 has the best classification accuracy.

  • Small 4B models and the Upstage / Respan models are noticeably weaker at localization. Respan is an LLM-judge model and only supports yes/no questions.

  • Runs vary a little: with 6 bugs, one window more or less moves line #1 by a whole step. Treat differences of ±1 as noise.

Tools

Tool

What it does

Example

locate_in_files

Finds where something is: a bug from its symptoms, the code behind a feature, where a setting lives. Returns ranked file:lines with probabilities, a per-file ranking and the code of the top hits

"valid tokens get 401 'Token has expired', expired ones pass"

classify_files

Sorts every file into your labels with a confidence score

test, config, dead-code: unused or unreachable, business-logic

decide_files

Several typed questions per file: yes_no, choice, score. only_matching returns only files where a flag is yes

uses_db (yes/no), layer (api/domain/ui), complexity (low → high)

list_models

Decision models available on OpenRouter with context size and price; pass any id as model

cloudflare/clef, inception/mercury-decide

Common parameters: paths (files and/or directories), include / exclude (globs), respect_gitignore, model, dry_run (show what would be scanned — no API calls).

Most likely locations (probability · file:lines):
1. 0.97  server/auth/middleware/bearerAuth.js:31-70
2. 0.72  examples/server/demoInMemoryOAuthProvider.js:91-130
3. 0.62  examples/server/elicitationUrlExample.js:151-190

Files ranking:
1. 0.97  server/auth/middleware/bearerAuth.js
2. 0.68  examples/server/simpleStreamableHttp.js
3. 0.66  examples/server/elicitationUrlExample.js

--- server/auth/middleware/bearerAuth.js:31-70 (0.97)
...
45|             // Check if the token is set to expire or if it is expired
46|             if (typeof authInfo.expiresAt !== 'number' || isNaN(authInfo.expiresAt)) {
47|                 throw new InvalidTokenError('Token has no expiration time');
48|             }
49|             else if (authInfo.expiresAt > Date.now() / 1000) {
50|                 throw new InvalidTokenError('Token has expired');
51|             }
...

---
files: 88 | ~source tokens: 268700 | chunks: 108 | windows: 48 | model calls: 156 | cost: $0.01175

Any decision model

Every tool takes a model argument, and DECISIONS_MODEL sets the default. The server adapts to each model automatically:

  • Context size is read from OpenRouter's catalog, and chunks are sized to fit — from 8k-token models like jaredpalmer/kev-4b to 1M-token ones.

  • Request quirks are learned from the first rejection and remembered: models that want state as a string (ScaleDown, Respan) or accept only yes/no questions with plain-string criteria (Respan) just work.

  • Fallbacks: list backups in DECISIONS_FALLBACK_MODELS, and they take over if the primary model fails.

Install

You need Node.js 18+ and a regular OpenRouter API key — openrouter.ai/keys (a management/provisioning key won't work).

git clone https://github.com/GorOhanyan/decisions-mcp.git
cd decisions-mcp && npm install

Every config below runs node /ABS/PATH/decisions-mcp/src/index.js. Desktop apps often don't see your shell PATH, so use the absolute path to node (which node) if node alone doesn't start.

Or skip the clone and let npx fetch it from GitHub: use "command": "npx", "args": ["-y", "github:GorOhanyan/decisions-mcp"].

claude mcp add decisions --scope user -e OPENROUTER_API_KEY=sk-or-... -- node /ABS/PATH/decisions-mcp/src/index.js

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json · Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "decisions": {
      "command": "node",
      "args": ["/ABS/PATH/decisions-mcp/src/index.js"],
      "env": { "OPENROUTER_API_KEY": "sk-or-..." }
    }
  }
}
{
  "mcpServers": {
    "decisions": {
      "command": "node",
      "args": ["/ABS/PATH/decisions-mcp/src/index.js"],
      "env": { "OPENROUTER_API_KEY": "sk-or-..." }
    }
  }
}

Same format for Windsurf (~/.codeium/windsurf/mcp_config.json).

{
  "inputs": [
    { "type": "promptString", "id": "openrouter-key", "description": "OpenRouter API key", "password": true }
  ],
  "servers": {
    "decisions": {
      "type": "stdio",
      "command": "node",
      "args": ["/ABS/PATH/decisions-mcp/src/index.js"],
      "env": { "OPENROUTER_API_KEY": "${input:openrouter-key}" }
    }
  }
}
[mcp_servers.decisions]
command = "node"
args = ["/ABS/PATH/decisions-mcp/src/index.js"]
tool_timeout_sec = 300

[mcp_servers.decisions.env]
OPENROUTER_API_KEY = "sk-or-..."

Make the agent actually use it

The server ships MCP instructions telling the agent when to call it, but a line in CLAUDE.md / AGENTS.md / .cursor/rules makes it reliable:

When you need to find something in a lot of code or text (a bug from its symptoms, where a feature
is implemented, where a setting lives) or triage many files — use the decisions MCP first
(locate_in_files / classify_files / decide_files), then read only the lines it points to.

Configuration

The old JEV_* names (from when the project was called jev-offload-mcp) are still accepted.

Variable

Default

Description

OPENROUTER_API_KEY

—

Required

DECISIONS_MODEL

typesafe/jev-1.13

Default decision model (any id from list_models)

DECISIONS_FALLBACK_MODELS

—

Comma-separated backups tried in order if the primary fails

DECISIONS_CONCURRENCY

8

Parallel requests to Jev

DECISIONS_BASE_DIR

workspace root from MCP roots, else cwd

What relative paths resolve against

DECISIONS_ALLOWED_ROOTS

—

Restrict reading to these directories (:-separated)

DECISIONS_MAX_FILE_BYTES / DECISIONS_MAX_FILES

1000000 / 2000

Limits for file collection

DECISIONS_ALLOW_SECRETS

—

1 stops excluding .env, keys etc. (not recommended)

DECISIONS_DECISIONS_URL

https://openrouter.ai/api/alpha/decisions

Decisions API endpoint

DECISIONS_MODELS_URL

OpenRouter decision-model catalog

Where context sizes and prices are read from

DECISIONS_TIMEOUT_MS

120000

Per-request timeout

What never leaves your machine

node_modules, .git, dist / build, lock files, minified bundles, binaries, everything in .gitignore, and secrets — .env*, *.pem, *.key, id_rsa*, credentials*, .npmrc, .aws/, .ssh/ and similar. Use dry_run: true to see exactly what would be sent.

Development

npm install
npm test

The test is end-to-end: a real MCP client talks to the server over stdio while the Decisions API is mocked. It covers every tool, dry runs, filters, secret / .gitignore / binary exclusion, a full scan of a large file with pinpointing to a line window, context-aware chunk sizing, per-model request adaptation, fallback models and workspace-root detection via MCP roots.

npm run bench runs the quality benchmark against the real API (needs OPENROUTER_API_KEY; about $1–2 for all models).

License

MIT © Gor Ohanyan

Available Tools

4 tools
classify_filesClassify filesA

Classify every file in the given paths into your labels with a decision model (one very cheap request per file, calibrated confidence). Returns files grouped by label. Good for triage: tests/configs/dead code, sorting documents by topic, flagging files about X. Label descriptions after a colon noticeably improve accuracy.

NameRequiredDescriptionDefault
modelNoOverride the OpenRouter decision model for this call, e.g. cloudflare/clef (see list_models)
pathsYesFiles and/or directories to read (absolute or relative to the project root)
formatNoOutput format (default grouped)
labelsYesLabel names, optionally with a description after a colon, e.g. ["bug: describes a defect", "feature", "question"]
dry_runNoOnly list which files would be scanned and the estimated tokens; no API call
excludeNoExtra globs to skip, e.g. ["**/*.test.ts"]
includeNoGlob patterns inside directories, e.g. ["**/*.ts", "docs/**/*.md"]. Default: all text files
multi_labelNoAllow several labels per file (default false)
instructionsNoExtra classification criteria
respect_gitignoreNoSkip files ignored by the directory's .gitignore (default true)
max_chars_per_fileNoTruncate each file to this many chars, keeping head and tail (default 12000; capped to the model's context)

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the cost model (one very cheap request per file), that confidence is calibrated, that files are read and returned grouped, and that label descriptions improve accuracy. It does not state that the operation is read-only/non-destructive nor mention rate limits or failure behavior for unreadable files.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense and front-loaded: purpose and cost appear in the first sentence, return shape in the second, use cases third, accuracy tip last. Every sentence earns its place, though the parenthetical cost note interrupts the main clause slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an eleven-parameter tool with no annotations and no output schema, the description covers purpose, cost, output grouping, and the key accuracy lever. Minor gaps: it only mentions the 'grouped' shape although format supports table/json, and it says nothing about dry_run or include/exclude interplay.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the eleven parameters are already well documented, including the colon-description convention for labels. The description reinforces that convention but adds no new syntax, defaults, or constraints beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (classify every file into your labels) plus the mechanism (decision model) and the return shape (files grouped by label). It is clear enough to act on, but it never differentiates itself from the sibling decide_files, which by name sounds closely related.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Concrete when-to-use guidance is given: triage of tests/configs/dead code, sorting documents by topic, flagging files about X. It lacks any exclusions or an explicit pointer to decide_files versus locate_in_files, so the agent must infer the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

decide_filesTyped per-file decisionsA

Ask several typed questions about EACH file with a decision model: yes_no flags, one-of choices and ordered scores, with calibrated probabilities. Example: for every file decide uses_db (yes_no), layer (choice: api/domain/ui/infra), complexity (score: low/medium/high). Use only_matching to return just the files where a yes_no question is yes.

NameRequiredDescriptionDefault
modelNoOverride the OpenRouter decision model for this call, e.g. cloudflare/clef (see list_models)
pathsYesFiles and/or directories to read (absolute or relative to the project root)
formatNoOutput format (default table)
dry_runNoOnly list which files would be scanned and the estimated tokens; no API call
excludeNoExtra globs to skip, e.g. ["**/*.test.ts"]
includeNoGlob patterns inside directories, e.g. ["**/*.ts", "docs/**/*.md"]. Default: all text files
questionsYes
instructionsNoShared context added to every question
only_matchingNoReturn only files where this yes_no question id is 'yes'
respect_gitignoreNoSkip files ignored by the directory's .gitignore (default true)
max_chars_per_fileNoTruncate each file to this many chars, keeping head and tail (default 12000; capped to the model's context)

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose the key behavioral trait that answers come from a decision model with calibrated probabilities (i.e. LLM-backed, non-deterministic), but it omits practical consequences: one model call per file means cost and latency scaling with path count, answers may be probabilistic rather than ground truth, and no mention of what a failed or truncated file yields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core operation, then a concrete example, then a targeted hint about only_matching. Nothing is padded, though the example slightly duplicates the per-field schema descriptions of `options` and `yes`/`no`.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter tool with a nested questions array, no annotations and no output schema, the description covers the central concept and question types but leaves gaps: cost/latency implications of per-file model calls, the shape of the returned table (answer columns per question id), and how it relates to classify_files. The 91% schema coverage fills most parameter gaps, keeping this at minimum-viable rather than poor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 91%, so baseline is 3, but the description goes beyond it by explaining what each question type means (yes_no flags, one-of choices, ordered scores) and by spelling out only_matching's filtering role with a concrete use. This is valuable because the schema's `type` enum has no description of its own.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (ask typed questions about each file) plus the three question types and that answers carry calibrated probabilities. An agent can picture the operation precisely. However, it never distinguishes this from sibling classify_files, which sounds like an adjacent capability, so the agent has to guess which one to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied through a worked example ('for every file decide uses_db, layer, complexity') and a directive for only_matching. There is no statement of when to prefer this over classify_files, no exclusions, and no prerequisites such as the project root or model availability.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_modelsList decision modelsA

List the decision models available on OpenRouter (id, context window, input price) and which one is the default. Pass an id as model to any other tool. Bigger context = bigger chunks per request.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does disclose the read-only nature implicitly plus concrete return content and the default-model flag. It omits auth/rate-limit or freshness details, but for a zero-parameter listing tool the behavioral gap is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, output contents front-loaded, then the downstream usage note, then a sizing hint. Nothing repeats the name or title and no sentence is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description usefully enumerates the return fields and the default indicator. Combined with the cross-tool `model` guidance, an agent has enough to call it and use the result correctly; only pagination/scale behavior is unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters gives a baseline of 4. The description goes slightly further by explaining the cross-tool convention for passing a returned id as `model`, which is useful semantics the empty schema cannot express.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List the decision models') and enumerates the returned fields (id, context window, input price) plus the default marker, so an agent knows exactly what it gets. It does not name the sibling tools, but their names (classify/locate/decide) make the distinction obvious without it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Pass an id as `model` to any other tool' clearly frames this as the discovery step that precedes every other call. It gives a positive usage context but no explicit when-not or prerequisites (e.g. caching, freshness).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

locate_in_filesFind where something is in many/huge filesA

Find which files and lines most likely contain what you describe — the cause of a bug from its symptoms, the code implementing a feature, where a setting is defined. Pass 1: every file is split into chunks and ALL chunks are scored by the decision model (nothing is truncated; very cheap even for megabytes). Pass 2: the best chunks are re-scored in small line windows to pinpoint the lines. Returns ranked file:line ranges with probabilities, a per-file ranking and the code of the top locations, so you can go straight to the fix.

NameRequiredDescriptionDefault
topNoHow many locations and files to list (default 5)
modelNoOverride the OpenRouter decision model for this call, e.g. cloudflare/clef (see list_models)
pathsYesFiles and/or directories to read (absolute or relative to the project root)
queryYesWhat to find, as specific as possible: symptoms, error text, expected vs actual behaviour, names involved
dry_runNoOnly list which files would be scanned and the estimated tokens; no API call
excludeNoExtra globs to skip, e.g. ["**/*.test.ts"]
includeNoGlob patterns inside directories, e.g. ["**/*.ts", "docs/**/*.md"]. Default: all text files
snippetsNoInclude the code of this many top locations, with line numbers (default 3, 0 = only file:line ranges)
chunk_charsNoChunk size in chars for pass 1 (default 20000; capped to what the model's context fits)
window_linesNoSize of the pinpointed line windows (default 40)
respect_gitignoreNoSkip files ignored by the directory's .gitignore (default true)

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it explains the two-pass chunking and line-window scoring, notes that nothing is truncated and that scanning is cheap even for megabytes, and describes the ranked output with probabilities and snippets. It omits permission, rate-limit, and failure-mode details, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose and then structured into Pass 1, Pass 2, and return-value details. It is dense but mostly earns its length; the two-pass explanation could be tightened slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter search tool with no annotations and no output schema, the description provides enough behavioral context: what gets scanned, how scoring works, and what the ranked output contains. It leaves out operational details like API cost semantics or authentication, but the core invocation context is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 11 parameters in detail. The description reinforces query specificity through the use-case examples but adds no parameter-level guidance beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Find which files and lines most likely contain what you describe.' It adds concrete use cases (bug symptoms, feature implementation, setting definitions) that make the tool's purpose immediately distinguishable from generic file classification or listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear contexts for when to use the tool, such as locating a bug's cause from symptoms or finding where a setting is defined. It does not explicitly name alternatives like classify_files or decide_files, nor does it state when not to use this tool, so it falls short of a 5.

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.

  1. 4 tool updatesv0.4.0
    • First observedclassify_files
    • First observeddecide_files
    • First observedlist_models
    • First observedlocate_in_files

TDQS

A3.9/5.0

Scored across 4 tools

Disambiguation4/5

locate_in_files and list_models are clearly distinct, but classify_files and decide_files overlap: classification is effectively a one-question decision, so an agent must read carefully to know which to pick for a single-label vs multi-question pass. The descriptions do clarify the intended boundary (grouped label output vs typed yes_no/choice/score answers), so confusion is limited rather than pervasive.

Naming Consistency5/5

All four tools are snake_case verb-first names (classify_files, locate_in_files, decide_files, list_models) with a predictable verb + target pattern. list_models is the only one not scoped to 'files', but it follows the same convention and is semantically clear.

Tool Count5/5

Four tools is a tight, well-scoped surface: three file-analysis operations plus a model-discovery utility that enables the others. Each tool has a distinct role and none feels redundant or bolted on.

Completeness4/5

The core workflow of triage (classify), structured interrogation (decide), and pinpointing (locate) is covered, with list_models to support model choice. Minor gaps exist: no direct way to inspect raw file contents outside results, no aggregation/summary across the outputs of multiple passes, and no mechanism to persist or reuse a named question set.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Indexes codebases and lets AI agents retrieve precise code snippets (functions, classes, routes) instead of reading entire files, reducing token usage and improving accuracy.
    85 npm
    7
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Adds semantic code search to AI coding agents, enabling natural language queries across entire codebases to retrieve relevant code chunks, saving tokens and providing deep context.
    41 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI coding agents to quickly find relevant code, focus reads on important parts of large files, and pick relevant items from long lists, reducing token usage and search time.
    7
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI coding agents to locate code by meaning rather than text patterns, combining embedding-based semantic search, exact/regex literal matching, and tree-sitter AST structural filters to return compact, tree-shaken code context. It also supports symbol metadata filtering, duplicate detection, codebase surveys and clustering, call-graph exploration, and exhaustive changed-file audits.
    2
    Apache 2.0