wikicitation-mcp
wikicitation-mcp exposes 38 Wikipedia citation-science tools through MCP for Claude.
Fetch article revision history, latest/initial wikitext, page info, category pages/subcategories, and bulk article histories/recent/creation.
Count DOIs, refs, URLs, ISBNs, wikilinks, and regex matches; extract/parse citations and wikilinks; replace wikilinks.
Analyze citation types and source types, compute SciScore, find top cited papers, and count revert-tagged edits.
Annotate DOIs via EuropePMC, CrossRef, and BibTeX; annotate ISBNs via Google Books and Open Library.
Work across multiple Wikipedia languages and apply date limits/input limits.
Integrates with Wikipedia to fetch edit histories, analyze citations, compute SciScore, and extract DOIs, ISBNs, and references from article content.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@wikicitation-mcp Show top cited papers in 'mRNA vaccine'."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
wikicitation-mcp
Wikipedia citation-science tools for Claude — pure Python, no R required.
An MCP server that exposes 38 tools to
Claude Code, Claude Desktop, and claude.ai.
Ask Claude to fetch Wikipedia edit histories, analyse citations, score
scientific quality, and annotate DOIs and ISBNs — all without leaving the chat.
What you can do
Category | Examples |
Edit history | Full revision history, first/latest wikitext, category-wide sweeps |
Citation analysis | Count DOIs/refs/ISBNs, extract CS1 templates, compute SciScore |
DOI & ISBN annotation | Enrich DOIs via CrossRef / EuropePMC, fetch BibTeX; books via Open Library / Google Books |
Multilingual | Every article-level tool takes |
Related MCP server: verification-mcp
Installation
Option A — PyPI (recommended)
No clone needed. uvx downloads and runs the package in one step:
# Requires uv (https://docs.astral.sh/uv/)
uvx wikicitation-mcpOr install permanently with pip:
pip install wikicitation-mcp
wikicitation-mcp # starts the stdio serverSupported and tested: Python 3.10–3.13. On Python 3.14, the
mwparserfromhell dependency has no prebuilt wheel yet and pip tries to compile
it; if that fails with Python.h: No such file or directory, either install the
Python headers (sudo apt install python3-dev) or use its pure-Python tokenizer:
WITH_EXTENSION=0 pip install wikicitation-mcpOption B — From source
git clone https://github.com/jsobel1/wikicitation-mcp.git
cd wikicitation-mcp
uv sync
uv run python server.pyConnect to Claude
Claude Code (CLI) — PyPI
claude mcp add wikicitation -- uvx wikicitation-mcp
claude mcp listClaude Code (CLI) — from source
# Run from inside the cloned directory
claude mcp add wikicitation -- uv run python server.pyClaude Desktop — PyPI
Edit ~/.claude/claude_desktop_config.json
(Windows: %APPDATA%\Claude\claude_desktop_config.json):
{
"mcpServers": {
"wikicitation": {
"command": "uvx",
"args": ["wikicitation-mcp"]
}
}
}Claude Desktop — from source
{
"mcpServers": {
"wikicitation": {
"command": "uv",
"args": [
"run", "python",
"/ABSOLUTE/PATH/TO/wikicitation-mcp/server.py"
],
"cwd": "/ABSOLUTE/PATH/TO/wikicitation-mcp"
}
}
}Restart Claude Desktop — the wikicitation server appears in the toolbar.
claude.ai (web, HTTP transport)
uvx wikicitation-mcp --transport streamable-http --port 8000
# (from a clone: uv run python server.py --transport streamable-http --port 8000)
# Then in claude.ai → Settings → Connections → Add MCP server
# URL: http://localhost:8000/mcpQuick start
Once connected, try these prompts in Claude:
Fetch all edits to the Wikipedia article "Circadian clock" up to today.Count all DOIs, references, and ISBNs in this wikitext: [paste wikitext]Calculate the SciScore for "Sleep deprivation".Extract all citations from "CRISPR" — how many are journals vs websites vs books?Show me the top 20 most-cited papers in the Wikipedia article "mRNA vaccine".Annotate these DOIs with CrossRef metadata:
10.1038/nature12373, 10.1016/j.cell.2020.01.001Usage notes
date_limit is an upper bound
date_limit controls the newest revision returned, not the oldest.
It defaults to now. To retrieve edits "since 2023", leave it unset and filter
the returned rows by timestamp. A plain date (2024-01-01) means the end of that
day (UTC).
Languages
Article-level tools accept lang (default "en"), e.g. lang="fr". Citation
templates are recognised natively for en, fr, de, es, it and pt, and mapped to
the same canonical types so SciScore is comparable across editions.
SciScore
get_sci_score returns sci_score = journal citations ÷ total citation
templates, from 0 to 1. Higher means more scientifically sourced.
Optional environment variables
Variable | Effect |
| Gives |
| Your e-mail address, sent to CrossRef's polite pool. |
Input limits
Arguments are validated before any network call: up to 100 articles, 20
categories and 200 DOIs per call, regular expressions up to 500 characters, text
up to 5 million characters, subcategory depth 1–5, and lang must look like a
Wikipedia language code.
Tool reference
Group 1 — History & metadata (14 tools)
Tool | Key arguments | Returns |
|
| revision table (revid, user, timestamp, size, comment) |
|
| metadata + full wikitext |
|
| first-ever revision metadata + wikitext |
|
| pageid, title, byte length ( |
|
| initial + recent + history + info in one call |
|
| list of article titles |
|
| structured page table (pageid, title, type) |
|
| direct subcategories |
|
| subcategories for N categories |
|
| recursive subcategories |
|
| pages for N categories |
|
| revision table for a list of articles |
|
| metadata + wikitext for a list of articles |
|
| creation-revision metadata for a list of articles |
Group 2 — Citation counting, extraction & quality (19 tools)
Tool | Key arguments | Returns |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| list of CS1 template strings |
|
| list of |
|
|
|
|
|
|
|
| list of regex matches from live article |
|
| all built-in pattern matches (doi, url, isbn, pmid, …) |
|
| structured citation rows (cite_type, doi, author, year, title) |
|
| long-form table: one row per citation field |
|
| citation counts by CS1 type |
|
| citation counts by CS1 type from raw wikitext |
|
|
|
|
| top 40 DOIs annotated via EuropePMC |
|
| revert-tagged edit counts by article (defaults to the last 7 days; ≤30-day window; can take a minute) |
Group 3 — DOI & ISBN annotation (5 tools)
Tool | Key arguments | Returns |
|
| title, journal, year, citation_count, is_open_access, PMID/PMCID |
|
| title, authors, journal, year, publisher, citation count |
|
|
|
|
| title, authors, publisher, publishedDate, description (see |
|
| title, authors, publishers, publish_date, page count |
Running tests
uv sync --dev
uv run pytest # unit tests, no network
uv run pytest --run-integration # adds live API testsIntegration tests call public APIs (Wikipedia, EuropePMC, CrossRef, Open Library, Google Books) and are skipped by default.
Troubleshooting
uvx: command not found
Install uv first:
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (PowerShell)
powershell -ExecutionPolicy Bypass -c "irm https://astral.sh/uv/install.ps1 | iex"Server not appearing in Claude Code
claude mcp remove wikicitation
claude mcp add wikicitation -- uvx wikicitation-mcp
claude mcp listModuleNotFoundError: No module named 'mwparserfromhell'
The venv is missing a dependency. Run uv sync inside the cloned repo, or
reinstall via pip install wikicitation-mcp.
fatal error: Python.h: No such file or directory during pip install
You are on a Python version (e.g. 3.14) for which mwparserfromhell has no
prebuilt wheel. Use WITH_EXTENSION=0 pip install wikicitation-mcp (pure-Python
tokenizer, same results), install the Python headers (python3-dev), or create
the environment with Python 3.12 (uv venv --python 3.12).
On Debian/Ubuntu, pip install outside a virtual environment fails with
externally-managed-environment: create one first
(python3 -m venv .venv && source .venv/bin/activate).
get_revert_counts returns no results
The Wikipedia recentchanges API only retains ~30 days of history. Requests
for date ranges older than that will return empty results.
Citing
If you use wikicitation-mcp in research, please cite it using CITATION.cff (GitHub's "Cite this repository" button) or the paper in paper/.
Related projects
These three projects share the same core analysis logic at three different levels of interactivity — pick the one that matches how you want to work.
Project | Interface | When to use |
wikicitation-mcp (this repo) | MCP server for Claude Desktop / Claude Code / claude.ai | You want to ask Claude questions in natural language and have it call the tools for you. Pure Python, no R required. |
R package | You want a programmable pipeline in R / R Markdown / Quarto with full access to revision tables, citation parsers, and ggplot2 / plotly / visNetwork output. | |
Shiny web app (built on | You want a point-and-click GUI: per-article tabs (History Flow, Citations, Authorship, Stability with SciScore-over-time, Vandalism & Wars, WikiWho-powered Revision Inspector) and a Corpus Analysis mode (multi-corpus timeline, per-article + per-corpus SciScore, co-citation / publication / wikilink networks, batched EuropePMC + Google Books annotation, multi-sheet XLSX exports). |
External references
Model Context Protocol — MCP specification
FastMCP — Python MCP framework used here
mwparserfromhell — wikitext parser
Available Tools
38 toolsannotate_dois_bibtexAnnotate Dois BibtexC
BibTeX entries for DOIs (CrossRef content negotiation). Returns {"bibtex_entries": [...]}.
Inputs: doi_list (required). Returns: object
annotate_dois_crossrefAnnotate Dois CrossrefB
Annotate DOIs through CrossRef: title, authors, journal, year, publisher, type, is_referenced_by_count, url.
Inputs: doi_list (required).
annotate_dois_europmcAnnotate Dois EuropmcB
Annotate DOIs through EuropePMC: PMID/PMCID, title, authors, journal, year, citation_count, is_open_access. One row per input DOI.
Inputs: doi_list (required).
annotate_isbn_googleAnnotate Isbn GoogleA
Book metadata from Google Books for one ISBN. The keyless quota is small; set GOOGLE_BOOKS_API_KEY in the server's environment to avoid HTTP 429, or use annotate_isbn_openlib instead.
Inputs: isbn (required). Returns: object
annotate_isbn_openlibAnnotate Isbn OpenlibC
Book metadata from Open Library for one ISBN.
Inputs: isbn (required). Returns: object
extract_all_regexExtract All RegexB
Apply all built-in patterns (doi, url, ref, isbn, wikilink, pmid, cite_all) to an article's latest wikitext.
Inputs: article_name (required), lang, date_limit.
extract_citationsExtract CitationsB
Return every {{cite ...}} template found in a wikitext string.
Inputs: text (required).
extract_wikihypelinksExtract WikihypelinksB
Return every [[wikilink]] found in a wikitext string.
Inputs: text (required).
extract_with_regexExtract With RegexC
Apply a regular expression to an article's latest wikitext.
Inputs: regexp (required), article_name (required), lang, date_limit.
get_any_countGet Any CountB
Count matches of a regular expression in a text. Returns {"count": n}.
Inputs: text (required), regexp (required). Returns: object
get_article_historyGet Article HistoryA
Retrieve the full revision history of a Wikipedia article.
Returns one row per revision: art, revid, parentid, user, userid, timestamp, size, comment, tags -- sorted oldest first. Wikitext is not included; use get_article_recent for that.
Inputs: article_name (required), lang, date_limit.
get_article_infoGet Article InfoB
Current page metadata: pageid, title, length, last revision id, touched timestamp. A non-existent page is reported with "missing": true.
Inputs: article_name (required), lang. Returns: object
get_article_initialGet Article InitialA
Retrieve the first (creation) revision of an article with its wikitext. Returns {"metadata": {...}, "wikitext": "..."}.
Inputs: article_name (required), lang. Returns: object
get_article_recentGet Article RecentA
Retrieve the latest revision of an article (at or before date_limit), including its full wikitext. Returns {"metadata": {...}, "wikitext": "..."}.
Inputs: article_name (required), lang, date_limit. Returns: object
get_category_creationGet Category CreationC
Creation (first revision) metadata for a list of articles.
Inputs: article_list (required), lang.
get_category_historyGet Category HistoryC
Full revision history for a list of articles, concatenated.
Inputs: article_list (required), lang.
get_category_pagesGet Category PagesB
Article titles (namespace 0) directly in a category.
Inputs: category (required), lang.
get_category_recentGet Category RecentC
Latest revision metadata and wikitext for a list of articles. Returns {"metadata": [...], "wikitext": [...]} in input order.
Inputs: article_list (required), lang, date_limit. Returns: object
get_citation_typesGet Citation TypesB
Count citation templates by canonical type (journal, book, web, news, ...) for an article.
Inputs: article_name (required), lang, date_limit.
get_doi_countGet Doi CountB
Count DOIs in a wikitext string. Returns {"count": n}.
Inputs: text (required). Returns: object
get_hyperlink_countGet Hyperlink CountB
Count [[wikilinks]] in a wikitext string. Returns {"count": n}.
Inputs: text (required). Returns: object
get_isbn_countGet Isbn CountB
Count ISBNs in a wikitext string. Returns {"count": n}.
Inputs: text (required). Returns: object
get_page_in_cat_multipleGet Page In Cat MultipleC
Pages in several categories (rows carry source_category).
Inputs: catname_list (required), lang.
get_pages_in_cat_tableGet Pages In Cat TableA
Pages directly in a category as a table (pageid, ns, title, type).
Inputs: category (required), lang.
get_ref_countGet Ref CountB
Count tags in a wikitext string. Returns {"count": n}.
Inputs: text (required). Returns: object
get_revert_countsGet Revert CountsA
Revert-tagged edits (mw-reverted, mw-undo, mw-rollback) per article in a date window, most reverted first.
Wikipedia only keeps recent changes for about 30 days, so older windows return partial or empty results. The scan can take a minute or more.
Inputs: end, lang, start.
get_sci_scoreGet Sci ScoreB
SciScore: the fraction of an article's citation templates that cite journals (0-1). Returns {"sci_score", "article", "lang", "revid"}.
Inputs: article_name (required), lang, date_limit. Returns: object
get_source_type_countsGet Source Type CountsB
Count citation templates by canonical type in a raw wikitext string.
Inputs: text (required), lang.
get_subcat_multipleGet Subcat MultipleC
Direct subcategories for several categories (rows carry source_category).
Inputs: catname_list (required), lang.
get_subcat_tableGet Subcat TableC
Direct subcategories of a category.
Inputs: catname (required), lang, replacement.
get_subcat_with_depthGet Subcat With DepthC
Recursively collect subcategories down to depth levels (1-5).
Inputs: catname (required), lang, depth, replacement.
get_tables_allGet Tables AllB
Info + initial revision + latest revision + full history in one call. Returns {"info", "initial", "recent", "history"}.
Inputs: article_name (required), lang, date_limit. Returns: object
get_top_cited_papersGet Top Cited PapersB
The (up to) 40 most-cited DOIs in an article, annotated through EuropePMC and ranked by how many times the article cites them (wiki_count).
Inputs: article_name (required), lang, date_limit.
get_url_countGet Url CountB
Count http(s) URLs in a wikitext string. Returns {"count": n}.
Inputs: text (required). Returns: object
parse_all_citationsParse All CitationsC
Long-form citation table, one row per template field (variable, value, canonical_field).
Inputs: article_name (required), lang, date_limit.
parse_citationsParse CitationsC
Structured citation table, one row per citation template (doi, isbn, pmid, url, title, author, year, journal, publisher, accessdate). Understands the native templates of en/fr/de/es/it/pt Wikipedias.
Inputs: article_name (required), lang, date_limit.
parse_cite_typeParse Cite TypeA
Parse one {{cite ...}} template string. Returns {"cite_type": "journal", "fields": {...}}, or {} if none is found.
Inputs: text (required). Returns: object
replace_wikihypelinksReplace WikihypelinksA
Replace [[Target|Label]] with Label and [[Target]] with Target. Returns {"cleaned_text": "..."}.
Inputs: text (required). Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 38 tools
Several clusters of tools overlap significantly: get_subcat_table / get_subcat_multiple / get_subcat_with_depth all fetch subcategories, and get_category_pages / get_pages_in_cat_table / get_page_in_cat_multiple all list pages in categories. Count and parsing tools (get_any_count vs the specific *_count tools, parse_cite_type vs parse_citations vs parse_all_citations) also blur boundaries, though descriptions provide some differentiation.
Most names follow a consistent snake_case verb_noun pattern (get_*, extract_*, parse_*, annotate_*). Minor deviations like mixing 'table', 'multiple', and 'with_depth' suffixes for parallel operations introduce slight unpredictability but overall naming is coherent.
38 tools is heavy for the scope, and much of the surface is redundant parallel variants (three subcategory getters, three page-in-category getters, two ISBN annotators, multiple citation parsers). Consolidation would reduce cognitive load.
Coverage is strong across the domain: extraction, parsing, counting, history at multiple levels (subcategory/page), external annotation via EuropePMC/CrossRef/OpenLibrary/Google Books, and derived metrics like sci_score. Minor gaps only in areas like write/update operations, which may be out of scope.
Maintenance
Related MCP Connectors
Check AI references against Crossref and DataCite. DOI/arXiv metadata checks, plus tool discovery.
Claude-powered AI tools: research, write, code, analyze, translate, debate, pitch, score, and more.
Citation and retraction checker for AI agents. Give it DOIs, PubMed or arXiv ids and it says whether each paper exists and whether it was retracted, withdrawn or corrected, using Crossref and Retraction Watch. It also searches publisher articles and open research papers, shows the x402 price in USDC an agent pays to read or cite each one, and traces a passage to the page it was copied from. Free, read-only, no account.
SEO research, Search Console, GA4 and PPC tools for Claude and ChatGPT.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides Claude with real-time access to Wikipedia through four essential tools: search articles, get full content, retrieve summaries, and find related articles. Enables comprehensive Wikipedia research workflows with structured data access and no API keys required.-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to fact-check claims, verify citations, and check source freshness using Wikipedia, Wikidata, Crossref, and Wayback Machine.1MIT
- AlicenseAqualityCmaintenanceEnables searching for scientific papers across OpenAlex, CrossRef, and Unpaywall, and downloading open-access PDFs directly through Claude Desktop.51MIT
- AlicenseBqualityBmaintenanceEnables AI assistants such as Claude to search academic literature, retrieve abstracts and full text, trace citations and multi-generation citation networks, and analyze author profiles, journal quality and bibliometrics from a conversation. It works with Scopus by default and can run the same analyses against OpenAlex without a subscription.3546 PyPI1MIT