Skip to main content
Glama

Get prices for many games

get_prices
Read-only

Retrieve current prices and discounts for up to 250 Steam games by appid in a single request, ideal for checking wishlist deals. Marks unavailable titles and returns results in input order.

Instructions

Get current price and discount for a batch of games by appid in one call — efficient for checking a whole list (e.g. a wishlist) for deals. Handles up to 250 appids; if you also need review %, hardware compatibility or tags, use get_items instead (max 50 appids). Rows come back in the same order as the given appids, one per id (unavailable ones marked available:false — no such appid, not sold in that country, or a transient upstream failure on the chunk it fell in, so retry before concluding a game is unavailable — never dropped). A priced row carries final/initial price and discount_percent. A row marked priced:false has no price block at all, which is how BOTH free-to-play and not-yet-released titles come back: this endpoint cannot tell them apart, so never report priced:false as 'free' — pass those appids to get_items, whose is_free/coming_soon do separate them. No API key required. Get appids from search_games or get_wishlist.

Input Schema

NameRequiredDescriptionDefault
appidsYesSteam appids to price (1-250). Split a longer list across calls.
countryNoCountry (cc) for prices/currency and regional availability; overrides STEAM_COUNTRY for this call. Must be a real Steam store region — the two-letter shape is all that's checked here, and Steam answers an unrecognized code with US prices rather than an error, so a typo returns plausible numbers for the wrong country.

Output Schema

NameRequiredDescriptionDefault
countYes
pricesYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv0.14.0
    • changedInput schema / properties / country / description
      Previous value: -"Country (cc) for prices/currency; overrides STEAM_COUNTRY for this call."New value: +"Country (cc) for prices/currency and regional availability; overrides STEAM_COUNTRY for this call. Must be a real Steam store region — the two-letter shape is all that's checked here, and Steam answers an unrecognized code with US prices rather than an error, so a typo returns plausible numbers for the wrong country."
    • changedOutput schema / properties / prices / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "appid": {
      -        "type": "number"
      -      },
      -      "available": {
      -        "const": false,
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "appid",
      -      "available"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "appid": {
      -        "type": "number"
      -      },
      -      "available": {
      -        "const": true,
      -        "type": "boolean"
      -      },
      -      "is_free": {
      -        "const": true,
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "appid",
      -      "available",
      -      "is_free"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "appid": {
      -        "type": "number"
      -      },
      -      "available": {
      -        "const": true,
      -        "type": "boolean"
      -      },
      -      "currency": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "discount_percent": {
      -        "type": "number"
      -      },
      -      "final": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "initial": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "is_free": {
      -        "const": false,
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "currency",
      -      "final",
      -      "initial",
      -      "discount_percent",
      -      "appid",
      -      "available",
      -      "is_free"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "No usable store entry came back for this appid: it doesn't exist, it isn't sold in the requested country (try another `country`), or the batch chunk it fell in failed transiently — this tool chunks large lists, so a retry can turn these rows into prices. Same row shape as get_items' available:false.",
      +    "properties": {
      +      "appid": {
      +        "type": "number"
      +      },
      +      "available": {
      +        "const": false,
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "appid",
      +      "available"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Steam returned no price block for this appid. That is how a free-to-play title AND a not-yet-released or not-purchasable one both come back, and this endpoint cannot tell them apart — so this is NOT a claim that the game is free. Call get_items on the appid (its `is_free` and `coming_soon` separate the two) before reporting anything as free.",
      +    "properties": {
      +      "appid": {
      +        "type": "number"
      +      },
      +      "available": {
      +        "const": true,
      +        "type": "boolean"
      +      },
      +      "priced": {
      +        "const": false,
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "appid",
      +      "available",
      +      "priced"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "appid": {
      +        "type": "number"
      +      },
      +      "available": {
      +        "const": true,
      +        "type": "boolean"
      +      },
      +      "currency": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "discount_percent": {
      +        "type": "number"
      +      },
      +      "final": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "initial": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "is_free": {
      +        "const": false,
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "currency",
      +      "final",
      +      "initial",
      +      "discount_percent",
      +      "appid",
      +      "available",
      +      "is_free"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed2 schema fields changedv0.13.1
    • changedInput schema / properties / appids / description
      Previous value: -"Steam appids to price (1-500)."New value: +"Steam appids to price (1-250). Split a longer list across calls."
    • changedInput schema / properties / appids / maxItems
      Previous value: -500New value: +250
  3. Changed1 schema field changedv0.12.1
    • addedInput schema / additionalProperties
      Added value: +false
  4. Addedv0.10.4
  5. Removedv0.10.4
  6. Addedv0.10.2
  7. Removedv0.9.0
  8. First observedv0.1.0

TDQS

A4.7/5.0
Behavior5/5

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

Even though annotations already declare readOnlyHint and openWorldHint, the description adds substantial behavioral context: rows preserve input order, unavailable rows are marked available:false, transient upstream failures should be retried, and priced:false does not mean free. It also warns that the endpoint cannot distinguish free-to-play from not-yet-released titles. This goes well beyond the annotations and prevents serious misinterpretation.

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?

The description is long but every sentence carries necessary operational information, and the structure is logical: purpose, capacity/alternative, row ordering and failure semantics, priced:false ambiguity, auth, and source of appids. The most important caveats are front-loaded and there is no filler or redundancy.

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

Completeness5/5

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

Given the tool's tricky edge cases, the description is complete: it covers batching limits, ordering, unavailable rows, retry behavior, the free-to-play/not-yet-released ambiguity, and how to resolve it via get_items. An output schema exists, so return-value details are already structured, and the description adds the semantic context an agent needs to use the results correctly.

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 already fully documents appids and country, including the 250 limit, splitting longer lists, country code format, and the typo-to-US-prices behavior. The description reinforces the batch size and mentions country in the availability caveat, but it does not add new parameter-level meaning beyond the schema. Baseline 3 is appropriate.

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?

The description opens with a specific verb and resource: 'Get current price and discount for a batch of games by appid in one call.' It clearly distinguishes this from siblings by naming get_items as the alternative for review %, hardware compatibility, or tags. An agent can immediately tell what this tool does and how it differs from nearby tools.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: efficient for checking a whole list like a wishlist, handles up to 250 appids, and directs to get_items when other metadata is needed. It also tells the agent to pass priced:false appids to get_items when free-to-play vs. not-yet-released must be distinguished. This is model guidance with clear alternatives.

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