Channels estão em visualização de pesquisa e requerem Claude Code v2.1.80 ou posterior. Eles requerem login em claude.ai. Autenticação por console e chave de API não é suportada. Organizações Team e Enterprise devem habilitá-los explicitamente.
- Visão geral: como os channels funcionam
- O que você precisa: requisitos e etapas gerais
- Exemplo: construir um receptor de webhook: um passo a passo mínimo unidirecional
- Opções de servidor: os campos do construtor
- Formato de notificação: o payload do evento
- Expor uma ferramenta de resposta: deixar Claude enviar mensagens de volta
- Gate de mensagens de entrada: verificações de remetente para evitar injeção de prompt
- Retransmitir prompts de permissão: encaminhar prompts de aprovação de ferramentas para channels remotos
Visão geral
Um channel é um servidor MCP que é executado na mesma máquina que Claude Code. Claude Code o spawna como um subprocesso e se comunica via stdio. Seu servidor de channel é a ponte entre sistemas externos e a sessão Claude Code:- Plataformas de chat (Telegram, Discord): seu plugin é executado localmente e faz polling da API da plataforma para novas mensagens. Quando alguém envia uma DM para seu bot, o plugin recebe a mensagem e a encaminha para Claude. Nenhuma URL para expor.
- Webhooks (CI, monitoramento): seu servidor escuta em uma porta HTTP local. Sistemas externos fazem POST para essa porta, e seu servidor envia o payload para Claude.
O que você precisa
O único requisito obrigatório é o pacote@modelcontextprotocol/sdk e um runtime compatível com Node.js. Bun, Node e Deno funcionam. Os plugins pré-construídos na visualização de pesquisa usam Bun, mas seu channel não precisa.
Seu servidor precisa:
- Declarar a capacidade
claude/channelpara que Claude Code registre um listener de notificação - Emitir eventos
notifications/claude/channelquando algo acontecer - Conectar via transporte stdio (Claude Code spawna seu servidor como um subprocesso)
--dangerously-load-development-channels para testar localmente. Consulte Testar durante a visualização de pesquisa para detalhes.
Exemplo: construir um receptor de webhook
Este passo a passo constrói um servidor de arquivo único que escuta solicitações HTTP e as encaminha para sua sessão Claude Code. No final, qualquer coisa que possa enviar um HTTP POST, como um pipeline de CI, um alerta de monitoramento ou um comandocurl, pode enviar eventos para Claude.
Este exemplo usa Bun como o runtime para seu servidor HTTP integrado e suporte a TypeScript. Você pode usar Node ou Deno em vez disso; o único requisito é o SDK MCP.
Escrever o servidor de channel
Crie um arquivo chamado O arquivo faz três coisas em ordem:
webhook.ts. Este é seu servidor de channel inteiro: ele se conecta a Claude Code via stdio e escuta POSTs HTTP na porta 8788. Quando uma solicitação chega, ele envia o corpo para Claude como um evento de channel.webhook.ts
- Configuração do servidor: cria o servidor MCP com
claude/channelem suas capacidades, o que é o que diz a Claude Code que este é um channel. A stringinstructionsvai para o prompt do sistema de Claude: diga a Claude quais eventos esperar, se deve responder e como rotear respostas se deve. - Conexão stdio: conecta a Claude Code via stdin/stdout. Isto é padrão para qualquer servidor MCP: Claude Code o spawna como um subprocesso.
- Listener HTTP: inicia um servidor web local na porta 8788. Cada corpo POST é encaminhado para Claude como um evento de channel via
mcp.notification(). Ocontenttorna-se o corpo do evento, e cada entradametatorna-se um atributo na tag<channel>. O listener precisa de acesso à instânciamcp, então é executado no mesmo processo. Você poderia dividi-lo em módulos separados para um projeto maior.
Registrar seu servidor com Claude Code
Adicione o servidor à sua configuração MCP para que Claude Code saiba como iniciá-lo. Para um Claude Code lê sua configuração MCP na inicialização e spawna cada servidor como um subprocesso.
.mcp.json em nível de projeto no mesmo diretório, use um caminho relativo. Para configuração em nível de usuário em ~/.claude.json, use o caminho absoluto completo para que o servidor possa ser encontrado de qualquer projeto:.mcp.json
Testá-lo
Durante a visualização de pesquisa, channels personalizados não estão na lista de aprovação, então inicie Claude Code com a flag de desenvolvimento:Quando Claude Code inicia, ele lê sua configuração MCP, spawna seu O payload chega em sua sessão Claude Code como uma tag Em seu terminal Claude Code, você verá Claude receber a mensagem e começar a responder: lendo arquivos, executando comandos ou o que a mensagem exigir. Este é um channel unidirecional, então Claude age em sua sessão mas não envia nada de volta através do webhook. Para adicionar respostas, consulte Expor uma ferramenta de resposta.Se o evento não chegar, o diagnóstico depende do que
webhook.ts como um subprocesso, e o listener HTTP inicia automaticamente na porta que você configurou (8788 neste exemplo). Você não precisa executar o servidor você mesmo.Se você vir “blocked by org policy,” seu administrador Team ou Enterprise precisa habilitar channels primeiro.Em um terminal separado, simule um webhook enviando um HTTP POST com uma mensagem para seu servidor. Este exemplo envia um alerta de falha de CI para a porta 8788 (ou qualquer porta que você configurou):<channel>:curl retornou:curlsucede mas nada chega a Claude: execute/mcpem sua sessão para verificar o status do servidor. “Failed to connect” geralmente significa um erro de dependência ou importação em seu arquivo de servidor; verifique o log de debug em~/.claude/debug/<session-id>.txtpara o rastreamento stderr.curlfalha com “connection refused”: a porta não está vinculada ainda ou um processo obsoleto de uma execução anterior a está mantendo.lsof -i :<port>mostra o que está escutando;killo processo obsoleto antes de reiniciar sua sessão.
Testar durante a visualização de pesquisa
Durante a visualização de pesquisa, cada channel deve estar na lista de aprovação para se registrar. A flag de desenvolvimento contorna a lista de aprovação para entradas específicas após um prompt de confirmação. Este exemplo mostra ambos os tipos de entrada:--channels não estende o bypass para as entradas --channels. Durante a visualização de pesquisa, a lista de aprovação é curada pela Anthropic, então seu channel permanece na flag de desenvolvimento enquanto você constrói e testa.
Esta flag pula apenas a lista de aprovação. A política de organização
channelsEnabled ainda se aplica. Não a use para executar channels de fontes não confiáveis.Opções de servidor
Um channel define essas opções no construtorServer. Os campos instructions e capabilities.tools são MCP padrão; capabilities.experimental['claude/channel'] e capabilities.experimental['claude/channel/permission'] são as adições específicas de channel:
| Campo | Tipo | Descrição |
|---|---|---|
capabilities.experimental['claude/channel'] | object | Obrigatório. Sempre {}. A presença registra o listener de notificação. |
capabilities.experimental['claude/channel/permission'] | object | Opcional. Sempre {}. Declara que este channel pode receber solicitações de retransmissão de permissão. Quando declarado, Claude Code encaminha prompts de aprovação de ferramentas para seu channel para que você possa aprová-los ou negá-los remotamente. Consulte Retransmitir prompts de permissão. |
capabilities.tools | object | Apenas bidirecional. Sempre {}. Capacidade de ferramenta MCP padrão. Consulte Expor uma ferramenta de resposta. |
instructions | string | Recomendado. Adicionado ao prompt do sistema de Claude. Diga a Claude quais eventos esperar, o que os atributos da tag <channel> significam, se deve responder e, se sim, qual ferramenta usar e qual atributo passar de volta (como chat_id). |
capabilities.tools. Este exemplo mostra uma configuração bidirecional com a capacidade de channel, ferramentas e instruções definidas:
mcp.notification() com o método notifications/claude/channel. Os params estão na próxima seção.
Formato de notificação
Seu servidor emitenotifications/claude/channel com dois params:
| Campo | Tipo | Descrição |
|---|---|---|
content | string | O corpo do evento. Entregue como o corpo da tag <channel>. |
meta | Record<string, string> | Opcional. Cada entrada torna-se um atributo na tag <channel> para contexto de roteamento como ID de chat, nome do remetente ou severidade de alerta. As chaves devem ser identificadores: apenas letras, dígitos e underscores. Chaves contendo hífens ou outros caracteres são silenciosamente descartadas. |
mcp.notification() na instância Server. Este exemplo envia um alerta de falha de CI com duas chaves meta:
<channel>. O atributo source é definido automaticamente a partir do nome configurado do seu servidor:
Expor uma ferramenta de resposta
Se seu channel é bidirecional, como uma ponte de chat em vez de um encaminhador de alerta, exponha uma ferramenta MCP padrão que Claude possa chamar para enviar mensagens de volta. Nada sobre o registro da ferramenta é específico de channel. Uma ferramenta de resposta tem três componentes:- Uma entrada
tools: {}em suas capacidades do construtorServerpara que Claude Code descubra a ferramenta - Manipuladores de ferramentas que definem o esquema da ferramenta e implementam a lógica de envio
- Uma string
instructionsem seu construtorServerque diz a Claude quando e como chamar a ferramenta
Habilitar descoberta de ferramentas
Em seu construtor
Server em webhook.ts, adicione tools: {} às capacidades para que Claude Code saiba que seu servidor oferece ferramentas:Registrar a ferramenta de resposta
Adicione o seguinte a
webhook.ts. O import vai no topo do arquivo com seus outros imports; os dois manipuladores vão entre o construtor Server e mcp.connect(). Isto registra uma ferramenta reply que Claude pode chamar com um chat_id e text:webhook.ts completo com suporte bidirecional. Respostas de saída fluem sobre GET /events usando Server-Sent Events (SSE), então curl -N localhost:8788/events pode observá-las ao vivo; chat de entrada chega em POST /:
"Full
Gate de mensagens de entrada
Um channel sem gate é um vetor de injeção de prompt. Qualquer pessoa que possa alcançar seu endpoint pode colocar texto na frente de Claude. Um channel escutando uma plataforma de chat ou um endpoint público precisa de uma verificação real de remetente antes de emitir qualquer coisa. Verifique o remetente contra uma lista de permissão antes de chamarmcp.notification(). Este exemplo descarta qualquer mensagem de um remetente não no conjunto:
message.from.id no exemplo, não message.chat.id. Em chats em grupo, estes diferem, e fazer gate na sala deixaria qualquer pessoa em um grupo com lista de permissão injetar mensagens na sessão.
Os channels Telegram e Discord fazem gate em uma lista de permissão de remetente da mesma forma. Eles inicializam a lista por emparelhamento: o usuário envia uma DM para o bot, o bot responde com um código de emparelhamento, o usuário o aprova em sua sessão Claude Code, e seu ID de plataforma é adicionado. Consulte qualquer implementação para o fluxo de emparelhamento completo. O channel iMessage toma uma abordagem diferente: detecta os próprios endereços do usuário do banco de dados Messages na inicialização e os deixa passar automaticamente, com outros remetentes adicionados por handle.
Retransmitir prompts de permissão
A retransmissão de permissão requer Claude Code v2.1.81 ou posterior. Versões anteriores ignoram a capacidade
claude/channel/permission.Bash, Write e Edit. Diálogos de confiança de projeto e consentimento de servidor MCP não retransmitem; esses aparecem apenas no terminal local.
Como a retransmissão funciona
Quando um prompt de permissão abre, o loop de retransmissão tem quatro etapas:- Claude Code gera um ID de solicitação curto e notifica seu servidor
- Seu servidor encaminha o prompt e o ID para seu aplicativo de chat
- O usuário remoto responde com um sim ou não e esse ID
- Seu manipulador de entrada analisa a resposta em um veredicto, e Claude Code o aplica apenas se o ID corresponder a uma solicitação aberta
Campos de solicitação de permissão
A notificação de saída de Claude Code énotifications/claude/channel/permission_request. Como a notificação de channel, o transporte é MCP padrão mas o método e esquema são extensões de Claude Code. O objeto params tem quatro campos de string que seu servidor formata no prompt de saída:
| Campo | Descrição |
|---|---|
request_id | Cinco letras minúsculas extraídas de a-z sem l, para que nunca leia como 1 ou I quando digitado em um telefone. Inclua-o em seu prompt de saída para que possa ser ecoado na resposta. Claude Code apenas aceita um veredicto que carregue um ID que emitiu. O diálogo do terminal local não exibe este ID, então seu manipulador de saída é a única maneira de aprender. |
tool_name | Nome da ferramenta que Claude quer usar, por exemplo Bash ou Write. |
description | Resumo legível por humanos do que esta chamada de ferramenta específica faz, o mesmo texto que o diálogo do terminal local mostra. Para uma chamada Bash isto é a descrição de Claude do comando, ou o comando em si se nenhum foi dado. |
input_preview | Os argumentos da ferramenta como uma string JSON, truncada para 200 caracteres. Para Bash isto é o comando; para Write é o caminho do arquivo e um prefixo do conteúdo. Omita-o do seu prompt se você tiver espaço apenas para uma mensagem de uma linha. Seu servidor decide o que mostrar. |
notifications/claude/channel/permission com dois campos: request_id ecoando o ID acima, e behavior definido como 'allow' ou 'deny'. Allow deixa a chamada de ferramenta prosseguir; deny a rejeita, o mesmo que responder Não no diálogo local. Nenhum veredicto afeta chamadas futuras.
Adicionar retransmissão a uma ponte de chat
Adicionar retransmissão de permissão a um channel bidirecional leva três componentes:- Uma entrada
claude/channel/permission: {}sob capacidadesexperimentalem seu construtorServerpara que Claude Code saiba encaminhar prompts - Um manipulador de notificação para
notifications/claude/channel/permission_requestque formata o prompt e o envia através da API da sua plataforma - Uma verificação em seu manipulador de mensagem de entrada que reconhece
yes <id>ouno <id>e emite uma notificação de veredictonotifications/claude/channel/permissionem vez de encaminhar o texto para Claude
Declarar a capacidade de permissão
Em seu construtor
Server, adicione claude/channel/permission: {} ao lado de claude/channel sob experimental:Manipular a solicitação de entrada
Registre um manipulador de notificação entre seu construtor
Server e mcp.connect(). Claude Code o chama com os quatro campos de solicitação quando um diálogo de permissão abre. Seu manipulador formata o prompt para sua plataforma e inclui instruções para responder com o ID:Interceptar o veredicto em seu manipulador de entrada
Seu manipulador de entrada é o loop ou callback que recebe mensagens de sua plataforma: o mesmo lugar onde você faz gate no remetente e emite
notifications/claude/channel para encaminhar chat para Claude. Adicione uma verificação antes da chamada de encaminhamento de chat que reconhece o formato de veredicto e emite a notificação de permissão em vez disso.A regex corresponde ao formato de ID que Claude Code gera: cinco letras, nunca l. A flag /i tolera autocorreção de telefone capitalizando a resposta; minúscula o ID capturado antes de enviá-lo de volta.- Formato diferente: a regex do seu manipulador de entrada falha em corresponder, então texto como
approve itouyessem um ID cai como uma mensagem normal para Claude. - Formato correto, ID errado: seu servidor emite um veredicto, mas Claude Code não encontra nenhuma solicitação aberta com esse ID e o descarta silenciosamente.
Exemplo completo
Owebhook.ts montado abaixo combina todas as três extensões desta página: a ferramenta de resposta, gating de remetente e retransmissão de permissão. Se você está começando aqui, você também precisará da configuração de projeto e entrada .mcp.json do passo a passo inicial.
Para tornar ambas as direções testáveis a partir de curl, o listener HTTP serve dois caminhos:
GET /events: mantém um stream SSE aberto e envia cada mensagem de saída como uma linhadata:, entãocurl -Npode observar as respostas de Claude e qualquer prompt de permissão conforme eles disparam ao vivo.POST /: o lado de entrada, o mesmo manipulador de antes, agora com a verificação de formato de veredicto inserida antes do ramo de encaminhamento de chat.
"Full
webhook.ts:
/events, incluindo o ID de cinco letras. Aprove-o do lado remoto:
reply e chega no stream também.
As três peças específicas de channel neste arquivo:
- Capacidades no construtor
Server:claude/channelregistra o listener de notificação,claude/channel/permissionopta pela retransmissão de permissão,toolsdeixa Claude descobrir a ferramenta de resposta. - Caminhos de saída: o manipulador da ferramenta
replyé o que Claude chama para respostas conversacionais; o manipulador de notificaçãoPermissionRequestSchemaé o que Claude Code chama quando um diálogo de permissão abre. Ambos chamamsend()para transmitir sobre/events, mas são acionados por diferentes partes do sistema. - Manipulador HTTP:
GET /eventsmantém um stream SSE aberto para que curl possa observar a saída ao vivo;POSTé entrada, feita gate no cabeçalhoX-Sender. Um corpoyes <id>ouno <id>vai para Claude Code como uma notificação de veredicto e nunca chega a Claude; qualquer outra coisa é encaminhada para Claude como um evento de channel.
Empacotar como um plugin
Para tornar seu channel instalável e compartilhável, envolva-o em um plugin e publique-o em um marketplace. Os usuários o instalam com/plugin install, então o habilitam por sessão com --channels plugin:<name>@<marketplace>.
Um channel publicado em seu próprio marketplace ainda precisa de --dangerously-load-development-channels para ser executado, já que não está na lista de aprovação. Para adicioná-lo, envie-o para o marketplace oficial. Plugins de channel passam por revisão de segurança antes de serem aprovados. Em planos Team e Enterprise, um administrador pode incluir seu plugin na lista allowedChannelPlugins da organização, que substitui a lista de aprovação padrão da Anthropic.
Veja também
- Channels para instalar e usar Telegram, Discord, iMessage ou a demo fakechat, e para habilitar channels para uma organização Team ou Enterprise
- Implementações de channel funcionando para código de servidor completo com fluxos de emparelhamento, ferramentas de resposta e anexos de arquivo
- MCP para o protocolo subjacente que servidores de channel implementam
- Plugins para empacotar seu channel para que os usuários possam instalá-lo com
/plugin install