claude-codetelegramMCPwindowsossultra-lab

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

· 11 分鐘閱讀
目錄
  1. 痛點一:每次開機都跳一堆 CMD 視窗
  2. 痛點二:Telegram polling 跑一陣子就掛掉
  3. 痛點三:不小心開兩個 Claude,自己 zombie 自己
  4. 為什麼把這 200 行開源

我每天用 Telegram 跟 Claude Code 對話。

不只是輔助介面,Atlas 跟 DropPin 這兩個產品基本上都是這樣 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

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


利益揭露:Ultra Lab、MindThread 與 Ultra Advisor 同屬傲創實業,是同集團產品。

痛點一:每次開機都跳一堆 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/telegram 的 bun.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 累積一篇接一篇地長。從 UltraProbe 到 Microsoft Agent Governance Toolkit 的 PR 到今天這個小工具包。不是每件事都是 flagship,但每件「我們實測過的」都值得寫下來。

常見問題

Windows 開機自動執行 .bat 時,怎麼不讓 CMD 視窗跳出來?

Windows 直接執行 .bat 一定會開 console 視窗,就算 .bat 內部把子程序最小化也一樣。做法是把 .bat 從 Startup 資料夾搬到普通工作目錄,Startup 資料夾只放 .vbs 啟動器,用 WshShell.Run 並把 windowstyle 設成 0 隱形呼叫 .bat,0 就是完全隱藏。

Claude Code 的 Telegram MCP plugin 為什麼過一陣子就收不到訊息?

Telegram MCP plugin 用 long-poll 模式打 getUpdates,而 Telegram 規定同一個 bot token 同時只能有一個 poller。環境裡如果有兩個 bun.exe 都在 poll,每次拿到 update 的只會是其中一個,另一個就空手而回,所以 outbound 還能發、inbound 卻收不到。多出來的那個多半是上一個 Windows session 留下來的孤兒程序。

怎麼清掉上次留下來的 Telegram plugin 孤兒程序?

開機時跑一次 health-check,找出 bun 跑的 telegram server 程序並全部殺掉。文中的做法是由 Startup 資料夾裡的隱形 .vbs 在開機後 15 秒(等網路 ready)呼叫這支 health-check.sh,整體大概 20 行 bash。

同時開兩個 Claude Code session,Telegram 會出什麼問題?

第二個 Claude 也會 spawn 一份 Telegram plugin,兩份 bun 互相搶 polling,第一個 session 就開始掉訊息。開機時的 health-check 抓不到啟動後才新生的程序,要靠持續監控:一支 PowerShell 找出 cmdline 帶 claude-plugins-official/telegram 的 bun.exe,超過一個就保留最新的、殺掉舊的,掛上 Task Scheduler 每 2 分鐘跑一次。這個做法的前提是你同時只會開一個 Claude Code session。

這個 Windows 工具包在哪裡下載?

開源在 github.com/ppcvote/claude-tg-windows,MIT 授權,約 200 行 PowerShell、Bash 與 VBScript,附一鍵 install.ps1,idempotent,也支援 -Uninstall。

每週 AI 自動化實戰筆記

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

加入一人公司實驗室

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

想自己動手試試?

UltraProbe 免費、免註冊,掃一次網站就知道 Google 與 AI 找不找得到你。