@naouts/mcp-steam 1.0.0

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 naouts
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.
package/README.md ADDED
@@ -0,0 +1,229 @@
1
+ # mcp-steam
2
+
3
+ [![npm version](https://img.shields.io/npm/v/mcp-steam.svg?style=flat-square)](https://www.npmjs.com/package/mcp-steam)
4
+ [![npm downloads](https://img.shields.io/npm/dm/mcp-steam.svg?style=flat-square)](https://www.npmjs.com/package/mcp-steam)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)
6
+ [![Node.js](https://img.shields.io/node/v/mcp-steam.svg?style=flat-square)](https://nodejs.org)
7
+
8
+ A [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server for the Steam API. Connect any MCP-compatible client to search games, retrieve detailed information, and list a player's owned games.
9
+
10
+ ---
11
+
12
+ ## Features
13
+
14
+ | Tool | Description |
15
+ |---|---|
16
+ | `search_games` | Search Steam by name or keyword, returns AppIDs, prices, platforms |
17
+ | `get_game_details` | Full details for a game: price, description, Metacritic, genres, reviews |
18
+ | `get_owned_games` | All games owned by a Steam player (requires API key + public profile) |
19
+
20
+ ---
21
+
22
+ ## Requirements
23
+
24
+ - **Node.js 18+**
25
+ - A **Steam Web API key** for the `get_owned_games` tool — get one free at [steamcommunity.com/dev/apikey](https://steamcommunity.com/dev/apikey)
26
+
27
+ > `search_games` and `get_game_details` use the public Steam Store API and do **not** require an API key.
28
+
29
+ ---
30
+
31
+ ## Installation
32
+
33
+ ### With npx (recommended)
34
+
35
+ Add this to your MCP client configuration file:
36
+
37
+ ```json
38
+ {
39
+ "mcpServers": {
40
+ "steam": {
41
+ "command": "npx",
42
+ "args": ["-y", "mcp-steam"],
43
+ "env": {
44
+ "STEAM_API_KEY": "YOUR_STEAM_API_KEY"
45
+ }
46
+ }
47
+ }
48
+ }
49
+ ```
50
+
51
+ ### Global install
52
+
53
+ ```bash
54
+ npm install -g mcp-steam
55
+ ```
56
+
57
+ Then reference it in your MCP config:
58
+
59
+ ```json
60
+ {
61
+ "mcpServers": {
62
+ "steam": {
63
+ "command": "mcp-steam",
64
+ "env": {
65
+ "STEAM_API_KEY": "YOUR_STEAM_API_KEY"
66
+ }
67
+ }
68
+ }
69
+ }
70
+ ```
71
+
72
+ ---
73
+
74
+ ## Tools
75
+
76
+ ### `search_games`
77
+
78
+ Search Steam for games by name or keyword.
79
+
80
+ **Parameters:**
81
+
82
+ | Name | Type | Required | Default | Description |
83
+ |---|---|---|---|---|
84
+ | `query` | string | yes | — | Search query (game name or keyword) |
85
+ | `limit` | number | no | `5` | Max results (1–20) |
86
+
87
+ **Example prompt:**
88
+ > Search for "hollow knight" on Steam
89
+
90
+ **Example response:**
91
+ ```
92
+ Found 12 result(s) for "hollow knight" (showing 5):
93
+
94
+ 1. **Hollow Knight** (AppID: 367520)
95
+ Price: $14.99 | Platforms: Windows, Mac, Linux
96
+
97
+ 2. **Hollow Knight: Voidheart Edition** (AppID: 851710)
98
+ Price: $19.99 | Platforms: Windows, Mac, Linux
99
+ ...
100
+ ```
101
+
102
+ ---
103
+
104
+ ### `get_game_details`
105
+
106
+ Get full details for a game by its Steam AppID.
107
+
108
+ **Parameters:**
109
+
110
+ | Name | Type | Required | Description |
111
+ |---|---|---|---|
112
+ | `appid` | number | yes | Steam AppID (e.g. `570` for Dota 2, `730` for CS2) |
113
+
114
+ **Example prompt:**
115
+ > Give me the details of Elden Ring on Steam (AppID 1245620)
116
+
117
+ **Example response:**
118
+ ```
119
+ ## Elden Ring (AppID: 1245620)
120
+
121
+ **Price:** $59.99
122
+ **Developer(s):** FromSoftware Inc.
123
+ **Publisher(s):** Bandai Namco Entertainment
124
+ **Release date:** Feb 25, 2022
125
+ **Platforms:** Windows
126
+ **Genres:** Action, RPG
127
+ **Reviews:** 722,984 recommendations
128
+ Metacritic: 95/100
129
+
130
+ **Description:**
131
+ THE NEW FANTASY ACTION RPG. Rise, Tarnished, and be guided by grace to brandish the power of the Elden Ring...
132
+
133
+ **Store page:** https://store.steampowered.com/app/1245620/
134
+ ```
135
+
136
+ ---
137
+
138
+ ### `get_owned_games`
139
+
140
+ List all games owned by a Steam player. The player's profile **must be set to public**. Requires a Steam API key.
141
+
142
+ **Parameters:**
143
+
144
+ | Name | Type | Required | Default | Description |
145
+ |---|---|---|---|---|
146
+ | `steamid` | string | yes | — | 17-digit 64-bit SteamID |
147
+ | `sort_by` | string | no | `"playtime"` | Sort by `"playtime"` or `"name"` |
148
+
149
+ **How to find a SteamID:**
150
+ - Visit [steamidfinder.com](https://www.steamidfinder.com) or [steamid.io](https://steamid.io)
151
+ - Or open a profile URL: `https://steamcommunity.com/id/USERNAME` → look for the 17-digit ID
152
+
153
+ **Example prompt:**
154
+ > Show me the games owned by SteamID 76561198000000000, sorted by playtime
155
+
156
+ **Example response:**
157
+ ```
158
+ ## Owned games for SteamID 76561198000000000
159
+
160
+ **Total games:** 312
161
+ **Total playtime:** 8,453 hours
162
+
163
+ ### Top 25 games (sorted by playtime):
164
+ 1. **Counter-Strike 2** — 1,204h (3h 22min last 2 weeks)
165
+ 2. **Dota 2** — 987h
166
+ 3. **The Witcher 3: Wild Hunt** — 342h
167
+ ...
168
+ ```
169
+
170
+ ---
171
+
172
+ ## Environment Variables
173
+
174
+ | Variable | Required | Description |
175
+ |---|---|---|
176
+ | `STEAM_API_KEY` | For `get_owned_games` | Your Steam Web API key |
177
+
178
+ ---
179
+
180
+ ## Development
181
+
182
+ ```bash
183
+ # Clone and install
184
+ git clone https://github.com/naouts/mcp-steam.git
185
+ cd mcp-steam
186
+ npm install
187
+
188
+ # Build
189
+ npm run build
190
+
191
+ # Run locally
192
+ STEAM_API_KEY=your_key node dist/index.js
193
+
194
+ # Watch mode (rebuilds on change)
195
+ npm run build && npm run dev
196
+ ```
197
+
198
+ ### Project structure
199
+
200
+ ```
201
+ mcp-steam/
202
+ ├── src/
203
+ │ └── index.ts # Server + all tools
204
+ ├── dist/ # Compiled output (git-ignored)
205
+ ├── package.json
206
+ ├── tsconfig.json
207
+ └── README.md
208
+ ```
209
+
210
+ ---
211
+
212
+ ## Publishing to npm
213
+
214
+ ```bash
215
+ # Make sure you're logged in
216
+ npm login
217
+
218
+ # Dry-run to verify what gets published
219
+ npm publish --dry-run
220
+
221
+ # Publish
222
+ npm publish
223
+ ```
224
+
225
+ ---
226
+
227
+ ## License
228
+
229
+ MIT — see [LICENSE](LICENSE)
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,270 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ const STEAM_API_KEY = process.env.STEAM_API_KEY ?? "";
6
+ const STORE_API = "https://store.steampowered.com/api";
7
+ const STEAM_API = "https://api.steampowered.com";
8
+ const FETCH_TIMEOUT_MS = 10_000;
9
+ const MAX_RESPONSE_BYTES = 5 * 1024 * 1024; // 5 MB
10
+ // ── Helpers ──────────────────────────────────────────────────────────────────
11
+ function minutesToHours(minutes) {
12
+ if (minutes < 60)
13
+ return `${minutes} min`;
14
+ const h = Math.floor(minutes / 60);
15
+ const m = minutes % 60;
16
+ return m > 0 ? `${h}h ${m}min` : `${h}h`;
17
+ }
18
+ function stripHtml(html) {
19
+ return html.replace(/<[^>]+>/g, "").replace(/\s+/g, " ").trim();
20
+ }
21
+ /**
22
+ * Redact the Steam API key from a URL before using it in error messages
23
+ * so it is never exposed in logs or MCP responses.
24
+ */
25
+ function sanitizeUrl(rawUrl) {
26
+ try {
27
+ const u = new URL(rawUrl);
28
+ if (u.searchParams.has("key")) {
29
+ u.searchParams.set("key", "[REDACTED]");
30
+ }
31
+ return u.toString();
32
+ }
33
+ catch {
34
+ return "[invalid url]";
35
+ }
36
+ }
37
+ async function fetchJson(url) {
38
+ let res;
39
+ try {
40
+ res = await fetch(url, {
41
+ headers: { "User-Agent": "mcp-steam/1.0.0" },
42
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
43
+ });
44
+ }
45
+ catch (err) {
46
+ // Network errors may contain the URL — sanitize before re-throwing.
47
+ const label = err instanceof Error && err.name === "TimeoutError"
48
+ ? `Request timed out after ${FETCH_TIMEOUT_MS / 1000}s`
49
+ : "Network error";
50
+ throw new Error(`${label} (${sanitizeUrl(url)})`);
51
+ }
52
+ if (!res.ok) {
53
+ // sanitizeUrl strips the API key from the URL included in the error.
54
+ throw new Error(`HTTP ${res.status} — ${res.statusText} (${sanitizeUrl(url)})`);
55
+ }
56
+ const contentLength = res.headers.get("content-length");
57
+ if (contentLength && Number(contentLength) > MAX_RESPONSE_BYTES) {
58
+ throw new Error("Steam API response exceeds size limit");
59
+ }
60
+ const text = await res.text();
61
+ if (text.length > MAX_RESPONSE_BYTES) {
62
+ throw new Error("Steam API response exceeds size limit");
63
+ }
64
+ try {
65
+ return JSON.parse(text);
66
+ }
67
+ catch {
68
+ throw new Error("Steam API returned invalid JSON");
69
+ }
70
+ }
71
+ // ── Tool implementations ─────────────────────────────────────────────────────
72
+ async function searchGames(query, limit) {
73
+ const url = `${STORE_API}/storesearch/?term=${encodeURIComponent(query)}&l=english&cc=US`;
74
+ const data = await fetchJson(url);
75
+ if (!data.items || data.items.length === 0) {
76
+ return `No games found for "${query}".`;
77
+ }
78
+ const results = data.items.slice(0, limit).map((item) => ({
79
+ id: item.id,
80
+ name: item.name,
81
+ price: item.price?.final_formatted,
82
+ platforms: [
83
+ item.platforms?.windows ? "Windows" : null,
84
+ item.platforms?.mac ? "Mac" : null,
85
+ item.platforms?.linux ? "Linux" : null,
86
+ ].filter(Boolean),
87
+ }));
88
+ const lines = results.map((r, i) => {
89
+ const platforms = r.platforms.length ? r.platforms.join(", ") : "Unknown";
90
+ const price = r.price ?? "Free / N/A";
91
+ return `${i + 1}. **${r.name}** (AppID: ${r.id})\n Price: ${price} | Platforms: ${platforms}`;
92
+ });
93
+ return `Found ${data.total} result(s) for "${query}" (showing ${results.length}):\n\n${lines.join("\n\n")}`;
94
+ }
95
+ async function getGameDetails(appid) {
96
+ const url = `${STORE_API}/appdetails?appids=${appid}&cc=US&l=english`;
97
+ const data = await fetchJson(url);
98
+ const entry = data[String(appid)];
99
+ if (!entry?.success || !entry.data) {
100
+ return `Could not retrieve details for AppID ${appid}. The game may not exist or may be region-locked.`;
101
+ }
102
+ const d = entry.data;
103
+ const price = d.price_overview
104
+ ? d.price_overview.discount_percent > 0
105
+ ? `${d.price_overview.final_formatted} (${d.price_overview.discount_percent}% off)`
106
+ : d.price_overview.final_formatted
107
+ : "Free to Play";
108
+ const reviews = d.recommendations?.total
109
+ ? `${d.recommendations.total.toLocaleString()} recommendations`
110
+ : "No review data";
111
+ const metacritic = d.metacritic
112
+ ? `Metacritic: ${d.metacritic.score}/100 — ${d.metacritic.url}`
113
+ : "No Metacritic score";
114
+ const platforms = [
115
+ d.platforms.windows ? "Windows" : null,
116
+ d.platforms.mac ? "Mac" : null,
117
+ d.platforms.linux ? "Linux" : null,
118
+ ].filter(Boolean).join(", ") || "Unknown";
119
+ const description = stripHtml(d.short_description ?? d.detailed_description ?? "").slice(0, 400);
120
+ // genres and categories are {id, description} objects in the Steam API response
121
+ const genres = d.genres?.map((g) => g.description).join(", ") ?? "N/A";
122
+ const categories = d.categories?.slice(0, 5).map((c) => c.description).join(", ") ?? "N/A";
123
+ const releaseDate = d.release_date?.coming_soon ? "Coming soon" : (d.release_date?.date ?? "N/A");
124
+ return [
125
+ `## ${d.name} (AppID: ${d.appid})`,
126
+ ``,
127
+ `**Price:** ${price}`,
128
+ `**Developer(s):** ${d.developers?.join(", ") ?? "N/A"}`,
129
+ `**Publisher(s):** ${d.publishers?.join(", ") ?? "N/A"}`,
130
+ `**Release date:** ${releaseDate}`,
131
+ `**Platforms:** ${platforms}`,
132
+ `**Genres:** ${genres}`,
133
+ `**Categories:** ${categories}`,
134
+ `**Reviews:** ${reviews}`,
135
+ metacritic,
136
+ ``,
137
+ `**Description:**`,
138
+ description + (description.length === 400 ? "…" : ""),
139
+ ``,
140
+ `**Store page:** https://store.steampowered.com/app/${d.appid}/`,
141
+ d.website ? `**Website:** ${d.website}` : null,
142
+ ].filter((l) => l !== null).join("\n");
143
+ }
144
+ async function getOwnedGames(steamid, sortBy) {
145
+ if (!STEAM_API_KEY) {
146
+ return ("Error: STEAM_API_KEY environment variable is not set.\n" +
147
+ "An API key is required to fetch owned games.\n" +
148
+ "Get yours at https://steamcommunity.com/dev/apikey");
149
+ }
150
+ // The API key is a query parameter — sanitizeUrl() in fetchJson will redact it
151
+ // from any error messages before they are returned to the caller.
152
+ const url = `${STEAM_API}/IPlayerService/GetOwnedGames/v0001/` +
153
+ `?key=${STEAM_API_KEY}&steamid=${steamid}&format=json` +
154
+ `&include_appinfo=1&include_played_free_games=1`;
155
+ const data = await fetchJson(url);
156
+ const { response } = data;
157
+ if (!response || !response.games) {
158
+ return (`No games found for SteamID ${steamid}.\n` +
159
+ `Possible reasons:\n` +
160
+ ` • The profile is private\n` +
161
+ ` • The SteamID is invalid\n` +
162
+ ` • The account owns no games`);
163
+ }
164
+ const games = [...response.games];
165
+ if (sortBy === "playtime") {
166
+ games.sort((a, b) => b.playtime_forever - a.playtime_forever);
167
+ }
168
+ else {
169
+ games.sort((a, b) => (a.name ?? "").localeCompare(b.name ?? ""));
170
+ }
171
+ const totalHours = Math.floor(games.reduce((s, g) => s + g.playtime_forever, 0) / 60);
172
+ const top = games.slice(0, 25).map((g, i) => {
173
+ const playtime = minutesToHours(g.playtime_forever);
174
+ const recent = g.playtime_2weeks != null && g.playtime_2weeks > 0
175
+ ? ` (${minutesToHours(g.playtime_2weeks)} last 2 weeks)`
176
+ : "";
177
+ return `${String(i + 1).padStart(2)}. **${g.name ?? `AppID ${g.appid}`}** — ${playtime}${recent}`;
178
+ });
179
+ return [
180
+ `## Owned games for SteamID ${steamid}`,
181
+ ``,
182
+ `**Total games:** ${response.game_count ?? games.length}`,
183
+ `**Total playtime:** ${totalHours.toLocaleString()} hours`,
184
+ ``,
185
+ `### Top ${top.length} games (sorted by ${sortBy}):`,
186
+ ...top,
187
+ games.length > 25
188
+ ? `\n_… and ${games.length - 25} more games not shown._`
189
+ : "",
190
+ ].join("\n");
191
+ }
192
+ // ── Server setup ─────────────────────────────────────────────────────────────
193
+ const server = new McpServer({
194
+ name: "mcp-steam",
195
+ version: "1.0.0",
196
+ });
197
+ server.tool("search_games", "Search for games on Steam by name or keyword. Returns a list of matching games with AppIDs, prices, and platform info.", {
198
+ query: z.string().min(1).max(200).describe("Search query (game name or keyword)"),
199
+ limit: z
200
+ .number()
201
+ .int()
202
+ .min(1)
203
+ .max(20)
204
+ .default(5)
205
+ .describe("Maximum number of results to return (default: 5, max: 20)"),
206
+ }, async ({ query, limit }) => {
207
+ try {
208
+ const text = await searchGames(query, limit);
209
+ return { content: [{ type: "text", text }] };
210
+ }
211
+ catch (err) {
212
+ return {
213
+ content: [{ type: "text", text: `Error searching games: ${err.message}` }],
214
+ isError: true,
215
+ };
216
+ }
217
+ });
218
+ server.tool("get_game_details", "Get detailed information about a Steam game by its AppID: price, description, reviews, Metacritic score, genres, platforms, and more.", {
219
+ appid: z
220
+ .number()
221
+ .int()
222
+ .positive()
223
+ .max(9_999_999)
224
+ .describe("Steam AppID of the game (e.g. 570 for Dota 2, 730 for CS2)"),
225
+ }, async ({ appid }) => {
226
+ try {
227
+ const text = await getGameDetails(appid);
228
+ return { content: [{ type: "text", text }] };
229
+ }
230
+ catch (err) {
231
+ return {
232
+ content: [{ type: "text", text: `Error fetching game details: ${err.message}` }],
233
+ isError: true,
234
+ };
235
+ }
236
+ });
237
+ server.tool("get_owned_games", "List all Steam games owned by a player using their 64-bit SteamID. Requires a Steam API key. The player's profile must be public.", {
238
+ steamid: z
239
+ .string()
240
+ .regex(/^\d{17}$/, "SteamID must be a 17-digit number")
241
+ .describe("64-bit SteamID of the player (e.g. 76561198000000000)"),
242
+ sort_by: z
243
+ .enum(["playtime", "name"])
244
+ .default("playtime")
245
+ .describe("Sort results by 'playtime' (most played first) or 'name' (alphabetical)"),
246
+ }, async ({ steamid, sort_by }) => {
247
+ try {
248
+ const text = await getOwnedGames(steamid, sort_by);
249
+ return { content: [{ type: "text", text }] };
250
+ }
251
+ catch (err) {
252
+ return {
253
+ content: [{ type: "text", text: `Error fetching owned games: ${err.message}` }],
254
+ isError: true,
255
+ };
256
+ }
257
+ });
258
+ // ── Entry point ───────────────────────────────────────────────────────────────
259
+ async function main() {
260
+ const transport = new StdioServerTransport();
261
+ await server.connect(transport);
262
+ console.error("mcp-steam server running on stdio");
263
+ }
264
+ main().catch((err) => {
265
+ // Log only the message, not the full error object, to avoid leaking stack traces or URLs.
266
+ const message = err instanceof Error ? err.message : String(err);
267
+ console.error("Fatal error:", message);
268
+ process.exit(1);
269
+ });
270
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@naouts/mcp-steam",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for the Steam API with game search, reviews, details, and owned games by SteamID",
5
+ "keywords": [
6
+ "mcp",
7
+ "steam",
8
+ "gaming",
9
+ "model-context-protocol",
10
+ "ai"
11
+ ],
12
+ "author": "naouts",
13
+ "license": "MIT",
14
+ "homepage": "https://github.com/naouts/mcp-steam#readme",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/naouts/mcp-steam.git"
18
+ },
19
+ "bugs": {
20
+ "url": "https://github.com/naouts/mcp-steam/issues"
21
+ },
22
+ "type": "module",
23
+ "main": "dist/index.js",
24
+ "bin": {
25
+ "mcp-steam": "dist/index.js"
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsc",
32
+ "dev": "node --watch dist/index.js",
33
+ "prepare": "npm run build",
34
+ "start": "node dist/index.js"
35
+ },
36
+ "dependencies": {
37
+ "@modelcontextprotocol/sdk": "^1.12.0"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^22.0.0",
41
+ "typescript": "^5.8.0"
42
+ },
43
+ "engines": {
44
+ "node": ">=18"
45
+ }
46
+ }