@omnizoek/mcp-server 0.1.1 → 0.1.3
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/dist/index.js +111 -0
- package/package.json +4 -3
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.3",
|
|
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,10 +43,11 @@
|
|
|
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": {
|
|
50
|
+
"@types/node": "^25.3.5",
|
|
50
51
|
"tsup": "^8.0.0",
|
|
51
52
|
"typescript": "^5.4.0"
|
|
52
53
|
},
|