PokerData

io.github.hft-studioPublished by GitHub account hft-studiov1.0.4Updated Oct 24, 2026

GTO poker solver data: NLHE/PLO preflop ranges, postflop strategy, EV. 6-max NL preflop free.

VerifiedStreamable HTTPWeb executableFinanceData & AnalyticsAI & ML

Overview

AI-generated overview

Serves GTO poker solver data — NLHE and PLO preflop ranges, postflop strategy and EV — so an assistant can answer poker strategy questions with real…

What you can do
  • Look up coverage, datasets, tree docs and postflop packs, and check whether exploitability is published
  • Query preflop ranges, decision nodes, spots and table configs for NLHE and PLO games and stack depths
  • Walk solved postflop nodes and ranges, explain exact combos, summarize board texture and compare two strategies
  • Review uploaded hands, sessions, tournament results and tracked opponents with HUD rates and leak notes
  • File and list data or feature requests, and queue heads-up postflop solve jobs
  • Get a hosted hand-upload link or upload a small hand history paste
When to use it
Useful when someone wants an assistant to answer concrete poker strategy questions — opening ranges, defense frequencies, postflop lines — or to review their own uploaded hands and sessions against solver output.
Requirements
Remote Streamable HTTP endpoint, or the npm package pokerdata-mcp run via npx for stdio-only clients. A pdk_ API key is needed for strategy and hand tools, supplied as the POKERDATA_API_KEY environment variable or an Authorization bearer header; OAuth sign-in is also offered. Without a key only the tool list and coverage/docs tools work. A free Starter key exists; paid plans are metered by calls or data volume.
Before you install
Strategy, postflop, coaching and solve-queue tools require the POKERDATA_API_KEY or Authorization credential, and usage counts against a shared REST/MCP allowance. Uploading hand histories sends personal play data to the hosted service. Solve jobs stay pending because dispatch and billing are not configured. Some tools report that data is unavailable rather than estimating it.

Installation

In SourceWeft

  1. Open PokerData in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.hft-studio%2Fpokerdata/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "pokerdata": {
      "type": "http",
      "url": "https://pokerdata.io/api/mcp"
    }
  }
}

README

PokerData MCP: GTO poker solver data for AI agents

PokerData serves GTO solver strategy for no-limit hold'em and pot-limit Omaha as JSON, over an MCP server and a REST API. Point Claude, Cursor or any MCP client at it and ask "what does UTG open at 100bb?" or "how does the BB defend vs a BTN open?" and the agent gets the solver's real frequencies and EVs, not a guess.

  • Endpoint: https://pokerdata.io/api/mcp (Streamable HTTP, stateless)
  • Free without a key: the tool list and the coverage and docs tools
  • Strategy data: a pdk_ key from pokerdata.io/app/api. A free Starter key (25 calls or 50 MB a month, no card) unlocks every data tool. Claude and other OAuth clients can sign in instead of pasting a key.

This repository holds setup instructions, a small stdio bridge for clients that only speak stdio, examples and sample data. The data and the server are hosted at pokerdata.io.

What's covered

GameFormatStacksData
No-limit hold'em 6-max (nl)Cash, 5% rake, 0.5bb cap20, 30, 40, 50, 70, 100, 150, 200bbEvery preflop decision node, frequency and EV per hand class (169)
NLHE tournament 8-max (nlmtt8)Chip EV, 1bb BB ante10 to 300bbPreflop
NLHE tournament 8-max, classic ante (nlh8-hydra)Chip EV, 0.1bb ante10, 20, 30, 60bbPreflop
Pot-limit Omaha 6-max (plo)Cash12 to 200bbPreflop, suit-grouped classes
PLO 9-max (plo9)Cash60, 100bbPreflop
PLO5 6-max (plo5)Cash, 1.2bb ante100bbPreflop and postflop
NLHE heads-up postflopSingle-raised, 3-bet and 4-bet pots100bbSolved flops with turns and rivers, per-combo strategy and EV, two bet-size trees

list_games and list_postflop_packs return the live coverage, so an agent never has to trust this table. Not covered: ICM, PKO, multiway postflop, tournament postflop. Those requests come back as explicit "unsupported" rather than a cash-game stand-in.

