Build1 publisher3 min readPublished
MCP keeps every tool-call logging instruction outside the protocol documents
The 2025-11-25 revision makes hosts obtain explicit consent before invoking any tool, and it calls tools arbitrary code execution. What a record of that call should contain appears nowhere in the protocol documents.
The Engineer · Build desk

What happened
- The 2025-11-25 revision of the Model Context Protocol requires hosts to obtain explicit user consent before invoking any tool, and its tools section asks clients to show tool inputs before sending them.
- No logging requirement for tool calls appears in the protocol documents themselves; logging turns up three times in the security best practices document that sits beside the authorisation spec.
- The tool schema says all ToolAnnotations properties are hints, not guaranteed to describe behaviour faithfully, and that clients should never base tool use decisions on annotations from untrusted servers.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- exposure When the consent decision lives in the host's transcript store, the party that would be audited holds the only copy, and whoever administers that store can edit it.
- constraint Because annotations must be treated as untrusted unless the server is trusted, deciding which calls need a human in the loop reduces to deciding which servers you trust.
- decision Any team that has to prove what an agent did now has to specify its own tool-call record, including who writes it and how an outsider verifies it.
A consent dialog proves that a person was shown a tool name and an argument block and clicked approve. According to the dev.to post, that is where its value as evidence stops: it does not establish what the server did with those arguments, or whether the result it returned reflected what actually changed [5]. Most hosts keep the consent decision in the same transcript store as everything else the model said. That store is written by the runtime under review and editable by whoever administers it [6].
The strongest language in the corpus about audit trails is in the section on token passthrough, the anti-pattern where an MCP server forwards a client's upstream token to a downstream API without checking the token was issued to the server [9]. Under a heading the document calls "Accountability and Audit Trail Issues", it says the server cannot tell which client is calling, and that "the downstream Resource Server's logs may show requests that appear to come from a different source with a different identity, rather than the MCP server that is actually forwarding the tokens" [10]. The spec's own words for the result are that "incident investigation, controls, and auditing" become more difficult [11].
The three logging mentions differ in what they ask of an implementer. One describes that failure mode [10]. A second instructs servers to log elevation events, the scope requested against the subset granted, with correlation IDs [13]. The third tells proxy services that spawn local servers over stdio to "log all stdio transport usage for security monitoring", a should, and only for proxy architectures [14]. A non-proxy server therefore takes one logging instruction out of the corpus, and what it records is a scope grant [20].
Annotations are the part I would expect teams to build on, because they look like the metadata a logging policy needs. Four are behavioural: readOnlyHint, destructiveHint, idempotentHint and openWorldHint [16]. The schema note says: "All properties in ToolAnnotations are hints. They are not guaranteed to provide a faithful description of tool behavior (including descriptive properties like title). Clients should never make tool use decisions based on ToolAnnotations received from untrusted servers" [17]. The tools section restates it as a requirement, that clients must treat annotations as untrusted unless they come from trusted servers [18].
Route your logging detail on destructiveHint and you are routing on the server's description of itself. A server that declares a write tool readOnlyHint lands on the light path, and the line you keep says a read-only tool was invoked with no confirmation required [22]. The post's point about that line is that it does not record what the tool did [19].
Whether any of this reaches a given deployment depends on where the trust boundary sits. If the agent, the host and every tool server are yours, the transcript store is your own record and the annotations are your own claims about your own code. The gap opens when the tool server belongs to someone else, or when the log has to satisfy a reader who does not trust the runtime that wrote it. The spec requires consent before every invocation and leaves the contents of the record, the writer of it, and the method of checking it to the implementer [15][21].
What to watch
- Whether a later revision moves a tool-call logging requirement into the protocol documents as a must, instead of a should in the best practices file.
- Whether hosts begin writing tool-call records outside the transcript store they administer, so the record survives the runtime being questioned.
- Whether the annotations note is replaced by signed or otherwise verifiable behavioural metadata that a client could safely route logging on.