steam-mcp 0.8.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- steam_mcp-0.8.0/.gitignore +18 -0
- steam_mcp-0.8.0/CHANGELOG.md +102 -0
- steam_mcp-0.8.0/LICENSE +26 -0
- steam_mcp-0.8.0/PKG-INFO +187 -0
- steam_mcp-0.8.0/PRIVACY.md +50 -0
- steam_mcp-0.8.0/README.md +155 -0
- steam_mcp-0.8.0/pyproject.toml +58 -0
- steam_mcp-0.8.0/steam_mcp/__init__.py +3 -0
- steam_mcp-0.8.0/steam_mcp/server.py +3149 -0
- steam_mcp-0.8.0/tests/test_steam_mcp.py +494 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.py[cod]
|
|
3
|
+
*.egg-info/
|
|
4
|
+
build/
|
|
5
|
+
dist/
|
|
6
|
+
.venv/
|
|
7
|
+
venv/
|
|
8
|
+
.env
|
|
9
|
+
.pytest_cache/
|
|
10
|
+
.mypy_cache/
|
|
11
|
+
|
|
12
|
+
# Packaging outputs (build them on release; don't commit)
|
|
13
|
+
*.mcpb
|
|
14
|
+
_build_out.txt
|
|
15
|
+
PUBLISHING.md
|
|
16
|
+
_*.bat
|
|
17
|
+
/_*.py
|
|
18
|
+
/_*.txt
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here. Versions follow
|
|
4
|
+
[Semantic Versioning](https://semver.org/).
|
|
5
|
+
|
|
6
|
+
## [0.8.0]
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
- `steam_find_friends_who_own` — which of a user's friends own (or are right now
|
|
10
|
+
playing) a given game, with each owner's playtime and live status. Answers
|
|
11
|
+
"who can I play X with". Checks friends concurrently; friends with private
|
|
12
|
+
libraries are reported separately rather than guessed.
|
|
13
|
+
- `steam_get_rarest_unlocks` — a player's rarest unlocked achievements in a game,
|
|
14
|
+
joining their unlocks with global unlock rarity to surface their best "flexes".
|
|
15
|
+
- `steam_get_app_tags` — a game's top community tags (Souls-like, Roguelike,
|
|
16
|
+
Cozy, …) by player weight — the sub-genre/vibe signal Steam's official genres
|
|
17
|
+
miss. Built from the storefront item API plus its public tag dictionary; no key.
|
|
18
|
+
|
|
19
|
+
## [0.7.0]
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
- `steam_get_dlc` — list a game's DLC (add-ons) with live prices and an
|
|
23
|
+
on-sale filter, resolving the bare DLC appids that `steam_get_app_details`
|
|
24
|
+
exposes into names + prices. Enrichment runs concurrently.
|
|
25
|
+
- `steam_get_user_game_stats` — a user's in-game stats (kills, wins, distance,
|
|
26
|
+
etc.) for a specific game, via `ISteamUserStats/GetUserStatsForGame`. The
|
|
27
|
+
numeric counterpart to per-game achievements.
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
- **Performance:** all HTTP now goes through one shared, pooled `httpx`
|
|
31
|
+
AsyncClient (keep-alive instead of a new connection per request), and the
|
|
32
|
+
fan-out tools (wishlist enrichment, DLC, player comparison) issue their
|
|
33
|
+
lookups concurrently with bounded parallelism instead of serially.
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
- **International pricing:** `steam_search_apps`, `steam_get_featured_specials`,
|
|
37
|
+
`steam_get_store_highlights`, and `steam_get_package_details` now format
|
|
38
|
+
prices in the requested country's currency (e.g. `£`, `€`) instead of always
|
|
39
|
+
prefixing `$`.
|
|
40
|
+
- **Reviews tool registration:** the `@mcp.tool` decorator for
|
|
41
|
+
`steam_get_app_reviews` was attached to an internal helper, so the exposed
|
|
42
|
+
tool was mis-wired. It is now bound to the correct function.
|
|
43
|
+
|
|
44
|
+
## [0.6.0]
|
|
45
|
+
|
|
46
|
+
### Added
|
|
47
|
+
- **In-memory TTL cache** for static storefront/API responses (app details,
|
|
48
|
+
package details, store highlights, game schemas, global achievement
|
|
49
|
+
percentages). Speeds up tools that fan out many lookups (wishlist enrichment,
|
|
50
|
+
comparisons) and eases the Steam rate limit. Live/user data is never cached.
|
|
51
|
+
- **Test suite** (`tests/`, `pytest`): pure-helper unit tests, TTL-cache tests,
|
|
52
|
+
and tool-logic tests with mocked HTTP (no network or API key needed).
|
|
53
|
+
|
|
54
|
+
### Changed
|
|
55
|
+
- `.mcpbignore` and the sdist file list tidied so bundles/sdists stay lean.
|
|
56
|
+
|
|
57
|
+
## [0.5.0]
|
|
58
|
+
|
|
59
|
+
### Added
|
|
60
|
+
- `steam_analyze_library` — whole-library analysis: backlog (never-played),
|
|
61
|
+
playtime histogram, most-played with last-played dates, recently active, and
|
|
62
|
+
"abandoned" games (played but untouched for a configurable window).
|
|
63
|
+
|
|
64
|
+
### Changed
|
|
65
|
+
- `steam_get_app_details` is now comprehensive: play modes (single-player /
|
|
66
|
+
co-op / online & local co-op), controller support, platforms, developers &
|
|
67
|
+
publishers, DLC, supported languages (with full-audio flags), Metacritic,
|
|
68
|
+
review and achievement counts, mature-content flags, optional PC requirements,
|
|
69
|
+
and a `features` boolean object for easy filtering.
|
|
70
|
+
|
|
71
|
+
## [0.4.0]
|
|
72
|
+
|
|
73
|
+
### Added
|
|
74
|
+
- `steam_get_player_badges` — badges and the XP breakdown behind a Steam level.
|
|
75
|
+
- `steam_get_package_details` — price and included games for a package/bundle.
|
|
76
|
+
- `steam_compare_players` — shared games between two users, with playtime.
|
|
77
|
+
|
|
78
|
+
## [0.3.0]
|
|
79
|
+
|
|
80
|
+
### Added
|
|
81
|
+
- `steam_get_store_highlights` — top sellers, new releases, and coming soon.
|
|
82
|
+
- `steam_get_wishlist` — a user's wishlist, optionally enriched with live prices
|
|
83
|
+
and an on-sale filter.
|
|
84
|
+
|
|
85
|
+
### Changed
|
|
86
|
+
- `steam_get_app_reviews` gained `review_filter='recent'`, computing the
|
|
87
|
+
last-N-days score by paginating the newest reviews (Steam exposes no native
|
|
88
|
+
recent-summary field).
|
|
89
|
+
|
|
90
|
+
## [0.2.0]
|
|
91
|
+
|
|
92
|
+
- Initial public release: 16 read-only tools across profiles, friends, games,
|
|
93
|
+
playtime, achievements, store details, reviews, sales, live player counts, and
|
|
94
|
+
news. Bring-your-own-key; packaged as a `.mcpb` desktop extension and for PyPI.
|
|
95
|
+
|
|
96
|
+
[0.8.0]: https://github.com/Sarg338/steam-mcp/releases/tag/v0.8.0
|
|
97
|
+
[0.7.0]: https://github.com/Sarg338/steam-mcp/releases/tag/v0.7.0
|
|
98
|
+
[0.6.0]: https://github.com/Sarg338/steam-mcp/releases/tag/v0.6.0
|
|
99
|
+
[0.5.0]: https://github.com/Sarg338/steam-mcp/releases/tag/v0.5.0
|
|
100
|
+
[0.4.0]: https://github.com/Sarg338/steam-mcp/releases/tag/v0.4.0
|
|
101
|
+
[0.3.0]: https://github.com/Sarg338/steam-mcp/releases/tag/v0.3.0
|
|
102
|
+
[0.2.0]: https://github.com/Sarg338/steam-mcp/releases/tag/v0.2.0
|
steam_mcp-0.8.0/LICENSE
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 steam-mcp contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
This project is not affiliated with, endorsed by, or sponsored by Valve
|
|
24
|
+
Corporation. "Steam" is a trademark of Valve Corporation. Use of the Steam Web
|
|
25
|
+
API is subject to the Steam Web API Terms of Use
|
|
26
|
+
(https://steamcommunity.com/dev/apiterms).
|
steam_mcp-0.8.0/PKG-INFO
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: steam-mcp
|
|
3
|
+
Version: 0.8.0
|
|
4
|
+
Summary: Read-only Steam MCP server (bring-your-own-key) for friends, games, playtime, achievements, sales, reviews, and live player counts.
|
|
5
|
+
Project-URL: Homepage, https://github.com/Sarg338/steam-mcp
|
|
6
|
+
Project-URL: Repository, https://github.com/Sarg338/steam-mcp
|
|
7
|
+
Project-URL: Issues, https://github.com/Sarg338/steam-mcp/issues
|
|
8
|
+
Project-URL: Documentation, https://github.com/Sarg338/steam-mcp#readme
|
|
9
|
+
Author: Sarg
|
|
10
|
+
License: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: gaming,llm,mcp,model-context-protocol,steam,valve
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Topic :: Games/Entertainment
|
|
24
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
25
|
+
Requires-Python: >=3.10
|
|
26
|
+
Requires-Dist: httpx>=0.27.0
|
|
27
|
+
Requires-Dist: mcp>=1.2.0
|
|
28
|
+
Requires-Dist: pydantic>=2.6.0
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
31
|
+
Description-Content-Type: text/markdown
|
|
32
|
+
|
|
33
|
+
<!-- mcp-name: io.github.Sarg338/steam-mcp -->
|
|
34
|
+
|
|
35
|
+
# Steam MCP
|
|
36
|
+
|
|
37
|
+
A read-only [Model Context Protocol](https://modelcontextprotocol.io) server for
|
|
38
|
+
the public Steam Web API and storefront. It lets any MCP-compatible AI client
|
|
39
|
+
(Claude Desktop, Claude Code, etc.) answer questions about Steam — your friends,
|
|
40
|
+
games, playtime and achievements, plus account-independent things like sales,
|
|
41
|
+
reviews, ratings, live player counts, and patch notes.
|
|
42
|
+
|
|
43
|
+
**Bring your own key (BYOK):** each user supplies their own free Steam Web API
|
|
44
|
+
key via an environment variable. Nobody logs in, and no credentials pass through
|
|
45
|
+
this server beyond the key you set yourself.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## What it can answer
|
|
50
|
+
|
|
51
|
+
Account / profile (needs a public profile):
|
|
52
|
+
- "Who's on my Steam friends list, and who's online right now?"
|
|
53
|
+
- "Which of my friends own *Helldivers 2* — and who's playing it right now?"
|
|
54
|
+
- "What's my most-played game, and how many hours?"
|
|
55
|
+
- "Which achievements am I still missing in Hollow Knight?"
|
|
56
|
+
- "What are my career stats in *Team Fortress 2*?"
|
|
57
|
+
- "What are my rarest achievements in *Hollow Knight*?"
|
|
58
|
+
- "What's my Steam level?" / "Does this account have any VAC bans?"
|
|
59
|
+
- "What's on my wishlist, and is any of it on sale right now?"
|
|
60
|
+
- "Analyze my library — what's my backlog and what have I abandoned?"
|
|
61
|
+
|
|
62
|
+
Account-independent (works for any game, no SteamID needed):
|
|
63
|
+
- "Is *Baldur's Gate 3* any good? What's its review score?"
|
|
64
|
+
- "What's on sale on Steam right now?" / "What are the current top sellers and new releases?"
|
|
65
|
+
- "How many people are playing *Counter-Strike 2* this minute?"
|
|
66
|
+
- "What was in the latest *Dota 2* update?"
|
|
67
|
+
- "How much does *Hades II* cost and what genres is it?"
|
|
68
|
+
- "What DLC does *Cities: Skylines* have, and is any of it on sale?"
|
|
69
|
+
- "Is *Elden Ring* a soulslike? What are its community tags?"
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Tools
|
|
74
|
+
|
|
75
|
+
| Tool | What it returns | Needs key? |
|
|
76
|
+
|------|-----------------|-----------|
|
|
77
|
+
| `steam_resolve_vanity_url` | Vanity name / profile URL → SteamID64 | yes |
|
|
78
|
+
| `steam_get_player_summary` | Status (Online/Away/In-Game…), current game, for 1–100 users | yes |
|
|
79
|
+
| `steam_get_friend_list` | Friends enriched with name + live status | yes |
|
|
80
|
+
| `steam_find_friends_who_own` | **Which friends own (or are playing) a game** — "who can I play X with" | yes |
|
|
81
|
+
| `steam_get_owned_games` | Owned games with total/recent hours (sortable) | yes |
|
|
82
|
+
| `steam_analyze_library` | **Backlog, playtime distribution, abandoned games** across a whole library | yes |
|
|
83
|
+
| `steam_get_recently_played_games` | Last-2-weeks playtime | yes |
|
|
84
|
+
| `steam_get_steam_level` | Steam community level | yes |
|
|
85
|
+
| `steam_get_player_bans` | VAC / game / community / economy bans | yes |
|
|
86
|
+
| `steam_get_player_achievements` | Per-game unlocked vs locked achievements | yes |
|
|
87
|
+
| `steam_get_game_schema` | A game's full achievement/stat definitions | yes |
|
|
88
|
+
| `steam_get_global_achievement_percentages` | Achievement rarity (global %) | no |
|
|
89
|
+
| `steam_get_user_game_stats` | **A user's in-game stats** (kills, wins, distance…) for a game | yes |
|
|
90
|
+
| `steam_get_rarest_unlocks` | **A player's rarest achievement unlocks** in a game (by global rarity) | yes |
|
|
91
|
+
| `steam_search_apps` | Game title → appid (+ price) | no |
|
|
92
|
+
| `steam_get_app_details` | **Full store details** — play modes/co-op, controller, DLC, languages, requirements, Metacritic | no |
|
|
93
|
+
| `steam_get_dlc` | **A game's DLC**, with live prices and what's on sale | no |
|
|
94
|
+
| `steam_get_app_tags` | **A game's top community tags** (Souls-like, Roguelike, Cozy…) | no |
|
|
95
|
+
| `steam_get_app_reviews` | Lifetime verdict, +/- counts, sample reviews; optional **recent (last-N-days) score** via `review_filter='recent'` | no |
|
|
96
|
+
| `steam_get_featured_specials` | Games currently on sale (regional) | no |
|
|
97
|
+
| `steam_get_store_highlights` | **Top sellers, new releases, or coming soon** | no |
|
|
98
|
+
| `steam_get_wishlist` | **A user's wishlist, with live prices + what's on sale** | yes |
|
|
99
|
+
| `steam_get_player_badges` | Badges + the XP breakdown behind a Steam level | yes |
|
|
100
|
+
| `steam_get_package_details` | Package/bundle price + included games | no |
|
|
101
|
+
| `steam_compare_players` | Shared games between two users, with playtime | yes |
|
|
102
|
+
| `steam_get_current_players` | Live concurrent player count | no |
|
|
103
|
+
| `steam_get_app_news` | Recent news / patch notes | no |
|
|
104
|
+
|
|
105
|
+
Every tool supports `response_format: "markdown"` (default, human-readable) or
|
|
106
|
+
`"json"` (structured), and all are annotated `readOnlyHint: true`.
|
|
107
|
+
|
|
108
|
+
> **Recent reviews:** Steam's API only exposes a *lifetime* review summary — there
|
|
109
|
+
> is no "last 30 days" field. So `steam_get_app_reviews` with
|
|
110
|
+
> `review_filter='recent'` computes that score itself by paginating the newest
|
|
111
|
+
> reviews within `day_range` days (default 30). For games with a very high volume
|
|
112
|
+
> of recent reviews it counts up to ~600 and marks the result `sampled: true`.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Setup
|
|
117
|
+
|
|
118
|
+
### 1. Get a free Steam Web API key
|
|
119
|
+
|
|
120
|
+
Visit <https://steamcommunity.com/dev/apikey>, sign in, register a domain (any
|
|
121
|
+
domain you control works; `localhost` is commonly used for personal keys), and
|
|
122
|
+
copy the key. Usage is governed by the
|
|
123
|
+
[Steam Web API Terms of Use](https://steamcommunity.com/dev/apiterms).
|
|
124
|
+
|
|
125
|
+
### 2. Install
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
git clone https://github.com/Sarg338/steam-mcp.git
|
|
129
|
+
cd steam-mcp
|
|
130
|
+
pip install -e . # or: pip install -r requirements.txt
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Requires Python 3.10+.
|
|
134
|
+
|
|
135
|
+
### 3. Add it to your MCP client
|
|
136
|
+
|
|
137
|
+
The server reads the key from the `STEAM_API_KEY` environment variable.
|
|
138
|
+
|
|
139
|
+
**Claude Desktop** — edit `claude_desktop_config.json`
|
|
140
|
+
(`%APPDATA%\Claude\` on Windows, `~/Library/Application Support/Claude/` on macOS):
|
|
141
|
+
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"mcpServers": {
|
|
145
|
+
"steam": {
|
|
146
|
+
"command": "python",
|
|
147
|
+
"args": ["-m", "steam_mcp.server"],
|
|
148
|
+
"env": { "STEAM_API_KEY": "YOUR_KEY_HERE" }
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Claude Code** (CLI):
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
claude mcp add steam --env STEAM_API_KEY=YOUR_KEY_HERE -- python -m steam_mcp.server
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
If you installed with `pip install -e .`, you can use the `steam-mcp` console
|
|
161
|
+
script as the command instead of `python -m steam_mcp.server`.
|
|
162
|
+
|
|
163
|
+
Restart your client and the Steam tools appear.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Development
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
pip install -e ".[dev]"
|
|
171
|
+
pytest -q # run the test suite (no network needed)
|
|
172
|
+
python -m py_compile steam_mcp/server.py # syntax check
|
|
173
|
+
npx @modelcontextprotocol/inspector python -m steam_mcp.server # interactive test
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Static storefront/API responses (app & package details, store highlights, game
|
|
177
|
+
schemas, global achievement percentages) are cached in-memory with a short TTL
|
|
178
|
+
to ease the rate limit and speed up tools that fan out many lookups. Live data
|
|
179
|
+
(player status, current players, wishlists, friends) is never cached. All
|
|
180
|
+
requests share one pooled HTTP client, and the fan-out tools (wishlist, DLC)
|
|
181
|
+
enrich entries concurrently with bounded parallelism, so they resolve quickly.
|
|
182
|
+
Prices are shown in the requested country's currency. See
|
|
183
|
+
[CHANGELOG.md](CHANGELOG.md) for release history.
|
|
184
|
+
|
|
185
|
+
## License
|
|
186
|
+
|
|
187
|
+
MIT. Not affiliated with Valve. "Steam" is a trademark of Valve Corporation.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Privacy Policy — Steam MCP
|
|
2
|
+
|
|
3
|
+
_Last updated: 2026-06-01_
|
|
4
|
+
|
|
5
|
+
Steam MCP is a read-only, locally-run Model Context Protocol server. It is not a
|
|
6
|
+
hosted service. This document explains what it does and does not do with data.
|
|
7
|
+
|
|
8
|
+
## What it accesses
|
|
9
|
+
|
|
10
|
+
When you (or your AI client) invoke a tool, the server makes read-only HTTPS
|
|
11
|
+
requests to Valve's official endpoints:
|
|
12
|
+
|
|
13
|
+
- `https://api.steampowered.com` (Steam Web API)
|
|
14
|
+
- `https://store.steampowered.com` (Steam storefront/reviews)
|
|
15
|
+
|
|
16
|
+
Requests may include:
|
|
17
|
+
|
|
18
|
+
- **Your Steam Web API key**, read from the key you supply at install time (or a
|
|
19
|
+
local `.env` / environment variable). The key is sent only to Valve, only as
|
|
20
|
+
required to authenticate API calls. It is never transmitted anywhere else.
|
|
21
|
+
- **SteamIDs / vanity names / app IDs** you ask about, passed as request
|
|
22
|
+
parameters to Valve.
|
|
23
|
+
|
|
24
|
+
## What it does NOT do
|
|
25
|
+
|
|
26
|
+
- It does **not** collect, store, log, or transmit your data to the author or any
|
|
27
|
+
third party. There is no analytics, no telemetry, and no server operated by the
|
|
28
|
+
project — everything runs on your machine.
|
|
29
|
+
- It is **read-only**: it cannot send messages, change your status, modify your
|
|
30
|
+
account, launch games, or make purchases.
|
|
31
|
+
- It does **not** write your API key to any file it ships. The key stays in your
|
|
32
|
+
local configuration.
|
|
33
|
+
|
|
34
|
+
## Data visibility
|
|
35
|
+
|
|
36
|
+
The server can only read data that Valve exposes. Friends lists, owned games, and
|
|
37
|
+
achievements are returned only when the target Steam profile's privacy settings
|
|
38
|
+
make them **Public**. The server cannot access private profile data.
|
|
39
|
+
|
|
40
|
+
## Your responsibilities
|
|
41
|
+
|
|
42
|
+
- Keep your Steam Web API key secret. Treat it like a password.
|
|
43
|
+
- Your use of the Steam Web API is governed by Valve's
|
|
44
|
+
[Steam Web API Terms of Use](https://steamcommunity.com/dev/apiterms).
|
|
45
|
+
|
|
46
|
+
## Contact
|
|
47
|
+
|
|
48
|
+
Issues and questions: https://github.com/Sarg338/steam-mcp/issues
|
|
49
|
+
|
|
50
|
+
_This project is not affiliated with or endorsed by Valve Corporation._
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
<!-- mcp-name: io.github.Sarg338/steam-mcp -->
|
|
2
|
+
|
|
3
|
+
# Steam MCP
|
|
4
|
+
|
|
5
|
+
A read-only [Model Context Protocol](https://modelcontextprotocol.io) server for
|
|
6
|
+
the public Steam Web API and storefront. It lets any MCP-compatible AI client
|
|
7
|
+
(Claude Desktop, Claude Code, etc.) answer questions about Steam — your friends,
|
|
8
|
+
games, playtime and achievements, plus account-independent things like sales,
|
|
9
|
+
reviews, ratings, live player counts, and patch notes.
|
|
10
|
+
|
|
11
|
+
**Bring your own key (BYOK):** each user supplies their own free Steam Web API
|
|
12
|
+
key via an environment variable. Nobody logs in, and no credentials pass through
|
|
13
|
+
this server beyond the key you set yourself.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## What it can answer
|
|
18
|
+
|
|
19
|
+
Account / profile (needs a public profile):
|
|
20
|
+
- "Who's on my Steam friends list, and who's online right now?"
|
|
21
|
+
- "Which of my friends own *Helldivers 2* — and who's playing it right now?"
|
|
22
|
+
- "What's my most-played game, and how many hours?"
|
|
23
|
+
- "Which achievements am I still missing in Hollow Knight?"
|
|
24
|
+
- "What are my career stats in *Team Fortress 2*?"
|
|
25
|
+
- "What are my rarest achievements in *Hollow Knight*?"
|
|
26
|
+
- "What's my Steam level?" / "Does this account have any VAC bans?"
|
|
27
|
+
- "What's on my wishlist, and is any of it on sale right now?"
|
|
28
|
+
- "Analyze my library — what's my backlog and what have I abandoned?"
|
|
29
|
+
|
|
30
|
+
Account-independent (works for any game, no SteamID needed):
|
|
31
|
+
- "Is *Baldur's Gate 3* any good? What's its review score?"
|
|
32
|
+
- "What's on sale on Steam right now?" / "What are the current top sellers and new releases?"
|
|
33
|
+
- "How many people are playing *Counter-Strike 2* this minute?"
|
|
34
|
+
- "What was in the latest *Dota 2* update?"
|
|
35
|
+
- "How much does *Hades II* cost and what genres is it?"
|
|
36
|
+
- "What DLC does *Cities: Skylines* have, and is any of it on sale?"
|
|
37
|
+
- "Is *Elden Ring* a soulslike? What are its community tags?"
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Tools
|
|
42
|
+
|
|
43
|
+
| Tool | What it returns | Needs key? |
|
|
44
|
+
|------|-----------------|-----------|
|
|
45
|
+
| `steam_resolve_vanity_url` | Vanity name / profile URL → SteamID64 | yes |
|
|
46
|
+
| `steam_get_player_summary` | Status (Online/Away/In-Game…), current game, for 1–100 users | yes |
|
|
47
|
+
| `steam_get_friend_list` | Friends enriched with name + live status | yes |
|
|
48
|
+
| `steam_find_friends_who_own` | **Which friends own (or are playing) a game** — "who can I play X with" | yes |
|
|
49
|
+
| `steam_get_owned_games` | Owned games with total/recent hours (sortable) | yes |
|
|
50
|
+
| `steam_analyze_library` | **Backlog, playtime distribution, abandoned games** across a whole library | yes |
|
|
51
|
+
| `steam_get_recently_played_games` | Last-2-weeks playtime | yes |
|
|
52
|
+
| `steam_get_steam_level` | Steam community level | yes |
|
|
53
|
+
| `steam_get_player_bans` | VAC / game / community / economy bans | yes |
|
|
54
|
+
| `steam_get_player_achievements` | Per-game unlocked vs locked achievements | yes |
|
|
55
|
+
| `steam_get_game_schema` | A game's full achievement/stat definitions | yes |
|
|
56
|
+
| `steam_get_global_achievement_percentages` | Achievement rarity (global %) | no |
|
|
57
|
+
| `steam_get_user_game_stats` | **A user's in-game stats** (kills, wins, distance…) for a game | yes |
|
|
58
|
+
| `steam_get_rarest_unlocks` | **A player's rarest achievement unlocks** in a game (by global rarity) | yes |
|
|
59
|
+
| `steam_search_apps` | Game title → appid (+ price) | no |
|
|
60
|
+
| `steam_get_app_details` | **Full store details** — play modes/co-op, controller, DLC, languages, requirements, Metacritic | no |
|
|
61
|
+
| `steam_get_dlc` | **A game's DLC**, with live prices and what's on sale | no |
|
|
62
|
+
| `steam_get_app_tags` | **A game's top community tags** (Souls-like, Roguelike, Cozy…) | no |
|
|
63
|
+
| `steam_get_app_reviews` | Lifetime verdict, +/- counts, sample reviews; optional **recent (last-N-days) score** via `review_filter='recent'` | no |
|
|
64
|
+
| `steam_get_featured_specials` | Games currently on sale (regional) | no |
|
|
65
|
+
| `steam_get_store_highlights` | **Top sellers, new releases, or coming soon** | no |
|
|
66
|
+
| `steam_get_wishlist` | **A user's wishlist, with live prices + what's on sale** | yes |
|
|
67
|
+
| `steam_get_player_badges` | Badges + the XP breakdown behind a Steam level | yes |
|
|
68
|
+
| `steam_get_package_details` | Package/bundle price + included games | no |
|
|
69
|
+
| `steam_compare_players` | Shared games between two users, with playtime | yes |
|
|
70
|
+
| `steam_get_current_players` | Live concurrent player count | no |
|
|
71
|
+
| `steam_get_app_news` | Recent news / patch notes | no |
|
|
72
|
+
|
|
73
|
+
Every tool supports `response_format: "markdown"` (default, human-readable) or
|
|
74
|
+
`"json"` (structured), and all are annotated `readOnlyHint: true`.
|
|
75
|
+
|
|
76
|
+
> **Recent reviews:** Steam's API only exposes a *lifetime* review summary — there
|
|
77
|
+
> is no "last 30 days" field. So `steam_get_app_reviews` with
|
|
78
|
+
> `review_filter='recent'` computes that score itself by paginating the newest
|
|
79
|
+
> reviews within `day_range` days (default 30). For games with a very high volume
|
|
80
|
+
> of recent reviews it counts up to ~600 and marks the result `sampled: true`.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Setup
|
|
85
|
+
|
|
86
|
+
### 1. Get a free Steam Web API key
|
|
87
|
+
|
|
88
|
+
Visit <https://steamcommunity.com/dev/apikey>, sign in, register a domain (any
|
|
89
|
+
domain you control works; `localhost` is commonly used for personal keys), and
|
|
90
|
+
copy the key. Usage is governed by the
|
|
91
|
+
[Steam Web API Terms of Use](https://steamcommunity.com/dev/apiterms).
|
|
92
|
+
|
|
93
|
+
### 2. Install
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
git clone https://github.com/Sarg338/steam-mcp.git
|
|
97
|
+
cd steam-mcp
|
|
98
|
+
pip install -e . # or: pip install -r requirements.txt
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Requires Python 3.10+.
|
|
102
|
+
|
|
103
|
+
### 3. Add it to your MCP client
|
|
104
|
+
|
|
105
|
+
The server reads the key from the `STEAM_API_KEY` environment variable.
|
|
106
|
+
|
|
107
|
+
**Claude Desktop** — edit `claude_desktop_config.json`
|
|
108
|
+
(`%APPDATA%\Claude\` on Windows, `~/Library/Application Support/Claude/` on macOS):
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"mcpServers": {
|
|
113
|
+
"steam": {
|
|
114
|
+
"command": "python",
|
|
115
|
+
"args": ["-m", "steam_mcp.server"],
|
|
116
|
+
"env": { "STEAM_API_KEY": "YOUR_KEY_HERE" }
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Claude Code** (CLI):
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
claude mcp add steam --env STEAM_API_KEY=YOUR_KEY_HERE -- python -m steam_mcp.server
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
If you installed with `pip install -e .`, you can use the `steam-mcp` console
|
|
129
|
+
script as the command instead of `python -m steam_mcp.server`.
|
|
130
|
+
|
|
131
|
+
Restart your client and the Steam tools appear.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Development
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
pip install -e ".[dev]"
|
|
139
|
+
pytest -q # run the test suite (no network needed)
|
|
140
|
+
python -m py_compile steam_mcp/server.py # syntax check
|
|
141
|
+
npx @modelcontextprotocol/inspector python -m steam_mcp.server # interactive test
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Static storefront/API responses (app & package details, store highlights, game
|
|
145
|
+
schemas, global achievement percentages) are cached in-memory with a short TTL
|
|
146
|
+
to ease the rate limit and speed up tools that fan out many lookups. Live data
|
|
147
|
+
(player status, current players, wishlists, friends) is never cached. All
|
|
148
|
+
requests share one pooled HTTP client, and the fan-out tools (wishlist, DLC)
|
|
149
|
+
enrich entries concurrently with bounded parallelism, so they resolve quickly.
|
|
150
|
+
Prices are shown in the requested country's currency. See
|
|
151
|
+
[CHANGELOG.md](CHANGELOG.md) for release history.
|
|
152
|
+
|
|
153
|
+
## License
|
|
154
|
+
|
|
155
|
+
MIT. Not affiliated with Valve. "Steam" is a trademark of Valve Corporation.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "steam-mcp"
|
|
3
|
+
version = "0.8.0"
|
|
4
|
+
description = "Read-only Steam MCP server (bring-your-own-key) for friends, games, playtime, achievements, sales, reviews, and live player counts."
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
|
+
license = { text = "MIT" }
|
|
8
|
+
authors = [{ name = "Sarg" }]
|
|
9
|
+
keywords = ["mcp", "steam", "model-context-protocol", "llm", "valve", "gaming"]
|
|
10
|
+
classifiers = [
|
|
11
|
+
"Development Status :: 4 - Beta",
|
|
12
|
+
"Intended Audience :: Developers",
|
|
13
|
+
"Intended Audience :: End Users/Desktop",
|
|
14
|
+
"License :: OSI Approved :: MIT License",
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Programming Language :: Python :: 3.10",
|
|
17
|
+
"Programming Language :: Python :: 3.11",
|
|
18
|
+
"Programming Language :: Python :: 3.12",
|
|
19
|
+
"Programming Language :: Python :: 3.13",
|
|
20
|
+
"Operating System :: OS Independent",
|
|
21
|
+
"Topic :: Games/Entertainment",
|
|
22
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
23
|
+
]
|
|
24
|
+
dependencies = [
|
|
25
|
+
"mcp>=1.2.0",
|
|
26
|
+
"httpx>=0.27.0",
|
|
27
|
+
"pydantic>=2.6.0",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
[project.optional-dependencies]
|
|
31
|
+
dev = ["pytest>=7.0"]
|
|
32
|
+
|
|
33
|
+
[project.scripts]
|
|
34
|
+
steam-mcp = "steam_mcp.server:main"
|
|
35
|
+
|
|
36
|
+
[project.urls]
|
|
37
|
+
Homepage = "https://github.com/Sarg338/steam-mcp"
|
|
38
|
+
Repository = "https://github.com/Sarg338/steam-mcp"
|
|
39
|
+
Issues = "https://github.com/Sarg338/steam-mcp/issues"
|
|
40
|
+
Documentation = "https://github.com/Sarg338/steam-mcp#readme"
|
|
41
|
+
|
|
42
|
+
[build-system]
|
|
43
|
+
requires = ["hatchling"]
|
|
44
|
+
build-backend = "hatchling.build"
|
|
45
|
+
|
|
46
|
+
[tool.hatch.build.targets.wheel]
|
|
47
|
+
packages = ["steam_mcp"]
|
|
48
|
+
|
|
49
|
+
[tool.hatch.build.targets.sdist]
|
|
50
|
+
include = [
|
|
51
|
+
"/steam_mcp",
|
|
52
|
+
"/tests",
|
|
53
|
+
"/README.md",
|
|
54
|
+
"/CHANGELOG.md",
|
|
55
|
+
"/LICENSE",
|
|
56
|
+
"/PRIVACY.md",
|
|
57
|
+
"/pyproject.toml",
|
|
58
|
+
]
|