Secure Telegram

io.github.antonorlov由 GitHub 帳號 antonorlov 發布v0.3.3更新於 Nov 4, 2026

Telegram MCP server: each AI client gets its own key, scoped to chosen chats. Read-only by default.

已驗證STDIO僅桌面溝通與協作安全與監控

概覽

AI 產生的概覽

在本機執行的 Telegram MCP 伺服器,讓每個 AI 用戶端各自取得獨立、預設唯讀的端點金鑰,不必交出完整帳號工作階段。

可以做什麼
  • 讀取聊天:列出對話、主題、成員與聊天資訊,取得置頂訊息,取得與搜尋訊息,檢視媒體資訊
  • 在嚴格大小上限內將媒體下載到伺服器指定的位置
  • 傳送與編輯訊息,並透過會過期的句柄分兩階段準備與傳送本機媒體
  • 取得授權後可執行其他寫入:儲存草稿、刪除訊息、標記已讀、新增表情回應、轉寄訊息
  • 每次呼叫都會依封存政策重新驗證端點的權限動詞,未授權即失敗關閉
適用情境
當你希望助理讀取或操作 Telegram 聊天,但不想把完整帳號工作階段交給用戶端時使用。適合不同代理需要不同權限範圍的情境,例如僅限某個資料夾的唯讀工作代理,以及具備寫入權限的個人代理。
執行需求
需要 Node.js 20.10 以上版本,以及來自 my.telegram.org/apps 的 Telegram api_id 與 api_hash。先在終端機執行一次 setup 指令完成登入(QR 碼或手機號碼加驗證碼,若啟用兩步驟驗證還需密碼)並建立端點,金鑰只會列印一次。用戶端接著透過 stdio 執行此套件,並設定 TELEGRAM_MCP_ENDPOINT_TOKEN 環境變數。使用 PIN 模式時每次重新開機後需互動解鎖。
安裝前請注意
端點權杖是憑證,只顯示一次並用來授權該端點,請勿放入共用設定。在同一個用戶端合併多個端點項目,會讓該用戶端取得這些範圍的聯集。寫入類動詞可在真實聊天中傳送、編輯、刪除、轉寄訊息與新增回應,轉寄需同時具備來源與目標聊天的權限。忘記 PIN 無法復原。限速只能降低而無法避免 Telegram 的洪水限制或封鎖。清洗無法阻止訊息文字中的語意提示注入,防護邊界是本機作業系統使用者。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Secure Telegram,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

[secure-telegram-mcp — all your Telegram accounts, one scoped endpoint per AI client]

Connect Claude, Cursor, or any MCP client to Telegram — without handing any of them your whole account.

[MCP Server] [Node] [License: MIT] [npm] [CI]

[Terminal demo: QR login, creating a read-only Work endpoint, and the resulting single-endpoint MCP client config.]

The demo runs against synthetic data — no real Telegram connection, no usable credential.

❌ The usual Telegram MCP setup

  • The AI client holds your full account session — every chat, every contact, every write.
  • Access is all-or-nothing: your work agent can read your family group.
  • The session credential sits in plaintext in a config file or .env.

✅ With secure-telegram-mcp

  • Each AI client gets an endpoint: its own API key, scoped to the chats and folders you pick.
  • Read/write verbs are re-checked on every call and fail closed — the tool menu is discovery, not authority.
  • The Telegram session is encrypted at rest (AES-256-GCM, scrypt-wrapped keys), machine-bound by default or PIN-protected.

For example:

AI clientEndpointAccountTelegram scopeAccess
Personal agentpersonalmainprivate chatsread + write
Work agentworkwork-accthe Work folderread-only

Every MCP connection authenticates with one endpoint key and receives a scope-bound Telegram adapter for that endpoint's account; without a key, a client can only list the tools. Endpoints can ride different logged-in accounts; endpoints on the same account share one background Telegram connection. Out-of-scope chats are not addressable at all.

Features

  • 🔑 Per-endpoint API keys — each AI client gets its own key and scope, pinned to one of your logged-in accounts (one or many); only salted key hashes are stored.
  • 📁 Folder-scoped access — bind an endpoint to Telegram folders, chats, or channels; write access is opt-in per endpoint.
  • 🔒 Encrypted session at rest — AES-256-GCM envelopes for sessions and policy; PIN, recovery-keyfile, and machine-bound unlock slots.
  • 🚦 Anti-ban pacing — per-account token buckets on messages, forwards, and search, plus a circuit breaker that backs the whole account off at the first sign of saturation. Pacing lowers the risk of flood limits; nothing can guarantee against a ban.
  • 👤 Human-in-the-loop writes — optional per-endpoint confirmation; requires a client that supports MCP elicitation. On clients that don't, a confirm-writes endpoint fails closed: writes are blocked, never silent.
  • ⛔ No raw MTProto surface — no invoke escape hatch, no model-accessible scope mutation; a CI architecture guard keeps it that way.

Quickstart

Prerequisites: Node.js ≥ 20.10 and Telegram api_id/api_hash from my.telegram.org/apps.

1. Run setup

bash
npx -y secure-telegram-mcp setup

