Events
An assistant connected over MCP can do more than
answer when asked. It can watch the workspace and act as soon as something
happens: brief you when new recommendations land, check a competitor’s move the
morning it is spotted, or summarise a project the moment it closes.
This uses MCP events. ChatGPT supports them today, and any client that
implements the MCP Events extension can use them too.
What an assistant can watch
| Event | Fires when | Narrow it by |
|---|---|---|
New recommendations (recommendation.created) |
The morning’s data lands new recommendations: reorders, price moves, range calls | Remit, kind |
Competitor price moves (competitor_price.changed) |
Price tracking first spots a competitor cut, a stockout, one retailer following another, or the market index crossing yours | Retailer, kind of move, SKU |
Project changes (project.updated) |
A project is created, closed or reopened, or its supplier order is finalised | Project, kind of change |
Data refreshed (data.refreshed) |
A new day of sales, stock and supplier data is in, so earlier figures are out of date | — |
Competitor price moves appears only in workspaces with price tracking.
Ask ChatGPT to watch
Connect ChatGPT first (ChatGPT). Then, in a
Work chat, say what to watch and what to do:
- “When new recommendations land in my Toys remit, give me the three that matter most.”
- “Tell me when Big W cuts a price on anything I track, and say whether we should follow.”
- “When the Lego supplier negotiation closes, draft a summary for the team.”
- “Each morning, once the data has refreshed, send me a trading brief.”
ChatGPT shows the subscription in the chat and acts each time the event fires.
To stop, ask it to stop watching, or end the connection under Settings → AI &
agents. Ending the connection stops every subscription it made.
If nothing arrives
- Use a Work chat. ChatGPT offers events only in Work chats (on the web, or
in the desktop app with Cloud selected), not in ordinary chats. - Allow about a minute. Twelfth checks for new events every 30 seconds.
Recommendations and refreshed data arrive when the morning’s data lands, not
the moment you subscribe. - Check your scope. Nothing is sent for a remit you don’t hold or a SKU you
don’t cover, so a quiet subscription may just mean nothing in your scope
changed. - Check the connection’s tools. If you didn’t allow a tool when you
connected, the events that depend on it aren’t offered. Reconnect from
Settings → AI & agents and allow it. - Ask ChatGPT what it’s watching. A subscription lasts up to a day and
ChatGPT renews it while the chat still wants it. If the chat has moved on,
ask it to start watching again.
What an assistant receives
An event says what happened and where to look: ids, a title, a link into
Twelfth, and the tool that reads the detail. It does not carry sales,
margin or cost figures. The assistant fetches those with a normal tool call,
which applies your workspace permissions and is recorded like any other call.
Events follow the same scope as the tools:
- A connection made by signing in sees only events in your remits. A
recommendation in another buyer’s remit, or a price move on SKUs you don’t
cover, is never sent. - A connection is offered only the events whose reading tool it may use. If a
connection can’t list projects, it can’t watch them either. - Access is checked again every time an event is delivered. If your access
changes, deliveries change with it. If you leave the workspace or the
connection ends, they stop.
For developers
Twelfth implements the MCP Events extension on its 2026-07-28 endpoint at
https://api.twelfth.ai/mcp. server/discover advertises
capabilities.events. Every events method needs the same OAuth token or
workspace key as the tools.
events/listreturns the events this connection may watch. Each has its
deliverymodes, aninputSchema(the filter arguments) and a
payloadSchema(the event’sdata).events/pollis stateless. Call it first withcursor: nulland keep the
cursoreach poll returns. It also returnshasMoreandnextPollMs, and
truncated: truewhen the cursor is older than seven days (or older than your
maxAgeMs).events/subscriberegisters a webhook:
delivery: { mode: "webhook", url, secret }.- The
urlmust be public HTTPS. - The
secretis yours:whsec_plus base64 of 24–64 random bytes. - Before activating, Twelfth POSTs a signed
{"type":"verification","challenge":…}. Echo the challenge in a 2xx
response, either as the body or as{"challenge": …}. - Subscribing again with the same event, arguments and URL refreshes the
subscription and returns the sameid. - A subscription lasts up to 24 hours (
refreshBefore); you can ask for less
withttlMs.
- The
events/unsubscribetakes the same event, arguments anddelivery.url.
Calling it twice is safe.
Each delivery is one POST of one event, { eventId, name, timestamp, data, cursor }, signed with Standard Webhooks:
webhook-id, the event’seventId, unchanged across retries. Deduplicate on it.webhook-timestamp,webhook-signatureandX-MCP-Subscription-Id.
Verify the signature with any Standard Webhooks library before trusting the
body:
import { Webhook } from "standardwebhooks";
const event = new Webhook(process.env.TWELFTH_WEBHOOK_SECRET).verify(rawBody, headers);
To see it work end to end, create, close or reopen a project. That raises
project.updated straight away, with no need to wait for a data refresh.
Delivery rules:
- A 2xx acknowledges the delivery.
- Twelfth retries other failures after 1 minute, 5 minutes, 30 minutes, 2 hours
and 6 hours, then gives up. 410and413are never retried.- Redirects are never followed.
- Events may arrive out of order.
Related
- Generic MCP — the endpoint, tools, prompts and resources
- ChatGPT — connect ChatGPT
- API keys — connect with a workspace key