Search the UK National Archives' Discovery catalogue; find Chelsea pensioners' papers in WO 97.
Runs on your machine from its package; the steps are below.
Not assessed yet.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
uvx tna-discovery-mcp
MCP client config
{
"mcpServers": {
"uk-national-archives-discovery": {
"command": "uvx",
"args": [
"tna-discovery-mcp"
]
}
}
}An MCP server for Discovery, the catalogue of the UK National Archives (TNA): more than 37 million descriptions of the records held at Kew, and the catalogues of more than 2,500 other archives across the UK and beyond, through TNA's keyless Discovery API.
For family historians the catalogue is where a British soldier, a will, a
muster roll or a county record office's papers are first found. One series
gets a tool of its own: WO 97, the Royal Hospital Chelsea's soldiers'
service documents, which describes every man discharged to a pension from
1760 to 1854 in one standard sentence ("JOHN ATKINSON Born MANCHESTER,
Lancashire Served in Royal Artillery Discharged aged 41"). find_soldier
searches it by name and keeps the men whose regiment, birthplace and
discharge year fit, each parsed into fields with an estimated birth year.
It works the way a careful genealogist does. A catalogue description is a finding aid: it says a record exists and where it is, not what it says. Images of most series are not free on Discovery. WO 97's are on Findmypast, and FamilySearch collection 1952868 indexes them. Every result carries the holding archive, the reference and the record's Discovery page, because the archive's reference is what gets cited, not this server.
It is the UK counterpart of nara-catalog-mcp. Nothing here writes anywhere, and nothing here keeps a family tree.
This is an independent project. It is not affiliated with, endorsed by, or supported by The National Archives.
The server publishes five tools. All are read-only.
| Tool | Purpose |
|---|---|
search_records | Search the catalogue's descriptions by words, series (WO 97), department (WO), covering dates, and holder (TNA, other archives, or one archive by Archon code). Each hit has its id, reference, description, covering dates, holder, a digitised flag and its page; a WO 97 item is parsed too. Reports counts by holder, archive and century. |
get_record | One description in full, by id or by exact reference (WO 97/1211/256): every field Discovery gives, its place in the hierarchy (department, series, piece), where the record can be read, and a citation. A WO 97 item's description is parsed into name, birthplace, county, regiments, discharge age and year, service years and an estimated birth year, keeping the original text. |
browse | The records one level below a series, sub-series or piece, in catalogue order, with a cursor to continue: WO 97's pieces of one regiment's men, WO 12's regiments and their yearly muster books. |
find_soldier | A WO 97 search by surname (a trailing * for variants), forename, discharge years, regiment and birthplace, with each match parsed. Says how many descriptions were read and why the rest were set aside. |
budget_status | Today's requests against the daily budget, this session's, and the last error. Makes no request. |
You need Python 3.11 or later and uv. There is no key to request.
Without cloning. uvx fetches it from PyPI and runs it in one step:
uvx tna-discovery-mcp
From a clone, which is what you want if you will change it:
git clone https://github.com/ianderso/tna-discovery-mcp
cd tna-discovery-mcp
uv sync
uv run tna-discovery-mcp # stdio server, usually launched by the client
Either way the server speaks MCP over stdio, so you will normally let an MCP client start it rather than run it by hand.
{
"mcpServers": {
"tna-discovery": {
"command": "uvx",
"args": ["tna-discovery-mcp"]
}
}
}
A desktop app does not always inherit your shell's PATH. If the server fails
to start because uvx cannot be found, give the full path that which uvx
prints as the command.
claude mcp add tna-discovery -- uvx tna-discovery-mcp
TNA's API page asks developers to email them, with the IP address requests will come from: "please contact us via email and include the IP address". The API answered without it when this server was built, so it is a request, not a condition of access. Because every user of this server sends requests from their own address, the request passes to you: if you use the server regularly, write to webmaster@nationalarchives.gov.uk with your IP address and a line on what you use the API for. TNA also asks for feedback on the API.
Nothing is required. A .env file in the directory the server starts in
supplies anything the environment does not; only that directory is read.
| Variable | Meaning |
|---|---|
TNA_DISCOVERY_TIMEOUT | HTTP timeout in seconds for one request. Default 30. |
TNA_DISCOVERY_MIN_INTERVAL | Least seconds between two requests. Default 1, and never below 1: TNA's guideline. |
TNA_DISCOVERY_DAILY_BUDGET | Requests a day (UTC) before every tool refuses with budget_spent. Default 3,000, and never above it: TNA's guideline. Set it lower to leave headroom. |
TNA_DISCOVERY_CONTACT | An email address or URL added to the User-Agent, so TNA can reach you if your use causes trouble. Optional, and courteous. |
TNA_DISCOVERY_STATE_DIR | Where the day's call count is kept. Default ~/.local/state/tna-discovery-mcp. The file holds a date and a number, never anything the API returned. |
An unusable value is reported on the first tool call as a not_configured
result naming the variable. There is deliberately no cache directory: see
below.
TNA's terms for the Discovery API (read 2026-10-10 and 2026-10-11) say, in brief:
budget_spent and send nothing until midnight UTC.
budget_status shows the count.robots.txt on discovery.nationalarchives.gov.uk disallows the website's
browse, results, search-interface and image paths, among others; it does not
mention /API/, which is what this server uses.
Discovery may be replaced. In late 2025 TNA launched a beta of a new catalogue that may in time take over from Discovery. This server reads the Discovery API only; if Discovery is retired, the server will need a new client for whatever replaces it.
get_record's images says where to read them.digitised has an image on Discovery itself, reached from its Discovery
page. This server downloads nothing.date_from and date_to keep records
whose covering dates overlap the range, so a man who served 1811-1835 is in
a search for 1831-1834. find_soldier then keeps only men whose discharge
year falls in the range.*.find_soldier finds
nobody discharged later; browse the pieces instead.WO 97/1211/256: a department code, a space,
then series, piece and item. The server tidies case and spacing (wo97/1211
works); anything else is searched for, not guessed.reference or date.citation.cite_as is the holder and
reference ("The National Archives, Kew, WO 97/1211/256"); add the series
title, the covering dates and where you read the image.blocked; a spent budget as budget_spent.Tool arguments are written by a model, and the model reads text this server does not control: catalogue descriptions, web pages, other tools' output. The server assumes that text can steer the model, and limits what a steered model can make it do.
https://discovery.nationalarchives.gov.uk/API/.
A request hook refuses any other host, including one named in a redirect;
redirects are followed only on that host.To report a vulnerability, see SECURITY.md.
uv sync --extra dev
uv run pytest # mocked with respx; never touches the API
uv run ruff check .
uv run ruff format --check .
uv run python -m tests.live_check # paced calls to the live API
The live check asks Discovery what the recorded fixtures cannot: whether its answers still have the shape the server reads. See CONTRIBUTING.md for how the suite is organised, docs/API-NOTES.md for what was observed of the API and when, and docs/DESIGN.md for why the server is shaped this way.
The catalogue belongs to The National Archives and the archives whose descriptions it hosts, and is used under the Open Government Licence v3.0: "Contains public sector information licensed under the Open Government Licence v3.0."
MIT.