Internet-Draft Local Tool Call Proof October 2026
Lee, et al. Expires 10 April 2027 [Page]
Workgroup:
Network Working Group
Internet-Draft:
draft-lee-wimse-local-tool-call-proof-00
Published:
Intended Status:
Standards Track
Expires:
Authors:
J. Lee
SSenStone Inc.
C. Yoo
SSenStone Inc.
M. Kim
SSenStone Inc.
W. Seo
SSenStone Inc.

Per-Call Proof for Local Tool Invocation by AI Agents

Abstract

AI agents increasingly act through local tool servers that run on the same host and are reached over inter-process channels such as the stdio transport of the Model Context Protocol (MCP). These channels are outside the scope of HTTP-based authorization: the tool server cannot tell whether a given invocation passed any policy decision, and reusable credentials typically sit in the agent's process memory.

This document defines a per-call proof for local tool invocation. A Call Authority that runs outside the agent process evaluates policy, issues a short-lived, single-use proof bound to the exact tool name and arguments through a canonical action digest, and verifies that proof on behalf of the tool server. The tool server rejects invocations whose proof is missing or does not verify. The proof format is opaque to the agent and the tool server; concrete formats are defined as evidence type profiles. An MCP stdio binding is provided.

About This Document

This note is to be removed before publishing as an RFC.

Status information for this document may be found at https://datatracker.ietf.org/doc/draft-lee-wimse-local-tool-call-proof/.

Discussion of this document takes place on the Workload Identity in Multi System Environments (WIMSE) Working Group mailing list (mailto:wimse@ietf.org), which is archived at https://mailarchive.ietf.org/arch/browse/wimse/. Subscribe at https://www.ietf.org/mailman/listinfo/wimse/.

Status of This Memo

This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.

Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.

Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."

This Internet-Draft will expire on 10 April 2027.

▲

Table of Contents

1. Introduction

The AI Identity Management System [I-D.ietf-wimse-aims] composes workload identity, short-lived credentials, transport and application layer authentication, and OAuth-based delegation into a model for authenticating and authorizing AI agents. Its focus is on interactions that cross network boundaries.

A large share of agent actions, however, never cross a network boundary. An agent host commonly spawns local tool servers (filesystem access, shell execution, database and SaaS connectors) and talks to them over a local inter-process channel. In MCP [MCP], this is the stdio transport, and the authorization specification states that implementations using it "SHOULD NOT follow this specification, and instead retrieve credentials from the environment" [MCP-AUTHZ]. The MCP local server guidance describes the agent client and a stdio server as sharing one trust domain [MCP-LOCAL].

That model is adequate for a single user on a personal device. It is not adequate when:

In that setting the agent is the most exposed component, and the local tool server is the last point at which an invocation can be checked before it reaches a resource. Network enforcement points never see calls to local resources such as files and shell commands.

This document specifies:

  1. a canonical action digest that identifies exactly one tool invocation (Section 5);

  2. a Call Authority outside the agent process that issues and verifies per-call proofs (Section 6);

  3. an enforcement obligation on tool servers to reject invocations without a valid proof (Section 7);

  4. requirements for evidence type profiles (Section 9); and

  5. a binding for the MCP stdio transport (Section 10).

The mechanism does not prevent prompt injection. It confines the effects of an injected or compromised agent to actions that policy permits, removes reusable secrets from the agent process, and makes every invocation attributable.

2. Conventions and Definitions

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.

Agent:

A software component that decides, typically with the help of a language model, which tools to invoke and with which arguments. In MCP terms, the client embedded in an agent host.

Tool Server:

A local process that executes tool invocations requested by the Agent, for example an MCP server reached over stdio.

Call Authority:

A component that runs outside the Agent process, evaluates Policy, issues Call Proofs and verifies them. It holds all key material used for Call Proofs.

Policy:

A signed document loaded by the Call Authority that states which callers may invoke which tools with which argument constraints, and which actions require human approval. The policy language is out of scope.

Call Proof:

A short-lived, single-use value that commits to one Action Digest and attests that the Call Authority authorized that invocation.

Action Digest:

A canonical hash of an invocation's method, tool name and arguments (Section 5).

Evidence Type:

An identifier naming the format and semantics of a Call Proof, defined by an evidence type profile (Section 9).

3. Threat Model and Deployment Assumptions

3.1. In Scope