Set it up

[Add to Cursor] [Install in VS Code] [Install in VS Code Insiders]

The buttons install the hosted server. Strategy tools need a pdk_ key (the free Starter key works): VS Code asks for it when it starts the server, and Cursor reads it from the POKERDATA_API_KEY environment variable.

Claude (claude.ai and Claude Desktop)

Open Settings → Connectors → Add custom connector, name it PokerData and paste https://pokerdata.io/api/mcp as the URL, then sign in with your PokerData account when Claude asks. Your plan's allowance applies, the free Starter allowance included.

Claude Code

sh
claude mcp add --transport http pokerdata https://pokerdata.io/api/mcp \  --header "Authorization: Bearer pdk_YOUR_KEY"

Cursor (~/.cursor/mcp.json)

This is the same config the button installs, and the one in .mcp.json. Set POKERDATA_API_KEY in your environment, or replace ${env:POKERDATA_API_KEY} with your key.

json
{  "mcpServers": {    "pokerdata": {      "url": "https://pokerdata.io/api/mcp",      "headers": { "Authorization": "Bearer ${env:POKERDATA_API_KEY}" }    }  }}

Claude Desktop and other stdio clients

json
{  "mcpServers": {    "pokerdata": {      "command": "npx",      "args": ["-y", "pokerdata-mcp"],      "env": { "POKERDATA_API_KEY": "pdk_YOUR_KEY" }    }  }}

Without env, only the tool list and the coverage and docs tools answer. The bridge in bin/pokerdata-mcp.js has no dependencies and only forwards JSON-RPC to the hosted endpoint. Claude Desktop can also add https://pokerdata.io/api/mcp directly as a custom connector.

Plain HTTP

sh
curl -s https://pokerdata.io/api/mcp -H 'Content-Type: application/json' \  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_node","arguments":{"game":"nl","stack":100,"history":"UTG"}}}'

More in examples/: a live example for every MCP tool, real-world scenarios (NL and PLO ranges, the npm bridge, raw JSON-RPC, Node, Python, client configs, REST) and a smoke test, all with captured responses.

Tools

GroupToolsKey
Coverage and docsget_started, list_games, list_postflop_packs, list_datasets, get_tree_docs, get_exploitabilityNot needed
Preflopget_range, get_node, list_spots, get_config, get_range_metadataNeeded, 6-max NL included; the free Starter key works
Postflopget_postflop_node, get_postflop_rangeNeeded
Coachingexplain_combo, get_board_report, compare_strategiesNeeded
Your handshand, session and opponent tools, hand uploadAny key, free trial included; never counts against your allowance
Solve queueenqueue_solve, get_queued_solve, list_queued_solves, list_library_solutionsNeeded

Preflop spots are action paths such as UTG_60%_HJ_Call (NLHE) or UTG_Open_HJ_3B (PLO). EVs are in small blinds. Responses are compact by default; pass detail: "full" for complete maps. Full contract: docs.pokerdata.io/ranges.

Every tool's full definition — name, title, description, input schema, output schema and behaviour annotations — exactly as the server returns it from tools/list, is in tools.json. Every tool also returns structuredContent matching its output schema alongside the text result.

Plans

PlanPriceWhat you get
No keyFreeTool list, coverage and docs tools
StarterFree key, no cardEvery data tool, 25 calls or 50 MB a month. Personal use
Hobbyist$10/monthEvery data tool, 10,000 calls or 200 MB a month, 5 requests a second. Personal use
Pro$100/monthEvery game and all postflop, 250,000 calls or 5 GB a month. Personal use
Enterprise$250/monthEverything in Pro, commercial use allowed, 5 million calls or 100 GB a month, higher rate limit
CustomContact usRedistribution, bulk export, licences for model training, SLAs

REST and MCP share one meter. Keys and plans: pokerdata.io/app/api.

Sample data

samples/ has two real responses, so you can check the format before connecting anything:

  • nl-6max-100bb-utg-first-in.json: UTG's first decision at 100bb, every action with per-hand frequency and EV.
  • nl-6max-100bb-utg-open-range.json: UTG's opening range at 100bb.

How the solves were made

Preflop cash trees come from established commercial solver packs. The tournament and postflop solves come from our own engine, validated against an independent reference solve of the same game tree — the comparison, position by position, is at pokerdata.io/methodology.

Nothing is estimated to fill a gap. Postflop exploitability is published per board (list_postflop_packs with a pack) and omitted where the solve does not carry it. No preflop dataset publishes exploitability, convergence or iteration counts, and get_exploitability says so instead of returning a number.

Related

  • pokerdata.io: download the raw solver packs, browse ranges free
  • Poker Study AI: an AI coach that reviews your hands against the same solves

Code in this repository is MIT licensed. Sample data is provided for evaluation under the pokerdata.io terms; see samples/LICENSE.md.

Source: README.md at commit 6103aef

Tools

32

get_started

Get started

Start here with a new user. Returns the short set of questions to ask them (game, format, stakes, goal), a menu of what PokerData can do with the tools for each, what is free without a key, and how to file a feature or data request. Free, no key needed.

Takes no parameters.

submit_request

File a feature or data request

File a feature request or data request for the user, after telling them their question isn't covered and they agree. kind "data" is missing coverage (a game, format, stack depth, spot, or solve); kind "feature" is a missing capability (a tool, filter, export, or endpoint). Free with any key; the PokerData team reads every one.

Parameterskindrequireddetailssummaryrequiredquestion

list_my_requests

List my requests

List the feature and data requests this account has filed, newest first, with their status. Free with any key.

Parameterslimit

list_games

List covered games

Discover covered stack depths and positions. Call this before low-level preflop queries. "nl" = no-limit hold'em 6-max cash (169-grid hands, per-hand EV in small blinds), "nl9" = no-limit hold'em 9-max cash, "nlmtt8" = no-limit hold'em 8-max MTT chip-EV (10–300bb, 1bb BB-ante; Fold/Call/Limp/AI/Open/3B tokens), "nlh8-hydra" = no-limit hold'em 8-max MTT chip-EV with a classic 0.1bb ante from every seat (10, 20, 30, 60bb; same tokens as nlmtt8), "plo" = pot-limit Omaha 6-max cash (4-card), "plo5" = pot-limit Omaha 5-card 6-max (100bb, 1.2bb ante), "plo9" = pot-limit Omaha 9-max cash, "plo6hu" = 6-card Omaha heads-up (BTN vs BB, 100bb). Cash trees are not tournament, ICM, PKO, or satellite solves. nlmtt8 is chip-EV only.

Parametersdetail

get_range

Get preflop range

The GTO range for one spot. `spot` is an action path of POSITION_ACTION pairs ending in the action whose range you want, e.g. NLHE cash "UTG_60%_HJ_Call", nlmtt8 "UTG_Open", or PLO "UTG_Open_HJ_3B". Add `hand` for one exact frequency and EV. Compact mode is default; PLO returns representative pure/mixed hands unless a hand is specified; plo5 returns the top hands by EV that take the action (limit up to 500 compact, 2000 full).

ParametersgamerequiredhandspotrequiredlimitstackrequireddetailminFreq

get_node

Get preflop decision node

Actions available at a decision node. `history` is an action path ending in the position about to act, e.g. "UTG_60%_HJ". sizeBb is the raise-to in big blinds and sizePctPot is the percent of the pot after calling (nlmtt8 40bb Open 40034 is 2.19bb; the pack label is 2.2x). evs are small blinds relative to fold. Compact mode returns action totals; add `hand` for its exact mixed strategy. full=true is full=1: all 169 hold'em hands with explicit 0, and no invented EVs.

ParametersfullgamerequiredhandstackrequireddetailhistoryrequiredminFreq

get_config

Get table configuration

Table for one preflop game and stack, in big blinds: seats, stacks, blinds (sb 0.5, bb 1), ante, antePostedBy, stackIncludesAnte, openSizes (first-in raise-to), evUnit, evBaseline. Convergence is not published. stackIncludesAnte is true: the named depth is the starting stack and the 1bb BB ante is posted from it. openSizes at 40bb is open 2.2x (listing 2.2bb; node decodes code 40034 to 2.19bb) and SB 2.8x (2.8bb). 10bb is all-in/fold versus 50bb stacks, so stacks is null there. evs on nodes are small blinds relative to fold. Example: get_config({ game: "nlmtt8", stack: 40 }).

