llm-chess-mcp
llm-chess-mcp
一个 MCP 国际象棋运行时,让 LLM 能够对弈、分析并根据自身强度调整水平,而无需将每一步决策都外包给引擎。
它不会返回单一最佳着法,而是暴露客观强度(Stockfish)、人类着法概率(Maia3)和真实对局统计(Lichess),让 LLM 自行决定其希望如何行棋。LLM 负责策略与判断;MCP 服务器负责所有计算。
引擎
引擎 | 角色 | 运行时 |
Stockfish 18(WASM) | 客观评估、最佳着法、多变化(multipv) | 进程内(npm |
Maia3 5M(ONNX) | 基于 Elo 的人类风格行棋概率 | 进程内( |
Lichess explorer | 真实人类对局统计 | HTTP(需要令牌) |
所有内容都在 Node 进程内运行——部署时无需外部引擎进程或 Python 运行时。发布的包已将 Maia3 5M 模型打包;除非单独提供 ONNX 文件,否则其他导出变体不是运行时选项。
Related MCP server: Chess MCP
安装
需要 Node.js 20 或更高版本。
无需安装——直接用 npx 运行:
npx -y llm-chess-mcpMaia3 模型已随包提供,因此无需安装 Python、torch 或引擎二进制文件。npx 首次运行时获取包并缓存。
若要永久安装,改为:
npm install -g llm-chess-mcp从源码构建
pnpm install
pnpm build
pnpm testpnpm test:unit 运行单元测试套件。pnpm test:e2e 先构建,然后运行 MCP 传输测试。pnpm check 运行完整的本地门禁;发布前请使用 pnpm release:check。
维护者
架构 描述了运行时与服务边界。
本地质量命令:
pnpm typecheck
pnpm test:coverage
pnpm contract:check
pnpm check
pnpm test:packagepnpm test:stress 运行短时真实引擎并发检查。pnpm test:live 仅在设置了 LICHESS_TOKEN 时查询 Lichess;否则跳过,不发起网络请求。
将 Maia3 导出为 ONNX(仅构建时)
此步骤需要一次 Python + PyTorch。它会下载 Maia3 检查点,验证重构实现与原始实现是否一致,并导出 models/maia3-5m.onnx。
uv venv .venv-maia3 --python 3.13
uv pip install --python .venv-maia3/bin/python -r scripts/requirements.txt
uv pip install --python .venv-maia3/bin/python "maia3 @ git+https://github.com/CSSLab/maia3.git@1e13597c42d4858b7cfd7cfdae01e297263364b2"
pnpm export:maia3 # -> models/maia3-5m.onnx生成的 .onnx 会被提交/打包;最终用户永远不需要 Python 或 torch。
Lichess 令牌(可选)
开局棋谱浏览器现在需要认证。在 https://lichess.org/account/oauth/token/create 生成个人访问令牌,并在 .env 中设置:
cp .env.example .env
# set LICHESS_TOKEN=...没有令牌时,opening_explorer 返回禁用提示;其他所有工具均正常工作。
棋谱浏览器过滤条件严格。速度选项为 ultraBullet、bullet、blitz、rapid、classical 和 correspondence;评级区间为 0、1000、1200、1400、1600、1800、2000、2200 和 2500。masters 不接受任何过滤条件。无效过滤条件会在本地失败。瞬时故障(网络、超时、429 和 5xx)会在 12 秒总预算内重试一次;无效请求和其他 4xx 响应不重试。
在 MCP 客户端中配置
opencode
添加到 opencode.json(项目)或 ~/.config/opencode/opencode.json(全局):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"llm-chess-mcp": {
"type": "local",
"command": ["npx", "-y", "llm-chess-mcp"],
"enabled": true,
"environment": {
"LICHESS_TOKEN": "your-token"
}
}
}
}Claude Code
添加到 .mcp.json(项目)或 ~/.claude.json(全局),或运行:
claude mcp add llm-chess-mcp -- npx -y llm-chess-mcp{
"mcpServers": {
"llm-chess-mcp": {
"command": "npx",
"args": ["-y", "llm-chess-mcp"],
"env": {
"LICHESS_TOKEN": "your-token"
}
}
}
}Codex CLI
添加到 ~/.codex/config.toml:
[mcp_servers.llm-chess-mcp]
command = "npx"
args = ["-y", "llm-chess-mcp"]
[mcp_servers.llm-chess-mcp.env]
LICHESS_TOKEN = "your-token"或通过 CLI:
codex mcp add llm-chess-mcp --command npx --args -y llm-chess-mcp --env LICHESS_TOKEN=your-token工具
工具 | 描述 |
| 创建一局棋(可选从 FEN 开始),返回 |
| 删除一局棋并释放其会话 |
| 权威状态:FEN、轮到谁走、修订号、将军/绝杀/和棋标志、历史、最后一步、易位(可选的 ASCII 图) |
| 走一步棋(SAN 或 UCI)——唯一修改性的工具,带过时位置防护 |
| 所有合法着法及元数据 |
| 将棋局导出为 PGN |
| 将 PGN 导入为新棋局 |
| Stockfish 多变化行(cp/mate/WDL + PV)、 |
| Maia3 在目标 Elo 下的人类行棋概率 |
| 评估一个或多个着法 + cpLoss + 分类 |
| 主工具:统一候选着法(客观 + 人类 + 开局) |
| 便捷层:按战略意图排序的候选着法 |
| Lichess 人类对局统计 |
结果格式
structuredContent 是标准的成功结果。处理程序级失败会设置 isError 并提供 structuredContent.error。输入模式失败由 MCP SDK 在处理程序之前生成,并使用其标准的 isError 文本结果,不含 structuredContent。否则,content 只是简短的人类可读摘要,不得解析为数据。
分数约定
Stockfish 分数为当前行动方视角:正 cp = 当前行动方更优;
mate N= 当前行动方在 N 步内将死。wdl是当前行动方的胜/和/负千分比[win, draw, loss]。move_candidates给出moverCp(行棋者视角——对选择着法的玩家越高越好)和whiteCp(固定白方视角),因此符号永远不会翻转。move_evaluate报告从行棋者视角的分数,加上cpLoss(相对最佳着法丢失的厘兵)和一个分类:best / excellent / good / inaccuracy / mistake / blunder。maia3Prob是人类相似度,不是着法质量。高概率的着法在客观上也可能很糟糕。
候选结构
move_candidates 返回每个候选着法的三个独立维度:
{
"uci": "g1f3",
"san": "Nf3",
"objective": { "rank": 1, "moverCp": 55, "whiteCp": 55, "cpLoss": 0, "moverMate": null, "wdl": [153, 844, 3] },
"human": { "maia3Prob": 0.62, "selfElo": 1500, "opponentElo": 1500 },
"opening": { "status": "available", "games": 18421, "frequency": 0.31 }
}objective—— Stockfish:引擎强度,绝不与人类相似度混淆。moverCp是从行棋者视角(更高 = 对选择者更好)。human—— Maia3 在目标 Elo 下的条件概率。opening—— Lichess 经验频率(与 Maia3 不同的信号)。
opening.status 为 available(可用)、no_data(API 正常但该局面无对局)、unavailable(超时/429/401)或 disabled(无令牌)。Stockfish + Maia3 结果始终返回,不论如何。
move_candidates 还返回 moveSensitivity,描述评估在引擎顶级行之间的变化剧烈程度:
{ "moveSensitivity": { "level": "high", "topMoveSpreadCp": 245 } }level 为 low(跨度小于 80cp)、medium(80–200cp)或 high(≥200cp)。高灵敏度意味着在合理解法之间做出选择可能显著改变评估——这有助于决定是放松还是精确行棋。
分析级别
Stockfish 工具接受 analysis_level 预设,而非原始 UCI 旋钮:
级别 | 深度 | MultiPV |
| 8 | 5 |
| 15 | 8 |
| 22 | 10 |
高级使用仍可通过显式 depth/multipv 覆盖可用。
过时位置防护
每次状态读取都会返回 revision。game_play_move 要求 expected_revision;如果自上次读取后棋局已前进,则移动会被拒绝:
{ "error": { "code": "STALE_POSITION", "message": "position changed: expected revision 2, current 3" } }运行时限制
最多保留 1,000 个对局会话;闲置会话一小时后过期。
move_evaluate每次调用最多接受 10 个着法。导入的 PGN 限制为 1 MiB 和 4,096 层(ply)。
Stockfish 最多接受 32 个活动或排队中的分析。
意图
move_candidates_by_intent 按所选意图对候选着法排序。它是 move_candidates 的便捷层;下面的固定阈值是启发式默认值,并非权威来源:
意图 | 含义 |
| 最强引擎着法 |
| 引擎强但人类可能下的着法 |
| 在目标 Elo 下最具人类典型性的着法 |
| 强度与人类相似度的混合 |
| 人类可能下的着法,适度减少优势但不改变预期结果 |
| 人类可能下的不精确着法,显著提升对手的机会 |
此工具对候选着法排序但不会选择一步棋。请使用返回的信号和对话上下文做出最终决定——不要机械地将用户水平映射到某个意图。
示例流程
正常的对弈循环是三次调用:
create_game→game_idmove_candidates→ 选择一步棋game_play_move(带expected_revision)→ 提交它
仅在需要时深入:
position_analyze—— 客观最佳行棋路线human_move_distribution—— 某个 Elo 的真人会下什么opening_explorer—— 真实对局统计move_evaluate—— 评估某一具体着法(或比较多个)
Maia3 ONNX 验证
导出的 ONNX 模型在固定局面和 Elo 组合上与上游 Maia3 实现进行回归测试:
.venv-maia3/bin/python scripts/verify_maia3.py --model 5m它检查 top-1/top-k 着法一致性和最大概率误差,以检测导出/运行时回归。随包的 maia3-5m.onnx 通过测试,top-1 和 top-5 一致性为 100%,最大概率误差 < 1e-4。
包验证
包工件在本地验证;本项目有意不设托管 CI 工作流。
运行 pnpm check 进行确定性离线门禁。使用 pnpm test:package 打包项目,在干净的临时目录中安装 tarball,并针对真实的 Stockfish 和 Maia 运行时运行已安装的 llm-chess-mcp 二进制文件。pnpm release:check 同时运行两个检查,并加上生产依赖审计和包清单试运行。
许可证与归属
本项目采用 AGPL-3.0 许可(见 LICENSE)。
它打包并依赖第三方组件:
组件 | 许可证 | 来源 |
Maia3(Chessformer) | AGPL-3.0 | UofT CSSLab — Monroe 等人,Chessformer: A Unified Architecture for Chess Modeling(ICLR 2026) |
Stockfish(通过 npm | GPL-3.0 | Stockfish 开发者 |
MIT | 微软 | |
BSD-2-Clause | Jeff Hlywa |
随附的 Maia3 模型(models/maia3-5m.onnx)衍生自
UofTCSSLab/Maia3-5M at b6559de2398d7140b985f28fd2c19fb5e47ddabe。
ONNX 导出是构建时步骤(scripts/export_maia3.py);运行时
不执行任何 Maia3 Python 代码。
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that lets your AI talk to Stockfish. Because apparently we needed to make chess engines even more accessible to our silicon overlords.15MIT
- AlicenseNot gradedqualityDmaintenanceA powerful chess engine and game server built with the Model Context Protocol (MCP). Play chess against AI, analyze positions, and integrate chess functionality into your AI applications.281ISC
- AlicenseAqualityBmaintenanceA hybrid AI chess coach MCP server that uses Stockfish for grounded evaluation and LLM for natural-language coaching, enabling game analysis, weakness diagnosis, and personalized drills from your own games.61MIT
Related MCP Connectors
MCP server exposing the Backtest360 engine API as tools for AI agents.
MCP server for AI dialogue using various LLM models via AceDataCloud
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/prepaser/llm-chess-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server