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.3.0.tar.gz (144.6 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.3.0-py3-none-any.whl (110.8 kB view details)

Uploaded Python 3

File details

Details for the file snowcite-0.3.0.tar.gz.

File metadata

  • Download URL: snowcite-0.3.0.tar.gz
  • Upload date:
  • Size: 144.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snowcite-0.3.0.tar.gz
Algorithm Hash digest
SHA256 e8362d9acc11055a425fdd81eb3d9a72a1b1dc2ecf93e269172638eb14f4aa06
MD5 6a0af72fe813646dc183d56908d1f7ab
BLAKE2b-256 7b699ed570994ec6b1724e80a9044c0416b39cc654e0429778d5446ac7b88a24

See more details on using hashes here.

File details

Details for the file snowcite-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: snowcite-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 110.8 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.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 eb73f792549683e076736c03a279bd5966cd7ea978931e374036bb4adc6cf5ad
MD5 2c6c947d2f717e98ebfb66762b8a963a
BLAKE2b-256 ed07ca593eb2cc78b06c83dea6bc1f1e6bff0f74255ff1a0afd79b63e1015d43

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