One engine, three doors
The compliance engine, as tools an agent can call.
Attestwire speaks Model Context Protocol at
https://api.attestwire.com/mcp over streamable HTTP.
Nine tools: explain a rule, validate
an invoice or an existing XML file, generate UBL or CII, check whether
VIES is answering, research a French customer.
Five of them need no API key,
so an agent can be useful before anybody has signed up for anything.
Connect
claude mcp add --transport http attestwire https://api.attestwire.com/mcp
Any other client takes the endpoint directly. It is stateless — POST only, no SSE, no session id — so there is nothing to keep alive.
If your client can only spawn a local process
@attestwire/mcp bridges stdio to the same endpoint and does
nothing else, so new tools appear without upgrading it. Paste this into
claude_desktop_config.json, .cursor/mcp.json,
or whatever your client calls its config:
{
"mcpServers": {
"attestwire": {
"command": "npx",
"args": ["-y", "@attestwire/mcp"],
"env": { "ATTESTWIRE_API_KEY": "aw_live_..." }
}
}
}
ATTESTWIRE_API_KEY is optional — drop the
env block and the five keyless
tools still work. ATTESTWIRE_MCP_URL overrides the endpoint.
Nine tools, in three access classes
| Tool | Access | What it does |
|---|---|---|
explain_rule |
No key | One rule id — BR-DE-15, BR-CO-15, PEPPOL-EN16931-R010 — in plain English: what it requires, the business term it constrains, and a fix. |
check_vies_status |
No key | Whether EU VAT number validation is up, overall or per member state, with latency and uptime. Tells a bad VAT number apart from a down endpoint. |
check_french_readiness |
No key | Look up a French company by SIREN, SIRET or name in INSEE SIRENE open data, with its mandate dates. It cannot read the DGFiP directory registration itself; no open API exposes that. |
list_approved_platforms |
No key | The DGFiP-approved French platforms (Plateformes Agréées, ex-PDP). |
issue_api_key |
No key | Mint a free key from an email address — 100 documents a month, no signup flow, no card. Returned once and never recoverable. |
validate_invoice |
Key · 1 doc | Check a JSON invoice against EN 16931, XRechnung and Peppol BIS 3. Every failure comes back as a teaching error: rule id, business term, what the regulation requires, and a concrete fix. |
validate_invoice_xml |
Key · 1 doc | Check a file the user already has — a UBL 2.1 Invoice or a UN/CEFACT CII CrossIndustryInvoice — and report what did not reach the invoice model. Not a PDF reader: extract the XML from a Factur-X PDF first. |
generate_invoice |
Key · 1 doc | Emit UBL 2.1 or CII D16B from a JSON invoice. The profile chooses the syntax. An invalid invoice is refused rather than turned into XML that passes nothing. |
get_upgrade_link |
Key · free | Create a checkout link for a paid plan and return the URL. It buys nothing: a person still has to open the link and complete the purchase. |
A metered call costs one document against the same monthly quota as the HTTP API — 100 a month on the free plan. A call that is refused for auth, quota or unreadable input costs nothing.
From keyless to keyed, in the order it actually happens
-
Connect with no credential.
explain_rule,check_vies_status,check_french_readiness,list_approved_platformsandissue_api_keyanswer immediately — enough to diagnose a rule id from a rejection email, or to tell a customer whether VIES is down. -
Ask the agent to call
issue_api_key. An email address returns a working key: 100 documents a month, no card. It is shown once and only its hash is stored. -
The document tools open.
validate_invoice,validate_invoice_xmlandgenerate_invoiceare what the key buys. Without one they return an error namingissue_api_keyas the fix, so an agent gets itself unstuck. -
Upgrading is still a human act.
get_upgrade_linkneeds a key, costs no documents, and returns a checkout URL. It does not buy anything: a person opens the link and completes the purchase. Compare plans →
What these tools do not do
validate_invoice_xml reads XML, not PDFs: Factur-X and
ZUGFeRD are CII XML inside a PDF/A-3 container, so extract the XML
first and package ours separately. Reading a file is a preflight over
the parsed model, not a verdict from the receiving platform.
check_french_readiness finds the company and explains its
mandate; it cannot confirm the company has registered with an approved
platform, which lives only in the CAPTCHA-protected DGFiP directory.
Read the full limits →