llm-chess-mcp
llm-chess-mcp
LLM이 모든 결정을 엔진에 위임하지 않고 체스를 두고, 분석하며, 자신의 실력을 조절할 수 있게 해주는 MCP 체스 런타임입니다.
단일 최선의 수를 반환하는 대신, 객관적 강도(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, 차례, revision, 체크/메이트/무승부 플래그, 기보, 마지막 수, 캐슬링(선택적 ASCII) |
| 수를 둠(SAN 또는 UCI) — 유일한 변경 도구, stale-position 가드 포함 |
| 메타데이터가 포함된 모든 합법적인 수 |
| 게임을 PGN으로 내보내기 |
| PGN을 새 게임으로 가져오기 |
| Stockfish multipv 라인(cp/mate/WDL + PV), |
| 목표 Elo에서 Maia3 인간형 수 선택 확률 |
| 하나 이상의 수 + cpLoss + 분류 점수 계산 |
| 기본 도구: 통합 후보(객관적 + 인간형 + 오프닝) |
| 편의 계층: 전략적 의도에 따라 순위가 매겨진 후보 |
| Lichess 인간 경기 통계 |
결과 형식
structuredContent는 표준 성공 결과입니다. 핸들러 수준의 실패는 isError를 설정하고 structuredContent.error를 제공합니다. 입력 스키마 실패는 핸들러 이전에 MCP SDK에 의해 생성되며, structuredContent 없이 표준 isError 텍스트 결과를 사용합니다. 그 외에는 content가 짧은 사람이 읽을 수 있는 요약일 뿐이며 데이터로 파싱해서는 안 됩니다.
점수 규칙
Stockfish 점수는 수를 둘 측 기준: 양수 cp = 수를 두는 측이 유리함;
mate N= 수를 두는 측이 N수 내에 메이트.wdl은 수를 두는 측 기준[승, 무, 패]를 permille로 표시.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— 목표 Elo에서 Maia3 조건부 확률.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 도구는 원시 UCI 설정 대신 analysis_level 프리셋을 허용합니다:
레벨 | 깊이 | MultiPV |
| 8 | 5 |
| 15 | 8 |
| 22 | 10 |
고급 사용을 위해 명시적 depth/multipv 오버라이드도 계속 사용할 수 있습니다.
Stale-position 가드
모든 상태 읽기는 revision을 반환합니다. game_play_move는 expected_revision을 요구합니다. 마지막 읽기 이후 게임이 진행되었다면 수가 거부됩니다:
{ "error": { "code": "STALE_POSITION", "message": "position changed: expected revision 2, current 3" } }런타임 제한
최대 1,000개의 게임 세션이 유지되며, 유휴 세션은 1시간 후 만료됩니다.
move_evaluate는 호출당 최대 10개의 수를 허용합니다.가져온 PGN은 1MiB 및 4,096플라이로 제한됩니다.
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 5mtop-1/top-k 수 일치와 최대 확률 오차를 확인하여 내보내기/런타임 회귀를 감지합니다. 번들된 maia3-5m.onnx는 100% top-1 및 top-5 일치, 최대 확률 오차 < 1e-4로 통과합니다.
패키지 검증
패키지 아티팩트는 로컬에서 검증됩니다. 이 프로젝트는 의도적으로 호스팅된 CI 워크플로가 없습니다.
결정적 오프라인 게이트에는 pnpm check를 실행하세요. pnpm test:package를 사용하여 프로젝트를 패킹하고, 깨끗한 임시 디렉터리에 tarball을 설치한 후, 설치된 llm-chess-mcp 바이너리를 실제 Stockfish 및 Maia 런타임으로 실행합니다. pnpm release:check는 두 검사에 더해 프로덕션 의존성 감사와 패키지 매니페스트 드라이 런을 실행합니다.
라이선스 및 귀속
이 프로젝트는 AGPL-3.0 라이선스입니다(LICENSE 참조).
타사 구성 요소를 번들 및 의존합니다:
구성 요소 | 라이선스 | 출처 |
Maia3 (Chessformer) | AGPL-3.0 | UofT CSSLab — Monroe et al., 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의 b6559de2398d7140b985f28fd2c19fb5e47ddabe에서
파생되었습니다. ONNX 내보내기는 빌드 시 단계(scripts/export_maia3.py)이며, 런타임은
Maia3 Python 코드를 실행하지 않습니다.
Available Tools
13 toolscreate_gameCreate Chess GameA
Create a new chess game and return its game_id. The server is the authoritative source of board state — never track the board yourself. Optionally pass a FEN to start from a custom position.
| Name | Required | Description | Default |
|---|---|---|---|
| fen | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| game_id | Yes | |
| revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false) already indicate a write operation, but the description adds the critical behavioral directive to treat the server as the source of truth and avoid local board tracking. It also discloses the return of game_id. This goes beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and front-loaded with the primary action. Each sentence adds value: the core function, the state-tracking warning, and the optional parameter explanation. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple create tool with one optional parameter and an existing output schema, the description covers the essential aspects: what it does, return value, usage caution, and parameter semantics. It does not mention error behavior or prerequisites, but these are not critical for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% coverage for the 'fen' parameter, but the description clearly explains that it is optional and used to start from a custom FEN position. This fully compensates for the missing schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb+resource pair ('Create a new chess game') and explicitly states the return value (game_id), making the tool's purpose unambiguous. It also clearly distinguishes from siblings like delete_game and game_import_pgn.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: the server is authoritative and one should never track the board locally, which implies how to use this with other game-state tools. It also notes the optional FEN for custom positions but does not explicitly exclude alternatives like game_import_pgn.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_gameDelete Chess GameCDestructiveIdempotent
Delete a game and free its session.
| Name | Required | Description | Default |
|---|---|---|---|
| game_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | |
| game_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true, so the safety profile is covered structurally. The description adds "free its session" as a mild behavioral note but doesn't disclose permanence of deletion, whether related data (moves, analyses) is destroyed, or access requirements. No contradiction with annotations exists; the description adds modest value over what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exactly one sentence (7 words), front-loaded with the action verb. It's efficient but arguably over-terse — the "free its session" concept and the game_id requirement both deserve elaboration. This borders on under-specification rather than genuine conciseness, though it avoids padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 1-parameter destructive tool with good annotations and an output schema, the description is minimally adequate. The main gap is the unexplained "free its session" semantic — whether deletion is permanent, whether sessions are tied to games, and what the caller should expect afterward. Low complexity lowers the bar, but the session concept creates real ambiguity the description should resolve.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fails to compensate. While game_id is a self-descriptive parameter name, the description doesn't explain how to obtain a valid game_id (e.g., from create_game or game_state), any format expectations, or validation constraints. With zero coverage, the description carries the burden and drops the ball.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Delete a game" clearly identifies the verb and resource, and it implicitly distinguishes from create_game among siblings. However, "free its session" is vague and unexplained — it's unclear what a session is, what freeing it means, or whether it implies releasing resources beyond the game itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, no mention of prerequisites (ownership, active games, permissions), and no reference to sibling tools like create_game as the inverse operation. It neither states exclusions nor implies usage context beyond the literal action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
game_import_pgnImport Chess PGNA
Import a PGN into a new game. Returns a new game_id with the position after all PGN moves. Rejects malformed or illegal PGN.
| Name | Required | Description | Default |
|---|---|---|---|
| pgn | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| fen | Yes | |
| turn | Yes | |
| isDraw | Yes | |
| game_id | Yes | |
| history | Yes | |
| isCheck | Yes | |
| castling | Yes | |
| lastMove | Yes | |
| revision | Yes | |
| isGameOver | Yes | |
| moveNumber | Yes | |
| isCheckmate | Yes | |
| isStalemate | Yes | |
| isDrawByFiftyMoves | Yes | |
| isThreefoldRepetition | Yes | |
| isInsufficientMaterial | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With all annotations false, the description carries the transparency burden. It discloses that a new game is created (side effect), returns a game_id, and rejects invalid PGN. However, it does not mention idempotency, potential side effects on other resources, or permission requirements, but the core side effect is well-stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences: action, result, and error handling. No unnecessary details or redundant phrasing. It is well-structured and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description clearly states the output: 'Returns a new game_id.' It also mentions error rejection. It does not describe the error format or potential additional outputs (e.g., full game state), but for a simple import tool, these details are not critical. The description provides sufficient context for a basic understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'pgn' has no description in the schema. The description implies it is a PGN string by the tool name and purpose, and mentions rejection of malformed PGN, but does not elaborate on acceptable format (e.g., whether headers are required) or provide examples. This is minimal but adequate for a standard chess PGN.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Import a PGN into a new game' and its outcome: 'Returns a new game_id with the position after all PGN moves.' This distinguishes it from sibling tools like create_game, game_pgn, and game_play_move by specifying the input format (PGN) and the new game creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions error behavior ('Rejects malformed or illegal PGN') but does not explicitly indicate when to use this tool versus alternatives, such as when a PGN is available versus starting a blank game with create_game. There is no mention of alternatives or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
game_legal_movesList Legal Chess MovesARead-onlyIdempotent
List all legal moves in the current position (SAN, UCI, piece, capture, promotion).
| Name | Required | Description | Default |
|---|---|---|---|
| game_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| moves | Yes | |
| game_id | Yes | |
| revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description doesn't need to restate these. The description adds behavioral context by listing the output fields (SAN, UCI, piece, capture, promotion), which informs the agent about the nature of the response. No contradictions with annotations are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that clearly states the action and output fields. It contains no filler or redundant information, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no nested objects) and the presence of an output schema, the description adequately covers the necessary context. It specifies the output fields and the operation's scope ('current position'). It could have mentioned edge cases (e.g., no legal moves) or the meaning of 'current position' in terms of move history, but these are not critical for a basic move-listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has one parameter, game_id, with no description coverage (0%). The tool description does not mention game_id at all, leaving its semantics implicit. While the parameter is self-explanatory (identifying the game), the description fails to compensate for the lack of schema descriptions, providing no added meaning beyond the name and type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all legal moves in the current position, specifying the output fields (SAN, UCI, piece, capture, promotion). This distinguishes it from sibling tools like game_play_move (which executes moves) and move_candidates (which may provide candidate analysis), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage is for retrieving legal moves for the current game identified by game_id, but it does not explicitly contrast with alternatives like move_candidates or position_analyze. The context is clear, but no exclusions or specific when-to-use guidance are given, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
game_pgnExport Chess PGNBRead-onlyIdempotent
Export the current game as PGN.
| Name | Required | Description | Default |
|---|---|---|---|
| game_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| pgn | Yes | |
| game_id | Yes | |
| revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description adds no new behavioral context. The word 'Export' is consistent with read-only, but there is no elaboration on side effects, permissions, or response details beyond the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with zero filler. It efficiently states the tool's function without unnecessary detail, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter and an output schema, so the description covers the core action. However, it lacks any guidance on alternatives or parameter specifics, and the lack of usage context means the description is only minimally adequate for the tool's overall adoption.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must clarify the parameter, but it only refers to 'the current game' without explaining that game_id identifies which game. The lone parameter's meaning is left implicit, forcing the agent to infer from the parameter name alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Export') on a specific resource ('the current game') with a clear output format (PGN). It distinguishes from siblings like game_import_pgn (import) and game_state (state retrieval), making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as game_state or game_import_pgn. The description is a single declarative sentence with no context about scenarios, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
game_play_movePlay Chess MoveADestructive
Play a move (SAN like 'e4' or UCI like 'e2e4') and return the resulting state. This is the ONLY tool that mutates the game. expected_revision is required: pass the revision from your most recent game_state/move_candidates read. If the game has advanced since then, the move is rejected with STALE_POSITION.
| Name | Required | Description | Default |
|---|---|---|---|
| move | Yes | ||
| game_id | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| fen | Yes | |
| move | Yes | |
| turn | Yes | |
| isDraw | Yes | |
| game_id | Yes | |
| history | Yes | |
| isCheck | Yes | |
| castling | Yes | |
| lastMove | Yes | |
| revision | Yes | |
| isGameOver | Yes | |
| moveNumber | Yes | |
| isCheckmate | Yes | |
| isStalemate | Yes | |
| isDrawByFiftyMoves | Yes | |
| isThreefoldRepetition | Yes | |
| isInsufficientMaterial | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true, but the description adds critical concurrency behavior: the STALE_POSITION rejection if the revision is outdated. It also states it returns the resulting state, which is useful even with an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences deliver the core action, uniqueness, and concurrency requirement with zero fluff. Each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with an output schema and annotations, the description covers the essential operational details: mutation, concurrency control, error condition, and move format. It is complete enough for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero schema description coverage, the description compensates by explaining the 'move' parameter (SAN vs UCI) and the 'expected_revision' parameter (required, from a recent read, and its role in staleness). The 'game_id' is self-explanatory, so overall it adds substantial meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states 'Play a move' and even clarifies SAN/UCI formats. The unique claim 'This is the ONLY tool that mutates the game' clearly differentiates it from all siblings, which are read-only or other operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use this tool (to make a move) and specifies the required expected_revision from a prior read. It does not explicitly mention alternatives, but by highlighting it's the only mutating tool, it implicitly advises that all other tools are non-mutating.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
game_stateGet Chess Game StateARead-onlyIdempotent
Return the authoritative state of a game: FEN, turn, revision, check/mate/draw flags, move history, last move, castling rights. Use this instead of remembering the board. Set include_ascii=true to also get a board diagram.
| Name | Required | Description | Default |
|---|---|---|---|
| game_id | Yes | ||
| include_ascii | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| fen | Yes | |
| turn | Yes | |
| board | No | |
| isDraw | Yes | |
| game_id | Yes | |
| history | Yes | |
| isCheck | Yes | |
| castling | Yes | |
| lastMove | Yes | |
| revision | Yes | |
| isGameOver | Yes | |
| moveNumber | Yes | |
| isCheckmate | Yes | |
| isStalemate | Yes | |
| isDrawByFiftyMoves | Yes | |
| isThreefoldRepetition | Yes | |
| isInsufficientMaterial | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering safety and repeatability. The description adds value by specifying the content of the response (fields) and the optional include_ascii behavior, but does not disclose additional behavioral nuances like response format or error conditions beyond what annotations already imply. With strong annotations, this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose and fields, followed by an optional usage hint. Every sentence carries value; there is no fluff or redundancy. It is concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (which explains return structure) and the simple parameter set, the description fully covers what the tool does and when to use it. It even lists the key fields for quick understanding and provides a usage example for the optional parameter. It is complete for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains include_ascii (setting it true provides a board diagram) but leaves game_id implicit, though the name suggests it identifies the game. It adds some meaning for include_ascii, but could have explicitly stated game_id's purpose. Since game_id is evident from context, this partially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns the authoritative game state and enumerates specific fields (FEN, turn, revision, flags, move history, etc.). It differentiates itself from siblings like game_pgn (which likely returns a different format) by focusing on the internal state, and explicitly suggests using it instead of remembering the board.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance to use this tool instead of relying on memory, giving a clear when-to-use context. It does not explicitly mention when not to use it or mention alternatives, but the ton of 'authoritative state' and scope differentiate it from related tools. No exclusions are stated, but the implied usage is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
human_move_distributionEstimate Human Chess MovesARead-onlyIdempotent
Return the Maia3 human-like move probability distribution for the current position, conditioned on a target Elo. Higher probability = more human-typical at that rating. This is NOT move quality — a high-probability move can still be objectively bad.
| Name | Required | Description | Default |
|---|---|---|---|
| elo | No | ||
| top_n | No | ||
| game_id | Yes | ||
| oppo_elo | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| elo | Yes | |
| moves | Yes | |
| game_id | Yes | |
| oppo_elo | Yes | |
| revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering safety and determinism. The description adds crucial behavioral nuances: it clarifies that higher probability means more human-typical, and explicitly notes that this is not move quality, preventing misinterpretation. It does not contradict annotations, and adds context beyond what annotations provide, such as the meaning of the output values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise—two sentences, no fluff. Every word earns its place: the first sentence defines the function and key input (Elo), and the second provides a critical caveat. It is front-loaded with the core purpose and avoids unnecessary details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is relatively simple (read-only, 1 required param) and has an output schema, so the description needn't detail the return structure. It covers the core usage and behavior (human-likeness, Elo conditioning, not-quality warning). The main gap is parameter semantics (covered separately), but overall the description provides sufficient context for an agent to understand what the tool does and when to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain parameters. It only mentions 'target Elo' (which maps to elo) but does not clarify top_n (how many moves returned), oppo_elo (opponent rating effect), or game_id (required, identifies position). The word 'distribution' might imply all moves, but top_n suggests a subset, creating ambiguity. This is inadequate for a 4-param tool with no schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns the Maia3 human-like move probability distribution for the current position, conditioned on target Elo. It explicitly distinguishes itself from move quality ('This is NOT move quality'), which differentiates it from siblings like move_evaluate or position_analyze. The verb 'Return' and specific resource 'Maia3...distribution' make the purpose precise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use: when you need human-like probabilities for a given rating, and warns against confusing with move quality. It does not explicitly mention alternatives or when NOT to use it, but the 'NOT move quality' caveat curbs misuse. The 'conditioned on a target Elo' hints at the parameter, but no direct guidance on top_n or oppo_elo is given. So it provides clear context with a partial exclusion but lacks explicit alternative naming.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_candidatesGenerate Chess Move CandidatesARead-onlyIdempotent
The primary move-selection tool. Combine Stockfish objective evaluation (moverCp, whiteCp, cpLoss, mate, WDL), Maia3 human probability, and Lichess real-game statistics into a unified candidate list. moverCp is from the mover's perspective: higher = better for the player choosing the move. Use this before choosing a move; the final choice is yours.
| Name | Required | Description | Default |
|---|---|---|---|
| elo | No | ||
| game_id | Yes | ||
| sf_depth | No | ||
| lichess_db | No | lichess | |
| maia_top_n | No | ||
| sf_multipv | No | ||
| analysis_level | No | normal | |
| lichess_speeds | No | ||
| lichess_ratings | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| elo | Yes | |
| fen | Yes | |
| turn | Yes | |
| game_id | Yes | |
| revision | Yes | |
| candidates | Yes | |
| analysis_level | Yes | |
| moveSensitivity | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds valuable behavioral context by explaining that moverCp is from the mover's perspective and that the tool merges three distinct evaluation sources, which goes beyond what annotations or schema convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the tool's primary role, and every sentence adds meaningful context: what the tool does, the moverCp perspective, and when to use it. There is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the presence of an output schema and helpful annotations, the description covers the core selection context well. It could be more complete by explicitly contrasting with sibling tools like move_candidates_by_intent, but the 'primary' framing mitigates this gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain any of the nine input parameters such as elo, sf_depth, lichess_ratings, or analysis_level. It adds meaning to the output metrics but fails to compensate for the lack of parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states this is the primary move-selection tool and that it combines Stockfish evaluation, Maia3 human probability, and Lichess statistics into a unified candidate list. This specific verb+resource combination distinguishes it from sibling tools like move_evaluate or move_candidates_by_intent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs the agent to use this tool before choosing a move, which is strong usage guidance. However, it does not name alternatives or provide when-not-to-use conditions, so it falls short of full differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_candidates_by_intentRank Chess Moves by IntentARead-onlyIdempotent
Convenience layer over move_candidates: rank candidates for a strategic intent. This tool RANKS candidates but does NOT choose a move — use the returned signals and conversation context to make the final decision. Do not map user skill mechanically to an intent. intents: best (strongest engine move), strong (engine-strong but human-plausible), natural (most human-typical), balanced (blend of strength and human-likeness), ease_off (human-plausible moves that modestly reduce advantage without changing the expected result), give_chance (human-plausible inaccuracies that meaningfully improve the opponent's chances).
| Name | Required | Description | Default |
|---|---|---|---|
| elo | No | ||
| intent | Yes | ||
| game_id | Yes | ||
| sf_depth | No | ||
| lichess_db | No | lichess | |
| maia_top_n | No | ||
| sf_multipv | No | ||
| analysis_level | No | normal | |
| lichess_speeds | No | ||
| lichess_ratings | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| elo | Yes | |
| fen | Yes | |
| turn | Yes | |
| intent | Yes | |
| game_id | Yes | |
| revision | Yes | |
| candidates | Yes | |
| analysis_level | Yes | |
| moveSensitivity | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds behavioral context by stating it RANKS but does NOT choose a move, and clarifies the meaning of each intent, which is valuable beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph but packs essential information: purpose, relationship to sibling, behavioral caveat, and intent definitions. It is front-loaded with the core purpose and then details intents. Slightly long but each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 10 parameters, 2 required, and an output schema. The description explains the core intent parameter and the tool's role, but does not cover other parameters like elo, sf_depth, or lichess_db. However, the output schema exists, so return values are covered. The description is adequate for a complex tool but could mention how other parameters affect ranking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the 'intent' parameter in detail with definitions for each enum value, which is critical. However, other parameters like elo, sf_depth, lichess_db, etc., are not explained in the description, relying on the schema's names and defaults. Given the complexity, the description covers the most important parameter but leaves others to inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is a convenience layer over move_candidates that ranks candidates for a strategic intent. It explicitly distinguishes itself from move_candidates and clarifies it does not choose a move, which differentiates it from siblings like game_play_move.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool: as a ranking layer over move_candidates, and explicitly warns not to map user skill mechanically to an intent. It also lists all intents with definitions, giving clear context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_evaluateEvaluate Chess MovesARead-onlyIdempotent
Evaluate one or more moves with Stockfish without mutating the game. Pass a single move string or an array of moves to compare. Returns, for each move, the score after the move (from the mover's perspective), cpLoss vs the best move, and a classification (best/excellent/good/inaccuracy/mistake/blunder).
| Name | Required | Description | Default |
|---|---|---|---|
| move | Yes | ||
| depth | No | ||
| game_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| game_id | Yes | |
| results | Yes | |
| revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint=true and idempotentHint=true, and the description explicitly states 'without mutating the game,' reinforcing that. It also adds value by describing the output (score, cpLoss, classification) and the engine (Stockfish), which are not required but provide useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise—three sentences—and front-loaded with the core purpose and non-mutation guarantee. Every sentence adds meaning without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema is present, so detailed return field explanations are unnecessary. The description covers the primary purpose, input flexibility, and key output categories, making it adequate for most usage scenarios. Minor omissions (e.g., depth semantics) are acceptable given the schema's constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description partially compensates by explaining the 'move' parameter format (string or array). However, it does not clarify the 'depth' or 'game_id' parameters beyond what the schema already provides, leaving incomplete semantic coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool evaluates moves using Stockfish, specifying the action (evaluate), resource (moves), and context (without mutating the game). It distinguishes itself from sibling tools like game_play_move (which mutates) and game_legal_moves (which lists legal moves).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its use for analysis rather than gameplay via 'without mutating the game' and mentions comparing moves, which gives context. However, it does not explicitly name alternative tools or provide exclusion criteria, so it falls short of a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opening_explorerQuery Lichess Opening ExplorerBRead-onlyIdempotent
Query the Lichess opening explorer for real human game statistics in the current position (requires LICHESS_TOKEN).
| Name | Required | Description | Default |
|---|---|---|---|
| db | No | lichess | |
| speeds | No | ||
| game_id | Yes | ||
| ratings | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| db | Yes | |
| black | Yes | |
| draws | Yes | |
| moves | Yes | |
| white | Yes | |
| game_id | Yes | |
| opening | Yes | |
| revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint, openWorldHint, idempotentHint) already indicate a safe read-only operation. Description adds environment requirement: the question requires a token. Does not mention permissions, read-only side effects, or returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short description of one sentence with no unnecessary details. However, the output or result not mentioned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite output schema(true), annotations (readOnly/openWorld/idempotent), the description doesn't mention what the tool returns (opening list/names/counts), so the agent may not know if it can fulfill the request. the description is too sparse for interactive decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Description gives no parameter semantics. The input schema covers params and types but does not explain the source or valid values. There are 4 parameters and he documentation does not cover the specific role of `db`, `speeds`, `ratings`, or `game_id`. Coverage is 0% and the description doesn't compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb ('Query') with the Lichess opening explorer and the current position context. However, it doesn't distinguish itself from sibling tools other than by name and implicit use case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives like position_move or game_analysis. The only guidance meaning implied: 'current position' and 'requires a token'. Not enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
position_analyzeAnalyze Chess PositionARead-onlyIdempotent
Run Stockfish on the current position and return the top engine lines (multipv). Scores are from the side-to-move perspective: positive cp = side to move is better; mate N = side to move mates in N. wdl is [win, draw, loss] in permille for the side to move. Use analysis_level (fast/normal/deep) or explicit depth/multipv. Does NOT mutate the game.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| game_id | Yes | ||
| multipv | No | ||
| analysis_level | No | normal |
Output Schema
| Name | Required | Description |
|---|---|---|
| fen | Yes | |
| turn | Yes | |
| lines | Yes | |
| game_id | Yes | |
| revision | Yes | |
| analysis_level | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description's statement 'Does NOT mutate the game' adds no new information, but it does clarify the evaluation perspective and wdl format, and explains analysis levels without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
All sentences are purposeful and detailed without redundancy, front-loading the core action and then explaining parameters and output semantics efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with output schema and strong annotations, the description covers the tool's functionality, parameter choices, and output interpretation (cp, mate, wdl) completely, making it highly usable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description explains the meaning and effect of analysis_level, depth, and multipv, and clarifies that game_id is required to identify the position. This compensates fully for the lack of schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs Stockfish on the current position and returns top engine lines, distinguishing it from sibling tools like move_evaluate and move_candidates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains how to specify analysis level or depth/multipv, and mentions it does not mutate the game, but lacks explicit when-not-to-use or alternative tool comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v0.3.1- First observed
create_game - First observed
delete_game - First observed
game_import_pgn - First observed
game_legal_moves - First observed
game_pgn - First observed
game_play_move - First observed
game_state - First observed
human_move_distribution - First observed
move_candidates - First observed
move_candidates_by_intent - First observed
move_evaluate - First observed
opening_explorer - First observed
position_analyze
TDQS
Scored across 13 tools
Game lifecycle tools are clearly distinct: create, delete, state, move, legal moves, PGN export/import. The move-analysis tools overlap somewhat—position_analyze, move_evaluate, move_candidates, and move_candidates_by_intent all return evaluation-like signals—but their descriptions clarify different purposes: raw engine lines, per-move comparison, unified candidate selection, and intent-based ranking. An agent could hesitate between these, but they are not truly interchangeable.
Some names follow verb_noun (create_game, delete_game), while others are noun phrases or prefixed differently (game_state, game_pgn, game_import_pgn, position_analyze, opening_explorer). The move_* group is predictable, but the overall naming is a mix of conventions. Names are still readable and snake_case consistent, so the inconsistency is moderate rather than chaotic.
Thirteen tools is well within the ideal range and appropriate for a chess server that handles game lifecycle, PGN import/export, legal move queries, engine analysis, human-move modeling, and opening statistics. Each tool has a defined role, and the count does not feel bloated or thin.
The surface covers the full lifecycle: create, read state, mutate via play move, legal moves, delete, and PGN import/export. Analysis coverage is also strong: Stockfish lines, move evaluation, human move distributions, unified candidates, intent-based ranking, and opening explorer. There are no obvious dead ends for playing or analyzing a chess game.
Maintenance
Related MCP Connectors
Chess MCP for Claude: engine analysis, attack maps, game review. One URL, no install.
Lichess MCP — public read-only API for users, games, explorer, tablebase.
Pedagogical chess intelligence for AI agents: explain positions and games for a target Elo.
MCP server exposing the Backtest360 engine API as tools for AI agents.
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.16MIT
- 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.10 npm1ISC
- AlicenseAqualityDmaintenanceA 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.63MIT
- FlicenseNot gradedqualityCmaintenanceAn MCP server that exposes Stockfish chess analysis to LLM chat clients, enabling move analysis, game review, and explanation of engine choices.-