文件 讓 AI 寫 Bot
LLM 直接呼叫工具(MCP)
tools/war3_mcp.py 是一個 MCP 伺服器。Claude Code、Claude Desktop 或任何支援 MCP 的用戶端掛上它,LLM 就能直接看局面、下命令、在螢幕上跟玩家說話、跳出卡片詢問玩家、截圖看畫面,不必先寫程式碼。
tools/war3_mcp.py 是一個 MCP 伺服器(stdio)。Claude Code、Claude Desktop、本機模型的 Agent 框架 —— 任何支援 MCP 的用戶端掛上它,LLM 就能直接看局面、下命令、在遊戲螢幕上跟玩家說話、詢問玩家、截圖看畫面,不必先寫程式碼。
除了寫 Bot、當參謀、讓單位說話,這是另一種接入方式:LLM 自己當工具的使用者。
掛上
claude mcp add war3 -- python <儲存庫>\tools\war3_mcp.py --inst 9 # Claude Code;<儲存庫> 換成你的 openwar3 目錄
其他用戶端照這個格式寫設定:
{"mcpServers": {"war3": {"command": "python", "args": ["<儲存庫>\\tools\\war3_mcp.py", "--inst", "9"]}}}
第一次呼叫工具時才會連線遊戲,所以遊戲可以晚點再開;遊戲關掉重開,下一次呼叫會自動重新連線。加上 --role 限定 LLM 能做什麼:
| 角色 | 能用 |
|---|---|
dev(預設) | 全部工具,包括 war3_jass |
player --player N | 只能指揮 N 號玩家的單位、只看得見它的視野(公平模式);沒有 JASS |
observer | 唯讀,不能在螢幕上繪製、不能讓單位說話;執行環境直接拒絕它下的命令 |
player 角色和閘道的限制一樣:拿不到結束遊戲、調整速度、暫停,拿不到看得見別人底牌的 API,帶玩家編號的查詢只能查自己。
幾個上限:一個工具結果最多 20 萬個字元,超出的部分會截斷並提示怎麼縮小範圍;war3_ask_player 最多等 120 秒;截圖的 scale 在 0.1 到 1 之間。
工具
| 工具 | 做什麼 |
|---|---|
war3_overview | 一頁局面:時間、資源、人口、我方各兵種數量、英雄(血量、魔力、等級、冷卻)、看得見的敵方兵種、生產。先呼叫它 |
war3_units | 單位清單(owner 取 me / enemy / creep / all,types 過濾);addr 用來下命令 |
war3_events | 上次呼叫之後發生的事:死亡、升級、施法、生產完成、聊天、玩家點了按鈕……(預設去掉會洗版的幾種) |
war3_call | 呼叫任意公開 API(move、attack_move、train、build、cast、learn、ui.button、canvas.text……),單位寫成 {"unit": addr} |
war3_api | 查詢 API:依關鍵字搜尋名稱和說明 |
war3_toast / war3_say | 螢幕上方一行字 / 單位頭頂一句話 |
war3_ask_player | 在螢幕中間給玩家幾張選項卡片,等玩家點選,回傳選了哪一個(可以暫停遊戲) |
war3_screenshot | 遊戲畫面截圖(PNG;視窗被擋住也能截,不搶焦點) |
war3_jass | 執行一段 JASS(只開放給 dev;改動世界只限單人局) |
能玩出來的:
- 陪玩 / 教練:
war3_overview看局面,war3_toast在螢幕上給建議; - 邊打邊問玩家:
war3_ask_player跳出三張卡片,玩家點哪張就照哪張來; - 解說:
war3_events讀取發生了什麼,war3_say讓單位自己說出來; - 直接指揮一支部隊:
player角色 +war3_call,只能動自己的單位; - 看圖調整介面:
war3_screenshot截一張,看自己畫的按鈕擺得對不對。
一次對話大概是這樣
你:看看現在的局面,然後在螢幕上問我:下一步是開分礦、暴兵還是升級主城?
→ war3_overview {}
← 一頁局面:遊戲時間、金 500、人口 10/12、我方 htow 1 · hpea 5 · Hpal 1、沒看到敵人、沒有正在生產的
→ war3_ask_player {"question": "下一步?", "options": ["暴兵", "開分礦", "升級主城"], "pause": true}
← {"picked": 1, "option": "開分礦"}
模型:你選了開分礦。我先用 war3_units 找一個閒置的農民,再看最近的金礦在哪裡……
實測
2026-09-25:
- 自己寫的 MCP 用戶端連上真實對局,7/7:交握 → 列出工具(10 個)→
war3_overview(htow1、hpea5)→war3_units→war3_toast→war3_screenshot(PNG 約 20 萬位元組)→war3_ask_player(三張卡片,模擬點第二張 →{"picked": 1, "option": "開分礦"})。 - Claude Code 2.1 實際掛上:它自己啟動伺服器、交握,狀態
connected,10 個工具都以mcp__war3__*出現在它的工具清單裡。
實作
- 以換行分隔的 JSON-RPC 2.0(
initialize/tools/list/tools/call/ping),協定版本 2025-06-18,相容 2025-03-26 和 2024-11-05。 - 工具出錯時依 MCP 的規範放在結果裡(
isError: true),不會斷線。 - 和 閘道 共用同一套角色白名單、單位參數格式和「一頁局面」。
- 日誌走 stderr,stdout 只有協定內容。