Chess MCP Server: Game Analysis and Ratings avatar

Chess MCP Server: Game Analysis and Ratings

Pricing

from $3.00 / 1,000 read operations

Go to Apify Store
Chess MCP Server: Game Analysis and Ratings

Chess MCP Server: Game Analysis and Ratings

Chess MCP server for Claude, ChatGPT and Cursor: 13 read-only tools over the public API of a free, open-source chess site. Look up player ratings and records, review analyzed games mistake by mistake, check engine evaluations and 7-piece endgames, and get the daily puzzle.

Pricing

from $3.00 / 1,000 read operations

Rating

0.0

(0)

Developer

MrBridge

MrBridge

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

6 days ago

Last modified

Share

Chess MCP Server: Game Analysis and Ratings

Chess MCP Server gives Claude, ChatGPT, Cursor and any other MCP client 13 read-only tools over the public API of Lichess, the free and open-source chess site. It covers players and their ratings, finished games with their computer analysis, engine evaluations, an endgame tablebase, puzzles, arena tournaments and Lichess TV. Your Apify token is the only credential: no Lichess account, no API key. This is an independent service, not affiliated with or endorsed by Lichess.

Ask Claude "where did I go wrong in my last rated blitz game?" and it calls chess_list_player_games to find the game, then chess_get_game to read it. If the game was analyzed on Lichess, the answer lists each inaccuracy, mistake and blunder with the move you played, the better move and the engine line. You start the review at the moves that lost the game instead of replaying all of it.

What this server exposes

