vatnode-mcp 0.2.1 → 0.3.1

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 CHANGED
@@ -3,6 +3,7 @@
3
3
  [![npm version](https://img.shields.io/npm/v/vatnode-mcp)](https://www.npmjs.com/package/vatnode-mcp)
4
4
  [![Tests](https://github.com/vatnode/vatnode-mcp/actions/workflows/test.yml/badge.svg)](https://github.com/vatnode/vatnode-mcp/actions/workflows/test.yml)
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
6
+ [![vatnode/vatnode-mcp MCP server](https://glama.ai/mcp/servers/vatnode/vatnode-mcp/badges/score.svg)](https://glama.ai/mcp/servers/vatnode/vatnode-mcp)
6
7
 
7
8
  Official [Model Context Protocol](https://modelcontextprotocol.io) server for **[vatnode](https://vatnode.dev)** — VAT validation and EU tax data for AI agents.
8
9
 
@@ -27,7 +28,7 @@ Lets AI assistants (Claude Desktop, Cursor, ChatGPT, Continue, Cline, …) look
27
28
 
28
29
  Free tools work fully offline — data is bundled via [`eu-vat-rates-data`](https://www.npmjs.com/package/eu-vat-rates-data) and updated daily from the European Commission TEDB.
29
30
 
30
- `validate_vat_number` requires a vatnode API key. The free tier includes a monthly request quota — [get one in 30 seconds](https://vatnode.dev).
31
+ `validate_vat_number` requires a vatnode API key. The free tier includes a monthly request quota — [get one in 30 seconds](https://vatnode.dev/login?ref=mcp-readme).
31
32
 
32
33
  ---
33
34
 
@@ -91,7 +92,7 @@ Any MCP-compatible client can connect — point it at `npx -y vatnode-mcp` and (
91
92
  - VIES consultation numbers (audit-grade proof of validation)
92
93
  - Per-key rate limiting + dashboard analytics
93
94
 
94
- [**Sign up free →**](https://vatnode.dev)
95
+ [**Sign up free →**](https://vatnode.dev/login?ref=mcp-readme)
95
96
 
96
97
  ---
97
98
 
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  isEUMember,
12
12
  dataVersion
13
13
  } from "eu-vat-rates-data";
14
- var VERSION = "0.2.1";
14
+ var VERSION = "0.3.1";
15
15
  var API_BASE = process.env.VATNODE_API_URL ?? "https://api.vatnode.dev";
16
16
  var API_KEY = process.env.VATNODE_API_KEY;
17
17
  var USER_AGENT = `vatnode-mcp/${VERSION} (+https://vatnode.dev)`;
@@ -58,7 +58,13 @@ server.registerTool(
58
58
  "list_eu_vat_rates",
59
59
  {
60
60
  title: "List EU VAT rates",
61
- description: 'Returns current VAT rates for all EU member states (plus XI for Northern Ireland). Use when the user asks for an overview, a comparison across countries, or "all EU VAT rates". For a single country prefer get_country_vat_rates. Data is sourced from the EU Commission TEDB and updated daily. Free, no API key required.',
61
+ description: 'Returns current VAT rates for all EU member states (plus XI for Northern Ireland). Read-only and offline: no network call, no API key, no rate limit, no side effects. Takes no arguments. Output: { rates: Array<{ countryCode, countryName, vatName, vatAbbr, currency, standardRate, reducedRates[], superReducedRate, parkingRate, vatNumberFormat, vatNumberPattern, updatedAt }>, count, updatedAt }. Rates are percentages (e.g. 25.5). Use when the user asks for an overview, a comparison across countries, or "all EU VAT rates". For a single country prefer get_country_vat_rates. Data is sourced from the EU Commission TEDB and updated daily. Free, no API key required.',
62
+ annotations: {
63
+ readOnlyHint: true,
64
+ destructiveHint: false,
65
+ idempotentHint: true,
66
+ openWorldHint: false
67
+ },
62
68
  inputSchema: {}
63
69
  },
64
70
  async () => {
@@ -70,7 +76,13 @@ server.registerTool(
70
76
  "get_country_vat_rates",
71
77
  {
72
78
  title: "Get VAT rates for a country",
73
- description: 'Returns the standard, reduced, super-reduced and parking VAT rates for a single European country, plus the VAT number format and regex. Accepts ISO 3166-1 alpha-2 codes (DE, FR, IT, \u2026); also covers non-EU European jurisdictions where available (NO, CH, GB, UA, TR, \u2026). Use when the user asks "what is the VAT rate in X" or needs the VAT number format for a country. Free, no API key required.',
79
+ description: 'Returns the standard, reduced, super-reduced and parking VAT rates for a single European country, plus the VAT number format and regex. Read-only and offline: no network call, no API key, no rate limit, no side effects. Accepts ISO 3166-1 alpha-2 codes (DE, FR, IT, \u2026); also covers non-EU European jurisdictions where available (NO, CH, GB, UA, TR, \u2026). Output: { countryCode, countryName, vatName, vatAbbr, currency, standardRate, reducedRates[], superReducedRate, parkingRate, vatNumberFormat, vatNumberPattern, updatedAt }; rates are percentages and may be null where not applicable. Returns an error if the country code is unknown. Use when the user asks "what is the VAT rate in X" or needs the VAT number format for a country. Free, no API key required.',
80
+ annotations: {
81
+ readOnlyHint: true,
82
+ destructiveHint: false,
83
+ idempotentHint: true,
84
+ openWorldHint: false
85
+ },
74
86
  inputSchema: {
75
87
  countryCode: z.string().length(2).describe('ISO 3166-1 alpha-2 country code, e.g. "DE", "FR", "IT".')
76
88
  }
@@ -85,7 +97,13 @@ server.registerTool(
85
97
  "check_vat_format",
86
98
  {
87
99
  title: "Check VAT number format",
88
- description: "Performs an offline syntactic check of a VAT number against the country-specific regex pattern. Does NOT verify the VAT with VIES \u2014 use validate_vat_number for that. Use when the user wants a quick sanity check on the shape of a VAT ID without burning a quota call. Free, no API key required.",
100
+ description: "Performs an offline syntactic check of a VAT number against the country-specific regex pattern. Read-only and offline: no network call, no API key, no rate limit, no side effects. Does NOT verify the VAT with VIES (a valid format does not mean the VAT is real or active) \u2014 use validate_vat_number for that. Output: { input, normalized, countryCode, validFormat (boolean), error }; countryCode is null when the prefix is unknown. Use when the user wants a quick sanity check on the shape of a VAT ID without burning a quota call. Free, no API key required.",
101
+ annotations: {
102
+ readOnlyHint: true,
103
+ destructiveHint: false,
104
+ idempotentHint: true,
105
+ openWorldHint: false
106
+ },
89
107
  inputSchema: {
90
108
  vatId: z.string().min(3).describe(
91
109
  'A VAT number, with or without spaces/dashes, with or without country prefix (e.g. "DE123456789", "IE 6388047 V").'
@@ -109,7 +127,13 @@ server.registerTool(
109
127
  "list_supported_countries",
110
128
  {
111
129
  title: "List supported countries",
112
- description: "Returns the list of countries the vatnode MCP server has VAT data for. Distinguishes EU member states (eligible for full VIES validation) from other European jurisdictions (rate lookup only).",
130
+ description: "Returns every country the vatnode server has VAT data for (EU-27 + XI for Northern Ireland + ~17 other European jurisdictions such as NO, CH, GB, UA, TR). Read-only and offline: no network call, no API key, no rate limit, no side effects. Takes no arguments. Output: { countries: Array<{ countryCode, countryName, isEUMember, viesValidationSupported }>, count, euCount, updatedAt }, sorted by countryCode. `viesValidationSupported: true` means validate_vat_number can do live VIES verification; non-EU jurisdictions are rate-lookup only. Use to discover coverage or to pick a valid countryCode before calling get_country_vat_rates or validate_vat_number.",
131
+ annotations: {
132
+ readOnlyHint: true,
133
+ destructiveHint: false,
134
+ idempotentHint: true,
135
+ openWorldHint: false
136
+ },
113
137
  inputSchema: {}
114
138
  },
115
139
  async () => {
@@ -134,7 +158,7 @@ async function callVatnodeApi(path, init) {
134
158
  ok: false,
135
159
  error: err(
136
160
  "This tool requires a vatnode API key.",
137
- "Set the VATNODE_API_KEY environment variable in your MCP client config. Get a free key at https://vatnode.dev (free tier includes a monthly request quota)."
161
+ "Set the VATNODE_API_KEY environment variable in your MCP client config. Get a free key at https://vatnode.dev/login?ref=mcp-tool (free tier includes a monthly request quota)."
138
162
  )
139
163
  };
140
164
  }
@@ -159,7 +183,13 @@ server.registerTool(
159
183
  "validate_vat_number",
160
184
  {
161
185
  title: "Validate EU VAT number",
162
- description: "Verifies an EU VAT number against the official VIES service and returns validity, company name, address, registration date and other metadata. When the requester (your own VAT) is configured on the vatnode account, also returns a VIES consultation number \u2014 audit-grade proof of validation. Use whenever the user wants to confirm a VAT is real, look up the company behind a VAT, or needs evidence for accounting/compliance. Requires a vatnode API key (free tier available). Only EU-27 + XI (Northern Ireland) are supported by VIES.",
186
+ description: "Verifies an EU VAT number against the official VIES service and returns validity, company name, address, registration date and other metadata. When the requester (your own VAT) is configured on the vatnode account, also returns a VIES consultation number \u2014 audit-grade proof of validation. Use whenever the user wants to confirm a VAT is real, look up the company behind a VAT, or needs evidence for accounting/compliance. Side effects: makes an authenticated network call to api.vatnode.dev (which queries the EU VIES service) and consumes one request from your monthly quota; it is read-only (verifies, never mutates) and safe to retry. Requires a vatnode API key (free tier available; set VATNODE_API_KEY). Only EU-27 + XI (Northern Ireland) are supported by VIES; other countries return an error.",
187
+ annotations: {
188
+ readOnlyHint: true,
189
+ destructiveHint: false,
190
+ idempotentHint: true,
191
+ openWorldHint: true
192
+ },
163
193
  inputSchema: {
164
194
  vatId: z.string().min(3).describe(
165
195
  'EU VAT number, with country prefix. Spaces and dashes are stripped. Examples: "DE123456789", "IE6388047V", "FR12345678901".'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vatnode-mcp",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "mcpName": "io.github.vatnode/vatnode-mcp",
5
5
  "description": "Official Model Context Protocol (MCP) server for vatnode — EU VAT validation, rates, and format checks for AI agents (Claude, Cursor, ChatGPT).",
6
6
  "keywords": [