Claude Code'da Channels: Telegram, Discord ve Webhook ile Çalışan Oturuma Olay Gönderme Rehberi

Claude Code ile çalışırken en büyük kısıt, terminalin başında olmanız gerektiğidir. Uzun bir refactor başlatıp masadan kalktığınızda Claude bir soru sorarsa oturum bekler; CI'da bir build patladığında Claude'un bundan haberi olmaz; telefondan "şu testi de çalıştır" demenin bir yolu yoktur. Channels tam olarak bu boşluğu dolduran yeni bir Claude Code özelliği: bir MCP sunucusu aracılığıyla Telegram, Discord, iMessage mesajlarını ya da herhangi bir webhook'u zaten açık olan yerel oturumunuzun içine iter, Claude bu olaya tepki verir ve isterseniz aynı kanaldan size cevap yazar. Bu yazıda resmi dokümantasyona dayanarak channels'ın nasıl çalıştığını, Telegram ve Discord kurulumunu, güvenlik modelini, izin isteklerinin telefona nasıl iletildiğini ve kendi webhook kanalınızı nasıl yazacağınızı adım adım anlatıyorum. Channels, MCP ve plugin altyapısının üzerine kurulduğu için o iki yazıya göz atmış olmanız işinizi kolaylaştırır.

Channel Nedir, Nasıl Çalışır?

Resmi tanıma göre bir channel, çalışan Claude Code oturumunuza olay iten bir MCP sunucusudur. Sıradan bir MCP sunucusunda akış tek yönlüdür: Claude bir görev sırasında ihtiyaç duyduğunda sunucuya sorar, sunucu cevap verir. Channel bu ilişkiyi tersine çevirir; sunucu istediği anda oturuma bir bildirim gönderir ve Claude bir sonraki turda bu bildirimi bir kullanıcı mesajı gibi görüp harekete geçer.

Teknik olarak channel sunucusu Claude Code ile aynı makinede çalışır. Claude Code onu bir alt süreç olarak başlatır ve stdio üzerinden konuşur. Sunucunun dış dünyayla ilişkisi iki biçimde olabilir:

  • Sohbet platformları (Telegram, Discord): plugin yerelde çalışır ve platformun API'sini yeni mesajlar için yoklar (polling). Bota DM attığınızda plugin mesajı alır ve Claude'a iletir. Dışarıya açmanız gereken bir URL yoktur.
  • Webhook'lar (CI, izleme sistemleri): sunucu yerel bir HTTP portunu dinler. Dış sistemler bu porta POST atar, sunucu gövdeyi Claude'a iter.

Channel'lar tek yönlü ya da çift yönlü olabilir. Tek yönlü bir kanal yalnızca uyarı, webhook veya izleme olaylarını iletir; Claude okur ve yapması gerekeni yapar. Çift yönlü kanallar (sohbet köprüleri) buna ek olarak bir reply aracı sunar; Claude bu araçla aynı kanaldan size mesaj gönderir. Claude bir kanal üzerinden yanıt verdiğinde terminalde gelen mesajı görürsünüz ama yanıt metnini görmezsiniz: terminal yalnızca araç çağrısını ve "sent" gibi bir onayı gösterir, asıl cevap diğer platformda belirir.

Kritik bir ayrıntı: olaylar yalnızca oturum açıkken teslim edilir. Her zaman açık bir kurulum istiyorsanız Claude Code'u kalıcı bir terminalde ya da bir arka plan sürecinde çalıştırmanız gerekir. Bunun için agent view yazısında anlattığım claude --bg yaklaşımıyla birleştirmek mantıklı bir seçenektir.

Channels, Remote Control ve Diğer Uzaktan Çalışma Özelliklerinden Nasıl Ayrılır?

Claude Code'un terminal dışına açılan birden fazla özelliği var ve channels bunların hiçbirinin yerine geçmiyor. Resmi karşılaştırma tablosu şöyle:

Özellik Ne yapar Ne için uygun
Claude Code on the web GitHub'dan klonlanan taze bir bulut sandbox'ında görev çalıştırır Sonra dönüp bakacağınız, kendi başına yeterli asenkron işleri devretmek
Claude in Slack Bir kanal ya da thread'deki @Claude mention'ından web oturumu başlatır Takım sohbetinin bağlamından doğrudan görev başlatmak
Standart MCP sunucusu Claude görev sırasında sorgular; oturuma hiçbir şey itilmez Claude'a bir sistemi isteğe bağlı okuma/sorgulama erişimi vermek
Remote Control Yerel oturumunuzu claude.ai veya Claude mobil uygulamasından siz sürersiniz Masadan uzaktayken devam eden bir oturumu yönlendirmek
Channels Claude dışı kaynaklardan gelen olayları zaten açık olan yerel oturuma iter Sohbet köprüsü ve webhook alıcısı senaryoları

Dokümantasyon channels'ın iki temel kullanım biçimini şöyle özetliyor: sohbet köprüsü (telefondan Telegram, Discord ya da iMessage ile Claude'a bir şey sorarsınız, cevap aynı sohbete gelir, iş ise makinenizde gerçek dosyalarınız üzerinde yürür) ve webhook alıcısı (CI'dan, hata takipçisinden ya da deploy hattından gelen webhook, Claude'un dosyalarınızı zaten açmış ve ne üzerinde çalıştığınızı hatırlıyor olduğu oturuma düşer). İkinci senaryodaki "hatırlıyor olması" kısmı önemli: yeni bir bulut oturumu başlatmak yerine olay, yarım saattir debug ettiğiniz bağlamın içine gelir.

Ön Koşullar ve Kullanılabilirlik

Channels şu an research preview aşamasında. Bu, birkaç pratik sonuç doğuruyor:

  • claude.ai hesabı ya da Console API anahtarıyla Anthropic kimlik doğrulaması gerekir. Amazon Bedrock, Google Cloud Agent Platform ve Microsoft Foundry üzerinde kullanılamaz.
  • Hazır kanal plugin'leri Bun betikleridir; bun --version ile kurulu olduğunu doğrulayın, değilse Bun'ı kurun.
  • Organizasyonsuz Pro ve Max kullanıcıları ek kontrol olmadan --channels ile oturum başına kanal açabilir. Team, Enterprise ve managed settings dağıtan Console organizasyonlarında yöneticinin özelliği açması gerekir (aşağıdaki kurumsal kontroller bölümüne bakın).
  • --channels ve --dangerously-load-development-channels bayrakları preview süresince claude --help çıktısında görünmez ama çalışır. Bayrak söz dizimi ve protokol sözleşmesi geri bildirimlere göre değişebilir.
  • Preview süresince --channels yalnızca Anthropic'in tuttuğu onaylı listedeki plugin'leri kabul eder; varsayılan onaylı küme, claude-plugins-official deposundaki external_plugins altındaki kanal plugin'leridir. Listede olmayan bir şey geçerseniz Claude Code normal başlar ama kanal kaydolmaz ve başlangıç bildirimi nedenini söyler.

Hızlı Başlangıç: fakechat ile İlk Kanalınız

Gerçek bir platforma bağlanmadan önce plugin akışını denemek için resmi olarak desteklenen fakechat demo kanalı var. localhost'ta bir sohbet arayüzü açar, kimlik doğrulaması ya da dış servis gerektirmez. Bir Claude Code oturumu başlatıp şunu çalıştırın:

/plugin install fakechat@claude-plugins-official

Kurulum başarısız olursa hata mesajına göre ilerleyin: Marketplace "claude-plugins-official" not found diyorsa önce /plugin marketplace add anthropics/claude-plugins-official ile marketplace'i ekleyip yeniden deneyin. Kurulum kapsam sorduğunda, plugin tüm projelerinizde kullanılabilsin diye user kapsamını seçin. Ardından Claude Code'dan çıkıp kanal bayrağıyla yeniden başlatın:

claude --channels plugin:fakechat@claude-plugins-official

fakechat sunucusu otomatik başlar. Başlangıç ekranında plugin:fakechat@claude-plugins-official kaynağından gelen mesajların doğrudan bu oturuma enjekte edildiğini söyleyen bir kanal bildirimi görürsünüz; plugin kurulu değilse ya da onaylı listede yoksa bu bildirimin altında sorunu adlandıran bir uyarı satırı belirir. Birden fazla plugin'i boşlukla ayırarak aynı --channels bayrağına verebilirsiniz.

Şimdi tarayıcıda http://localhost:8787 adresini açıp bir mesaj yazın, örneğin "what's in my working directory?". Terminalde mesaj ← fakechat · web: ... biçiminde bir gelen kanal satırı olarak görünür; model ise onu <channel source="plugin:fakechat:fakechat"> etiketiyle sarılmış bir olay olarak alır. Claude okur, işi yapar ve fakechat'in reply aracını çağırır. İlk yanıt için izin sorulursa onaylayın; cevap sohbet arayüzünde belirir.

Telegram Kanalı Nasıl Kurulur?

Telegram, çoğu geliştirici için en pratik kanal: telefonunuzda zaten var, bot oluşturmak bir dakika sürüyor ve dışarıya port açmanız gerekmiyor. Adımlar şöyle:

1. Telegram botu oluşturun

Telegram'da BotFather'ı açıp /newbot gönderin. Bir görünen ad ve bot ile biten benzersiz bir kullanıcı adı verin. BotFather'ın döndürdüğü token'ı kopyalayın.

2. Plugin'i kurun

/plugin install telegram@claude-plugins-official

Kapsam sorulduğunda user kapsamını seçin. Kurulum özeti Run /reload-plugins to activate. diyorsa, plugin'in configure komutunun kullanılabilir olması için /reload-plugins çalıştırın.

3. Token'ı yapılandırın

/telegram:configure <token>

Bu komut token'ı ~/.claude/channels/telegram/.env dosyasına yazar. Alternatif olarak Claude Code'u başlatmadan önce kabuk ortamında TELEGRAM_BOT_TOKEN değişkenini de ayarlayabilirsiniz.

4. Kanal etkin şekilde yeniden başlatın

claude --channels plugin:telegram@claude-plugins-official

Bu komut Telegram plugin'ini başlatır; plugin botunuza gelen mesajları yoklamaya başlar.

5. Hesabınızı eşleştirin

