Steam MCP Server
# Steam MCP Server
An MCP (Model Context Protocol) server that provides tools for interacting with the Steam Web API.
## Setup
### 1. Get a Steam API Key
Obtain an API key from [Steam's developer portal](https://steamcommunity.com/dev/apikey).
### 2. Install Dependencies
```bash
npm install
```
### 3. Build
```bash
npm run build
```
### 4. Configure Your MCP Client
#### Claude Code
Add to your Claude Code settings file (`~/.claude/settings.json`):
```json
{
"mcpServers": {
"steam": {
"command": "node",
"args": ["/path/to/steam-mcp-server/dist/index.js"],
"env": {
"STEAM_API_KEY": "your-api-key-here",
"STEAM_ID": "your-64-bit-steam-id"
}
}
}
}
```
Or use npx (no build required):
```json
{
"mcpServers": {
"steam": {
"command": "npx",
"args": ["-y", "@sharkusmanch/steam-mcp-server"],
"env": {
"STEAM_API_KEY": "your-api-key-here",
"STEAM_ID": "your-64-bit-steam-id"
}
}
}
}
```
#### Claude Desktop
Add to your Claude Desktop configuration:
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
```json
{
"mcpServers": {
"steam": {
"command": "npx",
"args": ["-y", "@sharkusmanch/steam-mcp-server"],
"env": {
"STEAM_API_KEY": "your-api-key-here",
"STEAM_ID": "your-64-bit-steam-id"
}
}
}
}
```
#### Cursor
Add to Cursor's MCP settings (`.cursor/mcp.json` in your project or global config):
```json
{
"mcpServers": {
"steam": {
"command": "npx",
"args": ["-y", "@sharkusmanch/steam-mcp-server"],
"env": {
"STEAM_API_KEY": "your-api-key-here",
"STEAM_ID": "your-64-bit-steam-id"
}
}
}
}
```
#### Windsurf
Add to Windsurf's MCP configuration (`~/.windsurf/mcp.json`):
```json
{
"mcpServers": {
"steam": {
"command": "npx",
"args": ["-y", "@sharkusmanch/steam-mcp-server"],
"env": {
"STEAM_API_KEY": "your-api-key-here",
"STEAM_ID": "your-64-bit-steam-id"
}
}
}
}
```
## Environment Variables
| Variable | Required | Description |
|----------|----------|-------------|
| `STEAM_API_KEY` | Yes | Your Steam Web API key |
| `STEAM_ID` | No | Default Steam ID to use when not specified in tool calls |
| `STEAM_HTTP_TIMEOUT_MS` | No | Per-request timeout for Steam API calls in milliseconds (default `10000`) |
When `STEAM_ID` is set, you can call tools like `get_owned_games` without passing a Steam ID - it will use your default profile automatically.
## Reliability & Pagination
- Every Steam API request is bounded by a timeout (`STEAM_HTTP_TIMEOUT_MS`) and automatically retries transient failures (timeouts, HTTP 429, and 5xx) with exponential backoff. Non-retriable errors (401/403/404) fail fast with a clear, actionable message, and failures are returned with `isError: true`.
- List-returning tools accept `limit` and `offset` and return a consistent envelope with the pre-slice total and a `has_more` flag, e.g. `{ "total_games": 412, "returned": 50, "offset": 0, "has_more": true, "games": [...] }`. `get_inventory` additionally returns a `next_cursor` (Steam `start_assetid`) for deep paging.
- `search_apps` uses Steam's relevance-ranked storefront search (no full-catalog download), so it returns the top matches quickly and reliably.
## Available Tools
### Social & Profile
| Tool | Description |
|------|-------------|
| `get_player_summary` | Get player profile info (name, avatar, status, current game) |
| `get_friends_list` | Get a player's friends list |
| `get_steam_level` | Get player's Steam account level |
| `get_badges` | Get player's badges, XP, and level progression |
| `get_badge_progress` | Get trading card collection progress |
| `get_player_bans` | Check for VAC bans, game bans, or trade bans |
| `get_user_groups` | Get Steam groups a player belongs to |
| `resolve_vanity_url` | Convert vanity URL to 64-bit Steam ID |
### Game Library
| Tool | Description |
|------|-------------|
| `get_owned_games` | Get all games owned with playtime stats (supports pagination) |
| `get_recently_played` | Get games played in last 2 weeks |
| `get_game_details` | Get detailed game info (description, price, requirements) |
| `is_playing_shared_game` | Check if playing via Steam Family Sharing |
| `search_apps` | Search Steam catalog by game name |
### Achievements & Stats
| Tool | Description |
|------|-------------|
| `get_achievements` | Get player's achievements for a game |
| `get_game_stats` | Get player's statistics for a game |
| `get_global_achievement_percentages` | Get global achievement unlock rates |
| `get_global_game_stats` | Get global aggregated stats for a game |
| `get_perfect_games` | Get games where player has 100% achievements |
| `get_achievement_summary` | Get condensed achievement progress across games |
| `get_game_schema` | Get achievement/stat definitions for a game |
### Game Info
| Tool | Description |
|------|-------------|
| `get_game_news` | Get latest news and patch notes for a game |
| `get_player_count` | Get current number of players in a game |
| `get_servers_at_address` | Get game servers at a specific IP |
| `check_app_update` | Check if an app version is up to date |
### Inventory
| Tool | Description |
|------|-------------|
| `get_inventory` | Get inventory for any game (requires public profile) |
| `get_tf2_inventory` | Get Team Fortress 2 inventory |
| `get_csgo_inventory` | Get CS2/CSGO inventory |
| `get_dota2_inventory` | Get Dota 2 inventory |
## Finding Your Steam ID
Use `resolve_vanity_url` with your custom profile URL, or find your 64-bit Steam ID at [steamid.io](https://steamid.io/).
## License
MIT
TDQS
Scored across 34 tools
Most tools have clearly distinct purposes targeting specific resources like achievements, inventories, player data, or trade operations. However, some overlap exists between inventory tools (e.g., get_inventory vs. game-specific inventories like get_csgo_inventory) and between trade-related tools (get_trade_offers vs. get_trade_offers_summary), which could cause minor confusion.
All tools follow a consistent verb_noun naming pattern with clear, descriptive names. The pattern is uniformly applied across all 34 tools, using verbs like 'get', 'check', 'resolve', and 'search' followed by specific nouns, making them predictable and easy to understand.
With 34 tools, the count feels excessive for a Steam API server, leading to potential bloat and complexity. While Steam has many features, the server could benefit from consolidation or better scoping, as some tools (e.g., multiple trade-related tools) might be redundant or overly granular for typical agent use cases.
The tool set provides comprehensive coverage of the Steam domain, including player profiles, games, achievements, inventories, trades, and community features. It supports CRUD-like operations where applicable (e.g., fetching data) and covers key workflows without obvious gaps, ensuring agents can handle most Steam-related tasks effectively.