- You deploy to serverless (Vercel, Lambda, Cloud Run scaled to zero), so
initializeand each tool call land on different instances. - You set
stateless_http=True, or the equivalent in your SDK, even when you run a single long-lived container or process.
How to tell you need this
Open your Sessions page. Without the two steps below, you will see:- Sessions don’t line up. Calls arrive with no session identity, so Armature falls back to heuristic grouping: separate conversations from the same caller can merge into one session, and others land as fallback sessions instead of one session per conversation.
- Client shown as Unknown. The client name and version never reach us.
initialize handshake and are attributed automatically.
1. Use await delivery
Background delivery relies on the process staying alive after the response. In serverless, send events before returning instead:
2. Resolve the session per request
The SDK mints identity-bearing session IDs (mcp_<client>_v_<version>_<uuid>) on initialize and reads them back on later requests, so client attribution survives across instances.
- TypeScript
- Python
- Go
Call
resolveStatelessHttpSession per request and pass the results to the transport and dispatch context:Session IDs are attribution metadata, not a security boundary. Clients echo them back unsigned. Keep authorization on your own auth layer.