Telegram'ı açıp botunuza herhangi bir mesaj gönderin. Bot bir eşleştirme kodu döner. Bot yanıt vermiyorsa Claude Code'un bir önceki adımdaki gibi --channels ile çalıştığından emin olun; bot yalnızca kanal aktifken cevap verebilir. Sonra Claude Code içinde:

/telegram:access pair <kod>
/telegram:access policy allowlist

İkinci komut erişimi kilitler: artık yalnızca eşleştirilmiş hesabınız mesaj gönderebilir.

Telegram erişim komutlarının tam listesi

Plugin'in /telegram:access beceri komutu, eşleştirmenin ötesinde bir yönetim yüzeyi sunar. Plugin deposundaki ACCESS.md dokümanına göre alt komutlar şunlar:

Komut İşlev
/telegram:accessMevcut durumu gösterir
/telegram:access pair <kod>Eşleştirme kodunu onaylar
/telegram:access deny <kod>Bekleyen bir kodu reddeder
/telegram:access allow <id>Bir kullanıcı kimliğini elle ekler
/telegram:access remove <id>Allowlist'ten siler
/telegram:access policy <mod>DM politikasını ayarlar
/telegram:access group add <id>Bir grubu etkinleştirir (--no-mention, --allow id1,id2 bayraklarıyla)
/telegram:access group rm <id>Grubu devre dışı bırakır
/telegram:access set <anahtar> <değer>Teslimat davranışını yapılandırır

Kayıtlı olmayan göndericiler için üç DM politikası var: pairing (varsayılan; bot altı karakterlik kod gönderir), allowlist (mesajlar sessizce düşürülür, yanıt gönderilmez) ve disabled (onaylı kullanıcılar dahil tüm mesajlar reddedilir). Gruplar varsayılan olarak kapalıdır ve her biri tek tek açılır; supergroup kimlikleri -100 önekiyle negatiftir. Varsayılan requireMention: true ayarı botun yalnızca mention edildiğinde ya da yanıtlandığında tepki vermesini sağlar; --no-mention ile kapatırsanız BotFather'da gizlilik modunu da devre dışı bırakmanız gerekir. Yapılandırma ~/.claude/channels/telegram/access.json dosyasında saklanır; TELEGRAM_ACCESS_MODE=static ortam değişkeni bu yapılandırmayı başlangıçta dondurur ve eşleştirmeyi kapatır.

