ChatGPT's MCP Events require servers to store subscriptions and sign every webhook
ChatGPT has accepted MCP Events in all plans since OpenAI's DevDay on 29 September 2026, delivered only by HMAC-signed webhook. Swapping a polling tool for events means running subscription storage and callback checks against an experimental spec.
The Engineer · Build desk

What happened
- Servers advertise an events capability in server/discover and implement events/list, events/subscribe and events/unsubscribe.
- OpenAI requires servers to provide persistent subscription storage and outbound HTTPS access to the callback URLs ChatGPT supplies.
- ChatGPT's integration leaves out the draft spec's gap and terminated control notifications.
- OpenAI's documented cases include turning channel bug reports into draft pull requests via message.created, filtered by channel_id.
- The spec comes from the MCP Triggers and Events Working Group and is experimental, so the dev.to guide advises pinning to 2026-07-28.
Why it matters
- What it costs cost A server that answered tool calls statelessly now has to keep subscription records through restarts and refresh them on schedule, so event support costs a database and an outbound HTTPS sender.
- Who's exposed exposure Filtering and access control run on the server, so a subscribe handler that skips the authorization check would deliver one account's events into another user's chat.
- Who has to decide decision Pinning to one experimental protocol version leaves teams deciding whether to keep their polling tools for clients that do not speak 2026-07-28.
Next story · Build · yesterday
Anthropic and OpenAI fund separate firms to station engineers inside customersConfirmed2 publishers
When a user asks ChatGPT to watch a document or a channel, ChatGPT calls events/subscribe with the event name, the filter arguments and a webhook destination made of a callback URL and a signing secret [8]. OpenAI's documentation lists what the server does before it accepts [9]:
1. Check that the user is authorized for that event and those arguments. 2. Validate the name and arguments against the event definition, and require a secret prefixed `whsec_` whose base64 value decodes to 24 to 64 bytes. 3. Validate the callback URL, then verify it with a signed request carrying a fresh, single-use, short-lived challenge [10]. 4. Store the subscription with its owner, filters, callback URL, secret and expiration.
That byte range gives an HMAC key of 192 to 512 bits [22]. The `whsec_` prefix also makes the secret easy to find in a log file, for better and for worse. Deliveries are signed under the Standard Webhooks scheme, according to the dev.to guide [3].
The subscription ID has the strictest rules. OpenAI asks for an ID derived deterministically from the authenticated principal, the callback URL, the event name and the arguments [11]. The draft design sketch proposes a truncated SHA-256 hash of that key, the dev.to guide says [12].
The refresh loop is why. According to the guide, ChatGPT calls events/subscribe again before `refreshBefore`, with the same identity and the last stored cursor, and expects a new expiry in the reply [13]. A matching identity has to update the existing subscription [14]. OpenAI also requires arguments to be compared as canonical JSON, so a change in key order does not create a duplicate [14]. The guide adds that when a refresh carries a new secret, the server replaces the stored one [15]. Event types that cannot replay return a null cursor [18].
I think the draft gets the hard parts right. Subscribe is idempotent, grants expire, and no application data leaves the server until the callback has answered a challenge [14] [13] [10].
The dev.to guide makes the case against polling this way: an agent calling a tool on a timer sends requests when nothing has changed and can see updates late [16]. With events, the server detects the change and pushes it to ChatGPT straight away [17]. The documentation does not describe how the server learns of a change. If the system behind the MCP server can only be polled, I think the polling moves from the agent into the server. The saving then depends on whether one server-side check covers many subscriptions.
What to watch
- A new MCP Events draft from the Triggers and Events Working Group would force servers pinned to 2026-07-28 to migrate.
- ChatGPT adding the draft's gap and terminated notifications, or polling and streaming delivery, would change what a server has to build.
Clarity's read
What the record supports and how the coverage leans. The claims behind it follow.
Reality
- Evidence72
- Adoption
- Not scored
- Hype gap+5
- Incentives40
- Confidence70
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
Since OpenAI DevDay on 29 September 2026, ChatGPT supports the proposed MCP Events specification in protocol version 2026-07-28 (MCP 2.0) in all plans.
- [2]
ChatGPT accepts only webhook delivery for MCP Events.
- [3]
The server verifies callback endpoints and signs every delivery with Standard Webhooks HMAC.
- [4]
The server implements events/list, events/subscribe and events/unsubscribe and advertises events in server/discover.
- [5]
Polling, streaming, and the draft's gap and terminated control notifications are not supported by ChatGPT's integration.
- [6]
Documented cases include turning bug reports in a channel into draft pull requests using message.created filtered by channel_id, and applying review comments to a document using comment.created filtered by document_id.
- [7]
The specification comes from the MCP Triggers and Events Working Group and is experimental; implementations should be pinned to 2026-07-28.
- [8]
When a user asks to monitor an event, ChatGPT calls events/subscribe with the event name, filter arguments, and webhook destination including a callback URL and signing secret.
- [9]
Before accepting a subscription, the server checks the user is authorized for the event and arguments, validates the event name and arguments, requires a whsec_ signing secret whose base64 value decodes to 24-64 bytes, validates and verifies the callback URL, and stores the subscription, owner, filters, callback URL, signing secret and expiration.
- [10]
Before sending application data, the server verifies the callback by sending a signed request with a fresh, single-use, short-lived challenge.
- [11]
The server derives a deterministic subscription ID from the authenticated principal, callback URL, event name and arguments.
- [12]
The MCP Events design sketch proposes a truncated SHA-256 hash of the subscription identity key.
- [13]
ChatGPT calls events/subscribe again before refreshBefore with the same identity and the last stored cursor; the server responds with a new expiration.
- [14]
Subscription creation must be idempotent, updating the existing subscription when identity matches, with arguments compared as canonical JSON so object key order does not create duplicates.
- [15]
If a refresh contains a new secret, the server replaces the stored secret.
- [16]
Without events, an agent regularly calls a tool to find new review comments, which creates unnecessary requests when nothing has changed and can detect updates late.
- [17]
With MCP Events, the server detects changes and sends the update immediately to ChatGPT.
- [18]
The server returns cursor: null for event types that do not support replay.
- [19]
The three event methods are implemented on the same authenticated MCP endpoint as the server's tools.
- [20]
Servers apply filters such as document, project or queue IDs before delivery and return only events the connected account is allowed to discover.
- [21]
MCP Events in ChatGPT requires the server to provide persistent subscription storage and outbound HTTPS access to callback URLs.
- [22]
A signing secret of 24 to 64 bytes is a key of 192 to 512 bits.
Sources
2 independent publishers whose own reporting we read for this story.
- dev.toMCP Events erklärt: Webhook-MCP-Server für ChatGPT erstellen und testen
1 article · October 2, 2026
- developers.openai.comMCP Events – Plugins | OpenAI Developers
1 article
Topics and entities
Topics
- AI agent integrations
- Webhooks
- Model Context Protocol
Entities
- OpenAI
- ChatGPT
- Model Context Protocol
- Apidog
- MCP Triggers and Events Working Group
- Standard Webhooks
- OpenAI DevDay