T1. Injected instructions. Content processed by the Agent causes it to request a tool invocation outside its intended role, for example reading a credential file and sending its contents through another tool.

T2. Theft of reusable secrets. Code execution inside the Agent process (for example through a compromised dependency) is used to extract credentials that remain usable after the compromise ends.

T3. Policy bypass and proof reuse. An invocation is sent without passing a policy check, or a proof obtained for one invocation is presented for another.

T4. Policy tampering. The policy is modified so that a denied action becomes allowed.

3.2. Out of Scope

  • A malicious or compromised Tool Server. A Tool Server that ignores verification cannot be constrained by this mechanism.

  • Credentials that the Tool Server itself uses to reach remote resources. Those are covered by network-level controls and the mechanisms in [I-D.ietf-wimse-aims].

  • Compromise of the Call Authority or of the policy signing key.

  • Prevention of prompt injection itself, and actions that the policy permits.

3.3. Isolation Assumption

Protection against T2 requires that the Agent run in a separate isolation boundary (a different operating system user, container or virtual machine) from the Tool Server and the Call Authority. If they share one boundary, code execution in the Agent can read the Tool Server's environment or start a Tool Server without verification. In that configuration this mechanism still addresses T1, T3 and T4, where the Agent's code is intact but its decisions are not.

4. Architecture Overview

 +---------+  (1) issue(method,name,args)   +----------------+
 |  Agent  | -----------------------------> | Call Authority |
 | (no     | <----------------------------- | policy, keys,  |
 | secrets)|  (2) Call Proof                | replay cache,  |
 +---------+                                | audit log      |
      |                                     +----------------+
      | (3) invocation + Call Proof                 ^   |
      v                                             |   |
 +-------------+  (4) verify(action_digest, proof)  |   |
 | Tool Server | -----------------------------------+   |
 | + enforce-  | <---------------------------------------+
 |   ment hook |  (5) valid / invalid(reason)
 +-------------+
      | (6) execute only if valid
      v
 local resources (files, shell, local services)
Figure 1: Per-call proof flow
  1. The Agent asks the Call Authority to issue a proof for an intended invocation.

  2. The Call Authority identifies the calling process from the platform, evaluates Policy and, if allowed, returns a Call Proof. The proof never passes through the Call Authority again on the way to the Tool Server.

  3. The Agent sends the invocation to the Tool Server with the Call Proof attached.

  4. The Tool Server computes the Action Digest from the invocation as received and asks the Call Authority to verify the proof against it.

  5. The Call Authority checks binding, freshness and single use, records the decision, and answers.

  6. The Tool Server executes the invocation only if the answer is valid.

Verification is delegated to the Call Authority so that the Tool Server needs no key material and no knowledge of evidence formats. This allows symmetric and asymmetric evidence types to coexist and keeps replay tracking and audit in one place.

5. Action Digest

The Action Digest identifies exactly one invocation. It is computed as:

action_digest = BASE64URL( SHA-256( JCS( {
  "method":    <invocation method>,
  "name":      <tool name>,
  "arguments": <arguments object, or {} if absent>
} ) ) )

where:

The arguments MUST be taken exactly as transmitted, as a JSON [RFC8259] value. Implementations MUST NOT normalize argument values (for example by resolving file system paths) before computing the digest. Semantic normalization belongs to policy evaluation, not to the digest.

The same construction is used by proposals in the MCP community for argument commitments ([MCP-SEP-2787], [MCP-SEP-2672]); aligning on one definition allows evidence produced under those proposals to serve as Evidence Types under this document.

6. Call Authority

6.1. General Requirements

The Call Authority MUST NOT run inside the Agent process. The Agent MUST NOT have access to any key material used to create or verify Call Proofs. Where available, keys SHOULD be generated and used inside a hardware root of trust (for example a TPM) so that they are never exported.

The Call Authority exposes a local interface using JSON-RPC 2.0 messages over a local endpoint such as a Unix domain socket or a named pipe. The endpoint MUST NOT be reachable from outside the host.

6.2. Issue

An issue request carries the intended invocation:

{ "jsonrpc": "2.0", "id": 1, "method": "callProof/issue",
  "params": { "method": "tools/call", "name": "read_file",
              "arguments": { "path": "repo/src/main.ts" },
              "server": "filesystem" } }

