steam-mcp
The steam-mcp server connects Claude to your Steam library via the Model Context Protocol, enabling natural language queries about your games.
Get Full Library (
get_library): Retrieve your complete Steam game library with titles, playtime, and last-played dates, with an option to include or exclude unplayed games.Get Recently Played Games (
get_recently_played): Fetch games played in the last 2 weeks, showing playtime for that period and total playtime overall.Search & Filter Library (
search_library): Search by game name, filter by min/max playtime, or show only unplayed games.Get Game Details (
get_game_details): Look up store metadata for any game (by name or App ID), including description, genres, tags, release date, Metacritic score, and price.Refresh Cache (
refresh_library): Clear the local cache to force fresh data from Steam — useful after new purchases.
Provides access to a user's Steam library, enabling queries for game playtime, recently played titles, and detailed game metadata including genres, tags, Metacritic scores, and pricing.
steam-mcp
A local Model Context Protocol (MCP) server that connects Claude to your Steam library. Ask natural-language questions about your games without ever touching the API yourself.
"What have I been playing lately?"
"Suggest something from my backlog I haven't touched yet."
"How many hours have I put into RPGs?"
"Tell me about Elden Ring."Tools
Tool | What it does |
| Your full game library — title, playtime, last played |
| Games played in the last 2 weeks |
| Filter by name, playtime range, or unplayed status |
| Store metadata — genres, tags, Metacritic score, price |
| Clear the cache to fetch fresh data from Steam |
Related MCP server: steam-mcp
Requirements
Node.js 18+
A Steam account with a public profile and library
A Steam Web API key (free, takes 30 seconds to get)
Setup
1. Get a Steam API key
Go to steamcommunity.com/dev/apikey, log in, and register a key. The domain field can be anything (e.g., localhost).
2. Find your Steam ID
You need either:
Your vanity URL username — the custom part of your profile URL:
steamcommunity.com/id/YOUR_USERNAMEYour 64-bit Steam ID — find it at steamid.io if you don't have a vanity URL
3. Make your profile public
In Steam: your profile → Edit Profile → Privacy Settings → set My Profile and Game details to Public.
4. Run setup
npx steam-mcp setupThis validates your credentials and writes the Claude Desktop config automatically. Restart Claude Desktop when it's done.
Find your Claude Desktop config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Add to the mcpServers section:
{
"mcpServers": {
"steam-mcp": {
"command": "npx",
"args": ["-y", "steam-mcp"],
"env": {
"STEAM_API_KEY": "your_api_key_here",
"STEAM_ID": "your_vanity_url_or_64bit_id"
}
}
}
}Local development
git clone https://github.com/jkiley129/steam-mcp.git
cd steam-mcp
npm install
cp .env.example .env
# Edit .env with your API key and Steam ID
npm run buildTo use the local build with Claude Desktop, point the config at the built file:
{
"mcpServers": {
"steam": {
"command": "node",
"args": ["/absolute/path/to/steam-mcp/dist/index.js"],
"env": {
"STEAM_API_KEY": "your_api_key_here",
"STEAM_ID": "your_vanity_url_or_64bit_id"
}
}
}
}Configuration
Environment variable | Required | Description |
| Yes | Your Steam Web API key |
| Yes | Your 64-bit Steam ID or vanity URL username |
| No | Override cache directory (default: |
Caching
Steam data is cached locally to keep responses fast and avoid hitting rate limits:
Data | Cache TTL |
Library | 1 hour |
Recently played | 30 minutes |
Game details | 24 hours |
Use the refresh_library tool to clear the cache immediately (e.g., after buying new games).
Troubleshooting
"Steam returned no library data" Your Steam profile or game library is set to private. Go to Steam → your profile → Edit Profile → Privacy Settings and set both to Public.
"Could not resolve Steam vanity URL"
Check that STEAM_ID matches the username in your Steam profile URL (steamcommunity.com/id/YOUR_USERNAME). Alternatively, use your numeric 64-bit Steam ID.
"Could not validate Steam API key" Verify your API key at steamcommunity.com/dev/apikey. Keys are tied to your Steam account login.
Tools not showing in Claude
Restart Claude Desktop fully (quit from the system tray, not just close the window) after editing the config file. Check that Node.js 18+ is installed by running node --version in a terminal.
License
MIT
Available Tools
5 toolsget_game_detailsA
Get store details for a game — description, genres, tags, release date, Metacritic score, and price. Accepts game name or appid.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Game name (case-insensitive substring match against your library) | |
| appid | No | Steam app ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries the full burden. It describes a read operation ('Get store details') but does not disclose any behavioral traits such as authentication needs, rate limits, error handling, or what happens if the game is not found.
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 concise sentences that efficiently convey the tool's purpose and accepted parameters. 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?
Without an output schema, the description lists the fields returned (description, genres, tags, release date, Metacritic score, price), providing completeness for a simple lookup tool. It does not mention error behavior or handling multiple matches, but overall it is sufficient for the tool's complexity.
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 100% with both parameters described. The description adds value for the 'name' parameter by specifying 'case-insensitive substring match against your library', which is not in the schema. For 'appid', no extra information is added beyond schema, but overall it augments parameter understanding.
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?
Description clearly states the tool gets store details for a game, listing specific fields (description, genres, tags, release date, Metacritic score, price) and notes it accepts game name or appid. This distinguishes it from sibling tools like get_library or search_library.
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?
Description implies usage for retrieving store details of a specific game but does not explicitly state when to use this tool vs siblings or any exclusions. The sibling tool names provide context, but the description itself lacks guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_libraryA
Get your full Steam game library with playtime and last-played date for each game.
| Name | Required | Description | Default |
|---|---|---|---|
| include_unplayed | No | Include games with 0 playtime (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the tool returns playtime and last-played date for each game, which is helpful. However, with no annotations provided, it lacks details on authentication requirements, rate limits, or whether the tool requires user authorization. The behavior is partially transparent.
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 sentence of 13 words, front-loaded with the main action and resource. Every word is informative with no redundancy or extraneous content.
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 tool with one optional parameter and no output schema, the description adequately covers what the tool returns. It could mention authentication needs, but overall it is sufficiently complete given the low complexity.
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 provides a description for the lone parameter (include_unplayed) with 100% coverage. The tool description does not add additional meaning about the parameter beyond what the schema offers, so a baseline score of 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 clearly states the verb 'Get', the resource 'full Steam game library', and specifies the returned data (playtime and last-played date). It effectively distinguishes from siblings like get_game_details (specific game) and get_recently_played (subset).
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 the full library is needed, but it does not explicitly state when to use this tool versus alternatives, such as get_recently_played for recently played games or search_library for filtered queries. No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recently_playedB
Get games played in the last 2 weeks, with hours played this period and total.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of games to return (default: 10, max: 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears full responsibility for behavioral disclosure. It does not mention authentication, rate limits, side effects, or confirm read-only nature. The description only states what is returned, not operational characteristics.
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 sentence with no extraneous words. It is front-loaded with the core purpose and efficiently conveys key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a simple list tool with one parameter and no output schema. It mentions returned fields (hours this period and total) but lacks full structure or format details. For a tool with no output schema, more completeness would help.
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 100% for the single parameter 'count', which already has a description. The tool description adds no extra value beyond the schema; it mentions returned data but not how the parameter affects results. 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 clearly states the verb 'Get' and the resource 'games played in the last 2 weeks', specifying the time window and the data returned (hours this period and total). It effectively distinguishes from siblings like get_game_details or search_library.
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 no guidance on when to use this tool versus alternatives. There is no mention of context, exclusions, or explicit comparisons to siblings, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_libraryA
Clear the local cache so the next query fetches fresh data from Steam. Use after buying new games.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description discloses that the tool clears a cache and affects subsequent queries, which is important behavioral info. However, with no annotations, it could further detail side effects (e.g., rate limits, auth requirements) or confirm idempotency.
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 concise sentences that front-load the purpose and usage. No unnecessary 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 zero-parameter tool with no output schema, the description fully covers what the tool does and when to use it. No missing context.
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?
No parameters exist, so schema coverage is 100%. Description adds no parameter information, but this is acceptable per the baseline of 4 for zero-parameter tools.
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?
Description clearly states the action (clear local cache) and the resource (cache for Steam queries). It distinguishes from sibling tools like get_library and search_library by focusing on cache refresh rather than data retrieval.
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 when to use: 'Use after buying new games.' This provides clear context, though it does not mention when not to use or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_libraryC
Search and filter your Steam library by name, playtime range, or unplayed status.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return (default: 20) | |
| query | No | Case-insensitive name search | |
| max_hours | No | Maximum playtime in hours | |
| min_hours | No | Minimum playtime in hours | |
| unplayed_only | No | Only return games with 0 playtime |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full responsibility for behavioral disclosure. It indicates a read-like operation (search/filter) but does not mention side effects, authentication needs, rate limits, or behavior when no matches are found. The description is too brief to be transparent about operational characteristics.
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, clear sentence that covers the tool's purpose and filter dimensions. It is appropriately concise with no wasted words. However, it lacks any structural elements (e.g., separate lines for behavior or examples) that could improve scannability.
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 tool with 5 optional parameters and no output schema, the description only covers what the tool does, not what it returns or critical edge cases (e.g., conflicting filters, pagination default limit). While adequate for simple use, it leaves gaps that could confuse an agent, especially given the absence of annotations.
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 100%, and each parameter has a description in the input schema. The description rephrases the filter criteria (name, playtime range, unplayed status) but adds no new semantic constraints or contextual guidance beyond the schema. It meets the baseline for a high-coverage 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 clearly states the tool searches and filters the Steam library by name, playtime range, or unplayed status. It specifies the verb ('Search and filter') and resource ('your Steam library'), and the filter criteria distinguish it from sibling tools like 'get_library' which likely returns all items. However, it could be more explicit about the action (e.g., 'returns a list of matching games') to avoid 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 description provides no guidance on when to use this tool versus its siblings (get_game_details, get_library, get_recently_played, refresh_library). It does not explain when filtering is beneficial, nor does it mention prerequisites or alternatives, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
- Added
get_game_details - Added
get_library - Added
get_recently_played - Added
refresh_library - Added
search_library
TDQS
Scored across 5 tools
Each tool has a distinct purpose: store details, full library, recent games, cache refresh, and library search. No overlap between tools.
All tools follow a verb_noun pattern using snake_case (get_, refresh_, search_). Verbs are descriptive and consistent across the set.
5 tools is well-scoped for a Steam library server, covering browsing, searching, details, and cache management without unnecessary bloat.
Core library operations (view, search, details, cache) are covered. Minor gaps like achievements or wishlist management, but these are reasonable omissions for the scope.
Maintenance
Related MCP Connectors
Private persistent memory for Claude, ChatGPT & Gemini via MCP - semantic search, zero-code setup.
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
- mcpOAuthai.butlerbrain
Persistent memory for AI assistants. Save once; recall from Claude, ChatGPT, or any MCP client.
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Related MCP Servers
- AlicenseAqualityBmaintenanceExposes Steam Web API tools as MCP resources for Claude Code, Claude Desktop, and Gemini CLI, enabling profile lookups, game searches, achievement tracking, and more.1118 npm1MIT
- AlicenseAqualityDmaintenanceMCP Server for the Steam Web API — access player profiles, game libraries, achievements, news, friend lists, and store search through Claude.2018 npm3MIT
- AlicenseAqualityDmaintenanceA local MCP server that lets Claude fetch data from your Steam game library via the Steam Web API. All tools are read-only.5Apache 2.0
- FlicenseNot gradedqualityCmaintenanceProvides access to your Steam game library data through Claude Desktop, enabling game search, filtering, details, recommendations, and statistics.7-