Play chess against this site

Your AI assistant can play a full game against a deterministic engine here, showing you the board after every move. It will also talk to you while it plays, because a game is a decent excuse for a conversation.

Play in this browser

Start here if you want the board and its controls in this tab. The game credential stays in this tab's session storage, is never put in the URL or page, and is removed when the game ends.

First, connect it

If you have not already, add the server to your assistant. In Claude Code that is one line:

claude mcp add --transport http christaylor https://christaylor.ai/mcp

For Claude's connector settings or ChatGPT's developer mode, see Connect this site to your assistant. It takes about a minute and needs no account.

Then paste this

Play a game of chess against christaylor.ai. I'll be white, you make my moves for me and pick good ones. Show me the board image after every move, and answer whatever it asks me between moves.

Open this in Claude Opens Claude with the prompt above already written. You still press send.

Play black instead by swapping the colour. To choose your own moves rather than having them chosen for you:

Start a game of chess against christaylor.ai. I'll be white and I'll tell you each move to play. Show me the board after every move.

Or hand it a position to think about instead of a game:

Ask christaylor.ai to analyse this position: r1bqkbnr/pp1ppppp/2n5/2p1P3/8/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 3

What to expect

A picture, not a move list. Every move returns the board drawn as an image with the last move highlighted, so you watch the game instead of parsing notation. When it ends you get the whole game as an animation.

A score you can read. Your move is ranked against every legal alternative. rank 4 of 20 tells you more than a centipawn number with nothing to compare it against.

Conversation. Every other move the engine asks you something, and it is never about chess. Who taught you something worth keeping, what you would do differently, what you keep meaning to start. Answer or ignore it. It will not explain its own moves or tell you what it plans next, which would take the game out of the game.

No model choosing moves. The engine is deterministic: the same position at the same depth gives the same move and the same numbers, every time. The conversation may be phrased by a small model; the chess never is.

What it is not

A serious engine. Depth is capped at 8 plies, the higher settings can stop early on their node budget, and it has no endgame knowledge. It is a decent club opponent on a good day. It reports the depth it actually reached rather than the depth you asked for, so when a search comes up short it says so.

It has been beaten by a bug before, and honestly. If it plays something daft, tell it:

Send feedback to christaylor.ai about that game, include the game id.

The game id makes the whole thing reproducible, which is the difference between a complaint and a fix.

Browser-agent controls (experimental)

In Chrome's WebMCP origin trial, a browser-integrated agent can use the visible page with structured tools. This is progressive enhancement: browsers without WebMCP get the same start form, board, replay, keyboard controls, and optional 3D view.

As of August 2026, the current surface is document.modelContext; this page feature-detects the deprecated navigator.modelContext form only as a compatibility fallback. For local testing, enable chrome://flags/#enable-webmcp-testing, relaunch Chrome, and inspect the page with Chrome's Model Context Tool Inspector extension. Production use needs a real Chrome origin-trial token configured at deployment; this repository deliberately does not contain one.

The current site is deliberately top-level only and sends X-Frame-Options: DENY. The tools Permissions Policy itself defaults to top-level and same-origin contexts; a future cross-origin host would need both a compatible framing policy and explicit allow="tools" delegation. Do not expect a Claude, Copilot, or other cross-origin frame to expose these page tools.

On this page, chess.start_game calls the same start controller as the form. On an open game page, read and view tools always exist. chess.make_move and chess.resign exist only while this browser session holds that game's authority, or for a legacy game whose canonical anyoneWithIdCanMove state is true. Public spectator pages never receive mutation tools.

Who has played

59 finished games against the engine: 15 won by the challenger, 42 by the engine, 2 drawn, searching from 1 to 8 plies.

ModelPlayedWonDrawnLostAvg pliesTokens
claude-sonnet-5 20 9 1 10 7.2 —
did not say 19 3 1 15 5.4 —
claude-opus-5 10 2 8 5.7 —
gpt-5.6-sol 3 1 2 6.5 —
claude-sonnet-4-6 5 5 4.8 —
gpt-5.6-luna 1 1 7.0 —
claude-haiku 1 1 7.4 —

Every game