The Call Authority:

  1. MUST establish the identity of the calling process from the platform, for example from the peer credentials of the local socket or from a workload identity issued to that process such as a SPIFFE ID [SPIFFE]. It MUST NOT rely on an identity asserted in the request body.

  2. MUST evaluate Policy for that identity, target server, tool and arguments.

  3. MUST return an error and MUST NOT issue a proof if Policy denies the invocation.

  4. MAY return an approval-required result when Policy requires human approval (Section 8).

  5. Otherwise returns { "type": "<evidence type>", "value": "<proof>", "expiresAt": "<RFC 3339 timestamp>" } [RFC3339].

6.3. Verify

A verify request carries the Action Digest computed by the Tool Server and the evidence received:

{ "jsonrpc": "2.0", "id": 2, "method": "callProof/verify",
  "params": { "actionDigest": "<base64url>", "server": "filesystem",
              "evidence": { "type": "<evidence type>",
                            "value": "<proof>" } } }

The Call Authority returns { "valid": true } or { "valid": false, "reason": "<reason>" }, where reason is one of invalid, expired, replayed, mismatch or unknownType. The Call Authority MUST:

  • treat the Action Digest supplied by the Tool Server as authoritative;

  • return mismatch if the proof does not commit to that Action Digest;

  • return expired if the proof is outside its validity window;

  • accept a given proof at most once and return replayed for later attempts; and

  • record each issue and verify decision, including caller identity, server, tool, Action Digest, result, approver if any, and time.

6.4. Policy Integrity

Policy SHOULD be signed. The verification key for Policy SHOULD be fixed when the Call Authority is installed and SHOULD NOT be delivered together with the Policy. The Call Authority SHOULD reject a Policy whose version is lower than the currently loaded one, and MUST deny all issuance when no valid Policy is loaded.

7. Tool Server Enforcement

A Tool Server that requires Call Proofs MUST, for each covered invocation and before any side effect:

  1. compute the Action Digest from the invocation as received;

  2. reject the invocation if no Call Proof is present;

  3. otherwise call verify and reject the invocation unless the result is valid; and

  4. reject the invocation if the Call Authority cannot be reached (fail closed).

A Tool Server MAY operate in an audit mode in which it verifies proofs that are present and executes invocations without a proof, to support staged deployment. Audit mode does not provide the protections described in Section 3.

For tools that operate on file system paths, Tool Servers SHOULD resolve and re-check paths at execution time where tool semantics allow, to reduce time-of-check to time-of-use risk.

8. Approval-Bound Actions

Policy MAY mark actions as requiring human approval. For such actions, the Call Authority MUST NOT issue a Call Proof until an approver designated by Policy has approved the specific Action Digest. Evidence type profiles define the approval channel. Profiles SHOULD present a human-readable summary of the action to the approver and SHOULD bind the approval to the Action Digest. Approval channels that do not require the Call Authority to accept inbound network connections are RECOMMENDED.

9. Evidence Type Profiles

An evidence type profile MUST specify:

Profiles SHOULD keep proof values compact. Local channels such as stdio carry one message per line, and per-call evidence such as certificate chains adds overhead to every invocation.

Anticipated profiles include (informative):

10. Binding for the MCP stdio Transport

10.1. Capability Advertisement

An MCP server that supports this mechanism advertises the extension io.modelcontextprotocol/call-proof in its capabilities:

{ "capabilities": { "tools": {},
    "extensions": { "io.modelcontextprotocol/call-proof": {
        "required": true,
        "methods": ["tools/call"],
        "authority": "unix:///run/mcp-call-authority.sock" } } } }

required set to true selects enforcement as described in Section 7; false selects audit mode. methods lists covered request methods; tools/call MUST be included. authority optionally names the Call Authority endpoint.

The extension identifier is shown with the MCP official prefix for illustration. Until the extension is accepted by the MCP project, implementations SHOULD use an identifier under their own vendor prefix.

10.2. Carrying the Proof

The Call Proof is carried in the request _meta object:

{ "jsonrpc": "2.0", "id": 7, "method": "tools/call",
  "params": { "name": "read_file",
              "arguments": { "path": "repo/src/main.ts" },
              "_meta": { "io.modelcontextprotocol/callProof": {
                  "type": "com.example/token",
                  "value": "<opaque>" } } } }

For MCP, the Action Digest method is the JSON-RPC method, the name is params.name, and the arguments are params.arguments.

10.3. Rejection

A rejected invocation returns a JSON-RPC error whose data.reason is missing, authorityUnavailable, or a reason returned by the Call Authority:

