A semantic vector database MCP server that searches a local document collection by semantic similarity using Ollama embeddings
SVDB MCP exposes 8 nearly-identical search tools (search_svdb_1 through search_svdb_8) that differ only in result count. This violates the single-responsibility principle and creates massive redundancy. All tools share identical descriptions with only the {count} placeholder varying. While descriptions are detailed (explaining trigger markers and query behavior), the schema is minimal: each tool accepts only a 'query' string parameter with basic description. No output schema is documented. The tool design forces users to choose between 8 variants when a single parameterized tool with a 'top_k' parameter would be clearer and more maintainable. Naming is verb-based (search_svdb_*) but the numeric suffixes are not self-documenting, LLMs cannot infer what search_svdb_3 does without reading the description.
Search the local document collection by semantic similarity and return the passages that match best. Returns the top 1 passages, each with its source file name. TRIGGER (strict): call this tool only when the latest user message encloses a term in double square brackets, like [[term]]. That marker is the only thing that authorizes a search. Nothing else is a trigger: plain unmarked text, quoted text, single brackets [term], and any backtick or code formatting must never call this tool, no matter how much the question looks like it needs reference material. With no [[term]] present in the latest user message, answer from the conversation and your own knowledge instead. Args: query: The exact text found between [[ and ]], and nothing else. Do not append the surrounding topic words: extra words blur the match and surface general overview passages instead of the exact section. If the first result set misses, you may search again with a reworded query.
Search the local document collection by semantic similarity and return the passages that match best. Returns the top 2 passages, each with its source file name. TRIGGER (strict): call this tool only when the latest user message encloses a term in double square brackets, like [[term]]. That marker is the only thing that authorizes a search. Nothing else is a trigger: plain unmarked text, quoted text, single brackets [term], and any backtick or code formatting must never call this tool, no matter how much the question looks like it needs reference material. With no [[term]] present in the latest user message, answer from the conversation and your own knowledge instead. Args: query: The exact text found between [[ and ]], and nothing else. Do not append the surrounding topic words: extra words blur the match and surface general overview passages instead of the exact section. If the first result set misses, you may search again with a reworded query.
Search the local document collection by semantic similarity and return the passages that match best. Returns the top 3 passages, each with its source file name. TRIGGER (strict): call this tool only when the latest user message encloses a term in double square brackets, like [[term]]. That marker is the only thing that authorizes a search. Nothing else is a trigger: plain unmarked text, quoted text, single brackets [term], and any backtick or code formatting must never call this tool, no matter how much the question looks like it needs reference material. With no [[term]] present in the latest user message, answer from the conversation and your own knowledge instead. Args: query: The exact text found between [[ and ]], and nothing else. Do not append the surrounding topic words: extra words blur the match and surface general overview passages instead of the exact section. If the first result set misses, you may search again with a reworded query.
8 nearly-identical tools (search_svdb_1 through search_svdb_8) differ only in result count. Should be consolidated into a single search_svdb tool with a 'top_k' parameter (1 - 8). This violates single-responsibility and forces LLMs to choose between 8 variants.
No output schema documented for any tool. LLMs cannot plan downstream operations or extract fields without knowing the response structure. Describe what fields are returned (e.g., passages array with text and source fields).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 38 | 2026-07-28+ | v2 |
Search the local document collection by semantic similarity and return the passages that match best. Returns the top 4 passages, each with its source file name. TRIGGER (strict): call this tool only when the latest user message encloses a term in double square brackets, like [[term]]. That marker is the only thing that authorizes a search. Nothing else is a trigger: plain unmarked text, quoted text, single brackets [term], and any backtick or code formatting must never call this tool, no matter how much the question looks like it needs reference material. With no [[term]] present in the latest user message, answer from the conversation and your own knowledge instead. Args: query: The exact text found between [[ and ]], and nothing else. Do not append the surrounding topic words: extra words blur the match and surface general overview passages instead of the exact section. If the first result set misses, you may search again with a reworded query.
Search the local document collection by semantic similarity and return the passages that match best. Returns the top 5 passages, each with its source file name. TRIGGER (strict): call this tool only when the latest user message encloses a term in double square brackets, like [[term]]. That marker is the only thing that authorizes a search. Nothing else is a trigger: plain unmarked text, quoted text, single brackets [term], and any backtick or code formatting must never call this tool, no matter how much the question looks like it needs reference material. With no [[term]] present in the latest user message, answer from the conversation and your own knowledge instead. Args: query: The exact text found between [[ and ]], and nothing else. Do not append the surrounding topic words: extra words blur the match and surface general overview passages instead of the exact section. If the first result set misses, you may search again with a reworded query.
Search the local document collection by semantic similarity and return the passages that match best. Returns the top 6 passages, each with its source file name. TRIGGER (strict): call this tool only when the latest user message encloses a term in double square brackets, like [[term]]. That marker is the only thing that authorizes a search. Nothing else is a trigger: plain unmarked text, quoted text, single brackets [term], and any backtick or code formatting must never call this tool, no matter how much the question looks like it needs reference material. With no [[term]] present in the latest user message, answer from the conversation and your own knowledge instead. Args: query: The exact text found between [[ and ]], and nothing else. Do not append the surrounding topic words: extra words blur the match and surface general overview passages instead of the exact section. If the first result set misses, you may search again with a reworded query.
Search the local document collection by semantic similarity and return the passages that match best. Returns the top 7 passages, each with its source file name. TRIGGER (strict): call this tool only when the latest user message encloses a term in double square brackets, like [[term]]. That marker is the only thing that authorizes a search. Nothing else is a trigger: plain unmarked text, quoted text, single brackets [term], and any backtick or code formatting must never call this tool, no matter how much the question looks like it needs reference material. With no [[term]] present in the latest user message, answer from the conversation and your own knowledge instead. Args: query: The exact text found between [[ and ]], and nothing else. Do not append the surrounding topic words: extra words blur the match and surface general overview passages instead of the exact section. If the first result set misses, you may search again with a reworded query.
Search the local document collection by semantic similarity and return the passages that match best. Returns the top 8 passages, each with its source file name. TRIGGER (strict): call this tool only when the latest user message encloses a term in double square brackets, like [[term]]. That marker is the only thing that authorizes a search. Nothing else is a trigger: plain unmarked text, quoted text, single brackets [term], and any backtick or code formatting must never call this tool, no matter how much the question looks like it needs reference material. With no [[term]] present in the latest user message, answer from the conversation and your own knowledge instead. Args: query: The exact text found between [[ and ]], and nothing else. Do not append the surrounding topic words: extra words blur the match and surface general overview passages instead of the exact section. If the first result set misses, you may search again with a reworded query.
Tool names use numeric suffixes (search_svdb_1, search_svdb_2, etc.) which are not self-documenting. LLMs cannot infer from the name alone that search_svdb_3 returns 3 results. Rename to search_svdb with a top_k parameter.
Query parameter description is verbose (200+ chars) and includes trigger-mode instructions that belong in the tool description, not the parameter description. Separate concerns: tool description explains when to call; parameter description explains what the parameter controls.
No error handling guidance. If a query returns no results, or if the embedding service is unavailable, what should the LLM do? Provide recovery hints (e.g., 'No results found. Try a shorter query or different keywords.').