Python library wrapper for Zotero MCP enabling efficient code-based search orchestration with large-scale data filtering, complex search strategies, and result deduplication before returning to LLM context
This is a Python library wrapper for Zotero MCP, not an MCP server itself. It provides 8 tools with complete input schemas and reasonable descriptions (avg ~120 chars), but lacks output schema documentation, error handling guidance, and security considerations. Tool naming follows verb_noun conventions well. However, as a library rather than a protocol-compliant MCP server, it cannot be evaluated as a standalone agent tool, it requires integration into an MCP server. The code examples show practical usage but do not demonstrate MCP protocol compliance. All tools are read-only (safe), but lack features like tool annotations (readOnlyHint), pagination limits enforcement, idempotency declarations, and recovery guidance.
Perform comprehensive multi-strategy search combining semantic search, keyword search, and tag-based search with automatic deduplication and ranking, returning filtered results before returning to LLM context
Filter items by specified criteria including item types, date range, required tags, excluded tags, and minimum tag count
Find items authored by specified authors with flexible matching supporting partial author names and returning items written by any of the specified authors
Get recently added items from the library with configurable limit, sorted by date added in descending order
Get all tags from the library
Search Zotero library by tags with optional item type filter and result limit
No output/return schema documentation. Tool descriptions specify what parameters control behavior but do not document what fields or structure is returned. LLMs cannot plan downstream operations without knowing response structure.
Missing error handling guidance. No descriptions explain how to handle failures (retryable vs. fatal), what errors might occur, or how to recover. E.g., semantic_search might fail if embedding service is unavailable, but this is not documented.
No tool annotations (readOnlyHint). Although all tools are read-only queries, they lack explicit readOnlyHint in schema. This forces LLMs to infer safety from descriptions rather than machine-parseable metadata.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 61 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Search Zotero library and return items as ZoteroItem objects with parameters for query, query mode (titleCreatorYear or everything), item type filter, result limit, and optional tag filtering
Perform semantic search on Zotero library using natural language queries with configurable result limit
Incomplete limit/pagination documentation. search_items, semantic_search, search_by_tag, and get_recent accept 'limit' parameters, but descriptions do not specify hard caps, performance implications, or guidance on reasonable defaults. Pattern baseline: tools should cap results at 20-50 and document this.
get_tags description is 12 characters ('Get all tags from the library'). This is a critical omission, the tool provides no context for when/why an LLM should call it or what 'tags' means in the Zotero context.
Library vs. MCP server ambiguity. This is distributed as a Python library (zotero_lib.py, setup.py) rather than an MCP-compliant server. It lacks MCP protocol handlers (initialize, list_tools, call_tool, etc.) and cannot be directly integrated with MCP clients without wrapping. This is not fatal but limits deployment flexibility.
No idempotency guarantees. search_items, semantic_search, and other read operations should document idempotency (safe to retry). While they are queries (inherently idempotent), LLMs benefit from explicit confirmation in descriptions.
Missing parameter constraints. The 'tag' array in search_items and 'tags' array in search_by_tag lack format or minItems/maxItems constraints. Descriptions do not clarify whether empty arrays are valid, what happens with duplicate tags, or case sensitivity.