Chess Coach MCP
Fetches recent games and raw PGNs from Chess.com, enabling Stockfish analysis, blunder detection, opening statistics, and coaching reports for a user’s games.
Fetches recent games and raw PGNs from Lichess, enabling chess coaching workflows such as Stockfish analysis, blunder detection, opening statistics, and review of critical moments. Supports optional Lichess API token configuration for higher rate limits.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Chess Coach MCPCoach me through my last game and explain my biggest mistake."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Chess Coach MCP
An open-source MCP server that turns any AI assistant (Claude Desktop, Cursor, Claude Code, ...) into a chess coach. It fetches your games from Lichess or Chess.com, runs them through Stockfish, and hands the AI structured ground truth so it can explain why you lost, in plain language.
"The game was decided by one move: 18. Bf4. It hung the bishop to the e5 pawn, and it ignored the pawn on f3, which took on g2, hit your rook and threatened to promote. 18. gxf3 was the safe move. Lesson: when a pawn lands next to your king, deal with it before anything else."
That paragraph is from a real game. See the complete worked example and the idea, flow and UI write-up.
How it flows
flowchart LR
U([You]) -->|"coach my last game"| C[AI client<br/>Claude Desktop / Cursor]
C <-->|MCP over stdio| S[chess-coach-mcp<br/>tools · resources · prompts]
S -->|games| L[(Lichess / Chess.com)]
S -->|UCI| SF[Stockfish<br/>auto-downloaded]
S --> DB[(SQLite cache)]You ask for coaching. The AI calls
get_recent_games, thenanalyze_game.The server fetches the PGN, runs every position through Stockfish, labels each move (best / good / inaccuracy / mistake / blunder) and returns JSON with the critical moments and their positions.
The AI explains the mistakes in words and gives you one lesson. Follow-up questions are instant because the report is cached.
Related MCP server: MCP Chess Server
Why
Today's option | What's wrong |
Chess.com Game Review | Limited free uses per day, full version is paid |
Lichess analysis | Free, but only shows numbers ( |
Human coach | Explains properly, but expensive |
Engines tell you what was wrong. Coaches tell you why. The hard part, explaining chess in natural language, is exactly what an LLM is good at. This server gives the LLM the data (your games) and the ground truth (engine evaluations) and gets out of the way.
What you can ask
"Coach me through my last game." (one game, three biggest mistakes, one lesson)
"What should I have played instead of 23...Qxb2?"
"Give me a weekly review. What keeps going wrong?"
"Which openings do I lose most with as Black?"
"Show me another game where I hung a piece to a fork."
Install
Requirements: Python 3.11+. Stockfish is optional: on first analysis the server downloads the official Stockfish release for your OS into its cache directory. If that is not possible it falls back to Lichess cloud evaluations (partial coverage).
pip install chess-coach-mcp
# or, from a clone:
pip install -e .Claude Desktop
Add this to claude_desktop_config.json (see examples/claude_desktop_config.json):
{
"mcpServers": {
"chess-coach": {
"command": "chess-coach-mcp"
}
}
}Claude Code
claude mcp add chess-coach -- chess-coach-mcpAny other MCP client
Run chess-coach-mcp as a stdio server. No hosting, no API keys.
Configuration (all optional)
Environment variable | Default | Meaning |
| auto-detect | Path to a Stockfish binary |
|
| Download Stockfish automatically if none is found |
|
| Where games, reports and the engine are stored |
|
| Search depth for the first pass over every move |
|
| Depth used to double-check suspicious moves |
|
| Max seconds per position in the first pass |
|
| Max seconds per position when double-checking |
| half your cores (1-4) | Stockfish threads |
|
| Stockfish hash table in MB |
| none | Personal API token for higher Lichess rate limits |
MCP surface
Tools
Tool | Input | Returns |
|
| game ids, opponent, your result, opening, date |
|
| per-move evals, cp loss, labels, best line, accuracy, critical moments |
|
| only the moves that lost >= threshold cp, with FEN and best line |
|
| win/draw/loss per opening, weakest openings |
| which engine is in use and cache statistics |
Game ids can be bare (abcd1234, 123456789) or full URLs from either site.
Resources
URI | Content |
| JSON list of recent Lichess games |
| JSON list of recent games on a platform |
| Raw PGN (platform guessed from the id) |
| Raw PGN |
Prompts
Prompt | Arguments | What it does |
|
| Fetch + analyze your last game, explain the 3 biggest mistakes |
|
| Analyze the last 7 days, find recurring patterns behind your losses |
How the analysis works
The game's PGN is fetched (and cached in SQLite).
Every position is evaluated by Stockfish at depth 14 (capped at half a second each). Evaluations are clamped to +/-1000 centipawns so that "+15 to +9" in a won position is not counted as a blunder.
For each move, centipawn loss = how much the mover's evaluation dropped compared with the engine's best move. Moves are labelled:
Centipawn loss
Label
> 300
blunder
100 - 300
mistake
50 - 100
inaccuracy
otherwise
good / best
Suspicious moves are re-checked at depth 18 (up to two seconds each) so shallow false positives disappear. A 40-move game takes roughly 30-60 seconds the first time.
Per-player accuracy uses the Lichess formula. The report (JSON) is cached, so asking follow-up questions about the same game is instant.
Design notes
core/has zero MCP imports. Tools, resources and prompts are thin wrappers over it. The chess logic is testable without an MCP client and reusable from a CLI or web app.Tools, resources and prompts are separate packages. The server uses all three MCP primitives, not just tool calling.
Engine access is pluggable.
StockfishEngine(local UCI subprocess) andLichessCloudEngine(HTTP) implement the same two-method protocol, and tests use a fake.Everything is cached. Games and reports are stored in SQLite keyed by game id, depth and engine, so repeated questions never re-run the engine.
Project layout
src/chess_coach_mcp/
├── server.py # builds the MCPServer, registers everything, runs stdio
├── services.py # shared cache / HTTP / engine instances, game resolution
├── config.py # environment-driven settings
├── tools/ # get_recent_games, analyze_game, find_blunders, get_opening_stats
├── resources/ # chess://games/..., chess://game/.../pgn
├── prompts/ # coach_my_last_game, weekly_review
├── core/ # engine.py, analysis.py, cache.py, models.py, pgn.py (no MCP imports)
└── clients/ # lichess.py, chesscom.py
tests/ # unit tests with a fake engine and mocked HTTPDocumentation
docs/IDEA.md: the idea, the system flow, what the UI looks like, data shape.
docs/EXAMPLE.md: one real game, start to finish, tool calls and coaching.
docs/PLAN.md: the original project plan this was built from.
Development
git clone https://github.com/deven1003/chess-coach-mcp
cd chess-coach-mcp
pip install -e ".[dev]"
ruff check . && ruff format --check .
pytestTry the server interactively with the MCP inspector:
npx @modelcontextprotocol/inspector chess-coach-mcpRoadmap
v1: Lichess + Chess.com games, Stockfish analysis, blunder classification, prompts
v1.2: multi-game pattern detection (recurring tactical motifs, tagged automatically)
v2: puzzle suggestions from the Lichess puzzle database based on your weaknesses
v2: opening repertoire recommendations via the Lichess opening explorer
License
MIT
Available Tools
5 toolsanalyze_gameARead-only
Run a full engine analysis of one game and classify every move.
Returns evaluation before/after each move, centipawn loss, a label (best/good/inaccuracy/mistake/blunder), the engine's best move and line, per-player accuracy and error counts, and the five most critical moments with their FEN so you can explain why a move was bad. Results are cached, so repeat calls are instant.
Args: game_id: Game id or URL from Lichess or Chess.com (as returned by get_recent_games). platform: "lichess" or "chesscom". Guessed from the id when omitted. username: The player to coach. Required for Chess.com games that were not fetched via get_recent_games; otherwise optional (adds user_color/user_result). depth: Engine search depth (default 14; 18+ is slower but more precise).
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| game_id | Yes | ||
| platform | No | ||
| username | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint/openWorldHint, the description adds genuinely useful behavior: results are cached so repeat calls are instant, and depth 18+ is slower but more precise. It also discloses the Chess.com username precondition, a real failure mode. Nothing contradicts the annotations — this is a read-only external-fetch-and-analyze operation.
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?
Front-loaded with the outcome and the payoff ('explain why a move was bad'), followed by a clean Args block. The return-value enumeration partly duplicates the output schema, but it is tight and no sentence is 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?
For a four-parameter analysis tool with an output schema, the definition covers inputs, defaults, caching, and cost/latency tradeoffs. Minor omissions remain — no mention of what happens on an invalid or unsupported game id, and no relationship to engine_status despite engine availability being a likely precondition.
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 0% schema description coverage, the description carries the full burden and does so: game_id accepts an id or URL from either platform, platform enumerates exactly 'lichess'/'chesscom' and is guessed when omitted, username's conditional requirement and its effect on user_color/user_result are stated, and depth's default of 14 with the 18+ tradeoff is given.
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 opens with a specific verb and scope: 'Run a full engine analysis of one game and classify every move', then enumerates the outputs (eval before/after, centipawn loss, labels, accuracy, critical moments). An agent can tell it apart from find_blunders by the 'every move' / 'five most critical moments' framing, though it never explicitly names the sibling it replaces.
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?
Usage context is concrete: game_id comes 'as returned by get_recent_games', username is required only for Chess.com games not fetched via that tool, and depth trades speed for precision. What is missing is explicit routing against siblings — nothing says when to prefer find_blunders or get_opening_stats over a full analysis.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
engine_statusARead-only
Report which chess engine the server is using (local Stockfish or Lichess cloud fallback), where it lives, and cache statistics. Useful for troubleshooting.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes this is a safe, non-mutating read, so the description only needs to add context. It contributes by disclosing that the payload covers engine identity, filesystem location, and cache statistics, but says nothing about whether the result reflects live state, whether the fallback can be switched, or any cost/latency of the check.
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?
A single sentence, front-loaded with the primary fact (which engine is active) and back-loaded with the secondary detail (location, cache stats) and the usage hint. No 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?
With an output schema present, no parameters, and a read-only annotation, the description carries only what structured data cannot: that this is a diagnostics call and what categories of information it surfaces. That is sufficient for an agent to decide to call 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?
The tool takes zero parameters, which is the baseline-4 case; the description correctly implies a no-argument global query rather than promising any filtering options. Nothing further is needed on this dimension.
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?
States a specific verb ("Report") and a precise resource (the active chess engine), and enumerates the possible values (local Stockfish vs. Lichess cloud fallback) plus the extra fields returned (location, cache statistics). This is unmistakably a diagnostic/status tool, so it cannot be confused with the sibling analysis tools.
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?
"Useful for troubleshooting" implies the usage context but gives no explicit when-to-use or when-not-to-use conditions, and names no alternative. It does not say whether to call this before or after a failed analysis, which is the most likely reason an agent would reach for it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_blundersARead-only
Return only the moves that lost at least threshold centipawns, with the position
(FEN), the engine's best move and the best line, sorted from worst to least bad.
Cheaper to read than analyze_game when you only need the mistakes.
Args:
game_id: Game id or URL from Lichess or Chess.com.
platform: "lichess" or "chesscom". Guessed from the id when omitted.
username: The player to coach; required for uncached Chess.com games.
threshold: Minimum centipawn loss to include (100 = mistakes and blunders).
only_user: If true, return only the mistakes made by username.
| Name | Required | Description | Default |
|---|---|---|---|
| game_id | Yes | ||
| platform | No | ||
| username | No | ||
| only_user | No | ||
| threshold | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, matching a read-only fetch against Lichess/Chess.com, so the safety profile is covered. The description adds useful behavior beyond that — deterministic sort order and the fact that results are filtered rather than exhaustive. However, the phrase 'uncached Chess.com games' hints at caching without explaining it, and nothing is said about failure modes such as an unresolvable game id or an unavailable engine.
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?
A single front-loaded sentence states the return shape, the sort order, and the cost tradeoff, followed by a one-line routing hint and a compact per-argument block. No sentence is redundant and the highest-value information comes first.
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 exists, so the description needn't fully define return values, and it still summarises them accurately. For a five-parameter, network-dependent tool the coverage is strong; the remaining gap is error and edge-case behavior (bad id, platform-guess failure, empty result when no move exceeds the threshold).
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% with five parameters, so the description has to carry the full load and largely does: game_id accepts an id or URL, platform is guessed when omitted, username is only conditionally required, and threshold is anchored with a concrete scale (100 = mistakes and blunders). The one soft spot is the interaction between only_user and username when only_user=true but no username was supplied, which is left implicit.
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 gives a specific verb and resource ('Return only the moves that lost at least threshold centipawns') and states the exact payload — FEN, engine best move, best line, sorted worst-to-best. It also explicitly contrasts itself with a named sibling ('Cheaper to read than analyze_game when you only need the mistakes'), so an agent can separate it from that tool without opening either schema.
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 routing rule against analyze_game is explicit, and the Args block states the conditional requirement that username is needed for uncached Chess.com games. What's missing is any exclusion or fallback guidance — e.g. what to do if the id can't be resolved to a platform, or whether to analyze the whole game first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_opening_statsARead-only
Win/draw/loss record per opening over a player's recent games.
Helps spot openings the player struggles with. Each row carries the game ids so you can dig into a specific loss with find_blunders.
Args: username: The player's username. platform: "lichess" (default) or "chesscom". color: "white", "black" or "both" (default). count: How many recent games to look at (1-300). group_by_family: Group variations under their opening family (default true).
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | both | |
| count | No | ||
| platform | No | lichess | |
| username | Yes | ||
| group_by_family | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds that each row carries game ids and that variations are folded under families by default, which is genuine behavioral context. It says nothing about pagination, performance, or behavior on invalid usernames/platforms.
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?
Front-loaded summary followed by a short rationale and a compact Args block — no wasted sentences. The Args list is somewhat verbose in phrasing but is justified given the zero schema coverage.
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 5-parameter read-only analytics tool with an output schema, the description covers purpose, the analytical intent, parameter values, and the downstream workflow. Only edge-case handling (invalid platform, fewer games than count) is unaddressed, which is minor given the output schema exists.
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 carries the full burden and does: it documents all five parameters, including allowed values for platform and color, the 1-300 range for count, and the default-true semantics of group_by_family. This is meaning the schema cannot supply on its own.
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 first line names a specific aggregation (win/draw/loss record) over a specific resource (openings) and scope (a player's recent games). It is clearly distinguishable from siblings like get_recent_games (raw list) and find_blunders (mistake drill-down), which the description itself references.
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 states the analytical use case ('spot openings the player struggles with') and explicitly routes follow-up work to find_blunders via the per-row game ids. It stops short of saying when to prefer get_recent_games instead, so there is no explicit exclusion rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_gamesARead-only
List a player's most recent games from Lichess or Chess.com.
Returns one entry per game with the game_id (use it with analyze_game / find_blunders), the opponent, the result from the player's point of view, the opening and the date. Games are cached locally so later tools can find them by id.
Args: username: The player's username on the chosen platform. platform: "lichess" (default) or "chesscom". count: How many games to return (1-100).
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| platform | No | lichess | |
| username | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds real context beyond that: one entry per game, the fields returned, and the fact that games are cached locally so subsequent tools can resolve them by id — a side effect worth knowing. It does not mention failure modes for private or nonexistent accounts on an open-world network call.
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?
A single front-loaded purpose sentence, a compact return-format note, and an Args block that earns its space precisely because schema coverage is 0%. No filler or repeated phrasing.
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 output schema covers return values, so the description needn't re-document them, and it instead supplies the caching behavior and downstream linkage an agent needs. What's missing for an open-world fetch tool is any note on rate limits, authentication, or behavior when the username is invalid.
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 carries the burden and largely does: it states the accepted platform values ("lichess" default or "chesscom"), which the schema does not, and constrains count to 1-100 with a default of 10. Username is described only minimally as the player's handle on the chosen platform.
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 opens with a specific verb and resource (list a player's most recent games) and names the two supported sources, Lichess and Chess.com. It also implicitly separates itself from siblings by pointing to analyze_game / find_blunders as downstream consumers of the returned game_id.
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 establishes the context of use: fetch recent games, then pass the game_id to analyze_game or find_blunders. There is no explicit statement of when NOT to use it (e.g., versus get_opening_stats for aggregate results), so it falls short of a full when/when-not/alternatives treatment.
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.
5 tool updates
v0.1.0- First observed
analyze_game - First observed
engine_status - First observed
find_blunders - First observed
get_opening_stats - First observed
get_recent_games
TDQS
Scored across 5 tools
Each tool has a clearly distinct role: fetching games, full game analysis, blunder-only extraction, engine diagnostics, and opening statistics. The overlap between analyze_game and find_blunders is explicitly framed as a cheaper subset, so selection is unambiguous.
Most tools follow a predictable verb_noun pattern (get_recent_games, analyze_game, find_blunders, get_opening_stats), but engine_status is a noun phrase without a verb. The deviation is minor and still readable.
Five tools is well-scoped for a chess coaching server, and each tool covers a distinct part of the workflow: game discovery, analysis, mistake extraction, opening review, and engine diagnostics.
The surface covers the core coaching workflow from fetching games through analysis and opening review. Minor gaps exist, such as no player profile/rating lookup or explicit opening recommendation tool, but agents can work around these.
Maintenance
Related MCP Connectors
Review your Chess.com and Lichess games with Stockfish on an interactive board, in plain words.
1Chess MCP for Claude: engine analysis, attack maps, game review. One URL, no install.
Pedagogical chess intelligence for AI agents: explain positions and games for a target Elo.
Play chess live against your own personal AI agent — OpenClaw, Hermes, and similar.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables comprehensive chess analysis through Stockfish engine integration, positional evaluation, puzzle training, game review, and access to extensive chess databases. Provides visual board rendering, interactive game viewers, and tactical puzzle training with 3+ million problems from Lichess.34AGPL 3.0
- AlicenseBqualityDmaintenanceProvides Chess.com player data integration, enabling AI assistants to fetch real-time chess player profiles and comprehensive statistics including ratings, game counts, and performance metrics from Chess.com's public API.2MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to explore player profiles, ratings, game archives, leaderboards, clubs, and puzzles via the Chess.com API.2MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to perform professional-grade chess analysis using Stockfish and optionally Leela Chess Zero, including position analysis, full game review, opening lookup, and puzzle generation.9 npm2MIT