Agents that speak MCP Events
Some agent programs subscribe to events themselves, with MCP Events, the Model Context Protocol's extension for events. Your app serves them with the code you already have: attach answers their requests, and Wakeshift holds each subscription and delivers every occurrence. You write nothing for any of these clients, and the same events still reach every other agent through subscribe_events and your own tools.
Which agents, and what happens on an event
| Agent | How it subscribes | What happens when an event arrives | What the user sets up |
|---|---|---|---|
| ChatGPT (Work chats, dots) | The user asks ChatGPT to watch something | A new run in the chat | Nothing beyond adding your app |
| OpenClaw (2026.10.10 beta and later) | An automation with an MCP event source, made in the Automation editor or by asking the agent | A new, isolated automation run, with the event as outside data | The mcp-events plugin, with a public HTTPS address for its gateway |
| Hermes Agent (v0.22.5 and later) | The agent subscribes when asked, after the user approves each subscription in chat | A new, unattended run that follows the instructions given at subscribe time | events: true on your server in Hermes's config, and its webhook listener on a public HTTPS address |
Mastra (@mastra/mcp 2.6 and later) |
In code, or with its tools for the agent | In code, the subscription's iterator yields it. With Mastra's signal provider, it's added to the thread that subscribed | Nothing for poll; a public URL for webhooks |
TanStack AI (@tanstack/ai-mcp 1.0) |
In code | Your callback runs | A public HTTPS URL for its webhook handler |
Vercel AI SDK (@ai-sdk/mcp 2.0) |
In code | Your callback runs | A public HTTPS URL for its webhook handler |
These clients start a new run for each event, apart from Mastra's signal provider. To wake the conversation a person already has open, their agent subscribes with subscribe_events or one of your tools instead, and Wakeshift wakes it the way that agent can be woken (agents). OpenClaw and Hermes Agent can do both, so pick the path for the job:
- MCP Events for an automation that runs on its own.
subscribe_eventsand Wakeshift's install for the conversation the user is in.
How occurrences arrive
- Webhook. The client gives a URL, and Wakeshift checks that the URL agrees to receive events before delivering anything. Then each occurrence is one POST, signed with Standard Webhooks, in order and retried for up to 15 minutes. If one is given up on, the client is told it missed something. A subscription lasts at most a day, and the client renews it before then. Mastra, OpenClaw and Hermes Agent renew on their own; with TanStack AI and the Vercel AI SDK, your code renews.
- Polling. This is for clients that can't take webhooks, such as an agent on a laptop or Mastra's poll mode. The first poll subscribes, and each later poll returns what happened since the last one, in order. Wakeshift asks clients to poll every 10 seconds. Nothing is lost between polls or when a poll fails, because the next poll returns it again. A subscription nobody has polled for 10 minutes ends.
Every occurrence carries your payload exactly as you emitted it, and the line your event's text renders, for clients that show one. Keep payloads to what an agent needs to decide what to do, and let it fetch the rest with your tools: these clients hand the payload to a model as outside data.
Consent and control
- Each subscription belongs to your user. It needs your sign-in (attach's
identify). Your event'sauthorizeruns before it starts, and again on every poll. Each of your users can have up to 20 webhook subscriptions to your app at once. - Your users can stop them.
list_subscriptionsshows a user's subscriptions, native ones included, andunsubscribe_eventswith an ID ends one. Nothing more is delivered. A polling client's next poll is refused, so it doesn't quietly subscribe again, and a webhook gets a final notice if its client takes one (ChatGPT and OpenClaw don't). - Removing an event from your app ends its subscriptions. Webhook subscriptions end within an hour, with a final notice that the event is gone, and a poller is told on its next poll.
Your server
MCP Events is defined for MCP protocol 2026-07-28, so your server has to speak it:
- The Go and Python SDKs do.
- The TypeScript SDK does on a stateless Streamable HTTP transport (no sessions).
A TypeScript server with sessions still serves every client above except OpenClaw, which speaks only 2026-07-28: those clients fall back to the older handshake.
Wakeshift follows the current MCP Events draft (SEP-3415, revised 2026-10-27). Where the clients above differ from the draft, it stays compatible with the clients.