itad-mcp
Provides access to Epic Games Store pricing, discounts, historical lows, and active deals through the IsThereAnyDeal API.
Provides access to Steam pricing, discounts, historical lows, and active deals through the IsThereAnyDeal API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@itad-mcpCheck if Elden Ring is on sale across any store"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
itad-mcp
An MCP (Model Context Protocol) server that gives AI assistants access to IsThereAnyDeal (ITAD) game prices, discounts, all-time historical lows, and active store sales via official structured IsThereAnyDeal API v3/v1 endpoints.
Query pricing across major digital storefronts (Steam, GOG, Epic Games Store, Humble, Fanatical, GreenManGaming, and more) with batching support and zero payload bloat. For underlying API specifications and rate limits, see the official IsThereAnyDeal API Documentation.
Tools
Tool | Parameters | Description |
|
| Search ITAD by game title query — returns matching games with ITAD UUIDs. |
|
| Lookup ITAD game metadata and internal ITAD UUID using a Steam AppID or game title. |
|
| Get current prices and discounts across digital storefronts for 1 or more ITAD game UUIDs. |
|
| Get all-time historical low prices across digital storefronts for 1 or more ITAD game UUIDs. |
|
| Get top active game sales across digital storefronts filtered by minimum discount percentage. |
Related MCP server: geizhals-mcp
Prerequisites
Node.js v18 or later
An IsThereAnyDeal API Key
Getting an IsThereAnyDeal API Key
Go to isthereanydeal.com/apps
Log in or create a free account
Register your app to generate an API key
Copy your API Key to use in your MCP configuration
Installation & Configuration
Option A — npx (Recommended)
Add the following to your MCP client config file:
{
"mcpServers": {
"itad": {
"command": "npx",
"args": ["-y", "itad-mcp"],
"env": {
"ITAD_API_KEY": "your_itad_api_key_here"
}
}
}
}Option B — Clone and build locally
git clone https://github.com/brandikun/itad-mcp.git
cd itad-mcp
npm install
npm run buildThen add to your MCP config:
{
"mcpServers": {
"itad": {
"command": "node",
"args": ["/path/to/itad-mcp/dist/index.js"],
"env": {
"ITAD_API_KEY": "your_itad_api_key_here"
}
}
}
}MCP Client Config Locations
Client | Config File Location |
Antigravity / AGY |
|
Claude Desktop (macOS) |
|
Claude Desktop (Windows) |
|
Example Usage
Once connected, you can ask your AI assistant questions like:
"Check if Elden Ring is currently on sale across any store"
"What is the all-time historical low price for Cyberpunk 2077?"
"Show me top active PC game deals with at least 60% off"
"Find current prices for all unplayed games in my Steam library"
Performance & Security
Feature | Details |
Batching Support | Query prices & historical lows for up to 50 games in a single API call. |
In-Memory Cache | 30-minute TTL in-memory caching layer protects against rate limits. |
Zero Secrets Policy | API keys are passed strictly via environment variables at runtime. |
License
MIT
Available Tools
5 toolsget_active_dealsA
Get top active game discounts across digital storefronts filtered by minimum discount percentage.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of deals to return (default: 20, max: 50). | |
| country | No | Country code for regional pricing (default: 'US'). | |
| minDiscount | No | Minimum discount percentage (e.g. 50 for 50%+ off). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It states the action and filter but does not disclose whether the operation is read-only, what fields are returned (e.g., title, store, price), how 'top' is sorted, or any pagination/limitations. The vagueness of 'top' and lack of output schema leave behavior undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that captures the core purpose and key filter with no filler. Every word contributes to understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with only three parameters and no output schema, the description provides a solid overview of the tool's purpose and primary filter. However, it could be more complete by explaining how results are sorted, what fields are included in the response, or that it is a read-only operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents limit, country, and minDiscount. The description adds context that minDiscount acts as a filter, but it does not provide substantial new meaning beyond what the schema states, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') with a clear resource ('top active game discounts') and scope ('across digital storefronts'), plus the filtering dimension ('minimum discount percentage'). This distinguishes it from siblings like search_games (search by title) and get_game_prices (prices for a specific game).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a use case: browse currently discounted games across multiple storefronts with a discount threshold. However, it does not explicitly contrast with sibling tools or state when to use this instead of get_game_prices or search_games, so guidance is only implied rather than direct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_game_pricesA
Get current prices and discounts across digital storefronts (Steam, GOG, Epic, Humble, Fanatical, etc.) for one or more ITAD game UUIDs.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ||
| country | No | Country code for regional pricing (default: 'US'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description alone must convey behavioral traits. It discloses the core action (read current prices) and input type, but omits potential caveats like price data refresh latency, behavior for invalid UUIDs, or whether any auth/rate limits apply. It is not misleading, but it leaves some behavioral ambiguity for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, well-constructed sentence that is front-loaded with the action and includes all necessary context (storefronts, input type, multiplicity). No waste or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter query tool with no output schema, the description covers the essential aspects: what it does, which storefronts, and what inputs are expected. It does not explicitly describe return format or error behavior, but the phrase 'current prices and discounts' sufficiently implies the response content. Slightly more detail would push it to the top.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description compensates for the schema's missing description of the 'ids' parameter by stating 'one or more ITAD game UUIDs', which clarifies the string/array union. The 'country' parameter is already well-described in the schema with default 'US'. This adds meaning beyond the schema for the less-documented parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('get') and clearly identifies the resource ('current prices and discounts across digital storefronts') and input type ('ITAD game UUIDs'). It distinguishes itself from siblings like get_historical_low (historical) and get_active_deals (deals) by emphasizing current pricing and multi-storefront coverage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly defines its scope (current prices/discounts across storefronts), giving an agent ample context for when to invoke it. However, it does not explicitly name alternative tools or state when not to use it, falling short of the explicit when/when-not criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_historical_lowA
Get all-time historical low prices across digital storefronts for one or more ITAD game UUIDs.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ||
| country | No | Country code for regional pricing (default: 'US'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions aggregation across storefronts but does not disclose return format, error behavior, authentication requirements, rate limits, or whether any side effects occur. 'Get' implies a read operation, but this is not explicitly stated beyond the description's phrasing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence. It states the action, the object, and the input constraint without unnecessary words, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides the core purpose and main input but lacks details on output structure or how it relates to sibling tools. Given there is no output schema, the description could explain what the response contains (e.g., price, currency, date). It also does not mention optional parameters like 'country' or potential limitations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50% (only 'country' has a direct description). The description clarifies that 'ids' accepts one or more game UUIDs, adding meaning beyond the schema's nested oneOf descriptions. However, 'country' is not mentioned in the description, leaving the schema to fully explain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('all-time historical low prices') with clear scope ('across digital storefronts' for 'ITAD game UUIDs'). It distinguishes itself from sibling tools like get_game_prices and get_active_deals by focusing on historical lows rather than current prices or deals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when historical low prices are needed) but provides no explicit guidance on when not to use it or how it compares to alternatives like get_game_prices. No exclusions or alternative recommendations are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_gameA
Lookup ITAD game metadata and internal ITAD UUID using a Steam AppID or game title.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Game title string. | |
| steamAppId | No | Numeric Steam AppID (e.g. 1091500 for Cyberpunk 2077). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It states the core action ('Lookup') and what is returned (metadata and UUID), but does not disclose additional traits such as return format, error handling, or behavior when both parameters are provided. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that states purpose and key inputs with no redundancy. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple lookup tool with two self-descriptive parameters and no output schema, the description covers the essential information: what it does and how to invoke it. It lacks only explicit disambiguation from search_games, which would elevate it to fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents both parameters fully, including an example for steamAppId. The description adds the crucial semantic that the two parameters are alternative lookup keys ('using a Steam AppID or game title'), which is not explicit in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Lookup' and clearly identifies the resource ('ITAD game metadata and internal ITAD UUID') and the lookup keys ('Steam AppID or game title'). It is easily distinguished from sibling tools like search_games, which implies searching rather than direct lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use this tool when you have a Steam AppID or game title to retrieve metadata/UUID. It does not explicitly mention when not to use it or name alternatives, but the context is unambiguous for a direct-lookup tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_gamesB
Search IsThereAnyDeal (ITAD) for games matching a title query to get their internal ITAD UUIDs.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The game title to search for (e.g. 'Cyberpunk 2077', 'Elden Ring'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavior. It states the function and the output (UUIDs), but doesn't elaborate on specifics like result limits, partial-match behavior, or potential errors. For a read-only search tool, this level of transparency is reasonable but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the core action and outcome. Every word earns its place, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema), the description adequately covers its purpose and output format (UUIDs). While it could mention edge cases or response structure, the low complexity means the description is complete enough for the agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage for the single 'query' parameter with examples. The description adds minimal semantic value beyond referring to it as a 'title query,' so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Search'), a resource ('IsThereAnyDeal'), and the outcome ('get their internal ITAD UUIDs'). It distinguishes itself from siblings like 'lookup_game' by focusing on title-based search rather than direct UUID lookup, though it doesn't explicitly contrast with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you have a game title and need UUIDs, but it provides no explicit context about when to choose this over sibling tools or any exclusions. There's no guidance on prerequisites or workflow, leaving the agent to infer usage based on the name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v1.0.0- First observed
get_active_deals - First observed
get_game_prices - First observed
get_historical_low - First observed
lookup_game - First observed
search_games
TDQS
Scored across 5 tools
Search and lookup have similar purposes, but search is fuzzy matching with multiple results while lookup is precise by AppID or exact title. Price, historical low, and active deals are clearly distinct.
All tools follow a consistent verb_noun pattern: search_games, lookup_game, get_game_prices, get_historical_low, get_active_deals. Minor synonym variations (search vs lookup) are natural and do not break consistency.
Five tools is well-scoped for a game deals server, covering search, metadata lookup, pricing, historical lows, and active deals without unnecessary bloat or missing essentials.
The surface covers the main workflows: finding games, retrieving prices, checking lows, and browsing deals. A price history graph or wishlist feature would be a nice addition, but the core domain is well covered.
Maintenance
Related MCP Connectors
Gamedeals MCP — wraps CheapShark API (game deal aggregator, no auth required)
MCP server aggregating developer infrastructure deals, free tiers, and startup programs
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Price benchmarks, alternatives & daily price history across 17,000+ AI agents and MCP servers.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMCP server that provides tools to search Steam games by keyword, retrieve game details (price, release date, genres), and fetch player reviews with recent ratings.-
- AlicenseNot gradedqualityBmaintenanceAn MCP server that lets an LLM search Geizhals, a leading German/DACH price-comparison site, for the cheapest offers on new products.2MIT
- AlicenseNot gradedqualityCmaintenanceWraps the CheapShark API to enable game deal searches and price comparisons via MCP, no authentication required.5MIT
- AlicenseAqualityBmaintenanceMCP server enabling AI assistants to search Steam games, retrieve official store metadata, and analyze player review sentiment via public Steam Storefront JSON APIs without an API key.311MIT