Bismut Vector MCP
Supports Ollama as an OpenAI-compatible embedding provider, enabling local embedding generation through Ollama's API.
Allows using OpenAI's embedding API to generate vector embeddings, providing a cloud-based alternative to local ONNX models. Supports any OpenAI-compatible endpoint via BISMUT_API_BASE.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Bismut Vector MCPindex my project and search for authentication logic"
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.
Bismut Vector MCP
A local vector database exposed over the Model Context Protocol. Works with any MCP client: opencode, Claude Code/Desktop, Hermes, Cursor, Zed, Windsurf, and anything else that speaks MCP over stdio.
Everything runs on your machine. Embeddings are computed in-process with a local ONNX model, vectors live in a single SQLite file, and nothing is sent over the network.
Why it is built this way
Choice | Reason |
| Zero native compilation. The extension ships as a prebuilt npm optional dependency, so |
Local ONNX embeddings | No API keys, no network, no data leaving the machine. Works offline. |
| 384 dimensions, handles 50+ languages well. Measured much better separation than |
Cosine distance | Vectors are L2-normalized, so cosine similarity is exact and scores are directly interpretable: |
One | Lets different collections use different models and dimensions. |
Related MCP server: lore-mcp
Install
npm install
npm run buildRequires Node 22.5+ (uses the built-in node:sqlite). Developed and tested on
Node 24.
The embedding model downloads once on first use (~120 MB) into
.bismut/cache. Later runs start instantly and work offline.
Connect an editor
Registered in opencode's global config (~/.config/opencode/opencode.jsonc) as
bismut-vector. Verify any time:
npm run verify:opencode
npm run verify:opencode -- /path/to/some-projectThat reads your live opencode config, walks every registered server, and performs a real MCP handshake with the exact command and environment values it finds there.
For other editors, copy the block from examples/:
examples/opencode.json— opencode scope and overridesexamples/claude.md— Claude Code and Desktopexamples/other-editors.md— Cursor, Zed, Windsurf, Hermes, others
The common shape is:
{
"mcpServers": {
"bismut-vector": {
"command": "node",
"args": ["/absolute/path/to/Bismut_MCP_Vector/dist/index.js"],
"env": { "BISMUT_COLLECTION": "myproject" }
}
}
}opencode config is reloaded on restart, not hot-reloaded.
Tools
Tool | Purpose |
| Index files or directories. Re-running skips unchanged files. |
| Index arbitrary text: notes, memory, logs, pasted context. |
| Semantic search with path, language, and kind filters. |
| Expand a search hit into surrounding chunks. |
| Fetch one chunk in full. |
| List what is indexed. |
| List collections with model, dimension, and counts. |
| Remove documents by id, exact path, or path prefix. |
| Delete a whole collection. Requires |
| Server, database, and embedding model diagnostics. |
A typical agent session:
index_pathson the repository once.searchwith a path filter instead of guessing filenames.get_contextwhen a result looks truncated mid-function.
Chunking
Chunking is language-aware, which matters more for retrieval quality than embedding model choice:
Markdown splits on headings and carries the heading breadcrumb (
Architecture > Embeddings) into every chunk.Code splits at top-level symbol boundaries, tracking brace depth while skipping strings, template literals, and comments. One function or class per chunk, named in the chunk header. Python and other indent languages split on
def/classblocks instead.Prose and config files pack paragraphs up to a token target with overlap.
Every chunk embeds with a header (file:, title:, lang:, and the symbol
name) prepended to its body. This measurably improves retrieval for short chunks,
where the body alone gives the embedder too little to work with.
Line ranges are preserved on every chunk, so results can be opened directly.
Configuration
All settings are environment variables. Optionally use a .bismutrc.json in the
working directory instead.
Variable | Default | Meaning |
|
| SQLite database file |
|
| Model download cache |
|
| Default collection name |
|
| Any transformers.js model |
|
|
|
|
|
|
|
|
|
|
| Embeddings per forward pass |
|
| Target chunk size |
|
| Overlap between chunks |
|
| Skip files larger than this |
|
|
|
To use a cloud embedding endpoint instead:
{
"BISMUT_EMBED_PROVIDER": "openai",
"BISMUT_EMBED_MODEL": "text-embedding-3-small",
"BISMUT_API_KEY": "sk-...",
"BISMUT_API_BASE": "https://api.openai.com/v1"
}BISMUT_API_BASE works with any OpenAI-compatible endpoint (Ollama,
LM Studio, vLLM).
Changing the model changes the vector dimensionality, so it requires a new collection. The server refuses to mix models within one collection rather than silently producing nonsense results.
Storage layout
A collection's vectors live in its own vec0 virtual table. Chunk text and
document metadata live in ordinary tables, joined on the vector row id.
Filters are resolved to a doc_id list before the vector query, so path and
language filters are applied during the ANN traversal rather than after k is
taken. Applying them afterwards is the classic sqlite-vec mistake: it returns
empty results whenever the nearest k neighbours happen to fall outside the
filter.
Embeddings are cached by content hash, so re-indexing only re-embeds what actually changed.
Development
npm run typecheck # tsc --noEmit with strict + unused checks
npm test # 49 end-to-end assertions over the real MCP protocol
npm run test:chunks # print chunk boundaries per language
node scripts/probe-embed.mjs # check embedding quality for a modelnpm test spawns the built server as a subprocess and drives it with a real MCP
client, so it exercises the actual stdio transport, JSON-RPC framing, and zod
schema conversion rather than calling internals.
Known limits
Chunking uses structural heuristics, not a full parser. It is accurate for normal source files but not a substitute for an AST. Nested blocks inside a large
implor class body stay in one chunk until they exceed the token target.index_pathswalks directories serially, which is fast enough for typical repositories but noticeable on very large monorepos.PDF indexing uses
unpdfand only reads text layers. Scanned PDFs yield nothing; there is no OCR.There is no hybrid keyword/vector search. Pure semantic search can miss an exact identifier string, so pass
minScoredeliberately and use path filters to narrow.
Available Tools
10 toolsdelete_sourcesDelete indexed documentsADestructiveIdempotent
Remove documents from a collection by document id, exact uri, or path prefix. Vectors and chunks are deleted together. This is irreversible and requires at least one selector.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Delete the entire collection contents when true. Requires "all": true. | |
| uris | No | Exact document paths to delete. | |
| collection | No | Collection name. Defaults to "default". | |
| uriPrefixes | No | Delete all documents whose path starts with any prefix. | |
| document_ids | No | Document ids to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive and idempotent, but the description adds real value beyond them: chunks and vectors are removed together, the effect is irreversible, and a selector is mandatory. It does not describe what happens to non-matching documents or any partial-failure behavior.
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 short sentences, front-loaded with what is deleted and how it is selected, then the side effect, then the hard constraint. No filler.
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 mutation tool with no output schema, annotations plus description cover safety (destructive/irreversible), scope (scoped selectors), and side effects (chunks/vectors). The main omission is the collection-wide 'all' path, which overlaps ambiguously with the sibling drop_collection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters, making 3 the baseline. The prose names the selector kinds (id, exact uri, path prefix) but omits the collection default and the collection-wide 'all' flag, adding little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Remove) plus resource (documents from a collection) and the three selector modes. It is clear this is a scoped document deletion, distinct from list_sources/list_collections, though it never contrasts itself with drop_collection or explains the collection-wide "all" mode the schema exposes.
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 precondition 'requires at least one selector' tells the agent how to invoke it validly, and 'irreversible' warns of consequence. However it gives no when-to-use vs. siblings (drop_collection for whole collections) and no guidance on choosing between id, uri, and prefix selectors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drop_collectionDrop a collectionADestructiveIdempotent
Permanently delete an entire collection and all its vectors, chunks, and documents. Irreversible. Prefer delete_sources when removing only some documents.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Must be true. Pass confirm:true to acknowledge permanent deletion. | |
| collection | Yes | Collection name to drop. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds meaningful context beyond that: it stresses the operation is irreversible and enumerates what is destroyed (vectors, chunks, documents). It does not, however, mention auth requirements or confirm-gating behavior beyond the schema.
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 short sentences, front-loaded with the destructive action and its scope, followed by the irreversibility warning and the routing guidance. No filler.
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 two-parameter destructive tool with no output schema and full annotation coverage, the description supplies everything needed: scope of deletion, irreversibility, and the alternative tool. Nothing an agent needs to call it correctly is missing.
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% and 'confirm' is already documented as needing to be true in the schema itself. The description adds no parameter-level detail, so the baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (delete) plus resource (entire collection) with explicit scope: 'all its vectors, chunks, and documents.' It names the sibling tool delete_sources as the contrasting option, so an agent can distinguish it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit when-not-to-use rule: 'Prefer delete_sources when removing only some documents.' This routes the agent to the correct alternative based on a clear condition, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chunkFetch a single chunkARead-onlyIdempotent
Return the full untruncated text of one chunk by its id, with its document metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| chunk_id | Yes | Chunk id from a search result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, non-open-world). The description adds genuinely new behavioral context by disclosing what is returned: the full untruncated text and accompanying document metadata, which is not derivable from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The resource, the scope ('one chunk'), and the return content all land in one pass.
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 one-parameter read tool with no output schema, the description covers what is returned (untruncated text plus metadata) adequately. It omits any note about behavior when the id is invalid or missing, which is a minor gap.
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% and there is only one parameter, so the schema fully documents chunk_id. The description's 'by its id' adds no syntax or format detail beyond that, making the baseline 3 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?
States a specific verb (return/fetch) and resource (one chunk's full untruncated text plus document metadata), which is precise. It implicitly differentiates from the 'search' sibling by emphasizing 'full untruncated' text, but never names the alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit when-to-use statement; the usage is only implied by the schema note that chunk_id comes 'from a search result.' An agent can infer the lookup-after-search workflow but must do so itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contextExpand a search hit into surrounding contextARead-onlyIdempotent
Return contiguous chunks around a search hit (by chunk_id or document_id + ordinal) so you can read a whole function/section instead of an isolated fragment. Use after search when a result looks cut off.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Chunks to include after. Default 1. | |
| before | No | Chunks to include before. Default 1. | |
| ordinal | No | Chunk ordinal from a search result. | |
| chunk_id | No | Chunk id from a search result. | |
| maxChars | No | Total character budget for returned text. Default 12000. | |
| document_id | No | Document id from a search result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered structurally. The description usefully discloses that it returns contiguous surrounding chunks rather than isolated fragments, but says nothing about budget truncation behavior (maxChars), pagination, or size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: purpose and addressing first, then the usage trigger. No filler, and the key routing information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only expander with full schema coverage and annotations carrying the safety profile, the description covers what it returns and when to use it. It lacks output-format/pagination detail, but with no output schema that gap is minor.
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 meaningfully adds that the hit can be addressed either by chunk_id OR by document_id + ordinal, which the schema lists as independent optional fields without stating they are alternative addressing modes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Return) and resource (contiguous chunks around a search hit) and clarifies the value: reading a whole function/section. It is clearly distinguishable from siblings like search (which finds fragments) and get_chunk.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use after `search` when a result looks cut off" gives a clear trigger condition and sequences it relative to a sibling. It stops short of explicitly naming alternatives (e.g., get_chunk) or when not to use it, so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_pathsIndex files and foldersAIdempotent
Index files or directories into a vector collection for semantic search. Safe to re-run: files whose content hash is unchanged are skipped. Honors .gitignore, skips binaries/oversized files, and uses language-aware chunking (markdown sections, code symbols, prose paragraphs).
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Re-embed even if content is unchanged. Default false. | |
| paths | Yes | Absolute or cwd-relative file/directory paths to index. | |
| prune | No | Remove documents under these roots that no longer exist on disk. Default false. | |
| exclude | No | Extra glob exclusions, e.g. ["**/fixtures/**", "**/*.test.ts"]. | |
| include | No | Glob filters, e.g. ["**/*.ts", "**/*.md"]. Empty means all supported files. | |
| maxFiles | No | Safety cap on files per run. Default 5000. | |
| recursive | No | Recurse into subdirectories. Default true. | |
| collection | No | Target collection. Defaults to "default". | |
| respectGitignore | No | Honor .gitignore files. Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false). The description goes well beyond them, disclosing content-hash skip semantics on re-run, .gitignore honoring, binary/oversized-file skipping, and language-aware chunking strategy. This is exactly the operational context an agent needs before invoking a bulk mutation.
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 sentences, zero filler, and the primary action is front-loaded before the safety and filtering behaviors. Every clause carries distinct 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 nine-parameter bulk mutation with no output schema, the description covers behavior and safety well. The only gap is what the call returns (e.g., counts of indexed/skipped/pruned files), which matters here since no output schema exists to fill that in.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the nine parameters is already documented in the schema. The description restates .gitignore honoring but adds no format, default, or interaction detail 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (index) and resource (files or directories) plus the destination (a vector collection) and outcome (semantic search). This is clearly distinguishable from the sibling index_text, which operates on raw text rather than paths.
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?
Usage context is implied by 'into a vector collection for semantic search,' but the description never says when to choose this over index_text or search, nor does it state prerequisites (index must exist, collection must exist). Guidance is present but inferential rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_textIndex raw textAIdempotent
Index arbitrary text (notes, snippets, memory entries, error logs, user-provided context) into a collection. Use a stable uri to replace previous content for the same uri, or pass replace:false to append a new version.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | Stable identifier for this content, e.g. "memory/2026-10-01.md". | |
| kind | No | Content kind for filtering: "text", "note", "memory", "log", "spec". Default "text". | |
| meta | No | Arbitrary JSON metadata stored with the document. | |
| text | Yes | The text content to index. | |
| title | No | Human-readable title used to enrich embeddings. | |
| replace | No | Delete existing content for this uri first. Default true. | |
| collection | No | Target collection. Defaults to "default". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent, non-destructive, closed-world. The description adds the key behavioral nuance the annotations cannot express: default replace:true deletes existing content for the same uri, while replace:false appends. That upsert-vs-append distinction is exactly the kind of context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first establishes scope, the second delivers the replace/append rule. Nothing is redundant and the actionable guidance 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?
With no output schema and seven parameters, the description covers the purpose and the one parameter choice that materially changes behavior. It does not mention return values or interaction with collection/kind filtering, but nothing critical to a correct call is missing.
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 the baseline is 3. The description goes slightly beyond the schema by framing replace:false as 'append a new version' and tying uri to stable replacement, clarifying intent rather than restating the field. Most parameter detail, however, still lives in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('index arbitrary text ... into a collection') and enumerates the content types it handles (notes, snippets, memory, logs), which implicitly separates it from index_paths. It never explicitly names the sibling it is not, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational guidance: reuse a stable uri to replace prior content, or pass replace:false to append a version. This tells the agent how to achieve both upsert and versioning. It stops short of saying when to prefer index_paths or search over this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_collectionsList collectionsARead-onlyIdempotent
List all vector collections with their embedding model, dimensionality, document/chunk counts, and on-disk size.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely new context by enumerating what is returned (embedding model, dimensionality, document/chunk counts, on-disk size), which is valuable since no output schema exists. It omits any mention of ordering or behavior on an empty collection set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource comes first and the returned fields follow. Every clause 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?
With no output schema, the description must carry the return-value burden, and it does by naming the five fields the agent will receive. For a no-parameter, read-only listing tool with full annotation coverage, nothing needed to call it correctly is missing.
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 takes zero parameters, so the baseline is 4. There are no parameter semantics to clarify, and the description correctly spends no words on inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List all vector collections") plus the exact attributes returned, so the agent knows this is a collection inventory rather than a search or stats call. It does not explicitly contrast itself with siblings such as list_sources or stats, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implicit rather than stated: a zero-parameter, read-only listing tool has an obvious call condition, and there is only one collection-listing sibling. However, there is no explicit when/when-not guidance or named alternative (e.g. use stats for aggregate metrics).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sourcesList indexed documentsARead-onlyIdempotent
List documents already indexed in a collection, with chunk counts and sizes. Use to check what is available before searching, or to confirm an index_paths run covered what you expected.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max documents to return. Default 100. | |
| offset | No | Pagination offset. Default 0. | |
| uriPrefix | No | Only list documents whose path starts with this prefix. | |
| collection | No | Collection name. Defaults to "default". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds only that results include chunk counts and sizes and are collection-scoped, which is modest added value beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, no filler. The inventory purpose is front-loaded and the usage guidance follows immediately, with nothing that fails to earn 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 read-only listing tool with a fully documented schema and no output schema, the description supplies what the agent needs: what is listed, what comes back (chunk counts and sizes), and when to reach for it. Pagination is handled by the documented limit/offset parameters. Little is missing.
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% — limit, offset, uriPrefix and collection are all documented with defaults and constraints in the schema itself. The description adds nothing about parameter formats or interactions, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List documents already indexed in a collection') and adds the returned fields (chunk counts and sizes). It implicitly separates itself from list_collections and search by scoping to indexed documents, but never names a sibling to sharpen the distinction.
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?
Gives two concrete when-to-use scenarios and names the sibling tools they pair with: pre-search inventory ('before searching') and post-index verification ('confirm an index_paths run covered what you expected'). An agent can route to this tool without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSemantic searchARead-onlyIdempotent
Run a semantic similarity query against indexed content. Returns ranked chunks with file path, line range, score (cosine similarity, 1 = identical), and text. Supports narrowing by path prefix, exact path, language, and content kind. Increase limit or use get_context when results look truncated.
| Name | Required | Description | Default |
|---|---|---|---|
| uris | No | Exact paths to restrict to. | |
| kinds | No | Content kind filter, e.g. ["file", "note"]. | |
| limit | No | Max results. Default 10. | |
| query | Yes | Natural-language query or search phrase. | |
| minScore | No | Drop results below this cosine score, e.g. 0.3 to cut noise. | |
| languages | No | Language filter, e.g. ["ru", "en"]. | |
| collection | No | Collection to search. Defaults to "default". | |
| includeText | No | Include chunk text in the response. Default true. | |
| uriPrefixes | No | Path prefixes to restrict to, e.g. ["src/", "docs/architecture"]. | |
| maxCharsPerChunk | No | Truncate each chunk's text to this many characters. Default 2000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, non-destructive, and closed-world. The description adds useful behavioral context: ranked output with cosine scores, file path, line range, truncation behavior, and the remedy of increasing limit or switching to get_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?
Three compact sentences, front-loaded with the core action and followed by return shape, filters, and truncation guidance. Every sentence contributes usable 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 ten-parameter semantic search tool with full schema coverage and annotations covering safety, the description is complete: it explains purpose, return values, filter scope, and what to do when results are truncated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all ten parameters are already documented in the schema. The description summarizes the filter categories (path prefix, exact path, language, content kind) and mentions limit, but it adds no syntax or default details beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: 'Run a semantic similarity query against indexed content.' It distinguishes this from retrieval alternatives by naming get_context for follow-up context when results are truncated.
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?
It gives a clear usage cue: increase limit or use get_context when results look truncated. It also notes available narrowing filters, but it does not explicitly contrast when to use this tool versus other sibling search/index tools beyond the truncation case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statsServer and database statisticsARead-onlyIdempotent
Show database path, embedding model/provider, collection count, and totals. Useful for verifying the server is healthy and which model is active before diagnosing empty search results.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds value beyond that by disclosing exactly what information the call yields, which matters since there is no output schema, though it says nothing about cost, pagination, or failure modes (harmless for a zero-arg stat read).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler, and the returned-fields summary is front-loaded before the use case. Every clause 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?
With no output schema, the description carries the return-value burden and does so by enumerating the fields an agent gets back, plus the health-check use case. For a zero-parameter read tool with full annotation coverage, nothing needed to call it correctly is missing.
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 takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate and it correctly avoids inventing parameter 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?
States a specific verb ('Show') and enumerates the exact resources returned: database path, embedding model/provider, collection count, and totals. The scope is clearly server-level rather than collection-level, but it never names or contrasts itself with the overlapping sibling list_collections, so sibling differentiation is left to inference.
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?
Gives a concrete when-to-use context: verifying server health and the active model before diagnosing empty search results. That is a clear scenario, but no exclusions or explicit alternative tools (e.g., list_collections) are mentioned, so it stops short of full routing 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.
10 tool updates
v0.0.1- First observed
delete_sources - First observed
drop_collection - First observed
get_chunk - First observed
get_context - First observed
index_paths - First observed
index_text - First observed
list_collections - First observed
list_sources - First observed
search - First observed
stats
TDQS
Scored across 10 tools
Most tools have clearly distinct roles (index_paths vs index_text differ by source type, and list_sources vs list_collections differ by resource). The only mild overlap is between get_context and get_chunk, which both retrieve fuller content, though their descriptions distinguish fragment-level vs surrounding-context use.
Nearly all names follow a verb_noun pattern (list_collections, index_paths, delete_sources, drop_collection, get_chunk). Minor deviations are the bare single-word tools `search` and `stats`, but the overall convention is readable and predictable.
Ten tools is well within the ideal range and each one maps to a distinct stage of the index/search/retrieve lifecycle. No tool feels redundant or superfluous.
The surface covers the full lifecycle: indexing (paths/text), discovery (collections/sources), search, context retrieval (get_context/get_chunk), and deletion (delete_sources/drop_collection) plus health via stats. The main gap is an explicit create_collection or metadata-update operation, but these are likely handled implicitly by indexing.
Maintenance
Related MCP Connectors
Agentic search over your Dewey document collections from any MCP-compatible client.
Private-by-default, local-first memory/context/task orchestrator for MCP apps and agents.
Personal knowledge base MCP server with semantic search, auto-categorization, metadata extraction
Agent-driven search: build, import, tune, search, and score result quality — all over MCP.
Related MCP Servers
- AlicenseAqualityDmaintenanceLocal-first RAG indexing and semantic search MCP server. Enables document retrieval and context-aware queries using local embedding models.35 npmMIT
- AlicenseAqualityBmaintenanceIndexes local Markdown/text files into a SQLite database with vector embeddings and provides MCP tools for semantic search without cloud dependencies.3AGPL 3.0
- AlicenseNot gradedqualityAmaintenanceProvides MCP tools for semantic search over personal knowledge sources using pluggable embeddings and local vector indexing.1MIT
- AlicenseAqualityBmaintenanceEnables natural-language semantic search over your own local files through an MCP server, fully offline without API keys or a server daemon, with optional LLM-grounded answers and exact file:line sources.5MIT