Skip to main content
Glama
pleibers
by pleibers

quick-search

quick-search is a FastMCP server for bounded, keyword-driven repository context search. It is designed for broad codebase exploration when a client needs likely-relevant files and small, targeted snippets instead of reading whole files.

The server exposes two MCP tools:

  • search_repo_context

  • search_focused_context

It is intended for agent workflows such as:

  • finding the most relevant implementation files for a feature or bug

  • surfacing symbol definitions before reading full files

  • keeping context windows small during repository search

  • falling back to normal search only when bounded retrieval is not enough

Recommended agent workflow:

  1. Call search_repo_context with output_mode="compact" and include_diagnostics=false.

  2. Keep the returned query_id.

  3. If the result identifies promising files but you need more ranking or query metadata, call the tool again with query_id=<prior id> and output_mode="full".

  4. If the relevant context is spread across a few files, call search_focused_context with that same query_id to retrieve full enclosing definitions instead of snippets.

  5. If you already know the specific keyword you want and want enclosing definitions directly, call search_focused_context on its own with keywords.

  6. If you already know both the keyword and the exact files, call search_focused_context with keywords and file_paths to skip broad ranking entirely.

  7. If the result is empty or surprising, call the broad tool again with query_id=<prior id> and include_diagnostics=true.

  8. Once the search is narrowed, switch to Serena or normal file reads.

What It Does

For each request, quick-search:

  1. discovers candidate files under the target directory

  2. skips obvious noise such as generated files, binaries, vendored code, and very large files

  3. counts keyword hits per file

  4. boosts likely source files and symbol-definition matches

  5. ranks files with an explainable score

  6. returns bounded snippet windows around strong matches

  7. optionally returns full enclosing multi-file code blocks in a second focused step

The result is compact structured JSON with:

  • summary counts

  • ranked files

  • snippet excerpts

  • focused code blocks when requested

  • short usage guidance for the calling agent

Related MCP server: code_nav MCP

Registering The MCP

You might need to install uv for this to work. Then download this repository. And either edit the config.toml yourself or use the one line commands below. Running it with uv is highly recommended.

Codex

Direct Python launch:

With uv:

codex mcp add quick-search -- \
  uv run --directory path/to/repository python main.py
codex mcp add quick-search -- \
  path/to/repository/.venv/bin/python \
  path/to/repository/main.py

Useful checks:

codex mcp list
codex mcp get quick-search

Claude Code

Local scope:

claude mcp add quick-search --scope local -- \
    uv run --directory path/to/repository python main.py

Project scope:

claude mcp add quick-search --scope project -- \
  uv run --directory path/to/repository pyhton main.py

Equivalent .mcp.json entry:

{
  "mcpServers": {
    "quick-search": {
      "command": "uv",
      "args" = ["run", "--directory", "/home/leibersp/code/quick-mcp", "python","main.py"],
      "env": {}
    }
  }
}

Configuration

You can configure default retrieval budgets at MCP registration time with environment variables:

QUICK_SEARCH_MAX_FILES=20
QUICK_SEARCH_MAX_SNIPPETS=30
QUICK_SEARCH_MAX_TOTAL_LINES=500
QUICK_SEARCH_LOG_LEVEL=INFO

Behavior:

  • QUICK_SEARCH_MAX_FILES sets the default max_files

  • QUICK_SEARCH_MAX_SNIPPETS sets the default max_snippets

  • QUICK_SEARCH_MAX_TOTAL_LINES sets the default max_total_lines

  • QUICK_SEARCH_LOG_LEVEL controls Python logging verbosity

Per-call tool arguments still override the retrieval defaults.

Example Codex registration with configured defaults:

codex mcp add quick-search \
  --env QUICK_SEARCH_MAX_FILES=20 \
  --env QUICK_SEARCH_MAX_SNIPPETS=30 \
  --env QUICK_SEARCH_MAX_TOTAL_LINES=500 \
  --env QUICK_SEARCH_LOG_LEVEL=INFO \
  -- \
  path/to/repository/.venv/bin/python \
  path/to/repository/main.py

Retrieval Behavior

