Skip to content

[C10.4] 10.4.8 moved from L2 to L3 when it was merged with the schema-signing requirement #1201

Closed

Description

@paolocostanzo

History

  • After the C10 levels review (Levels review C10 #929, 15 June), the snapshot control was 10.4.5 at L2: "MCP clients maintain a hash or versioned snapshot of tool definitions and that any change to a tool definition (via notifications/tools/list_changed or between sessions) triggers re-approval…". Schema signing was a separate requirement, 10.4.8 at L3, which Levels review C10 #929 described as research-grade.
  • In Update 0x10-C10-MCP-Security.md #946 (18 June) the two were consolidated. The snapshot text was kept, the signing requirement was dropped, and the result carried L3. The scope "via list_changed or between sessions" was removed as well.

I couldn't find a discussion of the level change, so I'm asking whether L3 was intended. If the requirement no longer asks for signatures, the reason #929 gave for L3 no longer applies, and the control has the same shape as 10.4.10 (bind consent to the approved endpoint, re-approve on change), which is L2.

Why it matters
In October 2026 I measured eight AI coding clients after an approved MCP tool's description changed mid-session. None asked for approval again. With notifications/tools/list_changed, four fetched the new definition, three of them without telling the user; after a restart, all but one used it without asking. That restart result is also why the removed "between sessions" wording matters: it is where the changes were accepted silently.
Method and data: https://paolocostanzo.github.io/approved-mcp-tools-can-change-after-you-say-yes/

Proposal

  1. Restore L2 for 10.4.8.
  2. Restore the scope removed in Update 0x10-C10-MCP-Security.md #946: changes detected via notifications/tools/list_changed and between sessions, i.e. on every tools/list, including after a reconnection.
  3. Optionally, state what counts as the tool definition (name, description, input schema, annotations).

Happy to add the measurement to the C10 research page if that helps.

Activity

  1. jmanico commented on Oct 24, 2026

    @jmanico
    Member

    Good catch. I support moving 10.4.8 back to L2 and making the reconnect/restart case explicit. 🙏

    The history supports your concern: #929 put snapshot/change detection at L2 and schema signing at L3. #946 removed signing but kept the surviving control at L3. I don't see a documented reason for that level change, so I wouldn't assume it was intentional or accidental.

    Saving an approved definition, comparing it when fetched again, and blocking a changed tool until re-approval is practical L2 work. Trail of Bits' mcp-context-protector already implements this on connection and tool-list change notifications. We also put endpoint-change re-approval at L2 in 10.4.10. This fits that same principle: approval needs to stay tied to what was approved.

    I'd suggest this for 10.4.8, L2, targeting 1.02-dev:

    Verify that MCP clients retain the approved snapshot of each tool definition across sessions, compare subsequently retrieved definitions against that snapshot, and require re-approval before invoking a tool whose definition has changed, including after reconnection or restart.

    Restarting the client should not give a changed tool a free pass. 😎 This wording keeps the implementation open while making that expectation testable.

    For verification, change only the description while keeping the tool name the same. Confirm the call is blocked until re-approval, then repeat across a restart. We should also cover schema and annotation changes; if we spell out the definition fields, let's include the output schema too.

    One limit worth keeping clear: this detects changed definitions. It cannot detect a server changing its implementation behind an identical definition.

    I think this is a meaningful, focused correction for 1.02. Thanks for digging into both the history and actual client behavior.

  2. added
    1.02Active release: work targets 1.02-dev; proposals require review before inclusion.
    on Oct 24, 2026
  3. ottosulin commented on Oct 24, 2026

    @ottosulin
    Collaborator

    My opinion: L2, restore the scope. And this was an editing mistake, not a level decision.

    About PR #946 - the diff shows a swap. Before it: 10.4.5 snapshot at L2 (text including notifications/tools/list_changed and "between sessions"), 10.4.8 schema signing at L3. #946 deleted both signing requirements, and the two levels moved in opposite directions: the snapshot inherited L3 from the row it was merged into, and tool-response signing dropped from L3 to L2 (10.4.6 today).

    About leveling

    • 10.4.10 (L2) already requires re-approval when the approved endpoint changes. Same principle.
    • 10.4.6 (L2) requires servers to sign tool responses with a nonce and timestamp and clients to detect replay. That needs key material, a freshness window and client-side verification, which is more work than storing a hash and prompting.

    The strongest case for L3 is the state of implementations today: none of the eight measured clients does it, and the protocol does not require it. Prevalence is not difficulty. Hashing a definition, comparing it and prompting is a small change for anyone creating an MCP client.

    Few proposals to the suggested text:

    • Cover also tools with no approved definition, not only changed ones. Approvals are keyed by tool name, so a server that renames a tool presents an unknown tool, and several clients auto-approve by default. "Changed" leaves that case outside the requirement.
    • Do not require comparison "on every tools/list". In the 2026-07-28 revision ttlMs is a freshness hint, so a client may legitimately serve a cached list, and 10.4.16/10.4.17 already govern caching. Require comparison of the definition the client is about to use, which a cache cannot dodge.

    Suggested revised text for 10.4.8:

    Verify that MCP clients retain, per server, the tool definition the user approved, and do not invoke a tool whose current definition differs from it, or for which no approved definition is retained, until the user approves that definition, including after a tool list change, a reconnection, or a restart.

    Suggested glossary entry to support this and avoid lengthy requirement text:

    Tool Definition – The MCP tool object returned by tools/list, comprising its name, description, input schema, output schema, and annotations. It is what the model reads when deciding whether and how to call a tool. Definitions are compared in canonical form, and changes outside this set, such as _meta, are not definition changes.

    Ideally include this correction in release notes if we remember, pointing this was an error and as part of correcting the error the requirement was revised as well for clarity.

  4. jmanico commented on Oct 24, 2026

    @jmanico
    Member

    I defer to you @ottosulin and I think we are ready to go here. Care to give us a PR? Want me to take it on?

  5. paolocostanzo commented on Oct 25, 2026

    @paolocostanzo
    ContributorAuthor

    Thanks @jmanico @ottosulin. Otto's revision works for me, including tools with no approved definition and checking the definition at the point of use. I had the change ready in advance (I was away from home yesterday and wanted it prepared in case the issue was accepted), so I've opened #1204, not to get ahead of anyone, just to save you duplicate work. It has Otto's text at L2, the Tool Definition glossary entry and the aligned Appendix B row. Happy to adjust anything in review; I hope it helps. I'm finishing further research with tests in this same area and will keep you posted.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    1.02Active release: work targets 1.02-dev; proposals require review before inclusion.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions