Let your AI assistant check invoices
the assistant asks. The rules answer.
Model Context Protocol (MCP) connects your AI assistant to Attestwire’s tools. It can explain errors, check invoice data and create invoice XML. Six tools need no API key. Add a key when you need checks that use your monthly allowance.
The checks themselves are fixed rules, so the same invoice and rule set
always give the same result; the assistant only calls them. There are fourteen tools in total. Check the live version at
GET /v1/versions,
without a key.
Connect your assistant
Use https://api.attestwire.com/mcp as the server address. Choose streamable HTTP, the remote connection method, if your client asks for a transport.
claude mcp add --transport http attestwire https://api.attestwire.com/mcp
-
Streamable HTTP clients: use
https://api.attestwire.com/mcp. -
Local-process clients:
@attestwire/mcpbridges stdio to the same endpoint. The config block - No key needed to start: connect without a credential and use the six public tools. Add a key later for document calls. See the steps
If your client can only spawn a local process
The bridge is @attestwire/mcp on npm. It does nothing but
relay, 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 six keyless
tools still work. ATTESTWIRE_MCP_URL overrides the endpoint.
Fourteen 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 its SIREN or SIRET (the French company and establishment registration numbers) or by name, in the open data of INSEE, the French statistics office, with the dates its e-invoicing obligations start. It cannot read the registration held by the DGFiP, the French tax administration; no open API exposes that. |
list_approved_platforms |
No key | The French invoicing platforms approved by the DGFiP, the French tax administration (Plateformes Agréées, formerly called PDP). |
issue_api_key |
No key | Mint a free key from an email address: 100 documents a month, with no signup form or card. The key is shown once and cannot be retrieved later. |
send_feedback |
No key | Tell us what you were trying to do when no tool here does it, or a result looked wrong or confusing. Anonymous, scrubbed of identifiers, and read by a person; never invoice data. |
validate_invoice |
Key · 1 doc | Check a JSON invoice against EN 16931 (the European e-invoice standard), XRechnung (Germany's version of it) and Peppol BIS 3 (the rule set of the Peppol delivery network). 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 UBL 2.1 Invoice, a UBL CreditNote, a UN/CEFACT CII CrossIndustryInvoice or a Factur-X / ZUGFeRD PDF the user already has, and report what did not reach the invoice model. A PDF’s attachment and XMP metadata are checked too, as findings that never fail it. |
generate_invoice |
Key · 1 doc | Emit UBL 2.1 or CII D16B from a JSON invoice. The profile chooses the syntax. An invoice that fails validation is refused, so the tool never produces XML that would be rejected. |
diagnose_invoice |
Key · 1 doc | Explain rejection findings and revalidate explicitly reviewed invoice revisions. No guessed values or invoice sending. |
lookup_peppol_participant |
Key · 1 doc | Check the exact recipient and advertised document support through OpenPeppol. Unavailable checks are uncharged; registration is not delivery. |
verify_vat_vies |
Key · 1 doc | Obtain a dated VIES observation, distinguishing valid, invalid and unavailable. Unavailable checks are uncharged. |
get_recipient_profile |
Key · 1 doc | From the buyer’s country and one identifier (VAT ID, Leitweg-ID, SIREN/SIRET, KBO number, GLN or Peppol ID), how to invoice them: channel, format and the fields the invoice needs, checked against VIES, OpenPeppol and the French register. Uncharged when the identifier fails its own check digits or every source is unavailable. |
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. |
Seven of the tools are metered: each call counts as one document toward the same monthly allowance as the
HTTP API, 100 a month on the free plan.
Before you ask for lookup_peppol_participant, make sure
you have the buyer’s identifier and its scheme.
The Peppol identifier guide
shows which of the look-alike invoice fields is the delivery address
and what each lookup status means.
Free tier, quotas and paid plans
The metered tools and the HTTP endpoints they wrap share one monthly allowance per key. It starts at 100 documents a month with no card, and the paid plans raise it:
| Plan | Documents / month | Price | Which tier |
|---|---|---|---|
| Free | 100 | €0 | enough to wire the integration up and run a real month of a side project. |
| Solo | 1,000 | €9/mo | 1,000 docs ≈ a solo consultant or small studio invoicing every client, every month. |
| Starter | 5,000 | €29/mo | 5,000 docs ≈ monthly invoicing for ~160 SMB customers. |
| Scale | 50,000 | €99/mo | 50,000 docs ≈ a mid-size billing platform issuing ~1,600 invoices a day. |
Every metered tool result ends with a quota line — documents left, plan, and the date the counter resets (the 1st, 00:00 UTC) — so an agent can size the rest of the month on it. The call that crosses 80% of the allowance carries a one-time notice naming the next plan; nothing repeats it, and nothing is bought.
At the limit the tool
returns quota_exceeded and names the
two ways to upgrade: get_upgrade_link, which returns a
checkout link for a human to open, and the
upgrade form. Refused calls never consume a document and there is no
overage billing. Full pricing and cancellation terms
Add an API key when you need one
Creating a key does not automatically add it to your assistant. Save it, add it to your client configuration, then reconnect.
-
Connect with no credential.
explain_rule,check_vies_status,check_french_readiness,list_approved_platforms,issue_api_keyandsend_feedbackanswer immediately. -
Create a key and save it outside the chat.
issue_api_keytakes an email address and returns a working key with 100 documents a month and no card. The form at attestwire.com/pricing#keyform creates the same key from the same endpoint. The key is shown once, so save it in a password manager,.envfile or secret store. Do not leave it as a message in an agent conversation and do not paste it back into one. -
Configure it in your MCP client, then reconnect.
Over HTTP that is an
Authorization: Bearerheader; through the stdio bridge it is theATTESTWIRE_API_KEYenvironment variable in the config block above. After you reconnect, the metered tools take no key argument. Restart or reconnect the client so it reads the new credential.remote HTTP, with a key claude mcp remove attestwire claude mcp add --transport http attestwire https://api.attestwire.com/mcp \ --header "Authorization: Bearer aw_live_..." -
Verify with one metered call. Ask for
validate_invoiceon an invoice. If you receivemissing_api_key, check the configuration and reconnect.
A person must complete an upgrade.
get_upgrade_link needs a key, costs no documents, and
returns a checkout URL. It does not buy anything. This is the only tool
with an optional key argument; prefer the configured header when possible.
Compare plans
What these tools do not do
validate_invoice_xml reads a UBL or CII XML file, or a
Factur-X / ZUGFeRD PDF (the French and German names for a PDF with the
invoice XML attached inside it) sent base64-encoded. The attachment
and the XMP metadata are checked too, as findings that never fail the
result; PDF/A conformance itself, and whether the drawn page agrees
with the XML, are not — the REST endpoint
POST /v1/validate shares the same limit, whether the PDF
arrives there as application/pdf or here as base64.
The
check reads the invoice's contents; the
receiving platform also checks the file's structure and can still
reject it.
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