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
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.
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.pyPASS 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-browsernot yet run
0
in-text citations
0
reference entries
0
verified clean
0
findings
Ref
Finding
Detail
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:
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
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.
Skills absorb your house rules: citation style, review matrix fields, course pack structure, the venues you trust.
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.
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.