Conecta tus herramientas agénticas a Meteor
Cualquier herramienta que hable MCP — Claude, ChatGPT, Claude Code, Cursor, Windsurf, Cline, Codex o tu propio agente — se conecta directo a Meteor y trabaja en tu workspace. Opera: contesta conversaciones, busca contactos, agenda recordatorios, ejecuta Mets. Y construye: crea Mets, arma y publica flujos, programa automatizaciones y crea colecciones. Lo que no tiene tool propia lo alcanza igual, con tres tools genéricas que llaman cualquier operación de la API.
Introducción
El Model Context Protocol es un estándar abierto para que los agentes de IA descubran y usen herramientas externas de forma segura. El servidor MCP de Meteor es remoto y acepta dos formas de autenticarse: iniciar sesión en Meteor desde el cliente (OAuth, sin API key) o tu API key met_ — la misma que usas en la API REST. Cualquier cliente MCP puede conectarse; abajo está la config de los más comunes y de un agente propio.
¿No programas? La guía Usa Met desde Claude en 3 pasos explica cómo conectarlo y qué pedirle, sin tecnicismos.
El SDK y la API REST son para cuando tú escribes el código. El servidor MCP es para cuando un agente opera Meteor por su cuenta.
Conectar un cliente
Con inicio de sesión (sin API key)
Claude y ChatGPT (conectores personalizados), Claude Code y Cursor lo hacen solos: pega la URL, sin header.
https://api.met.meteor.com.co/api/v1/mcp
Sin credenciales, el servidor responde 401 con WWW-Authenticate y el cliente sigue el descubrimiento OAuth estándar (/.well-known/oauth-protected-resource → servidor de autorización → registro dinámico). La persona inicia sesión en Meteor, ve los permisos que pide el cliente y los aprueba; el token queda sobre el workspace en el que tiene la sesión abierta. Se renueva solo y se revoca en Ajustes → Desarrolladores → Apps autorizadas. Detalle del protocolo en Apps OAuth.
Con una API key, todos los clientes apuntan al mismo endpoint remoto y pasan tu key en el header Authorization. Mientras pruebas, usa una key de test (met_test_) y emítela solo con scopes de lectura: una key de test bloquea los efectos externos, pero no la escritura sobre tu workspace. Ver qué hace y qué no hace el modo de prueba.
Claude Code
Un comando desde la terminal:
claude mcp add --transport http meteor \
https://api.met.meteor.com.co/api/v1/mcp \
--header "Authorization: Bearer met_live_tu_key"
Claude Desktop
En claude_desktop_config.json:
{
"mcpServers": {
"meteor": {
"url": "https://api.met.meteor.com.co/api/v1/mcp",
"headers": { "Authorization": "Bearer met_live_tu_key" }
}
}
}
Cursor
En .cursor/mcp.json (del proyecto) o el global:
{
"mcpServers": {
"meteor": {
"url": "https://api.met.meteor.com.co/api/v1/mcp",
"headers": { "Authorization": "Bearer met_live_tu_key" }
}
}
}
Windsurf
En ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"meteor": {
"serverUrl": "https://api.met.meteor.com.co/api/v1/mcp",
"headers": { "Authorization": "Bearer met_live_tu_key" }
}
}
}
Cline (VS Code)
Desde el panel de MCP de Cline, agrega un servidor remoto con la URL y el header de autenticación — misma forma que arriba.
Codex (OpenAI)
Codex conecta servidores MCP por stdio, así que mcp-remote puentea el servidor remoto de Meteor. En ~/.codex/config.toml:
[mcp_servers.meteor]
command = "npx"
args = ["-y", "mcp-remote", "https://api.met.meteor.com.co/api/v1/mcp", "--header", "Authorization: Bearer met_live_tu_key"]
Otros clientes MCP
Cualquier cliente compatible con MCP (transport HTTP/SSE) sirve. La receta es siempre la misma: URL del servidor + header Authorization: Bearer met_….
Tu propio agente
Si construyes tu propio agente, conéctalo con un cliente MCP programático (por ejemplo, @modelcontextprotocol/sdk) y dale a tu modelo las tools de Meteor:
import { Client } from '@modelcontextprotocol/sdk/client';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp';
const client = new Client({ name: 'mi-agente', version: '1.0.0' });
await client.connect(new StreamableHTTPClientTransport(
new URL('https://api.met.meteor.com.co/api/v1/mcp'),
{ requestInit: { headers: { Authorization: `Bearer ${process.env.MET_API_KEY}` } } },
));
const { tools } = await client.listTools(); // las tools de Meteor, según tus scopes
// pasas `tools` a tu modelo y ejecutas client.callTool(...) cuando el modelo lo pida
Así tu agente descubre y ejecuta las capacidades de Meteor sin que tú cablees cada endpoint a mano.
Descubrimiento
Si tu cliente resuelve servidores por dominio en vez de por URL fija, el descriptor está publicado:
curl https://developers.meteor.com.co/.well-known/mcp.json
Trae el endpoint, el transporte, cómo autenticar y la lista de tools. Se genera del catálogo real del servidor en cada build, así que no puede quedar desactualizado respecto de lo que el servidor expone de verdad.
Junto a él va server.json, el descriptor con el formato de los registros de MCP. Es el que sirve para que un agente encuentre Meteor sin conocer este dominio.
Capacidades
El catálogo son 115 tools sobre 21 dominios, y se filtra por los scopes de tu key: si la key no tiene el scope, la tool no aparece. Esta tabla se genera del catálogo real del servidor.
| Dominio | Tools | Scopes |
|---|---|---|
| Automatizaciones | met_list_flows Listar flujosmet_run_flow Ejecutar un flujomet_get_flow_run Ver la ejecución de un flujomet_list_flow_nodes Catálogo de nodos para armar un flujomet_list_triggers Catálogo de disparadoresmet_get_flow Ver un flujo completomet_test_flow_node Probar un nodo del flujomet_publish_flow Publicar un flujomet_list_flow_runs Ejecuciones de un flujomet_cancel_flow_run Cancelar una ejecución de flujomet_list_automations Listar automatizacionesmet_get_automation Ver una automatizaciónmet_create_automation Crear una automatización (que un flujo corra solo)met_update_automation Editar, pausar o activar una automatizaciónmet_schedule_automation Cambiar el horario de una automatización recurrentemet_run_automation_now Ejecutar ya una automatización programadamet_delete_automation Eliminar una automatización | automations:read · automations:execute · automations:write |
| Contactos | met_list_contacts Listar contactosmet_get_contact Ver la ficha completa de un contactomet_create_contact Crear contactomet_update_contact Actualizar los campos de un contactomet_list_conversations Listar las conversaciones de la bandejamet_get_inbox_counts Contar las conversaciones de la bandejamet_list_notes Leer las notas internas de una conversaciónmet_add_note Dejar una nota interna en una conversaciónmet_assign_conversation Asignar una conversación a un asesor o a un grupomet_set_conversation_status Cambiar el estado de una conversación (abrir, dejar pendiente, finalizar, archivar)met_list_tags Listar las etiquetas del workspacemet_set_conversation_tags Poner o quitar etiquetas a una conversación | contacts:read · contacts:write |
| Colecciones | met_list_collections Listar coleccionesmet_get_collection Ver el esquema de una colecciónmet_create_collection Crear una colección (con sus campos)met_add_collection_field Agregar un campo a una colecciónmet_update_collection_field Editar un campo de una colecciónmet_create_collection_view Crear una vista de una colecciónmet_update_collection_view Editar una vista de una colecciónmet_update_collection Editar una colecciónmet_delete_collection_field Quitar un campo de una colecciónmet_delete_collection Borrar una colección | collections:read · collections:write |
| Ítems | met_search_items Buscar items en todo el workspacemet_list_items Listar items de una colecciónmet_get_item Ver un itemmet_create_item Crear un itemmet_update_item Actualizar un itemmet_set_item_status Pausar o reactivar un itemmet_list_item_comments Leer los comentarios de un itemmet_comment_item Comentar un itemmet_delete_item Borrar un item | items:read · items:write |
| Tareas | met_list_tasks Listar tareasmet_get_task Ver una tareamet_create_task Crear tareamet_set_task_status Cambiar el estado de una tareamet_add_task_step Agregar un paso a una tareamet_update_task_step Marcar o editar un paso de una tareamet_delete_task_step Quitar un paso de una tarea | tasks:read · tasks:write |
| Agents | met_list_agents Listar los Mets del workspacemet_list_attention_groups Listar los grupos de atención y sus asesoresmet_get_agent Ver un Met completomet_create_agent Crear un Metmet_update_agent Editar un Met (prompt, modelo, nombre, estado)met_list_agent_tools Qué acciones ve un Met | agents:read · agents:write |
| Skills | met_list_skills Listar habilidades del workspacemet_list_agent_skills Habilidades disponibles para un Metmet_link_agent_skill Darle una habilidad a un Metmet_get_skill_setup Qué le falta a una habilidad para funcionarmet_unlink_agent_skill Quitarle una habilidad a un Metmet_set_agent_disabled_tools Apagar o prender acciones de un Met | skills:read · skills:manage |
| Conversaciones | met_get_messages Leer la conversación con un contactomet_search_messages Buscar mensajes en una conversaciónmet_list_quick_replies Listar las respuestas rápidas del equipomet_save_quick_reply Crear o editar una respuesta rápidamet_delete_quick_reply Borrar una respuesta rápida | conversations:read · conversations:write |
| Funciones | met_list_functions Listar las Funciones del workspacemet_create_function Crear una Función para los Metsmet_update_function Editar una Funciónmet_link_agent_function Darle una Función a un Metmet_unlink_agent_function Quitarle una Función a un Met | functions:read · functions:write |
| Flujos | met_create_flow Crear un flujomet_update_flow Editar un flujo (borrador, nombre, descripción)met_duplicate_flow Duplicar un flujomet_import_flow Importar un flujo desde JSONmet_delete_flow Archivar (borrar) un flujo | flows:write |
| Canales | met_send_message Enviar un mensaje a un contactomet_list_channels Listar los canales y cuáles están conectadosmet_list_whatsapp_templates Ver las plantillas de WhatsApp de un canalmet_send_whatsapp_template Enviar una plantilla de WhatsApp (fuera de la ventana de 24 h) | channels:send · channels:read |
| Recordatorios | met_list_reminders Listar recordatoriosmet_create_reminder Agendar un recordatorio a un contactomet_update_reminder Reagendar o editar un recordatoriomet_cancel_reminder Cancelar un recordatorio | reminders:read · reminders:write |
| Facturación | met_get_plan_usage Plan actual y uso contra sus límitesmet_get_energy_balance Cuánta Energía quedamet_get_energy_consumption En qué se está gastando la Energíamet_list_energy_movements Movimientos de Energía (recargas, bonos, consumos) | billing:read |
| Runs | met_run_agent Ejecutar un Metmet_get_run Ver un Runmet_list_runs Historial de Runs | runs:execute · runs:read |
| Plantillas | met_list_snapshots Catálogo de plantillasmet_get_snapshot Ficha de una plantillamet_install_snapshot Instalar una plantilla | snapshots:read · snapshots:install |
| Integraciones | met_set_skill_credentials Guardar las credenciales de una habilidadmet_list_integrations Integraciones disponibles y conectadasmet_list_integration_tools Qué acciones trae una integración | integrations:manage · integrations:read |
| Eventos | met_list_events Eventos recientes de la cuentamet_get_event Ver un evento completomet_list_activity Bitácora de cambios de la cuenta | events:read |
| Variables | met_list_contact_fields Esquema de campos del CRMmet_list_variables Listar variables del workspace | variables:read |
| Handoff | met_set_autopilot Pasar la conversación a un humano (o devolverla)met_pause_autopilot Pausar el autopiloto por unos minutos | handoff:manage |
| MCP | met_whoami Con qué cuenta y qué permisos estás conectado | mcp:use |
| Archivos | met_list_assets Buscar archivos del workspace | files:read |
Las tools de la tabla tienen nombre propio: son lo que la gente hace todos los días, y tu asistente las prefiere. Para lo demás están las de la sección siguiente.
Cualquier operación de la API
El catálogo cierra con 3 tools que alcanzan cualquier operación de la API REST que no tenga tool propia: buscar la operación, ver sus parámetros y llamarla. Cada llamada pasa por la misma ruta que la API, con tu key, así que exige el scope de esa operación y respeta la idempotencia y los límites de tu plan.
| Tool | Qué hace | Scope |
|---|---|---|
met_search_operations | Buscar una operación de la API de Met | mcp:use |
met_describe_operation | Ver cómo se llama una operación de la API | mcp:use |
met_call_operation | Llamar una operación de la API de Met | mcp:use |
Si tu key es de partner
Una key de partner habla con otro endpoint, en el host de la API de Partners:
https://api.partners.meteor.com.co/mcp
Son dos servidores distintos y con qué key te autenticas decide cuál te sirve: una key de workspace habla con el de arriba, una de partner con este. Un workspace y una cartera de clientes no comparten permisos, así que tampoco comparten catálogo — y una key de workspace apuntando aquí recibe un catálogo vacío, no un error.
Son 14 tools, todas con el prefijo met_partner_. El partner sobre el que operan sale de tu key, nunca de un argumento.
| Dominio | Tools | Scopes |
|---|---|---|
| Oportunidades | met_partner_list_leads Listar oportunidadesmet_partner_get_lead Ver una oportunidadmet_partner_create_lead Crear una oportunidadmet_partner_list_lead_comments Leer el hilo de una oportunidadmet_partner_comment_lead Escribir en el hilo de una oportunidad | partner:leads:read · partner:leads:write |
| Soporte | met_partner_list_tickets Listar ticketsmet_partner_get_ticket Ver un ticketmet_partner_reply_ticket Responder un ticket | partner:support:read · partner:support:write |
| Proyectos | met_partner_list_projects Listar proyectosmet_partner_list_project_tasks Tareas de un proyecto | partner:projects:read |
| Clientes | met_partner_list_clients Listar clientes atribuidos | partner:clients:read |
| Comisiones | met_partner_list_commissions Listar comisiones | partner:commissions:read |
| Pagos | met_partner_list_payouts Listar liquidaciones | partner:payouts:read |
| Comunidad | met_partner_get_community_event Sesión de esta semana en la Comunidad | partner:community:read |
Cómo se comporta
El catálogo tiene dos partes: las tools curadas van primero y son las que tu asistente prefiere; las genéricas lo cierran.
- Tools curadas por dominio: conversaciones y canales, Mets (con sus habilidades y Funciones), flujos y automatizaciones, datos (colecciones, campos, vistas, items y tareas) y cuenta (plan, Energía, integraciones, eventos). Cada una dice cuándo usarla, con cuál va en pareja y si gasta Energía o tiene costo con Meta. El catálogo crece por dominio; la tabla de Capacidades es la lista vigente.
- Tres genéricas al final:
met_search_operations→met_describe_operation→met_call_operation. Buscan una operación del contrato público por texto (en español o inglés), muestran sus parámetros, su scope y un ejemplo, y la llaman. Son para lo que no tiene tool curada.
Anotaciones y confirmación
Cada tool declara las anotaciones de MCP: readOnlyHint (solo lee), destructiveHint (borra o sobrescribe), idempotentHint y openWorldHint (tiene efecto fuera de Meteor: un WhatsApp, un correo, un gasto). Los clientes las usan para decidir cuándo pedirle permiso a la persona.
Lo que no se deshace exige además confirm: true en los argumentos: borrar (flujos, automatizaciones, colecciones, campos, items, pasos, respuestas rápidas), publicar un flujo, sobrescribir su borrador, ejecutar ya una automatización, instalar un snapshot, importar en lote, etiquetar en masa, crear una difusión o reemplazar credenciales. En la genérica, todo DELETE lo exige. Sin confirm, la llamada falla sin tocar nada y el error dice qué se perdería; la descripción de cada tool le pide al modelo confirmarlo con la persona antes de repetir.
Respuestas y reintentos
- Tope de ~20.000 caracteres por respuesta. Si una respuesta no cabe, se recorta conservando JSON válido: primero se acortan las listas, después los textos largos. La respuesta sale envuelta como
{ "truncated": true, "note": "…", "data": … }y la nota dice cuántos elementos se mostraron, para que el modelo pida la página siguiente o filtre. - Idempotencia automática. Las escrituras pasan por la misma ruta que la API con una
Idempotency-Keyque el servidor deriva de la tool, sus argumentos y la petición. Si tu cliente reintenta la misma llamada, la escritura no se duplica: recibe la respuesta de la primera. - Los mismos controles que la API. Cada llamada exige el scope de su operación y respeta el modo prueba, los límites de tu plan y el rate limit por key. Los errores llegan con el mismo
codeque en la API (missing_scope,not_found,rate_limited…) y una pista de qué hacer. - Período vencido: lectura sí, escritura no. Si el workspace queda bloqueado por un período vencido, el servidor sigue respondiendo y las lecturas funcionan. Las escrituras responden
403 workspace_blocked, y la pista le dice al modelo que avise en vez de reintentar. Si la suscripción no está activa ni en prueba, la API y el MCP responden igual: sin acceso.
Lo que queda fuera
- Subidas y descargas de archivos: los bytes no pasan por el contexto del modelo. La metadata y la URL de un archivo sí.
- Lo que devuelve un secreto: crear un webhook o rotar su secreto de firma. Hazlo desde el panel o con el SDK.
- Compras y cambios de plan: no son parte del contrato público. Plan, consumo y Energía sí se consultan.
- Operaciones de partners: tienen su propio servidor (abajo, en Si tu key es de partner).
Si el modelo intenta una operación excluida, met_call_operation responde con el motivo y qué hacer en su lugar.
Dos tools que conviene conocer
met_send_messagerespeta el piloto automático: si una persona del equipo está atendiendo la conversación (piloto apagado o en pausa, o el contacto pidió un humano), responde409 autopilot_silencedy no envía nada.met_update_itemfusiona: las claves dedataque no mandas quedan como estaban. Para borrar un valor, mándalo vacío.
Seguridad
- La key —o los permisos que la persona aprobó al iniciar sesión— define el workspace y los scopes: el agente solo ve y ejecuta lo permitido.
- Las credenciales de terceros (de tus integraciones) nunca se exponen al agente — solo el resultado de las tools.
- Cada tarea ejecutada debita Energía y queda auditada, igual que en la API REST.
- Con una key de test (
met_test_) los runs del agente no debitan Energía y las tools con efecto externo —enviar por WhatsApp, ejecutar integraciones, provisionar cuentas— no aparecen en el catálogo, así que el modelo no puede ni intentarlas. - Una key de test sí escribe. Lo que queda fuera del catálogo es el efecto externo, no la escritura: si la key lleva
items:writeocontacts:write, el agente crea y edita registros reales de tu workspace, contra la misma base de producción y sin forma de revertirlos. Dale a un agente una key de test de solo lectura mientras exploras, o un workspace aparte si necesitas que escriba.
¿Prefieres escribir el código tú? Empieza por las Guías y el quickstart del SDK.