The implementation follows the broad-context retrieval plan in broad-context-mcp-plan.md.

Current behavior includes:

  • cwd search by default, with optional explicit directory

  • optional subpath restriction to a subtree or single file within directory

  • optional include/exclude glob filters on candidate file paths

  • match_mode with substring, word, and identifier behavior

  • bounded keyword expansion from the provided keywords

  • output_mode with compact-by-default responses

  • optional include_diagnostics for backend and exclusion summaries

  • rg --files discovery when available, with Python fallback

  • ripgrep keyword collection when available, with Python fallback

  • source-file preference over docs/config when scores are similar

  • definition-hit preference for common source languages using regex heuristics

  • overlap-aware snippet window merging

  • hard budgets on returned files, snippets, and total lines

The server intentionally does not do embeddings, AST parsing, or semantic reranking in v1.

Defaults

Default retrieval limits:

  • max_files = 12

  • max_snippets = 8

  • lines_before = 24

  • lines_after = 40

  • max_total_lines = 1200

Internal implementation defaults also include:

  • max_snippets_per_file = 3

  • max_file_size_bytes = 1_000_000

Tool Contract

search_repo_context

Input

search_repo_context accepts:

{
  "keywords": ["snow", "albedo", "melt"],
  "query_id": null,
  "directory": "/path/to/repo",
  "subpath": "src/model",
  "paths_include_glob": "src/**/*.py",
  "paths_exclude_glob": "**/tests/*",
  "match_mode": "substring",
  "output_mode": "compact",
  "include_diagnostics": false,
  "max_files": 12,
  "max_snippets": 8,
  "lines_before": 24,
  "lines_after": 40,
  "prefer_source_files": true,
  "max_total_lines": 1200
}

Parameter notes:

  • provide at least one non-empty keyword

  • prefer specific phrases or identifiers over very general terms such as snow when possible

  • query_id may be used instead of rerunning the same search when you only want a different output_mode or diagnostics view

  • provided keywords are preserved first; additional generalized terms may be added up to a bounded limit

  • ranking gives much more weight to matches on the original input keywords than to expansion-only matches

  • directory should be an absolute path for reliable agent behavior

  • subpath is optional and must be relative to directory

  • subpath may point to either a directory or a single file

  • paths_include_glob and paths_exclude_glob filter candidate file paths relative to directory

  • if both glob filters are provided, the exclude glob wins

  • match_mode defaults to substring

  • word uses word-boundary matching

  • identifier matches identifier tokens such as snow_model and snowModel

  • output_mode defaults to compact

  • use output_mode="full" when you need richer ranking, snippet, and query metadata

  • include_diagnostics defaults to false

  • relative paths such as . are not portable across MCP clients and only work when the client exposes roots

  • if you are calling this tool from an agent, do not rely on . meaning the agent's current directory; pass an absolute directory

  • if directory is omitted, the server falls back to its own process working directory unless exactly one client root is exposed

  • max_files, max_snippets, and max_total_lines must be >= 1

  • lines_before and lines_after must be >= 0

  • per-call values override configured environment defaults

Output

Typical output shape:

{
  "query_id": "9e0a4f3f8e6b2c1d",
  "searched_directory": "/path/to/repo",
  "summary": {
    "files_considered": 1832,
    "files_ranked": 47,
    "files_returned": 12,
    "snippets_returned": 8,
    "budget_truncated": true
  },
  "query": {
    "keywords": ["snow melt balance"],
    "resolved_keywords": ["snow melt balance", "snow", "melt", "balance", "snow melt", "melt balance"]
  },
  "ranked_files": [
    {
      "path": "src/model/snow_energy_balance.jl",
      "category": "source",
      "keyword_hits": 18,
      "distinct_keywords_matched": 3,
      "definition_hits": 2,
      "score": 0.94,
      "recommended_read": true,
      "reason": "high hit count, multiple keywords, source file, definition hits"
    }
  ],
  "snippets": [
    {
      "path": "src/model/snow_energy_balance.jl",
      "line_start": 120,
      "line_end": 140,
      "matched_keywords": ["snow", "melt"],
      "snippet": "..."
    }
  ],
  "usage_guidance": "Prefer source files over docs when scores are similar. Prefer files with multiple distinct keywords and clustered hits. Use the snippets to decide which files deserve deeper reading. Only do further searches across the repository if this context is insufficient."
}

