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 Code
claude mcp add --transport http attestwire https://api.attestwire.com/mcp

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:

stdio alternative
{
  "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

ToolAccessWhat 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:

PlanDocuments / monthPriceWhich 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.

  1. Connect with no credential. explain_rule, check_vies_status, check_french_readiness, list_approved_platforms, issue_api_key and send_feedback answer immediately.
  2. Create a key and save it outside the chat. issue_api_key takes 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, .env file or secret store. Do not leave it as a message in an agent conversation and do not paste it back into one.
  3. Configure it in your MCP client, then reconnect. Over HTTP that is an Authorization: Bearer header; through the stdio bridge it is the ATTESTWIRE_API_KEY environment 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_..."
  4. Verify with one metered call. Ask for validate_invoice on an invoice. If you receive missing_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

Connect it now.

claude mcp add --transport http attestwire https://api.attestwire.com/mcp

Tool schemas, error shapes and transport details are in the API documentation. Or run the engine in your browser first

Documentation for software and AI assistants: every rule page answers at .md (/rules/BR-DE-15.md is the markdown of /rules/BR-DE-15), every property ships an llms.txt, and the API ships OpenAPI 3.1. Start at attestwire.com/llms.txt.