Problem
Managing research literature through an LLM still broke at a basic task: adding a paper to Zotero from a DOI or arXiv ID. The flow depended on brittle manual steps for resolving metadata, finding a PDF, and filing the item. PR #83 established the foundation; I set out to harden it for real model-generated calls in zotero-mcp, a 4.6k-star open-source project.
Role
Open-source contributor
Timeline
March 4–22, 2026
Team
Yusheng Chen (uilfl) · zotero-mcp maintainers
Skills
Python · MCP tool design · Crossref and arXiv APIs · Testing · Documentation

PR #135 as submitted: 9 commits and +2,496 −2 across 4 files. GitHub marks it Closed; the pull request itself was not merged.
Approach
I designed an identifier-import pipeline that normalizes DOI and arXiv variants, resolves metadata through Crossref and arXiv, and discovers a PDF before attaching it as auto, import_file, or linked_url. I also made update_item treat a supplied collection list as a strict replacement, explicitly removing old memberships and adding the requested ones.
The key LLM-ergonomics insight was that tool boundaries must tolerate predictable generation errors. The _normalize_str_list_input helper accepts a real list, a JSON-encoded string, or a comma-separated string, then produces one consistent value for the tool logic without making its data semantics ambiguous.

The documentation diff made the new workflows legible to both people and models; two new test suites added about 735 lines around identifier import and item management.
Outcome
Status:This PR was closed, not merged. The maintainer wrote: "Closing — DOI/identifier import, PDF attachment, and collection management features have been merged via add_by_doi, add_by_url, add_from_file, and update_itemtools. Thanks for the extensive work!"
The capabilities therefore landed upstream in equivalent form, while PR #135 remained a closed contribution. Its concrete output was the end-to-end design, documentation, and roughly 735 lines of tests that made identifier parsing, PDF fallback behavior, and collection-replacement edge cases explicit.