MCP server for semantic search of Zotero academic library using ChromaDB and Vertex AI embeddings
ZotMCP provides 3 read-only tools with clear, descriptive names and documented schemas. All tools follow verb_noun naming conventions (semantic_search, get_document_full_text, get_document_metadata). Descriptions are present and functional (75-150 chars each), meeting the 10-1024 char baseline. Input parameters have types and descriptions. However, output schemas are not explicitly documented in the source code, only inferred from implementation context. The tools lack structured error handling guidance, missing the 'recovery guide' pattern. No tool annotations (readOnlyHint, etc.) are present despite tools being strictly read-only. Parameter descriptions could be more detailed about expected formats and constraints. No information about pagination for semantic_search results despite accepting max_results (potentially returns large lists). Overall above-average for a small utility server but with room for production-grade hardening.
Retrieve the complete full text of a document from ChromaDB by document ID
Retrieve metadata for a document including citation, DOI, authors, and Zotero information
Search Zotero library for relevant documents using semantic similarity
Output schemas not explicitly documented. Only input schemas visible in source. LLMs cannot determine what fields to expect (e.g., does semantic_search return scores, authors, publication_date, full_text?). This forces LLMs to guess and risks context loss if response structure differs from expectations.
No error handling guidance. Tools lack actionable error messages. If a document_id doesn't exist or ChromaDB is offline, the LLM gets a bare error with no recovery path. Should return: 'Document not found. Try semantic_search() first to find relevant documents.'
No tool annotations despite strict read-only semantics. Tools should declare readOnlyHint: true so agents and clients know these are safe to call without permission gates or dry-run logic.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
semantic_search accepts max_results parameter but no pagination or cursor support documented. If results exceed context window, LLM has no way to fetch next batch. Should support offset/limit or next_cursor pattern.
Parameter descriptions lack constraint details. 'query' parameter in semantic_search has no length, character, or format constraints documented. 'max_results' lacks min/max bounds (appears to default to 10, but no upper limit stated). Format: 'max_results (integer, 1-100, default 10)'.