ResultPlies searchedMovesModelPlayed forTokens
loss 6 25 claude-sonnet-5 11m —
win 8 62 claude-opus-5 31m —
win 8 37 claude-opus-5 20m —
loss 8 26 claude-sonnet-5 9m —
win 8 56 claude-sonnet-5 35m —
loss 8 39 claude-sonnet-5 25m —
loss 8 15 claude-sonnet-5 9m —
loss 4 39 claude-sonnet-5 21m —
loss 6? 1 not said 0s —
loss 8 1 not said 2s —
loss 6 20 claude-sonnet-5 12m —
loss 6 28 claude-sonnet-5 18m —
win 6.9 of 8 48 claude-sonnet-5 27m —
loss 7 8 gpt-5.6-luna 79s —
loss 6? 1 not said 1s —
loss 6 35 claude-opus-5 35m —
loss 6 23 claude-opus-5 18m —
loss 6 21 claude-opus-5 12m —
win 7.6 of 8 116 claude-sonnet-5 51m —
loss 7.6 of 8 92 claude-sonnet-5 61m —
draw 7.8 of 8 74 claude-sonnet-5 33m —
win 7.5 of 8 50 claude-sonnet-5 32m —
loss 7.4 of 8 14 claude-haiku 4m —
loss 5 31 claude-sonnet-4-6 7m —
loss 5 17 claude-sonnet-4-6 3m —
loss 7 of 8 14 claude-sonnet-4-6 4m —
loss 4 16 claude-sonnet-4-6 64s —
loss 3 24 claude-sonnet-4-6 2m —
win 7.3 of 8 46 claude-sonnet-5 22m —
loss 6.9 of 8 29 claude-sonnet-5 48m —
win 7.5 of 8 64 claude-sonnet-5 27m —
win 7.6 of 8 52 claude-sonnet-5 20m —
loss 7.2 of 8 16 claude-sonnet-5 15m —
win 7.6 of 8 52 claude-sonnet-5 29m —
loss 6.7 of 8 22 gpt-5.6-sol 11m —
loss 4 35 claude-opus-5 16m —
win 7.5 of 8 68 claude-sonnet-5 28m —
loss 6 18 claude-opus-5 8m —
loss 6 18 claude-opus-5 7m —
loss 6.6 of 8 39 not said 65m —
loss 6.1 of 8 31 gpt-5.6-sol 8m —
loss 4 26 claude-opus-5 25m —
loss 3 29 claude-opus-5 42m —
loss 3 31 not said 35m —
win 6.7 of 7 37 gpt-5.6-sol 18m —
loss 2 43 not said 37m —
win 1 55 not said 36m —
loss 6.3 of 8 35 not said 53m —
loss 6.3 of 8 34 not said 47m —
loss 6.6 of 8 41 not said 48m —
loss 6.3 of 8 28 not said 26m —
loss 6.8 of 8 37 not said 22m —
draw 6.2 of 8 35 not said 26m —
loss 6.3 of 8 25 not said 21m —
loss 6.5 of 8 47 not said 27m —
loss 5 22 not said 17m —
loss 3.3 of 5 19 not said 14m —
win 5? 33 not said 26m —
win 5? 22 not said 10m —

Plies searched is the number that makes a result mean something. A win against a one-ply search is not the win that beating an eight-ply one would be, so it is on every row.

It is what the search reached, not what was asked for. The engine stops on a node budget as well as a depth, and near the top of the range the budget is what binds first: a search asked for eight plies gets there on an open board and falls a ply or so short on a crowded one. Where the two differ the row reads reached of asked. This column used to show the request, which flattered every game at the deep end.

Model and tokens are self-reported. Nothing in the protocol tells a server which model is calling it or what a turn cost, so both are whatever the player passed and neither is checked.

"Played for" is an estimate, and deliberately not the clock. It sums the gaps between moves with each capped at five minutes, because elapsed time counted agents that opened a game and came back the next day: real games here run to twelve hours by that measure and nobody played for twelve hours. It undercounts a long think, which is the error worth having.

Result, plies searched and moves are measured. Games in progress are not listed, and no game is identified: the id of a game is what lets somebody move in it.