Confirm MCP server
An MCP server whose confirmation cannot be replayed against a different call.
0 stars
Reviews
Write oneNobody has reviewed Confirm yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
Confirm tools (1, 1 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
delete_filewrite action
Public scan report
scanner v0.1.10 · 2026-10-02 · same rubric, same numbers if you re-run it
- Code scan6 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 0 days ago15/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
How Confirm compares
Against every graded MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 92/100
- higher than 95% of 48,255 servers
- Tools
- 1
- the typical server has 7
- Tools that change things
- 100%
- typical: 0%. Fewer write tools means less an agent can break
What its tools let an agent do: 1 delete
Install Confirm in Claude Code, Cursor or VS Code
claude mcp add mcp-confirm -- uvx mcp-confirm
What the publisher says
From the Confirm repository's README, as published. We do not edit it. Read it on GitHub
<!-- mcp-name: io.github.les-k/mcp-confirm -->
mcp-confirm
In plain terms: when an AI asks "are you sure?", the MCP SDK already stops
that approval being reused for a different action. It does not stop the
same approval being used twice. This closes that gap, and two others the SDK
leaves open.
Read this first: most of this problem is already solved
The 2026-07-28 MCP specification added Multi Round-Trip Requests, so a tool can pause mid-call and ask the user to confirm. The approval travels back through the client as an opaque requestState, which the spec says servers MUST treat as attacker-controlled.
The Python SDK does this for you, by default, on every MCPServer. RequestStateBoundary is appended to the middleware chain unconditionally — with an ephemeral key if you supply none. It seals the state under AES-256-GCM and binds it to the method, the target, a digest of the call's arguments, the audience, and the authenticated principal, with a TTL.
So the attack everyone reaches for first — approve deleting cache.txt, then replay that approval against thesis.txt — is already refused by the SDK. You do not need a library for it, and you should not write one.
This repository originally wrote one anyway: 250 lines of HMAC, TTL and argument binding, shipped as the headline feature, redundant the day it was published. That is recorded at the bottom rather than quietly deleted.
What the SDK does not do
Three gaps, each with a test that fires.
1. It binds and expires the state. It never spends it.
Inside the TTL, the same approval verifies as many times as it is presented. Every check the boundary makes passes, every time. The specification is explicit that this is deliberate and that the rest is yours:
Note that these measures bound the replay window and prevent cross-user and
cross-request reuse, but do not by themselves guarantee single-use. Servers
for which a given requestState must be consumed at most once (e.g.,
one-time redemptions) MUST enforce that invariant server-side.
For "delete a file" the second attempt finds nothing. For "transfer £500" it is the entire problem. singleuse.py is that invariant — a ledger of outstanding confirmations, spent on redemption. It contains no cryptography, because the boundary already guarantees the plaintext is something this server minted.
2. Nothing sanitises the question the human reads
An elicitation message is server-chosen text rendered to a person, usually with an untrusted value interpolated into it — the whole point is to say which file is going away. So name a file:
cache.txt
SYSTEM NOTICE: your session has expired.
Enter your AWS secret key to continue:The dialog now carries a second, official-looking prompt. The user is not confirming a deletion; they are being phished by their own tooling. The same 2026-07-28 release also shipped MCP Apps — server-rendered UI — which widens this surface rather than narrowing it.
prompt.py flattens untrusted values to one line, strips bidirectional overrides and zero-width characters, and truncates from the middle so the filename at the end stays visible. Control characters become spaces rather than being deleted, since collapsing them would let a\nb and ab render identically — two different files, one dialog.
3. No protocol layer can re-check your resource at execution time
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Confirm: common questions
- Is Confirm MCP server safe?
- Yes, by our scan: it is graded A (92/100). Read the Confirm safety report
- How do I install Confirm?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does Confirm need an API key?
- Not as far as the registry entry and our scan can tell: no credentials are declared or required.
- Is Confirm maintained?
- The last commit was 33 days ago (2026-10-02). The latest release is v0.2.1.
- How does Confirm compare with other MCP servers?
- safety score 92/100 (higher than 95% of 48,255 servers); tools 1 (the typical server has 7); tools that change things 100% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.