# Changelog

All notable changes to `@attestwire/mcp`, the stdio bridge to the Attestwire MCP
server.

The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

**What a version number here does and does not mean.** This package is a
transport bridge — it moves JSON-RPC messages between stdio and
`https://api.attestwire.com/mcp` and interprets none of them. New tools and new
rules reach every installed copy the moment the server deploys, without a
release here. So a version bump in this file is about the *bridge* and about
what the package **says about itself** — and the second half matters more than
it looks, because the npm metadata (`mcpName`, `files`) is immutable per version
and is what the official MCP registry validates ownership against.

## [1.2.2] — 2026-09-26

Documentation only: the bridge's behaviour is unchanged. It describes the
`apps/api` deploy of 2026-09-26 — see `REGISTRY_SUBMISSIONS.md` §G2.

- README, `REGISTRY_SUBMISSIONS.md`, `server.json` and `package.json` now
  describe fourteen tools (`get_recipient_profile` joined the roster) and 321
  explained rule ids, and say that `validate_invoice_xml` reads a Factur-X or
  ZUGFeRD PDF (`pdf_base64`) — checking the attachment and the XMP metadata as
  findings that never fail the result — while still never writing one.
- The paid plans are stated in euros, as the API now charges them: Solo €9/mo
  for 1,000 documents, Starter €29/mo for 5,000, Scale €99/mo for 50,000.

## [1.2.1] — 2026-09-24

Documentation and `--help` text; the bridge's behaviour is unchanged.

- `--help` still said "five of nine tools are free", the roster of 2026-08-13,
  through two roster changes since; it says six of the thirteen, and
  `test/package.test.mjs` now runs `--help` and checks the count against the
  server's own tool list.
- The README's at-a-glance row still said 12 tools, 5 keyless, after 1.2.0
  corrected the prose around it; it says 13, 6 keyless.
- The README's PDF limit now says where a PDF can go instead, since no tool on
  this server takes or makes one: the free CLI
  (`npx @attestwire/en16931 validate invoice.pdf`) checks one locally, and on a
  paid plan the HTTP API's `POST /v1/generate?format=pdf` returns the Factur-X
  PDF.

## [1.2.0] — 2026-09-22

The bridge sends two more headers. Nothing it forwards changes.

- **The real client's name** goes to the server as `x-attestwire-client`
  (`name/version` from the client's own `initialize`). Until now every call
  through the bridge reached the server as `attestwire-mcp-bridge`, so usage
  could not be told apart by client. Stripped to printable ASCII first, so an
  unusual client name can never make a request fail.
- **The session id** the server returns on `initialize` (`Mcp-Session-Id`) is
  echoed on every later request, as the Streamable HTTP transport asks of a
  client. The server uses it only to group one connection's calls in its usage
  telemetry; a new `initialize` starts a new one.
- Docs: thirteen tools, six keyless. The new keyless `send_feedback` tool lets
  an agent tell us what its user was trying to do. It reached every installed
  bridge when the server deployed; the README and registry notes now list it.

## [1.1.5] — 2026-09-22

Documentation patch; bridge runtime unchanged.

- The README's tool count said 9 beside a table of twelve; it says 12 (5
  keyless, 6 keyed and metered, 1 keyed and free).
- The notes said only `validate_invoice`, `validate_invoice_xml` and
  `generate_invoice` cost a document. `diagnose_invoice` does too, and
  `lookup_peppol_participant` and `verify_vat_vies` cost one per conclusive
  result and nothing when the outside service is unavailable.
- Paid plans name the yearly prices ($490 and $1,990) beside the monthly ones.
- The changelog link was relative, which npm cannot resolve without a
  `repository` field; it is absolute.

## [1.1.4] — 2026-09-16

Documentation and metadata patch; bridge runtime unchanged.

- Describe all twelve hosted tools, including invoice diagnosis and reviewed
  repair, Peppol recipient diagnostics, and live VIES verification.
- Correct access classes: five keyless tools, six metered checks and one keyed
  free tool. Unavailable live checks are uncharged.
- Document identifier sharing, caller-retained evidence and the limits of
  registration checks. Existing bridge installations discover new tools
  without upgrading; this patch updates the npm and registry-facing copy.

## [1.1.3] — 2026-09-10

**No behaviour change. The bridge is byte-identical in effect to 1.1.2**; this
release is documentation and registry metadata only.

### Changed

- **The paid plans are now stated wherever the free tier is.** The README's
  at-a-glance table, its notes, the `get_upgrade_link` row and both credential
  descriptions in `server.json` name Starter $49/mo for 2,500 documents and
  Scale $199/mo for 25,000 next to the free 100. Until now every registry-facing
  surface described a free tool with a ceiling and said nothing about what lay
  above it; the only place a price appeared was the live `get_upgrade_link`
  description. Nothing about the flow changed: `get_upgrade_link` still returns
  a link, and a human still pays.
