@omnizoek/mcp-server 0.1.2 → 0.1.4
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 +15 -3
- package/dist/index.js +111 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# @omnizoek/mcp-server
|
|
2
2
|
|
|
3
|
-
> **Model Context Protocol server** for OmniZoek — exposes
|
|
3
|
+
> **Model Context Protocol server** for OmniZoek — exposes 16 Dutch government data APIs as AI agent tools.
|
|
4
4
|
|
|
5
|
-
Add this server to Claude Desktop, Cursor, or any MCP-compatible AI client and your agent can instantly look up Dutch addresses, validate IBANs, check vehicle ZE-zone compliance, look up energy labels, and more — all backed by live BAG, EP-Online, RDW, VIES, NS,
|
|
5
|
+
Add this server to Claude Desktop, Cursor, or any MCP-compatible AI client and your agent can instantly look up Dutch addresses, validate IBANs, geocode locations, look up exchange rates, check company LEI records, check vehicle history, check ZE-zone compliance, look up energy labels, and more — all backed by live BAG, EP-Online, RDW, VIES, NS, ENTSO-E, PDOK, ECB, and GLEIF data.
|
|
6
6
|
|
|
7
7
|
[](https://www.npmjs.com/package/@omnizoek/mcp-server)
|
|
8
|
-
[](LICENSE)
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -23,6 +23,12 @@ Add this server to Claude Desktop, Cursor, or any MCP-compatible AI client and y
|
|
|
23
23
|
| `omnizoek_grid_trigger` | Get current ENTSO-E electricity price and whether the negative-price trigger is active |
|
|
24
24
|
| `omnizoek_minimum_wage` | Look up the Dutch statutory minimum wage for a given age |
|
|
25
25
|
| `omnizoek_holiday_surcharge` | Check if a date is a Dutch public holiday and get the wage surcharge multiplier |
|
|
26
|
+
| `omnizoek_exchange_rates` | Get the latest ECB daily euro foreign exchange reference rates |
|
|
27
|
+
| `omnizoek_vat_rates` | Get VAT rates for an EU country (full category breakdown for NL) |
|
|
28
|
+
| `omnizoek_geocode` | Forward geocode a free-text query to Dutch coordinates (PDOK Locatieserver) |
|
|
29
|
+
| `omnizoek_reverse_geocode` | Reverse geocode WGS84 coordinates to a Dutch address |
|
|
30
|
+
| `omnizoek_lei_lookup` | Look up a legal entity by LEI code or search by company name (GLEIF) |
|
|
31
|
+
| `omnizoek_vehicle_history` | Full vehicle history from RDW: specs, fuel, APK expiry, open recalls |
|
|
26
32
|
|
|
27
33
|
---
|
|
28
34
|
|
|
@@ -120,6 +126,12 @@ Once configured, you can ask your AI agent:
|
|
|
120
126
|
- *"What is the minimum wage for a 19-year-old in the Netherlands today?"*
|
|
121
127
|
- *"Is 25 December 2025 a public holiday, and what is the retail surcharge multiplier?"*
|
|
122
128
|
- *"What is the current electricity price in the Netherlands, and is the negative-price trigger active?"*
|
|
129
|
+
- *"What are today's euro exchange rates from the ECB?"*
|
|
130
|
+
- *"What are the VAT rates in the Netherlands, broken down by category?"*
|
|
131
|
+
- *"Geocode the address Damrak 1 Amsterdam to coordinates."*
|
|
132
|
+
- *"What address is nearest to coordinates 52.3756, 4.8951?"*
|
|
133
|
+
- *"Look up the LEI record for ING Bank N.V. in the Netherlands."*
|
|
134
|
+
- *"What is the APK expiry date and are there any open recalls for kenteken AB123C?"*
|
|
123
135
|
|
|
124
136
|
---
|
|
125
137
|
|
package/dist/index.js
CHANGED
|
@@ -234,6 +234,117 @@ function registerTools(server2, client) {
|
|
|
234
234
|
}
|
|
235
235
|
}
|
|
236
236
|
);
|
|
237
|
+
server2.tool(
|
|
238
|
+
"omnizoek_exchange_rates",
|
|
239
|
+
"Retrieve the latest daily euro foreign exchange reference rates from the European Central Bank (ECB). Returns rates for ~30 currencies against EUR. Cached for 4 hours. Use for currency conversion, invoicing in foreign currencies, or financial reporting.",
|
|
240
|
+
{},
|
|
241
|
+
async () => {
|
|
242
|
+
try {
|
|
243
|
+
const result = await client.finance.exchangeRates();
|
|
244
|
+
return {
|
|
245
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
|
|
246
|
+
};
|
|
247
|
+
} catch (err) {
|
|
248
|
+
return errResponse(err);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
);
|
|
252
|
+
server2.tool(
|
|
253
|
+
"omnizoek_vat_rates",
|
|
254
|
+
"Look up official VAT rates for any EU or EEA country (plus GB, NO, CH). Returns the standard rate, reduced rate(s), and whether a zero rate applies. For the Netherlands (NL) a full per-category breakdown is included (food, books, software/SaaS, accommodation, etc.). Use for e-commerce checkout, invoice generation, or tax compliance.",
|
|
255
|
+
{
|
|
256
|
+
country: z.string().length(2).optional().describe(
|
|
257
|
+
"ISO 3166-1 alpha-2 country code, e.g. 'NL', 'DE', 'FR'. Defaults to 'NL'."
|
|
258
|
+
)
|
|
259
|
+
},
|
|
260
|
+
async ({ country }) => {
|
|
261
|
+
try {
|
|
262
|
+
const result = await client.finance.vatRates(country ? { country } : void 0);
|
|
263
|
+
return {
|
|
264
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
|
|
265
|
+
};
|
|
266
|
+
} catch (err) {
|
|
267
|
+
return errResponse(err);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
);
|
|
271
|
+
server2.tool(
|
|
272
|
+
"omnizoek_geocode",
|
|
273
|
+
"Convert a free-text Dutch address or postcode into geographic coordinates using the PDOK Locatieserver. Returns up to 10 matching locations with WGS84 lat/lon, postcode, city, municipality, province, street name, house number, and BAG object ID. Use for address autocomplete, map plotting, or location-based filtering.",
|
|
274
|
+
{
|
|
275
|
+
q: z.string().describe(
|
|
276
|
+
"Free-text search query, e.g. 'Damrak 1 Amsterdam', '1012LG 1', or just a postcode '1012LG'."
|
|
277
|
+
),
|
|
278
|
+
rows: z.number().int().min(1).max(10).optional().describe("Maximum number of results to return (1\u201310, default: 5).")
|
|
279
|
+
},
|
|
280
|
+
async ({ q, rows }) => {
|
|
281
|
+
try {
|
|
282
|
+
const result = await client.geo.geocode({ q, rows });
|
|
283
|
+
return {
|
|
284
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
|
|
285
|
+
};
|
|
286
|
+
} catch (err) {
|
|
287
|
+
return errResponse(err);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
);
|
|
291
|
+
server2.tool(
|
|
292
|
+
"omnizoek_reverse_geocode",
|
|
293
|
+
"Convert WGS84 geographic coordinates (latitude/longitude) to the nearest Dutch address using the PDOK Locatieserver. Only Dutch territory is covered. Returns the full address including postcode, city, street, house number, and BAG ID. Use when you have GPS coordinates and need the corresponding Dutch address.",
|
|
294
|
+
{
|
|
295
|
+
lat: z.number().min(50.5).max(53.7).describe("Latitude in WGS84 decimal degrees, e.g. 52.3756. Must be within Dutch territory (50.5\u201353.7)."),
|
|
296
|
+
lon: z.number().min(3.2).max(7.3).describe("Longitude in WGS84 decimal degrees, e.g. 4.8951. Must be within Dutch territory (3.2\u20137.3).")
|
|
297
|
+
},
|
|
298
|
+
async ({ lat, lon }) => {
|
|
299
|
+
try {
|
|
300
|
+
const result = await client.geo.reverseGeocode({ lat, lon });
|
|
301
|
+
return {
|
|
302
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
|
|
303
|
+
};
|
|
304
|
+
} catch (err) {
|
|
305
|
+
return errResponse(err);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
);
|
|
309
|
+
server2.tool(
|
|
310
|
+
"omnizoek_lei_lookup",
|
|
311
|
+
"Look up a Legal Entity Identifier (LEI) via the GLEIF Global LEI Index. Provide either a 20-character LEI code for an exact lookup, or a company name for a fuzzy search (optionally filtered by country). Returns the official legal name, registered and headquarters addresses, legal form, jurisdiction, registration status, BIC codes, and parent LEI. LEI codes are mandatory under MiFID II, EMIR, and SFTR. Use for KYB onboarding, AML counterparty identification, or regulatory reporting.",
|
|
312
|
+
{
|
|
313
|
+
lei: z.string().length(20).optional().describe("Exact 20-character LEI code, e.g. '5493001KJTIIGC8Y1R12'. Provide this OR name, not both."),
|
|
314
|
+
name: z.string().optional().describe("Company legal name to search for, e.g. 'ING Bank'. Provide this OR lei, not both."),
|
|
315
|
+
country: z.string().length(2).optional().describe("ISO 3166-1 alpha-2 country filter for name search, e.g. 'NL'. Only used when searching by name."),
|
|
316
|
+
rows: z.number().int().min(1).max(10).optional().describe("Maximum number of name-search results (1\u201310, default: 5). Ignored for exact LEI lookups.")
|
|
317
|
+
},
|
|
318
|
+
async ({ lei, name, country, rows }) => {
|
|
319
|
+
try {
|
|
320
|
+
const result = await client.business.leiLookup({ lei, name, country, rows });
|
|
321
|
+
return {
|
|
322
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
|
|
323
|
+
};
|
|
324
|
+
} catch (err) {
|
|
325
|
+
return errResponse(err);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
);
|
|
329
|
+
server2.tool(
|
|
330
|
+
"omnizoek_vehicle_history",
|
|
331
|
+
"Look up the full registration record for a Dutch vehicle by licence plate (kenteken) using RDW Open Data. Returns make, model, body style, colour, dates, weight, seats, fuel type, Euro emission standard, CO\u2082 output, APK (roadworthiness) expiry date, and all open and resolved manufacturer recalls. Use for fleet management, vehicle valuation, pre-purchase checks, or compliance verification.",
|
|
332
|
+
{
|
|
333
|
+
kenteken: z.string().describe(
|
|
334
|
+
"Dutch licence plate (kenteken) with or without hyphens, e.g. 'AB-123-C' or 'AB123C'. Case-insensitive."
|
|
335
|
+
)
|
|
336
|
+
},
|
|
337
|
+
async ({ kenteken }) => {
|
|
338
|
+
try {
|
|
339
|
+
const result = await client.logistics.vehicleHistory({ kenteken });
|
|
340
|
+
return {
|
|
341
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
|
|
342
|
+
};
|
|
343
|
+
} catch (err) {
|
|
344
|
+
return errResponse(err);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
);
|
|
237
348
|
}
|
|
238
349
|
|
|
239
350
|
// src/index.ts
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@omnizoek/mcp-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "MCP server that exposes OmniZoek Dutch government data APIs as AI agent tools (Claude Desktop, Cursor, and any MCP-compatible client).",
|
|
5
5
|
"author": "OmniZoek <support@omnizoek.nl>",
|
|
6
|
-
"license": "
|
|
6
|
+
"license": "UNLICENSED",
|
|
7
7
|
"homepage": "https://omnizoek.nl/docs",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@modelcontextprotocol/sdk": "^1.6.0",
|
|
46
|
-
"@omnizoek/sdk": "
|
|
46
|
+
"@omnizoek/sdk": "file:../omni-sdk-js",
|
|
47
47
|
"zod": "^3.23.0"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|