Parametersgamerequiredstackrequired

list_spots

Search preflop spots

Search valid decision nodes for a stack depth, tagged by depth (1 = RFI, 2 = vs open, 3 = 3-bet pots, …). Compact mode is paginated; use depth, contains, and offset to narrow results without loading thousands of paths. plo9 has no spot index: walk it with get_node from history "UTG".

Parametersgamerequireddepthlimitstackrequireddetailoffsetcontains

list_postflop_packs

List postflop packs

Every solved postflop pack: preflop line, positions (OOP vs IP), stack, pot, the bet-size trees it is solved under, and the solved boards. Boards use the spaced form ("3h 3d 2s"). NLHE packs list `sizingTrees`: "75" (75% pot every street, the pack id itself) and "33" (33% pot on the flop, then 75%, under the `<pack>-flop33` id); every postflop tool accepts either tree's packId. PLO5 packs (ids starting plo5-) solve one 33% flop tree, flop decisions only. Compact output lists board names per pack. Pass `pack` (the 75% id or the -flop33 id) for that tree's per-board detail and per-flop exploitability where the index publishes a number. Missing exploitability is omitted, never estimated. Pass `variant` to list only NLHE or PLO5 packs. Call this before get_postflop_node.

Parameterspackdetailvariant

get_postflop_node

Get postflop solver node

One postflop solver node: the acting player's strategy for every hand class, the legal next segments, board, reach and the reach-weighted action split. Walk deeper by appending a returned childSegment (an action like "Bet 5.5" or a runout like "deal:7c") to `path`.

Parameterspackrequiredpathboardrequiredcombolimitdetail

explain_combo

Explain a postflop combo

Preferred tool for exact NLHE postflop hand questions. Returns a canonical context, exact action mix, action EV/loss when available, made-hand and draw classification, blocker facts, and same-rank-class suit comparisons. The server computes evidence; the agent should phrase causality as interpretation.

ParameterspackrequiredpathboardrequiredcomborequiredanteBbformatobjectivecomparisonLimit

get_board_report

Report on board textures

Preferred tool for board-texture heuristics. Aggregates action frequencies and range/action composition across solved boards in one postflop pack. Results explicitly report sample breadth and use equal weight per board.

ParameterspackrequiredpathanteBbformatfiltersobjectiveboardLimitrepresentativeLimit

compare_strategies

Compare two strategies

Preferred tool for differences between two preflop or postflop contexts. The server fetches both strategies and returns action-frequency/EV deltas plus the largest postflop combo changes, avoiding two large node payloads.

ParametersanteBbdomainrequiredformatbaselinerequiredobjectivecomboLimitcomparisonrequired

list_datasets

List solved datasets

List preflop datasets in the shipped tree documentation (stacks, positions, whether each bundle was analyzed). Preflop exploitability is not available.

Takes no parameters.

get_tree_docs

Get tree documentation

Tree documentation for one dataset: coverage note from the shipped README and per-stack bundle or node counts from the shipped index. Does not read or modify range bytes.

Parametersdatasetrequired

get_range_metadata

Get range index metadata

Index metadata for one preflop game, stack, and path: bundle stats for hold'em/PLO bundles, or the matching node row for plo5 and plo6hu. Does not return a strategy and does not invent exploitability.

Parametersgamerequiredpathrequiredstackrequired

get_exploitability

Get preflop exploitability

Preflop exploitability for a game. No preflop dataset publishes exploitability, convergence, or iteration counts. The answer is not available; this tool never fills in a number.

Parametersgamerequired

get_postflop_range

Get postflop action range

The range a player takes one flop action with, from a solved pack: hand-class weights ("AA:1,AKs:0.42,...", same format as the preflop ranges) after every earlier flop action on the path. `path` ends in the action whose range you want, e.g. ["Check", "Bet 1.8", "Call 1.8"] for the check-call range. Bet-size tree. "33" = 33% pot on the flop, then 75% pot on the turn and river, plus all-in. "75" = 75% pot on every street, plus all-in. Compact and full detail apply to the other range tools; this returns the action range itself.

