Skip to main content
Glama
README.md
# pythia-mcp

讓任何支援 MCP 的 agent(Claude Code、Cursor、自製 agent…)透過 Discord 查詢 wiki-query bot 知識庫。

Discord 是唯一傳輸層 — 不開放任何自架對外端點,也不修改現有的問答 bot。pythia-mcp 以自己的 Discord bot 身分(courier)在指定頻道開 thread 發問,輪詢收集問答 bot(oracle)的回答後組合回傳。

```
Consumer agent ──MCP(stdio)── pythia-mcp ──Discord REST── oracle bot(不修改)
```

詳細需求見 [REQUIREMENTS.md](REQUIREMENTS.md)。

## MCP 工具

| 工具 | 說明 |
|------|------|
| `wiki_ask(question, thread_id?)` | 在主頻道 tag oracle bot 提問,由它開討論串回答(單次約 10–60 秒);回答結尾附 thread_id,帶回 thread_id 即可在同一討論串追問(同 session 上下文) |
| `wiki_status()` | 唯讀健檢:連線、guild/頻道可達、oracle 成員、頻道權限 |
| `wiki_threads()` | 列出當前問答討論串(進行中 + 最近封存) |
| `wiki_read_thread(thread_id)` | 讀取指定討論串完整問答(含起始問題),標註 courier / oracle / other 角色 |

前提:oracle bot 的互動模式必須是「在主頻道被 mention 後,自行從該訊息開 thread 回答」。

## 安裝

需求:Node.js 18+。

```bash
git clone https://github.com/HsYihung/pythia-mcp.git
cd pythia-mcp
npm install
npm run build
```

## Discord 端準備(一次性)

1. 在 [Discord Developer Portal](https://discord.com/developers/applications) 建立一個 application 與 bot,作為 courier 身分,取得 bot token。
2. 在 Bot 設定頁開啟 **Message Content Intent**(否則讀不到回答內容)。
3. 邀請 bot 進目標伺服器,並在發問頻道給它四項權限(不需要任何管理權限;thread 由 oracle bot 開,不需要 Create Public Threads):
   - View Channel
   - Send Messages
   - Read Message History
   - Send Messages in Threads
4. 記下三個 ID(Discord 開發者模式右鍵複製):伺服器 guild ID、發問頻道 ID、問答 bot 的 user ID。

## 接入 consumer 專案

1. 把 courier bot token 放進系統環境變數:

   ```bash
   export PYTHIA_COURIER_TOKEN="你的-bot-token"
   ```

2. 複製 [.mcp.json.example](.mcp.json.example) 到 consumer 專案根目錄,改名為 `.mcp.json`,填入實際值:

   ```json
   {
     "mcpServers": {
       "pythia": {
         "command": "node",
         "args": ["/absolute/path/to/pythia-mcp/dist/index.js"],
         "env": {
           "PYTHIA_COURIER_TOKEN": "${PYTHIA_COURIER_TOKEN}",
           "PYTHIA_GUILD_ID": "在哪個伺服器發問",
           "PYTHIA_ORACLE_CHANNEL_ID": "發問頻道 ID",
           "PYTHIA_ORACLE_BOT_ID": "問答 bot 的 user ID"
         }
       }
     }
   }
   ```

   token 一律用 `${PYTHIA_COURIER_TOKEN}` 引用環境變數,不要明文寫進 `.mcp.json`(`${VAR}` 展開是 Claude Code 的行為;其他 MCP client 若不支援,可改由啟動環境直接繼承該變數)。

3. 重啟 MCP client 後先呼叫 `wiki_status` 確認五項檢查全綠,再用 `wiki_ask` 提問。

### 選填參數

| 環境變數 | 預設 | 說明 |
|----------|------|------|
| `PYTHIA_SILENCE_TIMEOUT_SECONDS` | 10 | 收到第一則回覆後,靜默超過此秒數視為回答結束 |
| `PYTHIA_OVERALL_TIMEOUT_SECONDS` | 180 | 單一問題總逾時(含 bot 思考時間) |
| `PYTHIA_POLL_INTERVAL_SECONDS` | 2 | REST 輪詢間隔 |

啟動時會驗證所有設定與權限,任何缺漏都會直接報出可行動的錯誤訊息(缺哪個變數、缺什麼權限、哪個 ID 錯)。

## 開發

```bash
npm test          # vitest,46 個測試,全部離線(fake client + 虛擬時鐘)
npm run build     # tsc → dist/
npm run dev       # tsx 直接跑 src/index.ts
```

## 已知限制(設計取捨)

- 單次問答延遲約 10–60 秒(oracle agent 推理時間),consumer 端 MCP 工具逾時需設寬。
- 靜默判定可能在 oracle 分段極慢時提早收單,可用 `PYTHIA_SILENCE_TIMEOUT_SECONDS` 調整。
- 高並發場景不適用(Discord rate limit);定位是低頻、高價值的知識查詢。