Skip to main content
Glama
synjan

mcp-datanorge

by synjan
README.md
# mcp-datanorge

MCP-server for [data.norge.no](https://data.norge.no) — Felles datakatalog, Norges
nasjonale oversikt over offentlige datasett, API-er, begreper, informasjonsmodeller,
tjenester og hendelser.

Serveren gir en agent seks verktøy: fra spørsmål i naturlig språk, via presist søk og
SPARQL, til nedlasting av de faktiske dataene hos utgiveren.

Alle API-ene er åpne og krever ingen autentisering.

## Verktøy

| Verktøy | Hva det gjør |
| --- | --- |
| `ask` | KI-søk. Spørsmål på norsk inn, rangerte ressurser ut, hver med begrunnelse. Start her. |
| `search` | Fulltekstsøk med filtre, paginering og aggregeringer over utgiver, tema, format og lisens. |
| `get_resource` | Full metadata for én ressurs, inkludert distribusjonene som peker på dataene. Også som RDF. |
| `sparql` | SPARQL 1.1 mot hele DCAT-grafen. For tellinger, gruppering og kryssoppslag. |
| `fetch_data` | Laster ned en distribusjon. Tolker CSV og JSON, eller lagrer til fil. |
| `find_organization` | Slår opp `orgPath` for en utgiver, på navn eller organisasjonsnummer. Det er filterverdien `search` trenger. |

Katalogen inneholder **metadata**. Selve dataene ligger hos utgiverne, bak
`downloadURL` og `accessURL` i distribusjonene — det er der `fetch_data` kommer inn.

## Typisk arbeidsflyt

```
ask "nedbør og temperatur målt av værstasjoner"
  → get_resource id=<treff> type=datasets
  → fetch_data url=<downloadURL>
```

## Kommandolinje

De samme kildene finnes som kommandoen `datanorge`, som importerer modulene direkte
uten JSON-RPC-omvei.

```bash
datanorge sporr "hvor er det målestasjoner for vannkvalitet"   # KI-søk, ~4 s
datanorge sok luftkvalitet --apen --format "MEDIA_TYPE text/csv"
datanorge vis ad993b20-3998-3ac6-8077-d6c4d2494b4c             # metadata + distribusjoner
datanorge org 971040238                                        # navn eller orgnr
datanorge hent https://data.mattilsynet.no/vannverk/vannforsyningssystem.csv --rader 3
datanorge sparql 'PREFIX dcat: <http://www.w3.org/ns/dcat#> SELECT (COUNT(?d) AS ?n) WHERE { ?d a dcat:Dataset }'
datanorge status
```

`--json` gir rå JSON på stdout. `datanorge hjelp` viser alt.

**Merk hastighetsgrensen.** Strupingen i `http.js` gjelder innenfor én kjøring, og hver
kommando starter med blanke ark. En løkke over mange `sporr`- eller `sok`-kall i shellet
kan derfor gå på en HTTP 429 der MCP-serveren ville køet. Bruk `--limit` og paginering i
stedet for mange kall.

Installer wrapperen:

```bash
ln -sf ~/Work/mcp-datanorge/src/cli.js ~/.local/bin/datanorge
```

## Installasjon

```bash
npm install
```

Registrer serveren i Claude Code:

```bash
claude mcp add --scope user datanorge -- node ~/Work/mcp-datanorge/src/index.js
```

Serveren snakker stdio og har ingen konfigurasjon utover én valgfri miljøvariabel:

- `DATANORGE_ENV=demo` peker alt mot Digdirs demomiljø i stedet for produksjon.

## Endepunkter

| Tjeneste | Produksjon | Grense |
| --- | --- | --- |
| Søk | `search.api.fellesdatakatalog.digdir.no` | 10/min |
| KI-søk | `aisearch.api.fellesdatakatalog.digdir.no` | 10/min |
| SPARQL | `sparql.fellesdatakatalog.digdir.no` | — |
| Ressurstjeneste | `resource.api.fellesdatakatalog.digdir.no` | 5/s |
| Organisasjoner | `organization-catalog.fellesdatakatalog.digdir.no` | — |

Serveren struper seg selv litt under Digdirs oppgitte grenser og køer kall i stedet for
å gå på en HTTP 429. Et treigt svar fra `search` eller `ask` kan altså bety at den
venter på kvote. Ved 429 eller 5xx prøver den én gang til.

Digdir merker søk- og KI-søk-API-ene som interne, og forbeholder seg retten til å endre
dem. SPARQL og ressurstjenesten er de stabile inngangene.

## Sikkerhet

Distribusjons-URL-er kommer fra tredjeparter som har fått katalogen sin høstet.
`fetch_data` tillater derfor bare `http`/`https` mot offentlige adresser, og avviser
loopback, private nett, link-local og CGNAT. Et høstet datasett skal ikke kunne brukes
til å nå tjenester på maskinen eller i det lokale nettet.

## Utvikling

```bash
npm test            # enhetstester, ingen nettverk
npm start           # kjør serveren på stdio
```

`test/harness.js` starter serveren som subprosess og kobler til med MCP-klienten, for
manuell utprøving mot de ekte API-ene.

## Dokumentasjon hos Digdir

- [Teknisk dokumentasjon](https://data.norge.no/nb/technical/api)
- [Kildekode](https://github.com/Informasjonsforvaltning) (Apache-2.0)

## Lisens

MIT

TDQS

A4.2/5.0

Scored across 6 tools

Disambiguation4/5

ask and search both retrieve resources but are clearly differentiated as natural-language discovery vs. precise filtered full-text search. get_resource, fetch_data, sparql, and find_organization each have a distinct purpose, with only minor overlap between ask and search for simple queries.

Naming Consistency3/5

Four tools use a readable action-oriented style, but the names are not fully consistent: get_resource, fetch_data, and find_organization follow verb_noun, while ask and search are bare verbs and sparql is a protocol name rather than an action. All names are lowercase and readable, but the pattern is mixed.

Tool Count5/5

Six tools is a well-scoped count for a data catalog client. Each tool covers a distinct part of the workflow: discovery, search, metadata retrieval, advanced querying, data download, and publisher lookup.

Completeness5/5

The toolset covers the full journey from finding a resource to retrieving metadata and fetching the underlying data, including SPARQL for advanced queries and organization lookup for filtering. Pagination, empty queries, RDF formats, and file streaming remove common dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues