Cómo conectar un agente de IA a Telegram por MCP: guía
Conectar un agente de IA a tu canal por MCP: qué preparar antes, pasos para claude.ai, ChatGPT, Claude Code y Cursor, y qué hacer si una herramienta se niega.
En corto. Antes de que se conecte ningún cliente, tres cosas tienen que ser ciertas: el workspace tiene un bot propio, ese bot es administrador del canal, y el propietario ha pulsado Start en el chat privado con él. Después eliges la vía — la dirección del servidor
https://backend-git-production-cb93.up.railway.app/mcpcomo conector personalizado con inicio de sesión por Telegram, o una clave en el encabezadoAuthorizationdesde Ajustes → Agentes de IA (MCP). Luego aparecen catorce herramientas: cinco leen el canal, siete trabajan con publicaciones, dos leen la audiencia. Nada de productos, pedidos ni chats privados, y nada de nada sin bot. Pasos de los clientes comprobados el 8 de septiembre de 2026.
Esta es la mitad práctica de la comparación de servidores MCP para Telegram: allí se decide si la vía del bot es la que quieres, y aquí te conectas y ves qué hacer cuando no sale.
Antes de conectar
Casi todas las negativas ocurren aquí, antes de la primera llamada a una herramienta.
El workspace necesita un bot propio. El servidor MCP de AdminHub publica a través del bot que el dueño del canal creó para su propio canal — nunca a través de un bot compartido de AdminHub y nunca a través de tu cuenta personal. Sin bot las herramientas no se degradan en silencio: se niegan con bot_required y un enlace que crea el bot en un toque, telegram.me/tg_adminhub_bot?startapp=bot. get_workspace es la excepción y responde igualmente, para que un agente pueda descubrir qué falta.
El bot tiene que ser administrador del canal. Un bot que solo es miembro no puede publicar, y Telegram no dice nada al respecto hasta que falla un envío. Justo por eso list_channels lleva la marca bot_is_admin en cada canal, y create_post rechaza un canal donde está apagada, con channel_not_postable, en vez de aceptar una publicación que se perdería después.
El chat privado del propietario con el bot tiene que estar abierto. Esto solo importa para las imágenes, y la regla es de Telegram, no nuestra: un bot solo puede obtener un file id de un archivo que ha enviado él mismo. Por eso add_post_image descarga la imagen, la reenvía una vez por el chat del propietario con el bot para conseguir ese id, la adjunta a la publicación y borra el mensaje reenviado. Si el propietario nunca pulsó Start ahí, la herramienta se niega antes de descargar nada, con owner_bot_not_started.
El efecto secundario merece decirse en voz alta: cada imagen que adjunta un agente llega, brevemente y con notificación, al chat del propietario con su propio bot. Se borra después, pero fue entregada, y quien no pidió ninguna imagen se preguntará de dónde salió. get_workspace informa owner_dm_open, así que esto se comprueba antes de una llamada fallida.
Dos formas de conectarse
Por la dirección del servidor, sin clave. Para claude.ai, ChatGPT, Claude Desktop y Claude Code. Añades un conector personalizado que apunta a https://backend-git-production-cb93.up.railway.app/mcp, se abre una página de AdminHub, y entras con Telegram, eliges un workspace y pulsas Permitir. Un workspace sin bot aparece en la lista pero no se puede elegir: no habría con qué publicar. El acceso cubre los tres permisos de una vez: channel:read, posts:write y audience:read.
Por clave en el encabezado. Para Claude Code, Cursor y todo lo que envíe un encabezado Authorization. Abre Ajustes → Agentes de IA (MCP) → Crear clave. Se muestra exactamente una vez y no hay segunda mirada: la base de datos guarda solo un hash. Ambas vías se revocan en el mismo sitio, y una conexión revocada deja de funcionar al instante.
Una cosa conviene planificarla antes: una clave y una conexión por dirección cuentan las dos como conexiones, y Free permite una.
claude.ai
Customize → Connectors → Add custom connector → pega la dirección → Add. Los valores por defecto de autenticación sirven: el servidor acepta tanto los metadatos de cliente alojados por Anthropic como el registro dinámico, así que no hay nada que rellenar a mano. Después conectas, completas el inicio de sesión por Telegram y lo activas en el chat donde lo quieras.
Los conectores personalizados funcionan en Free, Pro, Max, Team y Enterprise, con Free limitado a uno. En Team y Enterprise solo un Owner añade uno, desde Organization settings → Connectors; el resto se conecta después desde su propia página de Connectors.
ChatGPT
Los conectores pasaron a llamarse Apps en julio de 2026, y un servidor MCP personalizado necesita además el modo desarrollador: Settings → Security and login → Developer mode, y luego creas la app desde Apps, dándole la dirección del servidor con OAuth como mecanismo de autenticación. En un workspace, un administrador activa el modo desarrollador en Permissions & Roles y publica la app desde los ajustes del workspace.
Dos límites que conviene conocer antes: esto es una función web y no tiene soporte móvil; y el MCP completo — la mitad que escribe — está hoy disponible para cuentas Business y Enterprise/Edu, mientras que una cuenta Pro conecta un servidor solo con permisos de lectura y fetch. En Pro, cuenta con que las herramientas de lectura funcionen y las de publicación no.
Claude Desktop
El mismo flujo de conectores que en claude.ai, no un archivo de configuración: claude_desktop_config.json es para servidores stdio locales, y este no lo es. Claude llega a un conector remoto desde la infraestructura de la propia Anthropic y no desde tu máquina, lo que aquí no cambia nada, porque esta dirección es pública.
Claude Code
Claude Code lo hace de las dos formas, y conviene saberlo antes de crear una clave que quizá no necesites. Con una:
claude mcp add --transport http adminhub https://backend-git-production-cb93.up.railway.app/mcp --header "Authorization: Bearer <clave>"
Sin clave, añade el mismo servidor sin encabezado y deja que Claude Code haga el inicio de sesión por su cuenta:
claude mcp add --transport http adminhub https://backend-git-production-cb93.up.railway.app/mcp
y luego ejecuta /mcp y sigue el flujo en el navegador. Quédate con la clave si la conexión debe durar más que una sesión de navegador; quédate con el inicio de sesión si prefieres no tener un secreto en un archivo de configuración.
Cursor y otros clientes con encabezado
Cursor lee ~/.cursor/mcp.json para todos los proyectos y .cursor/mcp.json para uno solo. Un servidor remoto es una entrada con url y headers — no hay campo de transporte; lo que la hace remota es la url:
{
"mcpServers": {
"adminhub": {
"url": "https://backend-git-production-cb93.up.railway.app/mcp",
"headers": {
"Authorization": "Bearer ${env:ADMINHUB_MCP_KEY}"
}
}
}
}
Cursor interpola ${env:...} dentro de url y de headers, así que la clave puede vivir en el entorno y no en un archivo que podrías acabar subiendo al repositorio. Cualquier otra cosa que hable Streamable HTTP se conecta igual: la dirección, más la clave como bearer token.
Las catorce herramientas
| Herramienta | Qué hace |
|---|---|
get_workspace | Workspace, plan, estado del bot, owner_dm_open, publicaciones por MCP usadas este mes |
list_channels | Todos los canales, con número de suscriptores, bot_is_admin e is_active |
get_channel_stats | Totales y altas y bajas día a día, ventana de hasta 90 días |
list_posts | Publicaciones recientes, filtrables por canal o estado |
get_post | El texto de una publicación, el estado de entrega y el error por canal |
create_post | Texto a uno o varios canales: borrador, programado o enviado ya |
publish_post | Envía un borrador guardado |
update_post | Reescribe el texto, el título o la hora de una publicación en borrador, programada o fallida |
edit_published_post | Reescribe una publicación que ya está en el canal |
cancel_post | Borra una publicación en borrador, programada o fallida — las publicadas se quedan |
retry_post_delivery | Reintenta los canales donde la entrega falló o se canceló |
add_post_image | Adjunta una imagen desde una URL, reenviada por el chat del propietario |
list_subscribers | Los suscriptores de un canal por nombre, nombre de usuario e identificador de Telegram |
get_subscriber | Lo mismo para una sola persona |
El texto de la publicación es HTML de Telegram, nunca Markdown, y las horas programadas llevan un desplazamiento UTC. La publicación va por cola: las herramientas de escritura responden al momento y la entrega llega en menos de un minuto, así que el resultado se lee desde get_post.
Lo que no hace
Ni productos, ni pedidos, ni mini-CRM, ni base de conocimiento: las mitades de comercio y de soporte con IA de AdminHub no se exponen por MCP en absoluto. Ni chats privados, ni chats arbitrarios, ni historial de mensajes: ninguna herramienta de aquí toca una conversación, y en eso está toda la diferencia entre esto y un servidor userbot.
Los datos de audiencia merecen línea propia, porque la frontera que hay dentro es fácil de pasar por alto. Nombres, nombres de usuario e identificadores de Telegram vuelven bajo audience:read; el gasto y el valor de por vida no vienen con ellos, y aparecen solo cuando el agente pasa include_spend en esa llamada. Es una frontera deliberada, y el momento de sopesarla es antes de conectar, no después de que un agente haya resumido a tus mejores clientes.
Cuando no funciona
Todas las herramientas se niegan con bot_required. El workspace no tiene bot. El error ya trae el enlace, y nada más funciona mientras el bot no exista.
Se creó una publicación pero nunca llegó. Espera un minuto — la entrega va por cola — y llama a get_post para leer el status y el error de cada canal. La causa de siempre es un bot que ya no es administrador ahí. Devuelve los permisos y luego retry_post_delivery.
Una imagen no se adjunta. owner_bot_not_started significa que el propietario nunca ha abierto un chat privado con el bot del workspace. Pídele que lo abra y pulse Start; owner_dm_open en get_workspace lo confirma. owner_unreachable es el caso vecino: el chat estaba abierto y el bot ha sido bloqueado desde entonces.
plan_limit_reached. Free permite una conexión y treinta publicaciones creadas mediante MCP al mes. El contador cuenta la creación, así que los borradores también cuentan; las publicaciones cuyo envío falló, no. El límite de conexiones abarca las dos vías — una clave y una conexión por dirección ocupan por igual la única plaza — y la segunda se rechaza al crearla, no al llamarla. Pro no tiene ninguno de los dos límites.
El agente no ve a los suscriptores. O la conexión no tiene audience:read — las claves emitidas antes de que ese permiso existiera llevan solo los dos antiguos, y se arregla con una clave nueva — o el cliente pidió un conjunto parcial de permisos durante el inicio de sesión, y este servidor rechaza eso por entero en vez de conceder un acceso recortado en silencio. Conéctate de nuevo pidiendo los tres.
La página de MCP tiene la dirección, la lista de herramientas y las preguntas frecuentes; la clave está a dos toques en los ajustes.
Fuentes
Pasos de los clientes comprobados el 8 de septiembre de 2026 con la documentación de cada proveedor: el centro de ayuda y la documentación de conectores de Anthropic para claude.ai y Claude Desktop, la documentación de MCP de Claude Code para claude mcp add, la guía de modo desarrollador y el centro de ayuda de OpenAI para las apps de ChatGPT, y la documentación de MCP de Cursor para el formato de mcp.json. El comportamiento del propio AdminHub — las catorce herramientas, las negativas citadas arriba, los permisos y los límites de Free — sale de la página de MCP.
Lo que la gente suele preguntar
- ¿Qué necesito antes de conectar el servidor MCP de AdminHub?
- Tres cosas, y las tres son sobre el bot. El workspace necesita un bot propio de Telegram: el agente publica a través de él, nunca a través del bot compartido de AdminHub, y sin bot cada herramienta se niega con bot_required. Ese bot tiene que ser administrador de cada canal donde quieras publicar, o create_post rechaza el canal de entrada. Y el chat privado del propietario con ese bot tiene que estar abierto, es decir, que pulsó Start al menos una vez: eso es lo que hace posible adjuntar imágenes.
- ¿Hace falta una clave para conectarse?
- Solo para los clientes que se conectan por encabezado. claude.ai, ChatGPT, Claude Desktop y Claude Code aceptan la dirección del servidor por sí sola y hacen su propio inicio de sesión: se abre una página de AdminHub, entras con Telegram, eliges un workspace y concedes el acceso. Claude Code, Cursor y cualquier otro que envíe un encabezado Authorization pueden usar una clave en su lugar. La clave se crea en Ajustes, Agentes de IA (MCP), Crear clave, y se muestra una sola vez: la base de datos guarda solo un hash, así que una clave perdida no se recupera, se emite otra.
- ¿Qué ve el agente sobre mis suscriptores?
- Nombres, nombres de usuario e identificadores de Telegram — y solo bajo el permiso aparte audience:read: una conexión sin él recibe un error de permisos, no una lista vacía. Los campos de dinero, es decir, el gasto total, el valor de por vida y el número de pagos, se quedan fuera mientras el agente no pase include_spend en esa llamada. La frontera es deliberada: quién está suscrito y cuánto ha pagado son dos preguntas distintas, y la segunda hay que hacerla en voz alta.
- ¿Qué permite el plan Free por MCP?
- Una conexión y treinta publicaciones creadas mediante MCP al mes. Los dos números cuentan exactamente como suenan. Una clave y una conexión por dirección son dos conexiones, así que en Free tienes una de las dos, no ambas. El contador cuenta las publicaciones creadas, borradores incluidos, no las entregadas; las publicaciones cuyo envío falló no cuentan en absoluto. Pro quita los dos límites.
- El agente dice que la publicación salió, pero el canal está vacío. ¿Por qué?
- La publicación va por cola, así que espera un minuto y llama a get_post: muestra el estado y el error por separado para cada canal. La causa más habitual es que el bot ya no es administrador del canal. create_post rechaza un canal donde el bot no puede publicar, así que el caso que llega hasta la entrega es el de un bot degradado después de crear la publicación. Devuelve los permisos de administrador y llama a retry_post_delivery.