WIKI-MCP — Local OSRS Wiki mirror + MCP service (feasibility research)
All claims below were verified live against the wiki's endpoints on this date (three parallel research passes).
Date: 2026-07-02. Verdict: fully feasible, sanctioned by the wiki's own policy, and nobody has built it yet. All claims below were verified live against the wiki's endpoints on this date (three parallel research passes).
Why
Tier-B/C content work currently confirms mechanics by fetching oldschool.runescape.wiki pages over the web and parsing HTML — slow, token-expensive, and repeated per session. A local mirror + MCP server makes every rate/id/mechanic lookup a cheap local query.
1. Getting the data locally — what's actually available
Bulk wikitext (the mirror substrate)
- No official XML/SQL dumps exist.
data.weirdgloop.orgdoesn't exist; the only archive.org dump is the stale 2020 Fandom wiki (pre-fork, wrong site). The wiki FAQ's official answer for downloads is Special:Export ("All wiki pages are made available for download"). - The Action API is the practical bulk path (
https://oldschool.runescape.wiki/api.php, MediaWiki 1.45.3, no auth for reads):action=query&generator=allpages&gaplimit=max&prop=revisions&rvprop=content&rvslots=mainreturns 500 page entries per batch; the response size cap fills wikitext for ~20 pages per response and issuescontinue/rvcontinuetokens — loop until drained.rest.php/v1/page/<Title>works for single pages. - Scale is small: 40,939 content pages (549k total incl. redirects/talk/modules; 115k files). Current-revision wikitext of the content namespace ≈ a few hundred MB uncompressed. A full initial sync is roughly a couple thousand requests — well under an hour at polite rates.
- Delta sync: poll
action=query&list=recentchanges(rcstart/rcend, rclimit=500 + rccontinue) since the last sync timestamp and refetch changed pages. Overlap polling windows (changes can land slightly out of timestamp order); the retention window is server-configured (Wikimedia default 30 days), so don't let the mirror lag months.
Terms / etiquette (from the canonical https://runescape.wiki/w/Help:APIs)
- Descriptive User-Agent is mandatory — default
python-requests/ApacheHttpClientUA strings are pre-emptively blocked. Something likeosrs-leagues-dev-wiki-mirror (contact@example.com). - No hard rate limit, but sustained double-digit req/s risks a block. Single-digit req/s +
maxlag=5is safe. They ask heavy users to say hi on their Discord. - License: CC BY-NC-SA 3.0 (post-2018 revisions; pre-fork is BY-SA). A private, non-commercial local mirror is squarely permitted — attribution/share-alike only bite on redistribution.
Structured data — SMW is DEAD, Bucket replaced it (big win)
Weird Gloop removed Semantic MediaWiki entirely (action=ask → "Unrecognized value for parameter action")
and replaced it with their own Bucket extension (meta.weirdgloop.org/w/Extension:Bucket,
github.com/weirdgloop/mediawiki-extensions-Bucket) — live and queryable today:
GET api.php?action=bucket&format=json&query=bucket('infobox_item').select('item_id','item_name','examine').where('item_name','Abyssal whip').run()- Fluent SQL-ish Lua query string:
.select() .where() .join() .limit(). Verified live (whip → ids 4151/4178/20405- examine). Repeated fields (e.g.
item_id) come back as arrays.
- examine). Repeated fields (e.g.
- 45 buckets on the OSRS wiki, schemas readable raw from the
Bucket:namespace (ns 9592 — magic glue joke), e.g.w/Bucket:Dropsline?action=raw. Highlights:infobox_item,infobox_monster,infobox_npc,infobox_bonuses,infobox_scenery,infobox_shop,infobox_spell,dropsline,drop_table_sources,exchange,storeline,locline,recipe,quest,varbit,collection_log_source,combat_achievement,money_making_guide,transcript,update, plus Sailing-era buckets. dropsline.drop_jsonis the old "Drops JSON" reborn — per-drop blobs with Rarity, Quantity Low/High, Rolls, Drop level, andLeague regiontags (e.g."general,kourend,morytania"). Directly useful for the Leagues server.- Caveat: README calls the API "unstable, may change" — fine for us since we snapshot locally; a schema change breaks the sync script, not the dataset.
- Templates (Infobox Item/Monster, DropsLine, …) remain the canonical source — their Lua modules
bucket.put()the data. So wikitext parsing and Bucket agree by construction; Bucket is just the pre-indexed view.
GE / prices (live APIs, no mirroring needed)
https://prices.runescape.wiki/api/v1/osrs/—/latest,/mapping(id→name/examine/members/alch/limit),/5m,/1h,/timeseries. Same UA rules.https://api.weirdgloop.org/exchange/history/osrs/latest?name=...— official-GE daily price/volume.- Bulk Lua/JSON on-wiki:
Module:Exchange/<Item>?action=raw(per-item) andModule:GEPrices/data.json,GEIDs/data.json,GELimits/data.json, etc. (note: the oldModule:GEPrices/datapath is 404 — they moved to.jsonsubpages).
2. Landscape — nothing like this exists yet
- Every discoverable OSRS MCP server is a live-API proxy (JayArrowz/mcp-osrs is the biggest — wiki search, GE, hiscores + bundled cache-dump text files; isaachansen/wiki-osrs-mcp, birdwell/runescape-wiki-mcp, stjepko-xyz/mcp-server-runescape). No local-mirror design exists.
- osrsbox-db is dead (last commit 2021); its fork osrsreboxed-db last committed 2025-01 — both stale. The healthy non-wiki data source is cache-side: abextm/osrs-cache (automated flatcache dumps per game update, rev-238 current) — which we already have covered via our own dumps.
- Proven building blocks: mwparserfromhell (Python) for infobox/DropsLine param extraction from wikitext (what osrsbox used; escalate to wikitextprocessor only if we ever need full template/Lua expansion), SQLite FTS5 for full-text search (what Datasette-class tools use; no service to run), wikiteam3 if we ever want a one-shot XML dump instead of API paging. Kiwix ZIM is a dead end (rendered HTML, no OSRS ZIM exists).
3. Recommended architecture
One new project: mcp/wiki-mcp/ (Python; sibling to the rsprox checkout).
Store: one SQLite file (osrs-wiki.db):
| table | contents |
|---|---|
pages | title, ns, page_id, revid, touched, wikitext (main ns; optionally Template:/Module: ns later) |
pages_fts | FTS5 external-content index over title + wikitext |
bucket_<name> | snapshot of each of the 45 buckets, dumped via paginated action=bucket .limit() queries |
meta | last recentchanges sync timestamp, per-bucket dump timestamps |
Sync CLI (sync.py): --full (initial allpages crawl + all-bucket dump), --delta (recentchanges since
last sync → refetch changed pages; re-dump buckets weekly or on demand). Polite client: custom UA, maxlag=5,
~4 req/s, resumable via continue tokens.
MCP server (stdio, FastMCP) — tools:
wiki_search(query)— FTS5 BM25 over the local mirror (title-boosted)wiki_page(title)— raw wikitext (follows redirects)wiki_infobox(title)— mwparserfromhell-extracted template params as JSON (Infobox Item/Monster/Bonuses/…)wiki_drops(monster)— dropsline rows incl. drop_json + League region tagsbucket_query(bucket, filters)— SQL over the local bucket snapshots (with optional live passthrough flag)ge_price(item)— live prices.runescape.wiki (prices are the one thing not worth mirroring)wiki_sync_status()— mirror freshness, so the agent knows when to distrust the data
Freshness model: the game updates weekly; a --delta run after each game update (or a scheduled weekly run)
keeps the mirror current for pennies. wiki_sync_status lets the agent see staleness instead of guessing.
4. Effort & risks
- Effort: sync script ~half a day; MCP server + extraction helpers ~half a day; initial full sync <1 hour of wall-clock crawling. Total ≈ one focused day for a v1 (pages + FTS + infobox/drops tools), buckets snapshot as v1.1.
- Risks: Bucket API instability (contained — breaks sync, not data); response-size pagination quirks in the
allpages crawl (handled by honoring
continuereligiously); drop_json shape undocumented (snapshot it and inspect — it's already JSON).
Sources
Help:APIs (runescape.wiki/w/Help:APIs) · RuneScape:Bucket (oldschool wiki) · Extension:Bucket + /Api (meta.weirdgloop.org) · github.com/weirdgloop/mediawiki-extensions-Bucket · live api.php probes (siteinfo, allpages+revisions, action=bucket, action=ask removal) · rest.php/v1/page probe · Special:Export · RuneScape:Frequently_asked_questions · meta.weirdgloop.org/w/Licensing · weirdgloop.org/terms · RuneScape:Real-time_Prices · api.weirdgloop.org live probe · Module:GEPrices/data.json?action=raw probe · github: JayArrowz/mcp-osrs, isaachansen/wiki-osrs-mcp, osrsbox/osrsbox-db, 0xNeffarion/osrsreboxed-db, abextm/osrs-cache, earwig/mwparserfromhell, tatuylonen/wikitextprocessor, saveweb/wikiteam3, Dava96/osrs-wiki-bucket-builder · mediawiki.org API:RecentChanges · Datasette/APSW FTS5 docs