# MCP server

> The hosted Chord MCP server. One URL, 17 tools, every chain Chord serves as a tool parameter. Market data, quotes and unsigned swap transactions for any MCP client, no install.

Source: https://getchord.xyz/docs/agents/mcp/

Chord runs an MCP server at `https://api.getchord.xyz/v1/mcp`. Add the URL to an MCP client and 17 tools appear: boards, tokens, trades, candles, wallets, smart money, holders and liquidity pools on Ethereum, Arbitrum One, Base, BNB Chain, Avalanche, Monad, Arc, Robinhood Chain and Solana, plus quotes and unsigned swap transactions on the eight EVM chains.

Every data tool takes a `chain`. Nothing signs or sends: `chord_swap_tx` returns a transaction for the taker's own wallet.

## Add it

**Claude Code**

```bash
claude mcp add --transport http chord https://api.getchord.xyz/v1/mcp
```

**Any client that takes a config**

```json
{
  "mcpServers": {
    "chord": {
      "type": "http",
      "url": "https://api.getchord.xyz/v1/mcp",
      "headers": { "X-API-Key": "optional: raises the rate limit; chord_ask needs it" }
    }
  }
}
```

The server is stateless Streamable HTTP with JSON answers. It needs no session and no OAuth: the handshake and the tool list work without credentials.

## One URL per chain

Add `?chain=` and the endpoint defaults to that chain. `chain` stops being a required argument and the server names itself after the chain.

```
https://api.getchord.xyz/v1/mcp?chain=arc
https://api.getchord.xyz/v1/mcp?chain=monad
https://api.getchord.xyz/v1/mcp?chain=solana
```

Keys: `monad`, `robinhood`, `arc`, `avalanche`, `base`, `bnb`, `arbitrum`, `ethereum`, `solana`. A call may still pass another `chain`.

## Discovery

Clients and registries can find the server without being given the URL:

- **Server card** ([MCP SEP-2127](https://modelcontextprotocol.io/seps/2127-mcp-server-cards)): [`https://api.getchord.xyz/v1/mcp/server-card`](https://api.getchord.xyz/v1/mcp/server-card) gives the name, version, transport, protocol versions and the optional key header. It has no tool list: read that live with `tools/list`.
- **AI catalog**: [`https://getchord.xyz/.well-known/ai-catalog.json`](https://getchord.xyz/.well-known/ai-catalog.json) lists this server and the [Docs MCP](/docs/agents/docs-mcp/), each with its card.
- **API catalog** (RFC 9727): [`https://getchord.xyz/.well-known/api-catalog`](https://getchord.xyz/.well-known/api-catalog) links the REST API, both MCP servers, their docs and status.
- **MCP Registry**: `io.github.getchordlabs/chord`.

## Keys and limits

A tool call is an ordinary API request made as you. Without a key it runs at the anonymous limit of the address you call from. With `X-API-Key` (or `Authorization: Bearer <key>`, or `?apiKey=` for connectors that cannot set a header) it is metered and limited as that key. The handshake and the tool list are free. Keys come from the [developer page](https://getchord.xyz/developer).

## Tools

| Tool | Arguments | Returns |
| --- | --- | --- |
| `chord_chains` | none | every chain with its native asset, anchors, and which capabilities it has |
| `chord_status` | none | per chain: routing engine state and how far the newest indexed trade is behind the chain |
| `chord_overview` | `chain` | last 24 hours: volume, swaps, venue share, hourly buckets |
| `chord_tokens` | `chain`, `sort`, `limit` | the 24h token board |
| `chord_search` | `chain`, `query` | tokens matching a symbol, name or address |
| `chord_token` | `chain`, `address` | one token: price, volume, trades, pools or venues |
| `chord_trades` | `chain`, `address`, `limit` | the newest swaps of a token |
| `chord_candles` | `chain`, `address`, `tf`, `limit` | OHLCV candles from Chord's index |
| `chord_wallet` | `chain`, `wallet` | realised and open PnL per token |
| `chord_wallet_trades` | `chain`, `wallet` | a wallet's recent swaps |
| `chord_smart_money` | `chain`, `days`, `limit` | wallets ranked by profit, bots removed |
| `chord_holders` | `chain`, `address`, `limit` | balances by address |
| `chord_lp_pools` | `chain`, `limit` | pools ranked for a liquidity provider |
| `chord_lp_positions` | `chain`, `wallet` | a wallet's liquidity positions |
| `chord_quote` | `chain`, `tokenIn`, `tokenOut`, `amount`, `slippageBps`, `taker` | the best quote; Chord's router first, another aggregator only when Chord cannot route |
| `chord_swap_tx` | `quoteId` or the pair and amount, `taker` | the unsigned transaction, its approval and a simulation |
| `chord_ask` | `question`, `wallet` | the analyst's researched answer (needs a key) |

Amounts are integer strings in the token's smallest unit. The zero address is the native asset on EVM chains. Solana addresses are base58 and case-sensitive.

## Not every chain has everything

`chord_chains` returns the live list. A tool called for a chain that lacks the capability answers with the chains that have it, for example: `base has no holders data. Chains with it: robinhood, arc.`

| Capability | Monad | Robinhood | Arc | Avalanche | Base | BNB | Arbitrum | Ethereum | Solana |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Overview, tokens, search, token, trades, candles, wallet | yes | yes | yes | yes | yes | yes | yes | yes | yes |
| Wallet trades | yes | yes | yes | yes | yes | yes | yes | yes | yes |
| Smart money | yes | yes | yes | no | no | no | no | no | yes |
| Holders | no | yes | yes | no | no | no | no | no | no |
| LP pools and positions | yes | yes | yes | no | no | no | no | no | yes |
| Quote and swap transaction | yes | yes | yes | yes | yes | yes | yes | yes | no |

Solana swaps are open on REST, not yet in the MCP tools: [`GET /v1/sol/trade/quote`](/docs/networks/solana/) answers with the unsigned transaction, the wallet signs it unchanged and `POST /v1/sol/trade/send` relays it. `chord_quote` called for Solana answers with those steps, and `chord_chains` lists Solana's `quote` and `swap` as those two routes.

The same table as data: [`GET /v1/chains`](/docs/api-reference/).

## What an answer looks like

Each tool returns one JSON text block: the chain, the REST route that produced it, and that route's body.

```json
{ "chain": "arc", "route": "GET /v1/arc/overview", "data": { "chain": 5042, "last24h": { "volUsd": 15625106.36, "swaps": 133764 } } }
```

The `route` is the endpoint to call if you want the same data without MCP. Large answers are shortened by dropping rows from the end of long lists, with a count of what was dropped; the JSON is always valid.

## Clients that only speak stdio

`chord-agent` in the Chord repository is a stdio bridge to the same hosted server: it lists and calls the tools above over HTTP, so it never goes out of date. It is not on npm yet. From a checkout:

```bash
cd packages/agent && pnpm install && pnpm build
claude mcp add chord -- node /absolute/path/to/packages/agent/dist/mcp.js
```

Environment: `CHORD_API_KEY` (optional), `CHORD_CHAIN` (optional default chain), `CHORD_API_URL` (default `https://api.getchord.xyz`).

## Related

- [Function calling](/docs/agents/function-calling/): the same tools as an OpenAI-style manifest.
- [Docs MCP](/docs/agents/docs-mcp/): a second hosted server that answers questions about this documentation.
- [Status](https://getchord.xyz/status): uptime of the API on every chain, measured every minute from outside Chord's servers.