{ "jsonrpc": "2.0", "id": 7,
  "error": { "code": -32021, "message": "Call proof rejected",
             "data": { "reason": "missing" } } }

The numeric error code is a placeholder pending coordination with the MCP project. Verification MAY be implemented as a server-side validator in the MCP interceptor model [MCP-SEP-1763].

11. Relationship to Other Work

AIMS [I-D.ietf-wimse-aims] addresses agent identity, credential provisioning, authentication and delegation across network boundaries. This document addresses the local invocation boundary that AIMS does not cover, and reuses workload identity for caller identification at the Call Authority.

DPoP [RFC9449] and HTTP Message Signatures [RFC9421] bind proofs to HTTP requests. Local inter-process channels have no HTTP request to bind to, and DPoP does not cover the request content. The Action Digest plays the role of the bound request representation.

Proposals in the MCP community define argument-bound attestation for audit [MCP-SEP-2787] and per-call human approval [MCP-SEP-2672]. This document adds the enforcement obligation on the tool server and the requirement that issuing keys reside outside the agent process, and treats those formats as candidate evidence types.

12. Security Considerations

The unit of protection is a single tool invocation. Agents decompose a user request into separate invocations, and each one is authorized and verified independently, so a request that combines permitted and forbidden steps is stopped at the forbidden step. Most tool servers expose one operation per tool (for example, separate tools to read, write or send), which lets Policy decide by tool name and arguments. General-purpose tools, such as shell execution, arbitrary database queries or code execution, and workflow tools that perform several effects in one invocation, cannot be separated this way. Policy for such tools needs to evaluate their arguments, and deployments should treat them as high risk, subject them to approval (Section 8), or not grant them to roles that do not need them.

When a later invocation in a sequence is denied, earlier invocations have already run. Data they returned remains available to the Agent, although the denied invocation cannot carry it further. This document does not provide authorization of a multi-step plan as a whole.

The protections of this mechanism depend on the isolation assumption in Section 3.3. Deployments that cannot separate the Agent from the Tool Server and Call Authority obtain protection against injected instructions and proof reuse, but not against extraction of Tool Server credentials by code running in the Agent process.

The Call Authority is a high-value component. Its compromise is equivalent to Policy compromise. Hardware-protected keys, signed Policy with rollback protection, and fail-closed behavior limit the impact of partial failures but not of full compromise.

JCS removes representation differences (member order, whitespace, number and string encoding) but not semantic equivalence. Two semantically equal argument sets can produce different digests; Policy must be written against arguments as transmitted or must evaluate semantic forms explicitly.

Short validity windows and single-use enforcement limit replay. Clock skew between the Call Authority's issue and verify operations is not a concern because both run in the same component.

Fail-closed behavior makes the Call Authority a dependency for every covered invocation. Its availability should be monitored like any other enforcement component.

Approval channels can be targeted by social engineering. Summaries shown to approvers should be generated by the Call Authority from the invocation, not supplied by the Agent.

13. Privacy Considerations

The Call Authority records caller identity, tool names, Action Digests and approver identities. The audit log can reveal user activity and should be protected and retained according to applicable policy. Action Digests do not reveal argument values directly, but low-entropy arguments can be recovered by guessing; logs should be protected accordingly.

14. IANA Considerations

This document has no IANA actions. Evidence Types use namespaced identifiers under domains controlled by profile authors.

15. References

15.1. Normative References

[RFC2119]
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/rfc/rfc2119>.
[RFC3339]
Klyne, G. and C. Newman, "Date and Time on the Internet: Timestamps", RFC 3339, DOI 10.17487/RFC3339, , <https://www.rfc-editor.org/rfc/rfc3339>.
[RFC4648]
Josefsson, S., "The Base16, Base32, and Base64 Data Encodings", RFC 4648, DOI 10.17487/RFC4648, , <https://www.rfc-editor.org/rfc/rfc4648>.
[RFC6234]
Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)", RFC 6234, DOI 10.17487/RFC6234, , <https://www.rfc-editor.org/rfc/rfc6234>.
[RFC8174]
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/rfc/rfc8174>.
[RFC8259]
Bray, T., Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", STD 90, RFC 8259, DOI 10.17487/RFC8259, , <https://www.rfc-editor.org/rfc/rfc8259>.
[RFC8785]
Rundgren, A., Jordan, B., and S. Erdtman, "JSON Canonicalization Scheme (JCS)", RFC 8785, DOI 10.17487/RFC8785, , <https://www.rfc-editor.org/rfc/rfc8785>.

