MCP drift digest
firecrawl-mcp-server, hf-mcp-server, neon, next-devtools-mcp, and playwright-mcp are named because this is our reproduction of their published manifests.
MCP drift 2026-10-10
MCP drift 2026-10-10: 5 of 5 servers compared; 4 with a breaking change (firecrawl-mcp-server, hf-mcp-server, neon, next-devtools-mcp); 6 annotation flip(s).
This section records mode from-fixtures. The rows replay the committed fixture pairs dated 2026-10-10. Source file drift-2026-10-10.json.
| Server | Capture | Compared against | Exit | Breaking | Annotation flips |
|---|---|---|---|---|---|
firecrawl-mcp-server |
test/fixtures/mcp-drift-2026-10-10/firecrawl-mcp-server/after.json |
test/fixtures/mcp-drift-2026-10-10/firecrawl-mcp-server/before.json |
2 breaking |
5 |
0 |
hf-mcp-server |
test/fixtures/mcp-drift-2026-10-10/hf-mcp-server/after.json |
test/fixtures/mcp-drift-2026-10-10/hf-mcp-server/before.json |
2 breaking |
5 |
hub_repo_details openWorldHint false→true (riskier) |
neon |
test/fixtures/mcp-drift-2026-10-10/neon/after.json |
test/fixtures/mcp-drift-2026-10-10/neon/before.json |
2 breaking |
112 |
explain_sql_statement destructiveHint false→true (riskier)explain_sql_statement idempotentHint true→false (riskier)explain_sql_statement readOnlyHint true→false (riskier)provision_neon_auth idempotentHint true→false (riskier)provision_neon_data_api idempotentHint true→false (riskier) |
next-devtools-mcp |
test/fixtures/mcp-drift-2026-10-10/next-devtools-mcp/after.json |
test/fixtures/mcp-drift-2026-10-10/next-devtools-mcp/before.json |
2 breaking |
7 |
0 |
playwright-mcp |
test/fixtures/mcp-drift-2026-10-10/playwright-mcp/after.json |
test/fixtures/mcp-drift-2026-10-10/playwright-mcp/before.json |
0 no break |
0 |
0 |
What this does not prove
A static capture is the repo's own converter, not a live tools/list.
The app file docs/evidence/mcp-drift/README.md says a server
listed with capture static is listed and skipped, never fetched.
A hint is a declaration by the server, not measured behaviour. The same sentence is on the annotation-flips page.
A change proves the declaration changed. It does not prove that a caller broke.
Fetch specs for the next live run are inferred until the first live run checks them.
The app file docs/proposals/mcp-drift-schedule.yml says every
fetch spec is inferred until checked once by hand.