---
title: "MCP Streamable HTTP Connection"
method: GET
path: "/mcp/sse"
tags: ["MCP"]
---

# MCP Streamable HTTP Connection

`GET /mcp/sse`

## Request

- Base URL: `https://riskmodels.app/api`
- URL: `https://riskmodels.app/api/mcp/sse`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://riskmodels.app/oauth/authorize`, token URL `https://riskmodels.app/api/oauth/token`, scopes: `mcp:read`)

Model Context Protocol endpoint using the Streamable HTTP transport (successor to the legacy SSE+companion-POST pattern). A single URL handles both `GET` (optional server→client event stream) and `POST` (client→server JSON-RPC 2.0 messages).

**Discovery:** The MCP server manifest is published at `https://riskmodels.app/.well-known/mcp.json` for automated client discovery.

**Connection:**
- Transport: Streamable HTTP (stateless mode)
- Authentication: `Authorization: Bearer <key>` (preferred) or
  `?api_key=<key>` query param (for `EventSource`, which can't set
  custom headers).

- Tool-call billing: charged per-invocation on the underlying REST
  endpoint (e.g. `riskmodels_get_stock_snapshot` bills the same as `GET /metrics/{ticker}`).

- **POST requests:** send `Accept: application/json, text/event-stream` (required by some MCP clients;
  omitting it can yield **406 Not Acceptable**).


**Usage — mcp-remote proxy:**
```json
{
  "mcpServers": {
    "riskmodels": {
      "command": "npx",
      "args": ["mcp-remote", "https://riskmodels.app/api/mcp/sse"],
      "env": { "AUTHORIZATION": "Bearer rm_agent_live_..." }
    }
  }
}
```

## Response `200`

SSE connection established

## Other responses

- `401`: Authentication required
- `402`: Insufficient balance.
- `429`: Rate limit exceeded.

---

[API](https://skmtc.dev/riskmodels/apis/riskmodels-api.md) · [All operations](https://skmtc.dev/riskmodels/apis/riskmodels-api/llms.txt) · [OpenAPI document](https://skmtc.dev/riskmodels/apis/riskmodels-api/revisions/1a034cad408a?raw)
