MCP Hub
Back to servers

Telegram Bridge MCP

Bridges AI assistants to a Telegram bot to enable two-way messaging, interactive confirmations, and live status updates. It supports automatic voice transcription via local Whisper models and provides secure, single-user communication for MCP-compatible hosts.

glama
Stars
6
Forks
4
Updated
Apr 11, 2026
Validated
Apr 13, 2026

Telegram Bridge MCP

CI Docker Docker Image License: AGPL-3.0

AI agents coordinating through Telegram Bridge MCP

No Claw? No Problem.

Anthropic restricted Claude Code's native instance API — but this bridge doesn't care. It's a standard Model Context Protocol server. Any IDE, any model, any agent framework that speaks MCP connects out of the box — no proprietary lock-in, no webhooks, no public URL required.


What Is This?

Telegram Bridge MCP connects AI assistants to Telegram bidirectionally. It lets any MCP-compatible client send messages, ask questions, receive voice replies, and run multiple concurrent agent sessions — all through a single bot you control.

Works with: VS Code (GitHub Copilot Chat), Claude Code, Cursor, Windsurf, Copilot CLI, and any MCP-compatible host.


Highlights

FeatureDescription
Two-way messagingText, Markdown, files, voice notes
Interactive controlsInline buttons, confirmations, questions
Super toolsSelf-pinning checklists and emoji progress bars that update in-place
VoiceAuto-transcription (bundled Whisper ONNX, no ffmpeg) + TTS (local Kokoro, OpenAI, or bundled ONNX)
Multi-sessionMultiple agents share one bot with isolated queues, token auth, and color identity
AnimationsCycling status frames while your agent works
RemindersScheduled synthetic events delivered via dequeue
Slash commandsDynamic bot menu; commands arrive as structured events
No webhooksPure long-polling — no public URL, no reverse proxy

Quick Start

Tip: If your AI has web access, paste this to get started (requires web access):

Set me up: https://github.com/electricessence/Telegram-Bridge-MCP
Manual setup (step by step)

1. Clone and build

git clone https://github.com/electricessence/Telegram-Bridge-MCP.git
cd Telegram-Bridge-MCP
pnpm install && pnpm build

2. Create a bot

Message @BotFather on Telegram:

/newbot

Copy the token it gives you.

3. Pair interactively

pnpm pair

The wizard prompts for your bot token and Telegram user ID, writes a .env file, and verifies connectivity.

4. Configure your MCP host

See docs/setup.md for per-client config snippets (VS Code, Claude Code, Cursor, Docker).


Transports

TransportEntry PointBest For
Streamable HTTPpnpm start -- --httpMultiple clients sharing one server (recommended)
stdionode dist/index.jsSingle client, no persistent server
Launcher bridgenode dist/launcher.jsAuto-starts HTTP if needed, bridges stdio ↔ HTTP
Streamable HTTP MCP config example

Claude Code / Cursor / other MCP hosts

{
  "mcpServers": {
    "telegram": {
      "type": "streamable-http",
      "url": "http://127.0.0.1:3099/mcp"
    }
  }
}

VS Code (.vscode/mcp.json)

{
  "servers": {
    "telegram": {
      "type": "streamable-http",
      "url": "http://127.0.0.1:3099/mcp"
    }
  }
}
stdio MCP config example

Claude Code / Cursor / other MCP hosts

{
  "mcpServers": {
    "telegram": {
      "command": "node",
      "args": ["/path/to/Telegram-Bridge-MCP/dist/index.js"],
      "env": {
        "BOT_TOKEN": "your-token",
        "ALLOWED_USER_ID": "your-user-id"
      }
    }
  }
}

VS Code (.vscode/mcp.json)

{
  "servers": {
    "telegram": {
      "type": "stdio",
      "command": "node",
      "args": ["/path/to/Telegram-Bridge-MCP/dist/index.js"],
      "env": {
        "BOT_TOKEN": "your-token",
        "ALLOWED_USER_ID": "your-user-id"
      }
    }
  }
}

Tools — The v6 API

Version 6 consolidates the entire API into 4 tools with type-based routing. Call help(topic?) at any time for interactive documentation discovery.

send — Outbound Messaging

All outbound operations flow through a single send call. The type parameter determines behavior.

TypeDescription
textFormatted Markdown text; pass audio: "..." to speak via TTS
filePhoto, document, video, audio, or voice note
notificationStatus notification with severity: info · success · warning · error
choiceMessage with inline buttons (non-blocking)
questionBlocking prompt — route with ask, confirm, or choose
dmDM to another session (target_sid or target alias); "direct" accepted as alias
appendAppend text to an existing message
animationStart a cycling status animation
checklistCreate a self-pinning live checklist; requires title, accepts steps array of {label, status} objects
progressCreate an emoji progress bar (width configurable)

Update in-place with action(type: "checklist/update", message_id: ...) and action(type: "progress/update", message_id: ...) respectively. See docs/super-tools.md.

// Examples — token required for all session-scoped calls; session/start and most help topics work without a token
// token: 1234567 (required for all session-scoped calls)
send({ token: 1234567, type: "text", text: "Hello from your AI agent!" })
send({ token: 1234567, type: "notification", severity: "success", text: "Build passed." })
send({ token: 1234567, type: "question", ask: "Proceed with deployment?" })
send({ token: 1234567, type: "checklist", title: "Pipeline", steps: [{ label: "Design", status: "pending" }, { label: "Implement", status: "pending" }, { label: "Review", status: "pending" }, { label: "Deploy", status: "pending" }] })
send({ token: 1234567, type: "progress", title: "Processing files", percent: 40, subtext: "4 of 10 complete", width: 10 })

dequeue — Receive Inbound Events

Long-poll for the next inbound event: messages, button presses, voice notes, slash commands, reminders.

Note: token is the integer returned by action(type: "session/start").

dequeue({ token: 1234567 })              // default timeout — idles until event
dequeue({ token: 1234567, timeout: 0 }) // non-blocking drain (coordination gates)

action — Universal Dispatcher

RESTful path routing via type. Supports progressive discovery:

  • Omit type → list all categories
  • Pass a category → list sub-paths
  • Pass a full path → execute
Full action reference

Session

session/start · session/close · session/list · session/rename · session/idle

Profile

profile/voice · profile/topic · profile/save · profile/load · profile/import · profile/dequeue-default

Reminder

reminder/set · reminder/cancel · reminder/list

Animation

animation/default · animation/cancel

Message

message/edit · message/delete · message/pin · message/route · message/history · message/get

Chat

chat/info

Super Tools

checklist/update · progress/update

Confirm Presets

confirm/ok · confirm/ok-cancel · confirm/yn

Standalone

react · acknowledge · show-typing · commands/set · logging/toggle · transcribe · download

Governor-only

approve · shutdown · shutdown/warn · log/get · log/list · log/roll · log/delete · log/debug

help — Documentation Discovery

help()                    // list all topics
help({ topic: "send" })  // targeted reference for a specific tool or type

Multi-Session

Multiple agents can share one bot simultaneously without cross-talk.

session/start → token (integer) → pass on every session-scoped call

Token format: token = sid * 1_000_000 + pin — a single integer, returned by action(type: "session/start").

CapabilityDescription
Isolated queuesPer-session routing; no messages bleed between agents
Color identityOutbound messages prefixed with color + name (e.g., 🟩 Worker 1)
Governor modelFirst session is primary; additional sessions require operator approval via color-picker keyboard
DMsInter-session messaging via send(type: "dm", target_sid: N, ...) (alias: "direct"; target_sid alias: target)
Health monitoringUnresponsive sessions trigger operator prompts to reroute or promote
Graceful teardownOrphaned events rerouted; callback hooks replaced on close

See docs/multi-session-protocol.md for the full routing protocol.


Voice

Transcription (Inbound)

Voice messages are auto-transcribed before delivery. No external API, no ffmpeg required — the Whisper ONNX model is bundled.

WHISPER_MODEL=onnx-community/whisper-base   # default
WHISPER_CACHE_DIR=/path/to/cache            # optional

Text-to-Speech (Outbound)

Triggered by send(type: "text", audio: "..."). Provider is selected automatically:

Environment VariableProvider
TTS_HOSTAny OpenAI-compatible /v1/audio/speech endpoint
OPENAI_API_KEYapi.openai.com
Neither setBundled ONNX model (zero config)

Kokoro (recommended local TTS)

High-quality local TTS with 25+ voices. No API key, no cost.

docker run -d --name kokoro -p 8880:8880 ghcr.io/hexgrad/kokoro-onnx-server:latest
TTS_HOST=http://localhost:8880
TTS_FORMAT=ogg
TTS_VOICE=af_heart

Send /voice in Telegram to browse and sample voices live.

Per-session voice override: action(type: "profile/voice") or /voice in Telegram.


MCP Resources

Five resources are available to any connected client — no tool call required:

URIContents
telegram-bridge-mcp://agent-guideBehavioral guide for AI agents
telegram-bridge-mcp://communication-guideCommunication patterns and loop rules
telegram-bridge-mcp://quick-referenceHard rules + compact tool table
telegram-bridge-mcp://setup-guideSetup walkthrough
telegram-bridge-mcp://formatting-guideMarkdown / MarkdownV2 / HTML reference

Docker

ghcr.io/electricessence/telegram-bridge-mcp:latest

Before running Docker: Create your .env file first by running pnpm pair on a machine with Node.js, or copy .env.example and fill it in manually.

Streamable HTTP (recommended) — run as a long-lived service:

docker run -d --name telegram-mcp \
  --env-file /absolute/path/to/.env \
  -e MCP_PORT=3099 \
  -p 3099:3099 \
  -v telegram-mcp-cache:/home/node/.cache \
  ghcr.io/electricessence/telegram-bridge-mcp:latest

Connect MCP hosts to http://127.0.0.1:3099/mcp.

stdio mode (per-host process, no persistent server)
{
  "command": "docker",
  "args": [
    "run", "--rm", "-i",
    "--env-file", "/absolute/path/to/.env",
    "-v", "telegram-mcp-cache:/home/node/.cache",
    "ghcr.io/electricessence/telegram-bridge-mcp:latest"
  ]
}

The cache volume persists Whisper and TTS model weights across container restarts.


Development

pnpm build      # Compile TypeScript
pnpm dev        # Watch mode
pnpm test       # Run tests
pnpm coverage   # Coverage report
pnpm pair       # Re-run pairing wizard

Agent Setup

To keep agents reliably in the Telegram dequeue loop, install the loop-guard hook for your host. The hook prevents agents from dropping out of the loop on idle or forced stop.

See docs/agent-setup.md for installation instructions for VS Code (GitHub Copilot Chat) and Claude Code.


Documentation

DocContents
docs/setup.mdFull setup walkthrough with per-client config
docs/multi-session-protocol.mdMulti-session routing and governor model
docs/super-tools.mdChecklist and progress bar reference
docs/agent-setup.mdLoop-guard hooks for VS Code and Claude Code
docs/migration-v5-to-v6.mdv5 → v6 tool name mapping
docs/git-index-safety.mdGit index safety notes for multi-agent environments

License

AGPL-3.0-only

Reviews

No reviews yet

Sign in to write a review