> ## Documentation Index
> Fetch the complete documentation index at: https://docs.slaunt.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Slaunt MCP transport: sessions, headers and limits

> Streamable HTTP details for Slaunt: initialize, Mcp-Session-Id rules, notification stream, thread boundary headers and rate limits.

Slaunt is a standard Streamable HTTP MCP server, so MCP SDKs handle this page for you. Read it if you're writing a client by hand or debugging one. The parts that differ from a generic server are strict session binding and thread boundaries.

| Method | Path | Purpose |
| - | - | - |
| `POST` | `/mcp` | JSON-RPC requests |
| `GET` | `/mcp` with `Accept: text/event-stream` | Server notifications, mainly `tools/list_changed` |
| `DELETE` | `/mcp` | End the session (`204`) |

## Sessions

Send `initialize` without an `Mcp-Session-Id` header. The response header carries the new session ID, which you send on every request after that.

```bash theme={null}
curl -i https://central-mcp-ccr-production.up.railway.app/mcp \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"my-agent","version":"1.0.0"}}}'
```

Sessions are bound to the user **and** the client that created them, so a session ID can't be shared between tools or tokens. Reuse one session per connection: each new session can show up as a separate agent in Quaero.

| Case | Response | Fix |
| - | - | - |
| No header on a non-initialize request | `400`, `-32600` | Send the header |
| Session unknown, expired, or used with another token/client | `404`, `-32001`, `data.required_action: "initialize"` | Re-initialize without the header |
| Session was deleted | `404`, `MCP session terminated (deleted)...` | Re-initialize |

## Notification stream

Open it if you cache `tools/list`: Slaunt sends `notifications/tools/list_changed` when the workspace's provider tools change.

| Status | Cause |
| - | - |
| `400` | No session header |
| `403` `mcp_origin_not_allowed` | Browser request from a disallowed origin |
| `409` | Too many streams open for this session |
| `429` | Server stream capacity exhausted; retry later |

## Thread boundaries

By default one session equals one runtime. If your client runs several chats over one connection, tag each request with a boundary so Slaunt keeps them as separate threads instead of merging them. Put it in `params._meta` or a header. Values are strings up to 1,024 characters and are stored only as hashes. Conflicting values on one request are rejected.

| Boundary | `_meta` key | Header |
| - | - | - |
| Slaunt thread (preferred) | `ai.slaunt/thread-instance` | `Ai-Slaunt-Thread-Instance` |
| OpenAI session | `openai/session` | `OpenAI-Session` |
| Generic | `mcp/thread-id` | `Mcp-Thread-Id`, `X-Conversation-Id` |
| Session instance | `ai.slaunt/session-instance` | `Ai-Slaunt-Session-Instance` |

Without a boundary, each new chat must call `thread_begin`. Codex has [its own routing](https://docs.slaunt.ai/clients/codex.md#thread-routing).

## Limits

| Limit | Value | When exceeded |
| - | - | - |
| Requests | 240/min | `429` `http_rate_limited` with `Retry-After` |
| Request body | 1 MiB | Rejected |
| `ccr_search` query | 1,000 chars | Tool error |

Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` (Unix seconds).

## Results

Each `tools/call` result has `content[0].text`, a readable summary meant for the model, and `structuredContent`, the full data meant for code. Failures come back as a JSON-RPC `error`, not as an `isError` result, so check for `error` first.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.