Telegram bridge for your MCP-compatible agent. Bidirectional, no LLM in our stack.
One address for any MCP client. Your key stays in your Odel vault.
At most: moves money, runs code or commands, deletes data, or sends messages for you.
Odel charges nothing per call. The publisher may charge for its own service.
Odel could not list its tools without signing in.
Bidirectional Telegram ⇆ agent bridge. No LLM in our stack.
Your agent (Claude Desktop, Cursor, a custom script) is the brain. Our platform is the pipe: we take messages you send on Telegram, store them, and hand them to your agent when it polls. When your agent has something to say back, it pushes through us to your Telegram.
get_new_messages pulls inbound, send_telegram_message pushes outbound./help, /clear, /recent, /window, /usage all work even if your agent is offline.Hosted at telegram.regiq.in or self-host with the Docker Compose below.
Visit https://telegram.regiq.in, sign in with Google.
DM @BotFather → /newbot. Paste the token in your dashboard.
On the dashboard: Generate MCP API key, copy it.
Add to Claude Desktop's claude_desktop_config.json (or Cursor / any MCP client):
{
"mcpServers": {
"telegram": {
"url": "https://telegram.regiq.in/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_KEY_HERE"
}
}
}
}
Send /start to your bot on Telegram.
Now your agent can call get_new_messages to see what you sent it, and send_telegram_message to reply.
| Tool | Direction | Notes |
|---|---|---|
get_new_messages() | user → agent | Returns inbound messages since the last pull. Read-once. |
send_telegram_message(text) | agent → user | Delivers text to the user's Telegram bot. |
list_recent_messages(max=20) | read | Last N stored messages, both directions. No cursor advance. |
clear_history() | action | Wipes stored history for the user. |
Handled by the platform directly — your agent isn't involved. So /help works even when nothing is polling.
| Command | Effect |
|---|---|
/start | Registers this Telegram chat with your account. |
/help | Lists commands. |
/recent [N] | Shows the last N stored messages. |
/clear | Wipes history. |
/window N | Sets the history window (default 20). |
/usage | Stored message count. |
You'll need:
openid, email, profile. Redirect: <PUBLIC_BASE_URL>/api/auth/callback/googlengrok http 3012 locally)No LLM key required. Your agent brings its own model.
git clone https://github.com/globalion/telegram-mcp
cd telegram-mcp
cp .env.example .env
# fill NEXTAUTH_SECRET, GOOGLE_*, PUBLIC_BASE_URL
docker compose up -d
# open http://localhost:3012
Telegram app Your MCP agent
▲ │ ▲ │
│ │ text poll │ │ push
│ ▼ │ ▼
┌──────────────────────────────────────────────────┐
│ Our platform (Hetzner) │
│ - /api/telegram/webhook/<per-user-secret> │
│ · slash-commands answered here │
│ · plain text stored, no reply │
│ - /api/mcp Bearer-auth JSON-RPC │
│ · get_new_messages, send_telegram_message │
│ · list_recent_messages, clear_history │
│ - Postgres: User, ApiKey, TelegramLink, Message │
└──────────────────────────────────────────────────┘
Per-user webhook URL segment is a random secret so a leaked bot token can't be pointed at someone else's account. Google sign-in is identity + ban anchor only — per-message identity comes from the MCP API key + chatId.
MIT. See LICENSE.