norway-archives-mcp
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., "@norway-archives-mcp Find baptism records for Ole Hansen in Røros, 1850–1860"
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.
norway-archives-mcp
An MCP server for Norwegian family history: the National Archives' church books, censuses and emigrant lists and their scans, the National Library's books and newspapers, and today's official place names.
Digitalarkivet, run by Nasjonalarkivet (the National Archives of Norway), holds the parish registers (ministerialbøker and klokkerbøker), the censuses of 1801–1920, emigrant protocols, probate records and much more. Some of it is transcribed and searchable; far more is scanned and can only be read page by page. The server does both: it searches the transcriptions, maps a scanned book's lists (baptisms, confirmations, marriages, burials, in- and out-migration) to image numbers, and downloads a page with its permanent id.
Nasjonalbiblioteket (the National Library) has digitised nearly every Norwegian book and newspaper, including the bygdebøker, the farm-by-farm local histories genealogists live in. Many open only from Norwegian addresses, but a search still tells you which page a name is on.
Kartverket's place-name register gives today's spelling, type and coordinates of a farm or hamlet.
It works the way a careful genealogist does. The scanned page is the evidence. A transcription is a lead (most church-book transcriptions were keyed by contractors for Ancestry, MyHeritage and FamilySearch), and a search that finds nothing has only searched what was transcribed. Every page comes back with its source, archive reference, image number and permanent link, so the citation points at the archive, not at this server.
Nothing here writes anywhere but your own disk, and nothing here keeps a family tree.
Tools
The server publishes thirteen tools. All but the two downloads are read-only; those create one new file each and never overwrite one.
Tool | What it does |
| Search Digitalarkivet's transcribed records by name, historical municipality, list type and years. |
| Read one record: its fields, everyone named in it, its source, and the permanent id of its scanned page. |
| Find sources by place, period and list, with which lists are scanned and which are searchable. |
| Describe one source and map its scans: archive reference, image count, and the image each list starts on. |
| List a source's pages in order, optionally from the start of one list, with permanent ids and links. |
| Download one scanned page (church book, census, anything with a page id) with its citation. |
| Search the National Library's books, newspapers, journals, maps and more. |
| Find the pages of one item that mention a word, with snippets and printed page numbers. |
| Read one page of an item: its OCR text where the item is open, and its citation. |
| Download one page image of an item that is open where you are. |
| Search Kartverket's register of official place names (farms, hamlets, lakes, mountains). |
| Look up Digitalarkivet's historical municipalities and their numbers, and the list-type codes. No network. |
| This session's requests, Digitalarkivet's daily budget, and cache use. No network. |
A typical path through an untranscribed list (confirmations, say):
da_search_sources(municipality="Røros", list_type="kf")finds the church books that hold confirmations, and says the confirmations are scanned but not searchable.da_get_source(source_id=6540)gives the image the confirmations start on.da_list_pages(source_id=6540, section="kf")lists those pages with their permanent ids.da_download_page(page_id="kb2007…", destination=…)saves each page to read, with a citation such as Church book from Røros parish 1860-1878 (1640P), AV/SAT-A-1456/681/L0932, image 171 of 464 (kb20070419660172). Nasjonalarkivet (The National Archives of Norway), Digitalarkivet. https://goto.digitalarkivet.no/kb20070419660172.
Related MCP server: datanorge
Setup
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 norway-archives-mcpFrom a clone, which is what you want if you will change it:
git clone https://github.com/ianderso/norway-archives-mcp
cd norway-archives-mcp
uv sync
uv run norway-archives-mcp # stdio server, usually launched by the clientEither way the server speaks MCP over stdio, so you will normally let an MCP client start it rather than run it by hand.
Claude Desktop
{
"mcpServers": {
"norway-archives": {
"command": "uvx",
"args": ["norway-archives-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 Code
claude mcp add norway-archives -- uvx norway-archives-mcpConfiguration
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 |
| Cache directory, which also holds the daily request count. Default |
| HTTP timeout in seconds for one request. Default 30. Image downloads get 120 to read. |
| Least seconds between two Digitalarkivet requests. Default 5, and never below 5. |
| Most live Digitalarkivet requests per UTC day. Default 600. Cached answers are free. |
| An email address or URL added to the User-Agent, so an archive can reach you if your use causes trouble. Optional, and courteous. |
| An existing folder. When set, the downloads save only inside it. Set it to save into an iCloud Drive folder, which lives under |
An unusable value is reported on the first tool call as a not_configured
result naming the variable.
Being a good guest, and what the terms say
Digitalarkivet publishes no API and no terms-of-use page; its footer
links only privacy and accessibility statements. Its reuse page says scans
without restrictions "kan disse fritt brukes videre både i trykksaker og på
internett": they may be freely reused in print and online, with the holding
archive credited
(digitalarkivet.no/content/1570).
Its robots.txt asks every crawler for five seconds between requests and
disallows a list of named bots, AI agents among them. This server is not a
crawler: it fetches the pages a researcher asks for, one at a time, at least
five seconds apart (configurable upward only), within a daily budget, with a
User-Agent that names it. Search, record and source pages are cached as
parsed results for 1, 30 and 30 days; manifests for 30; permalink lookups for
a year.
The National Library's API is documented and keyless (api.nb.no). Access to each item follows the library's own rules: material marked for Norway opens only from Norwegian addresses (foreign researchers can apply for access to the Bokhylla collection), and this server reports that rather than working around it. One request a second.
Kartverket's place-name API needs no login or authorisation, in its own words "ikke nødvendig med innlogging/autorisasjon" (api.kartverket.no/stedsnavn). Two requests a second at most.
A 429, a 5xx or a dropped connection gets one retry, honouring Retry-After.
A bot check is reported as blocked and left alone.
How to read what comes back
A transcription is not the record. Read the scanned page (
da_download_page) before citing a name, a date or a relationship.A zero is narrow.
da_search_personssearches transcribed lists only.da_search_sourcesshows which lists are scanned but not searchable; confirmations and migration lists often are. Page through them.Municipalities moved. The
da_tools filter by the historical municipalities Digitalarkivet uses (seemunicipalities);place_namesreports today's, after the mergers of 2020 and earlier.Section boundaries are approximate.
da_get_sourcegives the image a list starts on; it usually runs until the next list starts, but books were not always kept in order.Norway-only books still answer.
nb_search_insidegives the printed page number of a hit even where the page cannot be shown here.Census pages (ids beginning
ft) come from the older viewer at full resolution only.
Deliberately not here
Writing anything, or logging in. No tool sends a correction, a report or a message to any service.
The Norwegian Historical Population Register (HBR), whose search is a form and whose API is for partners.
Norway Heritage, whose terms forbid duplication or redistribution without permission.
Working around access rules: Norway-only material, restricted recent records, or bot checks.
Security
Tool arguments are written by a model, and the model reads text this server does not control: record transcriptions, catalogue entries, OCR. The server assumes that text can steer the model, and limits what a steered model can make it do.
Which hosts. Requests go only to the three services' fixed hosts over https. Any other host is refused, including addresses taken from a response. Redirects are followed only within one service.
How much. A page or JSON answer over 8 MB, or an image over 60 MB, is refused as it streams in.
Which files. The downloads create one new file and never overwrite one. The bytes must be a JPEG, judged by their first bytes, and the file must end in
.jpgor.jpeg. Never a hidden file or folder, never under~/Library, and withNORWAY_ARCHIVES_DOWNLOAD_DIRset, never outside it, all judged after links are resolved. A refused download leaves nothing on disk.Arguments are validated (page ids, item ids, record addresses) before they reach a request.
Site text is untrusted. The server's instructions tell the model to treat record and catalogue text as material to weigh, never as instructions.
To report a vulnerability, see SECURITY.md.
Development
uv sync --extra dev
uv run pytest # mocked with respx; never touches a site
uv run ruff check .
uv run ruff format --check .
uv run python -m tests.live_check # paced calls to the live servicesSee CONTRIBUTING.md for how the suite is organised, docs/API-NOTES.md for what was observed of each service and when, and docs/DESIGN.md for why the server is shaped this way.
Credits
The records, scans and catalogue belong to Nasjonalarkivet, Nasjonalbiblioteket and Kartverket. Most church-book transcriptions were made by AMF (Ancestry, MyHeritage and FamilySearch) under agreement with the National Archives.
License
MIT.
Available Tools
13 toolscache_statusARead-only
Report this session's requests, by service, the Digitalarkivet budget, and cache use.
Inputs: no named parameters.
da_download_pageAIdempotent
Download one scanned page from Digitalarkivet so it can be read.
This is the step that turns a hit into evidence. Returns the citation (source, archive reference, image number, permanent link). Census pages (ft… ids) come at full resolution only.
Inputs: destination (required), image, page_id, source_id, +1 more.
da_get_recordARead-only
Read one transcribed record: its fields, everyone named in it, and its scanned page.
scanned_pages gives the permanent page id to pass to da_download_page.
Inputs: record (required), refresh.
da_get_sourceARead-only
Describe one source and map its scans: archive reference, images, where each list starts.
Sections are the lists in the book (baptisms, confirmations, out-migrated…) with the image each begins on; a list usually runs until the next starts.
Inputs: source_id (required), refresh.
da_list_pagesARead-only
List a source's scanned pages in order, with each page's permanent id and permalink.
For reading a list nobody transcribed: pass page ids to da_download_page.
Inputs: source_id (required), count, start, refresh, +1 more.
da_search_personsARead-only
Search Digitalarkivet's transcribed records for a person.
Covers transcribed church-book entries, censuses (1801-1920), emigrant lists and more. Each hit gives the record's address for da_get_record. Only transcribed lists are searched.
Inputs: page, refresh, domicile, last_name, +9 more.
da_search_sourcesARead-only
Find sources (church books, censuses, probate records) by place, period and list.
Each source says which lists it holds, which are scanned and which are searchable. A list that is scanned but not searchable can still be read page by page with da_get_source and da_list_pages.
Inputs: page, query, refresh, year_to, +3 more.
municipalitiesARead-only
Look up Digitalarkivet's historical municipalities and their numbers. Makes no network call.
The da_ tools filter by these (as they stood around 1947), not by today's merged municipalities. Also lists the list-type codes.
Inputs: query, county.
nb_download_pageBIdempotent
Download one page image of a National Library item that is open where you are.
Inputs: item_id (required), destination (required), page, image, +2 more.
nb_get_pageBRead-only
Read one page of a National Library item: its OCR text where it is open, and its citation.
Inputs: item_id (required), page, image, page_id, +1 more.
nb_searchARead-only
Search the National Library of Norway's books, newspapers and more.
Each item says where it can be read: everywhere, Norway only, or the library only. nb_search_inside finds the page in any of them.
Inputs: query (required), page, refresh, year_to, +4 more.
nb_search_insideARead-only
Find the pages of one book or newspaper that mention a word, with snippets.
Works for Norway-only items too: the printed page number tells you what to request from a library even when the page cannot be shown here.
Inputs: query (required), item_id (required), max_snippets.
place_namesARead-only
Find farms, hamlets and other places in Kartverket's official place-name register.
Gives today's spelling, type (farm, village, lake…), municipality and coordinates. Old spellings in records often differ: try a wildcard or fuzzy.
Inputs: name (required), fuzzy, limit, county, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 13 tools
Each tool targets a distinct resource/action pair, and the da_/nb_ prefixes cleanly separate the two archive services. Close pairs like da_get_record vs nb_get_page and da_download_page vs nb_download_page are explicitly differentiated, and nb_search vs nb_search_inside is clarified in the descriptions. place_names vs municipalities are also distinct (gazetteer vs historical administrative codes).
The dominant pattern is consistent service-prefixed verb_noun snake_case (da_search_persons, da_get_source, nb_download_page), which is predictable and readable. Minor deviations are the noun-only place_names and municipalities and the meta-tool cache_status, but these are few and still clear.
At 13 tools the set is well-scoped: roughly four tools per archive service plus two geographic lookups and one session utility. Every tool has a clear role in the research workflow, and nothing feels padded or redundant.
The surface covers a full pipeline from discovery (search persons/sources/items) through inspection (get record/source, list pages, search inside) to evidence (download page, get page, citation data), plus place and municipality lookups. Gaps are minor: there is no unified cross-service search, no tool for browsing holdings beyond place/period queries, and no explicit citation-export operation, but agents can work around these.
Maintenance
Related MCP Connectors
MCP server for Open Archives: Dutch genealogical records and historical page transcriptions.
MCP for CanLII: Canadian case law and legislation metadata (federal, provincial, territorial).
Hosted MCP server for finding authoritative primary data sources and official portals.
Read-only OpenHeritage search for genealogy and cultural heritage records.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables users to search and access digital collections from the Swedish National Archives (Riksarkivet) through multiple APIs. Supports searching records by keywords, exploring collections, and downloading historical images and documents.227Apache 2.0
- AlicenseAqualityDmaintenanceAn MCP server to find and fetch Norwegian open government data from data.norge.no. Enables search, metadata retrieval, and data download.54MIT
- AlicenseBqualityBmaintenanceMCP server providing typed tools for Norwegian public data sources, enabling natural language queries to official datasets like SSB, Brønnøysund, MET, Kartverket, Entur, and more, without requiring API keys.47MIT
- AlicenseBqualityBmaintenanceFamily history research toolkit with 79 archives and databases, name variants, historical calendars, kinship, evidence checks, GEDCOM auditing and archive-request drafts. An MIT-licensed Python MCP server that runs locally without API keys or network requests.31135 PyPI6MIT