Los canales están en vista previa de investigación y requieren Claude Code v2.1.80 o posterior. Requieren inicio de sesión en claude.ai. La autenticación de consola y clave API no es compatible. Las organizaciones de equipo y empresa deben habilitarlos explícitamente.
- Descripción general: cómo funcionan los canales
- Lo que necesitas: requisitos y pasos generales
- Ejemplo: construir un receptor de webhook: un tutorial unidireccional mínimo
- Opciones del servidor: los campos del constructor
- Formato de notificación: la carga útil del evento
- Exponer una herramienta de respuesta: permitir que Claude envíe mensajes de vuelta
- Compuerta de mensajes entrantes: comprobaciones de remitente para prevenir inyección de solicitudes
- Retransmitir solicitudes de permiso: reenviar solicitudes de aprobación de herramientas a canales remotos
Descripción general
Un canal es un servidor MCP que se ejecuta en la misma máquina que Claude Code. Claude Code lo genera como un subproceso y se comunica a través de stdio. Tu servidor de canal es el puente entre sistemas externos y la sesión de Claude Code:- Plataformas de chat (Telegram, Discord): tu complemento se ejecuta localmente y sondea la API de la plataforma en busca de nuevos mensajes. Cuando alguien envía un mensaje directo a tu bot, el complemento recibe el mensaje y lo reenvía a Claude. Sin URL que exponer.
- Webhooks (CI, monitoreo): tu servidor escucha en un puerto HTTP local. Los sistemas externos envían POST a ese puerto, y tu servidor envía la carga útil a Claude.
Lo que necesitas
El único requisito difícil es el paquete@modelcontextprotocol/sdk y un tiempo de ejecución compatible con Node.js. Bun, Node y Deno funcionan todos. Los complementos precompilados en la vista previa de investigación usan Bun, pero tu canal no tiene que hacerlo.
Tu servidor necesita:
- Declarar la capacidad
claude/channelpara que Claude Code registre un oyente de notificación - Emitir eventos
notifications/claude/channelcuando algo suceda - Conectarse a través del transporte stdio (Claude Code genera tu servidor como un subproceso)
--dangerously-load-development-channels para probar localmente. Consulta Prueba durante la vista previa de investigación para obtener detalles.
Ejemplo: construir un receptor de webhook
Este tutorial construye un servidor de un solo archivo que escucha solicitudes HTTP y las reenvía a tu sesión de Claude Code. Al final, cualquier cosa que pueda enviar un POST HTTP, como una canalización de CI, una alerta de monitoreo o un comandocurl, puede enviar eventos a Claude.
Este ejemplo usa Bun como tiempo de ejecución por su servidor HTTP integrado y soporte de TypeScript. Puedes usar Node o Deno en su lugar; el único requisito es el SDK de MCP.
Escribir el servidor de canal
Crea un archivo llamado El archivo hace tres cosas en orden:
webhook.ts. Este es tu servidor de canal completo: se conecta a Claude Code a través de stdio y escucha POSTs HTTP en el puerto 8788. Cuando llega una solicitud, envía el cuerpo a Claude como un evento de canal.webhook.ts
- Configuración del servidor: crea el servidor MCP con
claude/channelen sus capacidades, que es lo que le dice a Claude Code que esto es un canal. La cadenainstructionsva al mensaje del sistema de Claude: dile a Claude qué eventos esperar, si debe responder y cómo enrutar las respuestas si debe hacerlo. - Conexión stdio: se conecta a Claude Code a través de stdin/stdout. Esto es estándar para cualquier servidor MCP: Claude Code lo genera como un subproceso.
- Oyente HTTP: inicia un servidor web local en el puerto 8788. Cada cuerpo POST se reenvía a Claude como un evento de canal a través de
mcp.notification(). Elcontentse convierte en el cuerpo del evento, y cada entradametase convierte en un atributo en la etiqueta<channel>. El oyente necesita acceso a la instanciamcp, por lo que se ejecuta en el mismo proceso. Podrías dividirlo en módulos separados para un proyecto más grande.
Registrar tu servidor con Claude Code
Agrega el servidor a tu configuración de MCP para que Claude Code sepa cómo iniciarlo. Para un Claude Code lee tu configuración de MCP al iniciar y genera cada servidor como un subproceso.
.mcp.json a nivel de proyecto en el mismo directorio, usa una ruta relativa. Para la configuración a nivel de usuario en ~/.claude.json, usa la ruta absoluta completa para que el servidor se pueda encontrar desde cualquier proyecto:.mcp.json
Probarlo
Durante la vista previa de investigación, los canales personalizados no están en la lista de aprobación, así que inicia Claude Code con la bandera de desarrollo:Cuando Claude Code se inicia, lee tu configuración de MCP, genera tu La carga útil llega a tu sesión de Claude Code como una etiqueta En tu terminal de Claude Code, verás que Claude recibe el mensaje y comienza a responder: leyendo archivos, ejecutando comandos o lo que sea que el mensaje requiera. Este es un canal unidireccional, por lo que Claude actúa en tu sesión pero no envía nada de vuelta a través del webhook. Para agregar respuestas, consulta Exponer una herramienta de respuesta.Si el evento no llega, el diagnóstico depende de lo que
webhook.ts como un subproceso, y el oyente HTTP se inicia automáticamente en el puerto que configuraste (8788 en este ejemplo). No necesitas ejecutar el servidor tú mismo.Si ves “bloqueado por política de organización”, tu administrador de equipo o empresa necesita habilitar canales primero.En una terminal separada, simula un webhook enviando un POST HTTP con un mensaje a tu servidor. Este ejemplo envía una alerta de fallo de compilación al puerto 8788 (o el puerto que configuraste):<channel>:curl devolvió:curltiene éxito pero nada llega a Claude: ejecuta/mcpen tu sesión para verificar el estado del servidor. “Falló al conectar” generalmente significa un error de dependencia o importación en tu archivo de servidor; consulta el registro de depuración en~/.claude/debug/<session-id>.txtpara el seguimiento de stderr.curlfalla con “conexión rechazada”: el puerto no está vinculado aún o un proceso antiguo de una ejecución anterior lo está manteniendo.lsof -i :<port>muestra qué está escuchando;killel proceso antiguo antes de reiniciar tu sesión.
Prueba durante la vista previa de investigación
Durante la vista previa de investigación, cada canal debe estar en la lista de aprobación para registrarse. La bandera de desarrollo omite la lista de aprobación para entradas específicas después de un mensaje de confirmación. Este ejemplo muestra ambos tipos de entrada:--channels no extiende el bypass a las entradas --channels. Durante la vista previa de investigación, la lista de aprobación es curada por Anthropic, por lo que tu canal permanece en la bandera de desarrollo mientras lo construyes y pruebas.
Esta bandera omite solo la lista de aprobación. La política de organización
channelsEnabled aún se aplica. No la uses para ejecutar canales de fuentes no confiables.Opciones del servidor
Un canal establece estas opciones en el constructorServer. Los campos instructions y capabilities.tools son MCP estándar; capabilities.experimental['claude/channel'] y capabilities.experimental['claude/channel/permission'] son las adiciones específicas del canal:
| Campo | Tipo | Descripción |
|---|---|---|
capabilities.experimental['claude/channel'] | object | Requerido. Siempre {}. La presencia registra el oyente de notificación. |
capabilities.experimental['claude/channel/permission'] | object | Opcional. Siempre {}. Declara que este canal puede recibir solicitudes de retransmisión de permisos. Cuando se declara, Claude Code reenvía solicitudes de aprobación de herramientas a tu canal para que puedas aprobar o denegar de forma remota. Consulta Retransmitir solicitudes de permiso. |
capabilities.tools | object | Solo bidireccional. Siempre {}. Capacidad de herramienta MCP estándar. Consulta Exponer una herramienta de respuesta. |
instructions | string | Recomendado. Agregado al mensaje del sistema de Claude. Dile a Claude qué eventos esperar, qué significan los atributos de la etiqueta <channel>, si debe responder y, si es así, qué herramienta usar y qué atributo pasar de vuelta (como chat_id). |
capabilities.tools. Este ejemplo muestra una configuración bidireccional con la capacidad de canal, herramientas e instrucciones establecidas:
mcp.notification() con el método notifications/claude/channel. Los parámetros están en la siguiente sección.
Formato de notificación
Tu servidor emitenotifications/claude/channel con dos parámetros:
| Campo | Tipo | Descripción |
|---|---|---|
content | string | El cuerpo del evento. Entregado como el cuerpo de la etiqueta <channel>. |
meta | Record<string, string> | Opcional. Cada entrada se convierte en un atributo en la etiqueta <channel> para el contexto de enrutamiento como ID de chat, nombre del remitente o severidad de alerta. Las claves deben ser identificadores: solo letras, dígitos y guiones bajos. Las claves que contienen guiones u otros caracteres se descartan silenciosamente. |
mcp.notification() en la instancia Server. Este ejemplo envía una alerta de fallo de compilación con dos claves meta:
<channel>. El atributo source se establece automáticamente desde el nombre configurado de tu servidor:
Exponer una herramienta de respuesta
Si tu canal es bidireccional, como un puente de chat en lugar de un reenviador de alertas, expón una herramienta MCP estándar que Claude pueda llamar para enviar mensajes de vuelta. Nada sobre el registro de herramientas es específico del canal. Una herramienta de respuesta tiene tres componentes:- Una entrada
tools: {}en las capacidades del constructorServerpara que Claude Code descubra la herramienta - Manejadores de herramientas que definen el esquema de la herramienta e implementan la lógica de envío
- Una cadena
instructionsen el constructorServerque le dice a Claude cuándo y cómo llamar a la herramienta
Habilitar el descubrimiento de herramientas
En tu constructor
Server en webhook.ts, agrega tools: {} a las capacidades para que Claude Code sepa que tu servidor ofrece herramientas:Registrar la herramienta de respuesta
Agrega lo siguiente a
webhook.ts. El import va en la parte superior del archivo con tus otras importaciones; los dos manejadores van entre el constructor Server y mcp.connect(). Esto registra una herramienta reply que Claude puede llamar con un chat_id y text:webhook.ts completo con soporte bidireccional. Las respuestas salientes se transmiten a través de GET /events usando Server-Sent Events (SSE), por lo que curl -N localhost:8788/events puede verlas en vivo; el chat entrante llega en POST /:
"webhook.ts
Compuerta de mensajes entrantes
Un canal sin compuerta es un vector de inyección de solicitudes. Cualquiera que pueda alcanzar tu punto final puede poner texto frente a Claude. Un canal que escucha una plataforma de chat o un punto final público necesita una comprobación de remitente real antes de emitir cualquier cosa. Comprueba el remitente contra una lista de permitidos antes de llamar amcp.notification(). Este ejemplo descarta cualquier mensaje de un remitente que no esté en el conjunto:
message.from.id en el ejemplo, no message.chat.id. En chats grupales, estos difieren, y la compuerta en la sala permitiría que cualquiera en un grupo permitido inyecte mensajes en la sesión.
Los canales Telegram y Discord se compuertan en una lista de permitidos de remitente de la misma manera. Inician la lista por emparejamiento: el usuario envía un mensaje directo al bot, el bot responde con un código de emparejamiento, el usuario lo aprueba en su sesión de Claude Code, y su ID de plataforma se agrega. Consulta cualquiera de las implementaciones para el flujo de emparejamiento completo. El canal iMessage toma un enfoque diferente: detecta las propias direcciones del usuario desde la base de datos de Mensajes al iniciar y las deja pasar automáticamente, con otros remitentes agregados por identificador.
Retransmitir solicitudes de permiso
La retransmisión de permisos requiere Claude Code v2.1.81 o posterior. Las versiones anteriores ignoran la capacidad
claude/channel/permission.Bash, Write y Edit. Los diálogos de confianza del proyecto y consentimiento del servidor MCP no se retransmiten; esos solo aparecen en la terminal local.
Cómo funciona la retransmisión
Cuando se abre una solicitud de permiso, el bucle de retransmisión tiene cuatro pasos:- Claude Code genera un ID de solicitud corto y notifica a tu servidor
- Tu servidor reenvía la solicitud y el ID a tu aplicación de chat
- El usuario remoto responde con un sí o no y ese ID
- Tu manejador entrante analiza la respuesta en un veredicto, y Claude Code lo aplica solo si el ID coincide con una solicitud abierta
Campos de solicitud de permiso
La notificación saliente de Claude Code esnotifications/claude/channel/permission_request. Como la notificación de canal, el transporte es MCP estándar pero el método y esquema son extensiones de Claude Code. El objeto params tiene cuatro campos de cadena que tu servidor formatea en la solicitud saliente:
| Campo | Descripción |
|---|---|
request_id | Cinco letras minúsculas extraídas de a-z sin l, por lo que nunca se lee como 1 o I cuando se escribe en un teléfono. Inclúyelo en tu solicitud saliente para que pueda ser repetido en la respuesta. Claude Code solo acepta un veredicto que lleve un ID que emitió. El diálogo del terminal local no muestra este ID, por lo que tu manejador saliente es la única forma de aprenderlo. |
tool_name | Nombre de la herramienta que Claude quiere usar, por ejemplo Bash o Write. |
description | Resumen legible por humanos de lo que hace esta llamada de herramienta específica, el mismo texto que muestra el diálogo del terminal local. Para una llamada Bash esto es la descripción de Claude del comando, o el comando en sí si no se dio ninguno. |
input_preview | Los argumentos de la herramienta como una cadena JSON, truncada a 200 caracteres. Para Bash esto es el comando; para Write es la ruta del archivo y un prefijo del contenido. Omítelo de tu solicitud si solo tienes espacio para un mensaje de una línea. Tu servidor decide qué mostrar. |
notifications/claude/channel/permission con dos campos: request_id repitiendo el ID anterior, y behavior establecido en 'allow' o 'deny'. Permitir deja que la llamada de herramienta continúe; denegar la rechaza, lo mismo que responder No en el diálogo local. Ningún veredicto afecta llamadas futuras.
Agregar retransmisión a un puente de chat
Agregar retransmisión de permisos a un canal bidireccional requiere tres componentes:- Una entrada
claude/channel/permission: {}bajo capacidadesexperimentalen tu constructorServerpara que Claude Code sepa que debe reenviar solicitudes - Un manejador de notificación para
notifications/claude/channel/permission_requestque formatea la solicitud y la envía a través de tu API de plataforma - Una comprobación en tu manejador de mensajes entrantes que reconozca
yes <id>ono <id>y emita una notificación de veredictonotifications/claude/channel/permissionen su lugar de reenviar el texto a Claude
Declarar la capacidad de permiso
En tu constructor
Server, agrega claude/channel/permission: {} junto a claude/channel bajo experimental:Manejar la solicitud entrante
Registra un manejador de notificación entre tu constructor
Server y mcp.connect(). Claude Code lo llama con los cuatro campos de solicitud cuando se abre un diálogo de permiso. Tu manejador formatea la solicitud para tu plataforma e incluye instrucciones para responder con el ID:Interceptar el veredicto en tu manejador entrante
Tu manejador entrante es el bucle o devolución de llamada que recibe mensajes de tu plataforma: el mismo lugar donde compuertas en remitente y emites
notifications/claude/channel para reenviar chat a Claude. Agrega una comprobación antes de la llamada de reenvío de chat que reconozca el formato de veredicto y emita la notificación de permiso en su lugar.La expresión regular coincide con el formato de ID que genera Claude Code: cinco letras, nunca l. La bandera /i tolera la corrección automática del teléfono capitalizando la respuesta; minúscula el ID capturado antes de enviarlo de vuelta.- Formato diferente: la expresión regular de tu manejador entrante no coincide, por lo que texto como
approve itoyessin un ID cae a través como un mensaje normal a Claude. - Formato correcto, ID incorrecto: tu servidor emite un veredicto, pero Claude Code no encuentra ninguna solicitud abierta con ese ID y lo descarta silenciosamente.
Ejemplo completo
Elwebhook.ts ensamblado a continuación combina las tres extensiones de esta página: la herramienta de respuesta, la compuerta de remitente y la retransmisión de permisos. Si estás comenzando aquí, también necesitarás la configuración del proyecto y entrada .mcp.json del tutorial inicial.
Para hacer ambas direcciones comprobables desde curl, el oyente HTTP sirve dos rutas:
GET /events: mantiene abierto un flujo SSE y envía cada mensaje saliente como una líneadata:, por lo quecurl -Npuede ver las respuestas de Claude y cualquier solicitud de permiso llegar en vivo.POST /: el lado entrante, el mismo manejador que antes, ahora con la comprobación de formato de veredicto insertada antes de la rama de reenvío de chat.
"webhook.ts
webhook.ts:
/events, incluyendo el ID de cinco letras. Apruébalo desde el lado remoto:
reply y también llega al flujo.
Las tres piezas específicas del canal en este archivo:
- Capacidades en el constructor
Server:claude/channelregistra el oyente de notificación,claude/channel/permissionopta por retransmisión de permisos,toolspermite que Claude descubra la herramienta de respuesta. - Rutas salientes: el manejador de la herramienta
replyes lo que Claude llama para respuestas conversacionales; el manejador de notificaciónPermissionRequestSchemaes lo que Claude Code llama cuando se abre un diálogo de permiso. Ambos llaman asend()para transmitir a través de/events, pero se activan por diferentes partes del sistema. - Manejador HTTP:
GET /eventsmantiene abierto un flujo SSE para que curl pueda ver la salida en vivo;POSTes entrada, compuerta en el encabezadoX-Sender. Un cuerpoyes <id>ono <id>va a Claude Code como una notificación de veredicto y nunca llega a Claude; cualquier otra cosa se reenvía a Claude como un evento de canal.
Empaquetar como un complemento
Para hacer tu canal instalable y compartible, envuélvelo en un complemento y publícalo en un mercado. Los usuarios lo instalan con/plugin install, luego lo habilitan por sesión con --channels plugin:<name>@<marketplace>.
Un canal publicado en tu propio mercado aún necesita --dangerously-load-development-channels para ejecutarse, ya que no está en la lista de aprobación. Para que se agregue, envíalo al mercado oficial. Los complementos de canal pasan por revisión de seguridad antes de ser aprobados. En planes de equipo y empresa, un administrador puede incluir tu complemento en la lista allowedChannelPlugins de la organización, que reemplaza la lista de aprobación predeterminada de Anthropic.
Ver también
- Canales para instalar y usar Telegram, Discord, iMessage o la demostración fakechat, y para habilitar canales para una organización de equipo o empresa
- Implementaciones de canal de trabajo para código de servidor completo con flujos de emparejamiento, herramientas de respuesta y archivos adjuntos
- MCP para el protocolo subyacente que implementan los servidores de canal
- Complementos para empaquetar tu canal para que los usuarios puedan instalarlo con
/plugin install