Build1 distinct publisher3 min readUpdated
A dev.to tutorial wraps MCP handlers so every tool call returns an Ed25519-signed receipt. The signature covers the wire. It does not cover the process doing the signing.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The signature is created inside the handler process, and that is both the value and the boundary. Everything downstream of it becomes checkable. A proxy that rewrites a response, or a transport that turns `weight_kg: 70` into `700` [5], breaks the binding between request and result, and a single verified receipt is enough to show it [15]. Set against a result that arrives as plain text over stdio with no signature, no binding to the original request and no record of what was evaluated [6], that is a real change in what you can prove afterwards.
The third item on the author's own threat list behaves differently. A server binary swapped between sessions, with a changed tool description [5], runs the same startup path the tutorial prescribes: mint an Ed25519 keypair, build a verifier around it, wrap the handler [7]. The substitute generates its own key and signs entirely valid receipts for whatever it chooses to return [10]. Catching it requires a verifier holding a public key pinned before the swap, which is a custody and distribution job the wrapper does not perform. The author is straight about this: in production you already have a keypair, and then the integration is closer to five lines rather than twenty [8].
Which means the two line counts describe the same wrapper. The fifteen-line gap between them is key generation [9], and in production those fifteen lines are not deleted so much as replaced by whatever holds your signing key. That is the part with an operational bill attached, and it is not measured in lines.
Delayed triggers are the same problem moved from space into time. A trigger that fires sixty seconds after a specific input pattern [5] produces a receipt at each call, signed by the code that is misbehaving. Detecting it means keeping receipts and comparing them across calls [15], which is storage, a retention policy and someone who reads the output. The decorator is the cheap end of that.
What the receipt actually contains is where the supplied text runs out: the excerpt stops mid-sentence exactly as it begins describing what `withReceipt` does at call time [12]. So the schema drift claim in the headline pitch [1] cannot be checked from this material. It stands or falls on whether the signed payload includes a hash of the tool description and argument schema, and that is precisely the section we do not have.
The governance is worth reading before the code. The format is the Correctover Conformance Shape, described as an IETF Internet-Draft covering a receipt schema and binding specification [2], and the reference implementation is source-available under Elastic License 2.0 [3]. The tutorial is published under the dev.to account `correctover` [13]. One party wrote the draft, the library and the walkthrough, and nothing in the material shows a second implementation or an independent verifier. A receipt is only useful if the party who doubts you can check it, so the interesting question is not the twenty lines. It is who else can hold the other end.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
The supplied text of the tutorial ends mid-sentence at the point where it starts describing what withReceipt does when the agent calls the tool, so the contents of the receipt payload are not shown in the material.
A dev.to tutorial describes attaching a cryptographically signed receipt to every MCP tool call, stating it catches argument tampering, response mutation, schema drift and delayed-trigger attacks, and adds about 20 lines of code to an existing server.
The reference implementation of CCS is source-available under the Elastic License 2.0.
With a plain MCP server, the author writes, you have zero verifiable evidence that what your handler returned is what the agent actually received, or that the arguments the agent passed are what your handler expected.
The tutorial lists four failure modes a plain server cannot detect: a malicious MCP proxy between agent and server mutating the response; a man-in-the-middle on the transport turning weight_kg 70 into 700; the server binary being swapped between sessions so the tool description changes; and a delayed trigger firing 60 seconds after a specific input pattern.
In the unmodified example the result comes back as plain text over stdio, with no signature, no binding to the original request, and no record of what was evaluated.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One vendor-authored tutorial, code shown, nothing corroborated
The mechanism is demonstrated rather than merely asserted: two complete TypeScript samples, the package's exported API, and a full example receipt payload are visible, which grounds the how-to claims. But everything rests on a single self-published post by the party that named the specification, the IETF Internet-Draft assertion carries no draft identifier or independent confirmation, no test, audit or third-party review is cited, and the supplied text is truncated mid-sentence.
Package published, no usage evidence at all
The only adoption fact in the supplied material is that ccs-mcp-server is installable from npm and its reference implementation is source-available under Elastic License 2.0. There are no downloads, dependents, deployments, named users, benchmarks or client-side verifier implementations anywhere in the cluster, and the sole source is the vendor's own tutorial.
Overstated: the signature covers the wire, not the signer
The headline promise — about 20 lines catches argument tampering, response mutation, schema drift and delayed triggers — outruns what the shown design delivers. Roughly fifteen of the twenty lines are key-generation boilerplate by the author's own figures, and because that key is minted at startup inside the attested process, a swapped binary produces internally valid receipts, so the schema-drift and binary-swap claims depend on a pinned external public key the tutorial never establishes. Claiming IETF Internet-Draft standing without an identifier inflates the perceived maturity further. The gap is one of framing, not fabrication: the in-transit tampering claims are consistent with the request, response and params hashes actually shown.
Author promotes his own spec, package and licence
The post is published under the dev.to account correctover and advocates the Correctover Conformance Shape, the ccs-mcp-server npm package and a reference implementation licensed under Elastic License 2.0 — the author is the vendor, the standard-setter and the beneficiary of adoption. The unverified IETF Internet-Draft framing and the omission of the key-custody weakness both align with that commercial interest. No disclosure of the relationship appears in the supplied text.
Mechanism legible, external validity unknown
Confidence in the technical reading is fairly high because the code and receipt schema are printed in full, so the trust-boundary and line-count conclusions can be drawn directly from the artifact. Confidence in everything beyond the artifact is low: one publisher, one self-interested author, no independent corroboration, no adoption data, an unverifiable standards claim, and a body that cuts off mid-sentence.
build
Thirty MCP tools become three: the reliability bug is in your schema, not the model1 distinct publisher
build
Microsoft ships an MIT-licensed agent kernel: policy rings, Ed25519 identity, kill switch1 distinct publisher
build
The refund that fired three times: tool calls are a systems problem, not a prompt problem1 distinct publisher
build
The only gate that ran was a hand-typed enum, and it had never heard of the new value1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 24, 2026