gameswarp-mcp
This server lets an AI agent investigate Steam games through player reviews, rating history, patch notes, and gaming press articles.
search_games: Resolve a game name (prefix-matched, Russian supported) to a Steam appid.
get_review_timeline: Get monthly positive/negative counts for the game's full history, plus daily data for the last 30 days, to spot rating shifts.
get_game_news: Fetch patch notes and press items by date, to correlate releases with rating changes.
get_reviews: Pull player reviews filtered by date, sentiment, and minimum playtime, with clear errors for windows that are too old to reach.
search_articles: Full-text search over collected gaming press articles, covering industry-wide coverage beyond just Steam.
Provides tools for investigating Steam games: searching games by name, retrieving review sentiment timelines, patch notes and news, and reading player reviews filtered by time, sentiment, and playtime.
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., "@gameswarp-mcpInvestigate why No Man's Sky's rating dropped in October 2022."
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.
gameswarp-mcp
An MCP server that lets a model investigate Steam games through what players actually write — reviews, rating history, patch notes and gaming press.
A Steam rating tells you 84% of people liked a game. It does not tell you what broke in October, whether it was fixed, or what the players with 300 hours think that the ones with 20 minutes do not. That information exists; it is just buried in a hundred thousand reviews.
Install
claude mcp add gameswarp -- npx -y gameswarp-mcpOr, for any MCP client, run npx -y gameswarp-mcp over stdio.
search_articles additionally needs a Postgres database with collected press
articles; the other four tools work against Steam directly with no setup.
Related MCP server: Steam Reviews MCP
Tools
Tool | What it answers |
| Name to appid. Prefix matching; Russian titles when asked in Russian |
| Monthly positive share for the whole life of a game, plus the last 30 days |
| Patch notes with dates, and press Steam syndicates |
| Reviews filtered by window, sentiment and hours played at the time of writing |
| Full-text search over collected gaming press |
A typical investigation runs get_review_timeline to find when a rating moved,
get_game_news to find the patch released around that date, then get_reviews
for the same window to read what players said.
Two constraints worth knowing
Reviews cannot be read for an arbitrary past window. Steam offers no way to
jump to a date — day_range silently ignores anything beyond about a year — so
the only route back is walking newer reviews first. Reaching October 2022 for No
Man's Sky means roughly 1,300 requests. get_reviews therefore works on recent
windows and fails with a clear message rather than burning minutes to return
nothing. Use get_review_timeline for old history: it is cheap and complete.
Steam is unforthcoming about its rate limits but does enforce them. Requests are paced, retried with a growing backoff, and cached on disk. 4xx is never retried: a 403 means the appid does not exist.
Selecting reviews
A popular game runs over 90% positive, so a naive sample answers "what do people
complain about?" with nothing to complain about. get_reviews scans far more
reviews than it returns whenever a filter is selective, and reports how many it
scanned when nothing matches, so the caller can tell an empty window from an
unlucky sample.
Every review carries the hours its author had played at the moment of writing.
A review with 300 hours behind it and one with 15 minutes are different kinds of
evidence, and min_playtime_hours exists to separate them.
Collecting articles
npm run tick applies migrations, polls every source and resolves new game names.
Every step is idempotent, so running it repeatedly is safe and cheap: sources that
have not changed answer 304 with no body, and only names never seen before cost a
Steam lookup.
It runs hourly on GitHub Actions against a hosted database. Hourly is not arbitrary - the tightest feed holds about five hours of articles, and anything slower loses items permanently.
Set DATABASE_URL as a repository secret to enable it. The hosted database holds
the feed, games, links and finished analyses; raw reviews and full patch notes
stay local, where they are fetched on demand and cached to disk, because they are
three orders of magnitude larger.
Which model answers
Nothing above src/model names a provider; the environment decides, and the
split is deliberate:
Provider | Why | |
Scheduled work | hosted, OpenAI-compatible | a scheduled job cannot reach a laptop, and a laptop should not be the compute for background work |
Evals and iteration | local, through Ollama | dozens of runs in a row would exhaust a free tier's daily budget in one sitting |
See .env.example. Adding another vendor is a file beside src/model/ollama.ts
and a case in the factory; nothing else changes.
Development
npm install
npm run dev # tsc --watch
npm test # unit tests, offline
npm run inspect # build and open the MCP Inspector
npm run acceptance # end-to-end over stdio, needs network and the database
node scripts/build-dataset.mjs # rebuild the eval dataset from Steam
node scripts/run-eval.mjs # run it; resumes where it stopped
node scripts/run-eval.mjs '' --fresh # start over instead of resuming
docker compose up -d && npm run db:migrateSee ARCHITECTURE.md for how the pieces fit together and API-NOTES.md for hand-verified Steam endpoints, including a few that every tutorial still gets wrong.
License
MIT
Available Tools
5 toolsget_game_newsPatch notes and pressB
News Steam holds for a game. Developer announcements are the patch notes, and they carry dates - use them to find which patch landed near a rating change. Press items are third-party articles Steam syndicates.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| appid | Yes | ||
| limit | No | ||
| since | No | ISO date; only items published after it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It explains that patch notes carry dates and can be used to correlate with rating changes, and that press items are third-party articles. However, it doesn't disclose potential limitations like pagination, rate limits, or whether 'all' kind returns both types in a specific order. The description adds some behavioral context but not comprehensive.
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 two sentences, front-loading the core purpose and then adding useful detail about the two content types. Every sentence earns its place, and the structure is clear. It could be slightly more concise, but it's efficient and readable.
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 has 4 parameters, no output schema, and no annotations, the description provides moderate context. It explains the two kinds of news and their use case, but doesn't cover return format, pagination, or how 'all' behaves. For a news-fetching tool, an agent might need more detail on output structure, but the description covers the essential purpose and filtering logic.
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 only 25% (only 'since' has a description). The tool description explains the meaning of 'kind' by distinguishing patches and press, which adds value beyond the enum values. However, it doesn't clarify 'appid' or 'limit' semantics beyond what the schema provides. The description partially compensates for the low coverage but leaves gaps.
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 the tool retrieves Steam news for a game, distinguishing developer announcements (patch notes) from press articles. It names the resource (game news) and the two content types, which helps an agent understand the tool's purpose. However, it doesn't explicitly differentiate from sibling tools like search_articles, though the distinction between game-specific news and general articles is implied.
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 context on when to use the tool: to find patch notes near a rating change or to access press items. It implies the tool is for game-specific news, which differentiates it from search_articles, but it doesn't explicitly state when not to use it or name alternatives. The guidance is useful but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reviewsPlayer reviewsA
Reviews for a game, optionally limited to a date window, sentiment, or players with real time in the game. Only recent windows can be read: Steam offers no way to jump to an old date, so anything more than a few months back fails with a clear message. Use get_review_timeline for old history instead.
| Name | Required | Description | Default |
|---|---|---|---|
| appid | Yes | ||
| limit | No | ||
| since | No | ISO date, start of the window | |
| until | No | ISO date, end of the window | |
| voted_up | No | true for positive only, false for negative | |
| min_playtime_hours | No | Drop reviews by players with less time than this at the moment of writing |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and it discloses a non-obvious limitation: old dates are not accessible and fail with a clear message. It does not describe return shape or ordering, but for a read-only reviews tool the key behavioral caveat is covered.
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?
Three sentences with the main purpose first, followed by the critical limitation and the alternative. Every sentence adds information and there is no 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?
The description, combined with a schema that documents most parameters, gives an agent enough to call the tool correctly: required appid, optional filters, and the historical limitation. A return-format note would be a nice addition, but the tool name and title make the output self-evident.
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 coverage is 67%, and the description adds conceptual meaning by grouping filters into 'date window', 'sentiment', and 'players with real time', mapping to since/until, voted_up, and min_playtime_hours. It does not discuss limit, but the schema and tool context make it self-explanatory.
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 states the resource ('Reviews for a game') and the three optional filter dimensions (date window, sentiment, player time) with a clear verb implied by the tool name. It also names get_review_timeline as a different tool, so it is easy to distinguish from siblings.
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?
It explicitly says only recent windows can be read and gives a direct routing rule: use get_review_timeline for old history. This tells the agent when to call this tool and when not to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_review_timelineRating over timeA
Monthly positive and negative review counts for the whole life of a game, plus the last 30 days daily. This is how you find when a rating moved. It is cheap and covers all history, unlike get_reviews.
| Name | Required | Description | Default |
|---|---|---|---|
| appid | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the burden. It discloses output granularity, time range, full-history coverage, and relative cost, which is substantial. It does not mention auth, rate limits, or exact response structure, but for a simple read-only aggregation tool this is reasonable.
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?
Two tightly packed sentences: the first states what the tool returns, the second explains why it is the right choice. No filler or repeated schema information.
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?
With one simple integer parameter and no output schema, the description gives enough about the returned data and the tool's advantages to guide correct use. It omits explicit appid guidance and response encoding details, but those are minor for this tool.
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 0% and the description never mentions appid or explains how to supply it. The only connection is 'for a game', which weakly implies the appid parameter. The parameter name is self-explanatory, but the description adds no real semantic value beyond 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 names a specific resource (review timeline for a game) and the exact data returned (monthly positive/negative counts, daily last-30-days). It also distinguishes itself from get_reviews, so an agent can tell which tool to pick.
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?
It explicitly says this is the way to find when a rating moved and contrasts itself with get_reviews by noting it is cheap and covers all history. It does not fully spell out the opposite case ('use get_reviews when you need individual review content'), but the comparison gives clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_articlesSearch collected pressB
Full-text search over gaming press articles collected from outlet feeds. Unlike the Steam tools this covers the industry generally, so it answers what is being written about a game or a topic right now.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| since_days | No | Only articles this recent |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations at all, so the description carries the full burden of behavioral disclosure. It explains the data source and that the search is over collected press articles, but it does not disclose what the tool returns, how results are ordered, whether results are paginated, or what 'collected from outlet feeds' means in terms of recency or coverage. The phrase 'right now' hints at freshness but does not define it.
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 two sentences with no filler. The first sentence front-loads the core action and resource, and the second sentence adds a scope distinction that helps differentiate this tool. Every clause 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?
The tool has 3 parameters, no annotations, low schema coverage, and no output schema, so the description needs to do substantial explanatory work to be complete. It explains the search domain but never mentions what the agent will receive (the result shape), how to control result volume (limit), or how to anchor the recency of the search (since_days). As a result, an agent has to guess or rely on external knowledge to call the tool optimally.
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 only 33% (only since_days has a description), so the description must compensate for the undocumented parameters. The description conveys that the search is full-text and about games or topics, which gives some semantic meaning to the query parameter, but it says nothing about limit or since_days and does not help an agent decide how to set them.
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 states a specific verb and resource: full-text search over gaming press articles collected from outlet feeds. It also gives the important scope cue that it covers the industry generally rather than Steam-specific data. It does not name sibling tools explicitly, and the phrase 'Steam tools' only vaguely differentiates it from siblings like get_game_news or search_games.
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 gives clear context for when this is useful—the industry press generally as opposed to Steam tools—and explains that it answers what is being written about a game or topic right now. However, it never names sibling tools or explicitly states when not to use this tool (e.g., when you need Steam review timelines, use get_review_timeline), so it remains more implied than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_gamesSearch Steam gamesA
Find a game on Steam by name and get its appid, which every other tool needs. Matches prefixes ("no man" finds No Man's Sky) but not typos. Searching in Russian returns Russian titles.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Game name or the beginning of one | |
| language | No | Language of the returned titles |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It usefully discloses prefix matching, typo sensitivity, and language-dependent title behavior. It does not describe output shape, rate limits, or auth, but for a simple search tool the disclosed behaviors are the most decision-relevant.
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?
Three short sentences each add distinct value: purpose, matching rules, and language behavior. The critical 'appid needed by other tools' fact is front-loaded, and there is no redundant 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 there is no output schema, the description communicates the core return purpose (appid) and matching behavior. It does not specify whether multiple results are returned or how limit affects output, but for a straightforward search tool the essential invocation context is present.
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 67%, covering query and language. The description adds behavioral meaning to query semantics by specifying prefix matching and typo behavior, and enriches language semantics by noting Russian searches return Russian titles. The limit parameter is left to the schema, but the added parameter context is valuable.
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 the tool finds Steam games by name and returns appid, explicitly noting this appid is needed by other tools. This distinguishes it from sibling tools like get_reviews or search_articles, making its purpose unmistakable.
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 this is the entry-point tool for anything requiring a Steam appid, with concrete matching behavior (prefix, no typos, language-dependent results). It does not explicitly name alternatives or when-not-to-use, but the context and sibling list make the usage clear enough.
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
v0.1.0- First observed
get_game_news - First observed
get_review_timeline - First observed
get_reviews - First observed
search_articles - First observed
search_games
TDQS
Scored across 5 tools
Most tools are clearly distinct: search_games is a Steam appid lookup, get_review_timeline is aggregated history, and get_reviews is individual recent reviews. There is minor potential confusion between get_reviews and get_review_timeline, and between search_articles and get_game_news, but the descriptions explicitly differentiate their data sources and use cases.
All tools follow a consistent verb_noun snake_case pattern: search_* for lookup-style tools and get_* for retrieval tools. The naming pattern is predictable and matches the underlying operation.
Five tools is a well-scoped set for a gaming/Steam research server. Each tool serves a distinct data need without redundancy or bloat.
The core workflow is covered: search a game, get review timeline, get detailed reviews, get news, and search press articles. Minor gaps exist around game metadata/details, but the set supports the apparent purpose of analyzing rating changes and related coverage.
Maintenance
Related MCP Connectors
Steam Web API: profiles, owned games, achievements, app news, player counts.
Ranks Steam games by how much players like them, learned from head-to-head duels.
The gaming attention graph: Steam players, Twitch live viewers, aggro ratio, hype, history.
Live Steam market data for AI agents: top sellers, deals, player counts. Paid per call via x402.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables LLMs to retrieve and analyze Steam game reviews, providing access to review statistics, game information, and helping summarize pros and cons of games.110 npm7MIT
- AlicenseAqualityAmaintenanceAbout Search Steam games, fetch user reviews, and analyze sentiment with topic drill-down to make informed purchasing decisions.724 npm3MIT
- AlicenseNot gradedqualityBmaintenanceEnables exploring Steam store reviews and community discussion threads with server-side filtering, temporal analysis, and metadata context for understanding player sentiment and feedback beyond store page noise.29 npm1BSD 3-Clause
- AlicenseAqualityAmaintenanceEnables interaction with Steam: search games, get store details, reviews, prices, discounts, news, and player profiles, libraries, and achievements via the Steam Web API.2594 npm4MIT