Skip to main content

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 &amp; 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, biber vs bibtex in 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

snowcite-0.2.0.tar.gz (123.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

snowcite-0.2.0-py3-none-any.whl (93.4 kB view details)

Uploaded Python 3

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

Hashes for snowcite-0.2.0.tar.gz
Algorithm Hash digest
SHA256 62921376e0f298e1760ea8291896bd2c72891e6157cd782767ab36ada2b67136
MD5 f54642056cb60edc267a061707b61ea5
BLAKE2b-256 20d0e5bca729bb74c4c77740eaa6748aec7de12f681cdc24deceb613e69d6739

See more details on using hashes here.

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

Hashes for snowcite-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7def77aefdd669cfe5c459ab426dbb00cd601a710f8825b979f1c02f786bb5a1
MD5 5da8f18bac34bfc778529b392c05287d
BLAKE2b-256 75b54b97ff87f2e40efacaa24e7455b36095800ccd68b70724f0a2b549c3518e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page