> For the complete documentation index, see [llms.txt](https://references.everstrike.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://references.everstrike.io/ai/mcp.md).

# MCP

## Everstrike MCP Server

Connect an AI assistant to live Everstrike market data.

The Everstrike MCP server exposes exchange data as **tools** an AI model can call during a conversation — prices, order books, trades, candles, funding rates and exchange status. Ask your assistant "what's the spread on BTC/USD right now?" and it fetches the answer instead of guessing.

It speaks the [Model Context Protocol](https://modelcontextprotocol.io), so it works with any MCP-capable client: Claude Desktop, Claude Code, Cursor, or your own application built on an MCP SDK.

> **Read-only, and public.** Every tool below reads public market data. There is no tool that places, modifies or cancels an order, and none that reads your account. Connecting this server cannot move your funds.

***

### Quick start

Point your MCP client at the server URL. No API key, no account, no signup.

{% tabs %}
{% tab title="Claude Desktop / Cursor" %}
Add the server to your client's MCP configuration:

```json
{
  "mcpServers": {
    "everstrike": {
      "url": "https://mcp.everstrike.xyz/mcp"
    }
  }
}
```

Restart the client. You should see ten `everstrike_*` tools become available.
{% endtab %}

{% tab title="curl" %}
The server speaks JSON-RPC over HTTP. List the tools:

```bash
curl -sX POST https://mcp.everstrike.xyz/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
```

Call one:

```bash
curl -sX POST https://mcp.everstrike.xyz/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"everstrike_ticker",
                 "arguments":{"pairs":["USD_BTC_PERP"]}}}'
```

The `Accept` header must list **both** content types — the transport rejects the request otherwise.
{% endtab %}
{% endtabs %}

***

### Market naming

This is the single most common source of confusion, so it is worth thirty seconds.

**Everstrike keys markets quote-first.** The BTC/USD perpetual is `USD_BTC_PERP` — not `BTC_USD_PERP`.

```
USD_BTC_PERP     BTC/USD perpetual
USD_ETH_PERP     ETH/USD perpetual
USDT_USD         USDT/USD spot   ← spot is base-first
```

Spot markets run the other way round. The ordering depends on the instrument, so it cannot be worked out from the key alone.

#### What the server accepts

Friendly spellings of a **pair** are resolved for you against the live market list:

| You send       | Resolves to                |
| -------------- | -------------------------- |
| `USD_XRP_PERP` | `USD_XRP_PERP`             |
| `XRP/USD`      | `USD_XRP_PERP`             |
| `xrp-usd`      | `USD_XRP_PERP`             |
| `XRPUSD`       | `USD_XRP_PERP`             |
| `XRP`          | ✗ not resolved — see below |

> **A bare asset name does not resolve.** `XRP` on its own is ambiguous — the server has no way to know you mean the USD perpetual rather than a spot market or an option. Send `USD_XRP_PERP`, or ask for the pair form `XRP/USD`.

If a market cannot be resolved you get suggestions back rather than an error, so a near-miss is usually recoverable in one step. Where a spelling matches more than one instrument — a perpetual and a spot market sharing `BTC/USD` — the server reports the ambiguity instead of picking one.

Options carry their own published symbols (`BTC-120000-C`) and are reachable by those.

Use `everstrike_pairs` for the canonical list.

***

### Tools

#### Prices and markets

**`everstrike_ticker`**

Live prices: last, mark and index, plus 24h change and volume.

| Parameter | Type      | Notes                                            |
| --------- | --------- | ------------------------------------------------ |
| `pairs`   | string\[] | Up to 6 markets. Omit for a summary — see below. |

**Pass `pairs` when you have specific markets in mind.** You get every field for each one.

**Omit it** and you get a different shape: a compact summary of the 25 most-traded markets ranked by 24h volume, plus `all_market_keys` listing every tradable market. The full ticker is 257 markets of \~50 fields each — far too large to return in one piece — so the summary is a deliberate view, not a truncation.

> If the market you want is missing from the summary, it is **not** unavailable. Take its key from `all_market_keys` and call again with `pairs`.

**`everstrike_pairs`**

Every tradable market with tick size, lot size, leverage caps and contract type. No parameters. This is the canonical reference for market keys.

**`everstrike_assets`**

Supported assets with precision, deposit and withdrawal status, and network information. No parameters.

#### Market depth and activity

**`everstrike_depth`**

Aggregated bid/ask depth for one market.

| Parameter | Type   | Notes         |
| --------- | ------ | ------------- |
| `pair`    | string | **Required.** |

**`everstrike_trades`**

Recent public trades for one market.

| Parameter | Type   | Notes         |
| --------- | ------ | ------------- |
| `pair`    | string | **Required.** |

**`everstrike_ohlcv`**

Candlestick history.

| Parameter  | Type    | Notes                                           |
| ---------- | ------- | ----------------------------------------------- |
| `pair`     | string  | **Required.**                                   |
| `interval` | enum    | See the interval list below.                    |
| `start`    | integer | Unix **milliseconds**.                          |
| `end`      | integer | Unix **milliseconds**.                          |
| `price`    | enum    | `mark` (default), `last`, `index`, `all`.       |
| `limit`    | integer | Default 60 (15 when `price` is `all`), max 500. |

**Intervals**

```
15s  1m  3m  5m  15m  30m  1h  2h  4h  6h  24h  7d
```

Note `24h` and `7d` — not `1D` or `1W`.

**Price basis.** Each candle carries several price series. `price` selects which one is reported, and the reply uses plain `open` / `high` / `low` / `close` whichever you choose:

| `price` | Reports                                |
| ------- | -------------------------------------- |
| `mark`  | Mark price — **the default**           |
| `last`  | Last traded price                      |
| `index` | Index price                            |
| `all`   | The raw candle, every field, unrenamed |

> **Why mark rather than last?** On a market with little or no volume the last traded price can sit unchanged for hours. A candle series built from it is flat, and easy to misread as "nothing is happening". Mark price is continuous, so it reflects where the market actually is. Ask for `last` when you specifically want executed prices.

A projected candle looks like this:

```json
{
  "time": 1786370400000,
  "open": 0.102308,
  "high": 0.102308,
  "low": 0.102308,
  "close": 0.102308,
  "base_volume": 0,
  "quote_volume": 0,
  "trades": 0
}
```

`price: "all"` returns the raw candle instead — useful when you need fields the projection does not carry, at roughly 3.5× the size per candle. That is why its default `limit` is lower.

> **`start` and `end` are milliseconds.** A seconds-based timestamp asks for candles from 1970 and returns an empty series rather than an error.

**`everstrike_funding`**

Historical funding rates for perpetual markets.

| Parameter | Type   | Notes                            |
| --------- | ------ | -------------------------------- |
| `pair`    | string | Optional — omit for all markets. |

#### Exchange

**`everstrike_status`**

Exchange-wide status: uptime, engine health, maintenance windows. No parameters.

**`everstrike_globals`**

Aggregate statistics: open interest, volume, user counts. No parameters.

**`everstrike_vault`**

Perpetual vault state: redemption rate, total earnings, USD supply. No parameters.

***

### Limits

|                        |                                  |
| ---------------------- | -------------------------------- |
| Requests               | 10/second per IP, bursting to 20 |
| Concurrent connections | 16 per IP                        |
| Response size          | 60,000 characters                |

A response that exceeds the size limit is truncated with a note saying so and suggesting a narrower request. **Truncation removes data from the end**, so if you see that note, do not assume what you were looking for is in what remains — narrow the request and call again.

***

### Protocol details

For anyone building a client directly rather than using an SDK.

|                  |                                     |
| ---------------- | ----------------------------------- |
| Transport        | Streamable HTTP                     |
| Protocol version | `2025-06-18`                        |
| Session          | Stateless — no session id is issued |
| Response format  | JSON (not SSE)                      |
| Authentication   | None                                |

Because the server is stateless, **a bare request works** — no `initialize` handshake is required before `tools/list` or `tools/call`. Sending one is harmless, but it must be its own request: the transport rejects a JSON-RPC batch containing an `initialize` alongside other messages.

Every request needs `Accept: application/json, text/event-stream`. Listing only one of the two is rejected with a 406.

***

### What is not here

The server exposes **public market data only**. Tools for account balances, positions, open orders and order placement exist in the codebase but are not registered on this deployment, so they cannot be called however the request is formed.

***
