Skip to main content
Glama
indulge

Stockfish MCP Server

by indulge
README.md
# Stockfish MCP Server

A local [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server that
exposes the [Stockfish](https://stockfishchess.org/) chess engine to any MCP client
(Claude Desktop, Claude Code, Cline, Continue, your own client, …).

It speaks MCP over **stdio**. All tools are **stateless** — every call takes a FEN
string, so the server holds no game state.

---

## Tools

| Tool | Purpose |
|------|---------|
| `analyze_position` | Evaluate a position; returns score (White POV), best move, and principal variation(s). Supports `multipv`, `depth`, or `movetime_ms`. |
| `get_best_move` | Pick a move for the side to move. Optional `skill_level` (0–20) or `elo` (~1320–3190) to play at reduced strength. |
| `evaluate_position` | Lighter/faster single-line evaluation. |
| `apply_moves` | Play a sequence of SAN/UCI moves and return the resulting FEN. |
| `get_legal_moves` | List all legal moves (SAN + UCI). |
| `visualize_board` | Render a position as a Unicode/ASCII board. |
| `engine_info` | Engine name/version and default options. |

Every tool defaults to the standard starting position when `fen` is omitted.
Scores are from White's point of view; mate is reported as `#±N`.

---

## Dependencies

| Dependency | Version | Why |
|---|---|---|
| **Python** | ≥ 3.14 | Runtime (see `.python-version`). |
| **[python-chess](https://python-chess.readthedocs.io/)** (`chess`) | ≥ 1.11.2 | Board logic + UCI engine driver. |
| **[FastMCP](https://gofastmcp.com/)** (`fastmcp`) | ≥ 3.4.2 | MCP server framework. |
| **Stockfish binary** | 17/18+ | The engine itself. **Not bundled** (it is >100 MB); download it — see below. |

Python deps are declared in `pyproject.toml` and pinned in `uv.lock`.
[`uv`](https://docs.astral.sh/uv/) is the recommended installer/runner, but plain
`pip`/`venv` works too.

---

## Install

```bash
# 1. Get the code
git clone <this-repo-url>
cd stockfish-mcp-server

# 2. Get the Stockfish engine binary (NOT in git — too large).
#    This downloads it to engine/stockfish:
./engine/download-stockfish.sh
#    ...or set SF_ASSET to match your CPU/OS, e.g.:
#    SF_ASSET=stockfish-ubuntu-x86-64-avx512 ./engine/download-stockfish.sh
#    Browse builds: https://github.com/official-stockfish/Stockfish/releases/latest
#    Already have Stockfish? Skip this and set STOCKFISH_PATH (see Configuration).

# 3a. Install dependencies with uv (recommended)
uv sync

# 3b. ...or with pip
python -m venv .venv && . .venv/bin/activate
pip install "chess>=1.11.2" "fastmcp>=3.4.2"
```

### Optional: install as a command

The project is packaged with a `stockfish-mcp` console-script entry point:

```bash
uv tool install .        # puts `stockfish-mcp` on your PATH (~/.local/bin)
# or: pip install .
```

---

## Run

```bash
uv run python server.py     # run the stdio server (uv)
# or, if installed as a command:
stockfish-mcp
```

The server communicates over stdio and is normally launched **by your MCP client**
(below), not by hand. Stop it with Ctrl-C / SIGTERM.

---

## Use it with an MCP client

MCP stdio clients launch the server as a subprocess. Point your client at either
`uv run python /abs/path/to/server.py` or the installed `stockfish-mcp` command,
and set `STOCKFISH_PATH` if the binary isn't at `engine/stockfish`.

A ready-to-edit example is in [`examples/mcp-config.json`](examples/mcp-config.json).

**Generic MCP config** (the shape most clients accept — e.g. a `mcpServers` map in
Claude Desktop's `claude_desktop_config.json`, or `.mcp.json`):

```json
{
  "mcpServers": {
    "stockfish": {
      "command": "uv",
      "args": ["run", "python", "/abs/path/to/stockfish-mcp-server/server.py"],
      "env": {
        "STOCKFISH_PATH": "/abs/path/to/stockfish-mcp-server/engine/stockfish"
      }
    }
  }
}
```

If you installed the command (`uv tool install .`), use it directly:

```json
{
  "mcpServers": {
    "stockfish": {
      "command": "stockfish-mcp",
      "env": { "STOCKFISH_PATH": "/abs/path/to/engine/stockfish" }
    }
  }
}
```

**Claude Code** (CLI) — register in user scope so it's available everywhere:

```bash
claude mcp add stockfish -s user \
  -e STOCKFISH_PATH=/abs/path/to/engine/stockfish \
  -- stockfish-mcp
claude mcp list      # should show: stockfish … ✔ Connected
```

Then ask the model things like *"analyze this FEN at depth 20"* or
*"play a move against me at 1500 Elo."*

> Tip: launching the executable directly (the installed `stockfish-mcp`, or the
> venv's `python`) rather than via a wrapper makes the server the client's direct
> child process, so its shutdown signal handling works cleanly.

---

## Configuration (environment variables)

| Variable | Default | Meaning |
|----------|---------|---------|
| `STOCKFISH_PATH` | `engine/stockfish` (next to `server.py`) | Path to the Stockfish binary. |
| `STOCKFISH_THREADS` | `min(4, ncpu)` | Search threads. |
| `STOCKFISH_HASH_MB` | `256` | Transposition-table size (MB). |

Per-call search cost is capped (depth ≤ 30, movetime ≤ 60 s, multipv ≤ 10) so a
single request can't stall the stdio loop.

---

## Test

```bash
uv run python test_server.py    # end-to-end smoke test via an in-memory MCP client
```

It lists the tools and exercises analysis, mate detection, reduced-strength play,
move application, and error handling — no external MCP client needed.

---

## Files

```
server.py                 The MCP server (FastMCP + python-chess)
test_server.py            End-to-end smoke test
pyproject.toml            Package metadata + dependencies (entry point: stockfish-mcp)
uv.lock                   Pinned dependency versions
.python-version           Python version (3.14)
engine/
  download-stockfish.sh   Fetches the engine binary (binary itself is gitignored)
  LICENSE-stockfish.txt   Stockfish license (GPLv3)
```

---

## References

- Model Context Protocol — https://modelcontextprotocol.io
- FastMCP — https://gofastmcp.com/
- python-chess — https://python-chess.readthedocs.io/
- Stockfish — https://stockfishchess.org/ · releases: https://github.com/official-stockfish/Stockfish/releases/latest
- uv — https://docs.astral.sh/uv/

---

## License

This server's code is provided as-is. **Stockfish is licensed under GPLv3** — see
`engine/LICENSE-stockfish.txt`. If you redistribute the Stockfish binary, you must
comply with the GPLv3 (including providing source).

TDQS

A3.6/5.0

Scored across 7 tools

Disambiguation3/5

There is overlap between analyze_position, evaluate_position, and get_best_move, as all provide position evaluation or move suggestions. The descriptions attempt to differentiate them, but an agent may struggle to select the appropriate tool.

Naming Consistency4/5

All tool names use snake_case and generally follow a verb_noun pattern, with verbs like get_, analyze_, evaluate_, and apply_. However, the mix of get_ with other verbs like analyze_ and evaluate_ introduces minor inconsistency.

Tool Count5/5

With 7 tools, the server covers core chess analysis and interaction functions without unnecessary bloat. Each tool contributes to a clear purpose, and the count is ideal for the domain.

Completeness4/5

The tool set covers essential operations: analysis, move generation, board visualization, and applying moves. Minor gaps include lacking explicit start_position loading or customizable depth options, but the surface is sufficient for typical stateless analysis use cases.

Maintenance

ActivityInactive
ResponsivenessNo issues