{
  "markdown": "# Nordic Data MCP Server\n\n[![npm version](https://img.shields.io/npm/v/nordic-data-mcp.svg)](https://www.npmjs.com/package/nordic-data-mcp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA [Model Context Protocol](https://modelcontextprotocol.io/) server that gives AI agents (Claude, Cursor, Claude Code, ChatGPT, Copilot, etc.) direct access to **official European business data** across **15 EU countries**.\n\nLook up companies, validate VAT numbers, run KYB reports, screen against sanctions lists, autocomplete addresses, and resolve LEI ownership — all from inside your AI assistant.\n\n```\nDK · NO · SE · FI · IE · UK · FR · DE · CZ · PL · LV · EE · NL · BE · LU\n```\n\n> NL and DE require a Starter+ subscription (free-tier API keys receive HTTP 402 `upgrade_required`). On paid tiers, NL calls cost 5x quota units and DE calls cost 3x; all other countries cost 1x.\n\n---\n\n## Quick start\n\n### 1. Get an API key\n\nSign up at [addonnordic.com](https://addonnordic.com) and grab your `NORDIC_API_KEY`. Free tier available.\n\n### 2. Add to Claude Desktop\n\nEdit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%/Claude/claude_desktop_config.json` (Windows):\n\n```json\n{\n  \"mcpServers\": {\n    \"nordic-data\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"nordic-data-mcp\"],\n      \"env\": {\n        \"NORDIC_API_KEY\": \"YOUR_KEY_HERE\"\n      }\n    }\n  }\n}\n```\n\nRestart Claude Desktop. You should see \"nordic-data\" appear in the tools menu.\n\n### 3. Add to Cursor\n\nIn Cursor settings → MCP → Add new server, or edit `~/.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"nordic-data\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"nordic-data-mcp\"],\n      \"env\": {\n        \"NORDIC_API_KEY\": \"YOUR_KEY_HERE\"\n      }\n    }\n  }\n}\n```\n\n### 4. Add to Claude Code\n\n```bash\nclaude mcp add nordic-data --env NORDIC_API_KEY=YOUR_KEY_HERE -- npx -y nordic-data-mcp\n```\n\n### 5. Add to ChatGPT (Pro, Business, or Enterprise)\n\nChatGPT supports remote MCP servers as **custom connectors**. No API key needed from you — the hosted server handles upstream authentication.\n\n1. ChatGPT → **Settings** → **Connectors** → **Add custom connector**\n2. URL: `https://nordic-data-mcp-production.up.railway.app/mcp`\n3. Done — all 11 tools are available immediately.\n\n> Custom connectors require a ChatGPT Pro, Business, Team, or Enterprise plan.\n\n### 6. Add to Claude.ai (web)\n\nSame hosted endpoint, no local install:\n\n1. Claude.ai → **Settings** → **Connectors** → **Add custom connector**\n2. URL: `https://nordic-data-mcp-production.up.railway.app/mcp`\n3. Done.\n\n---\n\n## Available tools\n\n| Tool | What it does |\n|---|---|\n| `lookup_company` | Basic company data from official registries (CVR, Brønnøysund, Bolagsverket, Companies House, INSEE, etc.) |\n| `validate_vat` | Validate a VAT number against VIES (EU) or HMRC (GB) |\n| `screen_sanctions` | Bulk screen up to 1000 names against UN/EU/OFAC/PEP lists (OpenSanctions, 768K+ entries) |\n| `kyb_full` | Master Know-Your-Business report — identity, persons, financials, LEI, VAT, sanctions, adverse media, risk score |\n| `autocomplete_address` | Address autocomplete via DAWA (DK), Kartverket (NO), BAN (FR), MML (FI), Nominatim (others) |\n| `lookup_lei` | GLEIF Legal Entity Identifier lookup — forward, reverse, and parent/children relationships |\n| `company_enriched` | Company data + geocoded address + industry stats + Wikidata (website, employees, CEO, ticker, logo) |\n| `fr_history` | French company history timeline (name, activity, status, legal-form changes) from INSEE Sirene bitemporal data |\n| `list_endpoints` | Discovery: list all read-only data endpoints in the underlying API (230+), with optional keyword filter |\n| `get_endpoint_schema` | Discovery: full parameter + response schema for one endpoint, before calling it |\n| `call_endpoint` | Discovery: execute a read-only request (GET/HEAD, plus three allowlisted POST screening queries) against any discovered endpoint |\n\n### Example agent prompts\n\n> \"Look up CVR 61056416 in Denmark\"\n> → calls `lookup_company { country: \"dk\", id: \"61056416\" }` → Carlsberg A/S\n\n> \"Run a full KYB report on Equinor (NO 923609016)\"\n> → calls `kyb_full { country: \"no\", id: \"923609016\" }`\n\n> \"Is `LU26375245` a valid VAT number?\"\n> → calls `validate_vat { country: \"LU\", vat_number: \"26375245\" }`\n\n> \"Screen these names against sanctions: Vladimir Putin, Acme Corp, John Smith\"\n> → calls `screen_sanctions { names: [...] }`\n\n> \"Find the LEI for Tesco UK (00445790) and include parent and subsidiaries\"\n> → calls `lookup_lei { mode: \"reverse\", country: \"uk\", id: \"00445790\" }`\n\n---\n\n## Country / ID format reference\n\n| Country | ID type | Format |\n|---|---|---|\n| DK | CVR | 8 digits |\n| NO | Organisasjonsnummer | 9 digits |\n| SE | Organisationsnummer | 10 digits (with or without dash) |\n| FI | Y-tunnus | `NNNNNNN-D` (7 digits + check digit) |\n| IE | CRO number | 1–7 digits |\n| UK | Companies House | 8 chars (digits, or prefix like `SC`, `NI`, `OC`) |\n| FR | SIREN | 9 digits |\n| DE | LEI or HRB | LEI = 20 alphanum; HRB = prefix + digits |\n| CZ | IČO | 8 digits |\n| PL | NIP / REGON / KRS | NIP=10, REGON=9/14, KRS=10 |\n| LV | Reģistrācijas nr. | 11 digits |\n| EE | Registrikood | 8 digits |\n| NL | KvK-nummer | 8 digits |\n| BE | BCE/KBO | 10 digits |\n| LU | RCSL | `B` + digits |\n\nFor `validate_vat`, country codes are **uppercase** and cover the broader EU plus GB (use `GB`, not `UK` — HMRC requires GB).\n\n---\n\n## Configuration\n\nThe only environment variable you need to set is:\n\n| Variable | Required | Description |\n|---|---|---|\n| `NORDIC_API_KEY` | yes | Your API key from [addonnordic.com](https://addonnordic.com) |\n\nThat's it. The MCP server connects to the hosted Nordic Data API for you.\n\n---\n\n## Self-hosting (remote HTTP transport)\n\nFor remote MCP hosting (e.g. Anthropic Connectors, Smithery, web-based clients), deploy the bundled Streamable HTTP transport:\n\n```bash\nnpm install\nnpm run build\nNORDIC_API_KEY=sk_... npm run start:http   # listens on :$PORT (default 3000)\n```\n\nEndpoints:\n- `GET /healthz` — health check (returns version + status)\n- `ALL /mcp` — **public** MCP endpoint. No key required; all upstream calls are billed to the server's own `NORDIC_API_KEY` (freemium / discovery). Per-IP rate-limited.\n- `ALL /mcp/auth` — **authenticated** MCP endpoint. Requires `Authorization: Bearer ndk_...` on every request; each call is billed to that customer's own key + quota.\n\nBoth are session-based via the `Mcp-Session-Id` header.\n\n### Connecting a remote client\n\nThis server uses **static API-key authentication, not OAuth.** How you connect depends on your client:\n\n- **Header-capable clients** (Claude Code, Cursor, Smithery, Claude.ai / ChatGPT custom connectors): point them at `…/mcp/auth` and supply your key as `Authorization: Bearer ndk_...`. Each request is billed to your own tenant + quota.\n- **Generic / auto-discovery clients that only know \"URL + OAuth\":** point them at the public `…/mcp` (no key). Otherwise such clients attempt OAuth Dynamic Client Registration (`POST /register`) and fail — this server has no OAuth endpoints by design and answers them with a clear JSON `oauth_not_supported` error (not a sign-in flow).\n- **Local clients:** prefer the stdio package — `npx -y nordic-data-mcp` with `NORDIC_API_KEY` set (see Quick start above).\n\n> Full OAuth 2.1 (so arbitrary external clients can self-onboard with their own key) is a planned Phase-2 item, not yet implemented.\n\nA `railway.toml` is included for one-click deploy on [Railway](https://railway.app):\n1. New Project → Deploy from GitHub repo → select `Mnymann/nordic-data-mcp`\n2. Set **Root Directory** to `nordic-data-mcp`\n3. Add env var `NORDIC_API_KEY`\n4. Railway auto-detects the config, builds, and exposes a public HTTPS URL\n\n---\n\n## Design notes\n\n- **Thin adapter.** No business logic, no caching, no transformations. Each tool maps 1:1 to a Nordic Data API endpoint.\n- **No PII in logs.** Request and response bodies are never logged.\n- **API key required.** The process refuses to start without `NORDIC_API_KEY`.\n- **Rate limiting.** The backend enforces per-key quotas; the HTTP transport additionally applies a per-IP limit on the **public** `/mcp` endpoint as defense-in-depth (tunable via `PUBLIC_RATE_LIMIT` / `PUBLIC_RATE_WINDOW_MS`). **Caching** is handled upstream.\n- Inputs are validated with [zod](https://zod.dev) before any HTTP call.\n\n---\n\n## Contributing\n\nIssues and PRs welcome at [github.com/Mnymann/nordic-data-mcp](https://github.com/Mnymann/nordic-data-mcp).\n\nPlease **do not** include API keys, request bodies, or response payloads in bug reports.\n\n---\n\n## Disclaimer\n\nNordic Data returns **informational decision-support** aggregated from official and public sources. It is **not** legal, compliance, financial, or professional advice, and not a definitive determination. KYB reports, sanctions/PEP matches, adverse-media hits, and risk scores are **signals to review, not verdicts** — verify independently and apply your own professional judgment before acting. Use of the service is subject to the [AddonNordic Terms](https://addonnordic.com).\n\n---\n\n## License\n\nMIT © [AddonNordic ApS](https://addonnordic.com)\n",
  "bytes": 9225,
  "sha": "8051a8c422780fa895854216b501003f196900ee4365bef576d2cf02710f759d",
  "repo_slug": "mnymann/nordic-data-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_mnymann_nordic_data_ceda7979/readme"
}