Skip to main content
Glama
README.md
# Steam MCP Server

A local MCP server that lets Claude fetch data from your Steam game library via
the Steam Web API. All tools are **read-only** — the server never modifies your account.

## Tools

| Tool | What it does |
|---|---|
| `steam_get_owned_games` | Lists owned games with total playtime, sorted by playtime or name |
| `steam_get_recently_played_games` | Games played in the last ~2 weeks |
| `steam_get_player_summary` | Profile info: name, status, currently playing, account creation date |
| `steam_get_player_achievements` | Achievements for a specific game (requires appid) |
| `steam_resolve_vanity_url` | Converts a custom profile URL to a SteamID64 |

## Prerequisites

1. **Steam Web API key** — get one for free at <https://steamcommunity.com/dev/apikey>
   (requires a logged-in Steam account; enter any domain, e.g. `localhost`).
2. **Your SteamID64** — the 17-digit number for your account. Find it via
   your profile URL, or use `steam_resolve_vanity_url` if you have a custom URL.
3. **Profile must be public** — under Steam → Profile → Edit Profile →
   Privacy, "Game details" must be set to **Public**, otherwise library
   and achievement calls will return empty.
4. **[uv](https://docs.astral.sh/uv/) installed** — `curl -LsSf https://astral.sh/uv/install.sh | sh`
5. **Python 3.10+** (uv will manage this automatically).

## Installation

```bash
uv sync
```

## Connecting to Claude

The server uses stdio transport and runs as a local subprocess. It works
with MCP clients such as **Claude Desktop** and **Claude Code**.

### Claude Desktop

Open the config file (Settings → Developer → Edit Config) and add the server.
Replace the paths and values with your own:

```json
{
  "mcpServers": {
    "steam": {
      "command": "uv",
      "args": ["run", "--directory", "/full/path/to/steam-api-mcp", "src/steam_mcp.py"],
      "env": {
        "STEAM_API_KEY": "YOUR_API_KEY_HERE",
        "STEAM_ID": "YOUR_STEAMID64_HERE"
      }
    }
  }
}
```

`STEAM_ID` is optional. If set, you won't need to provide your own ID in every
request — the tools fall back to this value. You can still pass a different
`steam_id` to look at a friend's (public) profile.

Restart Claude Desktop after saving. You can then ask things like:

- "Which 10 games have I played the most on Steam?"
- "What have I played in the last two weeks?"
- "How many achievements do I have in appid 570?"

### Claude Code

```bash
claude mcp add steam uv run --directory /full/path/to/steam-api-mcp src/steam_mcp.py \
  --env STEAM_API_KEY=YOUR_KEY --env STEAM_ID=YOUR_STEAMID64
```

## Testing Outside a Client

With MCP Inspector you can click through the tools manually:

```bash
STEAM_API_KEY=your_key STEAM_ID=your_id \
  npx @modelcontextprotocol/inspector uv run src/steam_mcp.py
```

## Privacy and Limitations

- The API only returns data a profile has made public.
- Your key is stored in the client config / environment variables and is never
  sent anywhere other than Steam.
- The Steam Web API has reasonable rate limits (approx. 100,000 calls/day). The server
  returns a clear 429 message if you hit a temporary limit.

TDQS

A4.4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool serves a distinct Steam function: owned games, achievements, profile summary, recently played games, and vanity URL resolution. No two tools overlap in purpose.

Naming Consistency5/5

All tools follow a consistent 'steam_verb_noun' pattern in snake_case, with clear and predictable naming.

Tool Count5/5

With 5 tools, the server is focused and well-scoped, covering essential Steam user data queries without unnecessary bloat.

Completeness4/5

The set covers core user data (owned games, recent games, achievements, profile, vanity resolution). A minor gap is the lack of game detail retrieval, but it is reasonable for a focused server.

Maintenance

ActivityInactive
ResponsivenessNo issues