Skip to main content
Glama
QkartBismuth

Bismut Vector MCP

by QkartBismuth

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

node:sqlite + sqlite-vec

Zero native compilation. The extension ships as a prebuilt npm optional dependency, so npm install is enough on every platform.

Local ONNX embeddings

No API keys, no network, no data leaving the machine. Works offline.

Xenova/paraphrase-multilingual-MiniLM-L12-v2

384 dimensions, handles 50+ languages well. Measured much better separation than multilingual-e5-small (0.66 vs -0.01 for related/unrelated pairs, against 0.90 vs 0.78).

Cosine distance

Vectors are L2-normalized, so cosine similarity is exact and scores are directly interpretable: 1.0 is identical, 0.0 is orthogonal.

One vec0 table per collection

Lets different collections use different models and dimensions.

Related MCP server: lore-mcp

Install

npm install
npm run build

Requires 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-project

That 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 overrides

  • examples/claude.md — Claude Code and Desktop

  • examples/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_paths

Index files or directories. Re-running skips unchanged files.

index_text

Index arbitrary text: notes, memory, logs, pasted context.

search

Semantic search with path, language, and kind filters.

get_context

Expand a search hit into surrounding chunks.

get_chunk

Fetch one chunk in full.

list_sources

List what is indexed.

list_collections

List collections with model, dimension, and counts.

delete_sources

Remove documents by id, exact path, or path prefix.

drop_collection

Delete a whole collection. Requires confirm: true.

stats

Server, database, and embedding model diagnostics.

A typical agent session:

  1. index_paths on the repository once.

  2. search with a path filter instead of guessing filenames.

  3. get_context when 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/class blocks 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

BISMUT_DB_PATH

./.bismut/vectors.db

SQLite database file

BISMUT_CACHE_DIR

<db dir>/cache

Model download cache

BISMUT_COLLECTION

default

Default collection name

BISMUT_EMBED_MODEL

Xenova/paraphrase-multilingual-MiniLM-L12-v2

Any transformers.js model

BISMUT_EMBED_DTYPE

q8

q8, fp16, fp32, quantized

BISMUT_EMBED_DEVICE

cpu

cpu, gpu, auto

BISMUT_EMBED_PROVIDER

local

local or openai

BISMUT_BATCH_SIZE

16

Embeddings per forward pass

BISMUT_CHUNK_TOKENS

320

Target chunk size

BISMUT_CHUNK_OVERLAP

60

Overlap between chunks

BISMUT_MAX_FILE_BYTES

1048576

Skip files larger than this

BISMUT_LOG_LEVEL

info

silent, error, warn, info, debug, trace

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 model

npm 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 impl or class body stay in one chunk until they exceed the token target.

  • index_paths walks directories serially, which is fast enough for typical repositories but noticeable on very large monorepos.

  • PDF indexing uses unpdf and 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 minScore deliberately and use path filters to narrow.

Available Tools

10 tools
delete_sourcesDelete indexed documentsA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
allNoDelete the entire collection contents when true. Requires "all": true.
urisNoExact document paths to delete.
collectionNoCollection name. Defaults to "default".
uriPrefixesNoDelete all documents whose path starts with any prefix.
document_idsNoDocument ids to delete.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 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.

Purpose4/5

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.

Usage Guidelines3/5

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 collectionA
DestructiveIdempotent

Permanently delete an entire collection and all its vectors, chunks, and documents. Irreversible. Prefer delete_sources when removing only some documents.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true. Pass confirm:true to acknowledge permanent deletion.
collectionYesCollection name to drop.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 chunkA
Read-onlyIdempotent

Return the full untruncated text of one chunk by its id, with its document metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
chunk_idYesChunk id from a search result.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 contextA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoChunks to include after. Default 1.
beforeNoChunks to include before. Default 1.
ordinalNoChunk ordinal from a search result.
chunk_idNoChunk id from a search result.
maxCharsNoTotal character budget for returned text. Default 12000.
document_idNoDocument id from a search result.

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 foldersA
Idempotent

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoRe-embed even if content is unchanged. Default false.
pathsYesAbsolute or cwd-relative file/directory paths to index.
pruneNoRemove documents under these roots that no longer exist on disk. Default false.
excludeNoExtra glob exclusions, e.g. ["**/fixtures/**", "**/*.test.ts"].
includeNoGlob filters, e.g. ["**/*.ts", "**/*.md"]. Empty means all supported files.
maxFilesNoSafety cap on files per run. Default 5000.
recursiveNoRecurse into subdirectories. Default true.
collectionNoTarget collection. Defaults to "default".
respectGitignoreNoHonor .gitignore files. Default true.

TDQS

A4.2/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 textA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesStable identifier for this content, e.g. "memory/2026-10-01.md".
kindNoContent kind for filtering: "text", "note", "memory", "log", "spec". Default "text".
metaNoArbitrary JSON metadata stored with the document.
textYesThe text content to index.
titleNoHuman-readable title used to enrich embeddings.
replaceNoDelete existing content for this uri first. Default true.
collectionNoTarget collection. Defaults to "default".

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 collectionsA
Read-onlyIdempotent

List all vector collections with their embedding model, dimensionality, document/chunk counts, and on-disk size.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 documentsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax documents to return. Default 100.
offsetNoPagination offset. Default 0.
uriPrefixNoOnly list documents whose path starts with this prefix.
collectionNoCollection name. Defaults to "default".

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines5/5

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.

statsServer and database statisticsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 10 tool updatesv0.0.1
    • First observeddelete_sources
    • First observeddrop_collection
    • First observedget_chunk
    • First observedget_context
    • First observedindex_paths
    • First observedindex_text
    • First observedlist_collections
    • First observedlist_sources
    • First observedsearch
    • First observedstats

TDQS

A4.1/5.0

Scored across 10 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Local-first RAG indexing and semantic search MCP server. Enables document retrieval and context-aware queries using local embedding models.
    3
    5 npm
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Indexes local Markdown/text files into a SQLite database with vector embeddings and provides MCP tools for semantic search without cloud dependencies.
    3
    AGPL 3.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides MCP tools for semantic search over personal knowledge sources using pluggable embeddings and local vector indexing.
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    5
    MIT