Skip to main content
Glama

Get preflop range

get_range
Read-onlyIdempotent

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

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
gameYes"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.
handNoOptional hand/class, e.g. AKs or (KA)(KA)
spotYesAction path ending in an action
limitNoMaximum compact rows to return (default 120, maximum 500).
stackYesStack depth in big blinds, e.g. 100
detailNoResponse detail. "compact" is the default and removes bulk maps; use "full" only when exact complete data is required.
minFreqNoDrop hands at or below this weight (PLO ranges are large)

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
evNoFull detail: EV of the requested hand in small blinds.
evsNoHand class to EV, only where the solved bundle scored the hand.
evSbNoEV of the requested hand in small blinds.
freqNoFull detail: frequency of the requested hand.
gameNoPreflop game id, e.g. "nl" or "nlmtt8".
handNoThe requested hand, when one was asked for.
hintNoHow to narrow, page, or widen the same query.
kindNoplo5: the action family.
spotNoAction path ending in an action, echoed from the request.
actorNoPosition to act at this node.
handsNoHand classes in the range.
rangeNoCompact rows in `columns` order.
stackNoStack depth in big blinds.
actionNoplo5: the action the range belongs to.
combosNoCombos in the range.
columnsNoColumn order for `range`: hand, frequency, evSb.
historyNoAction path ending in the acting position.
summaryNoWhat the compact range left out, so nothing looks complete when it is sampled.
versionNoDataset version where the bundle publishes one.
weightsNoHand class to frequency. An omitted class has weight 0.
frequencyNoFrequency of the requested hand, 0 to 1.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "description": "One action's range: hand-class frequencies, and EV where the bundle scored it.",
      +  "properties": {
      +    "action": {
      +      "description": "plo5: the action the range belongs to.",
      +      "type": "string"
      +    },
      +    "actor": {
      +      "description": "Position to act at this node.",
      +      "type": "string"
      +    },
      +    "columns": {
      +      "description": "Column order for `range`: hand, frequency, evSb.",
      +      "items": {
      +        "description": "Column name.",
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "combos": {
      +      "description": "Combos in the range.",
      +      "type": "number"
      +    },
      +    "ev": {
      +      "description": "Full detail: EV of the requested hand in small blinds.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "evSb": {
      +      "description": "EV of the requested hand in small blinds.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "evs": {
      +      "additionalProperties": {
      +        "description": "EV in small blinds relative to folding.",
      +        "type": "number"
      +      },
      +      "description": "Hand class to EV, only where the solved bundle scored the hand.",
      +      "type": "object"
      +    },
      +    "freq": {
      +      "description": "Full detail: frequency of the requested hand.",
      +      "type": "number"
      +    },
      +    "frequency": {
      +      "description": "Frequency of the requested hand, 0 to 1.",
      +      "type": "number"
      +    },
      +    "game": {
      +      "description": "Preflop game id, e.g. \"nl\" or \"nlmtt8\".",
      +      "type": "string"
      +    },
      +    "hand": {
      +      "description": "The requested hand, when one was asked for.",
      +      "type": "string"
      +    },
      +    "hands": {
      +      "description": "Hand classes in the range.",
      +      "type": "number"
      +    },
      +    "hint": {
      +      "description": "How to narrow, page, or widen the same query.",
      +      "type": "string"
      +    },
      +    "history": {
      +      "description": "Action path ending in the acting position.",
      +      "type": "string"
      +    },
      +    "kind": {
      +      "description": "plo5: the action family.",
      +      "type": "string"
      +    },
      +    "range": {
      +      "description": "Compact rows in `columns` order.",
      +      "items": {
      +        "description": "One row: hand, frequency, EV in small blinds or null.",
      +        "type": "array"
      +      },
      +      "type": "array"
      +    },
      +    "spot": {
      +      "description": "Action path ending in an action, echoed from the request.",
      +      "type": "string"
      +    },
      +    "stack": {
      +      "description": "Stack depth in big blinds.",
      +      "type": "number"
      +    },
      +    "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"
      +    },
      +    "version": {
      +      "description": "Dataset version where the bundle publishes one.",
      +      "type": "number"
      +    },
      +    "weights": {
      +      "additionalProperties": {
      +        "description": "Action frequency from 0 to 1.",
      +        "type": "number"
      +      },
      +      "description": "Hand class to frequency. An omitted class has weight 0.",
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  2. First observed

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare this a safe, idempotent read, so the bar is lower; the description still adds meaningful behavior: compact is the default response shape, PLO collapses to representative pure/mixed hands, and plo5 truncates to the top hands by EV with stated limits. It does not mention rate limits or pagination beyond the limit note, but the modality differences across game families are genuinely useful 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?

Front-loaded with purpose in the first sentence, then examples and mode notes; nearly every clause carries information. It is dense and slightly run-on in the example-heavy middle, but no sentence is filler.

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?

An output schema exists, so return values need not be described; the description instead covers the inputs that matter (spot token grammar, game family quirks, detail modes, hand drill-down). The main residual gap is the absence of routing guidance to sibling range tools, which is a usage rather than a completeness issue.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description compensates for the schema's thin "Action path ending in an action" by giving concrete spot strings per game family ("UTG_60%_HJ_Call", "UTG_Open", "UTG_Open_HJ_3B") and explaining what `hand` yields. That is real added meaning for the least self-evident parameter.

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 ("The GTO range for one spot") and enumerates the supported game formats, so the agent knows exactly what comes back. It never names a sibling such as get_postflop_range or get_range_metadata to sharpen the boundary, but the title/description pairing makes the preflop scope unambiguous.

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?

Gives real usage signals: add `hand` when you want a single frequency and EV, only use `detail: full` "when exact complete data is required," and PLO returns representative hands unless a hand is named. It stops short of comparing itself to alternatives (get_postflop_range, get_node, compare_strategies), so the agent must infer which tool to pick.

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