# MCP server (https://docs.skewtape.com/mcp)

> Add Skewtape to Claude Code, Cursor, VS Code or any MCP client. Search the docs for free; read markets, matched events, fills, candles and resolutions with an API key.

Skewtape runs a remote MCP server at `https://api.skewtape.com/mcp` (Streamable HTTP). Add it to your agent and it can search these docs for free, and with a Skewtape API key on the Builder or Pro plan read the same data as the REST API.

## Tools

| Tool | Key | Returns | Same as |
| --- | --- | --- | --- |
| `search_docs` | None | Docs pages that match a query, with an excerpt | |
| `read_doc` | None | One docs page as Markdown | |
| `get_markets` | Builder | Markets from every venue in one schema | `GET /v1/markets` |
| `get_matched_events` | Builder | Cross-venue matched events with their member markets | `GET /v1/matched_events` |
| `get_fills` | Builder | Trade-level fills for a market, a matched event or a venue | `GET /v1/fills` |
| `get_candles` | Builder | 1m, 1h or 1d candles for a market, a matched event or a venue | `GET /v1/candles` |
| `get_resolutions` | Builder | How, when and on what source each market resolved | `GET /v1/resolutions` |

The docs tools never return market data. They read the same text as `/llms-full.txt`, and need no key. A `search_docs` query is at most 256 bytes and 16 words.

The data tools take the same filters as their REST routes and answer a page of rows in `data`, with `next_cursor` for the next page: pass it back as `cursor`. A data tool returns 25 rows unless you ask for another `limit` (1 to 1,000). `get_markets` with a `venue` and a single `market_ids` entry reads that one market, and `get_matched_events` with an `event_id` reads that one event.

## Set up your client

Create a key in the dashboard. Send it as the `X-API-Key` header, or as `Authorization: Bearer <key>`. Leave the key out to use the docs tools only.

### Claude Code

```bash
claude mcp add --transport http skewtape https://api.skewtape.com/mcp --header "X-API-Key: $SKEWTAPE_API_KEY"
```

Without a key:

```bash
claude mcp add --transport http skewtape https://api.skewtape.com/mcp
```

Run `/mcp` in Claude Code to check that `skewtape` is connected.

### Cursor

In `.cursor/mcp.json` (one project) or `~/.cursor/mcp.json` (every project):

```json
{
  "mcpServers": {
    "skewtape": {
      "url": "https://api.skewtape.com/mcp",
      "headers": { "X-API-Key": "${env:SKEWTAPE_API_KEY}" }
    }
  }
}
```

### VS Code

In `.vscode/mcp.json`. VS Code asks for the key once and stores it:

```json
{
  "inputs": [
    { "type": "promptString", "id": "skewtape-key", "description": "Skewtape API key", "password": true }
  ],
  "servers": {
    "skewtape": {
      "type": "http",
      "url": "https://api.skewtape.com/mcp",
      "headers": { "X-API-Key": "${input:skewtape-key}" }
    }
  }
}
```

### Claude Desktop

For the docs tools alone, add `https://api.skewtape.com/mcp` as a custom connector. To send a key, run the server through `mcp-remote` in `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "skewtape": {
      "command": "npx",
      "args": ["mcp-remote", "https://api.skewtape.com/mcp", "--header", "Authorization:${SKEWTAPE_AUTH}"],
      "env": { "SKEWTAPE_AUTH": "Bearer st_live_your_key" }
    }
  }
}
```

### Any other client

Point a Streamable HTTP client at `https://api.skewtape.com/mcp` with the key in `X-API-Key` or `Authorization: Bearer`. The server is stateless: it keeps no session between requests and sends no notifications.

## Plans, limits and usage

- The data tools need a key on the Builder or Pro plan. A key on the Free or History plan gets `forbidden_plan`, which names the plan to move to. Free and History keys, and no key at all, use the docs tools.
- Each data tool call is one API call. It counts against your plan's calls a second and calls a month exactly as the REST route does, and shows in your dashboard usage under that route, for example `GET /v1/markets`.
- The docs tools are free and limited to about 60 calls a minute from one address.

## Data policy

The data tools follow the same data policy as the REST API. Some venues' fields are null with `blocked: true` and a `block_reason_code`. A venue whose data is withheld is left out of lists, and a read of one of its markets answers `blocked`. Matched event fields are Skewtape's own data and are never withheld; a member on a withheld venue keeps its ids.

## Errors

A refused call is a tool error whose text is the REST error envelope, so your agent sees the same codes: `unauthorized`, `forbidden_plan`, `blocked`, `not_found`, `invalid_request`, `rate_limited`, `quota_exceeded` and `internal`. A `rate_limited` error carries `retry_after_seconds`, and a `quota_exceeded` error carries `resets_at`, when the month's count starts again.

```json
{
  "error": {
    "code": "unauthorized",
    "message": "The data tools need a Skewtape API key. Send it as the X-API-Key header, or as Authorization: Bearer, in the settings of this MCP server.",
    "docs_url": "https://docs.skewtape.com/errors#unauthorized",
    "request_id": "8f2c41d07a9e4b1c"
  }
}
```

## Example

Sample, 12 Nov 2026. A `get_matched_events` call with `{"min_confidence": 0.95, "resolution_equal": true, "limit": 1}` answers one page like this (members shortened):

```json
{
  "data": [
    {
      "event_id": "st_evt_00042",
      "question_canonical": "Will US CPI for October 2026 be above 3.0 percent year on year?",
      "category": "economics",
      "confidence": 0.97,
      "resolution_equal": true,
      "rule_note": "Both venues settle on the BLS release for October 2026.",
      "status": "approved",
      "members": [
        { "venue": "polymarket", "market_id": "0x5e1c...", "pairwise_confidence": 0.97, "status": "active" },
        { "venue": "kalshi", "market_id": "KXCPIYOY-26OCT-T3.0", "pairwise_confidence": 0.97, "status": "active" }
      ]
    }
  ],
  "next_cursor": "eyJ2IjoxfQ"
}
```

`confidence` is how sure Skewtape is that the members are the same event, not a probability of the outcome.

Powered by Kalshi Research
