MCP server for searching and querying a local Zotero library database
Zotero Skill has 10 well-named, read-only search tools with consistent parameter patterns. All tools have descriptions (avg 95 chars) and input schemas with types. However, schemas lack depth: no enums for constrained fields (e.g., 'type' filter), no documented output schemas, and parameter descriptions are minimal (avg 35 chars). Error handling is absent from visible code. No tool annotations (readOnlyHint, etc.). Naming is strong (verb_noun pattern: search, list, browse, get), but parameter documentation falls short of production baseline (94% of A+ tools have full param descriptions; this server ~40%).
Search Zotero library by author name
Browse contents of a specific collection in Zotero library
List all collections in Zotero library
Exact DOI lookup in Zotero library
PDF full-text search using inverted index with exact word matching and AND semantics
Batch fetch item details by itemKey from Zotero library
Get recently added items from Zotero library
Keyword search of Zotero library (title + abstract + journal + notes)
No output schemas documented. LLMs cannot predict response structure (fields, types, pagination). Code shows enrichment (authors, tags, collections, notes, fulltext status, zoteroURI) but this is invisible to callers.
Parameter descriptions are minimal (avg 35 chars). 'Filter by item type (optional)' lacks format/enum guidance. LLMs cannot infer valid item types (journal, book, thesis, etc.) without explicit enum or constraint.
No error handling guidance in visible code. If database is locked, missing, or query fails, LLM receives raw error with no recovery path. Code shows 'Cannot open database' but no actionable next steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 43 | 2026-07-28+ | v2 |
List all tags in Zotero library
Search Zotero library by tag name
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All tools are read-only, but this is not declared in schema. Agents cannot infer safety without explicit hints.
'db' parameter (override database path) is exposed to LLM. This is a path traversal risk, LLM could be tricked into querying arbitrary SQLite files. Should be server-side config only.