PokerData

io.github.hft-studio由 GitHub 账号 hft-studio 发布v1.0.4更新于 Oct 24, 2026

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

已验证Streamable HTTP可网页运行金融数据与分析AI 与机器学习

概览

AI 生成的概览

提供 GTO 扑克求解器数据——NLHE 与 PLO 翻前范围、翻后策略与 EV,让助手用真实频率回答扑克策略问题。

可以做什么
  • 查询覆盖范围、数据集、树文档与翻后牌组,并确认是否公布可利用度
  • 查询 NLHE 与 PLO 各游戏和筹码深度的翻前范围、决策节点、局面与牌桌配置
  • 遍历已求解的翻后节点与范围,解释具体组合、汇总牌面结构并比较两种策略
  • 查看已上传的牌局、场次、锦标赛成绩与对手数据,含 HUD 比率与漏洞笔记
  • 提交并查看数据或功能请求,排队单挑翻后求解任务
  • 获取托管上传链接,或上传少量牌谱文本
适用场景
适合希望助手回答具体扑克策略问题(开池范围、防守频率、翻后线路),或想用求解器结果复盘自己上传的牌局与场次的场景。
运行要求
使用远程 Streamable HTTP 端点,或对仅支持 stdio 的客户端通过 npx 运行 npm 包 pokerdata-mcp。策略与牌局工具需要 pdk_ API 密钥,通过 POKERDATA_API_KEY 环境变量或 Authorization Bearer 头提供,也支持 OAuth 登录。无密钥时仅工具列表与覆盖/文档工具可用。有免费 Starter 密钥;付费方案按调用次数或数据量计费。
安装前请注意
策略、翻后、教练与求解队列工具需要 POKERDATA_API_KEY 或 Authorization 凭据,用量与 REST 共用同一配额。上传牌谱会把个人对局数据发送到托管服务。求解任务因未配置派发与计费而一直处于待处理状态。部分工具在数据缺失时会明确表示不可用,而不是估算。

安装

在 SourceWeft 中

  1. 打开 控制台中的 PokerData,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.hft-studio%2Fpokerdata/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "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.

来源:README.md,提交 6103aef

工具

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.

无需输入参数。

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.

输入参数kind必填detailssummary必填question

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.

输入参数limit

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.

输入参数detail

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).

输入参数game必填handspot必填limitstack必填detailminFreq

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.

输入参数fullgame必填handstack必填detailhistory必填minFreq

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 }).

输入参数game必填stack必填

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".

输入参数game必填depthlimitstack必填detailoffsetcontains

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.

输入参数packdetailvariant

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`.

输入参数pack必填pathboard必填combolimitdetail

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.

输入参数pack必填pathboard必填combo必填anteBbformatobjectivecomparisonLimit

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.

输入参数pack必填pathanteBbformatfiltersobjectiveboardLimitrepresentativeLimit

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.

输入参数anteBbdomain必填formatbaseline必填objectivecomboLimitcomparison必填

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.

无需输入参数。

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.

输入参数dataset必填

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.

输入参数game必填path必填stack必填

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.

输入参数game必填

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.

输入参数handpack必填path必填tree必填board必填minFreq

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.

输入参数sort必填limit必填filtergame_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.

输入参数max_points必填session_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.

输入参数session_id必填

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.

输入参数limit必填game_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.

输入参数limit必填

list_my_opponents

List my opponents

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

输入参数heronamesort必填limit必填game_typemin_hands必填

get_opponent_notes

Get opponent notes

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

输入参数opponent_id必填

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.

输入参数limit必填positiongame_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.

输入参数pot必填tagsboard必填title必填ip_rangeadd_allinbet_sizesoop_rangeiterationseffective_stack必填max_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.

输入参数queue_id必填

list_queued_solves

List my queued solves

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

输入参数limit必填

list_library_solutions

List my saved solutions

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

输入参数limit必填

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.

输入参数text必填filename

版本历史

2
  1. v1.0.4最新Oct 17, 2026
  2. v1.0.1Oct 16, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分