Interactive guided reading of a paper with annotation sync to Zotero. Use when you want to deeply understand a paper in your library.
Multi-agent skill for interactive, guided reading of academic papers. Subagents handle PDF reading so long documents don't exhaust the main conversation's context. Enforces strict citation discipline — every claim tagged as PAPER, EXTERNAL, or UNCERTAIN — to minimize hallucination.
Key highlights and notes are synced to Zotero as annotations. At session end, a structured technical summary is saved as a Zotero note for future cross-referencing.
/read-paper/read-paper <citekey or filename>All subagents MUST use the Read tool to read PDFs — it processes
pages visually (multimodal) and handles equations better than text
extraction. For PDFs over 10 pages, use the pages parameter
(e.g., pages: "1-5"). Maximum 20 pages per Read call.
Do NOT use Bash to install or run poppler, pdftotext, pdfplumber, or any other PDF conversion tool.
Include these instructions in every agent prompt by adding this block to the top of the prompt:
## PDF Reading
Use the Read tool to read PDF files — it handles PDFs natively.
For large PDFs, use the `pages` parameter (e.g., pages: "1-5").
Maximum 20 pages per Read call. Do NOT use Bash to install or run
poppler, pdftotext, or any PDF conversion tool.
Papers live in two places relative to the repo root:
queue/ — unprocessed PDFs (not yet in Zotero)library/ — processed PDFs, named by citekeyIf the paper is in the queue, process it first using the Zotero MCP tools
(add_paper) before starting the reading session. This ensures it gets
a citekey, a Zotero entry, and moves to the library.
Two Zotero collections serve as always-loaded context:
At session start, call get_collection_summaries("Internal Papers") and
get_collection_summaries("Core References") to load structured summaries
for cross-referencing. These summaries are the equivalent of
lab-publications.tex — concise technical references with method,
parameters, results, and limitations.
When reading a new paper, actively cross-reference against this context:
search_library + get_structured_note to pull
that paper's summary for context.During a reading session, accumulate section summaries and discussion
highlights in a temporary scratch file:
/tmp/read-paper-<citekey>-YYYY-MM-DD.md
This file serves two purposes:
What goes in the scratch file:
What gets passed to subagents:
Delete the scratch file at session end after all annotations and the structured summary are synced to Zotero.
Locate the paper. Find the PDF:
library/<citekey>.pdfqueue/ and library/queue/, read the first few pages to extract metadata,
then use add_paper MCP tool to create the Zotero entry and
move it to library/. Ask the user to confirm collections/tags.search_library MCP tool if the user gives a partial nameStore the Zotero item key — you'll need it for annotations.
Load context.
get_collection_summaries("Internal Papers") and
get_collection_summaries("Core References") to load the
knowledge layer. Store this in the scratch file header.list_annotations to check if the paper has prior
annotations from a previous reading session. If so, briefly
summarize what was covered before.get_structured_note to check if a structured summary
already exists. If so, the paper has been read before — present
the summary and ask whether to do a fresh read, update the
summary, or dive into specific questions.Establish the compass. Ask: "What brought you to this paper? What are you hoping to get from it?" This guides drift detection.
Choose mode. Ask:
Map the paper. Spawn a mapping agent to produce a section-by-section table of contents. Do NOT read the PDF in the main conversation.
Use the Agent tool with:
subagent_type: general-purposedescription: Map paper sectionsprompt: (fill in the template below)Mapping agent prompt template (fill in {pdf_path}):
You are producing a section map for an academic paper to guide
an interactive reading session.
## PDF Reading
Use the Read tool to read PDF files — it handles PDFs natively.
For large PDFs, use the `pages` parameter (e.g., pages: "1-5").
Maximum 20 pages per Read call. Do NOT use Bash to install or run
poppler, pdftotext, or any PDF conversion tool.
## Instructions
1. Read the PDF at `{pdf_path}`.
- If the paper is 20 pages or fewer, read the entire PDF.
- If the paper is longer than 20 pages, read pages 1-3
(abstract/introduction and table of contents if present),
then skim each subsequent ~10-page chunk to identify section
boundaries.
2. Produce a section map as structured text:
PAPER STRUCTURE:
Total pages: [number]
SECTIONS:
1. [Section title] (p.X-Y) — [1-sentence summary]
2. [Section title] (p.X-Y) — [1-sentence summary]
...
## Important
- Include ALL sections, not just major ones (subsections too if
they represent distinct topics).
- Page ranges must be accurate — the reader will use these to
request specific sections.
- Summaries should be informative enough that the reader can
decide which sections to read.
Present the section map. In walkthrough mode, ask whether to read all sections in order or pick specific ones. In question-driven mode, the map is a reference.
Read sections via agents. For each section, spawn a section reader agent. Do NOT read the PDF in the main conversation.
Section reader prompt template (fill in {pdf_path},
{page_range}, {section_name}, {compass},
{knowledge_layer} — Internal Papers + Core References summaries,
and optionally {prior_sections} — relevant content from the
scratch file, only if the section builds on earlier ones):
You are reading a section of an academic paper for a reader.
Produce a labeled summary enforcing strict citation discipline.
## PDF Reading
Use the Read tool to read PDF files — it handles PDFs natively.
For large PDFs, use the `pages` parameter (e.g., pages: "1-5").
Maximum 20 pages per Read call. Do NOT use Bash to install or run
poppler, pdftotext, or any PDF conversion tool.
## Context
The reader is reading this paper because: {compass}
## Knowledge layer (Internal Papers & Core References)
{knowledge_layer}
## Prior sections covered (if any)
{prior_sections}
## Instructions
1. Read pages {page_range} of the PDF at `{pdf_path}`.
This is the section: {section_name}
2. Produce a summary with mandatory claim labels:
- [PAPER, Sec/Eq/Fig ref]: claims directly from the PDF
- [EXTERNAL]: claims from general knowledge, explicitly flagged
- [UNCERTAIN]: content you can't parse or source confidently
3. Cross-reference against the knowledge layer. If the paper cites,
builds on, or contradicts an Internal/Core paper, note it
explicitly.
4. Structure your summary as:
SECTION: {section_name} ({page_range})
SUMMARY:
[Labeled summary of the section's content, ~30-50 lines.
Explain the main arguments, methods, and findings.]
KEY EQUATIONS:
- Eq. N (p.X): [equation description and significance]
FIGURES/TABLES:
- Fig. N (p.X): [what it shows]
CROSS-REFERENCES:
- [Connections to Internal Papers or Core References, if any]
HIGHLIGHT-WORTHY PASSAGES:
- Quote exact text passages (verbatim, max ~2 sentences each) that
represent key findings, definitions, or claims worth highlighting.
For each, note the page number (1-indexed) and why it matters.
OPEN QUESTIONS:
- [Background knowledge the section assumes]
- [Content that was garbled or unreadable]
## Important
- "I can't read this" protocol: when equations are garbled, figures
are unreadable, or content is ambiguous, say so explicitly in an
OPEN QUESTIONS item. Never guess.
- Only report what you can actually read.
- HIGHLIGHT-WORTHY PASSAGES must be exact quotes from the PDF so
they can be found by text search for Zotero annotation.
Present the section summary. Discuss as needed.
Zotero annotations. After discussing each section, ask whether to highlight any key passages in Zotero. Use the MCP tool with exact text from the PDF (page is 1-indexed) and the reader's comments. Use for the reader's own insights about a page.
Compass check (ongoing). When conversation drifts far from both the paper's core contribution and the reader's stated purpose:
Handle background knowledge gaps. When the paper assumes unfamiliar knowledge:
Session wrap-up. At session end:
a. Structured summary. Read the scratch file and draft a
structured technical summary. Use add_structured_note to save
it as a Zotero note with:
If a structured summary already exists (from a prior session), ask whether to replace or merge.
b. Session summary annotation. Use add_note_annotation on
page 1 to add a brief session record:
Reading session YYYY-MM-DD
Context: [why they read this]
Key takeaways: [main findings]
Open questions: [unresolved items]
c. Clean up. Delete the scratch file from /tmp.
Review. Before syncing the structured summary and session annotation, present both to the reader for approval. Revise until they're satisfied.
All output lives in Zotero:
get_structured_note and
get_collection_summariesadd_highlightadd_note_annotationScratch file update. After each section (and its discussion), append a condensed summary to the scratch file:
## [Section name] (p.X-Y)
[Key points — 5-10 lines max]
[Cross-references noted]
[Annotations added: list of highlights/notes]
Follow-up questions. When the reader asks follow-ups:
Question-driven routing. When the reader asks a question without specifying a section: