nordic-data 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +104 -135
  2. package/bin/cli.js +38 -7
  3. package/package.json +7 -7
package/README.md CHANGED
@@ -1,160 +1,129 @@
1
- # nordic-data
1
+ # Nordic Data MCP Server
2
2
 
3
- Every Norwegian company as one API, from your terminal.
3
+ > Live Nordic public-sector and Norwegian + Swedish corporate data, exposed as 29 MCP tools for AI agents.
4
4
 
5
- ```sh
6
- npx nordic-data search equinor
7
- npx nordic-data lookup 923609016
8
- npx nordic-data contacts 923609016
9
- npx nordic-data finances 923609016
10
- ```
5
+ **Hosted at:** `https://api.nordicdata.cloud/mcp`
6
+ **Get a free API key:** [nordicdata.cloud](https://nordicdata.cloud)
7
+ **Docs:** [nordicdata.cloud/docs#mcp](https://nordicdata.cloud/docs#mcp)
8
+ **Smithery one-click install:** [smithery.ai/server/sofia-jameson-20/Nordic-Data](https://smithery.ai/server/sofia-jameson-20/Nordic-Data)
11
9
 
12
- ## Install
10
+ This repository contains setup instructions and configuration snippets. The server itself is hosted — no local install required.
13
11
 
14
- ```sh
15
- npm install -g nordic-data
16
- # or just use npx
17
- npx nordic-data --help
18
- ```
12
+ ---
19
13
 
20
- ## Free tier
14
+ ## What's covered
21
15
 
22
- 5,000 requests per month with an API key. Without a key, the CLI uses the public widget tier (4 full snapshots per IP per 24 hours). Get a key:
16
+ - **Public procurement** Nordic tender notices and contract awards across two coverage tiers: an EU-tier (above-EU-threshold notices for Norway, Sweden, Denmark, Finland, Iceland) AND a Norway-tier (Norway-only, **including below-EU-threshold municipal/county tenders that no other API exposes cleanly**)
17
+ - **Norwegian company registry** — full company data + complete shareholder cap tables (3M+ positions across 396K companies)
18
+ - **Swedish company data** — identity (name, address, VAT registration) for any of ~1.6M Swedish companies, plus AI-enriched contact data (verified emails, direct phones, named executives) via the dedicated Sweden contact tool
19
+ - **Danish + Finnish company data** — identity, addresses, basic phone/employees (Denmark) and multilingual name history (Finland)
20
+ - **Officer & ownership network** — board memberships, shortest-path queries, full role history (Norway)
21
+ - **News** — Norwegian-language news mentioning a company
22
+ - **R&D activity** — research-grant history per recipient
23
+ - **Tech intelligence** — find companies using a specific technology
24
+ - **Compliance** — sanctions screening for any name or company + officers (global watchlist coverage)
25
+ - **AI summaries** — executive narratives and peer benchmarks per company
23
26
 
24
- ```sh
25
- npx nordic-data signup
26
- # or visit https://nordicdata.cloud/?signup=free
27
- ```
27
+ ## Setup
28
28
 
29
- Set the key as an environment variable:
29
+ ### Claude Desktop
30
30
 
31
- ```sh
32
- export NORDIC_DATA_KEY=nrd_live_...
33
- ```
31
+ Edit `claude_desktop_config.json`:
34
32
 
35
- You can also pass `--key <key>` per invocation.
36
-
37
- ## Commands
38
-
39
- | Command | What it does |
40
- |---|---|
41
- | `search <query>` | Search Norwegian companies by name or fragment |
42
- | `lookup <orgnr>` | Full snapshot for one organisation number (registry + officers + finances + sanctions + contacts) |
43
- | `contacts <orgnr>` | Emails, phones, and named executives |
44
- | `board <orgnr>` | Current board + leadership |
45
- | `finances <orgnr>` | Latest financial summary (revenue, operating profit, equity, ratios) |
46
- | `procurement <orgnr>` | Doffin public-sector contract aggregates |
47
- | `grants <orgnr>` | EU R&D grants (Horizon Europe, EIC) |
48
- | `sanctions <orgnr>` | Sanctions screening (EU, UN, OFAC) hits |
49
- | `shareholders <orgnr>` | Aksjonærregisteret aggregates |
50
- | `mcp` | Show MCP setup snippet for Claude Desktop or Cursor |
51
- | `signup` | Open the free-tier signup in your browser |
52
-
53
- ## Examples
54
-
55
- Find a company:
56
-
57
- ```sh
58
- $ npx nordic-data search equinor
59
- 8 result(s) for "equinor"
60
- 923609016 EQUINOR ASA · STAVANGER
61
- 959733600 EQUINOR PENSJON · STAVANGER
62
- ...
33
+ ```json
34
+ {
35
+ "mcpServers": {
36
+ "nordic-data": {
37
+ "url": "https://api.nordicdata.cloud/mcp",
38
+ "headers": {
39
+ "X-API-Key": "YOUR_API_KEY_HERE"
40
+ }
41
+ }
42
+ }
43
+ }
63
44
  ```
64
45
 
65
- Get the full picture (verified live against api.nordicdata.cloud):
66
-
67
- ```sh
68
- $ npx nordic-data lookup 923609016
69
- EQUINOR ASA (923609016)
70
- Status active
71
- Founded 1995-03-12
72
- Legal form ASA (Allmennaksjeselskap)
73
- NACE 06.100 Utvinning av råolje
74
- Address Forusbeen 50
75
- City 4035 STAVANGER
76
- Employees 21376
77
- VAT reg. yes
78
- Website www.equinor.com
79
- Phone +47 406 37 334
80
- Email apost@equinor.com
81
-
82
- Key personnel
83
- Chief Executive Officer Anders Opedal
84
- Chief Financial Officer Torgrim Reitan
85
- Chairman of the Board Jon Erik Reinhardsen
86
- ...
87
- ```
46
+ Restart Claude Desktop. The 29 tools appear in the MCP picker.
88
47
 
89
- Financials:
90
-
91
- ```sh
92
- $ npx nordic-data finances 923609016
93
- Financials (FY2024) for EQUINOR ASA
94
- Revenue USD 72.54B
95
- Operating profit USD 10.35B
96
- Net result USD 8.14B
97
- Total assets USD 109.15B
98
- Equity USD 41.09B
99
- Equity ratio 37.6%
100
- Net margin 11.2%
101
- ```
102
-
103
- JSON output for scripting:
48
+ ### Cursor
104
49
 
105
- ```sh
106
- $ npx nordic-data lookup 923609016 --json | jq .identity.name
107
- "EQUINOR ASA"
108
- ```
50
+ Edit `~/.cursor/mcp.json` with the same JSON.
109
51
 
110
- Sanctions screening:
52
+ ### Any MCP-aware client
111
53
 
112
- ```sh
113
- $ npx nordic-data sanctions 923609016
114
- Sanctions screening for EQUINOR ASA
115
- ● Officer hits: 1 (of 15 screened)
116
54
  ```
117
-
118
- ## MCP setup for Claude Desktop / Cursor
119
-
120
- ```sh
121
- $ npx nordic-data mcp
55
+ URL: https://api.nordicdata.cloud/mcp
56
+ Header: X-API-Key: <your key>
57
+ Transport: Streamable HTTP
122
58
  ```
123
59
 
124
- prints the JSON snippet to drop into your MCP client config. Or visit our listings:
125
-
126
- - [Smithery](https://smithery.ai/servers/sofia-jameson-20/Nordic-Data)
127
- - [mcp.so](https://mcp.so/server/nordic-data)
128
- - [PulseMCP](https://www.pulsemcp.com/servers/nordic-data)
129
-
130
- ## What data is in Nordic Data?
131
-
132
- Every Norwegian company joined on the organisation number:
133
-
134
- - **Brønnøysundregistrene** — name, address, NACE, status, board, signatories (real-time, < 5 min lag)
135
- - **Aksjonærregisteret**shareholders with recursive UBO chain (annual snapshot)
136
- - **Doffin** — public-sector procurement filings (live)
137
- - **EU R&D grants** Horizon Europe, EIC, joined to Norwegian recipients
138
- - **Sanctions**EU, UN, OFAC, screened by org and by officer
139
- - **Enriched contacts** 4-layer pipeline lifts contact-fill rate from 23% to 81% on the top 5,000 companies. [How it works](https://nordicdata.cloud/blog/four-layer-contact-enrichment).
140
- - **Financial summaries** revenue, operating profit, equity, ratios — last 5 reported years
60
+ ## Tools (29 total)
61
+
62
+ ### Procurement
63
+ - `search_tenders` — Nordic procurement notices by country, keyword, CPV, date. Filter by coverage tier (EU-tier across all 5 Nordic countries, or Norway-tier including below-threshold municipal awards). Filter by `buyer_orgnr` to find all tenders from a specific Norwegian buyer.
64
+ - `get_tender` — Full details by ID. Accepts both EU-tier format (`317565-2026`) and Norway-tier format (`2026-108414`).
65
+ - `search_awards` — Search contract awards (who won what)
66
+ - `get_tender_leaderboard` Top public-sector buyers in a Nordic country
67
+ - `get_company_contract_wins` — Public-sector contracts won by a Norwegian company
68
+
69
+ ### Company data
70
+ - `search_companies`Search by name, industry, location (Norway: full-text; Denmark + Finland: identity-only; Sweden + Iceland: not yet supported for full-text — use `get_company` for orgnr lookup)
71
+ - `get_company`Full registry record. `country=NOR` (richest), `SWE` (identity), `DNK` (identity + phone + employees), `FIN` (identity + name history)
72
+ - `get_company_contact`Norway: public email + phone (with MX-verified email candidates) + named executives
73
+ - **`get_company_se_contact` Sweden: identity + AI-enriched contacts (MX-verified emails, direct phones, named executives where publicly documented)**
74
+ - `get_company_narrative`AI-generated executive summary
75
+ - `get_company_peers`Peer-cohort benchmarks
76
+ - `get_company_snapshot`One-call snapshot across every data layer
77
+ - `get_company_changes` — Registry change history
78
+ - `get_company_subsidiaries` — Subsidiaries registered under this orgnr
79
+ - `bulk_get_companies` — Enrich a list of up to 100 companies in one call
80
+
81
+ ### Financials & ownership (Norway)
82
+ - `get_company_accounts` — Annual accounts (revenue, profit, equity)
83
+ - `get_company_shareholders` — Full shareholder list — 3M+ positions across 396K companies
84
+ - `get_shareholder_portfolio` — All companies a person/entity owns shares in
85
+
86
+ ### Officer & network graph (Norway)
87
+ - `search_persons` — Search persons in the Norwegian officer network
88
+ - `get_person` — Full role history across Norwegian companies
89
+ - `find_company_path` — Shortest path between two companies through shared officers
90
+ - `get_person_network` — Find who is connected to a person via shared boards
91
+
92
+ ### News
93
+ - `get_company_news` — Recent Norwegian-language news mentioning a company
94
+ - `search_news` — Search Norwegian news headlines
95
+
96
+ ### R&D
97
+ - `search_eu_grants` — Search EU research-grant history
98
+ - `get_company_eu_grants` — Norwegian company's R&D grant participations
99
+
100
+ ### Tech intelligence
101
+ - `find_companies_using_tech` — Norwegian companies using a specific technology
102
+
103
+ ### Compliance
104
+ - `screen_for_sanctions` — Screen any name against international sanctions lists
105
+ - `check_company_sanctions` — Sanctions screening for a Norwegian company + its officers
106
+
107
+ ## Example prompts
108
+
109
+ - *"Which Norwegian municipalities tendered snow-clearing contracts under 5M NOK with deadlines in the next 30 days?"* (uses below-threshold municipal coverage)
110
+ - *"Pull the latest accounts and shareholders for orgnr 923609016."*
111
+ - *"Get the verified contact emails and CFO for Klarna AB (Swedish orgnr 5566370985)."*
112
+ - *"Find Norwegian companies using Snowflake."*
113
+ - *"Who sits on the boards of all three of these companies?"*
114
+ - *"Screen this list of suppliers against sanctions lists."*
115
+ - *"Show me R&D grants won by Norwegian SMBs in clean energy."*
141
116
 
142
117
  ## Pricing
143
118
 
144
- Free tier: 5,000 requests / month. Paid tiers from €29/mo (25,000 req) to €499/mo (500,000 req). [Full pricing](https://nordicdata.cloud/#pricing).
145
-
146
- ## Comparison vs other vendors
147
-
148
- We publish an honest benchmark page comparing Nordic Data against OpenCorporates, BvD/Orbis, Bisnode, Proff, Strise, and Sumsub: [https://nordicdata.cloud/coverage](https://nordicdata.cloud/coverage).
149
-
150
- ## License
119
+ - **Free** 500 requests/month, no card required
120
+ - **Paid plans** from €49/mo
151
121
 
152
- MIT — see LICENSE.
122
+ See [nordicdata.cloud](https://nordicdata.cloud).
153
123
 
154
- ## Links
124
+ ## Support
155
125
 
156
- - Web: https://nordicdata.cloud
157
- - Docs: https://nordicdata.cloud/docs
158
- - Blog: https://nordicdata.cloud/blog
159
- - Smithery (MCP): https://smithery.ai/servers/sofia-jameson-20/Nordic-Data
160
- - Issues: support@nordicdata.cloud
126
+ - Email: [hello@nordicdata.cloud](mailto:hello@nordicdata.cloud)
127
+ - Docs: [nordicdata.cloud/docs](https://nordicdata.cloud/docs)
128
+ - LLM-friendly site index: [nordicdata.cloud/llms.txt](https://nordicdata.cloud/llms.txt)
129
+ - OpenAPI spec: [api.nordicdata.cloud/openapi.json](https://api.nordicdata.cloud/openapi.json)
package/bin/cli.js CHANGED
@@ -35,10 +35,11 @@ ${c('bold', 'COMMANDS')}
35
35
  contacts <orgnr> Emails, phones, and named executives
36
36
  board <orgnr> Board + leadership
37
37
  finances <orgnr> Latest financial summary
38
- procurement <orgnr> Public-sector contract aggregates (Doffin)
39
- grants <orgnr> EU R&D grants (Horizon, EIC)
38
+ procurement <orgnr> Public-sector contract aggregates (NO + EU)
39
+ grants <orgnr> EU R&D grant participations
40
40
  sanctions <orgnr> Sanctions screening (EU/UN/OFAC) hits
41
- shareholders <orgnr> Aksjonærregisteret aggregates
41
+ shareholders <orgnr> Shareholder graph aggregates (Norway)
42
+ contacts-se <orgnr> Sweden: identity + AI-enriched contacts (10-digit orgnr)
42
43
  mcp Show MCP setup snippet for Claude Desktop / Cursor
43
44
  signup Open the free-tier signup page in your browser
44
45
  --help, -h Show this help
@@ -55,6 +56,9 @@ ${c('bold', 'EXAMPLES')}
55
56
  nordic-data lookup 923609016
56
57
  nordic-data contacts 923609016
57
58
 
59
+ ${c('dim', '# Sweden: lookup + AI-enriched contacts (10-digit orgnr)')}
60
+ nordic-data contacts-se 5566370985
61
+
58
62
  ${c('dim', '# Use your API key for higher limits')}
59
63
  export NORDIC_DATA_KEY=nrd_live_...
60
64
  nordic-data lookup 923609016 --json | jq
@@ -63,7 +67,7 @@ ${c('bold', 'EXAMPLES')}
63
67
  nordic-data mcp
64
68
 
65
69
  ${c('bold', 'FREE TIER')}
66
- ${c('orange', '5,000 requests per month, no card.')} Get a key at
70
+ ${c('orange', '500 requests per month, no card.')} Get a key at
67
71
  ${c('cyan', 'https://nordicdata.cloud/?signup=free')}
68
72
  ${c('dim', 'Without a key, this CLI uses the public widget tier (4 lookups/IP/24h).')}
69
73
  `;
@@ -258,7 +262,7 @@ async function procurement(orgnr) {
258
262
  const snap = await publicRequest(`/_/look/${orgnr}`);
259
263
  const p = snap.procurement || {};
260
264
  if (useJson) return console.log(JSON.stringify(p, null, 2));
261
- header(`Doffin procurement aggregates for ${id(snap).name || orgnr}`);
265
+ header(`Public procurement aggregates for ${id(snap).name || orgnr}`);
262
266
  pretty('Tenders as buyer', `${p.tenders_as_buyer_24m || 0} (24m)`);
263
267
  pretty('Contracts won', `${p.contracts_won_24m || 0} (24m)`);
264
268
  pretty('Contract value', p.contract_wins_value_24m && `NOK ${p.contract_wins_value_24m.toLocaleString('nb-NO')} (24m)`);
@@ -311,13 +315,40 @@ async function shareholders(orgnr) {
311
315
  const snap = await publicRequest(`/_/look/${orgnr}`);
312
316
  const sh = snap.shareholders || {};
313
317
  if (useJson) return console.log(JSON.stringify(sh, null, 2));
314
- header(`Aksjonærregisteret summary for ${id(snap).name || orgnr}`);
318
+ header(`Shareholder summary for ${id(snap).name || orgnr}`);
315
319
  pretty('Fiscal year', sh.fiscal_year);
316
320
  pretty('Shareholders', sh.count);
317
321
  pretty('Total shares', sh.total_shares && sh.total_shares.toLocaleString('nb-NO'));
318
322
  console.log(c('dim', '\n Full UBO chain available via authenticated /companies/:orgnr/ownership.'));
319
323
  }
320
324
 
325
+
326
+ async function contactsSe(orgnr) {
327
+ if (!orgnr) die('Usage: nordic-data contacts-se <orgnr> (Swedish 10-digit organisation number)');
328
+ const cleaned = String(orgnr).replace(/[-\s]/g, '');
329
+ if (!/^\d{10}$/.test(cleaned)) die('Swedish orgnr must be 10 digits (with or without dash).');
330
+ const data = await publicRequest(`/companies/se/${cleaned}/contact`);
331
+ if (useJson) return console.log(JSON.stringify(data, null, 2));
332
+ header(`${data.name || 'Swedish company'} ${c('dim', `(${data.orgnr_formatted || cleaned})`)}`);
333
+ pretty('VAT number', data.vat_number);
334
+ pretty('Address', data.address);
335
+ const emails = data.emails || [];
336
+ const phones = data.phones || [];
337
+ if (phones.length) pretty('Phone', phones[0]);
338
+ if (emails.length) pretty('Email', emails[0]);
339
+ const nc = data.named_contacts || [];
340
+ if (nc.length) {
341
+ header('Named contacts');
342
+ for (const p of nc.slice(0, 10)) {
343
+ const extras = [p.email, p.phone].filter(Boolean).join(' · ');
344
+ console.log(` ${c('orange', (p.role || '').slice(0, 32).padEnd(32))} ${c('bold', p.name)}${extras ? c('dim', ` · ${extras}`) : ''}`);
345
+ }
346
+ }
347
+ if (data.cached) console.log(c('dim', `\n (cached, fetched ${data.fetched_at || ''})`));
348
+ console.log('');
349
+ console.log(c('dim', 'Sweden contact data uses your monthly contact-enrichment credits.'));
350
+ }
351
+
321
352
  function mcp() {
322
353
  console.log(`${c('bold', 'MCP setup for Claude Desktop / Cursor')}\n`);
323
354
  console.log(c('dim', '# Add to your MCP client config (e.g. claude_desktop_config.json):'));
@@ -331,7 +362,7 @@ function mcp() {
331
362
  };
332
363
  console.log(JSON.stringify(snippet, null, 2));
333
364
  console.log('');
334
- console.log(c('dim', 'Get a free key (5,000 req/mo) at ') + c('cyan', 'https://nordicdata.cloud/?signup=free'));
365
+ console.log(c('dim', 'Get a free key (500 req/mo) at ') + c('cyan', 'https://nordicdata.cloud/?signup=free'));
335
366
  console.log(c('dim', 'Listed on Smithery: ') + c('cyan', 'https://smithery.ai/servers/sofia-jameson-20/Nordic-Data'));
336
367
  console.log(c('dim', 'Listed on mcp.so: ') + c('cyan', 'https://mcp.so/server/nordic-data'));
337
368
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nordic-data",
3
- "version": "0.1.0",
4
- "description": "CLI for Nordic Data every Norwegian company as one API. Look up companies, board members, owners, sanctions, procurement, EU grants, and financial summaries from your terminal.",
3
+ "version": "0.2.0",
4
+ "description": "CLI for Nordic Data \u2014 every Norwegian and Swedish company as one API. Look up companies, board members, owners, sanctions, public procurement, R&D grants, AI-enriched contacts (NO + SE), and financial summaries from your terminal.",
5
5
  "bin": {
6
6
  "nordic-data": "./bin/cli.js"
7
7
  },
@@ -13,16 +13,16 @@
13
13
  "keywords": [
14
14
  "norway",
15
15
  "norwegian",
16
+ "sweden",
17
+ "swedish",
18
+ "nordic",
16
19
  "company",
17
20
  "data",
18
- "brreg",
19
- "bronnoysund",
20
- "aksjonaerregisteret",
21
- "doffin",
21
+ "cli",
22
22
  "kyb",
23
23
  "aml",
24
24
  "sanctions",
25
- "cli",
25
+ "procurement",
26
26
  "mcp",
27
27
  "nordic-data"
28
28
  ],