- **Records a server-side change so the README can describe it:** metered
  results now end with the documents left, the plan and the reset date, and
  the call that crosses 80% of the allowance carries a one-time notice naming
  the next plan. That is server behaviour and reaches every installed copy
  without this release.

## [1.1.2] — 2026-08-16

**No behaviour change. The bridge is byte-identical in effect to 1.1.1**; every
change below is metadata, documentation, or the registry identity. Nothing about
the stdio framing, the endpoint, the header handling or the error paths moved.

This is the release prepared for the **official MCP registry listing**
(`registry.modelcontextprotocol.io`). See `REGISTRY_SUBMISSIONS.md`.

### Changed

- **`mcpName` is now `com.attestwire/en16931`** (was `com.attestwire/mcp`).
  This is the server's permanent name in the official MCP registry, and the
  registry's `search` is a **substring match on the name only** — verified
  against the live API on 2026-08-15: `?search=xrechnung` and
  `?search=e-invoicing` return zero results while `?search=peppol` returns
  exactly the one server whose *name* contains "peppol", and `?search=FDIC`
  returns only servers whose names contain "fdic". A server named
  `…/mcp` is therefore unreachable by every query a buyer would type.
  `en16931` currently has **zero** results registry-wide, so this name is the
  sole hit for it. The value is immutable once a version carrying it is on npm,
  so it is a decision made before the publish, not after.
- `description` now leads with the tool count ("nine … tools"), which is the
  first thing a directory listing renders and the first thing a reader compares
  against a competitor.
- `keywords` reordered and extended to 16: `factur-x`, `validation`, `ubl` and
  `cii` added, and the seven terms a searcher actually types — `en16931`,
  `e-invoicing`, `xrechnung`, `factur-x`, `peppol`, `validation`, `invoice` —
  moved to the front. `factur-x` is a search term and a profile id we really do
  emit (`facturx-en16931`, as CII payload); it is **not** a claim that this
  server reads or writes a Factur-X PDF, which it does not — see the README.
- `version` and `server.json`'s two version fields moved together to `1.1.2`.
  `1.1.1` was tagged (`mcp-v1.1.1`) and then the tree moved on underneath it in
  three files that ship inside the tarball, so that number named two different
  artifacts and was never safe to publish. It has been abandoned rather than
  reused.

### Added

- This changelog, and `CHANGELOG.md` in `files` so it ships in the tarball.
- README: an install one-liner, the tool-count / hosted-endpoint / npx / limits
  block that directory listings are written from, and a statement of what the
  bridge is and is not.
- `server.json` is the official-registry payload and now carries both a
  `remotes[]` entry (`https://api.attestwire.com/mcp`, streamable HTTP) and a
  `packages[]` npm entry, so a client can choose either.

### Known limitations at this version

- **No `repository` field.** `github.com/attestwire/einvoice` is private, so a
  `repository` link would render a 404 on the npm page for every visitor, and
  npm cannot generate a provenance attestation from a private source repository
  at all. Both are fixed by the same thing — a public `attestwire/mcp` split —
  and neither is fixed by adding the field. Tracked in `REGISTRY_SUBMISSIONS.md`.
- **MCP tool responses carry no `provenance` object**, while the HTTP API's do.
  That gap lives in `apps/api/src/mcp-tools.js`, not in this package: the bridge
  forwards what the server sends and adds nothing. Pinned from the API side by
  `apps/api/test/xml-validate.test.js`, which asserts the difference between the
  two surfaces is exactly that one key.

## [1.1.1] — 2026-08-13

### Changed

- Billing wording corrected from Stripe to Paddle across the documentation
  surfaces. `get_upgrade_link` returns a Paddle-hosted checkout.

*Tagged as `mcp-v1.1.1` but never published to npm.*

## [1.1.0] — 2026-08-12

### Added

- Coverage of the nine-tool server: `validate_invoice_xml` (read a UBL 2.1
  `Invoice`, a UBL 2.1 `CreditNote` or a UN/CEFACT CII `CrossIndustryInvoice`)
  and CII generation (`xrechnung-cii`, `facturx-en16931`).

*Tagged as `mcp-v1.1.0` but never published to npm.*

## [1.0.0] — 2026-08-12

First published release. `npx -y @attestwire/mcp`.

### Added

- stdio ↔ streamable-HTTP bridge for `https://api.attestwire.com/mcp`.
- `ATTESTWIRE_API_KEY` (optional, read once at process start, sent as
  `Authorization: Bearer`) and `ATTESTWIRE_MCP_URL` (endpoint override).
- `--help` and `--version`.
- Zero runtime dependencies; Node ≥ 20.

### Notes

- Published from a laptop with a short-lived bypass token, so **1.0.0 carries no
  provenance attestation**. `.github/workflows/publish-mcp.yml` exists so that
  does not happen again.
- Describes the **eight**-tool, UBL-only server that production served at the
  time. It is correct about that server and stays published as it is.
