Skip to main content
MCP Events let a server tell a client that something happened, such as a new comment, a failed build or an incoming email, so an agent can react without anyone typing. The SDK implements the working-group draft pinned at 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-level capabilities.events, so read it through the manager. It captures the raw handshake:
Every 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.
For push, 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

A plain-http receiver is allowed only as a labelled override (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.