MCP SDK v2 server for safe, collection-aware management of local Zotero libraries
Zotero Keeper shows moderate definition quality with decent descriptions and some structural work, but significant gaps in schema completeness and parameter documentation. All 10 tools have emoji-prefixed descriptions (10-200 chars), which is good for readability but occasionally vague. Input schemas are present for most tools, but many lack detailed type information or validation constraints. The descriptions reference output structures (library_version, server_id, attachment_count) that are helpful for chaining, but parameter-level documentation is sparse. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are declared, despite tools having clear read/write semantics. The batch_import_from_pubmed tool is complex and write-heavy but lacks confirmation or dry-run support. Average parameter description length appears ~50 chars (below the 72-char baseline), and many parameters lack explicit min/max constraints.
📦 Legacy batch import PubMed articles to Zotero with complete metadata 批次匯入 PubMed 文獻到 Zotero,保留完整的 metadata! Features: - ✅ Complete abstract (not truncated!) - ✅ Author keywords + MeSH terms → tags - ✅ PMID, PMCID, affiliations → extra field - ✅ Batch duplicate detection (by PMID/DOI) - ✅ Detailed result reporting - ✅ Collection validation (防呆機制!) - ✅ Optional citation metrics (RCR, percentile) → extra field
🔍 Find orphan items (no collection or no tags) Helps you organize your library by identifying items that may need attention.
📖 Get detailed item by key 取得單一文獻的完整資料 Full item metadata
📎 Get attachments for a Zotero item (PDFs, snapshots, etc.) Returns Dict with: - item_key: The parent item key - title: Parent item title - library_version: Library cursor for version-protected full-text writes - server_id: Zotero 10+ database identity paired with that cursor - attachment_count: Number of attachments - attachments: List of attachment info dicts
📄 Get fulltext content of a Zotero item (indexed by Zotero) Zotero 會自動為 PDF/EPUB/HTML 附件建立全文索引。 Dict with: - item_key: The item key - title: Item title - content: Fulltext content (plain text) - indexed_pages: Number of pages indexed - total_pages: Total pages in document - library_version: Library cursor to pass to set_attachment_fulltext - server_id: Zotero database identity paired with the cursor - source: Which attachment provided the fulltext
No tool annotations declared. All tools lack readOnlyHint/destructiveHint/idempotentHint, despite clear semantics (9 read-only, 1 write). This forces LLMs to reason about safety instead of relying on explicit hints.
batch_import_from_pubmed is a complex write operation (imports articles, modifies Zotero library) with no confirmation, dry-run, or rollback support. High risk of unintended imports if the LLM misunderstands the pmids parameter or collection selection.
Parameter descriptions lack validation details. E.g., 'limit' parameters in find_orphan_items and search_items have no min/max constraints documented; 'key' in get_item has no format hint (should be 8-char alphanumeric). LLMs cannot validate input on their own.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 61 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 41 | - | v1 |
📝 Get available item types 取得可用的文獻類型 List of item types (journalArticle, book, etc.)
📊 Get library statistics and insights Takes library statistics including: - total_items: Total number of items - by_type: Count by item type (journalArticle, book, etc.) - by_year: Distribution by publication year - top_authors: Most frequent authors - top_journals: Most frequent journals - tag_stats: Tag usage statistics - collection_stats: Collection statistics
📋 List recent items 列出最近的文獻 List of items with basic metadata
🏷️ List all tags 列出所有標籤 List of tags
🔍 Search for references in Zotero 搜尋 Zotero 中的書目資料 List of matching items with metadata
Output schemas are described in tool descriptions but not formally documented. E.g., get_item_attachments claims to return 'Dict with: item_key, title, library_version, server_id, attachment_count, attachments' but there is no JSON Schema for the response. LLMs must infer structure from prose, increasing parsing errors.
Generic tool descriptions for discovery/list tools. list_items says '📋 List recent items' (23 chars), list_tags says '🏷️ List all tags' (17 chars), get_item_types says '📝 Get available item types' (28 chars). These lack context on when to call them or what structure they reveal. Below 20-char soft minimum for actionable descriptions.
batch_import_from_pubmed has complex parameter interactions (collection_key vs collection_name vs allow_library_root) documented in Chinese comments but not formalized. The description warns '⚠️ 不建議直接使用,容易出錯' (not recommended, error-prone) but does not explain why or what to do instead.
Error handling not evident. No visible tool responses or error recovery guidance in source. If Zotero API fails (e.g., 'item not found'), unclear whether tools return actionable error messages or stack traces.
find_orphan_items and search_items lack pagination documentation. No mention of result limits, next_cursor, or total_count. If orphan detection returns 1000+ items, context window could be exhausted.
Tool names use underscores consistently (correct), but some names are generic. get_item and get_library_stats are clear, but get_item could conflict with hypothetical get_item_history or get_item_versions. No disambiguation in naming.