# Hosted MCP server

`POST https://api.getchord.xyz/v1/mcp`

Source: https://getchord.xyz/docs/api-reference/operations/mcp/

Model Context Protocol over stateless Streamable HTTP: POST one JSON-RPC message (or a batch of up to 20), get JSON back. Methods: `initialize`, `ping`, `tools/list`, `tools/call`. 17 tools; every data tool takes a `chain`. `?chain=<key>` pins a default chain and names the server `chord-<key>`. The handshake and the tool list need no credentials and are not metered; a tool call is an ordinary request to this API made as the caller, so it is limited and metered exactly like the REST call it wraps. Send a key as `X-API-Key`, `Authorization: Bearer`, or `?apiKey=`. A tool-level failure is a normal result with `isError: true` and a sentence the model can act on. Guide: https://getchord.xyz/docs/agents/mcp/

## Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `chain` | query | no | `monad` · `robinhood` · `arc` · `avalanche` · `base` · `bnb` · `arbitrum` · `ethereum` · `solana` | Default chain for this endpoint. |
| `apiKey` | query | no | string | Your key, for connectors that cannot set a header. |

## Request body (JSON)

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "chord_search",
    "arguments": {
      "query": "EURC"
    }
  }
}
```

## Response 200

The JSON-RPC response. A tool result carries one text block: `{chain, route, data}` as JSON.

Example (captured from the live API):

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\"chain\":\"arc\",\"route\":\"GET /v1/tokens/search\",\"data\":{\"chain\":5042,\"q\":\"EURC\",\"tokens\":[{\"address\":\"0xbef5f6d51cb62b58e6a8f77868681825c6fe21c1\",\"symbol\":\"EURC\",\"name\":\"Euro Coin\",\"decimals\":6,\"logoURI\":\"https://assets.coingecko.com/coins/images/26045/small/euro.png\",\"verified\":true}]}}"
      }
    ]
  }
}
```

## Response 202

A notification: nothing to answer.

- **400**: Invalid parameters — `error` names the check that failed (`INVALID_PARAMS`, `BAD_ADDRESS`, `BAD_LIMIT`, `BAD_HOURS`, …).
