Metadata-Version: 2.5
Name: norwegian-data-mcp
Version: 0.2.0
Summary: Norwegian public data (companies, statistics, addresses) as MCP tools. No API keys.
Project-URL: Homepage, https://github.com/7nashinick/norwegian-data-mcp
Author: 7nashinick
License: MIT
License-File: LICENSE
Keywords: brreg,kartverket,mcp,norway,open-data,ssb
Requires-Python: >=3.10
Requires-Dist: httpx>=0.27
Requires-Dist: mcp>=2
Provides-Extra: dev
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
Requires-Dist: pytest>=8; extra == 'dev'
Requires-Dist: ruff>=0.5; extra == 'dev'
Description-Content-Type: text/markdown

# norwegian-data-mcp

Norwegian public data in your AI assistant: companies, statistics, addresses, property. One MCP server, zero API keys, zero signup.

Ask Claude (or any MCP client) things like *"who is on the board of Equinor and what was their revenue last year?"* or *"how has Norwegian inflation moved this year?"* and it answers from the official registers, with sources.

## Install

Claude Code:

```
claude mcp add norway -- uvx norwegian-data-mcp
```

Claude Desktop (`claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "norway": {
      "command": "uvx",
      "args": ["norwegian-data-mcp"]
    }
  }
}
```

Any other MCP client: run `uvx norwegian-data-mcp` (or `pip install norwegian-data-mcp` and run `norwegian-data-mcp`) as a stdio server.

## Tools

| Tool | Answers | Source |
|---|---|---|
| `search_companies` | "find companies that..." | Brønnøysundregistrene |
| `get_company` | full company record by orgnr | Brønnøysundregistrene |
| `get_company_roles` | board, CEO, auditor | Brønnøysundregistrene |
| `get_company_financials` | latest filed revenue, profit, balance sheet | Regnskapsregisteret |
| `get_group_structure` | subsidiaries and ownership stakes as a tree | Brønnøysundregistrene |
| `search_statistics` | find any of SSB's ~7,000 tables | SSB (Statistics Norway) |
| `get_table_info` | a table's variables and value codes | SSB |
| `get_statistics` | the numbers, as compact CSV | SSB |
| `get_key_series` | CPI, population, unemployment, house prices, wages, interest rates in one call | SSB |
| `get_exchange_rates` | daily NOK rates for any currency | Norges Bank |
| `search_address` | address to coordinates + gnr/bnr | Kartverket |
| `reverse_geocode` | coordinates to nearest addresses | Kartverket |
| `get_property` | cadastral parcel location and boundary | Kartverket |
| `get_place` | mountains, lakes, farms to coordinates | Kartverket |

## Try these

- "Who is on the board of Equinor, and what was their revenue last year?"
- "Find all breweries in Bergen. Any of them bankrupt?"
- "What's Norway's inflation rate right now, and how does the last year look?"
- "Population of Oslo over the last 10 years."
- "What are the coordinates and gnr/bnr of Karl Johans gate 22, Oslo?"
- "Norwegian mortgage and policy interest rates over the last two years."
- "How has the krone moved against the dollar and euro this month?"
- "Map Equinor's subsidiaries with ownership stakes."

## How responses look

Every tool returns a compact JSON envelope: the data (statistics come as CSV, the most token-efficient table format), a `hints` list that tells the model how to narrow or continue, and a `source` string naming the register and license. Responses are capped in size; SSB's dense JSON-stat2 cubes are flattened to plain tables with time on the rows.

When SSB closes a table (it happens: CPI table 03013 was replaced by 14700 in 2026), the server reads the succession note and follows or suggests the successor instead of failing.

## Data sources and licenses

| Register | License | Terms |
|---|---|---|
| SSB, Statistics Norway | [CC BY 4.0](https://www.ssb.no/en/diverse/lisens) | 30 requests/minute, respected client-side |
| Brønnøysundregistrene (Enhetsregisteret, Regnskapsregisteret) | [NLOD 2.0](https://data.norge.no/nlod/en/2.0) | open API, fair use |
| Norges Bank (exchange rates) | [NLOD 2.0](https://data.norge.no/nlod/en/2.0) | open SDMX API |
| Kartverket (addresses, cadastre, place names) | [CC BY 4.0](https://www.kartverket.no/en/api-and-data/terms-of-use) | © Kartverket |

All four are open government data with no key or registration. Every response carries its attribution, so the model can cite it.

### What this server will not do

- **Property owners, buildings, valuations, grunnbok**: Norway keeps these behind a licensed Matrikkel agreement that private individuals cannot apply for. No open API exists, so no tool pretends otherwise.
- **Shareholder registers and tax lists**: no open APIs exist; tax-list searches are logged and the searched person is notified.
- **Person search**: looking up all roles a person holds across companies is legally restricted (enhetsregisterloven §9-1). Per-company roles are the lawful slice and that is what `get_company_roles` serves.
- **Historical financials**: the open Regnskapsregisteret API serves the latest filed year only; the tool links the official annual-report PDF for the rest.

## Development

```
python -m venv .venv && .venv/bin/pip install -e '.[dev]'
.venv/bin/pytest                                # offline, fixtures only
.venv/bin/pytest -m live --override-ini addopts=''  # live smoke against the real APIs
```

Runtime dependencies are `mcp` and `httpx`, nothing else. Responses are cached with per-source TTLs (in memory plus `~/.cache/norwegian-data-mcp`, disable with `NORWEGIAN_DATA_MCP_CACHE=off`), and a stale cached copy is served with a note if a register is briefly unreachable.

## Roadmap

- plot area via the Teig WFS, daily policy-rate series, elevation and kommune info tools
- streamable HTTP transport for hosted use

<!-- mcp-name: io.github.7nashinick/norwegian-data-mcp -->