Ranking Signals

Ranking is explainable rather than opaque. Signals include:

  • total keyword hits

  • number of distinct keywords matched

  • source-file bonus

  • keyword density

  • likely definition hits

  • penalties for tests, generated files, vendor code, and similar noise

The ranked file output also exposes several of these internal signals directly so an agent can decide the next Serena call without recomputing them.

In compact mode this stays lean:

  • category

  • keyword_hits

  • distinct_keywords_matched

  • definition_hits

In full mode additional fields are included:

  • line_count

  • is_source_file

  • is_test_file

  • definition_hits

  • keyword_density

Match Modes

quick-search supports three matching modes:

  • substring

    • current behavior

    • matches query text anywhere in the line

  • word

    • requires word boundaries

    • avoids matching snow inside snowpack or snow_model

  • identifier

    • matches identifier-like tokens in code

    • matches snow inside snow_model and snowModel

    • does not match snow inside snowfall

Keyword Expansion

quick-search works from explicit keywords only.

It broadens those keywords in a bounded way so searches are not limited to exact literal matches:

  • keeps the original keyword first

  • extracts useful identifier-like tokens

  • preserves some short adjacent phrases

  • caps the final resolved keyword set

Expansion terms are meant as recall helpers, not primary ranking signals. Files that match the original input keywords should rank ahead of files that mostly match only generalized terms.

The original and resolved keywords are returned in the query object so the behavior is transparent to the caller.

In compact mode, query contains:

  • keywords

  • resolved_keywords

In full mode, the same keys are returned.

Output Modes

quick-search now defaults to output_mode="compact" to reduce MCP response size.

Use compact when:

  • you only need the top candidate files and snippets

  • the tool is feeding another retrieval step

  • context budget matters

Use full when:

  • you are tuning retrieval quality

  • you want ranking metadata for debugging or evaluation

  • you want to inspect how your input keywords were generalized

  • you plan to immediately inspect only a small number of returned files

Diagnostics

Set include_diagnostics=true to include a compact diagnostics block with:

  • discovery backend

  • matching backend

  • excluded file counts by reason

This is off by default so normal agent calls stay small.

Compact-First Pattern

The intended call pattern for agents is:

  1. Run a compact query first.

  2. Keep the returned query_id.

  3. If needed, call the tool again with that query_id and:

    • output_mode="full" for richer metadata

    • include_diagnostics=true for debugging

This gives you a cheap first pass without committing to the larger payload every time or recomputing the search.

Cached Expansion

Every successful search response includes a query_id.

That id refers to an in-process cached full result:

  • the first call can use output_mode="compact"

  • a later call can reuse query_id with output_mode="full"

  • a later call can reuse query_id with include_diagnostics=true

This avoids recomputing the same search just to retrieve richer metadata.

This means a source file with a relevant def, class, function, struct, or similar declaration can outrank a doc file with many incidental mentions.

search_focused_context

Use this only after search_repo_context when the relevant code is spread across multiple files and line snippets are no longer enough.

Input:

{
  "query_id": "9e0a4f3f8e6b2c1d",
  "keywords": null,
  "directory": null,
  "file_paths": null,
  "max_files": 3,
  "max_blocks": 6,
  "max_blocks_per_file": 2,
  "max_total_lines": 400
}

Parameter notes:

  • provide either query_id or at least one non-empty keyword

  • use query_id when this is the second stage after search_repo_context

  • use keywords plus directory when you want focused retrieval directly without a prior broad-search call

  • use keywords plus file_paths when you want to skip broad ranking and search only specific files

  • omit file_paths to let the tool pick the strongest source files from the broad search

  • use file_paths when you want to constrain the focused pass to specific files from the broad result or standalone focused search

  • this tool is intended for multi-file code context, not broad discovery

  • it returns full enclosing definitions when possible and avoids returning whole files

Typical output shape:

