28ec35e. The draft is not an accepted SEP yet.
Events are a draft extension. Results name the profile they were judged
by:
draft@28ec35e, or chatgpt@2026-11-05 for what ChatGPT supports.
chatgpt@2026-09-30 is a historical snapshot that accepted only protocol
version 2026-07-28.Discover events
The official client drops a server’s top-levelcapabilities.events, so read it through the manager. It captures the raw handshake:
events/* call is refused before it reaches the wire when the server didn’t declare the capability (MCPEventsWireError).
Poll once
Run a subscription with the coordinator
EventsCoordinator owns every lifecycle transition for every mode: subscribe, refresh, rotate, poll, pause and removal. Each step() performs one transition and returns a patch plus the time of the next action. Events land in an inbox. MemoryEventInbox is the local one; hosted MCPJam uses its public inbox at hooks.mcpjam.com.
EventsPushRuntime holds events/stream requests open. It demuxes concurrent streams, reconnects with the cursor, and rolls the finite request timer over deliberately:
Webhook secrets never reach your logs
events/subscribe carries the signing secret. The SDK redacts it, along with any whsec_ value, from every frame it hands to an RPC logger (whsec_<redacted>), including error messages that quote it back. The server still receives the exact secret.
Conformance
overrides: ["insecure-local-receiver"]), and such a run never passes.
Event-triggered turns in evals
runEventStep runs an event through a host executor with the same prompt shape MCPJam’s unattended trigger runner uses. The instruction stays outside, and the event goes into an untrusted data block. A canned event is first validated against its payloadSchema.

