MCP server for systematic literature review — search, snowball, review, write, compile to PDF.
Project description
snowcite
MCP server for systematic literature review. Search arXiv / Semantic Scholar / OpenAlex / Crossref / PubMed, snowball through citations, review papers through chat, generate Typst or LaTeX documents, compile to PDF.
No web UI, no browser, no second terminal. Claude reads abstracts in batches, pre-filters autonomously, surfaces borderline cases to you in chat.
How it works
flowchart TD
Start([User: I want a systematic review]) --> Init
subgraph Phase1["Phase 1 — Onboarding"]
Init["init_project<br/>discipline, standard, backend, language"]
Init --> GenFiles["Generate<br/>CLAUDE.md<br/>.claude/settings.json<br/>.claude/agents/*"]
GenFiles --> Criteria["set_review_criteria<br/>include / exclude / categories"]
end
Criteria --> Search
subgraph Phase2["Phase 2 — Search & review"]
Search["search_papers<br/>auto_save, no abstracts in context"]
Search --> ReviewLoop
subgraph ReviewLoop["Batch review loop"]
direction TB
GetBatch["get_unreviewed_papers<br/>limit=20, no abstracts"]
GetBatch --> AutoClassify{"Claude<br/>classifies"}
AutoClassify -->|clear| BulkApprove["set_review_status<br/>bulk auto_high"]
AutoClassify -->|borderline| AskUser["Show to user<br/>facts only, no recommendation"]
AskUser --> UserDecide["User: i / e / m"]
UserDecide --> SingleStatus["set_review_status<br/>reviewed_by=user"]
BulkApprove --> Summary["save_review_summary<br/>≤500 words, rolling"]
SingleStatus --> Summary
Summary --> GetBatch
end
ReviewLoop --> Snowball{"Deeper?"}
Snowball -->|yes| Expand["expand_citations<br/>references + citations"]
Expand --> Search
Snowball -->|no| Outline
end
subgraph Phase3["Phase 3 — Structure"]
Outline["save_outline<br/>sections + paper_ids + target_words"]
Outline --> OutlineOk{"User<br/>approves?"}
OutlineOk -->|edits| Outline
OutlineOk -->|yes| Skeleton["save_skeleton<br/>3-5 sentences/section"]
Skeleton --> SkeletonOk{"User<br/>approves?"}
SkeletonOk -->|edits| Skeleton
end
SkeletonOk -->|yes| Phase4
subgraph Phase4["Phase 4 — Write by section"]
ExpandSec["save_section"]
ExpandSec --> Drift{"check_section_drift"}
Drift -->|within tolerance| AcademicReview["academic-reviewer<br/>subagent"]
Drift -->|drift| AskDrift["Ask user:<br/>accept / revert / edit"]
AskDrift --> ExpandSec
AcademicReview --> FixClaims["User picks fixes"]
FixClaims --> NextSec{"More<br/>sections?"}
NextSec -->|yes| ExpandSec
end
NextSec -->|no| Phase5
subgraph Phase5["Phase 5 — Finalize"]
Polish["polish_document<br/>cross-section transitions"]
Polish --> Humanizer["humanizer subagent<br/>language, naturalness"]
Humanizer --> FixLang["User accepts replacements"]
FixLang --> Compile["compile_pdf<br/>typst or tectonic"]
end
Compile --> Done([review.pdf])
classDef user fill:#fef3c7,stroke:#d97706,color:#000
classDef auto fill:#dbeafe,stroke:#2563eb,color:#000
classDef agent fill:#fce7f3,stroke:#db2777,color:#000
classDef output fill:#dcfce7,stroke:#16a34a,color:#000
class AskUser,UserDecide,OutlineOk,SkeletonOk,AskDrift,FixClaims,FixLang user
class AutoClassify,BulkApprove,Search,Summary,Outline,Skeleton,ExpandSec,Polish,Compile auto
class AcademicReview,Humanizer agent
class Done,GenFiles output
Legend — 🟨 user decisions, 🟦 automatic MCP calls, 🟪 subagents (fresh-context review), 🟩 outputs.
Install
# Register as an MCP server in Claude Code
claude mcp add snowcite -- uvx snowcite
# Optional but recommended — API keys boost rate limits
claude mcp add snowcite \
-e SNOWCITE_SEMANTIC_SCHOLAR_API_KEY=xxx \
-e SNOWCITE_OPENALEX_EMAIL=you@example.com \
-- uvx snowcite
# Compile backends (install at least one)
brew install typst # recommended — Cyrillic works out of the box
brew install tectonic # LaTeX fallback
First run
> init_project() here, I'm writing a bachelor thesis on X in Russian, ГОСТ 7.32
Claude collects metadata (author, institution, discipline, standard, backend),
scaffolds .snowcite/ in the current directory, generates a tailored CLAUDE.md,
and creates review subagents under .claude/agents/.
Then drive the workflow from chat — set criteria, search, review, snowball, outline, write, compile. See the diagram above for the full picture.
Projects live in directories
Like .git, a .snowcite/ subdirectory marks a project. Work on multiple
reviews in parallel by cd-ing between them — no global state, no switching
commands. git clone moves a project to a new machine.
my-thesis/
├── .snowcite/
│ ├── papers.db # project DB — metadata, papers, artifacts, outline
│ └── cache/ # compile artifacts, always gitignored
├── CLAUDE.md # snowcite-managed, regenerated by init_project
├── review.typ # or review.tex
├── references.yml # or references.bib
└── ...
Docs
Full documentation: cop1cat.github.io/snowcite. Coverage:
- Installation on macOS / Linux / Windows
- Workflow in depth (review loop, snowball, draft-first writing, subagents)
- Backends — Typst vs LaTeX, when to pick which
- Standards — ГОСТ 7.32, IEEE / ACM, APA, Vancouver, MLA, Chicago
- Troubleshooting — Cyrillic fonts,
bibervsbibtexin tectonic, safety refusals - Reference — every MCP tool's signature
Development
git clone https://github.com/cop1cat/snowcite.git
cd snowcite
uv sync --group dev
uv run pytest
uv run ruff check
uv run ruff format
CI runs ruff + pytest on every push and PR.
What this isn't
- Not a web UI. Review happens in chat. Architectural choice, see
CLAUDE.md. - Not a Zotero replacement. We import BibTeX / RIS but don't integrate with Zotero's API.
- Not a full-auto thesis generator. Systematic review requires human judgment at criteria-setting, borderline papers, outline structure. snowcite automates the mechanical parts and keeps you in the loop for the rest.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file snowcite-0.2.0.tar.gz.
File metadata
- Download URL: snowcite-0.2.0.tar.gz
- Upload date:
- Size: 123.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
62921376e0f298e1760ea8291896bd2c72891e6157cd782767ab36ada2b67136
|
|
| MD5 |
f54642056cb60edc267a061707b61ea5
|
|
| BLAKE2b-256 |
20d0e5bca729bb74c4c77740eaa6748aec7de12f681cdc24deceb613e69d6739
|
File details
Details for the file snowcite-0.2.0-py3-none-any.whl.
File metadata
- Download URL: snowcite-0.2.0-py3-none-any.whl
- Upload date:
- Size: 93.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7def77aefdd669cfe5c459ab426dbb00cd601a710f8825b979f1c02f786bb5a1
|
|
| MD5 |
5da8f18bac34bfc778529b392c05287d
|
|
| BLAKE2b-256 |
75b54b97ff87f2e40efacaa24e7455b36095800ccd68b70724f0a2b549c3518e
|