Claude'un Telegram tarafında kullanabildiği araçlar da plugin README'sinde tanımlı: reply (isteğe bağlı reply_to ile thread'leme ve 50 MB'a kadar dosya eki; görseller satır içi, diğer dosyalar belge olarak gider), react (Telegram'ın sabit emoji listesinden tepki) ve edit_message (daha önce gönderilmiş bot mesajını düzenler). Bot, Telegram API kısıtı nedeniyle mesaj geçmişine ya da aramaya erişemez; gelen fotoğraflar otomatik olarak ~/.claude/channels/telegram/inbox/ altına indirilir.

Discord Kanalı Nasıl Kurulur?

Discord kurulumu Telegram'a benzer ama bot tarafında birkaç ek ayar ister:

  1. Bot oluşturun: Discord Developer Portal'da New Application ile bir uygulama açın, Bot bölümünde kullanıcı adı verin, Reset Token ile token'ı kopyalayın.
  2. Message Content Intent'i açın: bot ayarlarında Privileged Gateway Intents altında Message Content Intent'i etkinleştirin. Bunu atlarsanız bot mesaj içeriğini göremez.
  3. Botu sunucunuza davet edin: OAuth2 > URL Generator'da bot kapsamını seçip şu izinleri verin: View Channels, Send Messages, Send Messages in Threads, Read Message History, Attach Files, Add Reactions. Üretilen URL'yi açıp botu sunucunuza ekleyin.
  4. Plugin'i kurun ve yapılandırın:
/plugin install discord@claude-plugins-official
/discord:configure <token>

Token ~/.claude/channels/discord/.env dosyasına yazılır; alternatif olarak DISCORD_BOT_TOKEN ortam değişkenini kullanabilirsiniz. Ardından kanal bayrağıyla yeniden başlatın, botunuza DM atıp gelen kodu onaylayın ve erişimi kilitleyin:

claude --channels plugin:discord@claude-plugins-official

# Claude Code içinde, bot DM'de kodu döndükten sonra:
/discord:access pair <kod>
/discord:access policy allowlist

iMessage Kanalı: macOS'ta Bot Token'sız Kurulum

iMessage kanalı diğer ikisinden farklı çalışır: Messages veritabanını (~/Library/Messages/chat.db) doğrudan okur ve yanıtları AppleScript ile gönderir. macOS gerektirir, bot token'ı ya da dış servis istemez. Sunucu veritabanını ilk okuduğunda macOS erişim izni sorar; Allow deyin. İstem çıkmazsa ya da yanlışlıkla reddettiyseniz System Settings > Privacy & Security > Full Disk Access altına terminalinizi elle ekleyin; aksi halde sunucu authorization denied ile hemen kapanır.

/plugin install imessage@claude-plugins-official
claude --channels plugin:imessage@claude-plugins-official

Apple ID'nizle oturum açmış herhangi bir cihazdan kendinize mesaj atın; kendi kendine sohbet erişim kontrolünü otomatik atlar ve mesaj anında Claude'a ulaşır. Claude'un gönderdiği ilk yanıt, terminalin Messages'ı kontrol edip edemeyeceğini soran bir macOS Automation istemi tetikler; OK deyin. Başka bir kişinin de Claude'a ulaşmasını istiyorsanız handle'ını ekleyin:

/imessage:access allow +905551234567

Handle'lar +ülke biçiminde telefon numarası ya da Apple ID e-postası olabilir.

Güvenlik Modeli: Kim Mesaj Gönderebilir?

Kanal, doğası gereği bir prompt injection vektörüdür: uç noktanıza ulaşabilen herkes Claude'un önüne metin koyabilir. Bu yüzden Claude Code birkaç katmanlı bir kapı sistemi kullanır:

  • Gönderici allowlist'i: onaylı her kanal plugin'i bir gönderici listesi tutar. Yalnızca eklediğiniz kimlikler mesaj iletebilir; diğerleri sessizce düşürülür. Telegram ve Discord bu listeyi eşleştirme ile başlatır, iMessage'da ise kendinize yazmak kapıyı otomatik geçer ve diğer kişiler handle ile eklenir.
  • Oturum başına opt-in: hangi sunucuların kanal olarak çalışacağını her oturumda --channels ile siz belirlersiniz. Bir sunucunun .mcp.json'da olması yetmez; --channels içinde adlandırılması da gerekir.
  • Organizasyon politikası: Team ve Enterprise planlarında ve managed settings dağıtan Console organizasyonlarında channelsEnabled ayarı kullanılabilirliği belirler.
  • Gönderici, oda değil: kendi kanalınızı yazıyorsanız referans dokümantasyonun altını çizdiği kural şu: allowlist kontrolünü message.from.id gibi gönderici kimliğine göre yapın, message.chat.id gibi oda kimliğine göre değil. Grup sohbetlerinde bu ikisi farklıdır ve odaya göre kapı kurmak, onaylı gruptaki herkesin oturuma mesaj enjekte etmesine izin verir.

Allowlist ayrıca izin relay'ini de korur: kanal bu yeteneği bildirmişse, kanal üzerinden yanıt verebilen herkes oturumunuzdaki araç kullanımını onaylayabilir ya da reddedebilir. Bu yüzden yalnızca bu yetkiyi vermeye razı olduğunuz göndericileri listeye ekleyin.

Terminal Başında Değilken İzin İstekleri Ne Olur?

Claude bir izin istemine takıldığında oturum siz cevap verene kadar durur. Bunun üç çözümü var ve her birinin farklı bir güvenlik profili bulunur:

1. İzin relay'i (permission relay)

claude/channel/permission yeteneğini bildiren çift yönlü kanallar, izin istemini terminaldeki diyalogla paralel olarak başka bir cihaza iletebilir. İki taraf da canlı kalır: terminalden ya da telefondan cevap verebilirsiniz, Claude Code hangisi önce gelirse onu uygular ve diğerini kapatır. Relay yalnızca Bash, Write, Edit gibi araç kullanım onaylarını kapsar; proje güven ve MCP sunucu onay diyalogları yalnızca yerel terminalde görünür. Claude Code 2.1.234 ve sonrası izin isteklerini yalnızca o oturum için kanal olarak kaydettiği sunuculara gönderir; yani relay, mesaj teslimatıyla aynı oturum opt-in'i ve organizasyon kontrollerinin arkasındadır.

Döngü dört adımdan oluşur:

  1. Claude Code kısa bir istek kimliği üretir ve sunucunuza bildirir.
  2. Sunucunuz istemi ve kimliği sohbet uygulamanıza iletir.
  3. Uzaktaki kullanıcı evet/hayır ve o kimlikle yanıt verir.
  4. Gelen mesaj işleyiciniz yanıtı bir karara çevirir; Claude Code kararı yalnızca kimlik açık bir istekle eşleşiyorsa uygular.

İstek kimliği, telefonda yazarken 1 ya da I ile karışmasın diye l harfi hariç beş küçük harften oluşur. Yerel terminal diyaloğu bu kimliği göstermez; onu öğrenmenin tek yolu kanalınızın giden işleyicisidir. Yanlış biçimli bir yanıt iki şekilde başarısız olur ve her iki durumda da yerel diyalog açık kalır: "approve it" gibi kimliksiz bir metin normal mesaj olarak Claude'a düşer; doğru biçimli ama yanlış kimlikli bir karar ise sessizce atılır.

2. --dangerously-skip-permissions

Gözetimsiz kullanım için bu bayrak çoğu istemi atlar, ama yalnızca güvendiğiniz ortamlarda kullanılmalıdır. Bu bayrakla bile hiçbir modun otomatik onaylamadığı eylemler geçerliliğini korur. İzin modlarının tam listesini ve hangi eylemlerin her durumda onay gerektirdiğini izin kuralları rehberinde anlattım.

3. Non-interactive (-p) mod

Kanalları -p ile non-interactive modda çalıştırdığınızda, terminal girişi gerektiren araçlar (çoktan seçmeli sorular, plan modu onayı) devre dışı bırakılır; böylece oturum asla girdi bekleyerek takılı kalmaz.

Kendi Kanalınızı Yazmak: Webhook Alıcısı

Telegram ya da Discord'un ötesinde, CI sisteminizden ya da izleme aracınızdan gelen olayları Claude'a iletmek istiyorsanız kendi kanalınızı yazabilirsiniz. Tek zorunlu bağımlılık @modelcontextprotocol/sdk paketi ve Node.js uyumlu bir çalışma zamanıdır; Bun, Node ve Deno'nun üçü de çalışır. Sunucunuzun yapması gereken üç şey var:

  1. Claude Code'un bildirim dinleyicisi kaydetmesi için claude/channel yeteneğini bildirmek
  2. Bir şey olduğunda notifications/claude/channel olayı yaymak
  3. stdio transport üzerinden bağlanmak

Resmi referansın verdiği en küçük örnek, 8788 portunu dinleyen ve her POST gövdesini Claude'a ileten tek dosyalık bir sunucu. Önce projeyi oluşturun:

mkdir webhook-channel && cd webhook-channel
bun add @modelcontextprotocol/sdk zod

Sonra webhook.ts dosyasını yazın:

#!/usr/bin/env bun
import { Server } from '@modelcontextprotocol/sdk/server/index.js'
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'

// MCP sunucusunu olustur ve kanal olarak bildir
const mcp = new Server(
  { name: 'webhook', version: '0.0.1' },
  {
    // bu anahtar sunucuyu kanal yapar: Claude Code bunun icin dinleyici kaydeder
    capabilities: { experimental: { 'claude/channel': {} } },
    // sunucu baglandiginda Claude'a baglam olarak iletilir
    instructions: 'Events from the webhook channel arrive as <channel source="webhook" ...>. They are one-way: read them and act, no reply expected.',
  },
)

// Claude Code bu sureci baslatir; stdio uzerinden baglan
await mcp.connect(new StdioServerTransport())

// Her POST'u Claude'a ileten HTTP sunucusu
Bun.serve({
  port: 8788,
  hostname: '127.0.0.1',  // yalnizca localhost
  async fetch(req) {
    const body = await req.text()
    await mcp.notification({
      method: 'notifications/claude/channel',
      params: {
        content: body,  // <channel> etiketinin govdesi olur
        // her anahtar bir etiket ozniteligi olur: <channel path="/" method="POST">
        meta: { path: new URL(req.url).pathname, method: req.method },
      },
    })
    return new Response('ok')
  },
})

Dosya sırasıyla üç şey yapar: yeteneklerinde claude/channel bulunan MCP sunucusunu oluşturur (Claude Code instructions metnini sunucu bağlandığında Claude'a bağlam olarak iletir), stdin/stdout üzerinden Claude Code'a bağlanır ve 8788 portunda yerel bir web sunucusu başlatır. Dinleyicinin mcp örneğine erişmesi gerektiğinden aynı süreçte çalışır.

Sunucuyu Claude Code'a tanıtmak için MCP yapılandırmanıza ekleyin. Aynı dizindeki proje düzeyi .mcp.json için göreli yol yeterlidir; ~/.claude.json içindeki kullanıcı düzeyi yapılandırmada mutlak yol kullanın:

{
  "mcpServers": {
    "webhook": { "command": "bun", "args": ["./webhook.ts"] }
  }
}

Research preview süresince özel kanallar onaylı listede olmadığından oturumu geliştirme bayrağıyla başlatın:

claude --dangerously-load-development-channels server:webhook

Claude Code önce yüklediğiniz geliştirme kanallarını listeleyen tam ekran bir uyarı gösterir; devam etmek için I am using this for local development seçeneğini seçin. Bu projede ilk kez oturum açıyorsanız .mcp.json'daki yeni sunucu için de onay ister ("New MCP server found in this project: webhook"); Use this MCP server deyin. Kabul ettikten sonra Claude Code webhook.ts'yi alt süreç olarak başlatır ve HTTP dinleyici otomatik açılır; sunucuyu kendiniz çalıştırmanız gerekmez. Başlangıç banner'ının altında kanalın kaydolduğunu doğrulayan soluk bir bildirim görürsünüz. "blocked by org policy" görürseniz organizasyon yöneticinizin önce channels'ı açması gerekir.

Ayrı bir terminalden bir webhook simüle edin:

curl -X POST localhost:8788 -d "build failed on main: https://ci.example.com/run/1234"

Yük Claude'un bağlamına şu etiketle düşer:

<channel source="webhook" path="/" method="POST">build failed on main: https://ci.example.com/run/1234</channel>

Terminaliniz olayı ham etiket yerine ← webhook: build failed on main: ... biçiminde tek satırlık bir özet olarak gösterir; ardından Claude dosyaları okumaya, komut çalıştırmaya, mesajın gerektirdiği her neyse onu yapmaya başlar. Bu tek yönlü bir kanal olduğundan Claude oturumda hareket eder ama webhook'a geri bir şey göndermez.

Bildirim formatı

Sunucunuz notifications/claude/channel bildirimini iki parametreyle yayar:

Alan Tür Açıklama
content string Olay gövdesi. <channel> etiketinin gövdesi olarak teslim edilir.
meta Record<string, string> İsteğe bağlı. Her giriş etiket üzerinde bir öznitelik olur (sohbet kimliği, gönderici adı, uyarı önemi gibi yönlendirme bağlamı için). Anahtarlar yalnızca harf, rakam ve alt çizgi içerebilir; tire ya da başka karakter içeren anahtarlar sessizce düşürülür.

source özniteliği sunucunuzun yapılandırılmış adından otomatik ayarlanır. Bilmeniz gereken birkaç teslimat davranışı var: Claude Code bildirimleri onaylamaz; mcp.notification() üzerindeki await, mesaj transport'a yazıldığında çözülür, Claude işlediğinde değil. Oturum sunucunuzu kanal olarak yüklememişse ya da organizasyon politikası engelliyorsa olaylar sessizce düşer ve sunucunuza hata dönmez. Teslimat onayına ihtiyacınız varsa olay durumunu sunucunuzda takip edip Claude'un durum bildirebileceği bir reply aracı sunun. Olaylar oturuma sıraya girer ve sırayla işlenir; Claude meşgulken birkaç bildirim gelirse bir sonraki turda hep birlikte teslim edilir ve Claude onları grup olarak ele alır. Bağımsız olay akışlarını eşzamanlı işlemek istiyorsanız ayrı oturumlar çalıştırın.

Reply aracı eklemek

Kanalınızı çift yönlü yapmak için standart bir MCP aracı sunmanız yeterlidir; araç kaydında kanala özgü hiçbir şey yoktur. Üç bileşen gerekir: Server yapıcısındaki yeteneklere tools: {} eklemek, aracın şemasını ve gönderme mantığını tanımlayan işleyiciler yazmak ve instructions metnini Claude'un aracı ne zaman ve nasıl çağıracağını söyleyecek şekilde güncellemek:

import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js'

mcp.setRequestHandler(ListToolsRequestSchema, async () => ({
  tools: [{
    name: 'reply',
    description: 'Send a message back over this channel',
    inputSchema: {
      type: 'object',
      properties: {
        chat_id: { type: 'string', description: 'The conversation to reply in' },
        text: { type: 'string', description: 'The message to send' },
      },
      required: ['chat_id', 'text'],
    },
  }],
}))

mcp.setRequestHandler(CallToolRequestSchema, async req => {
  if (req.params.name === 'reply') {
    const { chat_id, text } = req.params.arguments as { chat_id: string; text: string }
    send(`Reply to ${chat_id}: ${text}`)  // send(): sohbet platformunuza POST
    return { content: [{ type: 'text', text: 'sent' }] }
  }
  throw new Error(`unknown tool: ${req.params.name}`)
})

Bu durumda instructions metni de "Messages arrive as <channel source="webhook" chat_id="...">. Reply with the reply tool, passing the chat_id from the tag." biçiminde güncellenir; böylece Claude gelen etiketteki chat_id'yi yanıtına taşır. İzin relay'i eklemek isterseniz yeteneklere 'claude/channel/permission': {} ekleyip notifications/claude/channel/permission_request için bir bildirim işleyicisi yazar ve gelen mesajlarda yes <id> / no <id> biçimini yakalayıp notifications/claude/channel/permission kararı yayarsınız. Referans dokümanı bu üç uzantıyı birleştiren tam bir webhook.ts örneği içeriyor; relay yeteneğini yalnızca göndericiyi gerçekten doğrulayan kanallarda bildirmeniz gerektiğini unutmayın.

Kanalı plugin olarak paketlemek

Kanalınızı kurulabilir ve paylaşılabilir yapmak için bir plugin'e sarıp bir marketplace'e yayınlayabilirsiniz; kullanıcılar /plugin install ile kurar ve --channels plugin:<ad>@<marketplace> ile oturum başına açar. Ancak kendi marketplace'inize yayınladığınız bir kanal, onaylı listede olmadığından hâlâ --dangerously-load-development-channels gerektirir. Topluluk marketplace'i de kanal allowlist'inde değildir. Team ve Enterprise planlarında yönetici, plugin'inizi organizasyonun kendi allowedChannelPlugins listesine ekleyerek bu kısıtı aşabilir.

Kurumsal Kontroller: channelsEnabled ve allowedChannelPlugins

Yöneticiler kullanılabilirliği, kullanıcıların geçersiz kılamayacağı iki managed setting ile kontrol eder. Varsayılan, kimlik doğrulama biçiminize bağlıdır: claude.ai Team ve Enterprise'da channels bir Owner açana kadar engellidir; API anahtarıyla Console kimlik doğrulamasında varsayılan olarak izinlidir ve bu ayara yalnızca managed settings dağıtıyorsanız ihtiyaç duyarsınız. Her durumda bir kullanıcı --channels ile opt-in yapmadan hiçbir kanal çalışmaz.

Ayar Amaç Yapılandırılmamışsa
channelsEnabled Ana anahtar. Herhangi bir kanalın mesaj teslim etmesi için true olmalı. Kapalıyken geliştirme bayrağı dahil tüm kanalları engeller. Team/Enterprise: engelli. Console: managed settings dağıtılmıyorsa izinli, dağıtılıyorsa anahtar ayarlanana kadar engelli.
allowedChannelPlugins Channels açıkken hangi plugin'lerin kaydolabileceği. Ayarlandığında Anthropic'in listesinin yerine geçer. Anthropic'in varsayılan listesi uygulanır.

Organizasyon için channels'ı açmak claude.ai'da Admin settings > Claude Code > Channels altından (Owner rolü gerekir) ya da managed settings'te channelsEnabled'ı true yaparak mümkündür. Ayar kapalı ya da tanımsızken MCP sunucusu yine bağlanır ve araçları çalışır, ama kanal mesajları gelmez; kullanıcı bir başlangıç uyarısıyla yöneticiden ayarı açmasını istemesi gerektiğini görür. Kendi listenizi tanımlamak için her giriş plugin'i ve geldiği marketplace'i adlandırır:

{
  "channelsEnabled": true,
  "allowedChannelPlugins": [
    { "marketplace": "claude-plugins-official", "plugin": "telegram" },
    { "marketplace": "claude-plugins-official", "plugin": "discord" },
    { "marketplace": "acme-corp-plugins", "plugin": "internal-alerts" }
  ]
}

Boş bir dizi allowlist'teki tüm kanal plugin'lerini engeller ama --dangerously-load-development-channels yerel test için bu engeli yine de aşabilir; geliştirme bayrağı dahil kanalları tamamen kapatmak istiyorsanız channelsEnabled'ı tanımsız bırakın. Bir kullanıcı listenizde olmayan bir plugin'i --channels'a verirse Claude Code normal başlar, kanal kaydolmaz ve başlangıç bildirimi plugin'in organizasyonun onaylı listesinde olmadığını açıklar.

Gerçek Dünya Senaryosu: CI Hatasını Telefondan Yönetmek

Şu kurulumu düşünün: bir feature branch üzerinde çalışıyorsunuz, Claude Code'u Telegram kanalıyla başlattınız ve öğle yemeğine çıktınız.

cd ~/projeler/odeme-servisi
claude --channels plugin:telegram@claude-plugins-official

Yemekteyken GitHub Actions'tan "build failed" bildirimi geldi. Telefonu açıp botunuza yazıyorsunuz: "main'deki son CI hatasını incele, test loglarına bak, kök nedeni bul ve bana özetle. Düzeltme yapma." Mesaj terminalde ← telegram · ... satırı olarak görünür; Claude oturumun mevcut bağlamıyla (hangi dosyalarda çalıştığınızı zaten biliyor) logları okur, sorunu bulur ve reply aracıyla Telegram'a bir özet gönderir. Terminalde yalnızca araç çağrısı ve "sent" onayı görünür, özet telefonunuza düşer.

Özeti okuyup ikinci mesajı atıyorsunuz: "Tamam, düzeltmeyi uygula ve testleri çalıştır." Claude dosyayı düzenlemek istediğinde bir izin istemi açılır. Telegram plugin'i izin relay'i sunuyorsa bu istem telefonunuza beş harfli kimliğiyle gelir; yes abcde yazarsınız ve terminaldeki diyalog kapanır. Sunmuyorsa oturum siz masaya dönene kadar bekler; bu durumda oturumu başlatırken hangi izin modunu kullandığınız önem kazanır. Testler geçince Claude yine Telegram'dan haber verir. Masaya döndüğünüzde tüm konuşma terminal transkriptinde durur; oturum sizin makinenizde çalıştığı için commit'i, diff'i ve dosyaları oradan inceleyebilirsiniz.

Aynı senaryonun webhook versiyonu daha da az etkileşim ister: CI hattınız hata durumunda yerel webhook kanalınıza POST atacak şekilde ayarlıysa (örneğin makinenizde çalışan bir tünel ya da yalnızca iç ağdan erişilebilen bir port üzerinden), olay siz hiçbir şey yapmadan Claude'un önüne düşer ve instructions metninizde tanımladığınız davranışa göre Claude ya yalnızca analiz eder ya da bir düzeltme dalı açar. Bu senaryoda relay olmadan gözetimsiz çalışacaksanız izin modunu bilinçli seçmeniz gerekir; alternatif olarak yalnızca bildirim işleyen bir Routine ile kanal tabanlı yerel oturumu birlikte kullanmak da mümkündür.

Sorun Giderme

Belirti Olası neden ve çözüm
Bot Telegram/Discord'da yanıt vermiyor Claude Code --channels ile başlatılmamış ya da kapalı. Bot yalnızca kanal aktifken cevap verebilir.
Marketplace "claude-plugins-official" not found /plugin marketplace add anthropics/claude-plugins-official ile marketplace'i ekleyip kurulumu yeniden deneyin.
Kurulumdan sonra /telegram:configure bulunamıyor Kurulum özeti Run /reload-plugins to activate. demiştir; /reload-plugins çalıştırın.
Başlangıçta "plugin isn't on the approved list" uyarısı Plugin Anthropic'in ya da organizasyonunuzun allowlist'inde değil. Kendi kanalınız için geliştirme bayrağını kullanın.
"blocked by org policy" Organizasyon yöneticinizin channelsEnabled'ı açması gerekir.
curl başarılı ama Claude'a hiçbir şey ulaşmıyor /mcp ile sunucu durumuna bakın; failed genelde sunucu dosyasındaki bağımlılık/import hatasıdır. claude --debug --dangerously-load-development-channels server:webhook ile başlatıp ~/.claude/debug/<session-id>.txt günlüğüne bakın.
curl "connection refused" veriyor Port henüz bağlanmamış ya da önceki çalıştırmadan kalan bir süreç portu tutuyor. lsof -i :<port> ile bulun, süreci sonlandırıp oturumu yeniden başlatın.
iMessage sunucusu authorization denied ile kapanıyor Terminalinize Full Disk Access verilmemiş; System Settings'ten ekleyin.
Kendi kanalımda meta öznitelikleri etikette görünmüyor Anahtarlar yalnızca harf, rakam ve alt çizgi içerebilir; tireli anahtarlar sessizce düşürülür.

Sıkça Sorulan Sorular

Channels ile Remote Control arasındaki fark nedir?

Remote Control, zaten çalışan yerel oturumunuzu claude.ai/code veya Claude mobil uygulamasından sizin sürmenizi sağlar; tetikleyici yine sizsiniz ve Anthropic'in kendi arayüzünü kullanırsınız. Channels ise Claude dışı kaynaklardan (Telegram, Discord, iMessage, bir CI webhook'u) gelen olayları zaten açık olan yerel oturuma iter. İkisi birbirini tamamlar.

Claude Code kapalıyken Telegram'dan gönderdiğim mesajlar ne olur?

Olaylar yalnızca oturum açıkken ve --channels ile başlatılmışken teslim edilir. Claude Code kapalıysa bot yanıt vermez. Her zaman açık bir kurulum için Claude Code'u kalıcı bir terminalde ya da arka plan sürecinde çalıştırmanız gerekir.

Channels hangi hesaplarda ve platformlarda kullanılabilir?

Research preview özelliğidir; claude.ai hesabı ya da Console API anahtarı gerektirir ve Bedrock, Google Cloud Agent Platform ya da Microsoft Foundry üzerinde çalışmaz. Organizasyonsuz Pro ve Max kullanıcıları doğrudan --channels ile kullanabilir; Team ve Enterprise'da bir Owner'ın özelliği açması gerekir.

Bir kanal üzerinden gelen her mesaj Claude'a ulaşır mı?

Hayır. Onaylı her kanal plugin'i bir gönderici allowlist'i tutar; yalnızca eklediğiniz kimlikler mesaj iletebilir. Telegram ve Discord bu listeyi eşleştirme ile başlatır; ardından policy allowlist ile kilitlersiniz. Ayrıca bir sunucunun .mcp.json'da olması yetmez, --channels ile adlandırılması gerekir.

Terminal başında değilken izin sorularını telefondan onaylayabilir miyim?

Kanal sunucusu claude/channel/permission yeteneğini bildirmişse evet: istek hem terminalde açılır hem de beş harfli bir kimlikle kanala iletilir, siz yes <id> ya da no <id> yazarsınız, hangi taraf önce cevap verirse o uygulanır. Relay yalnızca araç onaylarını kapsar; proje güven ve MCP onay diyalogları yalnızca yerel terminalde görünür.

Kendi yazdığım kanalı --channels ile yükleyebilir miyim?

Preview süresince hayır; --channels yalnızca onaylı listedeki plugin'leri kabul eder. Kendi kanalınızı claude --dangerously-load-development-channels server:<ad> ya da plugin:<ad>@<marketplace> ile test edersiniz. Bu bayrak allowlist'i atlar ama channelsEnabled politikasını atlamaz ve güvenilmeyen kaynaklardan kanal çalıştırmak için kullanılmamalıdır.

Özet

Channels, Claude Code'u "terminalin başında oturup beklediğiniz bir araç" olmaktan çıkarıp dış dünyadan gelen olaylara tepki veren bir ajana dönüştürüyor. Mekanik basit: bir MCP sunucusu claude/channel yeteneğini bildirir, notifications/claude/channel ile olay iter, Claude bunu <channel> etiketiyle görüp harekete geçer ve çift yönlü kanallarda bir reply aracıyla cevap verir. Telegram, Discord ve iMessage plugin'leri bu mekaniği hazır sunar; /plugin install, configure, --channels ile yeniden başlatma ve eşleştirme dört adımda tamamlanır. Güvenlik, gönderici allowlist'i, oturum başına --channels opt-in'i ve organizasyon düzeyinde channelsEnabled anahtarıyla üç katmanda sağlanır. İzin relay'i sayesinde araç onaylarını telefondan verebilir, kendi webhook kanalınızla da CI ya da izleme olaylarını doğrudan çalıştığınız bağlama düşürebilirsiniz. Özellik henüz research preview'da ve bayrak söz dizimi değişebilir; bu yüzden kurulumunuzu resmi dokümantasyonla düzenli olarak karşılaştırın. Channels'ın üzerine kurulduğu altyapıyı daha iyi anlamak için MCP rehberine, plugin kurulum ve marketplace ayrıntıları için plugin ve marketplace rehberine, gözetimsiz oturumlarda izin modlarını doğru seçmek için de izin kuralları rehberine göz atabilirsiniz.

Bu yazı Ahmet Bilgiç tarafından ahmetbilgic.com için yazılmıştır. Diğer yazılar için: medium.com/@ahmet_bilgic07