讓 LLM 直接操作 PTT — PTT MCP Server

PyPtt 做了很多年,解決的是「怎麼用程式自動化操作 PTT」。但它有個前提:

你得先會寫 Python

想寫一個「每天幫我看某板有沒有關鍵字」的小工具,你得先開個專案、裝套件、查 API、處理登入登出、包排程。做完了,功能是死的,想改條件就又得改程式碼。

MCP(Model Context Protocol)出現之後,這件事情就變得不一樣了。你可以直接跟 LLM 說「幫我看看 Python 板最近有沒有人在討論 uv」,剩下的它自己去翻。

隆重跟大家介紹 PTT MCP Server

這東西在幹嘛

一句話:它是 PyPtt 的 MCP 包裝,讓支援 MCP 的 LLM client 真的登入 PTT 跟站台互動。

不是爬網頁版,不是讀 RSS。是真的用你的帳號連上 ptt.cc,走跟你用終端機一模一樣的路徑。所以你在站上看得到的,它就看得到;你的帳號權限能做的,它就能做。

底層還是 PyPtt 在扛連線跟 VT100 畫面還原 與 PTT 溝通的那些髒活。MCP server 這層只做兩件事:把 PyPtt 的能力翻譯成 MCP tool,以及管理登入狀態。

裝起來

只有 Docker 一條路。沒有 pip,沒有 uvx。

原因很單純:PyPtt 的執行環境有一堆眉角,我不想再收「我這邊裝不起來」的 issue。丟進 image 裡,大家跑的就是同一個東西。

在你的 MCP client 設定檔裡加上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"mcpServers": {
"PTT": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "PTT_ID",
"-e", "PTT_PW",
"ghcr.io/pyptt/ptt_mcp_server:latest"
],
"env": {
"PTT_ID": "你的帳號",
"PTT_PW": "你的密碼"
}
}
}
}

走的是 stdio,所以 docker run -i-i 不能拿掉。image 有 amd64 跟 arm64,M 系列 Mac 直接跑。

如果你有多個帳號,改用 PTT_ACCOUNTS

1
PTT_ACCOUNTS=default=帳號A:密碼A,alt=帳號B:密碼B

然後就可以叫 LLM 用 switch_account 換帳號。要注意分隔字元的限制:名稱不能有 =、帳號不能有 :、密碼不能有 ,

能做什麼

目前 29 個 tool。大致分成幾類:

讀:

  • get_post 取文章,支援 AID、index、搜尋條件
  • get_newest_index 取某板最新編號
  • get_post_index_range 給一個日期,二分搜尋出當天的文章區間
  • get_board_info / get_all_boards / get_favourite_boards / get_bottom_post_list
  • get_user / search_user 查使用者
  • get_aid_from_url 從網址拿 AID,這是唯一不用登入的

寫:

  • post 發文、reply_post 回文、del_post 刪文與劣退
  • comment 推噓箭頭
  • mail / get_mail / del_mail 站內信
  • give_money 轉 P 幣

帳號與板務:

  • login / logout / whoami / list_accounts / switch_account
  • set_board_title 改板標、bucket 水桶,這兩個要板主權限

有了這些,「幫我把這篇文章的推文整理成重點」「看看 Gossiping 昨天有沒有人提到 XXX」「幫我回這篇文,語氣客氣一點」這種話就直接可以講。

注意

這個 server 沒有唯讀模式,沒有程式層的確認機制,沒有白名單。

LLM 呼叫 del_post,文章就真的會刪掉。呼叫 give_money,P 幣就真的會轉出去。

目前的保護只有一層:所有具破壞性的 tool,在 docstring 裡都寫了給 LLM 看的祈使句——「重要!務必遵守!執行前務必顯示內容並與使用者確認後才可以執行。」

這是 prompt engineering,不是技術保證。它大部分時候有效,但它不是防護欄,它是請求

所以我在 README 裡寫得很直白:先讀後寫,確認再執行。我知道這句話擋不住真正的意外,但至少讓你知道風險在哪。

另外,帳號密碼是明文的環境變數。沒有加密、沒有檔案來源選項。這個設定檔就是你的密碼,請當作密碼來對待。

如果你要拿它跑無人值守的自動化,我的建議是開一個小帳,而不是用你養了十幾年的主帳號。

結語

PyPtt 解決的是「程式能不能操作 PTT」。

ptt_mcp_server 解決的是「不寫程式的人,能不能操作 PTT」。

PyPtt 的第一個 commit 是 2017 年,ptt_mcp_server 是 2025 年。中間隔了八年。有點久,但工具鏈就是這樣,得等生態長出來。

如果你裝起來遇到問題,或是覺得哪個 tool 的行為很怪,開 issue 給我。特別是安全性那塊,我知道現在的做法不夠,歡迎討論怎麼做比較好。

也許你也會想看看