Skip to main content
Glama

Get postflop solver node

get_postflop_node
Read-onlyIdempotent

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
packYesPack id from list_postflop_packs. Use a sizingTrees packId to pick the tree: the pack id for 75% pot on the flop, or "<pack>-flop33" for 33%.
pathNoSegments from the root, e.g. ["Check", "Bet 5.5"]. Empty for the root node.
boardYesBoard in spaced form, e.g. "3h 3d 2s"
comboNoOptional exact combo, e.g. AsKh (PLO5: five cards, as listed in the node's hands)
limitNoMaximum representative compact combos (default 40, maximum 200)
detailNoResponse detail. "compact" is the default and removes bulk maps; use "full" only when exact complete data is required.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
hintNoHow to narrow, page, or widen the same query.
nodeNoFull detail: the stored node. Null at a chance point, where runouts hang directly under the path.
pathNoSegments walked from the root to this node.
boardNoBoard at this node.
comboNoThe requested combo, when one was asked for.
handsNoCompact rows in `columns` order, or the full per-combo strategy objects in full detail.
potBbNoPot at this node in big blinds.
reachNoFull detail: the acting player's per-combo reach.
actionsNoActions at the node with their reach-weighted frequency.
columnsNoColumn order for `hands`: combo, reach, frequencies, evBb, evLossBb, actionEvBb.
summaryNoWhat the compact range left out, so nothing looks complete when it is sampled.
actionFreqsNoFull detail: aggregate frequency per action.
actingPlayerNo0 for out of position, 1 for in position.
childSegmentsNoAppend one of these to `path` to walk deeper.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "description": "One postflop solver node: the acting player's strategy and the legal next segments.",
      +  "properties": {
      +    "actingPlayer": {
      +      "description": "0 for out of position, 1 for in position.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "actionFreqs": {
      +      "description": "Full detail: aggregate frequency per action.",
      +      "items": {
      +        "description": "Reach-weighted frequency for the action at this index.",
      +        "type": "number"
      +      },
      +      "type": "array"
      +    },
      +    "actions": {
      +      "description": "Actions at the node with their reach-weighted frequency.",
      +      "items": {
      +        "description": "One action available at a postflop node.",
      +        "properties": {
      +          "action": {
      +            "description": "Action segment including its size, e.g. \"Bet 5.5\".",
      +            "type": "string"
      +          },
      +          "actionType": {
      +            "description": "Action label without the size.",
      +            "type": "string"
      +          },
      +          "addBb": {
      +            "description": "Chips this action adds, in big blinds.",
      +            "type": "number"
      +          },
      +          "comparisonKey": {
      +            "description": "Size-normalised action key used to line two nodes up, e.g. \"Bet 75% pot\".",
      +            "type": "string"
      +          },
      +          "evBb": {
      +            "description": "Action EV in big blinds where the pack publishes it.",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "evLossBb": {
      +            "description": "EV given up against the best action, in big blinds.",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "frequency": {
      +            "description": "Reach-weighted frequency from 0 to 1.",
      +            "type": "number"
      +          },
      +          "label": {
      +            "description": "Action label, e.g. \"Check\", \"Bet\", \"Call\".",
      +            "type": "string"
      +          },
      +          "sizePotPct": {
      +            "description": "Bet size as a percent of the pot, bets only.",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "board": {
      +      "anyOf": [
      +        {
      +          "description": "Board in spaced form.",
      +          "type": "string"
      +        },
      +        {
      +          "description": "Cards visible at this node.",
      +          "items": {
      +            "description": "One card.",
      +            "type": "string"
      +          },
      +          "type": "array"
      +        }
      +      ],
      +      "description": "Board at this node."
      +    },
      +    "childSegments": {
      +      "description": "Append one of these to `path` to walk deeper.",
      +      "items": {
      +        "description": "An action like \"Bet 5.5\" or a runout like \"deal:7c\".",
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "columns": {
      +      "description": "Column order for `hands`: combo, reach, frequencies, evBb, evLossBb, actionEvBb.",
      +      "items": {
      +        "description": "Column name.",
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "combo": {
      +      "description": "The requested combo, when one was asked for.",
      +      "type": "string"
      +    },
      +    "hands": {
      +      "description": "Compact rows in `columns` order, or the full per-combo strategy objects in full detail.",
      +      "items": {
      +        "anyOf": [
      +          {
      +            "description": "One compact row.",
      +            "type": "array"
      +          },
      +          {
      +            "description": "One combo's stored strategy.",
      +            "type": "object"
      +          }
      +        ]
      +      },
      +      "type": "array"
      +    },
      +    "hint": {
      +      "description": "How to narrow, page, or widen the same query.",
      +      "type": "string"
      +    },
      +    "node": {
      +      "description": "Full detail: the stored node. Null at a chance point, where runouts hang directly under the path.",
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "path": {
      +      "description": "Segments walked from the root to this node.",
      +      "items": {
      +        "description": "One segment from the root.",
      +        "type": "string"
      +      },
      +      "type": [
      +        "array",
      +        "null"
      +      ]
      +    },
      +    "potBb": {
      +      "description": "Pot at this node in big blinds.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "reach": {
      +      "description": "Full detail: the acting player's per-combo reach.",
      +      "items": {
      +        "description": "A combo and its reach weight.",
      +        "type": "array"
      +      },
      +      "type": "array"
      +    },
      +    "summary": {
      +      "description": "What the compact range left out, so nothing looks complete when it is sampled.",
      +      "properties": {
      +        "classes": {
      +          "description": "Postflop: hand classes with reach at the node.",
      +          "type": "integer"
      +        },
      +        "matchingHands": {
      +          "description": "plo5: classes that take the action before the cut.",
      +          "type": "integer"
      +        },
      +        "minFreq": {
      +          "description": "plo5: the frequency floor applied.",
      +          "type": "number"
      +        },
      +        "mixedHands": {
      +          "description": "Classes strictly between 0.005 and 0.995.",
      +          "type": "integer"
      +        },
      +        "mixedInReturned": {
      +          "description": "plo5: mixed classes among the returned rows.",
      +          "type": "integer"
      +        },
      +        "nonzeroHands": {
      +          "description": "Hand classes with a frequency above 0.",
      +          "type": "integer"
      +        },
      +        "omitted": {
      +          "description": "Rows dropped by the compact cut.",
      +          "type": "integer"
      +        },
      +        "pureHands": {
      +          "description": "Classes at frequency 0.995 or higher.",
      +          "type": "integer"
      +        },
      +        "pureInReturned": {
      +          "description": "plo5: pure classes among the returned rows.",
      +          "type": "integer"
      +        },
      +        "returned": {
      +          "description": "Rows in this response.",
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  2. First observed

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds real behavioral context beyond that: the node is reachable/expandable via path+childSegment, and the default compact detail 'removes bulk maps' while 'full' is reserved for exact complete data — useful trade-off disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with no filler, front-loading what the node returns before the traversal instruction. It is efficient, though poker-domain jargon ('childSegment', 'reach-weighted action split') keeps it slightly heavy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't explain return values, and annotations plus 100% schema coverage carry most of the structured load. It covers content, traversal and detail trade-offs; the only real gap is not routing the agent away from the superficially similar get_node sibling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all six parameters including pack, path, board, combo, limit and the detail enum are already documented in the schema. The description reinforces how path works (appending a childSegment) but adds little per-parameter meaning beyond what the schema provides; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (get a postflop solver node) and enumerates exactly what one node contains: per-hand-class strategy, legal next segments, board, reach and reach-weighted action split. The 'postflop' qualifier separates it from generic siblings, but it never distinguishes itself from the sibling get_node, which is the one an agent could easily confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence explains the traversal pattern — append a returned childSegment to `path` to go deeper — which is genuinely useful usage guidance. However, it gives no explicit when-to-use/when-not guidance against alternatives like get_node, get_postflop_range, or get_hand_results, leaving the agent to infer the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources