Releases: iamkm1/Norway-Open-Data-MCP
Release list
Norway Open Data MCP v0.4.0 — Geospatial toolset
Adds a curated geospatial toolset built on the new geodata, environment and land namespaces and profiles.natureAtLocation() in norway-open-data-sdk@0.8.0. The curated tool set grows from 20 to 28.
Additive release. No existing tool changes its name, input schema or data payload, and the first twenty entries of tools/list keep their names and their order — a test now pins that prefix rather than assuming it.
No new environment variable and no credential of any kind. Geonorge, Naturbase and NIBIO are all anonymous, so 23 of the 28 tools work with no configuration at all.
npx -y norway-open-data-mcpNew tools
Geonorge — Norway's national geospatial metadata catalogue
| Tool | Purpose |
|---|---|
search_geonorge_datasets |
Discover which Norwegian geodata exists, and whose, by text, publisher or theme |
get_geonorge_metadata |
Licence, use limitations, extent, CRS, update regime and advertised endpoints for one record |
Miljødirektoratet / Naturbase and NIBIO
| Tool | Purpose |
|---|---|
get_protected_areas_at |
Which conservation areas legally cover one coordinate, with protection form, IUCN category, managing authority and the Lovdata regulation |
search_protected_areas |
Conservation areas intersecting a bounded rectangle |
get_nature_types_at |
Mapped NiN nature localities of national importance, with condition, biodiversity value and red-list status |
get_intervention_free_nature_at |
January 2023 intervention-free (INON) wilderness-distance zones |
get_land_resources_at |
NIBIO's generalized AR50 land-resource classification |
The headline tool
get_nature_profile answers one coordinate from Miljødirektoratet, NIBIO and Kartverket at once, delegating the whole composition to the SDK's profiles.natureAtLocation(). Every section reports its own provider, licence, retrieval time and why it is present or absent — and one provider failing costs only its own section. A null section means the provider failed; an empty array means it answered and holds nothing.
Safety and honesty properties
- An empty nature result is never an environmental clearance. These are four selected Naturbase datasets with uneven survey coverage, not a register of everything of environmental value. Every result says so, in both the structured warnings and the rendered text.
- Geometry is returned exactly as published, or not at all. Off by default. Every ring of a polygon and every part of a multipolygon survives; an oversized geometry is dropped whole and reported, never simplified and never stripped of its holes.
geometrySummaryreports part, hole and vertex counts either way, so a caller always knows an area has holes even when the coordinates were too large to send. - Every search is bounded. Limits on every tool,
truncated/hasMoretaken from the SDK rather than inferred, bounding boxes capped at 2° × 4°, provider requests per call capped, and a continuation offset when the provider held more. No tool can download a national dataset. - No generic map-service proxy. No tool accepts a URL, host, endpoint, WFS type name or layer name — a registry-wide test fails the build if one ever appears. The catalogue tools still let a model discover any published Norwegian service and say where it is; they just never fetch it.
- AR50 class codes are passed through undecoded except
landTypeCode, whose SOSI code list is citable. Restating a land classification this project cannot cite would be worse than returning the provider's own code. - Geonorge contacts are reduced to organization and role. The named individuals and e-mail addresses the catalogue publishes are not relayed.
- Coordinates are WGS84 degrees and are never reprojected. Naturbase publishes EPSG:25833 and NIBIO EPSG:4258; both convert server-side and
sourceCrsretains the original declaration.
Fixed
- Provenance no longer collapses two sets of licence terms into one. De-duplication keyed on provider id, so the Naturbase intervention-free layer — same
naturbaseid, but its own NLOD 1.0 licence and its own required wordingMiljødirektoratet - inngrepsfri natur 01.2023— silently lost its terms. It now keys on licence and attribution as well. Unchanged for every provider whose id maps to one set of terms. - Profile provenance unions the SDK's new
sourcesarray, so a provider the SDK credits cannot be dropped by this layer.
Provider limitations found by live testing
Both handled explicitly rather than papered over:
get_intervention_free_nature_atandget_nature_profilerequire a limit of at least 2. The SDK derives its upstream page size from the remaining limit, so a limit of 1 asks Miljødirektoratet's intervention-free WFS for a single feature — which that service answers with a page the SDK rejects as invalid. Deterministic and specific to that layer.pageSizeis deliberately not forwarded to the SDK. Overriding it with the caller's limit broke the same service. The MCP layer bounds what it returns, not how the SDK talks to a provider.
Also in this release
A root .gitattributes declaring * text=auto eol=lf. Without it, a clone on a machine with core.autocrlf=true checked out CRLF working files while Prettier is configured for LF, so pnpm format:check failed on a completely untouched checkout. Committed blobs were already LF, so no tracked content changed.
Verification
- format check, ESLint,
tsc --noEmit, static stdout/safety audit - 464 unit and evaluation tests (up from 397); coverage 94.9% statements / 84.78% branches / 95% functions / 95.54% lines, with no threshold lowered and no test removed or skipped
- 29 protocol integration tests over real stdio, plus a package smoke test that installs the tarball outside the repository and drives the installed binary
- 29 opt-in live tests against the real Geonorge, Naturbase, NIBIO and existing providers
- Published from a tag by GitHub Actions using OIDC trusted publishing, with npm provenance attested to this repository, this workflow file and this commit. No long-lived npm token exists anywhere in the release path.
Full detail in CHANGELOG.md, the tool catalogue and the capability matrix.
Norway Open Data MCP v0.3.0 — Maritime toolset
A curated maritime toolset built on the new ais, marine and fisheries namespaces in norway-open-data-sdk@0.7.0. The curated tool set grows from 12 to 20.
No existing tool changes its name, input schema or data payload, and the first twelve entries of tools/list keep their names and their order. One existing behaviour does change, and it is a fix rather than a feature — see Fixed.
Added
Three BarentsWatch AIS tools, all gated on the ais credential scope:
get_vessel_profile— one vessel by MMSI, answered from BarentsWatch AIS, the Norwegian fishing-vessel register, MET Norway and Kartverket at once. Delegates the composition to the SDK'sprofiles.vessel()and surfaces its per-section provenance, distinguishing "not configured", "not applicable", "not found", "not covered" and "provider error".get_vessel_track— recorded positions for one vessel. Defaults to the provider's last-24-hours endpoint; an explicit window of up to 14 days (the provider's retention) routes to the ranged endpoint.get_live_vessel_positions— a bounded sample of the live AIS feed. A bounding box, a result limit (≤ 200) and a timeout (≤ 15 s) are required arguments with no defaults. The sample stops at whichever bound is reached first, and the connection is closed on every path including caller cancellation and provider error. No infinite stream is exposed through MCP.
Four Fiskeridirektoratet tools, anonymous — no credential of any kind: search_fishing_vessels, get_fishing_vessel, search_aquaculture_locations, get_aquaculture_location.
get_marine_forecast — BarentsWatch wave and sea-current forecasts for a coordinate, gated on the api credential scope. The two models are independent: if one fails the other is still returned, with the failure recorded in partial and in the warnings. An uncovered coordinate returns null sections rather than failing, so "no model covers this point" stays distinguishable from "the provider failed".
Four environment variables, in two independent pairs, because BarentsWatch issues separate registered clients for AIS and for its other services:
| Variable | Scope |
|---|---|
NORWAY_MCP_BARENTSWATCH_AIS_CLIENT_ID / _SECRET |
ais |
NORWAY_MCP_BARENTSWATCH_CLIENT_ID / _SECRET |
api |
A half-configured pair is refused outright and reported by --doctor, rather than passed through to fail at the token endpoint.
Also adds reusable strict input schemas for MMSI (a string, so a leading zero survives), registration marks, radio call signs, aquaculture site numbers, production-area codes and WGS84 bounding boxes; boxes reject inverted edges, antimeridian crossings and spans large enough to make a sample meaningless.
Changed
- Requires
norway-open-data-sdk@^0.7.0(previously^0.6.0).^0.6.xdoes not accept0.7.0, so the floor is raised deliberately and enforced by a release guard over both the manifest range and the resolved lockfile version. - OAuth2 client ids and secrets are added to the redactor's literal secret set, alongside the contact email and the NVE key.
--doctorreports the four new variables as(set, masked)or(not set), and the readiness of all twenty tools.
Fixed
Composed profiles credited a source that carries no licence and no attribution. A profile's top-level source is a synthetic composite the SDK builds for the composition itself — profiles.vessel() returns barentswatch-ais+kartverket with a homepage pointing at the SDK's own repository and no license or attribution field at all. Crediting it silently dropped every licence term the providers require, including the BarentsWatch AIS condition that Kystverket be credited.
Provenance for get_vessel_profile, get_norwegian_company_profile, get_norwegian_location_profile and get_norwegian_municipality_profile is now built from the profile's components, each carrying the real provider descriptor. Only components that actually returned data are credited; the composite is used solely as a fallback when none did.
This changes the sources[] array of those four tools — the envelope schema is unchanged, but a result now lists one entry per contributing provider, each with its licence and attribution, instead of a single composite entry with neither. Found by calling the live API: the offline fixtures had been written with the real per-provider source, so the suite could not have caught it. The fixtures now carry the composite verbatim and a regression test asserts the composite never reaches an envelope.
Sea-current speed rendered at full float precision in the text form (0.21719335266844905). Wave and current values are now rounded in the human-readable summary; the structured payload keeps the provider's exact value.
Note on the streaming bounds
The get_live_vessel_positions limits are limits of this MCP server, not of BarentsWatch. BarentsWatch publishes no maximum bounding-box size, result cap or connection time limit, and a caller using the SDK directly is subject to none of them. The 6° × 12° box, the 200-result cap and the 15-second timeout exist because a tool call returns one bounded result into a model's context window.
Install
npx -y norway-open-data-mcpNorway Open Data MCP v0.2.0 — SSB Klass tools
Adds curated SSB Klass support. The curated tool set grows from 10 to 12; the existing ten tools are unchanged, and no new credential is introduced.
New tools
resolve_norwegian_administrative_code— resolve a Norwegian municipality (kommune) or county (fylke) code across official SSB Klass boundary changes (rename, replacement, merge, split) as of a target date. It preserves every official status verbatim and returns all participating codes: a merge, split or ambiguous result is never collapsed to a single code, none is chosen for you, and administrative correspondence is explicitly not treated as statistical comparability.search_norwegian_classification_codes— look up codes in an official Klass classification by code pattern (exact code,*wildcard,-range,,list). This is code-pattern search, not name/full-text search. Output is bounded (default 10, at most 20 codes) and reports truncation.
Details
- Requires
norway-open-data-sdk@^0.6.0(for itssdk.klassnamespace). - 12 tools total. The original ten tools keep their names, input schemas and behaviour — no breaking changes.
- No new credentials or environment variables. SSB Klass is anonymous and is a separate service from the SSB statistics (PxWeb) API.
- The server remains a local, stdio, read-only MCP process: no hosting, database, telemetry or persistence. Inputs are strictly validated before any network call, unknown fields are rejected, outputs are bounded, and provider attribution and cache metadata are preserved.
See CHANGELOG.md for the full entry.
Norway Open Data MCP v0.1.1
Maintenance release. No new tools, no schema changes, no runtime behaviour changes.
Changed
- Require
norway-open-data-sdk@^0.5.3(previously^0.5.2). SDK 0.5.3 corrects a
population-aggregation bug in which incomplete SSB population cells could be summed and
reported as a complete municipality total. Raising the caret floor ensures
get_norwegian_municipality_profilecan no longer resolve against the affected SDK.
Because the SDK is pre-1.0, its correctness fixes ship as minor versions and a caret range
does not float across them automatically — the floor is bumped deliberately. - Added a deterministic release guard that fails the build if
package.jsonpermits, or the
lockfile resolves, an SDK below 0.5.3.
Install
npx -y norway-open-data-mcpnpm: https://www.npmjs.com/package/norway-open-data-mcp/v/0.1.1
Full changelog: https://github.com/iamkm1/Norway-Open-Data-MCP/blob/main/CHANGELOG.md
Norway Open Data MCP v0.1.0
Full Changelog: https://github.com/iamkm1/Norway-Open-Data-MCP/commits/v0.1.0