Skip to content

MCP Security Interoperability — tracking #267

Description

@rsharath

Tracking issue for the OpenID AIIM CG

Which columns ZeroID can claim

Role Available
OAuth AS yes
Resource AS yes
OpenID Provider no — no id_token issuance, no /.well-known/openid-configuration, no ID-JAG minting; we only redeem
MCP Client / Server / Gateway no — firehog's entry, see below

Two of the three top-level rows are the ceiling. The event's own top-level matrix already greys out OAuth token based access for both our columns.

Status

EMA — in good shape. Valid ID-JAG alone checks the EMA box, and we implement every clause of the p.9 verification table plus single-use jti replay rejection the event does not ask for. Gaps: #265 (sub_id), #258 (resource as a request parameter).

CIMD — cannot check the box today. Qualification needs ≥1 Client ID Metadata row and ≥1 client-authentication row. We pass the first and score zero on the second, because our CIMD clients are public by construction. #264 is the fix; #263 blocks testing it with anyone.

Issues

Priority
#263/oauth2/authorize has no browser GET leg P0, blocks all CIMD interop testing
#264 — confidential CIMD clients (jwks_uri/jwks + private_key_jwt) P0, decides the CIMD box
#265sub_id on ID-JAG redemption P1, small
#258 — RFC 8707 resource request parameter P1, pre-existing
#266client_credentials for CIMD clients P2, depends on #264
#206private_key_jwt client auth prerequisite for #264

Deliberately not doing

ID-JAG issuance / the OpenID Provider role. Claiming the EMA OP column means id_token issuance, refresh tokens, and OIDC discovery first. That is not a December-sized item. The test harness stubs the OP instead, which also tells us cheaply whether the real thing is worth building.

tls_client_auth / the MTLS rows. No implementation anywhere, least valuable of the three client-auth rows, already deferred in #206.

Per-client_id CIMD allow-list. The pre-registered client row is satisfied — arguably — by cimd.allowed_domains (config.go:97), a host allow-list. It is coarser than the row implies: one approved host vouches for every document on it. Worth flagging to the tester rather than building, unless a partner objects.

Test harness

highflame-regression/tests/api/mcp_interop/ — one test per matrix row, named so the pytest report transcribes into the submission form. Gaps are xfail(strict=True), so closing one turns the suite red until the marker comes off; a green run means the recorded matrix is accurate. Each issue above names the tests it flips.

Flows are MCP-native (mcp 2.0.0, protocol revision 2026-07-28) — a real MCPServer and a real OAuthClientProvider, because hand-rolled HTTP can be written to match whatever we happen to accept and will pass while a partner's client fails. The SDK speaks CIMD (client_metadata_url) and SEP-990 ID-JAG natively, and ZeroID already advertises both discovery flags, so it drives our paths with no glue.

Findings for the CG, not for us

  • The plan has a typo. p.9 says the ID-JAG typ is oauth-id-jag-jwt; the draft and our implementation use oauth-id-jag+jwt (internal/service/oauth_id_jag.go:25). A partner building to the published document will hand us assertions we correctly refuse, and the row reads as our failure. Get it corrected before Aug 10.
  • No CIMD matrix row for a public PKCE client — the MCP 2025-11-25 preferred shape, and what we implement.
  • The reference Python SDK cannot check the scope-in-WWW-Authenticate row. mcp 2.0.0 builds the challenge from error/error_description/resource_metadata only. One of only two rows in the OAuth matrix, so most participants will leave it blank. Firehog implements it (highflame-firehog/src/gateway/proxy.rs:674).

Firehog

src/gateway/federated.rs terminates and re-originates rather than transparently proxying, and the plan explicitly disqualifies transparent proxies. So firehog can enter as a second participant and reach the MCP Gateway column and the OAuth matrix — boxes ZeroID structurally cannot touch. Confirm the client leg, then point the existing harness at it.

Activity

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

    mcp-interopOpenID AIIM CG MCP Security Interoperability Event (Gartner IAM Summit Dec 2026)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions