Skip to content

PokerData

by hft-studio · remote · local (npm) · no sign-in to list tools · v1.0.4 · published by GitHub user hft-studio

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

Deletes · 3Changes · 1

32 tools: 3 can delete or cancel things, 1 change things and 28 only read.

Scanned Oct 21, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http pokerdata https://pokerdata.io/api/mcp

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "get_started" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "get_started" says "get": a word for reading.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

32 tools

Deletes or cancels 3Claude Code: deny
  • enqueue_solveRecord a heads-up postflop solve request.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Record a solve request
    • readOnlyHint: false
    • idempotentHint: false
    • destructiveHint: true
    • openWorldHint: false
  • submit_requestFile a feature request or data request for the user, after telling them their question isn't covered and they agree.No findings

    Why it is in this group

    • The name "submit_request" says "submit": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: File a feature or data request
    • readOnlyHint: false
    • idempotentHint: false
    • destructiveHint: true
    • openWorldHint: false
  • upload_hand_historySecondary upload path for a small paste.No findings

    Why it is in this group

    • The name "upload_hand_history" says "upload": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Upload a hand history
    • readOnlyHint: false
    • idempotentHint: false
    • destructiveHint: true
    • openWorldHint: false
Changes things 1Claude Code: ask
  • get_startedStart here with a new user.1 finding

    Why it is in this group

    • The name "get_started" says "get": a word for reading.
    • The description's first verb is "start": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "get_started" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "get_started" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get started
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
Only reads 28Claude Code: allow
  • compare_strategiesPreferred tool for differences between two preflop or postflop contexts.No findings

    Why it is in this group

    • The name "compare_strategies" says "compare": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Compare two strategies
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • explain_comboPreferred tool for exact NLHE postflop hand questions.No findings

    Why it is in this group

    • The name "explain_combo" says "explain": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Explain a postflop combo
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • find_handsFind hands the account has uploaded.No findings

    Why it is in this group

    • The name "find_hands" says "find": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Find my hands
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_board_reportPreferred tool for board-texture heuristics.No findings

    Why it is in this group

    • The name "get_board_report" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Report on board textures
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_configTable 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.No findings

    Why it is in this group

    • The name "get_config" says "get": a word for reading.
    Description, as the server wrote it
    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 }).

    Annotations the server declares

    • title: Get table configuration
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_exploitabilityPreflop exploitability for a game.No findings

    Why it is in this group

    • The name "get_exploitability" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get preflop exploitability
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_hand_resultsPer-hand cumulative results for a winnings curve.No findings

    Why it is in this group

    • The name "get_hand_results" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get my results curve
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_nodeActions available at a decision node.No findings

    Why it is in this group

    • The name "get_node" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get preflop decision node
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_opponent_limp_rangeShown-hand first-in limp range: 169-class counts of hole cards villains showed after an open limp.No findings

    Why it is in this group

    • The name "get_opponent_limp_range" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get an opponent's limp range
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_opponent_notesLeak notes computed from uploaded hands for one opponent, with the sample size on each line.No findings

    Why it is in this group

    • The name "get_opponent_notes" says "get": a word for reading.
    Description, as the server wrote it
    Leak notes computed from uploaded hands for one opponent, with the sample size on each line.

    Annotations the server declares

    • title: Get opponent notes
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_postflop_nodeOne postflop solver node: the acting player's strategy for every hand class, the legal next segments, board, reach and the reach-weighted action split.No findings

    Why it is in this group

    • The name "get_postflop_node" says "get": a word for reading.
    Description, as the server wrote it
    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`.

    Annotations the server declares

    • title: Get postflop solver node
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_postflop_rangeThe 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 th…No findings

    Why it is in this group

    • The name "get_postflop_range" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get postflop action range
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_queued_solveLook up one queued solve for this account.No findings

    Why it is in this group

    • The name "get_queued_solve" says "get": a word for reading.
    Description, as the server wrote it
    Look up one queued solve for this account. status is pending, running, done, or failed. solution_id is null until a worker exists.

    Annotations the server declares

    • title: Get a queued solve
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_rangeThe GTO range for one spot.No findings

    Why it is in this group

    • The name "get_range" says "get": a word for reading.
    Description, as the server wrote it
    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).

    Annotations the server declares

    • title: Get preflop range
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_range_metadataIndex metadata for one preflop game, stack, and path: bundle stats for hold'em/PLO bundles, or the matching node row for plo5 and plo6hu.No findings

    Why it is in this group

    • The name "get_range_metadata" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get range index metadata
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_session_summaryOne 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 wi…No findings

    Why it is in this group

    • The name "get_session_summary" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Summarize a session
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_tournament_resultsMTT results imported from tournament summary files.No findings

    Why it is in this group

    • The name "get_tournament_results" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get my tournament results
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • get_tree_docsTree documentation for one dataset: coverage note from the shipped README and per-stack bundle or node counts from the shipped index.No findings

    Why it is in this group

    • The name "get_tree_docs" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get tree documentation
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • list_datasetsList preflop datasets in the shipped tree documentation (stacks, positions, whether each bundle was analyzed).No findings

    Why it is in this group

    • The name "list_datasets" says "list": a word for reading.
    Description, as the server wrote it
    List preflop datasets in the shipped tree documentation (stacks, positions, whether each bundle was analyzed). Preflop exploitability is not available.

    Annotations the server declares

    • title: List solved datasets
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • list_gamesDiscover covered stack depths and positions.No findings

    Why it is in this group

    • The name "list_games" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List covered games
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • list_library_solutionsFinished postflop solutions saved for this account.No findings

    Why it is in this group

    • The name "list_library_solutions" says "list": a word for reading.
    Description, as the server wrote it
    Finished postflop solutions saved for this account. None are marked done while dispatch is disabled.

    Annotations the server declares

    • title: List my saved solutions
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • list_my_opponentsTracked opponents from uploaded hands.No findings

    Why it is in this group

    • The name "list_my_opponents" says "list": a word for reading.
    Description, as the server wrote it
    Tracked opponents from uploaded hands. Each row has handCount, handsVsHero, and heroBb100Vs. Pass name to find one villain.

    Annotations the server declares

    • title: List my opponents
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • list_my_requestsList the feature and data requests this account has filed, newest first, with their status.No findings

    Why it is in this group

    • The name "list_my_requests" says "list": a word for reading.
    Description, as the server wrote it
    List the feature and data requests this account has filed, newest first, with their status. Free with any key.

    Annotations the server declares

    • title: List my requests
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • list_my_sessionsRecent uploaded sessions, newest first: id, hero, game type, dates, hands, and net result.No findings

    Why it is in this group

    • The name "list_my_sessions" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List my sessions
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • list_postflop_packsEvery solved postflop pack: preflop line, positions (OOP vs IP), stack, pot, the bet-size trees it is solved under, and the solved boards.No findings

    Why it is in this group

    • The name "list_postflop_packs" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List postflop packs
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • list_queued_solvesList this account's solver-queue jobs, newest first.No findings

    Why it is in this group

    • The name "list_queued_solves" says "list": a word for reading.
    Description, as the server wrote it
    List this account's solver-queue jobs, newest first. Jobs are not dispatched.

    Annotations the server declares

    • title: List my queued solves
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false
  • list_spotsSearch valid decision nodes for a stack depth, tagged by depth (1 = RFI, 2 = vs open, 3 = 3-bet pots, …).No findings

    Why it is in this group

    • The name "list_spots" says "list": a word for reading.
    Description, as the server wrote it
    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".

    Annotations the server declares

    • title: Search preflop spots
    • readOnlyHint: true
    • idempotentHint: true
    • destructiveHint: false
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.0.4. Values in angle brackets are yours to fill in.

claude mcp add --transport http pokerdata https://pokerdata.io/api/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__pokerdata__list_my_requests",
      "mcp__pokerdata__list_games",
      "mcp__pokerdata__get_range",
      "mcp__pokerdata__get_node",
      "mcp__pokerdata__get_config",
      "mcp__pokerdata__list_spots",
      "mcp__pokerdata__list_postflop_packs",
      "mcp__pokerdata__get_postflop_node",
      "mcp__pokerdata__explain_combo",
      "mcp__pokerdata__get_board_report",
      "mcp__pokerdata__compare_strategies",
      "mcp__pokerdata__list_datasets",
      "mcp__pokerdata__get_tree_docs",
      "mcp__pokerdata__get_range_metadata",
      "mcp__pokerdata__get_exploitability",
      "mcp__pokerdata__get_postflop_range",
      "mcp__pokerdata__find_hands",
      "mcp__pokerdata__get_hand_results",
      "mcp__pokerdata__get_session_summary",
      "mcp__pokerdata__list_my_sessions",
      "mcp__pokerdata__get_tournament_results",
      "mcp__pokerdata__list_my_opponents",
      "mcp__pokerdata__get_opponent_notes",
      "mcp__pokerdata__get_opponent_limp_range",
      "mcp__pokerdata__get_queued_solve",
      "mcp__pokerdata__list_queued_solves",
      "mcp__pokerdata__list_library_solutions",
      "mcp__pokerdata__get_upload_link"
    ],
    "ask": [
      "mcp__pokerdata__get_started"
    ],
    "deny": [
      "mcp__pokerdata__submit_request",
      "mcp__pokerdata__enqueue_solve",
      "mcp__pokerdata__upload_hand_history"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as pokerdata. Review it before you use it.