cowork-scholar v0.1.0a Claude Cowork plugin, demonstrated on synthetic dataJuly 2026
Working demonstration, not a mockup

A Claude Cowork plugin for academic work, already running

Citation integrity checks, literature notes, and reading packs, packaged in the exact file format Claude Cowork and Claude Code load: a manifest, skills, and slash commands. Everything on this page executed for real; you can re-run the core check in this browser.

All corpus data is synthetic: invented papers, invented venues, example DOIs
I. Plugin anatomy

The pieces Cowork actually loads

Cowork plugins bundle four file-based components: skills, slash commands, connectors (MCP), and sub-agents. This plugin ships the first two plus the connector slot, in the layout Claude Code's plugin reference specifies. It passes claude plugin validate as published.

Skill + script

citation-integrity

Cross-checks a manuscript's in-text citations and reference list against the corpus index. A deterministic script does the matching; Claude interprets findings. Same manuscript, same findings, every run.

Skill

literature-notes

A structured note format with rules that make summaries composable: quoted numbers only, author claims separated from our evaluation, a contradicts/supports field that builds the review matrix.

Skill + script

reading-pack

Topic-filtered reading pack from the index, newest first, one note scaffold per work. Zero-hit topics report honestly and list the tags that exist.

Commands

/check-citations, /reading-pack

One-shot slash commands with severity-ordered reporting rules. The manifest is .claude-plugin/plugin.json; the connector slot (.mcp.json) is where a live library catalogue wires in.

cowork-scholar-plugin/ ├── .claude-plugin/ │ ├── plugin.json # manifest (name, version, description) │ └── marketplace.json # single-plugin marketplace, source: ./ ├── commands/ # /cowork-scholar:check-citations, :reading-pack ├── skills/ │ ├── citation-integrity/ # SKILL.md + scripts/citation_check.py │ ├── literature-notes/ # SKILL.md │ └── reading-pack/ # SKILL.md ├── corpus/ # SYNTHETIC index + manuscript (5 planted problems) └── scripts/ # build_reading_pack.py, selftest.py
II. Recorded run

The checker against a manuscript with five planted problems

The synthetic manuscript plants five citation problems: one fabricated reference, one wrong year, one wrong venue, one citation with no reference entry, and one orphan reference. The selftest asserts the checker finds exactly those five and nothing else. This output is pasted verbatim from the run.

terminal, plugin rootpython 3, stdlib only
$ python3 scripts/selftest.py PASS in-text citation count == 7 PASS reference entry count == 7 PASS finding set == 5 planted problems PASS verified clean refs == [1, 3, 5] PASS reading pack 'sediment' == 3 expected works, newest first selftest: all 5 assertions pass $ python3 skills/citation-integrity/scripts/citation_check.py \ corpus/papers/manuscript.md corpus/index.json cowork-scholar citation integrity check in-text citations : 7 ['1', '2', '3', '4', '5', '6', '8'] reference entries : 7 verified clean : 3 ['1', '3', '5'] findings : 5 [MISSING_REFERENCE_ENTRY] ref 8: [8] is cited in the text but has no entry in the reference list. [YEAR_MISMATCH] ref 2: Reference 2 lists year 2019; the index records 2021 for doi:10.5555/synth.2021.114. [NOT_IN_INDEX] ref 4: Reference 4 (doi:10.9999/synth.2024.777) matches nothing in the corpus index by DOI or title. Fabrication signal; verify by hand. [VENUE_MISMATCH] ref 6: Reference 6 lists venue 'Journal of Synthetic Hydrology'; the index records 'Annals of Invented Geomorphology' for doi:10.5555/synth.2023.045. [UNCITED_REFERENCE] ref 7: Reference 7 (Long-term monitoring design for channel re-meandering) never appears as an in-text citation.
III. Re-run it here

Your browser recomputes the findings from the raw inputs

The full synthetic manuscript and corpus index are embedded in this page as raw text. Pressing the button parses them and re-runs the same five checks in JavaScript, then compares the recomputed finding set against the recorded Python run above. Nothing is pre-baked: delete a finding from the expectation and the verdict flips.

Citation integrity, in-browser not yet run
IV. Reading packs, live

Filter the corpus into a pack

Same index, same logic as the Python builder: filter by topic tag, newest first. Pick a topic; the list below is computed from the embedded index, not hardcoded.

V. Install and verify

Sixty seconds to the same output

Claude Code

The repo doubles as a one-plugin marketplace, so two commands install it:

/plugin marketplace add MHNDhq/cowork-scholar-plugin /plugin install cowork-scholar@mhnd-scholar

Claude Cowork

Cowork plugins are file-based and share this exact structure (manifest, skills, commands, connectors). Install custom plugins through Cowork's plugin surface; plugin support is in research preview for paid plans as of July 2026, installing locally per machine.

Or just run it

No Claude needed to verify the core:

git clone https://github.com/MHNDhq/cowork-scholar-plugin cd cowork-scholar-plugin python3 scripts/selftest.py
VI. From demo to your deployment

What changes for a real academic team

  1. The synthetic index swaps for your institution's catalogue, either as a maintained file or through an MCP connector in .mcp.json, the plugin format's slot for live data sources.
  2. Skills absorb your house rules: citation style, review matrix fields, course pack structure, the venues you trust.
  3. New skills follow the same shape: course-material assembly, grant boilerplate checks, methods section review. Each is a folder with a SKILL.md, so the plugin grows without rework.
  4. Everything deterministic stays a script Claude runs, not a prompt Claude improvises. That is what makes the checks auditable, which is the property academic work actually needs.