Skip to content

v0.6.3

Latest

Choose a tag to compare

@54yyyu 54yyyu released this 28 Jul 02:06
46351fa

Bug-fix release, and a large one. Eight community PRs merged plus nine fixes written against open reports.

Attachments that said they worked, and didn't

pyzotero's attachment_both() reports a client-side rejection by returning the payload in a failure list rather than raising. Every attach site in zotero-mcp guarded only against exceptions, so a file that never landed was reported as "File attached". This turned out to be the shared root cause behind a family of reports (#278, #306, #399) with completely different underlying causes: quota 413s, WebDAV misconfiguration, and a pyzotero client-side failure all took the same silent path.

Every attach path now verifies an attachment was actually registered, retries through a create-then-upload flow that confirms the stored md5, and deletes the orphaned attachment shell if the upload still fails (#403).

Silent truncation

children() in pyzotero is an unpaginated passthrough, so without an explicit limit the Zotero API returns its default page of 25. Every call site silently operated on at most the first 25 children. The worst case was in merge_duplicates: only the first 25 children of each duplicate were re-parented onto the keeper, and the rest went to the Trash with the duplicate item (#387).

db-inspect --filter had a related problem, applying --limit to the raw fetch rather than to matches, so it only ever scanned the first N records in storage order and reported "No records matched" for terms that were plainly present (#368, #384).

New

  • zotero_attach_file attaches a local file or a direct PDF URL to an existing item, idempotent on both filename and content hash (#386)
  • Multi-library semantic search: the index is tagged per library and zotero_semantic_search takes a library_id filter (#396)
  • Multi-flavor Docker images published to GHCR (#332)

Also fixed

Ollama semantic search failing at query time (#382), bibliography export in local and hybrid mode (#371), annotation tags never being returned (#377), the semantic-search sync watermark being shared across libraries (#393), get_pdf_outline crashing the whole MCP server on some journal PDFs (#372), setup writing the Claude Desktop config where Claude Desktop doesn't read it (#392), install hints assuming pip for uv and pipx installs (#388), and zotero_db_path being ignored by six local-mode tools (#367).

See the CHANGELOG for the full list.

Known issues

Two bugs found during this round are filed but not fixed here: #404 (the incremental deletion pass isn't library-scoped, so syncing one library removes other libraries' documents from the index) and #405 (read_pdf_pages still runs PyMuPDF in-process and can take the server down on a malformed PDF).

Thanks to @josk0, @mronkko, @patrickjcrawford, @lukas-blecher, @AndreiPashkin, @rtgilbert and @mcree for the PRs, and to everyone who filed a report with a repro this cycle.