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.
- package/README.md +104 -135
- package/bin/cli.js +38 -7
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -1,160 +1,129 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Nordic Data MCP Server
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> Live Nordic public-sector and Norwegian + Swedish corporate data, exposed as 29 MCP tools for AI agents.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
10
|
+
This repository contains setup instructions and configuration snippets. The server itself is hosted — no local install required.
|
|
13
11
|
|
|
14
|
-
|
|
15
|
-
npm install -g nordic-data
|
|
16
|
-
# or just use npx
|
|
17
|
-
npx nordic-data --help
|
|
18
|
-
```
|
|
12
|
+
---
|
|
19
13
|
|
|
20
|
-
##
|
|
14
|
+
## What's covered
|
|
21
15
|
|
|
22
|
-
|
|
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
|
-
|
|
25
|
-
npx nordic-data signup
|
|
26
|
-
# or visit https://nordicdata.cloud/?signup=free
|
|
27
|
-
```
|
|
27
|
+
## Setup
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
### Claude Desktop
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
export NORDIC_DATA_KEY=nrd_live_...
|
|
33
|
-
```
|
|
31
|
+
Edit `claude_desktop_config.json`:
|
|
34
32
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
-
|
|
128
|
-
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
-
|
|
135
|
-
-
|
|
136
|
-
-
|
|
137
|
-
-
|
|
138
|
-
-
|
|
139
|
-
-
|
|
140
|
-
-
|
|
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
|
|
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
|
-
|
|
122
|
+
See [nordicdata.cloud](https://nordicdata.cloud).
|
|
153
123
|
|
|
154
|
-
##
|
|
124
|
+
## Support
|
|
155
125
|
|
|
156
|
-
-
|
|
157
|
-
- Docs: https://nordicdata.cloud/docs
|
|
158
|
-
-
|
|
159
|
-
-
|
|
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 (
|
|
39
|
-
grants <orgnr> EU R&D
|
|
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>
|
|
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', '
|
|
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(`
|
|
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(`
|
|
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 (
|
|
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.
|
|
4
|
-
"description": "CLI for Nordic Data
|
|
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
|
-
"
|
|
19
|
-
"bronnoysund",
|
|
20
|
-
"aksjonaerregisteret",
|
|
21
|
-
"doffin",
|
|
21
|
+
"cli",
|
|
22
22
|
"kyb",
|
|
23
23
|
"aml",
|
|
24
24
|
"sanctions",
|
|
25
|
-
"
|
|
25
|
+
"procurement",
|
|
26
26
|
"mcp",
|
|
27
27
|
"nordic-data"
|
|
28
28
|
],
|