steam-mcp
# steam-mcp
> An [MCP](https://modelcontextprotocol.io) server that exposes the **Steam Web API** to any AI harness — Claude Desktop, Claude Code, Cursor, Cline, Windsurf, or anything that speaks the Model Context Protocol.
Ask your assistant things like *"How many hours have I put into Team Fortress 2?"*, *"What are the most-played games my friend owns?"*, or *"Summarize the reviews for Baldur's Gate 3"* — and it fetches the answer live from Steam.
[](https://github.com/rachittshah/steam-mcp/actions/workflows/ci.yml)
[](./LICENSE)
[](https://www.python.org/downloads/)
---
## Why
The Steam Web API is powerful but sprawling: dozens of interfaces, inconsistent shapes, 64-bit SteamIDs, an undocumented store API, and a mandatory key for anything player-related. `steam-mcp` wraps the useful parts behind a small, well-documented set of **workflow-oriented** MCP tools that return LLM-friendly, token-efficient responses.
## Quickstart
You need a Steam Web API key for player/profile tools. Get one (free) at
<https://steamcommunity.com/dev/apikey>. Store tools (app details, reviews, search) work **without** a key.
Run it straight from GitHub with no install using [`uv`](https://docs.astral.sh/uv/)
(works today — PyPI release pending):
```bash
STEAM_API_KEY=xxxxxxxx uvx --from git+https://github.com/rachittshah/steam-mcp steam-mcp
```
Or install it from source:
```bash
uv pip install git+https://github.com/rachittshah/steam-mcp
# once published to PyPI: uv pip install steam-mcp
```
### Claude Desktop / Claude Code
Add to your MCP config (`claude_desktop_config.json`, or `.mcp.json` for Claude Code):
```json
{
"mcpServers": {
"steam": {
"command": "uvx",
"args": ["--from", "git+https://github.com/rachittshah/steam-mcp", "steam-mcp"],
"env": { "STEAM_API_KEY": "your-key-here" }
}
}
}
```
(After a PyPI release the `args` simplify to `["steam-mcp"]`.)
### Cursor / Cline / Windsurf
Point the MCP server command at the same `uvx --from git+... steam-mcp` invocation and
set `STEAM_API_KEY` in the environment. See [`docs/clients.md`](./docs/clients.md) for
per-client instructions.
## Configuration
| Variable | Required | Default | Description |
| --------------------- | -------- | ---------- | ---------------------------------------------------- |
| `STEAM_API_KEY` | for player tools | — | Steam Web API key. |
| `STEAM_MCP_TIMEOUT` | no | `20` | HTTP request timeout (seconds). |
| `STEAM_MCP_LANGUAGE` | no | `english` | Language for localized store responses. |
| `STEAM_MCP_COUNTRY` | no | `US` | ISO country code for store pricing. |
## Tools
The full, generated tool reference lives in [`docs/tools.md`](./docs/tools.md). Highlights:
- **Identity** — `resolve_vanity_url`, `get_player_summary`, `get_player_bans`, `get_steam_level`
- **Library** — `get_owned_games`, `get_recently_played_games`, `get_friend_list`
- **Achievements & stats** — `get_player_achievements`, `get_game_schema`, `get_global_achievement_percentages`, `get_current_player_count`
- **Store** — `get_app_details`, `get_app_reviews`, `search_store`
- **News** — `get_news_for_app`
## Example prompts
Once connected, try asking your assistant:
- *"How many people are playing Counter-Strike 2 right now?"* → `search_store` → `get_current_player_count`
- *"What's the rarest achievement in Team Fortress 2?"* → `get_global_achievement_percentages`
- *"Summarize the recent reviews for Elden Ring."* → `search_store` → `get_app_reviews`
- *"Whose profile is steamcommunity.com/id/gabelogannewell, and what are they playing?"* → `get_player_summary`
- *"What are my 5 most-played games?"* (needs your SteamID) → `get_owned_games`
- *"Any recent patch notes for Dota 2?"* → `get_news_for_app`
## Development
```bash
git clone https://github.com/rachittshah/steam-mcp
cd steam-mcp
uv venv && source .venv/bin/activate
uv pip install -e ".[dev]"
ruff check . && mypy src && pytest
```
## Contributing
Contributions welcome — see [CONTRIBUTING.md](./CONTRIBUTING.md).
## License
[MIT](./LICENSE) © Rachitt Shah. Not affiliated with or endorsed by Valve Corporation.
Steam and the Steam logo are trademarks of Valve Corporation.
TDQS
Scored across 15 tools
Each tool targets a distinct resource and action: player basics, friend lists, owned games, achievements, store search, reviews, and news. The only potential overlap is between owned games and recent playtime, but the descriptions make the timeframe distinction clear.
All tool names follow the same verb_noun snake_case pattern (get_, search_, resolve_). Even the two non-get verbs are still consistent with the pattern, resulting in a very predictable and uniform API surface.
15 tools is at the upper end of the ideal range, but every tool covers a meaningful feature: player info, game stats, store details, and reviews. No tool feels redundant, and the count aligns well with Steam's broad domain.
The set covers the major workflows: resolving users, fetching profiles/bans/friends, listing owned and recent games, checking achievements, and getting store details/reviews/news. Minor gaps exist (e.g., no wishlist access or player review listing), but these are not dead ends for standard queries.