Steam MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ITAD_API_KEY | No | Optional IsThereAnyDeal API key to enable catalog-wide deal and price history tools. Get one at https://isthereanydeal.com/apps/ | |
| STEAM_API_KEY | No | Optional Steam Web API key to enable player profile, owned games, achievements, etc. Get one at https://steamcommunity.com/dev/apikey | |
| STEAM_COUNTRY | No | Optional two-letter country code for store price region (e.g., 'US') | |
| STEAM_LANGUAGE | No | Optional store language (e.g., 'english') |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Query Steam games and players. Store data needs no key: search_games → get_game / get_game_reviews for details, get_specials / get_featured for curated store sections, discover_games to find titles catalog-wide by discount / recency / Steam Deck / review quality (e.g. deals, new releases, Deck-Verified games), get_items to price- and rating-check a list of appids in one call, get_game_news and get_global_achievements for a game's news and achievement rarity, get_current_players for one game's live player count, get_charts for what's top-selling / most played on Steam right now. Player data needs a free Steam Web API key (STEAM_API_KEY): get_player_summary, get_owned_games, get_recently_played and get_player_achievements take a 17-digit SteamID64 — use resolve_vanity_url to convert a custom profile name first, and note the target profile must be public. For personalized picks based on a player's own library (not manual filters), use get_recommended_games. Tools that need the key report clearly when it is unset.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| completions | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_gameA | Get full store details for one game: description, price/discount, genres, platforms, release date, developers/publishers, Metacritic, age rating, DLC (the |
| get_review_histogramA | Get how a game's reviews trend over time by appid: a long-term history (rollup_type reports each entry's granularity, e.g. 'week' or 'month', chosen server-side by Steam; capped at the most recent 24 entries) and the recent per-day breakdown (capped at the most recent 30 days), each with positive/negative counts and positive %. Good for 'are reviews improving / did an update hurt reception'. An unknown appid comes back as empty |
| get_pricesA | Get current price and discount for a batch of games by appid in one call — efficient for checking a whole list (e.g. a wishlist) for deals. Handles up to 250 appids; if you also need review %, hardware compatibility or tags, use get_items instead (max 50 appids). Rows come back in the same order as the given appids, one per id (unavailable ones marked available:false — no such appid, not sold in that |
| get_specialsA | List games currently on special (discounted) on the Steam store front page, with the discount % and original/final price. For ALL catalog discounts (not just the front page), use discover_games with min_discount. No API key required. |
| get_featuredA | Get the Steam store's featured sections: specials, top sellers, new releases and coming soon (each a list of games with appid and price), all in one call — for a general 'what's on the store front page' overview. For just current discounts use get_specials (lighter), or discover_games for catalog-wide deals with filters. No API key required. |
| search_gamesA | Search the Steam store by title — term can be partial or approximate, not an exact match; returns matches with their appid (needed by the other game tools), the game's own price, Metacritic score, platforms, type (game, dlc, music for a soundtrack, demo, …) and a clickable store_url, in Steam's relevance order. |
| get_game_newsA | Get recent news / patch notes for a game by appid (title, date, author, excerpt, link). By default this mixes the developer's announcements with third-party press feeds; set kind='official' for the developer's own posts only, or kind='patch_notes' for update notes only (posts the developer tagged as patch notes — if that comes back empty, try 'official'). Each excerpt is the first ~400 characters of the post with HTML stripped — follow |
| get_game_reviewsA | Get the review summary (score label, positive/negative counts, %) and a few reviews for a game by appid — by default the most helpful ones posted in the last 30 days; set order for the newest or most recently edited instead, or within_days to widen/narrow the helpful window. Review text over 600 characters is truncated. An unknown appid comes back with a null summary and counts and no reviews rather than an error; confirm the appid with get_game if that matters. For long-term trend instead of a snapshot, use get_review_histogram. Get the appid from search_games. No API key required. |
| get_global_achievementsA | Get the global unlock percentage of each achievement in a game by appid — how rare each achievement is across all players. Returns each achievement's internal name and its unlock percent (no display names/descriptions — for those, use get_game_achievements), most-common first, capped at the first 200 (check |
| get_itemsA | Get price/discount, review % (positive), hardware compatibility, popular user tags and release date for a LIST of games by appid in ONE keyless call. The efficient way to price-, rating-, tag- and compat-check a wishlist or library without a request per game. For a bigger batch (up to 250 appids) when you only need price, use get_prices instead. An unknown/invalid appid comes back as its own row marked available:false — rows stay in the order you passed them, one per id, never dropped, same as get_prices. Each item carries four compatibility fields, each verified/playable/unsupported/unknown: steam_deck (Steam Deck), steam_os (SteamOS in general), steam_machine (the Steam Machine console specifically), and steam_frame (Steam Frame VR headset); a |
| discover_gamesA | Find games across the whole Steam catalog (keyless), filtered by ANY combination of: discount (min_discount — for 'what's on sale'), release recency (released_after / released_within_days — for 'new games'), hardware compatibility (steam_deck/steam_os/steam_machine/steam_frame — see each field's own description), native OS build (platform — windows/mac/linux), review quality (min_review / min_reviews), and user tags (tags — e.g. ['Roguelike', 'Deckbuilding'] for 'games like X'). Each result returns price/discount, review %, all four compat statuses, a vr_support flag (none/supported/required), popular tags, a clickable store_url, discount_end (when a deal expires) and release date in one call. Examples: '>80% off with 90%+ reviews' → set min_discount + min_review; 'recent well-reviewed games that run on Steam Deck' → set released_within_days + steam_deck + min_review; 'roguelike deckbuilders on sale' → tags:['Roguelike','Deckbuilding'] + min_discount. Base games only: DLC, soundtracks, demos and tools are filtered out, so a 'find DLC on sale' question returns nothing here — price a known DLC appid with get_items instead. No appids needed — unlike get_items, which prices a list you already have. For 'games like X' from a SINGLE named title, get its tags via get_items and pass them here; for taste inferred from the player's WHOLE library instead, use get_recommended_games (key-gated). Filtering: min_discount, released_after/released_within_days, tags, min_review and ONE of steam_deck/steam_machine/steam_frame are applied by Steam across the whole catalog, so a niche combination still finds its games, most popular first ( |
| get_current_playersA | Get how many people are playing a game right now (live concurrent player count) by appid. Get the appid from search_games. No API key required. Errors clearly if the appid is unknown/invalid rather than returning a null count. |
| get_chartsA | Get what is popular on Steam right now as a ranked list. |
| get_followed_gamesA | List the games a player 'follows' on the Steam store, by SteamID64 — a lighter opt-in (get sale/update notifications) that's separate from the wishlist; many players follow more games than they wishlist. No API key required, but the follows/profile must be public — otherwise it returns found:false, which is ALSO what a public account following nothing returns; read |
| get_wishlistA | List a player's Steam wishlist by SteamID64. No API key required, but the wishlist/profile must be public — otherwise it returns found:false, which is ALSO what an empty but public wishlist returns; read |
| get_game_achievementsA | List a game's achievements by appid with their names, descriptions, hidden flag and global unlock % (rarity), in the game's own definition order (capped at the first 150; check |
| resolve_vanity_urlA | Convert a Steam custom (vanity) profile name — the part after /id/ in a profile URL — into the 17-digit SteamID64 that the player tools need. Requires STEAM_API_KEY. Returns found:false if the name doesn't resolve to a profile. |
| get_friend_listA | List a player's Steam friends by SteamID64: name, online state, current game and how long they've been friends, most-recently-added first (capped at the 100 most-recently-added; check |
| find_friends_who_ownA | Check which of a player's Steam friends own one or more games by appid, with each owner's playtime_hours — 'which of my friends have Portal 2 and how long have they played'. Checks each friend's FULL library, unlike get_owned_games whose own list stops at 50 games by playtime by default — so a friend's rarely-played or unplayed copy is never missed (its playtime_hours may still be low or 0). For the PLAYER'S OWN ownership instead of a friend's, use get_owned_games's check_appids. Requires STEAM_API_KEY and the player's OWN friends list to be public — otherwise the whole call returns found:false, which also covers a SteamID64 with no account behind it; read |
| compare_playersA | Find games two players both own, with each one's playtime — 'what can my friend and I both play', 'do we have anything in common'. Checks each player's FULL library to find every shared game, unlike get_owned_games whose own list stops at 50 by playtime by default — but the returned list here is itself capped at the top 50 shared games by combined playtime (check |
| get_player_summaryA | Get a player's profile by SteamID64: display name, online state, country, account age, Steam level (a separate lookup that degrades to null on failure, independently of profile privacy), and the game they're currently in. found:false here means exactly one thing — no account with that SteamID64 — since this tool reads private profiles fine. Requires STEAM_API_KEY, but works even for a private profile (visibility reports 'private') — country, account age and the current game only populate when the profile is public. For VAC/game/trade ban status instead, use get_player_bans. |
| get_player_bansA | Check a player's VAC, game, community and economy (trade) ban status by SteamID64 — 'is this player banned', useful before trading or adding a friend. Ban status is always public — this works even when the rest of the profile is private. |
| get_owned_gamesA | List the games a player owns with playtime (hours), ordered by playtime — most-played first by default, least-played first with sort='playtime_asc' (the |
| get_recently_playedA | List the games a player has played in the last two weeks, with recent and total playtime, most-played-in-those-two-weeks first (capped at 50; check |
| get_recommended_gamesA | Recommend unowned Steam catalog games personalized to this player: tags on their own most-played owned games become weighted preferences (more playtime on a tag = more weight), discounted by each candidate's review score so a tag match on a poorly-received game doesn't outrank a better one, then ranked against a broad catalog page, excluding anything already owned. |
| get_player_achievementsA | Get a player's achievement progress for one game (unlocked count, % complete, per-achievement unlock dates) by SteamID64 + appid — |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| what_should_i_play | Recommend games from the Steam catalog based on a player's library and taste, excluding what they already own. |
| is_it_worth_buying | Gather price, reviews (lifetime + recent trend) and Steam Deck compatibility for a buying verdict. game is optional — if omitted, asks which game instead of failing. |
| deals_digest | A curated list of well-reviewed discounted games from Steam's catalog. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 26 tools
There are real clusters of overlapping tools (get_prices/get_items/discover_games/get_specials/get_featured; get_owned_games/get_recently_played/compare_players; the three achievement tools; get_reviews/get_review_histogram), but nearly every description explicitly says when to use a sibling instead, and states the key gating (key vs keyless, batch limits, full-library vs capped). An agent can resolve almost every choice from the descriptions alone; a couple of store/catalog boundaries (get_featured vs get_specials vs discover_games) still take careful reading.
All 26 tools use snake_case verb_noun form with domain-appropriate verbs (get_, search_, discover_, compare_, find_, resolve_). No camelCase or vague verb-only names; get_friend_list is the only minor noun-phrase deviation and still follows get_<resource>.
At 26 tools the surface is heavy, exceeding the typical 3-15 sweet spot and crossing the 25+ threshold. The breadth is genuinely earned by a wide domain (store catalog, deals, library, wishlist, friends, achievements, reviews, profiles), but a few clusters (get_prices vs get_items, get_specials vs get_featured vs discover_games) could be consolidated.
Coverage is strong for a read-only Steam surface: search, details, prices/items, discovery, deals, charts, library, wishlist, follows, friends, achievements (catalog/global/player), reviews and histograms, news, players, bans and vanity resolution. Minor gaps remain (no bundle/package or market/workshop lookups, no similar-games endpoint beyond tag-based discovery), but these are workarounds rather than dead ends.