SEP: Align text with WG decisions on out-of-process execution and config - #43
SEP: Align text with WG decisions on out-of-process execution and config#43olaservo wants to merge 6 commits into
Conversation
Text-only changes to docs/sep.md from the 2026-07-23 and 2026-08-18 WG meetings. No wire changes. - Interceptors always run out of process as MCP servers. Replace the "first-party / in-process" wording in Key Advantage 3, the threat-model mitigation, and the sidecar YAML comments with local (stdio) and remote (Streamable HTTP) MCP servers. - Define Interceptor Server and add SHOULD NOT co-host tools, prompts, or resources. - State that per-invocation config exists for statelessness, that server defaults apply when config is omitted, and that a server MAY expose no configurable settings. - Give ChainExecutionParams.context the same principal.claims, spanId, and sessionId fields as InterceptorInvocationParams.context. - Use interceptors/list (plural) consistently in diagrams and prose. interceptor/invoke is unchanged pending a WG decision on the plural form raised on PR #2624. Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01NrQ4aQW4mRjgj5GJZbahEB
There was a problem hiding this comment.
Pull request overview
Aligns the interceptor SEP with working-group decisions on deployment, configuration, context fields, and method naming.
Changes:
- Defines local and remote out-of-process Interceptor Servers.
- Clarifies per-invocation configuration and context.
- Standardizes
interceptors/listreferences.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
…ation wording Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01NrQ4aQW4mRjgj5GJZbahEB
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (1)
docs/sep.md:1757
- This mitigation says the interceptor receives only
payloadandcontext, butInterceptorInvocationParamsalso sends per-invocationconfig(line 699), along with other invocation metadata. That makes the threat model understate what a compromised interceptor can observe, especially when configuration carries sensitive policy values. Describe the address-space isolation without limiting the visible data to those two fields.
- Interceptors run out of process and receive only what is passed in `payload` and `context`; a local stdio interceptor still inherits the environment and filesystem access of the process that launches it, so it SHOULD be isolated accordingly
…ithout 'only' Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01NrQ4aQW4mRjgj5GJZbahEB
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (2)
Previously missed (1) — in code that hasn't changed since the last review.
docs/sep.md:138
- This new unconditional out-of-process requirement contradicts the PR's claim that SDKs are unaffected: the Go SDK's primary
Extension.LocalChainpath installs interceptors on the invokingmcp.Serverand connects throughmcp.NewInMemoryTransports()in the same process (go/sdk/interceptors/extension/server.go:116-124), and its conformance documentation explicitly labels this an in-process deployment. Either update/remove that SDK path and its documentation or qualify this requirement; otherwise the SEP immediately makes the repository's reference implementation nonconformant.
An **Interceptor** is an MCP primitive that provides governance for context operations through validation or mutation logic. Like tools, prompts, and resources, interceptors are discoverable, and hosted on MCP servers. Interceptors are always invoked over an MCP transport; they do not run inside the invoking client or server process.
docs/sep.md:1710
- The two names do not both mirror the cited MCP pattern:
tools/listand other primitive methods use a plural namespace, while the retainedinterceptor/invokeis singular and explicitly remains pending a WG decision. Reword this rationale so it does not present the provisional singular form as following that convention.
- **Method Names**: `interceptors/list` and `interceptor/invoke` mirror MCP patterns (`tools/list`, etc.)
…hod-name rationale Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01NrQ4aQW4mRjgj5GJZbahEB
|
Addressed two suppressed Copilot notes in 57d6a1f:
|
…ot a requirement Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01NrQ4aQW4mRjgj5GJZbahEB
| An **Interceptor** is an MCP primitive that provides governance for context operations through validation or mutation logic. Like tools, prompts, and resources, interceptors are discoverable, and hosted on MCP servers. | ||
| An **Interceptor** is an MCP primitive that provides governance for context operations through validation or mutation logic. Like tools, prompts, and resources, interceptors are discoverable, and hosted on MCP servers. Interceptors are always invoked over an MCP transport using `interceptors/list` and `interceptor/invoke`; this SEP defines no in-process interceptor API. The expected deployment is out of process, as a stdio or Streamable HTTP MCP server. An SDK MAY connect to an Interceptor Server over an in-memory transport, for example for testing or embedding, and the wire contract is unchanged. | ||
|
|
||
| An MCP server that hosts interceptors is an **Interceptor Server**. An Interceptor Server SHOULD NOT also expose tools, prompts, or resources. It sits beside the client, server, or proxy that invokes it and is not in the request path between a client and the server whose traffic is being intercepted. |
There was a problem hiding this comment.
I agree that interceptor shouldn't sit in request path.
but regarding exposing interceptor with other resources in the same mcp server part, I think it should remain as recommendation rather than enforcement.
| - **Severity Levels** (info/warn/error): Graduated response vs. binary pass/fail enables audit logging without blocking | ||
| - **Replace vs. Patch**: Mutations replace entire payloads (vs. JSON Patch) for simplicity and atomicity | ||
| - **Method Names**: `interceptor/list` and `interceptor/invoke` mirror MCP patterns (`tools/list`, etc.) | ||
| - **Method Names**: `interceptors/list` follows the plural namespace of `tools/list` and `resources/read`. `interceptor/invoke` is singular; aligning it to `interceptors/invoke` is under WG consideration |
There was a problem hiding this comment.
I'm +1 on using same and plural prefix - interceptors/list & interceptors/invoke
Text-only changes to
docs/sep.mdfrom the 7/23 and 8/18 WG meetings. No wire changes; SDKs are unaffected.configexists for statelessness, server defaults apply when omitted, and a server MAY expose no configurable settings (8/18, Sambhav answering Clare).ChainExecutionParams.contextthe sameprincipal.claims,spanId, andsessionIdfields asInterceptorInvocationParams.context(also raised by the Tersign comment on PR #2624).interceptors/listconsistently in diagrams and prose.interceptor/invokeis left as is pending a WG decision on the plural form raised by a-akimov on PR #2624, since that one touches SDK constants.Not in this PR: deployment architecture section, diagram replacement, stripping implementation detail (Sambhav and Clare, 8/18), and anything in the chain section pending #33.
🤖 Generated with Claude Code
https://claude.ai/code/session_01NrQ4aQW4mRjgj5GJZbahEB