Skip to main content
Glama
vedsmehta

poker-mcp

by vedsmehta
README.md
# poker-mcp

A **poker study / decision-support** [MCP](https://modelcontextprotocol.io) server and
multi-table simulator. It lets an MCP client (Cursor, Claude Desktop, etc.) spin up
simulated No-Limit Texas Hold'em tables, play against simple opponent bots across
multiple tables at once, and get equity / pot-odds / preflop-chart-based advice for
study and practice.

Built on:

- [`mcp`](https://pypi.org/project/mcp/) — the official Python MCP SDK (`FastMCP`, stdio transport).
- [`pokerkit`](https://pypi.org/project/pokerkit/) — poker game engine and hand evaluation (`NoLimitTexasHoldem`, `StandardHighHand`).
- [`pydantic`](https://pypi.org/project/pydantic/) — typed tool inputs/outputs.

## Scope & non-goals (please read)

This is a **study and simulation tool**, not a cheating tool.

- **No real-money site automation or scraping.** It does not connect to, scrape, read
  the screen of, or automate any commercial/real-money poker client. It only plays its
  own self-contained simulated tables.
- **No webcam / computer-vision player reads.** Opponent "reads" here are purely
  statistics derived from hands you simulate or explicitly import. (A future,
  clearly-opt-in stub is mentioned below but is **out of scope for v1**.)
- **No GTO solver in v1.** Advice is heuristic (Monte Carlo equity + pot odds + simple
  preflop ranges). Real solver integration is a future phase (see Roadmap).

Use it to practice multi-tabling, sanity-check equities, and rehearse decisions — not
to gain an unfair edge in real games.

## Features

- Multi-table NLHE simulator with configurable blinds, stacks, seats, and hero seat.
- Opponent bots: `RandomBot`, `TightBot`, `CallingStationBot` (and a `mixed` profile).
- `get_pending_actions()` multi-table driver: find every table waiting on you.
- Monte Carlo equity vs N random opponents, plus pot-odds helper.
- Simple JSON preflop range charts (ships with a 6-max RFI chart).
- Heuristic `advise()` combining equity + pot odds + preflop chart with EV rationale.
- SQLite hand-history storage and opponent stats (VPIP / PFR / AF).

## Install

Requires Python >= 3.11 and [`uv`](https://docs.astral.sh/uv/).

```bash
uv sync            # create .venv and install runtime deps
uv sync --extra dev  # also install dev deps (pytest)
```

## Run

```bash
# as a module
uv run python -m poker_mcp.server

# or via the console script
uv run poker-mcp
```

The server speaks the MCP stdio transport, so it's normally launched by an MCP client
rather than used interactively.

## Register in Cursor / Claude (stdio)

Add an entry to your MCP config (e.g. `.cursor/mcp.json` or Claude Desktop's
`claude_desktop_config.json`). Point `cwd` at this repository so `uv` resolves the
project environment:

```json
{
  "mcpServers": {
    "poker-mcp": {
      "command": "uv",
      "args": ["run", "python", "-m", "poker_mcp.server"],
      "cwd": "/Users/vedsm/projects/poker-mcp"
    }
  }
}
```

## Tools

| Tool | Description |
| --- | --- |
| `create_table(seats, small_blind, big_blind, starting_stack, hero_seat, bot_profile)` | Create a table and deal the first hand; auto-advances bots to the hero. |
| `list_tables()` | Summaries of all open tables. |
| `close_table(table_id)` | Close/remove a table. |
| `get_table_state(table_id)` | Full state summary (board, pot, stacks, hero cards, whose turn, street). |
| `get_legal_actions(table_id)` | Legal betting actions for the current actor. |
| `get_pending_actions()` | Every table currently waiting on the hero (multi-table driver). |
| `submit_action(table_id, action, amount)` | Apply the hero's action, then auto-advance bots to the next decision. |
| `autoplay_bots(table_id)` | Advance bots until it's the hero's turn or the hand ends. |
| `advise(table_id, mc_trials)` | Recommended action + equity + pot odds + EV rationale. |
| `calc_equity(hole, board, num_opponents, mc_trials)` | Monte Carlo equity estimate. |
| `get_opponent_stats(player_id)` | VPIP / PFR / AF for a player from stored hands. |
| `import_hand_history(events)` | Minimal stub to store externally-provided events. |

Cards use standard two-character notation: rank (`2-9`, `T`, `J`, `Q`, `K`, `A`) +
suit (`c`, `d`, `h`, `s`), e.g. `As`, `Kh`, `Td`.

## Example flow

1. `create_table(seats=6, hero_seat=0, bot_profile="mixed")` → returns a table with an id.
2. `get_pending_actions()` → see which tables need you.
3. `advise(table_id)` → get a recommendation with equity and reasoning.
4. `submit_action(table_id, "call")` (or `"raise"` with `amount`) → bots play on; a new hand is dealt when one ends.

## Project layout

```
poker-mcp/
├── pyproject.toml
├── README.md
├── LICENSE
├── data/preflop_ranges/6max_rfi.json
├── src/poker_mcp/
│   ├── server.py            # FastMCP instance + tools
│   ├── config.py
│   ├── schemas.py           # pydantic IO models
│   ├── engine/              # table.py, manager.py, bots.py
│   ├── decision/            # equity.py, preflop.py, policy.py
│   └── modeling/            # store.py (sqlite), stats.py
└── tests/
```

The hand-history database defaults to `poker_mcp.db` in the working directory; override
with the `POKER_MCP_DB` environment variable. Override the preflop chart directory with
`POKER_MCP_RANGES_DIR`.

## Development

```bash
uv sync --extra dev
uv run pytest -q
```

## Roadmap (future phases, not in v1)

- **GTO / solver integration** (e.g. TexasSolver) for range-vs-range solving.
- Richer preflop/postflop range charts and 3-bet/4-bet logic.
- More sophisticated opponent models and exploitative adjustments.
- **Opt-in** live-play study aids. Any webcam/computer-vision "player read" feature is
  explicitly out of scope for v1 and would only ever be an opt-in study stub — never
  automation of a real-money client.

## License

MIT © Vedant Mehta. See [LICENSE](LICENSE).

TDQS

A3.7/5.0

Scored across 11 tools

Disambiguation5/5

Each tool targets a distinct operation: table lifecycle (create/get/list/close), acting (submit/autoplay/pending), and analysis (advise/equity/stats). The only near-overlap, list_tables versus get_pending_actions, is clearly separated by 'all tables' versus 'tables waiting on hero.'

Naming Consistency4/5

Most tools follow a clean verb_noun snake_case pattern such as create_table, close_table, get_table_state, and submit_action. Minor deviations like 'advise' (verb only) and 'calc_equity' (abbreviated verb) do not undermine the overall consistency.

Tool Count5/5

11 tools is well-scoped for a poker simulation server covering table lifecycle, decision-making, and analysis. Every tool maps to a meaningful workflow step with no obvious redundancy or bloat.

Completeness4/5

Core table workflows are complete: create, list, get state, submit actions, advance bots, and poll pending decisions. The analysis side is solid, but import_hand_history is explicitly a stub and there is no direct hand-history query, leaving a minor gap for deeper opponent data exploration.

Maintenance

ActivitySlowing
ResponsivenessNo issues