Skip to main content
Glama
piperap

Chess.com MCP Server

by piperap
README.md
# Chess.com MCP Server

A [Model Context Protocol][mcp] (MCP) server for Chess.com's Published Data API.

This provides access to Chess.com player data, game records, and other public information through standardized MCP interfaces, allowing AI assistants to search and analyze chess information.

https://github.com/user-attachments/assets/3b33361b-b604-465c-9f6a-3699b6907757

[mcp]: https://modelcontextprotocol.io/introduction/introduction

## Features

- [x] Access player profiles, stats, and game records
- [x] Search games by date and player
- [x] Check player online status
- [x] Get information about clubs and titled players
- [x] No authentication required (uses Chess.com's public API)
- [x] Docker containerization support
- [x] Provide interactive tools for AI assistants

The list of tools is configurable, so you can choose which tools you want to make available to the MCP client.

## Usage

### Docker (Recommended)

The easiest way to run chess-mcp with [Claude Desktop](https://claude.ai/desktop) is using Docker. If you don't have Docker installed, you can get it from [Docker's official website](https://www.docker.com/get-started/).


Edit your Claude Desktop config file:
* Mac: `~/Library/Application Support/Claude/claude_desktop_config.json`
* Windows: `%APPDATA%/Claude/claude_desktop_config.json`
* Linux: `~/.config/Claude/claude_desktop_config.json`

Then add the following configuration:

```json
{
  "mcpServers": {
    "chess": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "pab1it0/chess-mcp"
      ]
    }
  }
}
```

### Running with UV

Alternatively, you can run the server directly using UV. Edit your Claude Desktop config file (locations listed above) and add the server configuration:

```json
{
  "mcpServers": {
    "chess": {
      "command": "uv",
      "args": [
        "--directory",
        "<full path to chess-mcp directory>",
        "run",
        "src/chess_mcp/main.py"
      ]
    }
  }
}
```

> Note: if you see `Error: spawn uv ENOENT` in [Claude Desktop](https://claude.ai/desktop), you may need to specify the full path to `uv` or set the environment variable `NO_UV=1` in the configuration.

## Remote deployment (streamable HTTP + OAuth)

`main.py` only speaks stdio/SSE. `serve_http.py` serves the same tools over streamable HTTP so the server can be added as a remote connector (e.g. claude.ai), protected by OAuth. Tokens are issued by an external authorization server (Keycloak here) and only validated by this server: signature via JWKS, issuer, audience and allowed client.

Install (`mcp<2` is required: mcp 2.x removed `FastMCP`, and `uv.lock` is out of date):

```bash
uv venv --python 3.12 .venv
uv pip install --python .venv/bin/python -c constraints.txt -e . "pyjwt[crypto]>=2.8"
.venv/bin/python serve_http.py
```

A systemd unit is in [`deploy/chess-mcp.service`](deploy/chess-mcp.service).

| Variable | Default | Purpose |
|---|---|---|
| `MCP_HOST` / `MCP_PORT` | `0.0.0.0` / `8000` | Listen address |
| `MCP_ALLOWED_HOSTS` | `localhost:*,127.0.0.1:*` | Accepted `Host` headers (DNS rebinding protection); add the public hostname |
| `MCP_RESOURCE_URL` | `https://chess.smartpage.cl/mcp` | Public MCP URL, expected token audience |
| `OAUTH_ISSUER` | `https://auth.smartpage.cl/realms/casa` | Expected token issuer |
| `OAUTH_JWKS_URL` | `http://192.168.1.46:8080/realms/casa/protocol/openid-connect/certs` | Where signing keys are fetched |
| `OAUTH_ALLOWED_CLIENTS` | `claude-chess-mcp` | Accepted `azp` values |

Keycloak setup: a confidential client with redirect URIs `https://claude.ai/api/mcp/auth_callback` and `https://claude.com/api/mcp/auth_callback`, PKCE S256, and an audience mapper adding `MCP_RESOURCE_URL` to access tokens. claude.ai requests every scope the realm advertises, so assign the realm's client scopes to that client (as optional) or login fails with `invalid_scope`. In claude.ai choose "use your own OAuth client" and enter the client ID and secret.

## Development

Contributions are welcome! Please open an issue or submit a pull request if you have any suggestions or improvements.

This project uses [`uv`](https://github.com/astral-sh/uv) to manage dependencies. Install `uv` following the instructions for your platform:

```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```

You can then create a virtual environment and install the dependencies with:

```bash
uv venv
source .venv/bin/activate  # On Unix/macOS
.venv\Scripts\activate     # On Windows
uv pip install -e .
```

### Testing

The project includes a test suite that ensures functionality and helps prevent regressions.

Run the tests with pytest:

```bash
# Install development dependencies
uv pip install -e ".[dev]"

# Run the tests
pytest

# Run with coverage report
pytest --cov=src --cov-report=term-missing
```

## Available Tools

### Player Information
- `get_player_profile` - Get a player's profile from Chess.com
- `get_player_stats` - Get a player's stats from Chess.com
- `is_player_online` - Check if a player is currently online on Chess.com
- `get_titled_players` - Get a list of titled players from Chess.com

### Games
- `get_player_current_games` - Get a player's ongoing games on Chess.com
- `get_player_games_by_month` - Get a player's games for a specific month from Chess.com
- `get_player_game_archives` - Get a list of available monthly game archives for a player on Chess.com
- `download_player_games_pgn` - Download PGN files for all games in a specific month from Chess.com

### Clubs
- `get_club_profile` - Get information about a club on Chess.com
- `get_club_members` - Get members of a club on Chess.com

## License

MIT

---

[mcp]: https://modelcontextprotocol.io