> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ryvo.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Herramientas del MCP

> Qué puede hacer el servidor MCP de Ryvo, qué scope pide cada herramienta, cómo cuentan contra tu límite de peticiones y cómo reportan errores.

El servidor expone 27 herramientas curadas, no una por cada endpoint de la API. Los nombres están en inglés, igual que la API.

## Tu key decide lo que ve el asistente

* **`tools/list` sólo devuelve las herramientas que los scopes de la key permiten.** Con una key de sólo lectura, el asistente ni siquiera sabe que existe `create_call`.
* **Cada `tools/call` vuelve a comprobar el scope.** Un cliente que llama a una herramienta que no se le mostró recibe un error `insufficient_scope`, no el resultado.

Para cambiar lo que puede hacer un asistente, cambia la key: crea otra con otros scopes en **Configuración > API keys** y cámbiala en la configuración de tu cliente. Los scopes se explican en [Autenticación](/es/authentication#scopes).

## Catálogo de herramientas

| Herramienta | Scope | Notas |
| - | - | - |
| `get_account` | ninguno (cualquier key válida) | Tu cuenta, tu plan y los scopes de la key |
| `list_agents`, `get_agent` | `agents:read` | Filtros: runtime, estado |
| `list_calls` | `calls:read` | Filtros: estado, agente, fechas desde/hasta, teléfono, canal. Sin transcripciones |
| `get_call` | `calls:read` | Incluye la transcripción, envuelta como [contenido no confiable](/es/mcp/security#las-transcripciones-son-contenido-no-confiable) |
| `get_call_stats` | `calls:read` | Totales por estado, duración y créditos, en general y por agente, para un rango de fechas (por omisión: los últimos 30 días), en una sola llamada |
| `list_conversations`, `get_conversation` | `conversations:read` | Llamadas y chats. `get_conversation` envuelve los mensajes como contenido no confiable |
| `list_knowledge` | `knowledge:read` | Filtros: carpeta, estado, origen |
| `list_phone_numbers` | `phone_numbers:read` | |
| `list_campaigns`, `get_campaign` | `campaigns:read` | Filtro: estado. `get_campaign` incluye el estado de cada destinatario |
| `list_webhooks`, `list_webhook_deliveries` | `webhooks:read` | Entregas con filtro por estado y evento |
| `get_billing_summary` | `billing:read` | Plan, saldo de créditos y consumo por día (por omisión: los últimos 30 días) |
| `list_voices` | `voices:read` | Filtros: proveedor, idioma, género, nombre, recomendadas |
| `list_models` | ninguno (cualquier key válida) | Los modelos de lenguaje y su precio por plan |
| `create_agent`, `update_agent`, `publish_agent` | `agents:write` | |
| `add_knowledge_document` | `knowledge:write` | Desde una URL pública o desde texto |
| `assign_phone_number` | `phone_numbers:write` | Asigna un número a un agente, o se lo quita |
| `create_webhook`, `retry_webhook_delivery` | `webhooks:write` | `create_webhook` devuelve el secreto de firma una sola vez |
| `create_call` | `calls:write` | **Hace una llamada real y gasta créditos.** Pide confirmación |
| `create_batch_call`, `cancel_batch_call` | `campaigns:write` | **Lanza o detiene una campaña.** Pide confirmación |

Las herramientas de lectura llevan la anotación MCP `readOnlyHint`. Las tres que actúan sobre llamadas reales llevan `destructiveHint` y `openWorldHint`, así que los clientes que respetan las anotaciones pueden preguntarte antes de correrlas; `update_agent`, `publish_agent` y `assign_phone_number` también llevan `destructiveHint`, porque cambian lo que usan las llamadas en vivo. Cómo funciona la confirmación de las tres está en [Seguridad y gasto](/es/mcp/security).

## Pide resúmenes, no páginas

Las herramientas están hechas para que el asistente obtenga su respuesta en pocas llamadas:

* Las herramientas de lista devuelven **50 elementos por omisión**, hasta 100 por llamada, aceptan los filtros de la tabla y devuelven un `next_cursor` para la página siguiente.
* Las listas dejan fuera los campos pesados: `list_calls` no incluye transcripciones. Pide una llamada con `get_call` cuando necesites lo que se dijo.
* **`get_call_stats`** contesta preguntas agregadas («¿cuántas llamadas fallaron ayer?», «¿qué agente gastó más esta semana?») en **una sola llamada**, en vez de paginar cientos de llamadas. Cuenta hasta 1,000 llamadas por rango; si había más, lo dice con `truncated: true` y el total real en `calls_in_range`, para que el asistente acote el rango.

## Límites de peticiones

El MCP no tiene un límite aparte: usa el bucket de tu cuenta, el mismo que la API.

* **Cada llamada a una herramienta cuenta como una petición** contra el límite por minuto de tu plan, una vez, nunca más.
* `initialize`, `tools/list` y el resto del protocolo no cuentan.
* En las tres herramientas que piden confirmación sólo cuenta la llamada que se ejecuta. El paso de confirmación no.
* El tope por IP de la API aplica a toda petición, también a `initialize` y `tools/list`.

Las cifras por plan y cómo se rellena el bucket están en [Límites de peticiones](/es/rate-limits). Un asistente que pagina llamadas una por una se acaba el bucket rápido; uno que pregunta a `get_call_stats`, no.

## Errores

Cuando una herramienta falla, el servidor no rompe la sesión MCP: devuelve un resultado de herramienta normal con **`isError: true`** y el mismo sobre que la API, como `structuredContent` y como texto:

```json theme={null}
{
  "error": "insufficient_scope",
  "message": "This API key is missing the `calls:write` scope. Create a key with that permission from Settings › API keys.",
  "request_id": "f0c0a9d2-8b1e-4d8a-9c2f-6e5b7a1d2c3b"
}
```

El asistente puede leer `error` y decidir qué hacer: esperar tras un `rate_limit_exceeded`, decirte que la key necesita otro scope tras un `insufficient_scope`, corregir un argumento tras un `invalid_body`, pedir un token nuevo tras un `invalid_confirmation`, o detenerse tras un `key_budget_exhausted`. La lista completa de códigos está en [Errores](/es/errors). Si nos reportas un problema, mándanos el `request_id`.

Un resultado exitoso trae su JSON igual: en `structuredContent` y como texto.

Una key que falta, inválida o revocada nunca llega a las herramientas: la petición HTTP misma se rechaza con `401`.
