wikipedia-mcp-server
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., "@wikipedia-mcp-serverget summary of Albert Einstein"
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.
Public Hosted Server: https://wikipedia.caseyjhand.com/mcp
Overview
Wikipedia content via the MediaWiki REST API and Action API. Search articles, read summaries or targeted sections, find geotagged pages near a coordinate, and list language editions from any MCP client. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
Tools
Tool | Description |
| Full-text search across Wikipedia, returning ranked results with short descriptions, Wikidata QIDs, plain-text snippets, and page IDs, plus Wikipedia's spelling suggestion. |
| Short summary for any article — plain text, Wikidata QID, description, thumbnail URL, page type, canonical URL, revision, and coordinates. |
| Full article or a targeted section as clean plain text, with section markers preserved, the canonical URL, and the revision it was read from. |
| Table of contents with |
| Geotagged Wikipedia articles within a radius of a WGS 84 coordinate, sorted by distance, with short descriptions and Wikidata QIDs. |
| All language editions available for an article, with titles and URLs, or just the editions you ask for. |
Related MCP server: mcp-mediawiki-crunchtools
Capability reference
wikipedia_search_articles tool
Free-text query, ranked by relevance; returns plain-text snippets (HTML stripped), page IDs, and word counts
Each result carries the article's short
descriptionand Wikidata QID (wikibase_item) when it has them, from one follow-up lookup per page of results. That lookup is best-effort: if it fails, the results still come back without the two fields and thenoticesays soEnrichment
suggestioncarries Wikipedia's spelling correction whenever it has one (einstien→einstein), and a zero-hit first page names it in thenotice— re-run with it asquerylimitis 1–50;offsetpages further results — enrichmentnextOffsetsignals more remain and is passed back asoffsetWikipedia serves no result past the 10,000th for a query: an
offsetat or beyond it fails withoffset_too_large, and a page ending on the window carries enrichmenttruncatednaming the matches no offset reaches — narrow the query to bring them into rangeAn empty
queryfails withempty_query; a whitespace-only query is a real search that simply matches nothinglanguageselects any Wikipedia edition (defaulten)Best when the exact article title is unknown, or to discover multiple articles on a topic
wikipedia_get_summary tool
Returns the REST summary extract — a truncated fragment from the start of the lead, not the whole lead — plus the Wikidata QID (
wikibase_item), short description, and thumbnail URLurlis the canonical article URL, andrevision_id/last_modifiedname the revision the extract was read from —?oldid=<revision_id>is a permanent link to itSuperscripts and subscripts in the extract stay distinct from the digits beside them (
10²³,H₂O), rendered the same way as onwikipedia_get_articlelatitude/longitudeare present for a geotagged article and pass straight towikipedia_search_nearby, whose inputs carry those names; both are absent otherwiseFor the lead section in full, call
wikipedia_get_articlewithsection_index: 0page_typediscriminatesstandard/disambiguation/no-extract— ondisambiguation, re-query withwikipedia_search_articlesfor a more specific titleRedirect pages are followed automatically
Right tool for most encyclopedic "what is X?" lookups; use
wikipedia_get_articlefor full depth
wikipedia_get_article tool
Without
section_index: full article with== Section ==markers, unless it exceedsWIKIPEDIA_ARTICLE_OVERFLOW_BYTES(default 80,000 bytes) — then returns a section outline (truncated: true) pointing towikipedia_get_sectionsplus a targetedsection_indexreadWith
section_index(fromwikipedia_get_sections): returns that section plus every nested subsection, each heading above its own bodysection_index: 0is the lead section — the text above the first heading, returned under the titleIntroductionBoth paths render code samples as fenced blocks with indentation intact and formulas as their TeX. Section reads also render data tables as pipe-delimited rows (header row,
| --- |, then one line per row;rowspancells repeated) and infoboxes aslabel: valuelines; a table over 40,000 rendered bytes leaves a[table omitted: N rows]marker. The full-article path carries no tables or infoboxes — upstream extracts strip them — so read the section for thoseLayout-only tables (multi-column lists, succession boxes) keep their content as ordinary text
Superscripts and subscripts stay distinct from the digits beside them:
10²³,mol⁻¹,H₂O, or^x/_xwhere a character has no Unicode form. An abbreviation's superscript stays joined, as the edition writes it in plain text (FrenchXIXe siècle,1er,Mme)Every read returns
url(the canonical article URL) andrevision_id(the revision the text was read from —?oldid=<revision_id>is a permanent link to it); a full read, outline included, also returnslast_modified, that revision's timestamp. For a redirect, all three name the target article. WithWIKIPEDIA_BASE_URLset, a section read omitsurl, since the mirror's article path is unknownPage furniture — maintenance banners, sister-project and library-resource boxes, portal bars, spoken-article notices — is stripped, as are the editor-only preview warnings a section render emits; hatnotes are kept
Redirect pages are followed automatically
wikipedia_get_sections tool
Returns section titles, heading levels, hierarchical numbering (e.g.
"2.1"), andsection_indexvaluesThe first entry is the lead:
index: 0, titledIntroduction— Wikipedia's own table of contents starts at the first headingsection_indexis the integer to pass towikipedia_get_articlefor a targeted readFails with
no_sectionson a stub or very short article — read it withwikipedia_get_articleinsteadRedirect pages are followed automatically
wikipedia_search_nearby tool
Returns geotagged articles sorted ascending by distance, with coordinates,
distance_meters, and each article's shortdescriptionand Wikidata QID (wikibase_item) when it has themradius_meters: 10–10,000 (default 1000);limit: 1–500 (default 10) — no pagination pastlimit, so raise it or sweep narrower radii for full coverageOnly articles carrying their own coordinate tag (GeoData, set on the article — not the Wikidata item's coordinate) are returned, and that tag places and measures each result. An article with a wrong tag appears where the tag puts it; its
descriptionusually gives it away (Palazzo Bernardo Nani— "Palace on the Grand Canal, Venice" — 161 m from the Eiffel Tower)Enrichment
truncatedflags when more articles matched thanlimitallowed; atlimit: 500, Wikipedia's ceiling, a full page reportstruncatedand the notice points to narrower sweeps rather than a higher limit
wikipedia_get_languages tool
Returns each edition's
language_code, tool-usableedition_code(can differ, e.g.gswvsals), article title, and URLPass
edition_code— notlanguage_code— as thelanguageparameter on other toolseditionsnarrows the answer to the codes asked for, matched against bothedition_codeandlanguage_code; requested codes with no article come back undermissing, andtotal_languagesstays the unfiltered count. A popular article lists hundreds of editions, so the filter is the difference between a 40 KB reply and a 1 KB oneFails with
no_other_languageswhen the article has no translations — a filter that matches nothing is a normal response with an empty list, not a failureRedirect pages are followed automatically;
source_titlereports the resolved title
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
Wikipedia-specific:
Dual API integration — MediaWiki REST API (
/api/rest_v1/) for summaries, Action API (/w/api.php) for search, full text, sections, geo search, and language linksRetry and backoff on every required request, including the transient refusals (search too busy, rate-limited, read-only) the Action API returns inside an HTTP 200 body, with an upstream
Retry-Afterhonored and each request's retries bounded at 30 s. The best-effort description lookup on search results gets one short attempt;User-Agentheader per Wikimedia API policyEvery read path renders HTML through one renderer to the same plain-text shape —
== Heading ==markers, one list item per line, superscripts kept, code fenced: the full article from the Action API's HTML extract, a section from the parser's own HTML for that section, the summary from the RESTextract_html. A section read additionally carries data tables, infoboxes, and the lists inside layout tables, none of which the extract carriesPer-call
languageparameter on every tool — all Wikipedia language editions accessible in a single sessionLanguage validation against a live edition registry built from the MediaWiki
action=sitematrixendpoint (cached 24h) — catches structurally valid but nonexistent editions before they cause timeouts
Agent-friendly output:
page_typeon summaries discriminatesstandard/disambiguation/no-extract— no string parsing neededwikibase_item(Wikidata QID) on summaries and on search and nearby results enables direct cross-referencing with wikidata-mcp-serverArticle text, snippets, and titles are backslash-escaped on the way into the markdown
content[]render, so an article that writes about markup or markdown syntax reads as itself instead of being interpreted by the client;structuredContentcarries the same text unescaped. Fenced code blocks and table-row delimiters pass through unescaped, while table cells stay escapedsection_indexon table-of-contents entries links directly to the targeted-read parameter onwikipedia_get_article, index 0 includedTitles MediaWiki cannot name a page with —
< > [ ] { }, the|multi-title separator, percent escapes, magic tildes, relative paths — are refused before any request, withinvalid_title; a trailing#fragmentis accepted and resolves normallyRecovery hints on every error type — callers get actionable next steps (e.g., "use
wikipedia_search_articlesto find the correct title")
Getting started
Public Hosted Instance
A public instance is available at https://wikipedia.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"wikipedia-mcp-server": {
"type": "streamable-http",
"url": "https://wikipedia.caseyjhand.com/mcp"
}
}
}Self-Hosted / Local
Add the following to your MCP client configuration file.
{
"mcpServers": {
"wikipedia-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/wikipedia-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"wikipedia-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/wikipedia-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with Docker:
{
"mcpServers": {
"wikipedia-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/wikipedia-mcp-server:latest"
]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.3.0 or higher (or Node.js v24+).
No API keys required — Wikipedia's API is public.
Installation
Clone the repository:
git clone https://github.com/cyanheads/wikipedia-mcp-server.gitNavigate into the directory:
cd wikipedia-mcp-serverInstall dependencies:
bun installConfigure environment (optional):
cp .env.example .env
# edit .env if you want to customize WIKIPEDIA_USER_AGENT or loggingConfiguration
Variable | Description | Default |
| User-Agent header sent with every Wikimedia API request. Customize for your deployment. |
|
| Optional single-instance override. Unset (default): compose per-language hosts, | (unset) |
| Byte budget above which a full-article read ( |
|
| Transport: |
|
| Port for HTTP server. |
|
| HTTP session mode: |
|
| Auth mode: |
|
| Log level (RFC 5424). |
|
| Directory for log files (Node.js only). |
|
| Enable OpenTelemetry instrumentation (spans, metrics, completion logs). |
|
See .env.example for the full list of optional overrides.
Running the server
Local development
Build and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t wikipedia-mcp-server .
docker run --rm -p 3010:3010 wikipedia-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/wikipedia-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
|
|
| Server-specific environment variable parsing and validation with Zod. |
| Tool definitions ( |
| WikipediaService — REST API + Action API client with retry/backoff and language validation. |
| Unit and integration tests mirroring |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storageRegister new tools in
src/mcp-server/tools/definitions/index.tsWrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
Wikipedia MCP — wraps Wikipedia REST API (free, no auth)
MCP server for Russian books search, details, and recommendation candidates.
Read-only MCP for the Eco game wiki: search, Markdown pages, and wiki_* lookups. No keys, no writes.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server that retrieves and provides Wikipedia content for requested topics, enabling easy access to Wikipedia information directly through the Model Control Protocol.1-
- AlicenseBqualityAmaintenanceA secure MCP server for interacting with MediaWiki instances, allowing users to search, read, create, and manage wiki content like pages, categories, and files. It supports both public and private wikis with comprehensive authentication for full read and write operations.19AGPL 3.0
- FlicenseAqualityDmaintenanceA generic MCP server that allows searching and retrieving articles, summaries, category members, and wiki info from any Fandom wiki.5-
- FlicenseNot gradedqualityDmaintenanceMCP server providing live Wikipedia recent changes feed, page summaries, trending pages, and Wikidata entity lookup.-