semantic-search-mcp
Click on "Install 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., "@semantic-search-mcpfind authentication middleware code"
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.
Semantic Search MCP Server
An MCP server that provides semantic code search using local embeddings. Search your codebase with natural language queries like "authentication middleware" or "database connection pooling".
Features
Hybrid search: Combines vector similarity (Jina code embeddings) with FTS5 keyword matching using Reciprocal Rank Fusion
165+ languages: Tree-sitter parsing for Python, TypeScript, JavaScript, Go, Rust, Java, C/C++, Ruby, PHP, and more
Incremental indexing: File watcher automatically detects additions, modifications, and deletions
Respects .gitignore: Honors your project's
.gitignorefiles (including nested ones)Auto-initialization: Model loads and codebase indexes in the background on server startup
Zero external APIs: All embeddings generated locally with FastEmbed
Related MCP server: Enterprise Code Search MCP Server
Installation
uv tool install semantic-search-mcpOr with pip:
pip install semantic-search-mcpOr run directly without installing:
uvx semantic-search-mcpQuick Start
Add to Claude Code
Option A: Project-level config (recommended)
After installing with uv tool install or pip install, create .mcp.json in your project root:
{
"mcpServers": {
"semantic-search": {
"command": "semantic-search-mcp"
}
}
}Option B: CLI
claude mcp add semantic-search -- semantic-search-mcpOption C: Without installing (ephemeral)
If you prefer not to install, use uvx to run in an ephemeral environment:
{
"mcpServers": {
"semantic-search": {
"command": "uvx",
"args": ["semantic-search-mcp"]
}
}
}Use
The server auto-initializes on startup.
Available Tools
Tool | Description |
| Search codebase with natural language |
| Get server state, progress, and statistics |
| Pause file watching (events discarded) |
| Resume file watching |
| Start full reindex (runs in background) |
| Cancel running indexing job |
| Wipe all indexed data |
| Add paths to ignore (session-only) |
| Remove paths from exclusion list |
How It Works
Indexing
On startup, the server:
Scans your codebase for supported file types
Parses code into semantic chunks (functions, classes, methods) using Tree-sitter
Generates embeddings for each chunk using Jina's code embedding model
Stores everything in a local SQLite database with vector search support
File Watching
The server monitors your codebase for changes in real-time:
Event | Action |
File created | Parsed, embedded, and added to index |
File modified | Re-indexed if content hash changed |
File deleted | Removed from index |
Changes are debounced (default 1s) to batch rapid modifications.
What Gets Indexed
Included:
Files with code extensions:
.py,.js,.ts,.tsx,.jsx,.go,.rs,.java,.c,.cpp,.h,.rb,.php,.swift,.kt,.scala, and more
Excluded:
Files matching
.gitignorepatterns (all.gitignorefiles in your project are respected)Common non-code directories:
node_modules,__pycache__,.venv,build,dist,.git,vendor, etc.Binary files and non-code file types
Configuration
Environment variables:
Variable | Default | Description |
|
| Index database location |
|
| Embedding model |
|
| Minimum relevance threshold (0-1) |
|
| File watcher debounce in milliseconds |
|
| Files per batch (reduce if running out of memory) |
|
| Skip files larger than this (KB) |
|
| Texts per embedding call (reduce if OOM) |
|
| ONNX runtime threads (higher = faster on multi-core) |
|
| Use INT8 quantized model (30-40% faster) |
Performance
GPU Acceleration
GPU acceleration is auto-detected and used when available:
Platform | Provider | Installation |
NVIDIA | CUDA |
|
Apple Silicon | CoreML | Automatic (M1/M2/M3) |
AMD | ROCm | Install ROCm-enabled onnxruntime |
Windows | DirectML | Install DirectML-enabled onnxruntime |
Alternative Models
For faster indexing (with quality tradeoffs), you can use a lighter model:
Model | Dimensions | Speed | Best For |
| 768 | Baseline | Code search (default) |
| 384 | ~10x faster | General text |
| 384 | ~32x faster | Speed priority |
To use an alternative model:
export SEMANTIC_SEARCH_EMBEDDING_MODEL="sentence-transformers/all-MiniLM-L6-v2"Note: Changing models requires a full reindex (delete .semantic-search/ directory).
UniXcoder (Experimental)
Microsoft UniXcoder is a code-specific model pre-trained on code + AST + comments. It may provide better semantic understanding of code structure, but is substantially slower (~20x slower than Jina).
Model | Dimensions | Speed | Languages |
| 768 | ~20x slower | 6 (java, ruby, python, php, js, go) |
| 768 | ~20x slower | 9 (+ c, c++, c#) |
Installation (requires additional dependencies):
pip install semantic-search-mcp[unixcoder]Usage:
export SEMANTIC_SEARCH_EMBEDDING_MODEL="microsoft/unixcoder-base-nine"When to use UniXcoder:
You prioritize search quality over indexing speed
Your codebase is small to medium sized
You have GPU acceleration (CUDA or Apple Silicon MPS)
When to avoid UniXcoder:
Large codebases (10,000+ files) - indexing will take hours
You need fast initial indexing
Running on CPU without GPU acceleration
Claude Code Integration
Skills and commands are automatically installed when the MCP server first starts:
Skills →
~/.claude/skills/(AI auto-discovery)Commands →
~/.claude/commands/(user-invocable slash commands)
To manually reinstall or update:
semantic-search-mcp-install-skillsAvailable Slash Commands
Command | Description |
| Search codebase with natural language |
| Check server status and index stats |
| Trigger full codebase reindex |
| Cancel running indexing job |
| Wipe all indexed data |
| Pause file watcher |
| Resume file watcher |
Requirements
Python 3.11+
~700MB disk for embedding model (downloaded on first run, ~150MB with INT8 quantization)
~1GB RAM for embedding model
License
Available Tools
11 toolscancel_indexingA
Cancel any running indexing job.
The indexing will stop after the current file completes. Partial results are kept in the index.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It effectively communicates that cancellation is not immediate (waits for current file) and that partial results are preserved, providing important context beyond a simple 'cancel.' However, it does not cover potential nuances like idempotency or behavior when no job is running, so it falls short of a perfect score.
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 appropriately sized at three sentences: the first states the core action, and the next two add essential behavioral details. It is front-loaded, avoids redundant phrasing, and every sentence contributes meaning without clutter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema tool, the description adequately covers the operation and its immediate consequences (delayed stop, partial results kept). It could have mentioned behavior when no indexing job is running, but given the tool's simplicity, this is a minor gap and the description is otherwise complete enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, making parameter explanation unnecessary. Schema coverage is trivially 100%, and with no parameters to describe, the description does not need to add any parameter-related information. A baseline of 4 is appropriate for zero-parameter tools.
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 'cancel' and clearly identifies the resource as 'any running indexing job.' It distinguishes from sibling tools like clear_index or pause_watcher by focusing on cancellation of an in-progress job, and the added behavioral details reinforce its specific purpose.
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 explicit guidance on when to use this tool versus alternatives such as pause_watcher or clear_index. The description implies use when you want to stop indexing, but it does not state exclusions or mention alternative tools, leaving the usage context ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_indexA
Clear all indexed data.
Removes all files and chunks from the index. The index will be empty until reindex is called.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It clearly discloses that all files and chunks are removed, and the index becomes empty, with a path to recovery via reindex. This is sufficient for a destructive operation, though it doesn't mention irreversibility explicitly.
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 three short sentences, front-loaded with the action, followed by a detailed explanation and a statement of consequences. There is no wasted text, and the structure is clear and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple parameterless tool, the description covers what it does, the scope (all indexed data), and the recovery mechanism (reindex). It doesn't discuss side effects on other subsystems, but given the tool's narrow purpose, this is complete enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is fully covered (100%). The description adds no parameter-specific detail, but none is needed. Baseline of 4 for zero params 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 clearly states the tool's purpose: 'Clear all indexed data' and 'Removes all files and chunks from the index.' This is a specific verb+resource combination that distinguishes it from siblings like reindex_file or cancel_indexing, which operate on individual items or pending operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by noting the index will be empty until reindex is called, but it does not explicitly state when to use this tool versus alternatives like exclude_paths or cancel_indexing. There is no direct comparison or exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exclude_pathsA
Add paths to exclude from indexing (session-only).
Patterns use glob syntax. Examples:
"node_modules" - exclude any path containing node_modules
"*.test.py" - exclude files ending in .test.py
"vendor/**" - exclude everything under vendor/
Exclusions reset when the server restarts.
| Name | Required | Description | Default |
|---|---|---|---|
| patterns | Yes | Glob patterns to exclude, e.g. ['node_modules', '*.test.py'] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It discloses the session-only nature and reset-on-restart behavior, which is valuable context. However, it does not state whether patterns are appended to existing exclusions, whether exclusions affect the current index immediately, or any matching limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, with the first sentence stating the action and scope. The glob examples are compact and the session-only note is a single line, with no redundant or filler content. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description is adequate, covering purpose, syntax, and lifecycle. It lacks explicit guidance on interaction with sibling tools like include_paths or how exclusions apply to an ongoing indexing session, but the core usage is well covered and the tool is simple.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the 'patterns' parameter with 100% coverage, but the description enriches understanding by explaining glob syntax with concrete examples ('node_modules', '*.test.py', 'vendor/**'). This clarifies how patterns are interpreted beyond the schema's generic description, adding meaningful semantic detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Add paths to exclude from indexing (session-only)' with a specific verb and resource. The session-only qualifier distinguishes it from persistent configuration, and the sibling tool 'include_paths' makes the opposite purpose, so this tool's role is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides practical usage context with glob syntax examples, clearly implying when to use this tool (to exclude paths from indexing). However, it does not explicitly compare to alternative tools like include_paths or mention when not to use it, preventing a top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusA
Get comprehensive server status.
Returns server state, watcher status, indexing progress, index statistics, and current exclusion patterns.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It clearly states that the tool 'Returns' a specific list of status components, implying a read-only operation. This is sufficient transparency for a status getter, though it does not explicitly say 'does not modify server state' or mention potential limitations like staleness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the purpose, and lists the exact return categories without any fluff. Every word contributes meaning, and it is appropriately sized for the tool's simplicity.
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 is extremely simple (no parameters, no output schema), yet the description comprehensively lists all returned data categories, giving the agent enough to decide when to call it and what to expect. Sibling tools do not overlap, so the context is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema has 100% coverage (vacuously). The baseline for 0 parameters is 4. No additional description is needed, and the absence of parameter documentation is not a gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Get comprehensive server status' with a specific verb and resource, and explicitly enumerates the returned data: server state, watcher status, indexing progress, index statistics, and exclusion patterns. This clearly distinguishes it from sibling tools, which are all actions (initialize, reindex, pause_watcher, etc.) rather than status queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context that this tool is for retrieving overall server status, covering multiple aspects. While it does not explicitly mention alternatives or when-not-to-use, the sibling tools are all mutating or search operations, so the usage context is unambiguous. A bit more explicit guidance (e.g., 'Use when you need an overview') would have earned a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
include_pathsA
Remove paths from the exclusion list.
Reverses the effect of exclude_paths for the specified patterns.
| Name | Required | Description | Default |
|---|---|---|---|
| patterns | Yes | Glob patterns to remove from exclusion list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the primary action (removing paths from the exclusion list) and its relationship to exclude_paths, but does not disclose potential side effects, persistence, or error handling for patterns not in the list. It meets the baseline but lacks additional 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?
The description is two concise sentences, front-loaded with the main action and followed by the relationship to the sibling tool. Every word earns its place with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description adequately covers the purpose and relationship to exclude_paths. It is concise and complete enough for its complexity, though it could mention persistence or error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the 'patterns' parameter as 'Glob patterns to remove from exclusion list', providing 100% coverage. The description's reference to 'specified patterns' adds no new meaning beyond what the schema provides, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Remove paths from the exclusion list' with a specific verb and resource, and explicitly differentiates itself from the sibling tool exclude_paths by noting it 'Reverses the effect of exclude_paths'. This makes the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names the alternative tool (exclude_paths) and states this tool reverses its effect, providing clear guidance on when to use it. This qualifies as an explicit alternative reference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
initializeB
Initialize or re-initialize the semantic code search system.
Loads the embedding model and builds or updates the code index. Use force_reindex=True to rebuild the entire index.
Progress will be reported during indexing.
| Name | Required | Description | Default |
|---|---|---|---|
| force_reindex | No | Force full reindex even if files haven't changed |
Output Schema
| Name | Required | Description |
|---|---|---|
| model | Yes | |
| status | Yes | |
| total_chunks | Yes | |
| files_indexed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral disclosure burden. It does mention loading the embedding model, building/updating the index, and reporting progress, but it does not disclose side effects such as replacing an existing index, whether it is safe during active searches, or whether it is asynchronous/cancellable.
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 three concise sentences with the main purpose first. Each sentence adds useful detail: model loading, index building/updating, the force_reindex parameter, and progress reporting. No filler or redundancy.
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 output schema likely covers return values, so that omission is acceptable. However, the description does not explain how this tool relates to siblings like reindex or cancel_indexing, nor does it indicate whether initialization is a long-running background process or how completion is signaled besides progress. This leaves notable contextual 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?
The schema already fully describes the single parameter (force_reindex). The description restates 'rebuild the entire index' but adds little beyond the schema's own 'Force full reindex even if files haven't changed.' Since schema coverage is 100%, the baseline of 3 applies; no meaningful additional semantics are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool initializes or re-initializes the semantic code search system and loads the embedding model to build/update the code index. While it names the resource and action specifically, it does not explicitly differentiate itself from the sibling 'reindex' tool, which could overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lacks guidance on when to use this tool versus alternatives like reindex, reindex_file, or clear_index. It only explains when to set force_reindex=True, which is parameter-level instruction, not usage context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_watcherA
Pause the file watcher.
Events that occur while paused are discarded. Use resume_watcher to start watching again.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosure. It reveals the critical side effect that events occurring while paused are discarded, which is essential behavioral information. It does not, however, mention idempotence or behavior if already paused.
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?
Three tight sentences cover action, consequence, and recovery. There is no wasted verbiage, and the main verb is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter state-toggle tool, the description is complete: what it does, what happens while paused, and how to undo it. Sibling context and the absence of an output schema further reduce needed detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing to explain beyond the schema. The description correctly avoids adding meaningless parameter details.
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 the specific verb 'Pause' and names the resource 'file watcher', making the action unmistakable. It also distinguishes this tool from its sibling 'resume_watcher' by clearly presenting the opposite operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly directs the user to 'resume_watcher' to start watching again, providing a direct alternative. It also notes that events are discarded, which implies it should not be used if event preservation is required, though this is not framed as an explicit when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reindexA
Start a full reindex of the codebase.
Runs in the background - use get_status to monitor progress. Use cancel_indexing to abort if needed.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Force reindex even if files haven't changed | |
| clear_first | No | Clear all existing index data before reindexing |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It reveals that the operation runs in the background and mentions monitoring and cancellation pathways, adding useful context. It does not elaborate on side effects like whether the index becomes unavailable, but the schema covers the 'clear_first' option.
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 exceptionally concise, consisting of three short sentences. It front-loads the purpose in the first sentence, then provides actionable follow-up guidance (monitor, cancel). Every sentence earns its place without unnecessary detail.
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 description adequately covers the start action, background execution, monitoring, and cancellation. For a tool with two optional parameters and no output schema, this is sufficient for an agent to select and invoke it correctly. Minor gap: it does not mention potential impact on existing index availability during reindexing, but this is not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters 'force' and 'clear_first' clearly documented in the input schema. The description adds no additional parameter-specific semantics, but this is not required given the high schema coverage. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Start a full reindex of the codebase.' This specifies the verb (start), resource (codebase), and scope (full reindex), distinguishing it from the sibling tool 'reindex_file' which implies a partial reindex.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly directs the agent to use 'get_status' for monitoring and 'cancel_indexing' for aborting, providing clear operational context. However, it does not mention when to use an alternative like 'reindex_file' or when a full reindex is unnecessary, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reindex_fileA
Re-index a specific file for search.
Use when a file has been modified but not yet re-indexed, or when you want to force a refresh of a file's embeddings.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Force reindex even if unchanged | |
| file_path | Yes | Path to file to reindex |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the full burden of behavioral disclosure. It states the action ('re-index') and mentions 'embeddings,' which hints at the underlying mechanism, but it does not disclose side effects (e.g., impact on the search index while indexing), whether it is idempotent, or any required permissions. This is a moderate level of transparency for a state-changing operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action followed by usage guidance. Every word serves a purpose with no redundancy or filler, achieving an ideal structure for a tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool, the description covers the basic purpose and usage, and the schema handles parameter details. However, there is no output schema and the description does not explain what the tool returns (e.g., success/failure, status) or mention any preconditions like the indexing system being initialized. Given the lack of annotations, this leaves some gaps for an agent deciding how to interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes both parameters (file_path: 'Path to file to reindex'; force: 'Force reindex even if unchanged') with 100% coverage. The description adds no additional meaning beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Re-index a specific file for search') with a specific resource ('specific file') and purpose ('for search'). It distinguishes itself from sibling tools like 'reindex' by focusing on a single file, and mentions 'force a refresh of a file's embeddings' for additional specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit contexts for use: 'when a file has been modified but not yet re-indexed' or 'when you want to force a refresh.' It implies this is for individual files rather than a bulk reindex, but does not explicitly mention when not to use it or name alternative tools, stopping 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.
resume_watcherA
Resume the file watcher after pausing.
Starts watching for file changes again.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It only states the basic action, but fails to mention what happens if the watcher is already running (idempotency), error conditions, or any side effects. The behavior is under-specified for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, two short sentences, and directly addresses the tool's purpose. Every word earns its place, with no filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple no-parameter tool, the description adequately states the core action. However, given the lack of annotations and output schema, it leaves gaps around state prerequisites (must be paused), error behavior, and the overall impact on the watcher, making it a minimum viable description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the input schema is empty, so there are no parameter semantics to explain. Per the rubric, a baseline of 4 is appropriate when there are no parameters, and the description does not need to add anything further.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Resume the file watcher' and 'Starts watching for file changes again.' It is specific to the resume operation and distinguishes itself from the sibling tool 'pause_watcher' by being the direct opposite action.
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 phrase 'after pausing' implies this tool is used to restart a watcher that was previously paused, providing some context. However, there is no explicit guidance on when to use it versus alternatives, nor does it state any prerequisites like 'only works when the watcher is paused.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_codeA
Search the codebase using semantic similarity.
Use natural language descriptions of code you're looking for:
"function that handles user authentication"
"error handling for HTTP requests"
"database connection initialization"
"unit tests for the payment service"
Returns ranked code snippets with file locations and relevance scores. Combines vector similarity with keyword search for best results.
Best for: Finding functions/classes by purpose or behavior. Not for: Exact pattern matching or finding all occurrences of a variable. Use Grep for exact patterns; use semantic search to find relevant files first.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural language search query | |
| language | No | Filter by language: python, javascript, typescript, etc. | |
| min_score | No | Minimum relevance score threshold (0-1) | |
| chunk_type | No | Filter by type: function, class, method, module | |
| max_results | No | Maximum results to return (1-50) | |
| file_pattern | No | Glob pattern to filter files, e.g., '**/*_test.py' |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| status | No | Server status: initializing, ready, or error |
| matches | Yes | |
| total_count | Yes | |
| search_time_ms | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses that the tool 'Combines vector similarity with keyword search' and 'Returns ranked code snippets with file locations and relevance scores.' It does not mention potential side effects or prerequisites like index freshness, but for a search tool this is reasonable 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?
Well-structured with a clear lead sentence, useful examples, return details, and 'Best/Not for' sections. Each sentence earns its place; no fluff despite being longer than average.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema already defines return structure, the description covers purpose, usage patterns, behavioral nuances, and comparison with alternatives. It is complete for an agent to decide when to invoke it and what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by providing concrete query examples and explaining the combined vector+keyword behavior, which informs how to set min_score and query parameters beyond the schema's simple descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence, 'Search the codebase using semantic similarity,' clearly states a specific verb (search), resource (codebase), and method (semantic similarity). Examples and 'Best for' section further clarify it finds functions/classes by purpose, distinguishing it from sibling tools which are indexing/lifecycle tools.
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?
Explicitly provides 'Best for' and 'Not for' sections, and names an alternative ('Use Grep for exact patterns') with a workflow suggestion ('use semantic search to find relevant files first'). This is clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
initialize and reindex both appear to trigger full index builds, making their boundaries unclear and causing potential misselection. Other tools like search_code, pause_watcher, and exclude_paths are well-distinguished, but the core indexing pair introduces significant ambiguity.
Most tools follow a consistent verb_noun pattern (e.g., search_code, reindex_file, pause_watcher, get_status). However, initialize and reindex are standalone verbs that break the pattern, creating a minor but noticeable deviation.
11 tools is well within the ideal range for a domain-specific server. Each tool contributes to searching, indexing, or management, and there is no obvious redundancy or bloat.
The server covers the core search and indexing lifecycle, including search, full/partial indexing, and clearing. However, it lacks a way to remove a single file from the index, and exclude_paths does not retroactively affect already-indexed content, leaving notable gaps for handling file deletions.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Code intelligence for coding agents: semantic, AST, graph, and full-text search. 279+ languages.
Code intelligence for LLMs. Analyze, search, and retrieve code from any public git repository.
Ask a codebase what calls what: search, blast radius, paths between symbols, and diffs.
Shared memory for coding agents. Stop re-explaining your codebase every session.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides semantic code search capabilities that run 100% locally using EmbeddingGemma embeddings. Enables finding code by meaning across 15 file extensions and 9+ programming languages without API costs or sending code to the cloud.236
- AlicenseAqualityDmaintenanceEnables semantic code search across local projects and Git repositories using AI embeddings with ChromaDB. Supports both OpenAI and local Ollama models for private, enterprise-ready code analysis and similar code discovery.44MIT
- AlicenseAqualityFmaintenanceProvides intelligent semantic code search using local AI embeddings, enabling natural language queries to find relevant code by meaning rather than exact keywords. Indexes codebases in the background with smart project detection and privacy-first local processing.639199MIT
- FlicenseNot gradedqualityDmaintenanceEnables local semantic code search across repositories using natural language, with AST-aware chunking and hybrid vector/FTS5 retrieval.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/adam-hanna/semantic-search-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server