{
  "query_id": "9e0a4f3f8e6b2c1d",
  "searched_directory": "/path/to/repo",
  "query": {
    "keywords": ["snow melt balance"],
    "resolved_keywords": ["snow melt balance", "snow", "melt", "balance"]
  },
  "summary": {
    "candidate_files_considered": 3,
    "files_with_context": 2,
    "blocks_returned": 4,
    "budget_truncated": false
  },
  "candidate_files": ["src/snow.py", "src/energy.py"],
  "blocks": [
    {
      "path": "src/snow.py",
      "block_type": "function",
      "signature": "def snow_melt_balance():",
      "line_start": 12,
      "line_end": 24,
      "matched_keywords": ["balance", "melt", "snow"],
      "match_lines": [12, 13, 18],
      "score": 1.0,
      "content": "def snow_melt_balance():\n    ..."
    }
  ]
}

This second-stage tool is best when:

  • the broad search already found the right files

  • the relevant logic is distributed across a small number of files

  • you need complete functions or classes, not line windows

  • you want to avoid falling back immediately to unrestricted pattern search

Direct-file mode is best when:

  • you already know the exact files to inspect

  • file ranking and broad discovery are unnecessary overhead

  • you still want enclosing functions or classes rather than whole files

Bounded Results

The result is intentionally not exhaustive.

quick-search returns the top ranked files and bounded snippets only. It does not return every file that was eligible for ranking, and it does not return filtered files that were skipped during discovery.

If you need broader coverage, raise the budgets and only do further searches across the repository if this context is insufficient.

You can narrow the ranking pass before matching and snippet extraction:

  • use subpath to search only inside a subtree

  • use subpath to search a single known file

  • use paths_include_glob to keep only specific candidate file patterns

  • use paths_exclude_glob to remove low-value areas such as tests or fixtures

Example:

{
  "keywords": ["snow", "melt"],
  "directory": "/repo",
  "subpath": "src/physics",
  "paths_include_glob": "src/physics/*.py",
  "paths_exclude_glob": "src/physics/test_*"
}

Directory Resolution

For agents, the safe contract is simple: always pass an absolute repository path.

Relative paths are not reliable because MCP servers do not automatically know the caller's current working directory. Some clients expose workspace roots and let quick-search resolve . against those roots, but others do not. In those clients, a relative path will fail rather than silently searching the wrong directory.

Use relative paths only if you control the client and know it exposes roots. Otherwise, pass an absolute directory.

Running The Server

With uv

From the repository root:

UV_CACHE_DIR=/tmp/uv-cache uv run quick-search

If your local uv setup is stable, this is the simplest command.

With the Local Virtual Environment

If you want a more explicit launch command:

path/to/repository/.venv/bin/python path/to/repository/main.py

This is often the safer registration target for MCP clients because it avoids extra resolver and cache behavior at process startup.

Transport

The server defaults to stdio transport:

MCP_TRANSPORT=stdio

That is the correct default for Codex and Claude Code local MCP registration.

Logging

quick-search emits meaningful runtime logs to stderr. This is important because stdout is reserved for MCP protocol traffic.

Each search logs:

  • target root directory

  • query keywords

  • files considered, ranked, and returned

  • snippets returned

  • whether budgets truncated the result

  • top-ranked files

  • per-file snippet coverage as shown_lines=<returned>/<total> (<percent>%)

Example log lines:

2026-04-07 13:45:45,123 INFO repo_context_search: repo search root=/repo keywords=snow, melt files_considered=3 files_ranked=2 files_returned=2 snippets_returned=1 budget_truncated=False
2026-04-07 13:45:45,124 INFO repo_context_search: rank=1 path=src/model.py score=1.000 hits=5 distinct_keywords=2 definition_hits=1 snippets=1 shown_lines=12/240 (5.0%)

If you want quieter output, set:

QUICK_SEARCH_LOG_LEVEL=WARNING

Development

Project Layout

Install / Sync

If needed:

uv sync

Run Tests

.venv/bin/python -m unittest -v tests.test_repo_context_search

or:

.venv/bin/python -m unittest discover -s tests

Compile Check

.venv/bin/python -m py_compile quick_search.py repo_context_search.py main.py

Verified Behaviors

The test suite currently covers:

  • default search in cwd

  • source-file preference

  • definition-hit preference

  • subtree restriction

  • include/exclude glob filtering

  • word and identifier matching modes

  • keyword expansion from explicit keywords

  • compact and full output modes

  • focused multi-file context extraction with full Python blocks

  • optional diagnostics output

  • overlapping snippet merge

  • total line budget enforcement

  • binary, generated, and large-file exclusion

  • no-match behavior

  • docs-only matches

  • environment-driven default budgets

  • logging of ranked files and snippet coverage

Limitations

Current limitations are intentional:

  • exact keyword matching only

  • no semantic search or embeddings

  • no AST parsing

  • definition detection is heuristic, not language-complete

  • retrieval is optimized for bounded context, not exhaustive code intelligence

If the returned context is insufficient, the intended client behavior is to only do further searches across the repository when this context is insufficient.

Available Tools

2 tools
search_focused_contextA

Use this only after search_repo_context when the relevant code is spread across multiple files and you need full enclosing functions, classes, or similar definitions instead of truncated snippets. It reuses a prior query_id, narrows to a few files, prefers source files, and returns complete matching blocks without dumping whole files.

ParametersJSON Schema
NameRequiredDescriptionDefault
subpathNo
keywordsNo
query_idNo
directoryNo
max_filesNo
file_pathsNo
match_modeNosubstring
max_blocksNo
max_total_linesNo
paths_exclude_globNo
paths_include_globNo
max_blocks_per_fileNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses key behaviors: it reuses a prior query_id, narrows to a few files, prefers source files, and returns complete matching blocks without dumping whole files. It does not mention rate limits, auth, or error cases, but for a search tool the core behavioral traits are well covered.

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?

The description is a single, dense sentence that front-loads the usage condition and the key differentiator. Every clause earns its place: when to use, what it returns, and what it avoids. No filler or repetition.

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?

Given the tool's complexity (12 parameters, no annotations, no schema descriptions), the description provides a strong conceptual model: it is a follow-up narrowing search that returns full blocks. It does not enumerate all parameters or explain return structure, but the output schema exists and the core usage context is clear. A 4 is appropriate because the description is complete enough for an agent to invoke it correctly in the intended workflow.

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 description coverage is 0%, so the description must compensate. It explains the central parameter (query_id) and the overall narrowing behavior (few files, source files, complete blocks), which maps to max_files, file_paths, and max_blocks. It does not explain every parameter, but it gives enough semantic context for an agent to infer the tool's purpose and use the key parameters correctly.

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 ('search'), a resource ('focused context'), and a precise scope: it returns complete enclosing functions/classes/definitions rather than truncated snippets, and it is explicitly positioned as a follow-up to search_repo_context. This clearly distinguishes it from its sibling tool.

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

Usage Guidelines5/5

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

The description explicitly says 'Use this only after search_repo_context' and gives the condition ('when the relevant code is spread across multiple files and you need full enclosing functions...'). It also names the alternative (search_repo_context) and explains what this tool does differently, so an agent knows exactly when to choose it.

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

search_repo_contextA

Search a repository with explicit keywords, rank likely relevant files without reading full files, and return bounded snippets around the strongest clustered matches. The tool prefers source files over docs when scores are similar, boosts likely function, class, struct, module, or method definition hits, merges overlapping match windows, and enforces hard budgets on returned files, snippets, and total lines. Optional subtree and glob filters can narrow the search space before ranking. Matching defaults to substring mode, with optional word and identifier-aware modes for stricter code search. Keyword expansion is bounded and returned transparently in the output. Prefer specific keywords over very general ones; ranking gives substantially more weight to matches on the original input keywords than to expansion-only matches. Preferred agent workflow: call the tool in compact mode first, then expand the cached result by query_id in full mode only if you need richer metadata; enable diagnostics only for debugging or tuning. Use it to narrow a large repo before deeper inspection. It returns structured output with summary counts, ranked files, snippets, and usage guidance. Pass an absolute directory path for reliable agent behavior. Relative directory values such as '.' only work when the MCP client exposes roots, so they are not portable across clients. The result is bounded and does not necessarily include every file that could be relevant for context. Only do further searches across the repository if this context is insufficient.

