@formachines/errata-mcp
An MCP server for Errata: places where AI models write outdated code for PyPI and
npm libraries, each with a fix verified in a sandbox. Three tools; stdio; no API key.
Install
Claude Code:
Any client with a JSON config (Claude Desktop, Cursor, Windsurf, VS Code …):
Node 20 or newer. Registry name: ai.formachines/errata.
Tools
Each entry in an answer carries verdict (apply / lead / none), grade (verified / possible /
not_affected / unknown), reason, wrong, right, detect, error, fails_on, verified_on, url.
Example, check_package {"ecosystem":"pypi","package":"click","version":"8.5.0"} against the live base:
and the same package at a version nobody checked, "version":"8.6.0":
status: "unconfirmed_version", verdict lead, reason installed 8.6.0 is newer than the versions checked (8.5.0);
one checked version is not a range.
Rule
One rule for the server, the CLI, the skill and the site (printed in every page footer, llms.txt and the JSON
agent_rule): apply a correction on your own only when the installed version is one it was checked on
(versions.checked_on: fails_on and every recheck) and its proof.auto_apply is true. A newer version than the
checked ones, one between works_on and fails_on, or an unknown one is lead; works_on or older is none.
Merged and withdrawn entries are never offered: answers list them under not_offered with the entry that carries a
merged one now. report refuses them before sending. An unreachable base is technical_error with isError: true,
never no_coverage.
Environment
Requests carry the User-Agent formachines-errata-mcp/<version>, so the site counts MCP traffic apart.
Search misses (since 0.1.2). When search_error finds nothing, the server sends POST https://formachines.ai/v1/miss
with the source (mcp), the exception type and its message scrubbed of paths, numbers, IP addresses, hex, UUIDs,
e-mails, token-like strings and quoted values other than plain names ('numpy' stays, 'my secret' becomes <str>),
at most 200 characters. A dotted type keeps only its last part (acme.errors.BillingError → BillingError). No code,
no project name, no other lines of the traceback; text with no SomeError: … line sends nothing. It is sent in the
background (the answer never waits for it, a network error is ignored) and only on a miss. The receiver scrubs again,
keeps no IP address and uses the list to decide which errors to cover next. ERRATA_NO_TELEMETRY=1 turns it off.
Overhead
Measured 2026-11-02 against formachines.ai: the first check_package costs 3 requests (index 5.9 kB, changelog 31 kB,
the package JSON 5–12 kB), later calls in the next ten minutes only the package JSON (or nothing, when cached).
search_error costs one 31 kB request for the error index. Sizes are uncompressed; since 2026-11-02 the site sends
JSON gzipped, about a fifth of that on the wire. Answers are compact: 0.6 kB for click, 1.9 kB for
typescript (two entries), 0.9 kB for a matched error.
What the server does not promise
- Not a full scan. The base covers a few dozen packages;
no_coverage means no corrections, not that the code is
current.
- No range proof. One checked version is not a range; newer versions are
lead.
- Not an applier. The server never edits code;
apply says the base allows applying the fix as is.
- Reports are not published.
report sends to a quarantine that is rechecked in the sandbox before anything
changes; a note is never shown to other agents.
- No offline mode. Without the network every tool answers
technical_error.
Check it yourself
Development
src/core is shared with errata-cli and kept identical in both. Tests run against a snapshot of formachines.ai/errata in test/fixtures/site (2026-11-02); npm test starts the built server over stdio with the SDK client and runs the seven acceptance cases; scripts/inspect-live.sh repeats them with MCP Inspector against the live base. server.json follows the registry schema 2025-12-11.
MIT licence. The data is CC BY 4.0 (formachines.ai/errata).