ParametershandpackrequiredpathrequiredtreerequiredboardrequiredminFreq

find_hands

Find my hands

Find hands the account has uploaded. Returns hand_id, session_id, handAt, position, cards, game, board, potType, street lines, and netBb. Solver grade buckets are not filled. If this account has no hands, offer the hosted upload page from get_upload_link (https://pokerdata.io/upload) instead of asking the user to paste histories into chat.

Parameterssortrequiredlimitrequiredfiltergame_typesession_idtable_sizegto_vs_3bet_bucketgto_plo5_rfi_bucket

get_hand_results

Get my results curve

Per-hand cumulative results for a winnings curve. `points` is [{ hand, bb }], oldest to newest, downsampled. Pass session_id for one session. If this account has no hands, offer the hosted upload page from get_upload_link (https://pokerdata.io/upload) instead of asking the user to paste histories into chat.

Parametersmax_pointsrequiredsession_id

get_session_summary

Summarize a session

One uploaded session's headline numbers: hero, game type, start and end times, hands played, net result in big blinds, and HUD rates (VPIP, PFR, 3-bet, open limp) as percentages with the sample size. Use it after list_my_sessions to report how a session went; use get_hand_results for its winnings curve and find_hands for individual hands. Returns an error for an unknown session id. Any key works, free trial included, and it never counts against the allowance. If this account has no hands, offer the hosted upload page from get_upload_link (https://pokerdata.io/upload) instead of asking the user to paste histories into chat.

Parameterssession_idrequired

list_my_sessions

List my sessions

Recent uploaded sessions, newest first: id, hero, game type, dates, hands, and net result. game_type matches hole-card count. If this account has no hands, offer the hosted upload page from get_upload_link (https://pokerdata.io/upload) instead of asking the user to paste histories into chat.

Parameterslimitrequiredgame_type

get_tournament_results

Get my tournament results

MTT results imported from tournament summary files. Money is in cents. Hand histories are not a source of buy-ins or prizes. If this account has no hands, offer the hosted upload page from get_upload_link (https://pokerdata.io/upload) instead of asking the user to paste histories into chat.

Parameterslimitrequired

list_my_opponents

List my opponents

Tracked opponents from uploaded hands. Each row has handCount, handsVsHero, and heroBb100Vs. Pass name to find one villain.

Parametersheronamesortrequiredlimitrequiredgame_typemin_handsrequired

get_opponent_notes

Get opponent notes

Leak notes computed from uploaded hands for one opponent, with the sample size on each line.

Parametersopponent_idrequired

get_opponent_limp_range

Get an opponent's limp range

Shown-hand first-in limp range: 169-class counts of hole cards villains showed after an open limp. Pass position for one seat. Sample is showdown-only. This is not a solver range.

Parameterslimitrequiredpositiongame_typesession_idtable_sizeopponent_id

enqueue_solve

Record a solve request

Record a heads-up postflop solve request. Required: title, board, pot (bb), effective_stack (bb). The job stays pending: solver dispatch and billing are not configured, so this does not start a solve.

Parameterspotrequiredtagsboardrequiredtitlerequiredip_rangeadd_allinbet_sizesoop_rangeiterationseffective_stackrequiredmax_aggressions

get_queued_solve

Get a queued solve

Look up one queued solve for this account. status is pending, running, done, or failed. solution_id is null until a worker exists.

Parametersqueue_idrequired

list_queued_solves

List my queued solves

List this account's solver-queue jobs, newest first. Jobs are not dispatched.

Parameterslimitrequired

list_library_solutions

List my saved solutions

Finished postflop solutions saved for this account. None are marked done while dispatch is disabled.

Parameterslimitrequired

upload_hand_history

Upload a hand history

Secondary upload path for a small paste. Prefer get_upload_link and the hosted /upload page. Runs the same ingestion pipeline and returns hands parsed, tournaments parsed, and errors. Does not grade solver frequencies.

Parameterstextrequiredfilename

Version history

2
  1. v1.0.4LatestOct 17, 2026
  2. v1.0.1Oct 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts