Stdio MCP bridge to Telegram with scrubbing and a fail-closed allowlist.
MCPpedia last refreshed this data
io.github.antonio-castellon/mcp-telegram-bridge is an MCP server that stdio MCP bridge to Telegram with scrubbing and a fail-closed allowlist. Its tool list has not been published yet over stdio and http, requires no API key, and scores 87/100 on MCPpedia's security, maintenance and efficiency rubric.
Config is the same across clients - only the file and path differ.
{
"mcpServers": {
"telegram-bridge": {
"env": {
"ALLOWED_CHAT_IDS": "-1001234567890",
"TELEGRAM_BOT_TOKEN": "YOUR_BOT_TOKEN_HERE"
},
"args": [
"--from",
"mcp-telegram-bridge",
"mcp-telegram-bridge"
],
"command": "uvx"
}
}
}Are you the author?
Add this badge to your README to show your security score and help users find safe servers.
Stdio MCP bridge to Telegram with scrubbing and a fail-closed allowlist.
Run this in your terminal to verify the server starts. Then let us know if it worked - your result helps other developers.
uvx 'mcp-telegram-bridge' 2>&1 | head -1 && echo "✓ Server started successfully"
After testing, let us know if it worked:
Five weighted categories - click any category to see the underlying evidence.
No known CVEs.
Checked mcp-telegram-bridge against OSV.dev.
Click any tool to inspect its schema.
Be the first to review
Have you used this server?
Share your experience - it helps other developers decide.
Sign in to write a review.
Others in communication
Official TypeScript library for the Telnyx API
Open-source SMS gateway. Turn your Android phone into an SMS API: send and receive SMS from your apps over REST and webhooks. Self-hostable, with a free hosted plan.
Send email and newsletters with Mailtea over MCP, plus skills for email and website design.
CVSS scoring, IOC extraction, email header triage, hash/JWT/timestamp decoding, CISA KEV lookup.
MCP Security Weekly
Get CVE alerts and security updates for io.github.antonio-castellon/mcp-telegram-bridge and similar servers.
Start a conversation
Ask a question, share a tip, or report an issue.
Sign in to join the discussion.

Stdio MCP bridge to the Telegram Bot API, with fail-closed chat admission and outbound scrubbing.
A small Model Context Protocol server that a local agent (Cursor, Claude Desktop, Windsurf, and others) launches on your machine. The agent owns the conversation. This process does Bot API I/O, scrubs outbound secrets, and refuses chats you have not allowed.
Version 0.2.0 changes admission: an empty allowlist denies every chat. Set ALLOWED_CHAT_IDS, or opt in to open mode with ALLOW_ALL_CHATS=1.
Built for client-owned deployments. The bridge is not a hosted bot service. Games and game-master flows are one demo use case, not the product.
Owner: Antonio Castellon / Castellon.CH.
Requirements: Python 3.11+, a bot token from @BotFather, and the numeric id of the chat you want the bot to use.
git clone https://github.com/antonio-castellon/mcp-telegram-bridge.git
cd mcp-telegram-bridge
uv sync --extra dev # or: python -m venv .venv && pip install -e ".[dev]"
cp .env.example .env # set TELEGRAM_BOT_TOKEN and ALLOWED_CHAT_IDS
uv run mcp-telegram-bridge # waits on stdin for MCP JSON-RPC; Ctrl+C to stop
uv.lock pins every dependency with hashes. CI installs from that lock (uv sync --frozen). pip install -e ".[dev]" still works and uses the version ranges in pyproject.toml.
Cursor or Claude Desktop (mcp.json / claude_desktop_config.json):
{
"mcpServers": {
"telegram-bridge": {
"command": "uvx",
"args": ["--from", "mcp-telegram-bridge", "mcp-telegram-bridge"],
"env": {
"TELEGRAM_BOT_TOKEN": "YOUR_BOT_TOKEN_HERE",
"ALLOWED_CHAT_IDS": "-1001234567890"
}
}
}
}
Do not commit a real token. Leave ALLOW_ALL_CHATS unset.
The same operations are available without the MCP server. import mcp_telegram_bridge loads TelegramBridge and Settings only. It does not import the mcp package. Pass Settings directly; Settings.from_env() is the default when you want the environment variables above.
import asyncio
from mcp_telegram_bridge import Settings, TelegramBridge
async def main() -> None:
settings = Settings(
bot_token="YOUR_BOT_TOKEN_HERE",
allowed_chat_ids=frozenset({-1001234567890}),
)
bridge = TelegramBridge(settings)
await bridge.get_me()
await bridge.send_message(
-1001234567890,
"hello",
buttons=[{"id": "ack", "label": "Ack"}],
)
await bridge.get_updates(timeout=0)
await bridge.aclose()
asyncio.run(main())
TelegramBridge(Settings.from_env()) reads TELEGRAM_BOT_TOKEN, ALLOWED_CHAT_IDS, and the other variables. The CLI still prints access-mode warnings to stderr. Library callers can use mcp_telegram_bridge.config.emit_startup_warnings if they want the same lines. The mcp-telegram-bridge command is unchanged.
| Variable | Default | Effect |
|---|---|---|
TELEGRAM_BOT_TOKEN | required | Bot token from BotFather. Never log it or commit it. |
ALLOWED_CHAT_IDS | empty |