Setup walks you through, in order:

  1. Telegram app credentials — the api_id / api_hash from the prerequisite link.
  2. Login method — QR code (scan from a phone that's already logged in) or phone number + code. If your account has two-step verification, setup also asks for that password.
  3. Session name — press Enter to accept the suggestion (your Telegram username, or main if you have none).
  4. PIN or no PIN — default is no PIN (encryption keyed to this machine, nothing to unlock). With a PIN you re-enter it after each reboot; a forgotten PIN is unrecoverable.
  5. Endpoint — name it, then pick chats/folders in the picker: r or Space grants read, w write, s saves, ? shows the full keymap.

At exit the endpoint's API key is printed once, inside a ready-to-paste client config — copy it before closing the terminal. Hit a snag? See Troubleshooting.

2. Add the endpoint to one MCP client

json
{  "mcpServers": {    "telegram": {      "command": "npx",      "args": ["-y", "secure-telegram-mcp", "connect"],      "env": {        "TELEGRAM_MCP_ENDPOINT_TOKEN": "tgmcp_..."      }    }  }}

The token alone selects and authorizes the endpoint — no api_id, api_hash, or PIN material ever goes into client config. Setup prints one block per endpoint; each goes only into its own client — combining entries in one client intentionally grants it the union of the scopes.

Claude Code
bash
claude mcp add telegram --env TELEGRAM_MCP_ENDPOINT_TOKEN=tgmcp_... -- npx -y secure-telegram-mcp connect
Claude Desktop

Add the JSON block above to claude_desktop_config.json (Settings → Developer → Edit Config).

Cursor

[Install in Cursor]

Run setup first, then click and replace the placeholder token — or add the JSON block above to ~/.cursor/mcp.json yourself.

VS Code

[Install in VS Code]

VS Code prompts for the endpoint token as a masked secret — it never lands in a settings file in plain sight of other extensions' recommendations.

Docker

See Usage and operations → Docker for the setup and stdio-connect containers.

3. Unlock (PIN posture only)

If you kept the default machine-bound protection, skip this — the service starts automatically when a client connects. With a PIN:

bash
npx -y secure-telegram-mcp start

Enter the PIN interactively; clients never need it. Multi-client examples, unattended unlock, environment variables, and manual policy editing live in Usage and operations.

Tools

18 tools, gated by 8 permission verbs that are checked at execution time.

CategoryToolsVerb
Readget_messages, search_messages, list_dialogs, list_topics, get_chat_info, get_media_info, get_pinned_messages, list_participantsread
Media downloaddownload_media (strict size cap, server-chosen destination)read_media
Send & editsend_message, edit_message, prepare_media, send_mediasend
Other writessave_draft, delete_message, mark_read, send_reaction, forward_messagedraft, delete, mark_read, react, forward

Forwarding is two-sided: read on the source chat and forward on the destination. Sending local media is a deliberate two-phase flow — prepare_media returns an opaque, expiring handle for a file inside the confined media root; send_media consumes it. The full catalogue and verb semantics are in Usage and operations.

Security model

  • One local service owns the encrypted Telegram session and the sealed policy; MCP shims never open a second Telegram session.
  • Every call re-verifies the endpoint token against the current sealed policy, so rotating a key revokes live connections.
  • There is no raw MTProto tool and no way for the model to widen its own scope.
  • Writes pass ACL → optional human confirmation → quota → audit, in that order, and fail closed at each gate.
  • Telegram prose is Unicode-sanitized (control/format characters stripped, length-capped) before it reaches the model; writes, denials, and media egress land in an append-only NDJSON audit log.
  • Known limits: the enforcement boundary is your local OS user; endpoint ACLs cannot shrink what the underlying full-account session could do if the process itself were compromised; sanitization cannot neutralize semantic prompt injection.

A read-only endpoint attempting send_message is stopped at the ACL gate and audited — one NDJSON line, no message content:

json
{"v":1,"timestampIso":"2026-07-17T09:41:22.310Z","endpointName":"work","verb":"send","outcome":"deny","targetChatId":"-1001234567890","reason":"VERB_NOT_GRANTED"}

The client sees only an ACL_DENIED error. An out-of-scope peer denies the same way, with PEER_OUT_OF_SCOPE.

Read the complete threat model — including non-objectives and residual risks — before pointing this at a Telegram account you care about. Component boundaries are in Architecture.

Documentation

  • Usage and operations — clients, endpoints, commands, environment variables, Docker, media, tool catalogue.
  • Security — threat model, guarantees, residual risks, hardened deployment.
  • Architecture — process ownership, trust boundaries, policy lifecycle.
  • Example configuration — schema-valid, deliberately unusable placeholders.

Development

bash
npm run ci     # typecheck + lint + architecture guard + knip + testsnpm run build

The architecture guard rejects forbidden MCP surfaces and unreviewed MTProto request constructors; ESLint enforces dependency boundaries and confines GramJS to the infrastructure layer. See CONTRIBUTING.md before opening a PR.

License

MIT


Unofficial project: not affiliated with, endorsed by, or sponsored by Telegram FZ-LLC. "Telegram" is a trademark of Telegram FZ-LLC. This software connects to the Telegram API; each user supplies their own API credentials.

來源:README.md,提交 b6a696a

工具

0
SourceWeft 曾在隔離沙箱中以無憑證方式啟動該軟體包一次,以列出其工具,但未能完成:伺服器未能啟動。

版本歷史

1
  1. v0.3.3最新Nov 4, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分