claude-codetelegramMCPwindowsossultra-lab

撐住 Claude Code + Telegram MCP 的三個 Windows 痛點:一個 200 行的工具包

· 11 分鐘閱讀

撐住 Claude Code + Telegram MCP 的三個 Windows 痛點:一個 200 行的工具包

我每天用 Telegram 跟 Claude Code 對話。

不只是輔助介面 — AtlasDropPin 這兩個產品基本上都是這樣 ship 出來的:我在手機上丟一句話,Claude 在電腦端 commit、push、deploy。我人可能在咖啡店、在飛機上、甚至在德國的火車上(7 天分散式 ship 實驗 那篇就是這樣做出來的)。

從旅程中報 ship、到回家後丟 idea、到半夜想到什麼 PR 要回,Telegram 是我最常用的 Claude Code 介面。比 terminal 還常。

跑了幾個月之後,我發現 Windows 上有三個小痛點。沒一個是 bug — 都是 OS 行為 × plugin 假設 之間的縫隙。每個單獨看都很瑣碎,但加起來就是「明明連好了,過一陣子又掛了」的那種惱人感。

今天早上剛好重開機,跟 Claude Code 一起把三個都修了,順手包成一個小 repo 開源:

github.com/ppcvote/claude-tg-windows

下面是三個痛點各自的故事。


痛點一:每次開機都跳一堆 CMD 視窗

我的 Startup 資料夾裡放了幾個 .bat 自動啟動腳本:

  • claude-telegram-startup.bat — TG plugin 的 health check
  • ig_dashboard_autostart.bat — MindThread 的 Flask 後端
  • openclaw-keepalive.bat — 把 WSL2 喚醒給 OpenClaw agent fleet 用

每次 Windows 登入,三個都會跳一個 CMD 視窗閃過去。視窗會自己關,沒實質傷害,但開機畫面就是一陣黑白閃爍。煩。

問題的根源:Windows 直接執行 .bat 一定會開 console window。就算 .bat 內部用 start "" /MIN ... 把子程序 minimize 了,.bat 自己跑的那一瞬間還是會開窗。

解法簡單但要稍微繞一下:

  1. 把所有 .bat 從 Startup 資料夾搬出來到一個普通工作目錄(我放 %USERPROFILE%\boot-scripts\
  2. Startup 資料夾只放 .vbs 啟動器,用 WshShell.Run "cmd /c ...", 0, False 隱形呼叫 .bat
  3. windowstyle=0 那個 0 就是「完全隱藏」的意思
Set WshShell = CreateObject("WScript.Shell")
batPath = WshShell.ExpandEnvironmentStrings("%USERPROFILE%\boot-scripts\claude-telegram-startup.bat")
WshShell.Run "cmd /c """ & batPath & """", 0, False

8 行 VBScript,搞定。下次重開:純黑桌面,沒有閃光。


痛點二:Telegram polling 跑一陣子就掛掉

這個花了我比較久才搞懂。

症狀:早上開 Claude Code,TG 互動順暢;中午回來,Claude 沒掛、Telegram bot 也沒掛、但訊息就是收不到。outbound 還能發、inbound 卻死了。

研究後發現原因:TG MCP plugin 用 long-poll 模式打 getUpdates。Telegram 規定同一個 bot token 同時只能有一個 poller。如果環境裡有兩個 bun.exe process 都在 poll,每次拿到 update 的會是不同的那一個,另一個就空手而回。

那為什麼會有兩個?多半是 上一個 Windows session 留下來的孤兒。 Windows 軟重啟、Claude Code 異常退出、或者 VS Code 直接被關 — 子程序不一定會跟著清乾淨。下次你開 Claude Code,新的 bun 啟動了,舊的還在跑,兩個搶 polling

解法:開機時跑一次 health-check,把 orphan 殺光:

orphans=$(ps aux 2>/dev/null | grep -i "[t]elegram.*server" | grep -i "bun" | awk '{print $2}')
if [ -n "$orphans" ]; then
  echo "$orphans" | xargs kill -9
fi

這支 health-check.sh 由 Startup 那支 silent .vbs 在開機後 15 秒(等網路 ready)呼叫,整體大概 20 行 bash。乾淨。


痛點三:不小心開兩個 Claude,自己 zombie 自己

痛點二是「上次留下的」orphan。痛點三是 這次自己創造的 zombie。

場景:我已經在 VS Code 開了一個 Claude session,TG 連上了。然後因為某個原因(demo、看 log、隨手測試)我又在另一個 terminal claude 了一下。第二個 Claude 也會 spawn 一份 TG plugin — 兩份 bun 互相搶 polling,第一個 session 開始掉訊息。

這個情境健身一定要靠持續監控才能抓 — health-check 只在開機跑,抓不到啟動後新生的 zombie。

解法:寫一支 PowerShell,找出所有 cmdline 帶 claude-plugins-official/telegrambun.exe如果超過一個就保留最新的,殺掉舊的

$wrappers = @(Get-CimInstance Win32_Process -Filter "Name='bun.exe'" | Where-Object {
    $_.CommandLine -match 'claude-plugins-official[\\/]telegram'
})
if ($wrappers.Count -le 1) { exit 0 }

$sorted = $wrappers | Sort-Object CreationDate -Descending
$keep = $sorted[0]
$kill = $sorted[1..($sorted.Count - 1)]

foreach ($w in $kill) {
    Get-CimInstance Win32_Process -Filter "ParentProcessId=$($w.ProcessId)" | ForEach-Object {
        Stop-Process -Id $_.ProcessId -Force
    }
    Stop-Process -Id $w.ProcessId -Force
}

掛上 Task Scheduler,每 2 分鐘跑一次

schtasks /Create /TN TGZombieKiller /TR "powershell -NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File ..." /SC MINUTE /MO 2 /F

這個方案的安全前提:你同時只會開一個 Claude Code session。對我成立。對你也成立的話,這支腳本就是純益。


為什麼把這 200 行開源

老實說我猶豫過。Telegram MCP plugin 本體是 Anthropic 寫的,重活全在那邊。我這 200 行是純黏合 — PowerShell + Bash + VBScript,沒一行技術深度。

但今天早上跟 Claude 一起做完之後,我跟它說「感覺我做得不多」,它的回應大致是:「份量不大,但這是你實測幾個月的結果。對下一個踩同樣坑的 Windows 用戶來說,這 200 行就是省下他幾個小時 debug 的時間。」

成立。所以開源。MIT。包含一鍵 install.ps1,idempotent,有 -Uninstall

github.com/ppcvote/claude-tg-windows

如果你也在 Windows 跑 Claude Code + Telegram MCP plugin、也踩到上面任一個坑 — 拿去用。Issue / PR 歡迎。


Ultra Lab 的 OSS 累積一篇接一篇地長。從 UltraProbeMicrosoft Agent Governance Toolkit 的 PR 到今天這個小工具包。不是每件事都是 flagship — 但每件「我們實測過的」都值得寫下來。

每週 AI 自動化實戰筆記

不廢話,只有能直接用的東西。Prompt 模板、自動化 SOP、技術拆解。

加入一人公司實驗室

免費資源包、每日建造日誌、可以對話的 AI Agent。一群用 AI 武裝自己的獨立開發者社群。

需要技術協助?

免費諮詢,24 小時內回覆。