ParametersJSON Schema
NameRequiredDescriptionDefault
subpathNo
keywordsNo
query_idNo
directoryNo
max_filesNo
match_modeNosubstring
lines_afterNo
output_modeNocompact
lines_beforeNo
max_snippetsNo
max_total_linesNo
paths_exclude_globNo
paths_include_globNo
include_diagnosticsNo
prefer_source_filesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure, and it delivers: it discloses ranking preferences (source files over docs, definition boosts), merging of overlapping match windows, hard budgets on files/snippets/lines, bounded keyword expansion with transparent output, substring default with word/identifier modes, and the non-exhaustive nature of results. It also warns about relative directory portability. This is rich, honest 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.

Conciseness4/5

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

The description is long but information-dense, and every sentence earns its place by adding behavioral or usage detail. It is front-loaded with the core mechanism, then filters, matching modes, workflow, and portability caveats. It could be tightened slightly (e.g., 'The result is bounded...' repeats the boundedness already stated), but the structure is logical and the length is justified by the tool's complexity.

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

Completeness5/5

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

Given the tool's complexity (15 parameters, no annotations, no schema descriptions), the description is remarkably complete. It covers the search mechanism, ranking behavior, output structure, parameter semantics, workflow, portability caveats, and limitations. The output schema exists, so return values need not be detailed. Nothing critical for an agent to select and invoke this tool correctly is missing.

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 description coverage is 0%, so the description must compensate, and it does substantially: it explains the meaning and purpose of keywords, subtree/glob filters, match modes, output modes, query_id expansion, diagnostics, and directory path requirements. It doesn't enumerate every parameter (e.g., max_files, lines_before/after, max_snippets, max_total_lines are only implied by 'hard budgets'), but it gives enough semantic context for an agent to infer their roles. A 4 is appropriate given the heavy compensation for 0% schema coverage.

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 opens with a specific verb ('Search a repository'), a clear resource ('repository'), and a distinctive mechanism ('rank likely relevant files without reading full files, return bounded snippets around strongest clustered matches'). It also names the sibling tool (search_focused_context) and differentiates by describing this tool's ranking and bounded-snippet behavior. This is a strong, specific statement of what the tool does.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: 'Use it to narrow a large repo before deeper inspection' and 'Only do further searches across the repository if this context is insufficient.' It also provides a preferred agent workflow (compact mode first, then full mode via query_id, diagnostics only for debugging) and warns against very general keywords. This is exemplary usage guidance.

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. 2 tool updatesv0.1.0
    • First observedsearch_focused_context
    • First observedsearch_repo_context

TDQS

A4.6/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have clearly distinct roles: one performs broad repository search with bounded snippets, the other expands specific results into full context. The descriptions explicitly state when to use the second tool only after the first, leaving no ambiguity.

Naming Consistency5/5

Both names follow the same `search_` prefix pattern with a modifier distinguishing scope: `_repo_context` for broad search and `_focused_context` for targeted expansion. This is a consistent and predictable convention.

Tool Count4/5

With only two tools, the server feels minimal, but the narrow purpose of a quick-search utility is well served by this two-stage design. The count is slightly thin yet not unreasonable for the stated scope.

Completeness4/5

The tool surface covers the full intended workflow: initial bounded search, then optional expansion for deeper context. No obvious dead ends exist, though more advanced query refinement or result-management features could be considered minor gaps.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    Deterministic code navigation MCP server for Codex/CodeCLI that provides compact repo context using git-aware deterministic search tools without semantic search or embeddings.
    8
    -
  • A
    license
    A
    quality
    C
    maintenance
    A local-first MCP server that enables AI tools to safely inspect and search code repositories, providing indexing, deterministic BM25 search, code outlining, and context bundles without code modification.
    9
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that wraps Microsoft's FastContext as a read-only repository exploration subagent, enabling coding agents to delegate broad code searches and receive compact file:line citations.
    1
    1
    MIT