---
title: "Hosted MCP server"
method: POST
path: "/mcp"
tags: ["Agents and status"]
---

# Hosted MCP server

`POST /mcp`

## Request

- Base URL: `https://api.getchord.xyz/v1`
- URL: `https://api.getchord.xyz/v1/mcp`
- Auth: none declared

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/

## Query parameters

- `chain` 'monad' | 'robinhood' | 'arc' | 'avalanche' | 'base' | 'bnb' | 'arbitrum' | 'ethereum' | 'solana'
- `apiKey` string

## Request body

- object: A JSON-RPC 2.0 message, or an array of them.

## Response `200`

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

- object: JSON-RPC 2.0 response.

## Other responses

- `202`: A notification: nothing to answer.
- `400`: Invalid parameters — `error` names the check that failed (`INVALID_PARAMS`, `BAD_ADDRESS`, `BAD_LIMIT`, `BAD_HOURS`, …).

---

[API](https://skmtc.dev/getchord/apis/chord-api.md) · [All operations](https://skmtc.dev/getchord/apis/chord-api/llms.txt) · [OpenAPI document](https://skmtc.dev/getchord/apis/chord-api/revisions/d3bc4640fea0?raw)
