steam-mcp is a Windows-first local MCP server for working with a Steam library safely. It gives MCP clients a practical way to inspect a local Steam setup, search owned games, enrich results with Steam Deck and store data, generate links, and plan collection changes before any write step.
- Inspect the active Steam environment and selected user with
steam_status - List and filter owned games with
steam_library_list - Search the local library with
steam_library_search - Search the public Steam store with
steam_store_search - Query the authenticated official Steam catalog with
steam_store_query - Scout authenticated featured/editorial Steam marketing placements with
steam_featured_scout - Scout upcoming or newly released Steam catalog apps with
steam_release_scout - List recently played games with
steam_recently_played - List selected-user wishlist items currently on sale with
steam_wishlist_on_sale, derived from official wishlist data plus live public appdetails price metadata - Enrich, search, Deck-shortlist, and summarize discounts for selected-user wishlist items with
steam_wishlist_details,steam_wishlist_search,steam_wishlist_deck_shortlist, andsteam_wishlist_discount_summary - Find similar games with deterministic ranking by default and optional official store prioritization via
steam_find_similar - Export results as JSON or Markdown with
steam_export - Generate
steam://and web links withsteam_link_generate - Preview collection and hidden-state changes with
steam_collection_plan - Apply a reviewed collection plan with
steam_collection_applywhen writes are explicitly enabled, using a staged cloudstorage apply flow
- Read-heavy by default
steam_collection_applyis the only tool that mutates Steam-owned state- Steam-owned writes stay disabled unless
STEAM_ENABLE_COLLECTION_WRITES=1; treat this as the explicit write-unlock / operator kill switch for Steam-owned mutations STEAM_ENABLE_WINDOWS_ORCHESTRATION=1is a separate Windows-only opt-in wrapper that can best-effort launch Steam on MCP startup and close Steam before each apply call; after a successful dirty-only apply it leaves Steam closed, and after a finalize apply or a failed apply it best-effort relaunches Steam only if the wrapper stopped itsteam_collection_plancreates durable preview plans under MCP-owned state without mutating Steam-owned data- Apply is backup-first, drift-checked, rollback-capable, and requires Steam to be closed; orchestration satisfies that precondition on supported Windows runtimes
- Staged sync is JSON-only for cloudstorage files:
cloud-storage-namespace-1.json,cloud-storage-namespace-1.modified.json, andcloud-storage-namespaces.json - Staged sync requires pair-array cloudstorage format, rejects object-shaped cloudstorage documents for apply, and does not fall back to a legacy one-shot path
- Dirty-stage and finalize calls each create backups for the files touched in that invocation
To use steam-mcp, you need an MCP client that can launch a local stdio server. Build this repo, then point your client at the built server entrypoint.
- Windows with a local Steam install
- Node.js
>=24.15.0 - npm
>=11.13.0
npm install
npm run buildConfigure your MCP client to launch the built server over stdio.
{
"mcpServers": {
"steam": {
"command": "node",
"args": ["packages/steam-mcp/dist/index.js"],
"cwd": "C:\\path\\to\\steam-mcp"
}
}
}The exact config shape depends on the client, but the runtime entrypoint in this repo is packages/steam-mcp/dist/index.js after npm run build.
If your MCP client supports prompts, steam-mcp includes built-in workflows for common tasks:
steam_library_curator— safe library analysis, search, recommendations, exports, and linkssteam_wishlist_curator— read-only selected-user wishlist curation, sale/discount discovery, wishlist search, Deck shortlisting, exports, and linkssteam_collection_planner— plan-first collection or hidden-state changes with protected-collection awarenesssteam_deck_backlog_triage— shortlist Steam Deck-friendly backlog candidatessteam_discovery_router— broad-intent discovery guidance that evaluates plausible discovery surfaces, then chooses one primary path and at most one adjacent fallback across the current validated Steam MCP discovery surfacesteam_recently_played— read-only workflow for inspecting recent play history for the selected Steam usersteam_store_query— read-only authenticated official catalog discovery that preserves official defaults when optional filters are omitted, supports bounded include/exclude facet filtering, and offers opt-in facet enrichmentsteam_featured_scout— read-only marketing-backed workflow for scouting featured/editorial Steam store placements while preserving marketing ordering after enrichment, deduplication, and bounded filteringsteam_release_scout— read-only workflow for upcoming or newly released Steam catalog scouting
STEAM_ID— pin the Steam user ID to useSTEAM_INSTALL_DIR— override the Steam install directorySTEAM_USERDATA_DIR— override the Steam userdata directorySTEAM_MCP_STATE_DIR— override where MCP-owned plans, backups, logs, and metadata cache files are storedSTEAM_STORE_TTL_DAYS— positive integer day count before persisted store metadata is treated as stale and refreshed on next access; defaults to30STEAM_API_KEY— Steam Web API key used for authenticated official catalog access, official similarity prioritization, and owned-game fallback metadata
STEAM_ENABLE_COLLECTION_WRITES— enablesteam_collection_applywhen set to1STEAM_ENABLE_WINDOWS_ORCHESTRATION— when set to1on Windows, best-effort launch Steam during MCP startup, close Steam before each apply call, ensure it is stopped, leave Steam closed after a successful dirty-only apply, and best-effort relaunch it only after a finalize apply or a failed apply if the wrapper stopped itSTEAM_DEFAULT_READ_ONLY_COLLECTIONS— JSON array of collection names to preserve during planning and applySTEAM_DEFAULT_IGNORE_COLLECTIONS— JSON array of collection names excluded from similarity, search, and list filtering when the tool opts in
Default MCP-owned state lives under %LOCALAPPDATA%/steam-mcp/:
plans/backups/logs/metadata/
| Tool | Purpose |
|---|---|
steam_status |
Inspect the detected Steam install, user, backend, and write safety state |
steam_library_list |
Enumerate owned games with filters such as collections, favorites, play state, and Deck status |
steam_library_search |
Search the local library with deterministic match reasons |
steam_store_search |
Search the public Steam store without authenticated session reuse |
steam_store_query |
Query the authenticated official Steam catalog while preserving official defaults for omitted filters, with bounded type, locale, release-state, free-to-play, and human-readable include/exclude facet filters plus opt-in facet enrichment; requires a Steam Web API key |
steam_featured_scout |
Scout authenticated official Steam marketing placements for featured/editorial apps via GetItemsToFeature, with bounded limit, type, and locale guidance plus preserved marketing ordering after official enrichment, deduplication, and bounded filtering; requires a Steam Web API key |
steam_release_scout |
Read-only upcoming/recent release scouting via official catalog access plus public appdetails enrichment, with optional locale passthrough and bounded human-readable facet filters; requires a Steam Web API key |
steam_recently_played |
Read-only recently played game listing via the official Steam Web API; requires a Steam Web API key |
steam_wishlist_on_sale |
Read-only selected-user wishlist sale view derived from official wishlist data plus live public appdetails price_overview; requires a Steam Web API key, reports unknownPriceCount for items with unknown price state, and omits those items from items |
steam_wishlist_details |
Read-only selected-user wishlist items enriched with public appdetails metadata and optional existing Steam Deck status data; requires a Steam Web API key, and missingDetailsCount covers only the scanned slice after any limit |
steam_wishlist_search |
Search enriched selected-user wishlist items with deterministic library-search semantics, optional Deck status filtering, and public appdetails metadata; requires a Steam Web API key |
steam_wishlist_deck_shortlist |
Shortlist selected-user wishlist items for Steam Deck play using existing Deck status data plus deterministic query or seed ranking; requires a Steam Web API key, and query takes precedence when both query and seedAppIds are supplied |
steam_wishlist_discount_summary |
Summarize active selected-user wishlist discounts from fresh public appdetails price_overview, with counts that ignore the returned-item limit; requires a Steam Web API key |
steam_find_similar |
Rank similar library or store candidates with deterministic ranking by default and optional official store prioritization for scope="store" or scope="both" |
steam_collection_plan |
Create a durable preview plan for collection or hidden-state changes |
steam_collection_apply |
Apply a generated plan when writes are enabled; plain apply performs the dirty stage, finalize=true completes finalize, and optional Windows orchestration can close Steam around apply calls, leave Steam closed after a dirty-only apply, and best-effort relaunch after finalize or a failed apply when the wrapper stopped Steam |
steam_export |
Render library or plan data as JSON or Markdown |
steam_link_generate |
Generate store, community, library, and launch links |
- This is a local
stdioMCP server, not a hosted service - The project is Windows-first and assumes a local Steam installation
- Steam store and Steam Deck data are used as read-only enrichment sources
steam_store_queryis read-only, requiresSTEAM_API_KEY, preserves official client defaults when optional filters are omitted, supports bounded human-readable include/exclude genre/category/tag filtering via authoritative cacheable store details, treatsincludeFacetsas opt-in enrichment only, may still return fewer than the requested limit after bounded post-filtering, usesfacetsAvailable=falsewhen no facet payload could be attached for an otherwise valid item, and complements the unauthenticated public-storesteam_store_searchpathsteam_discovery_routeris a prompt-only guidance surface over the existing validated tools; it evaluates plausible discovery surfaces, then chooses one primary path plus at most one adjacent fallback and does not add a new discovery tool or Steam endpoint contractsteam_featured_scoutis read-only, requiresSTEAM_API_KEY, uses authenticated official marketing placements fromGetItemsToFeatureplus official store metadata enrichment, preserves marketing ordering after enrichment, deduplication, and bounded filtering, and is for featured/editorial discovery rather than release scoutingsteam_release_scoutis read-only and fails explicitly when no Steam Web API key is availablesteam_recently_playedis read-only and fails explicitly when no Steam Web API key is available or no selected Steam user can be resolvedsteam_wishlist_on_saleis read-only, requiresSTEAM_API_KEY, derives sale state from live public appdetailsprice_overview, reports items with absent/incomplete/unavailable price metadata viaunknownPriceCount, and omits those unknown-state items fromitems- Wishlist extension tools are read-only, use official wishlist APIs only for selected-user identity/count/item membership, enrich via public appdetails, use existing deterministic search/ranking and Deck status seams, and do not call undocumented wishlist sale/filter/category endpoints or undocumented Deck badge endpoints
steam_wishlist_detailsapplieslimitbefore enrichment, somissingDetailsCountonly reflects the scanned wishlist slice, not the full selected-user wishliststeam_wishlist_deck_shortlistusesqueryin preference toseedAppIdswhen both are supplied in the same requeststeam_wishlist_discount_summaryuses fresh public appdetails price metadata and applieslimitonly to returneditems, not discount or price countssteam_find_similardefaults to deterministic ranking;mode="official"is opt-in, only works withscope="store"orscope="both", and fails explicitly whenSTEAM_API_KEYis unavailable or the selected user cannot be resolved to a SteamID64- Collection changes should follow the plan-first flow: preview with
steam_collection_plan, then apply only after explicit confirmation and with writes enabled - Collection sync is explicitly limited to cloudstorage JSON files; it does not modify
localconfig.vdf, LevelDB,sharedconfig.vdf, or undocumented Steam APIs steam_collection_applyuses a staged flow: omitfinalizefor the default dirty stage, then call again withfinalize=trueto complete finalize- You can close Steam yourself and run the staged flow without orchestration
- When
STEAM_ENABLE_WINDOWS_ORCHESTRATION=1is enabled on Windows, steam-mcp may best-effort start Steam during MCP startup; for a dirty-only apply the wrapper closes Steam if needed and leaves it closed, and after a finalize apply or a failed apply it best-effort relaunches Steam only if the wrapper stopped it - Restart is best-effort only and does not imply Steam cloud sync has completed
- Staged apply requires Steam to stay closed;
requireSteamClosed=falseis rejected
docs/prompts/steam-mcp-agent-prompts.md
If you're working on the repo:
npm run build
npm test
npm run typecheck
npm run clean