# MCP

> Point an assistant at one address and it reads dealer positioning for every finished SPX session; with a lab key, or after signing in through OAuth, it also drives LAB.

Source: https://firmtape.com/docs/developers/mcp

Point an assistant at one address and it reads dealer positioning for every finished SPX session; with a `lab` key, or after signing in through OAuth, it also drives LAB.

Endpoint `https://mcp.firmtape.com/mcp` (streamable HTTP (POST JSON-RPC: initialize, tools/list, tools/call)). Registry `com.firmtape/spx-options-gamma`.

## Auth

- Free tools: no account, no key.
- `lab_` tools and `options_strategy_test`: a `lab` key as `Authorization: Bearer <key>`, or OAuth 2.1 (clients that speak MCP authorization register themselves; press Connect and sign in). Without either they are not listed.
- The order ledger and Geo have MCP servers of their own, opened by an `orders` and a `geo` key.

## Free tools

| Tool | Arguments | Returns |
| --- | --- | --- |
| `list_sessions` | `{ limit? }` | Finished trading days in the archive, newest first, up to 50 a call. |
| `get_session` | `{ day }` | One session: OHLC, the zero-gamma flip and its crossings, the call and put walls, the net-gamma percentile, ATM IV. |
| `get_levels` | `{ day }` | The level set of one finished day and where the session closed against it. |
| `get_level_history` | `{ days? } or { from, to }` | How the levels moved, up to 40 sessions: each day's flip and walls and its change from the day before. |
| `get_gex_profile` | `{ day, minute?, book?, expiry_scope?, strikes_around_spot? }` | The strike ladder of one minute in the volume, measured or open-interest book. The one tool with a per-address limit. |
| `get_events` | `{ from?, to?, impact? }` | The market calendar of a window, up to 31 days, with what usually followed each kind of event. |
| `get_market_moving_minutes` | `{ day?, tape_only? }` | The minutes of a session that moved the market, with what was happening. |
| `screen_sessions` | `{ filters..., limit? }` | Counts and lists the finished sessions whose closing measurements match the filters, with the matching /screener page. |
| `get_symbol_gamma` | `{ symbol }` | The latest volume and open-interest books of a ticker, or ES, NQ and RTY, with a trust grade. |
| `get_coverage` | `{ from?, to? }` | Which trading days the archive holds in a window and which it is missing. |
| `search` | `{ query }` | Document search over the archive, for clients that only call search and fetch. |
| `fetch` | `{ id }` | One document: an id from search, a FirmTape address or a trading day. |

## LAB tools

| Tool | Arguments | Returns |
| --- | --- | --- |
| `lab_compile` | `{ message, id? }` | Turns a plain-words idea into a rule, or amends one. Free, needs a positive balance. |
| `lab_run` | `{ id, kind: "backtest" \| "quant" }` | Runs the idea's current conveyor step: 1 credit, refunded on failure. |
| `options_strategy_test` | `{ legs, entry, ... }` | Prices an SPX 0DTE structure over the archive on real quotes: 10 credits. |
| `lab_state` | `{}` | The account's ideas, the conveyor holder and the credit balance. |
| `lab_thread` | `{ id }` | The chat thread of one idea. |
| `lab_idea` | `{ id, action }` | Desk actions: desk, drop, delete, set. |

## Limits

- `get_gex_profile` reads at most 50 distinct days an hour and 150 in 24 hours per client address (an IPv6 address counts by its /64). Days already opened keep answering; a new day answers once the window rolls. The refusal is a tool error that says so.
- The other free tools have no per-address limit.
- `lab_` tools spend the account's credits, as the LAB API does.

## Errors

- A tool's failure is a result with `isError: true` and a sentence, so the model can read it: an unknown day, a closed window, no credits.
- An unknown tool or a protocol error is a JSON-RPC error (`-32602`, `-32601`).

## Connect

Claude Code:

```
claude mcp add --transport http firmtape https://mcp.firmtape.com/mcp
```

Cursor (.cursor/mcp.json):

```
{ "mcpServers": { "firmtape": { "url": "https://mcp.firmtape.com/mcp" } } }
```

claude.ai and Claude Desktop:

```
Settings, Connectors, Add custom connector: https://mcp.firmtape.com/mcp
```

Any client, or curl:

```
curl -s https://mcp.firmtape.com/mcp -H "content-type: application/json" -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_session","arguments":{"day":"2026-10-09"}}}'
```

## The other MCP servers

### ORDERS

The order ledger, on the same key and the same daily budget as the Orders API.

| Tool |
| --- |
| `orders_day` |
| `orders_latest` |
| `orders_sessions` |

Endpoint `https://firmtape.com/orders/mcp`, key scope `orders`.

### GEO

Geo records; tool calls count toward the month's calls, listing tools does not.

| Tool |
| --- |
| `geo_records` |
| `geo_sources` |
| `geo_coverage` |
| `geo_snapshot` |
| `geo_activity` |
| `geo_series` |
| `geo_latency` |

Endpoint `https://geo.firmtape.com/mcp`, key scope `geo`.