This server gives an AI client 13 read-only tools over the public API of Lichess (https://lichess.org), the free and open-source chess server. Five tools cover players: finding a username from its first letters, the profile with every rating and game count, the detailed record in one speed or variant (highest and lowest rating included), the head-to-head score of two players and the leaderboards. Two tools cover games: a player's recent games with filters, and one game with its moves, opening, accuracy and the mistakes found by the Lichess computer analysis. Three tools work on positions: the daily puzzle or a puzzle by id, the Stockfish evaluation of a FEN from the Lichess cloud database, and the exact result of an endgame of up to 7 pieces from the Lichess tablebase. The last three list the current arena tournaments, give the standings of one, and show the games on Lichess TV. No account, token or API key is needed. The server covers only Lichess data: players, games and ratings from other chess sites are not included.

Tools

ToolWhat it answersBilled event
chess_search_playersFind Lichess players by the start of their usernametool-read
chess_get_playerGet a Lichess player's ratings and game countstool-read
chess_get_performance_statsGet a Lichess player's statistics in one speed or varianttool-action
chess_list_player_gamesList a Lichess player's recent gamestool-read
chess_get_gameGet one Lichess game with its moves and analysistool-action
chess_get_head_to_headGet the head-to-head record of two Lichess playerstool-action
chess_get_leaderboardGet the Lichess leaderboard of a speed or varianttool-read
chess_get_puzzleGet the Lichess daily puzzle or a puzzle by idtool-read
chess_evaluate_positionGet the engine evaluation of a chess positiontool-read
chess_lookup_endgame_tablebaseLook up an endgame in the Lichess tablebasetool-read
chess_list_tournamentsList current and recent Lichess arena tournamentstool-read
chess_get_tournamentGet a Lichess arena tournament with its standingstool-action
chess_get_tv_gamesGet the games on Lichess TV right nowtool-read

chess_search_players: Find Lichess players by the start of their username

Use this when you know only part of a Lichess username, or are unsure of its spelling, and need the exact username before calling chess_get_player or chess_list_player_games. Do not use for searching by real name, country or rating (Lichess matches the beginning of usernames only), or for Chess.com accounts, which this server does not cover. Parameters: query (required, the first 3 to 30 characters of the username, letters, digits, "_" or "-", example "thib"), limit (1 to 20, default 10), offset (default 0), response_format ("concise" default with username and title, "detailed" adds the user id and profile URL). No match answers NOT_FOUND.

ParameterTypeRequiredExample
querystringyes"thib"
limitintegerno10
offsetintegerno0
response_format"concise" or "detailed"no"concise"

Returns { query, players[], pagination, source }. Upstream: Lichess. Cache: hourly (1 hour). Read-only.

chess_get_player: Get a Lichess player's ratings and game counts

Use this when you need the public profile of one Lichess player: title, account creation date, last day seen, total play time, game counts (wins, losses, draws) and the current rating, number of games and global rank in every speed and variant played, puzzle rating included. Do not use for detailed stats of one speed such as best wins and streaks (chess_get_performance_stats), the games themselves (chess_list_player_games), a rating curve over time (not available on this server), or Chess.com players. Parameters: username (required, example "thibault"), response_format ("concise" default, "detailed" adds rating deviation, recent progress and the Puzzle Storm, Racer and Streak scores). Personal profile fields (bio, real name, location, links, flag) are never returned. A closed account answers NOT_FOUND.

ParameterTypeRequiredExample
usernamestringyes"thibault"
response_format"concise" or "detailed"no"concise"

Returns { player, ratings[], puzzle_modes[], source }. Upstream: Lichess. Cache: intraday (5 minutes). Read-only.

chess_get_performance_stats: Get a Lichess player's statistics in one speed or variant

Use this when you need the detailed record of one Lichess player in one speed or variant: rating and deviation, global rank and percentile, highest and lowest rating with the game, wins, losses, draws, tournament games, average opponent, time played, winning and losing streaks, best wins and worst losses with links to the games. Do not use for the ratings of every speed at once (chess_get_player) or the list of recent games (chess_list_player_games). Parameters: username (required, example "thibault"), perf (required, one of ultraBullet, bullet, blitz, rapid, classical, correspondence, chess960, crazyhouse, antichess, atomic, horde, kingOfTheHill, racingKings, threeCheck, example "blitz"), response_format ("concise" default with 3 best wins and 3 worst losses, "detailed" with 5 of each and the longest playing streak). A speed the player never played answers NOT_FOUND.

ParameterTypeRequiredExample
usernamestringyes"thibault"
perf"ultraBullet" or "bullet" or "blitz" or "rapid" or "classical" or "correspondence" or "chess960" or "crazyhouse" or "antichess" or "atomic" or "horde" or "kingOfTheHill" or "racingKings" or "threeCheck"yes"blitz"
response_format"concise" or "detailed"no"concise"

Returns { username, perf, rating, deviation, provisional, games, progress, global_rank, percentile, highest, lowest, record, streaks, best_wins[], worst_losses[], source }. Upstream: Lichess. Cache: intraday (5 minutes). Read-only.

chess_list_player_games: List a Lichess player's recent games

Use this when you need the recent finished games of one Lichess player, newest first, optionally filtered by speed or variant, colour, rated or casual, opponent or date range: result, both players with ratings and rating changes, opening, number of moves and the game id for chess_get_game. Do not use for one game in full with its analysis (chess_get_game), the head-to-head score of two players (chess_get_head_to_head), games older than the 200 most recent matching ones, or Chess.com games. Parameters: username (required, example "thibault"), perf_type (optional list of 1 to 5 of ultraBullet, bullet, blitz, rapid, classical, correspondence, chess960, crazyhouse, antichess, atomic, horde, kingOfTheHill, racingKings, threeCheck, example ["blitz"]), color ("white" or "black"), rated (true or false), opponent (a username), since and until (YYYY-MM-DD), limit (1 to 30, default 10), offset (default 0, below 200, the last page is shortened to stay within the 200 games), response_format ("detailed" adds the moves in SAN cut at 1,200 characters, the clock and the tournament). No game under the filters answers NOT_FOUND.

ParameterTypeRequiredExample
usernamestringyes"thibault"
perf_typearray of stringno["blitz"]
color"white" or "black"no"black"
ratedbooleannotrue
opponentstringno"german11"
sincestringno"2026-01-01"
untilstringno"2026-03-31"
limitintegerno10
offsetintegerno0
response_format"concise" or "detailed"no"concise"

Returns { username, games[], pagination, source }. Upstream: Lichess streams. Cache: intraday (5 minutes). Read-only.

chess_get_game: Get one Lichess game with its moves and analysis

Use this when you need one Lichess game in full: players, ratings and rating changes, result and how it ended, opening, time control, tournament, the moves in SAN, and, when the game was analysed by Lichess, each player's accuracy, average centipawn loss and counts of inaccuracies, mistakes and blunders. Do not use for finding games (chess_list_player_games), for evaluating a position that is not from a Lichess game (chess_evaluate_position), or for Chess.com games. Parameters: game_id (required, the 8-character id, a 12-character player id or the game URL, example "q7ZvsdUF"), response_format ("concise" default, "detailed" adds every inaccuracy, mistake and blunder with the move played, the evaluation after it, the best move and line, up to 60, and the plies where the middlegame and endgame start). Moves are cut at 6,000 characters. A game in progress is shown 3 moves behind, as Lichess serves it.

ParameterTypeRequiredExample
game_idstringyes"q7ZvsdUF"
response_format"concise" or "detailed"no"concise"

Returns { game, analysis, source }. Upstream: Lichess. Cache: intraday (5 minutes). Read-only.

chess_get_head_to_head: Get the head-to-head record of two Lichess players

Use this when you need how two Lichess players fared against each other over all their games: number of games and each player's score, where a win counts 1 and a draw counts one half, plus the current match score when they are playing each other right now. Do not use for the list of those games (chess_list_player_games with opponent), for a player's overall record (chess_get_player), or for over-the-board or Chess.com games. Parameters: player_a (required, example "thibault"), player_b (required, example "german11"). The two must differ. Two players who never met answer NOT_FOUND.

ParameterTypeRequiredExample
player_astringyes"thibault"
player_bstringyes"german11"

Returns { games, player_a, player_b, current_match, source }. Upstream: Lichess. Cache: intraday (5 minutes). Read-only.

chess_get_leaderboard: Get the Lichess leaderboard of a speed or variant

Use this when you need the top-rated active Lichess players in one speed or variant: rank, username, title, rating and recent progress, up to the top 100. Do not use for one player's rank (chess_get_player gives it), for correspondence or puzzles (Lichess has no leaderboard for them), for FIDE ratings or for Chess.com. Parameters: perf_type (required, one of ultraBullet, bullet, blitz, rapid, classical, chess960, crazyhouse, antichess, atomic, horde, kingOfTheHill, racingKings, threeCheck, example "bullet"), limit (1 to 100, default 10), offset (default 0, the top 100 at most), response_format ("concise" default with rank, username, title and rating, "detailed" adds the recent rating progress and the profile URL).

ParameterTypeRequiredExample
perf_type"ultraBullet" or "bullet" or "blitz" or "rapid" or "classical" or "chess960" or "crazyhouse" or "antichess" or "atomic" or "horde" or "kingOfTheHill" or "racingKings" or "threeCheck"yes"bullet"
limitintegerno10
offsetintegerno0
response_format"concise" or "detailed"no"concise"

Returns { perf_type, players[], pagination, source }. Upstream: Lichess. Cache: hourly (1 hour). Read-only.

chess_get_puzzle: Get the Lichess daily puzzle or a puzzle by id

Use this when you need a Lichess tactics puzzle: today's daily puzzle, or one puzzle by its id, with its rating, number of plays, themes (mateIn2, fork, endgame...), the position as a FEN when Lichess gives it, the last move played before it, the solution in UCI notation and the game it comes from. Do not use for evaluating your own position (chess_evaluate_position) or for full games (chess_get_game). Parameters: puzzle_id (optional, 5 letters and digits or a URL like https://lichess.org/training/jNMwk, example "jNMwk"). Leave it out for the daily puzzle. The answer contains the solution: hide it from the user if they want to solve the puzzle first. Lichess puzzles are in the public domain.

ParameterTypeRequiredExample
puzzle_idstringno"jNMwk"

Returns { daily, puzzle, game, source }. Upstream: Lichess. Cache: hourly (1 hour). Read-only.

chess_evaluate_position: Get the engine evaluation of a chess position

Use this when you need the Stockfish evaluation of a chess position given as a FEN, and the best continuations, from the Lichess cloud evaluation database (about 320 million positions already analysed, mostly openings and common middlegames). Do not use for endgames of 7 pieces or fewer, where chess_lookup_endgame_tablebase gives the exact result, for the analysis of a whole Lichess game (chess_get_game), or for running a new engine analysis: a position nobody analysed yet answers NOT_FOUND. Parameters: fen (required, a FEN such as "r1bqkbnr/pppp1ppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - 3 3", underscores may replace spaces), multi_pv (1 to 5 lines, default 1), variant (default "standard", or one of chess960, crazyhouse, antichess, atomic, horde, kingOfTheHill, racingKings, threeCheck). Evaluations are in centipawns, or moves to mate, from White's point of view: positive favours White. Moves are in UCI notation (e2e4), the first 10 of each line.

ParameterTypeRequiredExample
fenstringyes"r1bqkbnr/pppp1ppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - 3 3"
multi_pvintegerno2
variant"standard" or "chess960" or "crazyhouse" or "antichess" or "atomic" or "horde" or "kingOfTheHill" or "racingKings" or "threeCheck"no"standard"

Returns { fen, variant, side_to_move, depth, knodes, lines[], perspective, source }. Upstream: Lichess. Cache: daily (1 day). Read-only.

chess_lookup_endgame_tablebase: Look up an endgame in the Lichess tablebase

Use this when you need the exact result of a standard chess endgame with 7 pieces or fewer (kings included), given as a FEN: win, draw or loss for the side to move, distance to zeroing (DTZ) and to mate (DTM), and the best moves with the result each one leads to. Do not use for positions with more than 8 pieces (chess_evaluate_position gives an engine evaluation), for chess variants, or for a whole game (chess_get_game). Parameters: fen (required, example "4k3/6KP/8/8/8/8/7p/8 w - - 0 1", underscores may replace spaces), response_format ("concise" default with the 5 best moves, "detailed" with every legal move). For each move, result_for_mover, dtz_for_mover and dtm_for_mover are given from the point of view of the player making the move. cursed-win and blessed-loss mean the 50-move rule turns the result into a draw.

ParameterTypeRequiredExample
fenstringyes"4k3/6KP/8/8/8/8/7p/8 w - - 0 1"
response_format"concise" or "detailed"no"concise"

Returns { fen, side_to_move, pieces, result, dtz, dtm, checkmate, stalemate, insufficient_material, moves_total, best_moves[], source }. Upstream: Lichess tablebase. Cache: reference (30 days). Read-only.

chess_list_tournaments: List current and recent Lichess arena tournaments

Use this when you need the Lichess arena tournaments that are about to start, running now or just finished: name, speed or variant, time control, length, start and end times, number of players and, for finished ones, the winner. This is the schedule shown on https://lichess.org/tournament. Do not use for the standings of one tournament (chess_get_tournament), for Swiss or team tournaments, for over-the-board events, or for older tournaments, which Lichess does not list here. Parameters: status ("all" default, "created" for upcoming, "started", "finished"), perf_type (optional, one of ultraBullet, bullet, blitz, rapid, classical, chess960, crazyhouse, antichess, atomic, horde, kingOfTheHill, racingKings, threeCheck, example "blitz"), limit (1 to 50, default 20), offset (default 0), response_format ("detailed" adds the creator, the schedule and the entry conditions). Running tournaments come first, then upcoming ones by start time, then finished ones, newest first.

ParameterTypeRequiredExample
status"all" or "created" or "started" or "finished"no"started"
perf_type"ultraBullet" or "bullet" or "blitz" or "rapid" or "classical" or "chess960" or "crazyhouse" or "antichess" or "atomic" or "horde" or "kingOfTheHill" or "racingKings" or "threeCheck"no"blitz"
limitintegerno20
offsetintegerno0
response_format"concise" or "detailed"no"concise"

Returns { tournaments[], pagination, source }. Upstream: Lichess. Cache: intraday (5 minutes). Read-only.

chess_get_tournament: Get a Lichess arena tournament with its standings

Use this when you need one Lichess arena tournament: name, status, speed or variant, time control, length, start time, number of players, game statistics (games, moves, white and black wins, draws, berserks, average rating) and the standings with rank, username, title, rating, score and performance. Do not use for finding tournaments (chess_list_tournaments), for Swiss tournaments, team standings of team battles, over-the-board events, or Chess.com tournaments. Parameters: tournament_id (required, the 8-character arena id or its URL, example "may24lta"), limit (standings, 1 to 100, default 10), offset (default 0, below 500, the last page is shortened to stay within the top 500), response_format ("detailed" adds the description cut at 400 characters, the headline and the berserk setting). Standings of a running tournament can move while they are read.

ParameterTypeRequiredExample
tournament_idstringyes"may24lta"
limitintegerno10
offsetintegerno0
response_format"concise" or "detailed"no"concise"

Returns { tournament, standings[], pagination, source }. Upstream: Lichess, Lichess streams. Cache: intraday (5 minutes). Read-only.

chess_get_tv_games: Get the games on Lichess TV right now

Use this when you need the games Lichess TV features right now: the top-rated game being played in each speed and variant, plus the best bot game and the best game against the computer, each with the featured player, rating and colour, and the game id for chess_get_game. Do not use for a given player's games (chess_list_player_games), for tournaments (chess_list_tournaments) or for over-the-board broadcasts. Parameters: channel (optional, one of best, bullet, blitz, rapid, classical, ultraBullet, chess960, crazyhouse, antichess, atomic, horde, kingOfTheHill, racingKings, threeCheck, bot, computer, example "blitz"). Leave it out for every channel. Featured games change every few minutes. The answer is at most 30 seconds old.

ParameterTypeRequiredExample
channel"best" or "bullet" or "blitz" or "rapid" or "classical" or "ultraBullet" or "chess960" or "crazyhouse" or "antichess" or "atomic" or "horde" or "kingOfTheHill" or "racingKings" or "threeCheck" or "bot" or "computer"no"blitz"

Returns { games[], source }. Upstream: Lichess. Cache: live (30 seconds). Read-only.

Connect

Endpoint (Streamable HTTP): https://mrbridge--chess-mcp.apify.actor/mcp

Every client authenticates with your Apify API token, found in Apify Console > Settings > API & Integrations. Clients that support custom headers send it as Authorization: Bearer <token>. The others use the ?token= URL variant, which must be treated as a secret: keep it out of commits, screenshots and shared logs.

Claude Code

$claude mcp add --transport http chess "https://mrbridge--chess-mcp.apify.actor/mcp" --header "Authorization: Bearer ${APIFY_TOKEN}"

Cursor, VS Code and other JSON configurations

{
"mcpServers": {
"chess": {
"type": "http",
"url": "https://mrbridge--chess-mcp.apify.actor/mcp",
"headers": {
"Authorization": "Bearer ${APIFY_TOKEN}"
}
}
}
}

claude.ai and Claude Desktop

Add a custom connector with the URL https://mrbridge--chess-mcp.apify.actor/mcp?token=YOUR_APIFY_TOKEN and no authentication. Prefilled link (replace the token placeholder before saving): add Chess MCP Server: Game Analysis and Ratings to Claude.

ChatGPT (developer mode)

Settings > Apps > Create, URL https://mrbridge--chess-mcp.apify.actor/mcp?token=YOUR_APIFY_TOKEN, authentication "No authentication". ChatGPT snapshots the tool list: after a server update, an admin has to click Refresh on the app.

OpenAI Responses API

{
"type": "mcp",
"server_label": "chess",
"server_url": "https://mrbridge--chess-mcp.apify.actor/mcp",
"headers": {
"Authorization": "Bearer YOUR_APIFY_TOKEN"
},
"require_approval": "never"
}

Add allowed_tools to restrict the tool list. Tool calls must finish within about 60 seconds on this API, and every tool of this server answers in under 50 seconds.

Anthropic Messages API

{
"mcp_servers": [
{
"type": "url",
"url": "https://mrbridge--chess-mcp.apify.actor/mcp",
"name": "chess",
"authorization_token": "YOUR_APIFY_TOKEN"
}
],
"tools": [
{
"type": "mcp_toolset",
"mcp_server_name": "chess"
}
]
}

Send the beta header anthropic-beta: mcp-client-2025-11-20.

One-click OAuth alternative

https://mcp.apify.com/?tools=mrbridge/chess-mcp connects through Apify OAuth without a token. It exposes the Actor as a single tool rather than the granular tools listed above.

Cost control

Each Standby run has a spending limit (maxTotalChargeUsd). When a call uses the last of it, the result is still returned, and later calls in that run answer CHARGE_LIMIT_REACHED until the limit is raised.

Why use Chess MCP Server

Chess questions rarely map to one API call. "How did my last loss go wrong" means finding the exact username, picking the game, then reading its analysis. The 13 tools follow those questions rather than the raw endpoints, and their descriptions tell the model which tool comes next.

  • Nothing to sign up for. Every tool reads public endpoints, so there is no Lichess token to create, paste or rotate.
  • Analyzed games, mistake by mistake. Each inaccuracy, mistake and blunder comes with the move played, the evaluation after it, the best move and the engine line, numbered by move and side. Up to 60 per game.
  • Endgame answers you can read without flipping signs. The tablebase result of each move is given for the player who makes it. FENs with underscores or without move counters are accepted.
  • Polite to the source. Lichess asks for one request at a time. The server sends about one every 2 seconds per host, never retries an HTTP 429, pauses for 60 seconds after one and keeps serving cached answers meanwhile. A call that fails is not charged.
  • Personal fields stay out. Profile text and presence data are dropped before anything is cached or returned, and the last-seen time is cut to the date.

Pricing (Pay-per-Event)

EventCharged whenPrice
apify-actor-startrun start (platform default)see the Store page
tool-read (primary event)each successful read tool callsee the Store page
tool-actioneach successful call of a detailed or computed toolsee the Store page

Never charged: initialize, tools/list, pings, readiness probes, and any call that ends in an error (invalid input, not found, upstream failure, timeout, spending limit).

Platform usage comes on top of these events. This server runs in Apify Standby mode, and you also pay the platform usage of your own Standby run, billed to your Apify account like any other run: the memory set for the Standby run, for as long as the server is up, idle time included, until the run stops at its idle timeout. The Apify pay-per-event documentation says so: "For runs in Standby mode, users always pay the platform usage costs in addition to the event charges."

Limits, caveats and attribution

  • One request at a time. Lichess asks API clients to send one request at a time and to wait a full minute after an HTTP 429. This server keeps one Lichess request in flight per host, paces them at about one every 2 seconds, and never retries a 429. After one, it stops calling Lichess for 60 seconds (longer if Lichess asks for it) and keeps answering from its cache. So a busy moment can answer UPSTREAM_RATE_LIMITED, which is never charged. Retry after the time given in the hint.
  • What Lichess shares anonymously. The opening explorer and the broadcast endpoints now need a Lichess login, so this server has no opening-explorer or over-the-board broadcast tool. There is no rating history over time either: Lichess serves anonymous callers an empty one, so this server has no rating-history tool. The cloud evaluation only knows positions someone already analysed on Lichess, mostly openings.
  • Size limits. A game list reads at most the 200 most recent games that match the filters, 30 per page. Use since, until, perf_type or opponent to reach older games. One game shows its first 6,000 characters of moves and up to 60 annotated mistakes. Tournament standings stop at the 500 best-ranked players. A game in progress is shown a few moves behind the board, as Lichess serves it.
  • How to read the numbers. Evaluations are in centipawns or moves to mate from White's point of view. In the tablebase answer, each move's result, DTZ and DTM are given for the player who makes the move. A draw counts one half in head-to-head scores.
  • Freshness. Profiles, games and standings are cached for 5 minutes, leaderboards, player searches and the daily puzzle for an hour, cloud evaluations for a day, the TV list for 30 seconds, and puzzles by id and tablebase results for 30 days.
  • Attribution. Every answer names Lichess as its source and links its terms. The Lichess game and puzzle data is released under CC0, so no credit is required, but it is good practice to keep it. This server is not affiliated with or endorsed by Lichess, and it uses neither the Lichess logo nor its piece sets.

Data terms

Lichess allows the personal and commercial use of its API and services (https://lichess.org/terms-of-service). Its game, puzzle and evaluation databases are under CC0 (https://database.lichess.org/), so you can reuse what this server returns without asking for permission.

Usernames, ratings and games describe real people. The server returns only the public chess record and leaves out bios, real names, locations, flags, links, online status and the exact time a player was last seen. If you store or publish player data you get from it, you are responsible for doing so lawfully, for example under the GDPR when the players live in the EU.

The fee for this server pays for the service (hosting, caching, request pacing and formatting), not for a licence on the data.

Use cases

Post-game review for club players and coaches. "Show me my last ten rapid games as Black and the blunders in the ones I lost." The client lists the games with chess_list_player_games, then opens the analyzed ones with chess_get_game.

Endgame study. Paste a position with 7 pieces or fewer and get the exact verdict for the side to move, with the moves ranked. In the documented example (4k3/6KP/8/8/8/8/7p/8 w - - 0 1), White wins with h8=Q+ while Kg8 only draws.

Opening preparation. chess_evaluate_position reads the cloud evaluation database, about 320 million positions already analyzed, mostly openings and common middlegames. In the captured answer, the starting position comes back at depth 75 and +0.19, with 1. e4 as the main line.

Writing about chess. A club newsletter gets its facts straight from the source: today's daily puzzle with its themes and solution, the top 10 of the bullet leaderboard, or the winner of an arena that just finished.

Match preparation. Before two players meet, chess_get_head_to_head gives their score over every game they played against each other, and chess_get_tournament shows the standings of an arena down to the 500th place.

Frequently asked questions

How much does it cost?

Chess MCP Server uses pay-per-event pricing, and the event prices are only part of what you pay. Each successful tool call is one event: tool-action for chess_get_performance_stats, chess_get_game, chess_get_head_to_head and chess_get_tournament, tool-read for every other tool. On the Apify free plan, a read costs 0.005 USD and an action 0.01 USD, and paid plans get lower prices, shown per plan on the Pricing tab linked below. So 100 reads come to 0.50 USD in events, before the start event and the platform usage below. Apify also charges its standard apify-actor-start event each time your Standby run starts.

On top of these events, you pay the platform usage of your own Standby run, billed to your Apify account like any other run: the memory set for the run (256 MB by default) for as long as the server is up, idle time included, until the run stops at its idle timeout (about 5 minutes without a call by default). The price table by Apify plan is on the Pricing tab.

You are never charged for initialize, tools/list, pings, readiness probes or any call that ends in an error (invalid input, not found, upstream failure, timeout, spending limit). Each run also has a spending limit, maxTotalChargeUsd: when a call uses the last of it, you still get the result, and later calls in that run answer CHARGE_LIMIT_REACHED.

What does the server not cover?

It reads one chess site, Lichess, and no other platform. The opening explorer and over-the-board broadcasts now need a Lichess login, so they are left out, and there are no FIDE ratings. There is no rating history over time either, because Lichess does not serve it to anonymous callers. The engine evaluation only knows positions someone already analyzed on Lichess. It never runs a new analysis. Game lists stop at the 200 most recent matching games and tournament standings at the top 500.

Can I use it while I am playing a game?

No. Asking an engine or a tablebase for help during a game you are playing is cheating under the Lichess terms, which name chess engines and endgame tablebases among the forbidden aids. The evaluation and tablebase tools are meant for study and review after the game.

Can I reuse what the server returns?

Yes. Lichess allows personal and commercial use of its API, and its game, puzzle and evaluation databases are released under CC0, so you can reuse the data without asking. Credit is not required, but naming Lichess as the source is good practice. The fee pays for running the service, not for a licence on the data.

What about player privacy?

Usernames, ratings and games describe real people. The server returns the public chess record only and leaves out bios, real names, locations, flags, links, online status and the exact time a player was last seen. It is not built to profile or follow people. If you store or publish player data, doing it lawfully is your responsibility, for example under the GDPR for players in the EU.

Why is a call sometimes slow?

The first call after a quiet period starts your Standby run, which takes a few seconds. After that, calls that need Lichess wait their turn: about 2 seconds between two requests to one host. In the platform smoke tests, Lichess calls took between 0.4 and 3.4 seconds. If Lichess answers HTTP 429, the server stops calling it for 60 seconds, serves what it has in cache, and answers other calls with UPSTREAM_RATE_LIMITED, which is not charged.

Your feedback

Found a bug, or a chess question the tools cannot answer? Open an issue on the Issues tab.

More MCP servers, scrapers and data studies from the same team: mr-bridge.com.

Changelog

  • 0.1.5: Output, dataset and key-value store schemas, as Apify asks for publication: the Output tab of a run started from the Console shows the connection details and one row per tool.
  • 0.1.4: the Input tab shows the endpoint and how to connect an AI client, and a run started from the Console outputs the connection details and the tool list
  • 0.1.3: pricing events tool-read and tool-action
  • 0.1.2: server name aligned with the Store title (connector name and connection page), and the intro says the server covers only Lichess data. The endpoint and the tools do not change.
  • 0.1.1: the limits section no longer describes the rating-history tool removed before publication
  • 0.1.0: initial build (private, unpublished)