events/poll and events/stream from the proposal are not implemented.
Smithery proxies subscribe/unsubscribe calls through to the upstream MCP server (handling auth on your behalf). Once subscribed, events flow directly from the upstream MCP server to your endpoint — Smithery is not in the delivery path.
Triggers are to events what tools are to actions:
Both are declared by the MCP server and live under the same connection.
Quick start
You’ll need:- A Smithery namespace (e.g.
my-app) — created on the dashboard or via Connect. - A
SMITHERY_API_KEYfrom your namespace settings. - An HTTPS endpoint that can receive webhooks.
- An active MCP session to the connection (via the SDK or CLI).
1. Create a connection
2. Subscribe to a trigger
Over MCP, callai.smithery/events/subscribe with what to listen for (name + params), where to deliver (delivery.url), and the Standard Webhooks secret used to sign deliveries (delivery.secret). Generate the secret on your side first:
name, params, delivery.url) before refreshBefore to keep it alive — see Refreshing.
3. Handle events at your endpoint
Verify each delivery against the secret you supplied at subscribe time, then dispatch onevent.name:
Discovering triggers
From an active MCP session, callai.smithery/events/list:
Subscribing
Subscription identity
A subscription is keyed by(principal, delivery.url, name, params). Two calls with different params or a different delivery.url are different subscriptions. To watch two Notion workspaces, subscribe twice — once per workspace_id.
To fan in events from many triggers (or many connections) into one endpoint, subscribe each trigger with the same delivery.url. Your receiver routes deliveries by the X-MCP-Subscription-Id header.
Refreshing
Webhook subscriptions expire on TTL. Re-call subscribe with the same key beforerefreshBefore to reset it. If you stop refreshing, the subscription expires and the upstream MCP server stops delivering — no explicit unsubscribe is required.
Supplying a new delivery.secret on refresh rotates the signing key.
Receiving events
The upstream MCP server POSTs each event directly to your subscription’sdelivery.url:
Signature verification
The upstream MCP server signs every delivery with the Standard Webhooks HMAC profile, using thedelivery.secret you supplied at subscribe time.
Verify against the raw request body, not a re-serialized JSON object. Off-the-shelf Standard Webhooks libraries (e.g. Svix) work without modification.
During secret rotation,
webhook-signature may carry multiple space-delimited v1, signatures; compliant verifiers accept the delivery if any one verifies.
Delivery semantics
- At-least-once — dedupe on
webhook-id. - The upstream MCP server retries failures with exponential backoff and gives up on persistent non-retryable errors.
- Your handler should be idempotent and return
2xxonly after the event is durably accepted.
Unsubscribing
Unsubscribing is eager cleanup — subscriptions also expire naturally on TTL if you stop refreshing. Both forms supply the subscription key (name, params, delivery.url); the id is not accepted as input.
MCP methods
Available on any connection advertising theai.smithery/events extension during initialize. Method and field names track the MCP Events proposal.
Learn more
- Build triggers into an MCP server — for server authors
- Connect — manage MCP connections
- Standard Webhooks spec