steam-mcp
Provides tools for interacting with a local Steam client and the Steam Web API, including browsing and filtering the game library, searching games, viewing game details and reviews, managing library collections, favorites, hidden status, tags, wishlist, and triggering game installs and uninstalls.
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., "@steam-mcpadd Celeste to my Platformers collection"
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.
steam-mcp
A local MCP server for the Steam desktop client on macOS: browse and filter your library, and read and write library collections — the thing Steam exposes no web API for.
Collections live only inside the running Steam client and in Steam Cloud. This server reaches them
by driving Steam's own Chromium debugger (SharedJSContext), where the library UI keeps
collectionStore, appStore and SteamClient.
Steam terms and account risk: This is an unofficial project that uses undocumented Steam client internals through the CEF debugger. The Steam Subscriber Agreement contains restrictions on reverse engineering and tampering. It is unclear whether this tool's use of the debugger is permitted under Valve's terms. Review the current terms and decide whether to use it with your account; Valve has not endorsed this project.
Requirements
macOS and Node 22.22.1+ (Node 24 recommended; see
.nvmrc)Steam installed and signed in
For collection writes: Steam running with CEF debugging enabled (the
steam_restarttool does this)
Related MCP server: Steam Library MCP Server
Set up
From a fresh clone, install the locked dependencies, check the project, and build the server:
nvm use # if you use nvm; otherwise install Node 22.22.1+
npm ci
npm run check
npm run build
npm run smokeRegister with Claude Code from the repository root. This starts in read-only mode:
claude mcp add steam -- node "$(pwd)/dist/index.js"Restart your MCP client, then call steam_status to see which data sources are available. Local
library reads work without an API key. To use the Steam Web API while Steam is closed, configure
STEAM_API_KEY in the MCP client's environment. To opt into collection writes, register the server
with -e STEAM_MCP_ALLOW_WRITES=1 and enable CEF debugging through steam_restart. For example,
remove the read-only registration and add it again with your chosen settings:
claude mcp remove steam
claude mcp add steam -e STEAM_MCP_ALLOW_WRITES=1 -- node "$(pwd)/dist/index.js"The .env.example file lists available variables; copying it to .env does not load it
automatically. Pass values through your MCP client or process environment. Keep API keys out of Git.
Configuration
Variable | Default | Meaning |
| unset (off) | Master switch for every mutation. Without it, writes return |
|
| Comma-separated ports to probe. The first is what |
| unset | Steam Web API key (get one; any domain works locally). Enables the full owned library and wishlist while Steam is closed. |
| auto | Override account detection (the |
|
| Cache and collection backups. |
The debug port
Steam's debugger defaults to 127.0.0.1:8080. If something else already holds that port, Steam
binds nothing at all and debugging silently fails.
If port 8080 is occupied, set STEAM_DEBUG_PORT=8081 (or another free port) in the MCP client's
environment. The server probes 8080,8081 by default, but steam_restart asks Steam to bind the
first configured port.
steam_status names whatever is squatting the port, and steam_restart refuses before quitting
Steam if the target port is occupied, so a failed restart never leaves you with Steam closed.
Tools
Status and lifecycle
steam_status— client state, debugger reachability, available sources, per-capability availability with reasons. Never throws; call it first when something is unavailable.steam_restart— quit Steam and relaunch it with debugging, then wait for the library UI. Requiresconfirm: true, and refuses if a game is running unlessallow_interrupt_game: true.
Library
steam_library_list— filter by installed/played/hidden/favorite/collection/tag/kind, playtime, last played, size, review score. Sorted, paginated, projected.steam_library_search— fuzzy name search; use it to turn names into appids.steam_game_details— one game across all sources, plus store metadata and review score.steam_tags_list,steam_recently_played,steam_wishlist
Collections
steam_collections_list,steam_collection_getsteam_collection_create— resolve-or-reuse by name (see Safety)steam_collection_add_games,steam_collection_remove_games,steam_collection_replace_gamessteam_collection_rename,steam_collection_deletesteam_set_favorite,steam_set_hidden
Installs and cache
steam_install_game,steam_uninstall_game— these open Steam's wizard. There is no silent install API; a dialog must be clicked through by hand.steam_cache_refresh,steam_cache_clear,steam_cache_status
How data is sourced
Steam running | Steam closed | |
Library | live client (authoritative) | Web API (with key) + local files |
Collections | live client |
|
Collection writes | ✅ | ❌ |
Reads degrade gracefully and set degraded: true. Writes never do — they fail with an actionable
error instead.
Installed-state comes from Steam's local-install collection, never from overview.installed,
which is true for most of a library and actually means "installable".
Safety
Every mutating tool takes
dry_run. It reports the exact delta — which appids would be added, removed, or lose their membership — and changes nothing. Use it before anything bulk.Unknown arguments are rejected, not ignored. Tool schemas are strict, so
dryrun,dry-run,appid(forappids), or any other typo fails loudly. Without this the SDK silently strips unrecognized keys, which means a mistypeddry_runon a destructive tool performs the real operation — that is not hypothetical, it deleted a collection during development.Writes are off by default (
STEAM_MCP_ALLOW_WRITES).No offline collection writes. Editing
cloud-storage-namespace-1.jsondirectly would mean reimplementing Valve'sunion-collectionsmerge semantics and two-level version counters, and a mistake propagates to Steam Cloud. Writes go through the running client, which does it correctly.Dynamic collections are refused. Steam recomputes filter-based collections, so manual edits are silently reverted — the worst possible failure mode.
Create never blind-creates. Steam deletes a same-named collection when saving a new one, so
steam_collection_createresolves by name first and reuses.Every write is verified by re-reading the collection in the same evaluation; tools report what actually happened, not what was intended.
Steam is never force-killed. It writes collections on exit;
steam_restartuses AppleScript quit and fails loudly rather than escalating.Collection files are backed up to
~/.cache/steam-mcp/backups/before the first mutation. Note these are Steam's flushed files, which lag the running client — a backup can be missing the newest membership changes, so treat it as a recovery aid, not a perfect snapshot.Deleting a collection loses its id. Recreating produces a new one. Steam Cloud may merge the old membership back in on the next sync (
union-collections), so verify the result.Collection ids are opaque and may contain
+and*(uc-8qBpJj1*+Borh) — pass them back verbatim.
Concurrency
Steam's CEF IPC crashes the whole Steam UI ("Collided with existing master response stream") if two
clients evaluate against the same target at once. Every evaluation goes through one promise chain in
src/cdp/client.ts; on timeout the socket is destroyed rather than reused, because a timed-out
evaluation is still running in the page and its late reply would collide with the next one.
Development
npm run build # tsc -> dist/
npm run typecheck # src, tests and configs
npm test # unit suite (fast, hermetic)
npm run test:coverage
npm run lint # eslint, type-aware
npm run format # prettier --write
npm run deps # knip: unused/undeclared dependencies, dead exports
npm run secrets:check # scan tracked files for likely credentials
npm run smoke # build, then boot the server and speak MCP to it
npm run check # everything above except build, coverage and smokeCI
.github/workflows/ci.yml runs on pushes to main, pull requests, and on demand.
Node 22 (the engines floor) and 24 on Linux, plus Node 24 on macOS — the only
platform the server supports, so that the day the unit suite stops being
platform-independent is the day CI says so.
Beyond npm run check, three steps assert things a type check and unit tests
structurally cannot:
The unit suite is hermetic — re-run with
STEAM_ROOT=/nonexistent. The suite claims no network, no real Steam install, no writes outside a temp directory; this is what keeps the claim honest instead of merely stated.The built page programs carry no compiler helpers — a
__spreadArrayin that emit is an unresolvable identifier inside Steam's page. It exists only in built output, so nothing else in the pipeline can see it.The server boots and stdout carries only JSON-RPC (
scripts/smoke-stdio.mjs). Unit tests import modules directly and never start the binary, so a broken registration or a straystdoutwrite would pass everything else and fail only once a client connected. Verified to fail on an injected stray write.
There is no deployment job and no integration job. The integration suite needs a real, logged-in Steam desktop client to drive over CEF; no hosted runner has one. Those stay opt-in and local.
Pull requests also run .github/workflows/dependency-review.yml to catch newly
introduced vulnerable dependencies. .github/workflows/codeql.yml scans
TypeScript and GitHub Actions workflows on pushes, pull requests, and weekly.
Git hooks
Installed by npm install (husky prepare).
Hook | Runs | Why there |
|
| Fast enough to not be resented; touches only what you staged. |
|
| The slow, whole-repo gate. |
pre-push deliberately does not run the integration suite: it drives the real
Steam client and would quit and relaunch it underneath whoever is pushing.
The secret guard protects against accidentally committing Steam Web API
keys. Such a key is a bare 32-character uppercase hex
string — nothing about it looks like a credential in a diff, so it has to be
matched by shape. The pre-commit hook scans staged content, while npm run check
scans tracked and new files. Findings report file locations without printing possible
credentials. This is a heuristic guard; review changes before publishing.
Linting
Type-aware typescript-eslint, calibrated rather than adopted wholesale. Two
rules earn their place for reasons specific to this server:
no-console(allowing onlyerror) and a ban onprocess.stdout— stdout is the MCP protocol channel, and anything written there corrupts the JSON-RPC stream.src/index.tsis the one file permitted to name the other console methods, because it reassigns them to stderr.no-restricted-syntaxonsrc/cdp/programs/*— a valueimportin a page program becomes an identifier Steam's page cannot resolve.auditPageFunctioncatches this at runtime; the lint rule catches it while you type.
src/cdp/programs/* is also the only place where the no-unsafe-* rules are
off. Everything those functions touch is Valve's, undeclared, and reshaped by
Steam updates without notice; there is nothing to type against, and inventing
declarations would assert a contract we cannot enforce.
Tests
Two suites with different contracts.
Unit (test/unit, ~350 tests, runs in ~2s). Hermetic: no network, no real Steam
install, no writes outside a temp directory. It passes with STEAM_ROOT=/nonexistent,
which is the check that keeps it honest. Steam's local files are represented by a
fixture tree in test/fixtures/steam that encodes every format quirk we hit — the
duplicate apps node in localconfig.vdf, tombstoned collections, opaque ids
containing + and *, a partially-downloaded .acf, and librarycache files holding
concatenated JSON documents.
test/helpers/fake-steam.ts is a faithful fake of collectionStore / appStore /
SteamClient. Faithful is the point: it reproduces Steam's real semantics, including
that AddOrRemoveApp takes raw appids and filters only undefined, that
SaveCollection deletes a same-named collection, and that AsDragDropCollection()
returns null for dynamic collections. A page program that would misbehave against the
real client misbehaves here too.
Integration (test/integration) drives the real client and is opt-in:
STEAM_MCP_E2E=1 npm run test:e2e # reads + restart guards
STEAM_MCP_E2E=1 STEAM_MCP_E2E_WRITES=1 npm run test:e2e # + real collection writesWrite tests only ever touch collections named zz-steam-mcp-test-<timestamp> — unique
per run, so they can never collide with a real collection and trigger Steam's same-name
deletion. They refuse to start if a stray scratch collection exists, clean up in
afterAll, and assert that no pre-existing collection changed. The suite establishes
its own Steam state rather than assuming it.
What the tests are protecting
Each of these is a bug that reached the real library before a test existed for it:
Guard | Test |
Concurrent evaluations crash the Steam UI |
|
A timed-out evaluation must destroy the socket, not release the lock |
|
Creating a collection must reuse a same-named one, never replace it |
|
Flag APIs take raw appids; overviews silently no-op or crash |
|
A dry run must project the delta, not report "no change" |
|
Unknown tool arguments must be rejected, not stripped |
|
Writes must fail closed without |
|
|
|
Steam must never be force-killed |
|
Two of these were verified by reintroducing the original bug and confirming the suite goes red.
Dry runs cannot substitute for real writes. The favorite/hidden tools were silently
no-ops for a while precisely because they were only ever exercised with dry_run; a
preview never calls the API it is previewing. Anything that flips a bit needs a
round-trip test that reads it back.
Offline assertions check invariants, not exact counts: this runs against a live library that legitimately changes as games are installed, played, hidden and re-categorised.
In-page programs
src/cdp/programs/*.ts are shipped to Steam via Function.prototype.toString(). They
must not reference module scope and must return plain JSON. tsconfig.json sets
importHelpers: false and downlevelIteration: false so tsc emits no helpers, and
auditPageFunction (exercised over every program in cdp-expression) fails the build
if a helper or closure capture ever appears.
Every page program belongs in that directory, including one-liners. The audit sweeps
the module, so a program defined anywhere else is one the guard never sees — which is
exactly what had happened to collectionMembers, previously defined in model.ts.
Available Tools
23 toolssteam_cache_clearClear cached Steam dataA
Delete this server's cached data. Steam's own files are never touched, and collection backups are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | all | |
| dry_run | No | Report how much would be removed without deleting anything. |
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 explicitly describes what is deleted and, importantly, what is preserved: Steam files are untouched and collection backups are preserved, which is valuable safety context. It does not discuss reversibility or post-clear system effects, though the core destructive behavior is clear.
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 compact and front-loaded: the first sentence states the core operation, and the second adds meaningful exclusions. There is no filler or redundant restating of the title.
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 two-parameter tool with no output schema, the description plus schema is mostly sufficient to make a correct call. However, it does not connect to related cache operations like steam_cache_status or steam_cache_refresh, and it omits any note about the default scope behavior, so some practical context is missing.
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 adds no parameter-level meaning beyond the schema. The dry_run parameter has a schema description, but the scope enum, including values like 'store-details' and 'store-reviews', is left entirely to the enum names, and the description does not explain how the default 'all' scope behaves.
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 action ('Delete') and resource ('this server's cached data') and further draws a clear boundary by stating Steam's own files are never touched and collection backups are preserved. This clearly differentiates it from status/refresh/library-related sibling tools.
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 no guidance about when to use this tool instead of steam_cache_status for inspecting cache or steam_cache_refresh for rebuilding it. There are no explicit conditions, prerequisites, or alternative tool mentions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_cache_refreshRefresh cached Steam dataA
Re-read the library from Steam, and optionally pre-fetch store metadata for specific games. Store fetches are rate-limited to roughly one every 1.6s (Steam allows about 200 per 5 minutes), so at most 60 appids are accepted per call and the call can take a couple of minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Refetch even if already cached and fresh. | |
| library | No | Re-read the library snapshot. | |
| store_appids | No | Games to pre-fetch store metadata and review scores for. |
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 of behavioral disclosure. It transparently surfaces rate limiting ('roughly one every 1.6s'), Steam's 200-per-5-minute limit, the 60-appid cap, and the multi-minute runtime. It does not clarify whether the refresh overwrites or clears existing cache data, but the key operational risks are disclosed.
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 sentences: the first front-loads the core action, the second explains constraints and duration. Every sentence provides necessary information 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?
The definition covers the main action, optional store pre-fetching, rate limits, and duration. With no output schema, a detailed return contract is not required. The only notable gap is the lack of explicit guidance on how the refresh affects existing cache state, but sibling tool names and the schema mitigate ambiguity.
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 input schema already documents all three parameters (force, library, store_appids) with descriptions and has 100% coverage, including maxItems for store_appids. The description adds a rate-limit note tied to store_appids, but this is a minor supplement rather than essential semantic clarification. Baseline 3 applies.
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 action: 'Re-read the library from Steam, and optionally pre-fetch store metadata for specific games.' This clearly identifies the resource (cached Steam library data) and the verb (re-read / pre-fetch). It is distinct from sibling tools in its combined behavior, though it does not explicitly differentiate itself from steam_cache_status or steam_library_list.
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 a fresh cache is needed, but does not explicitly state when to use it versus alternatives like steam_cache_status or steam_library_list. It does provide operational guidance—'at most 60 appids are accepted per call and the call can take a couple of minutes'—which helps an agent judge the cost of invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_cache_statusCache statusB
Report how fresh this server's cached library snapshot is.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must carry the behavioral burden. 'Report' signals a read-only operation and 'how fresh' indicates the output is a freshness assessment rather than a mutation. However, it does not define what 'fresh' means (e.g., timestamp threshold) or state that it never triggers a refresh.
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 sentence in active voice with the key concept 'how fresh' front and center. There is no filler, no restatement of the title, and 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 parameterless tool the description is adequate, but with no output schema or annotations it leaves the exact response shape (timestamp? age? fresh/stale flag?) and freshness criteria undefined. A brief note on what the result provides would make it 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 tool has zero parameters, so the 100% schema coverage is trivially complete and there is no parameter burden for the description to carry. The description adds no parameter semantics, but none are needed.
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 verb ('Report') and resource ('this server's cached library snapshot'), and 'how fresh' makes it unambiguous that this is a status/read operation. It does not explicitly contrast it with steam_cache_refresh or steam_cache_clear, but the wording is enough to distinguish it from 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?
There is no guidance on when to call this tool instead of steam_cache_refresh or steam_cache_clear, or what to do if the snapshot is stale. The purpose implies it is for checking freshness, but that is left to inference rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_collection_add_gamesAdd games to a collectionA
Add games to an existing static collection. Refuses dynamic (filter-based) collections, where such edits are silently reverted by Steam.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Collection id. Ids are opaque and may contain "+" and "*" (e.g. "uc-8qBpJj1*+Borh") - pass them back exactly as given. | |
| name | No | Exact collection name. Alternative to id. | |
| appids | Yes | Steam appids. Use steam_library_search to resolve names to appids first. | |
| dry_run | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It usefully reveals that dynamic collections are refused and edits are silently reverted by Steam, which is valuable context. However, it does not mention permissions, side effects, dry_run behavior, or what happens with invalid collection identifiers.
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 sentences with no filler. The core action and the most important caveat are both front-loaded, and every clause contributes meaning.
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 captures the main edge case and basic purpose, but with no output schema and no annotations, it leaves gaps: how to choose between id and name, what dry_run does, and what the tool returns. These are not fatal because the schema covers parameter basics, but the description alone is not 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?
Schema description coverage is 75%, so most parameters are already documented. The description adds the static-vs-dynamic distinction, which informs the collection identifier parameters, but it does not elaborate on dry_run or how id/name should be used together.
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 identifies the action ('Add games') and target ('existing static collection'), and the refusal of dynamic collections distinguishes it from the sibling remove/replace tools. It is specific and unambiguous about what the tool does.
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 a clear usage context: use this for static collections, not dynamic/filter-based ones. It explicitly states the when-not case but does not name an alternative tool for other collection mutations, leaving some routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_collection_createCreate a collectionA
Create a static collection, optionally seeded with games. If a collection with this name already exists it is REUSED and the games are added to it - Steam deletes a same-named collection when creating a duplicate, so this tool never blind-creates. Requires Steam to be running with debugging enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| appids | No | ||
| dry_run | No | Report what would change without writing. | |
| on_existing | No | What to do when a collection with this name already exists. | reuse |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden and does well: it discloses that the tool never blind-creates, that existing same-named collections are reused and extended, and that Steam deletes duplicates during creation. It also notes the execution prerequisite of Steam running with debugging enabled. It does not describe output or error behavior, but the core mutation semantics are clear.
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 compact and front-loaded: the main purpose is stated first, followed by the critical duplicate-handling nuance and the prerequisite. Every sentence adds useful information without padding.
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 covers the main behavior and prerequisite, but there is no output schema and no mention of return values or failure outcomes. Given the tool's mutation potential and the lack of annotations, some additional context about what happens on success or when Steam is not properly configured would make it more 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?
Schema coverage is 50%: dry_run and on_existing already have descriptions. The tool description adds some meaning for appids via 'optionally seeded with games,' but it does not elaborate on the name parameter or the exact meaning of appids beyond what the schema's type and property name imply.
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 and resource: 'Create a static collection, optionally seeded with games.' It also clarifies the non-obvious duplicate-name behavior, which clearly distinguishes this tool from adding games to an existing collection via a sibling tool.
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 that this tool creates or reuses a collection and requires Steam running with debugging enabled. However, it does not explicitly mention alternatives or state when an agent should prefer a sibling tool like steam_collection_add_games instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_collection_deleteDelete a collectionA
Delete a collection. DESTRUCTIVE: the collection and its id are gone, and recreating it produces a NEW id. The games themselves are untouched, and Steam's collection files are backed up first. Requires confirm=true. Run with dry_run=true first to see exactly which games would lose their membership.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Collection id. Ids are opaque and may contain "+" and "*" (e.g. "uc-8qBpJj1*+Borh") - pass them back exactly as given. | |
| name | No | Exact collection name. Alternative to id. | |
| confirm | Yes | Must be true. Acknowledges the destructive effect described in this tool's summary. | |
| dry_run | No | Report what would be deleted without deleting anything. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It clearly discloses that the collection and its id are permanently gone, that recreating it yields a new id, that games are unaffected, and that Steam backs up collection files. This is strong, safety-critical transparency.
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 front-loaded with the operation and packs warnings plus the safe invocation sequence into three short sentences. Every clause adds essential information; 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?
For a destructive tool with no annotations and no output schema, it covers consequences, backup behavior, and the dry_run/confirm workflow well. The main gap is that it never explicitly says the collection must be identified via id or name, which is notable because confirm is the only required property in the schema.
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 all four parameters, providing a solid baseline. The description adds meaningful context about id lifetime—deleted collection ids are not reused—which goes beyond the schema, and it reinforces the roles of confirm and dry_run.
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 opens with a specific verb and object, 'Delete a collection', and immediately distinguishes this from sibling membership tools by noting the games themselves are untouched. There is no ambiguity about the resource acted on.
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 gives explicit safety steps: set confirm=true and run dry_run=true first to preview what will happen. It doesn't explicitly compare against alternatives like steam_collection_remove_games, but the deletion use case is clear from the context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_collection_getGet a collection and its gamesA
Return one collection with its games. Paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Collection id. Ids are opaque and may contain "+" and "*" (e.g. "uc-8qBpJj1*+Borh") - pass them back exactly as given. | |
| name | No | Exact collection name. Alternative to id. | |
| limit | No | Max rows to return. | |
| offset | No | Rows to skip, for paging. | |
| include_games | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the disclosure burden. It does state pagination, and 'Return' implies a read-only operation, but it does not specify error behavior, id/name precedence, or how include_games=false changes the result.
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 terse sentences with no filler. The core action is front-loaded, and the pagination note is the only additional behavior disclosed, earning 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?
Adequate for a simple fetch when combined with the schema, but with no output schema and no annotations, an agent still lacks return-shape cues and edge-case behavior. The description does not clarify what happens when both id and name are supplied or when include_games is false.
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 80%, with good inline descriptions for id, name, limit, and offset. The description adds little beyond hinting at 'with its games' for include_games, so it does not meaningfully compensate for the undocumented include_games 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 concrete verb ('Return') and identifies the resource ('one collection with its games'). 'One' helps distinguish this from steam_collections_list, though it does not name the sibling explicitly.
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 intended use is implied: fetch a single collection by ID or name. However, there is no explicit guidance about when to prefer this over collections_list or how to handle the id/name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_collection_remove_gamesRemove games from a collectionA
Remove games from a static collection. The games stay in the library; only the collection membership changes.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Collection id. Ids are opaque and may contain "+" and "*" (e.g. "uc-8qBpJj1*+Borh") - pass them back exactly as given. | |
| name | No | Exact collection name. Alternative to id. | |
| appids | Yes | Steam appids. Use steam_library_search to resolve names to appids first. | |
| dry_run | No |
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 does disclose the key safety-relevant behavior: games remain in the library and only membership changes. However, it does not explain dry_run behavior, whether the operation is reversible, or what happens when removing the last game from a collection.
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 short sentences with no filler. The action is front-loaded, and the clarifying behavioral caveat follows immediately, making it easy for an agent to parse.
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 is complete enough for a basic call, and the schema covers most parameters. But with no output schema and no annotations, the tool would benefit from explaining dry_run semantics and when to use id versus name to identify the collection.
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 75%, so the schema already documents id, name, and appids in detail. The description adds no parameter-level meaning and does not clarify the undocumented dry_run parameter. This is an adequate but not enhanced baseline.
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 ('Remove') and resource ('games from a static collection'), and the clarifying clause 'The games stay in the library; only the collection membership changes' distinguishes this from library deletion or uninstallation. It effectively differentiates from sibling tools like steam_uninstall_game and steam_collection_delete.
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 conveys the action, but it does not explicitly say when to choose this tool over alternatives like steam_collection_add_games or steam_collection_replace_games. It implies usage for modifying collection membership but gives no exclusions or comparative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_collection_renameRename a collectionA
Rename a collection, keeping its id and membership. Renaming is preferred over delete-and-recreate because your library shelf layout references collection ids.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Collection id. Ids are opaque and may contain "+" and "*" (e.g. "uc-8qBpJj1*+Borh") - pass them back exactly as given. | |
| name | No | Exact collection name. Alternative to id. | |
| dry_run | No | ||
| new_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses a key behavioral trait: the rename preserves id and membership. However, it does not mention ownership/permissions, error behavior, whether the operation is reversible, or the effect of the dry_run parameter.
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 short sentences with no filler. The primary action is front-loaded, and the second sentence provides a concise rationale that helps an agent make the right tool choice.
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 is adequate for understanding what the tool does and why it is preferable to deletion, but it is incomplete for a mutation tool with no annotations and no output schema. Missing guidance on id vs name selection, dry_run behavior, and expected results leaves gaps for correct invocation.
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 50%; new_name and dry_run have no schema descriptions. The tool description does not compensate by explaining how to choose between id and name, what dry_run does, or how new_name relates to the other parameters. It adds no real parameter-level meaning 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 states a specific operation ('Rename a collection') and immediately clarifies the defining constraint ('keeping its id and membership'), which distinguishes it from create/delete-and-recreate among the sibling collection tools. It is not a tautology and adds meaningful scope.
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 names the alternative ('delete-and-recreate') and gives the condition that selects this tool ('your library shelf layout references collection ids'). This gives an agent clear guidance on when to prefer rename over destructive alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_collection_replace_gamesReplace a collection's gamesA
Replace the entire membership of a collection. DESTRUCTIVE: any game not in appids is removed from the collection. Requires confirm=true when it would remove more than 10 games. Run with dry_run=true first to see the diff.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Collection id. Ids are opaque and may contain "+" and "*" (e.g. "uc-8qBpJj1*+Borh") - pass them back exactly as given. | |
| name | No | Exact collection name. Alternative to id. | |
| appids | Yes | ||
| confirm | No | Required when the replacement removes more than 10 games. | |
| dry_run | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden and meets it well. It explicitly labels the operation DESTRUCTIVE, specifies what gets removed, and explains the confirm threshold and dry-run behavior. This gives an agent the critical safety context before invoking.
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 tight sentences with no filler: core operation first, destructive warning second, and safety workflow third. Every sentence 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 description covers the action, destructiveness, confirmation guardrail, and dry-run workflow, which is nearly complete for a destructive 5-parameter tool. However, with appids as the only required field, it would benefit from explicitly saying that id or name must identify the collection, and there is no return-value context given the absence of an output schema.
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 only 60%, and the description adds important semantics for appids ('any game not in appids is removed'), confirm ('required when more than 10 games'), and dry_run ('see the diff'). The id/name identifier requirement is not explicitly stated, and the schema lists both as optional, so this could be clearer.
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 opens with 'Replace the entire membership of a collection,' which is a specific verb plus resource and directly distinguishes it from sibling add/remove tools. The destructive scope ('any game not in appids is removed') reinforces exactly what the tool does.
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 operational guidance: run dry_run=true first to see the diff and set confirm=true when more than 10 games would be removed. It does not explicitly name alternatives such as add_games or remove_games, but the usage context is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_collections_listList Steam collectionsA
List every library collection with its id, name, game count, and whether it is dynamic (filter-based, therefore read-only) or a Steam system collection. Works with Steam closed, reading the last state Steam wrote to disk, in which case degraded=true.
| Name | Required | Description | Default |
|---|---|---|---|
| include_system | No | Include Steam's own collections such as Favorites and Hidden. | |
| include_dynamic | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the behavioral burden, and it does well: it discloses that the tool reads the last state Steam wrote to disk when Steam is closedaddr degraded=true, and explains that dynamic collections are filter-based and therefore read-only. It does not explicitly state that the tool itself has no side effects, but the verb 'List' and absence of mutation language convey that.
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 sentences, no filler, and essential details are front-loaded. The parenthetical definition of dynamic is efficient, and every clause contributes either scope, return fields, or behavioral context.
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?
This tool has no output schema Earnings, but the description lists the returned fields and the degraded flag, which is sufficient for an agent to understand what it will receive. Both optional parameters are addressed or implied, and the stale-data behavior with Steam closed is explicitly disclosed, making this complete for a listing tool with no required parameters.
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 include_system, but include_dynamic has no schema description. The tool description partially compensates by defining what 'dynamic' means (filter-based, read-only), yet it does not explicitly explain how include_dynamic=true/false changes the result set. Thus it adds useful but incomplete parameter context.
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 immediately names the exact action ('List every library collection') and enumerates the fields returned: id, name, game count, dynamic status, and system status. It also distinguishes the two collection categories, making its scope clear and separating it from singular retrieval tools like steam_collection_get.
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 states that it can work with Steam closed by reading the last state from disk cancelled, which is useful context for when to call it. However, it does not explicitly mention alternatives or exclusions, such as 'for a single collection use steam_collection_get' or 'to modify collections use the add/remove/replace tools.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_game_detailsGame detailsA
Everything known about one game: install state, playtime, tags, which collections contain it, plus store metadata (description, genres, developers, release date, review score). Store data is fetched on demand and cached for two weeks; it draws on a shared budget of roughly 200 store requests per 5 minutes, so avoid calling this in a loop over many games.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Alternative to appid. Ambiguous names return candidates instead of guessing. | |
| appid | No | ||
| refresh | No | ||
| include_store | No | Fetch store metadata (rate-limited). | |
| include_reviews | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it discloses on-demand store fetching, a two-week cache, a shared rate limit of ~200 requests per 5 minutes, and the recommendation to avoid loops. It doesn't cover error behavior or auth, but the core side-effect and performance traits are clearly stated.
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 sentences, with the tool's purpose front-loaded and the operational caveat following. No fluff, every clause contributes meaning, and the structure is easy to scan.
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 single-game detail tool with no output schema, it covers the key behavioral aspects (rate limit, caching, avoid loops) and enumerates the data returned. Missing details like the refresh flag's effect and the exact return shape are notable but not fatal, and the description is adequate for safe invocation.
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 40% (only name and include_store have descriptions). The description adds context that store data is rate-limited and cached, which helps for include_store, but it doesn't explain refresh or include_reviews semantics. It partially compensates for the low coverage but leaves several parameters under-explained.
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 returns 'Everything known about one game' and enumerates specific data types (install state, playtime, tags, collections, store metadata). It distinguishes itself from sibling tools like library_list or library_search by focusing on a single game's aggregated details, so an agent can easily pick it for per-game queries.
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 gives a clear usage context: use for detailed info on one game, and warns against looping over many games due to the shared store request budget. It doesn't explicitly name alternative tools for list operations, but the scope is unambiguous, and the rate-limit guidance provides practical when-to-use/avoid guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_install_gameOpen Steam's install wizardA
Open Steam's install wizard for a game. NOT a silent install: Steam has no silent install API. This opens a dialog in the Steam window that must be clicked through by hand; nothing happens until then. Returns as soon as the wizard is open; check steam_game_details later to see whether the download actually started.
| Name | Required | Description | Default |
|---|---|---|---|
| appid | Yes | ||
| confirm | Yes | Must be true. Acknowledges the destructive effect described in this tool's summary. | |
| dry_run | No | Report what would happen without opening the wizard. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does well by disclosing that this is not a silent install, that the wizard must be manually clicked through, that nothing happens until then, and that the tool returns before the download actually starts. It does not mention potential side effects like disk usage or Steam account restrictions, but the core non-obvious behavior is clearly disclosed.
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 four sentences and every sentence earns its place: the core action, the critical warning against assuming silent install, the manual-click behavior, and the follow-up verification step. It is front-loaded and waste-free.
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 explains what the tool does, why it is not silent, how to verify success, and that it returns immediately after opening the wizard. It does not specify the exact return value format, but the lack of an output schema and the simple 'returns as soon as the wizard is open' wording make this acceptable. The guidance to check steam_game_details later fills the main follow-up gap.
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%, and the schema already explains confirm's purpose and dry_run's behavior. The description adds no additional parameter-level detail, and appid remains minimally documented, but the schema provides enough information for the agent to use the parameters correctly. This is a baseline score for a tool where the schema does most of the parameter work.
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: 'Open Steam's install wizard for a game.' It also explicitly distinguishes this from a silent install, and it is clearly differentiated from sibling tools like steam_uninstall_game and steam_game_details. The agent can infer exactly what action this tool performs.
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 explains what to expect when using the tool: it opens a dialog that must be clicked through manually, and it returns before the download starts. It also instructs to check steam_game_details later to verify whether the download actually began. It does not explicitly state when not to use it or name alternatives, but the context is clear enough for an agent to decide appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_library_listList Steam gamesA
List, filter and sort games in the Steam library. Returns a compact projection and is paginated - it never dumps the whole library. Hidden games are excluded unless hidden=true. Always check the returned 'total' before assuming you have seen everything.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Store tag name, e.g. "Roguelike". | |
| kind | No | App type. | |
| sort | No | name | |
| limit | No | Max rows to return. | |
| order | No | asc | |
| fields | No | Fields to return. Default: appid, name, installed, playtimeMinutes, lastPlayed. | |
| hidden | No | Include only hidden (true) or only visible (false) games. Omitted means visible only. | |
| offset | No | Rows to skip, for paging. | |
| played | No | true = playtime above zero; false = never played. | |
| refresh | No | Bypass the cached library snapshot. | |
| favorite | No | ||
| installed | No | Only games installed on this machine. | |
| collection | No | Collection id or exact name to filter by. | |
| max_size_gb | No | ||
| min_size_gb | No | ||
| played_since | No | Only games played since then. ISO date or relative such as "30d", "6m", "2y". | |
| not_played_since | No | Only games not played since then. Includes never-played games. | |
| max_playtime_minutes | No | ||
| min_playtime_minutes | No | ||
| min_review_percentage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and discloses non-obvious facts: results are compact, paginated, never a full dump, hidden games are excluded by default, and 'total' must be checked. These are exactly the behaviors an agent could miss and then misread partial results.
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, front-loaded with the core purpose followed by high-value caveats. No filler; the apparent redundancy between 'compact projection' and 'never dumps the whole library' reinforces an important behavioral constraint.
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 20-parameter tool with no output schema, the description covers the most critical operational hazards: pagination, hidden-game default, and the need to inspect 'total'. It leaves some return-shape details to inference, but the schema's field defaults and the description's caveats cover enough for correct invocation.
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 60%, and the description adds some parameter-relevant meaning (hidden behavior, pagination, compact projection), but it does not compensate for the many undocumented params like sort, order, or the min/max filter fields. It is adequate only because parameter names are largely 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?
States a specific action ('list, filter and sort') applied to a specific resource ('games in the Steam library') and immediately adds differentiating traits: compact projection, pagination, and hidden-game exclusion. This lets an agent distinguish it from sibling detail/search tools without opening the schema.
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?
Provides clear context that this is the paginated, filterable library listing tool, and explicitly calls out the hidden-game default. It does not name alternatives like steam_library_search or steam_recently_played, so it stops short of full when-to-use vs. not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_library_searchSearch Steam games by nameA
Find games by name. Fuzzy and punctuation-insensitive, ranked best-first. Use this to turn a game name into an appid before calling any tool that takes appids.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| include_hidden | No | ||
| installed_only | No |
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 does reveal core search behavior—fuzzy matching, punctuation-insensitivity, and best-first ranking. It does not discuss empty results, read-only guarantees, or output shape, but these are less critical for a lookup-style tool.
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 sentences with no wasted words. The core behavior is front-loaded, and the use case is stated in the final sentence. Every sentence 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 description covers purpose, matching behavior, and the appid use case, which is enough for a bare query call. However, with no annotations and no output schema, it leaves the non-query parameters and the exact return format underspecified, so agents using filters or expecting a structured response are not fully equipped.
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%, so the description must compensate, but it only clarifies the query concept. The limit, include_hidden, and installed_only parameters are not explained at all beyond their names and defaults, leaving agents without meaningful guidance for filtering or pagination.
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 opens with a precise verb and resource: 'Find games by name.' It then adds differentiating behavior—'Fuzzy and punctuation-insensitive, ranked best-first'—and connects the tool to its role in appid lookup, setting it apart from library list/detail 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?
The description explicitly states when to use the tool: 'Use this to turn a game name into an appid before calling any tool that takes appids.' It gives clear context but does not explicitly state when not to use it or name alternatives, so it stops just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_recently_playedRecently played gamesB
Games played recently, newest first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must carry the behavioral burden. It does disclose the sort order ('newest first') and the temporal scope, but it does not explicitly state that the operation is read-only, nor does it describe the return shape or any side effects.
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 extremely concise and front-loaded: 'Games played recently, newest first' packs the resource and ordering in eight words with no filler. 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 list tool with one optional parameter, the description is nearly enough: it tells the domain and order. However, with no annotations and no output schema, it leaves the read-only nature, the list return type, and the limit behavior implicit, making it minimally viable rather than 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 only parameter, limit, is documented in the schema with type, default, minimum, and maximum, but the description does not mention it at all. With schema description coverage at 0%, the description was expected to compensate and explain how limit affects the result set, but it does not.
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 identifies the resource (recently played games) and adds the ordering detail 'newest first.' It is distinguishable from siblings like steam_library_list or steam_game_details by the 'recently played' scope, though it lacks an explicit verb such as 'List' or 'Retrieve.'
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?
No guidance is given about when to use this tool over alternatives such as steam_library_list or steam_library_search. There are no stated exclusions, prerequisites, or context signals to help an agent choose between this and the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_restartRestart Steam with debuggingA
Quit Steam and relaunch it with its Chromium debugger enabled, then wait for the library UI to finish loading. WARNING: this closes the Steam client. Any running game will be interrupted and unsaved progress may be lost - the tool refuses to run if it detects a game, unless allow_interrupt_game is set. Required before any collection write when steam_status reports collections_write unavailable. Typically takes 25-60s.
| Name | Required | Description | Default |
|---|---|---|---|
| port | No | Debugger port. Defaults to 8080, Steam's built-in default. | |
| confirm | Yes | Must be true. Acknowledges that Steam will be closed and reopened. | |
| dry_run | No | Report what would happen - including what would be interrupted - without touching Steam. | |
| skip_if_healthy | No | Do nothing if Steam is already running with a working debugger. | |
| allow_interrupt_game | No | Proceed even if a game appears to be running. This will terminate it. |
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, and it delivers richly. It warns that Steam will close, that running games will be interrupted, that unsaved progress may be lost, that the tool refuses to run when a game is detected unless allow_interrupt_game is set, and that the operation typically takes 25-60s. For a destructive, side-effect-heavy tool, this is exemplary transparency.
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 compact, with no filler. The action is front-loaded first, followed by a prominent warning, the conditional refusal rule, the use-case trigger, and a timing estimate. Every sentence earns its place and contributes either to selecting the tool or understanding its impact.
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 a destructive restart operation with no annotations and no output schema, the description covers everything an agent needs to safely decide and call: what happens, when it is required, what can go wrong, how to override the safety guard, and how long it takes. No critical operational detail is missing.
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 all 5 parameters with 100% coverage, so the baseline is 3. The description adds meaning beyond the schema by explaining the refusal behavior tied to allow_interrupt_game ('the tool refuses to run if it detects a game, unless allow_interrupt_game is set') and by framing the operation as a prerequisite for collection writes. This situational context helps an agent reason about parameter trade-offs, pushing it above baseline.
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 opens with a specific and concrete behavior: 'Quit Steam and relaunch it with its Chromium debugger enabled, then wait for the library UI to finish loading.' This clearly identifies the operation on a specific resource and distinguishes it from the many sibling read/write tools like steam_status and steam_collection_create. The title and description align, leaving no ambiguity about what the tool does.
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 an explicit trigger condition: 'Required before any collection write when steam_status reports collections_write unavailable.' It also gives a clear when-not-to-use warning about running games and explains the safety escape hatch (allow_interrupt_game). This is practical, actionable guidance that tells an agent exactly when to invoke the tool and what to check first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_set_favoriteMark games as favoriteB
Add games to, or remove them from, Steam's Favorites collection.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | true to favorite, false to un-favorite. | |
| appids | Yes | Steam appids. Use steam_library_search to resolve names to appids first. | |
| dry_run | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does state that the tool can both add and remove favorites, but it omits important behavioral details such as permissions, side effects, reversibility, dry_run behavior, and what the response looks like. For a mutation tool, this is a significant gap.
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 with no redundant content. It efficiently communicates the core operation without wasting words.
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 state-changing tool with no annotations and no output schema, the description is too thin. It does not explain dry_run semantics, when to prefer this over other sibling tools, or what error or return behavior to expect, leaving an agent without enough context for safe invocation.
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 appids and value, but the description adds no additional meaning for them. More importantly, the dry_run parameter is not described in either the schema or the description, and the description does not compensate for this gap.
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 action ('Add games to, or remove them from') and the specific resource ('Steam's Favorites collection'). This distinguishes it well from sibling tools like steam_set_hidden or the collection management tools, whose purposes are different.
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: it is clearly about managing the Favorites collection. However, it does not explicitly say when to use this tool versus alternatives like collections or hidden flags, nor does it provide any exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_statusSteam statusA
Report Steam client state, debugger reachability, which data sources are usable, and which capabilities are currently available. Never fails - it reports problems instead of throwing. Call this first whenever a Steam operation is unexpectedly unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
| probe_client | No | Attempt a live connection to the Steam client (adds up to ~2s). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses a key trait: 'Never fails - it reports problems instead of throwing,' which tells the agent how to interpret failures. It does not fully detail data source semantics, but the failure-mode guarantee adds genuine transparency.
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 no filler. The first sentence front-loads the core purpose, the second states a critical invariant, and the third gives a concrete usage directive. Every sentence 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 low-complexity status tool with a single optional parameter, the description is complete. It tells the agent what the tool reports, how errors behave, and when to call it. No output schema exists, but the description enumerates the reported categories well enough to set expectations.
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?
There is only one parameter, and the input schema already explains it fully, including the live-connection behavior and the ~2s cost. The tool description adds no parameter-level detail beyond the schema, so baseline 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 ('Report') and names exactly what is reported: Steam client state, debugger reachability, usable data sources, and available capabilities. This is clearly distinct from sibling tools that manage library entries, collections, or cache state.
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 an explicit trigger: 'Call this first whenever a Steam operation is unexpectedly unavailable.' It does not name alternatives or say when not to call it, but the directive is clear enough to route an agent to this tool at the right time.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_tags_listList store tags in the libraryA
List the store tags present across the library with how many games carry each. Use this to discover valid values for the 'tag' filter of steam_library_list.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| min_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It describes the core behavior (listing tags with counts) but does not mention that results are affected by the 'limit' and 'min_count' parameters, nor any other behavioral details like pagination or ordering. This is a minor gap for a simple read-only tool.
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 sentences, front-loaded with the primary action and then a direct usage note. No wasted words.
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 list tool with two parameters and no output schema, the description provides the essential context: what it returns and why you'd use it. It doesn't describe the output format but that is implied. It's sufficient for an agent to call it 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?
Schema coverage is 0% and the description does not explain the parameters 'limit' or 'min_count'. While the names are somewhat self-explanatory, the description fails to add meaning beyond the schema, especially 'min_count' which could be ambiguous.
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?
States a specific verb ('List') and resource ('store tags across the library') with a count per tag, and explicitly ties it to the 'tag' filter of steam_library_list, differentiating it from siblings like steam_library_list and steam_library_search.
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?
Explicitly states the intended use: to discover valid values for the 'tag' filter of steam_library_list. This gives clear when-to-use guidance, though it doesn't mention exclusions or alternatives beyond that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_uninstall_gameOpen Steam's uninstall wizardA
Open Steam's uninstall wizard for a game. NOT silent: Steam has no silent install API. This opens a dialog in the Steam window that must be clicked through by hand; nothing happens until then. Deleting game files is irreversible and any saves kept inside the game folder go with them; Steam Cloud saves are unaffected. Requires confirm=true.
| Name | Required | Description | Default |
|---|---|---|---|
| appid | Yes | ||
| confirm | Yes | Must be true. Acknowledges the destructive effect described in this tool's summary. | |
| dry_run | No | Report what would be removed without opening the wizard. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does a superb job: it discloses the non-silent dialog behavior, the irreversible deletion, save-file consequences, and the Steam Cloud exception. It even calls out the confirm requirement, going well beyond minimal safety warnings.
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?
Four crisp sentences, front-loaded with the core action and using the rest for essential warnings. Every sentence earns its place with 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?
For a destructive tool with no annotations and no output schema, the description covers action, interaction model, irreversibility, save implications, and the confirmation contract. dry_run is already explained in the schema, so nothing necessary for correct invocation is missing.
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 confirm and dry_run with descriptions, and the description only repeats the confirm=true requirement without adding new detail. appid is left without added meaning, though 'for a game' loosely ties it to the tool's purpose. With 67% schema coverage, the description adds only marginal parameter value.
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 ('Open') and resource ('uninstall wizard for a game'), and the 'NOT silent' note immediately clarifies that this does not perform a hidden uninstall. It clearly distinguishes itself from the sibling steam_install_game by naming the uninstall direction.
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: use this to uninstall a game, with an explicit caveat that it is not silent and opens a manual dialog. It does not name an alternative or state an explicit when-not-to-use, but the context is sufficient for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steam_wishlistSteam wishlistA
List wishlisted games. Requires STEAM_API_KEY to be configured.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows to return. | |
| offset | No | Rows to skip, for paging. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It adds the API-key prerequisite, and the read-only nature is implied by 'List', but it doesn't describe pagination behavior, error cases, or return shape. This is a modest addition over the schema.
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 sentences, with the core action first and the prerequisite second, containing no wasted words.
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 read-only listing tool, the API-key note plus schema may be enough to issue a correct call, but the absence of an output schema and any pagination/return description creates a gap. Sibling differentiation is also absent, so an agent must rely on the name alone.
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?
Both limit and offset are fully documented in the schema with defaults and bounds (100% coverage). The description adds no parameter-specific meaning, so the baseline 3 applies.
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?
States a specific verb 'List' and resource 'wishlisted games', which is distinct from library- and collection-based sibling tools. Title reinforces the resource. No ambiguity.
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 only contextual note is the STEAM_API_KEY prerequisite; there is no discussion of when to prefer this tool over steam_library_list or steam_library_search. Selection must be inferred from the name.
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.
23 tool updates
v0.1.0- First observed
steam_cache_clear - First observed
steam_cache_refresh - First observed
steam_cache_status - First observed
steam_collection_add_games - First observed
steam_collection_create - First observed
steam_collection_delete - First observed
steam_collection_get - First observed
steam_collection_remove_games - First observed
steam_collection_rename - First observed
steam_collection_replace_games - First observed
steam_collections_list - First observed
steam_game_details - First observed
steam_install_game - First observed
steam_library_list - First observed
steam_library_search - First observed
steam_recently_played - First observed
steam_restart - First observed
steam_set_favorite - First observed
steam_set_hidden - First observed
steam_status - First observed
steam_tags_list - First observed
steam_uninstall_game - First observed
steam_wishlist
TDQS
Scored across 23 tools
Each tool targets a distinct resource-action combination, and the collection CRUD tools are clearly separated from library listing, search, and details. The cache/status cluster (steam_status, steam_cache_status, steam_cache_refresh, steam_cache_clear) could cause mild confusion by name, but the descriptions cleanly differentiate them.
Most tools follow a steam_<domain>_<action> pattern (steam_library_list, steam_collection_create, steam_cache_refresh), which is predictable and readable. A few exceptions like steam_restart, steam_set_favorite, steam_set_hidden, and steam_wishlist break the pattern slightly, but they are still easy to infer.
At 23 tools, the server sits in the heavy range and includes several housekeeping utilities (status, cache_status, cache_refresh, cache_clear) beyond core functionality. The breadth of Steam's library and collection features justifies most tools, but the count is borderline rather than ideal.
The collection lifecycle is fully covered with list/get/create/rename/add/remove/replace/delete, and library browsing, search, details, favorites, and hidden toggles are present. Wishlist support is read-only and install/uninstall depend on external UI wizards, but these are reasonable limitations given the server's focus.
Maintenance
Related MCP Connectors
Steam Web API: profiles, owned games, achievements, app news, player counts.
Live Steam Market API docs, schemas, products, games, markets and endpoint search.
Live read-only discovery for public s&box packages, servers, and player activity.
- BrickwayOAuthapp.brickway
Read-only access to your Brickway LEGO and alt-brick collection: sets, builds, figures, catalog.
Related MCP Servers
- AlicenseAqualityCmaintenanceIntegrates with Steam Web API to enable querying user profiles, game libraries, store data, and community features like reviews and workshop items.16MIT
- FlicenseNot gradedqualityCmaintenanceProvides access to your Steam game library data through Claude Desktop, enabling game search, filtering, details, recommendations, and statistics.7-
- AlicenseAqualityAmaintenanceEnables interaction with Steam: search games, get store details, reviews, prices, discounts, news, and player profiles, libraries, and achievements via the Steam Web API.25128 npm4MIT
- AlicenseBqualityBmaintenanceProvides Steam library intelligence including ownership, store briefs, deals, discovery, wishlist updates, co-op planning, achievements, and optional local actions.21MIT