Servidor MCP
Un servidor nativo de Model Context Protocol, para que un agente de codificación pueda leer el feed emparejado y las oportunidades en vivo sin escribir un cliente. Gratis en todos los planes.
La API es también un servidor nativo de Model Context Protocol. Un agente de codificación como Claude o Cursor puede llamar al feed emparejado, a las oportunidades, y al resto del catálogo como herramientas, sin código de cliente. El servidor es gratis en todos los planes: el listado de herramientas está abierto a cualquier clave, y los datos que devuelve cada herramienta están limitados según el nivel de tu clave.
El servidor funciona sobre Streamable HTTP en https://api.dino.markets/v2/mcp/ (nota la barra final — los clientes/escáneres MCP estrictos pueden recibir un 502 en la redirección de /v2/mcp sin barra → /v2/mcp/).
Conecta
Autentícate con tu clave de API como token bearer, la misma clave que usa la API REST. La mayoría de los clientes MCP se conectan a través de mcp-remote, que conecta tu cliente local con el endpoint HTTP:
{
"mcpServers": {
"dino-markets": {
"command": "npx",
"args": [
"mcp-remote",
"https://api.dino.markets/v2/mcp/",
"--header",
"Authorization:Bearer ${DINO_API_KEY}"
],
"env": { "DINO_API_KEY": "sk_live_..." }
}
}
}
Un cliente que hable Streamable HTTP directamente puede apuntar a la URL y enviar Authorization: Bearer sk_live_... él mismo, sin mcp-remote.
Herramientas
Cada herramienta refleja un endpoint REST. Cinco leen el catálogo y son gratis para cualquier clave activa; watch_markets emite un ticket de stream y necesita un plan de pago. No hay una herramienta separada de listado de pares en v2; el detalle de pares está integrado en get_market.
| Herramienta | Hace | Plan |
|---|---|---|
list_markets | El catálogo emparejado entre plataformas como objetos de mercado canónicos, filtrable por deporte, liga, status, y signal. Refleja GET /v2/markets. | Cualquier clave activa |
find_arbitrage | Arbitrajes confirmados entre plataformas, filtrable por deporte. Devuelve objetos de mercado canónicos donde signal es "arb": paridad confirmada, ningún riesgo de resolución bloqueante, potential_arb_pct poblado. Refleja GET /v2/markets?signal=arb. | Cualquier clave activa |
get_market | El objeto de mercado canónico de un mercado por id (dino_<uuid> o UUID sin adornos, de list_markets o find_arbitrage), con divulgación de resolución, ids de plataforma, y profundidad. Léelo antes de operar. Refleja GET /v2/pairs/{market_id}. | Cualquier clave activa |
list_leagues | Los deportes y ligas en temporada, con conteos de open/live/settled por deporte. Refleja GET /v2/leagues. | Cualquier clave activa |
get_coverage | El censo de cobertura por plataforma: cada liga enfrentada en Kalshi (conectada o no) con su estado de agregación, más el excedente de Polymarket a nivel de deporte. Refleja GET /v2/coverage. | Cualquier clave activa |
report_bad_arb | Marca una oportunidad que parece incorrecta. opp_id toma el valor id del mercado. Refleja POST /v2/report-bad-arb. | Cualquier clave activa |
watch_markets | Emite un ticket para el stream de WebSocket en tiempo real y devuelve el ws_url más los canales permitidos de tu nivel. Trata allowed.channels en el resultado como la fuente de verdad; los tokens Basic y Pro obtienen los canales markets:* del feed emparejado de v2. Refleja POST /v1/stream/token (sin cambios en v2). | Basic, Pro |
Los datos que devuelve una herramienta coinciden con su endpoint REST, así que find_arbitrage y list_markets devuelven ambos objetos de mercado (signal, potential_arb_pct, outcomes). El detalle de resolución es propio de cada plataforma; llama a get_market (o al endpoint REST /v2/pairs/{market_id}) para el detalle completo de riesgo divulgado si tu agente necesita inspeccionar divergencias antes de ejecutar.
Cómo se refleja el nivel
Una herramienta MCP devuelve datos, no un status HTTP, así que cuando tu clave no tiene derecho, la herramienta igual responde, con el status en el cuerpo. Una clave Free que llama a watch_markets recibe un 402 y la URL de upgrade en lugar de un error que el agente no puede leer. Así el agente puede ramificar según el resultado y decirte que hagas upgrade.
Para una visión general legible por agentes de todo el producto, apunta a tu agente a /llms.txt.