Local MCP server for EU VIES VAT number validation — no key, no cloud middle.
Two well-named, focused tools with comprehensive descriptions and proper input schemas. check_vat has excellent domain-specific documentation (consultation numbers, legal proof, Polish JDG context). Schemas include type definitions and parameter descriptions. However, output schemas are not formally documented in the tool definitions, responses are described in prose but not as structured JSON Schema. Error handling is present but could be more actionable for LLM recovery. No tool annotations (readOnlyHint, destructiveHint) despite both being read-only operations.
Check an EU VAT number against the VIES database (the EU-wide cross-border VAT validator). Returns valid/invalid + registered name and address if the national database returns them. Accepts either (country_code, vat_number) separately or a combined `vat` like 'PL5252344078'. For Polish JDG issuing 0% VAT invoices to EU B2B customers: ALSO pass requester_country + requester_vat with your own PL VAT — VIES will return a consultation_number that serves as legal proof of the check. Keep this number for your records. VIES will not issue a consultation number if EITHER VAT is invalid.
List the country codes supported by VIES (all 27 EU member states, plus XI for Northern Ireland).
Output schemas not formally documented. Tool descriptions explain responses in prose (e.g., 'Returns valid/invalid + registered name and address') but do not provide JSON Schema definitions. LLMs cannot reliably parse unstructured responses or plan downstream operations.
No tool annotations. Both tools are read-only (risk: READ_ONLY declared in metadata) but lack readOnlyHint in schema. Agents cannot distinguish safe tools from destructive ones without explicit hints.
Error responses lack recovery guidance. _check_vat() returns error dicts with status codes and raw response text, but does not tell the LLM what to do next (e.g., 'Retry in 5 minutes' or 'Validate VAT format'). Agents cannot self-correct.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
Parameter descriptions lack format constraints. 'country_code' and 'requester_country' describe the 2-letter format but do not specify the enum of valid codes (AT, BE, BG, ..., XI). LLMs may hallucinate invalid codes.
Mutual parameter dependency underdocumented. requester_country and requester_vat must be passed together to obtain a consultation_number, but this constraint is only mentioned in the tool description, not in parameter descriptions. LLMs may pass one without the other.