15.2. Informative References

[I-D.ietf-wimse-aims]
Kasselman, P., Lombardo, J., Rosomakho, Y., Campbell, B., Steele, N., and A. Parecki, "AI Identity Management System", Work in Progress, Internet-Draft, draft-ietf-wimse-aims-00, , <https://datatracker.ietf.org/doc/html/draft-ietf-wimse-aims-00>.
[MCP]
Model Context Protocol, "Model Context Protocol Specification, version 2026-07-28", , <https://modelcontextprotocol.io/specification/2026-07-28>.
[MCP-AUTHZ]
Model Context Protocol, "Model Context Protocol: Authorization", , <https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization>.
[MCP-LOCAL]
Model Context Protocol, "Model Context Protocol: Local Server Security", n.d., <https://modelcontextprotocol.io/docs/draft/tutorials/security/local-server-security>.
[MCP-SEP-1763]
Model Context Protocol contributors, "SEP-1763: Interceptors for Model Context Protocol", n.d., <https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1763>.
[MCP-SEP-2672]
Model Context Protocol contributors, "SEP-2672: Per-Call Passkey Verified Approval for MCP Tool Calls", n.d., <https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2672>.
[MCP-SEP-2787]
Model Context Protocol contributors, "SEP-2787: Tool Call Attestation", n.d., <https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2787>.
[RFC4226]
M'Raihi, D., Bellare, M., Hoornaert, F., Naccache, D., and O. Ranen, "HOTP: An HMAC-Based One-Time Password Algorithm", RFC 4226, DOI 10.17487/RFC4226, , <https://www.rfc-editor.org/rfc/rfc4226>.
[RFC6238]
M'Raihi, D., Machani, S., Pei, M., and J. Rydell, "TOTP: Time-Based One-Time Password Algorithm", RFC 6238, DOI 10.17487/RFC6238, , <https://www.rfc-editor.org/rfc/rfc6238>.
[RFC7942]
Sheffer, Y. and A. Farrel, "Improving Awareness of Running Code: The Implementation Status Section", BCP 205, RFC 7942, DOI 10.17487/RFC7942, , <https://www.rfc-editor.org/rfc/rfc7942>.
[RFC9421]
Backman, A., Ed., Richer, J., Ed., and M. Sporny, "HTTP Message Signatures", RFC 9421, DOI 10.17487/RFC9421, , <https://www.rfc-editor.org/rfc/rfc9421>.
[RFC9449]
Fett, D., Campbell, B., Bradley, J., Lodderstedt, T., Jones, M., and D. Waite, "OAuth 2.0 Demonstrating Proof of Possession (DPoP)", RFC 9449, DOI 10.17487/RFC9449, , <https://www.rfc-editor.org/rfc/rfc9449>.
[SPIFFE]
Cloud Native Computing Foundation, "Secure Production Identity Framework for Everyone (SPIFFE)", n.d., <https://spiffe.io/docs/latest/spiffe-about/overview/>.

Appendix A. Example Flow

A code-review agent is permitted by Policy to read files under repo/ and to post review comments. Content in a pull request instructs it to read ~/.aws/credentials.

  1. The Agent requests issue for read_file with path ~/.aws/credentials.

  2. The Call Authority identifies the caller as the code-review agent, evaluates Policy, denies, and records the attempt.

  3. If the Agent sends the invocation anyway, the Tool Server finds no Call Proof and rejects it.

  4. If the Agent replays a proof issued earlier for repo/README.md, the Tool Server computes a different Action Digest and the Call Authority returns mismatch.

Appendix B. Implementation Status

This section records the status of known implementations per [RFC7942] and is to be removed before publication.

A reference implementation consisting of a Call Authority daemon, MCP server-side enforcement, client-side issuance and two evidence type profiles is in development. Repository location: TBD.

Appendix C. Open Issues

Acknowledgments

TBD.

Authors' Addresses

Jaebin Lee
SSenStone Inc.
Korea, Republic of
Chang-Hun Yoo
SSenStone Inc.
Korea, Republic of
MinGyu Kim
SSenStone Inc.
Korea, Republic of
WooYong Seo
SSenStone Inc.
Korea, Republic of