Skip to main content
Glama
VladMogwai

gameswarp-mcp

by VladMogwai

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-mcp

Or, 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

search_games

Name to appid. Prefix matching; Russian titles when asked in Russian

get_review_timeline

Monthly positive share for the whole life of a game, plus the last 30 days

get_game_news

Patch notes with dates, and press Steam syndicates

get_reviews

Reviews filtered by window, sentiment and hours played at the time of writing

search_articles

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:migrate

See 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 tools
get_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNo
appidYes
limitNo
sinceNoISO date; only items published after it

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
appidYes
limitNo
sinceNoISO date, start of the window
untilNoISO date, end of the window
voted_upNotrue for positive only, false for negative
min_playtime_hoursNoDrop reviews by players with less time than this at the moment of writing

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
appidYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
since_daysNoOnly articles this recent

TDQS

B3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYesGame name or the beginning of one
languageNoLanguage of the returned titles

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 5 tool updatesv0.1.0
    • First observedget_game_news
    • First observedget_review_timeline
    • First observedget_reviews
    • First observedsearch_articles
    • First observedsearch_games

TDQS

A3.8/5.0

Scored across 5 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

Five tools is a well-scoped set for a gaming/Steam research server. Each tool serves a distinct data need without redundancy or bloat.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers