Deep semantic search for Zotero libraries using MCP with vector embeddings and reranking
The server provides 4 read-only tools with generally good naming and schema definition. Tool names follow verb-noun convention (search, get_*) and clearly indicate their action. All tools have non-empty descriptions (145-200 chars, within baseline 194 average). Input schemas are present and properly typed for all tools. However, there are notable gaps: (1) output schemas are not documented, callers cannot see what fields to expect from results; (2) parameter descriptions, while present, lack specificity about value constraints and ranges; (3) no error handling guidance is visible; (4) no pagination details despite search tools potentially returning many results. The codebase shows sophisticated filtering logic (_build_chromadb_filters) but this complexity is not adequately surfaced in tool descriptions.
Retrieve full document content and metadata by document ID
Get statistics about the indexed documents and chunks
Search the vector store using semantic similarity
Search for papers on a specific topic with oversampling and reranking
Output schemas not documented. Callers cannot infer what fields (chunk_id, doc_id, score, metadata structure, etc.) search results contain. This forces LLMs to guess at response structure and wastes tokens when extracting data for downstream operations.
Parameter descriptions lack constraint details. 'Maximum number of results to return (default 10)' does not specify min/max bounds. 'Filter by publication year' does not indicate valid year range.
No pagination or result limit enforcement documented. search and search_topic accept 'limit' but do not state max enforced value. Code shows default=10, but if an agent requests limit=10000, behavior is unclear.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 65 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 17 | - | v1 |
search and search_topic have nearly identical signatures and descriptions. 'Search the vector store using semantic similarity' vs 'Search for papers on a specific topic with oversampling and reranking' is confusing. The distinction (oversampling + reranking in search_topic) is not prominently explained.
No error handling guidance visible. If doc_id is invalid, if year filters produce zero results, or if embedder fails, no recovery hints are documented. Per pattern, error responses should guide the LLM ('Try search_* first', 'Check available years', etc.).