Skip to main content
Glama

Compare two strategies

compare_strategies
Read-onlyIdempotent

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
anteBbNoRequested ante in bb. nlmtt8 models a 1bb BB-ante; other positive antes return unsupported coverage.
domainYesPreflop contexts use game/stack/history/hand. Postflop contexts use pack/board/path/combo.
formatNoRequested poker format. "cash" uses the cash trees. "mtt" is supported only for preflop chip-EV against game nlmtt8; ICM, PKO, and satellite remain unsupported.
baselineYesThe context deltas are measured from. One side of the comparison. Preflop contexts use game, stack, history and optional hand; postflop contexts use pack, board, path and optional combo.
objectiveNoRequested optimization objective. chip_ev is supported for nlmtt8 preflop. ICM, PKO, and satellite return unsupported coverage.
comboLimitNoMaximum largest-changing combos for aggregate postflop comparisons (default 12, maximum 50)
comparisonYesThe context deltas are measured to. One side of the comparison. Preflop contexts use game, stack, history and optional hand; postflop contexts use pack, board, path and optional combo.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultNoBoth snapshots, the per-action frequency and EV deltas, and the largest combo changes for postflop comparisons. Null when the request is unsupported.
contextNoCanonical context the answer belongs to (variant, format, stacks, positions, board, path). Null when the request is unsupported.
coverageNoWhether the request was answered exactly, aggregated, or refused as out of coverage.
warningsNoCaveats that must survive into any answer built on this result.
schemaVersionNoEnvelope version, currently "1.0".

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed15 schema fields changed
    • addedInput schema / properties / baseline / description
      Added value: +"The context deltas are measured from. One side of the comparison. Preflop contexts use game, stack, history and optional hand; postflop contexts use pack, board, path and optional combo."
    • addedInput schema / properties / baseline / properties / board / description
      Added value: +"Postflop only. Board in spaced form, e.g. \"3h 3d 2s\"."
    • addedInput schema / properties / baseline / properties / combo / description
      Added value: +"Postflop only. Exact two-card combo, e.g. As5s. Provide it in both contexts or neither."
    • addedInput schema / properties / baseline / properties / game / description
      Added value: +"Preflop only. Both sides must name the same game."
    • addedInput schema / properties / baseline / properties / hand / description
      Added value: +"Preflop only. One hand or class, e.g. AKs. Provide it in both contexts or neither; PLO comparisons require it."
    • addedInput schema / properties / baseline / properties / history / description
      Added value: +"Preflop only. Action path ending in the position about to act, e.g. \"UTG_60%_HJ\"."
    • addedInput schema / properties / baseline / properties / stack / description
      Added value: +"Preflop only. Stack depth in big blinds."
    • addedInput schema / properties / comparison / description
      Added value: +"The context deltas are measured to. One side of the comparison. Preflop contexts use game, stack, history and optional hand; postflop contexts use pack, board, path and optional combo."
    • addedInput schema / properties / comparison / properties / board / description
      Added value: +"Postflop only. Board in spaced form, e.g. \"3h 3d 2s\"."
    • addedInput schema / properties / comparison / properties / combo / description
      Added value: +"Postflop only. Exact two-card combo, e.g. As5s. Provide it in both contexts or neither."
    • addedInput schema / properties / comparison / properties / game / description
      Added value: +"Preflop only. Both sides must name the same game."
    • addedInput schema / properties / comparison / properties / hand / description
      Added value: +"Preflop only. One hand or class, e.g. AKs. Provide it in both contexts or neither; PLO comparisons require it."
    • addedInput schema / properties / comparison / properties / history / description
      Added value: +"Preflop only. Action path ending in the position about to act, e.g. \"UTG_60%_HJ\"."
    • addedInput schema / properties / comparison / properties / stack / description
      Added value: +"Preflop only. Stack depth in big blinds."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "description": "Coverage-first envelope: coverage and context describe the answer, result carries it.",
      +  "properties": {
      +    "context": {
      +      "description": "Canonical context the answer belongs to (variant, format, stacks, positions, board, path). Null when the request is unsupported.",
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "coverage": {
      +      "description": "Whether the request was answered exactly, aggregated, or refused as out of coverage.",
      +      "properties": {
      +        "analyzedBoards": {
      +          "description": "Boards actually read at the requested path.",
      +          "type": "integer"
      +        },
      +        "available": {
      +          "description": "What is published instead.",
      +          "type": "string"
      +        },
      +        "dataClass": {
      +          "description": "\"solver\", \"solver_aggregate\", or \"solver_comparison\".",
      +          "type": "string"
      +        },
      +        "generatedAt": {
      +          "description": "When the pack was generated.",
      +          "type": "string"
      +        },
      +        "hasEv": {
      +          "description": "Whether the pack ships per-combo EV.",
      +          "type": "boolean"
      +        },
      +        "matchingBoards": {
      +          "description": "Boards matching the texture filters.",
      +          "type": "integer"
      +        },
      +        "objective": {
      +          "description": "\"solver_ev\", \"cash_game_ev\", or \"chip_ev\".",
      +          "type": "string"
      +        },
      +        "omittedByLimit": {
      +          "description": "Matching boards dropped by boardLimit.",
      +          "type": "integer"
      +        },
      +        "reason": {
      +          "description": "Why the request is out of coverage.",
      +          "type": "string"
      +        },
      +        "requested": {
      +          "description": "The format, objective, ante, or pack that was asked for.",
      +          "type": "object"
      +        },
      +        "solveQuality": {
      +          "description": "Published exploitability and iteration counts. Omitted, never estimated, when the pack does not publish them.",
      +          "type": "object"
      +        },
      +        "source": {
      +          "description": "Pack, board, path, generation time, and solve quality.",
      +          "type": "object"
      +        },
      +        "status": {
      +          "description": "\"exact\", \"aggregated_report\", or \"unsupported\". Treat \"unsupported\" as a hard stop.",
      +          "type": "string"
      +        },
      +        "unavailableAtPath": {
      +          "description": "Selected boards with no node at the path.",
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "result": {
      +      "description": "Both snapshots, the per-action frequency and EV deltas, and the largest combo changes for postflop comparisons. Null when the request is unsupported.",
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "schemaVersion": {
      +      "description": "Envelope version, currently \"1.0\".",
      +      "type": "string"
      +    },
      +    "warnings": {
      +      "description": "Caveats that must survive into any answer built on this result.",
      +      "items": {
      +        "description": "One caveat about how the result may be used.",
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
  2. First observed

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower. The description still adds genuinely useful behavior: the server performs both fetches internally and returns deltas plus largest combo changes, sidestepping two large node payloads. It does not mention limits or failure modes, keeping it short of a 5.

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

Conciseness5/5

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

Two sentences, no filler, and the core value proposition (preferred tool, what it returns, why it is cheaper) is front-loaded. Every clause earns its place.

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 annotations covering the safety profile and a full output schema, the description does not need to enumerate return fields, yet it usefully summarizes them. Combined with 100% schema coverage and nested contexts documented in the schema, an agent has what it needs; only the internal limits (e.g. comboLimit capping) are left to the schema.

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 description coverage is 100%, so the schema carries baseline semantics, including nested baseline/comparison contexts, comboLimit defaults, and enum constraints. The description adds no parameter-level detail beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource: computing differences between two preflop or postflop contexts, with a concrete return (action-frequency/EV deltas plus largest postflop combo changes). This clearly separates it from single-node siblings like get_node and get_postflop_node without needing to open their schemas.

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

Usage Guidelines4/5

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

Explicitly labels itself the 'Preferred tool for differences between two ... contexts' and implies the alternative (fetching both nodes separately) by noting it avoids 'two large node payloads.' No hard exclusions or prerequisites are stated, but the usage context is clear.

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