psn-mcp 0.1.0 → 0.1.1
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 +1 -1
- package/README.md +52 -19
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/psn/api.js.map +1 -1
- package/dist/psn/auth.js.map +1 -1
- package/dist/psn/http.js +3 -1
- package/dist/psn/http.js.map +1 -1
- package/dist/psn/store.d.ts +78 -0
- package/dist/psn/store.js +188 -0
- package/dist/psn/store.js.map +1 -0
- package/dist/tools.d.ts +2 -1
- package/dist/tools.js +100 -11
- package/dist/tools.js.map +1 -1
- package/package.json +33 -13
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
# psn-mcp
|
|
2
2
|
|
|
3
|
-
An [MCP](https://modelcontextprotocol.io) (Model Context Protocol) server for
|
|
3
|
+
An [MCP](https://modelcontextprotocol.io) (Model Context Protocol) server for
|
|
4
|
+
interfacing with the PlayStation Network. Lets MCP clients like Claude look up
|
|
5
|
+
PSN profiles, friends, online presence, trophies, and play history.
|
|
4
6
|
|
|
5
|
-
The PSN API layer is written from scratch in TypeScript on Node's built-in
|
|
7
|
+
The PSN API layer is written from scratch in TypeScript on Node's built-in
|
|
8
|
+
`fetch` — no PSN client dependencies. It authenticates the same way the official
|
|
9
|
+
PlayStation mobile app does and talks directly to Sony's `m.np.playstation.com`
|
|
10
|
+
API.
|
|
6
11
|
|
|
7
12
|
## Requirements
|
|
8
13
|
|
|
@@ -15,13 +20,18 @@ The PSN API layer is written from scratch in TypeScript on Node's built-in `fetc
|
|
|
15
20
|
2. In the same browser, open <https://ca.account.sony.com/api/v1/ssocookie>.
|
|
16
21
|
3. Copy the 64-character `npsso` value from the JSON response.
|
|
17
22
|
|
|
18
|
-
The server exchanges the NPSSO for an OAuth access token on first use and
|
|
23
|
+
The server exchanges the NPSSO for an OAuth access token on first use and
|
|
24
|
+
refreshes it automatically. NPSSO tokens expire after about two months; when
|
|
25
|
+
tools start failing with an auth error, fetch a fresh one.
|
|
19
26
|
|
|
20
|
-
> **Note:** this uses your personal account session. What you can see (other
|
|
27
|
+
> **Note:** this uses your personal account session. What you can see (other
|
|
28
|
+
> users' friends, presence, play history) is governed by normal PSN privacy
|
|
29
|
+
> settings.
|
|
21
30
|
|
|
22
31
|
## Usage with an MCP client
|
|
23
32
|
|
|
24
|
-
No installation needed — run it with `npx`. Add to your client's MCP
|
|
33
|
+
No installation needed — run it with `npx`. Add to your client's MCP
|
|
34
|
+
configuration (e.g. `claude_desktop_config.json`):
|
|
25
35
|
|
|
26
36
|
```json
|
|
27
37
|
{
|
|
@@ -45,21 +55,33 @@ claude mcp add psn --env PSN_NPSSO=<your npsso token> -- npx -y psn-mcp
|
|
|
45
55
|
|
|
46
56
|
## Tools
|
|
47
57
|
|
|
48
|
-
| Tool
|
|
49
|
-
|
|
|
50
|
-
| `psn_get_profile`
|
|
51
|
-
| `psn_search_players`
|
|
52
|
-
| `psn_get_friends`
|
|
53
|
-
| `psn_get_presence`
|
|
54
|
-
| `psn_get_trophy_summary`
|
|
55
|
-
| `psn_get_trophy_titles`
|
|
56
|
-
| `psn_get_title_trophies`
|
|
58
|
+
| Tool | Description |
|
|
59
|
+
| ------------------------- | ------------------------------------------------------------------ |
|
|
60
|
+
| `psn_get_profile` | Profile for a user: online id, about-me, avatars, PS Plus status |
|
|
61
|
+
| `psn_search_players` | Search PSN players by name; returns online ids and account ids |
|
|
62
|
+
| `psn_get_friends` | A user's friends list, resolved to profiles |
|
|
63
|
+
| `psn_get_presence` | Online status, current platform, and the game being played |
|
|
64
|
+
| `psn_get_trophy_summary` | Trophy level, tier, and total trophy counts |
|
|
65
|
+
| `psn_get_trophy_titles` | Games with trophy progress, most recently played first |
|
|
66
|
+
| `psn_get_title_trophies` | Full trophy list defined for a game (names, types, groups) |
|
|
57
67
|
| `psn_get_earned_trophies` | Which trophies a user earned in a game, with timestamps and rarity |
|
|
58
|
-
| `psn_get_played_games`
|
|
68
|
+
| `psn_get_played_games` | Played PS4/PS5 games with play counts and durations |
|
|
69
|
+
| `psn_get_store_deals` | Games on sale, with prices, discounts, and (optional) star ratings |
|
|
70
|
+
| `psn_get_store_product` | Store product details: price, discount, and community star rating |
|
|
71
|
+
| `psn_search_store` | Search the store catalog by name, with current prices |
|
|
59
72
|
|
|
60
|
-
Every user-scoped tool accepts `"me"` (the authenticated account), a PSN online
|
|
73
|
+
Every user-scoped tool accepts `"me"` (the authenticated account), a PSN online
|
|
74
|
+
id (username), or a numeric account id — online ids are resolved automatically.
|
|
61
75
|
|
|
62
|
-
For PS5 titles pass `npServiceName: "trophy2"`; for PS4 and earlier use
|
|
76
|
+
For PS5 titles pass `npServiceName: "trophy2"`; for PS4 and earlier use
|
|
77
|
+
`"trophy"`. `psn_get_trophy_titles` reports the right value per game.
|
|
78
|
+
|
|
79
|
+
The three `store` tools browse the public PlayStation Store and need **no PSN
|
|
80
|
+
account**. They power prompts like _"give me the top 10 games currently on sale
|
|
81
|
+
based on review score"_ — call `psn_get_store_deals` with `includeRatings: true`
|
|
82
|
+
and rank by `starRating.averageRating`. Set `PSN_STORE_LOCALE` (e.g. `en-gb`,
|
|
83
|
+
`de-de`, `ja-jp`) to change the store region and currency; the default is
|
|
84
|
+
`en-us`.
|
|
63
85
|
|
|
64
86
|
## Architecture
|
|
65
87
|
|
|
@@ -71,11 +93,22 @@ src/
|
|
|
71
93
|
auth.ts NPSSO -> OAuth code -> access token exchange, auto-refresh
|
|
72
94
|
http.ts Authenticated JSON client for m.np.playstation.com
|
|
73
95
|
api.ts Typed endpoint wrappers (profiles, trophies, games, search)
|
|
96
|
+
store.ts Public store catalog: deals, search, prices, star ratings
|
|
74
97
|
types.ts PSN API response types
|
|
75
98
|
```
|
|
76
99
|
|
|
77
|
-
|
|
100
|
+
The store module works differently from the account API: the store's GraphQL
|
|
101
|
+
endpoint only accepts Sony's whitelisted persisted queries, so it instead reads
|
|
102
|
+
the Apollo state and star-rating payloads that the store server-renders into
|
|
103
|
+
every page's `__NEXT_DATA__` blob. This needs no authentication but is
|
|
104
|
+
inherently coupled to the store's page structure.
|
|
105
|
+
|
|
106
|
+
Authentication is lazy: the server starts and lists tools without credentials;
|
|
107
|
+
the token exchange happens on the first tool call. Access tokens are refreshed
|
|
108
|
+
ahead of expiry, falling back to a full NPSSO re-exchange if the refresh token
|
|
109
|
+
has expired.
|
|
78
110
|
|
|
79
111
|
## Disclaimer
|
|
80
112
|
|
|
81
|
-
This project uses undocumented PSN endpoints and is not affiliated with or
|
|
113
|
+
This project uses undocumented PSN endpoints and is not affiliated with or
|
|
114
|
+
endorsed by Sony Interactive Entertainment. Use at your own risk.
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
4
4
|
import { TokenManager } from "./psn/auth.js";
|
|
5
5
|
import { PsnHttpClient } from "./psn/http.js";
|
|
6
6
|
import { PsnApi } from "./psn/api.js";
|
|
7
|
+
import { PsnStore } from "./psn/store.js";
|
|
7
8
|
import { registerTools } from "./tools.js";
|
|
8
9
|
async function main() {
|
|
9
10
|
const npsso = process.env.PSN_NPSSO ?? "";
|
|
@@ -16,8 +17,10 @@ async function main() {
|
|
|
16
17
|
// Auth is lazy: the token exchange happens on the first tool call, so the
|
|
17
18
|
// server starts (and lists tools) even before credentials are configured.
|
|
18
19
|
const psn = new PsnApi(new PsnHttpClient(new TokenManager(npsso || "unset")));
|
|
20
|
+
// Store browsing is public web data; no PSN account needed.
|
|
21
|
+
const store = new PsnStore(process.env.PSN_STORE_LOCALE ?? "en-us");
|
|
19
22
|
const server = new McpServer({ name: "psn-mcp", version: "0.1.0" });
|
|
20
|
-
registerTools(server, psn);
|
|
23
|
+
registerTools(server, psn, store);
|
|
21
24
|
await server.connect(new StdioServerTransport());
|
|
22
25
|
console.error("psn-mcp server running on stdio");
|
|
23
26
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,qEAAqE;QACrE,OAAO,CAAC,KAAK,CACX,2EAA2E;YACzE,mEAAmE;YACnE,8CAA8C,CACjD,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,aAAa,CAAC,IAAI,YAAY,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,qEAAqE;QACrE,OAAO,CAAC,KAAK,CACX,2EAA2E;YACzE,mEAAmE;YACnE,8CAA8C,CACjD,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,aAAa,CAAC,IAAI,YAAY,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9E,4DAA4D;IAC5D,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,CAAC;IAEpE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACpE,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAElC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;AACnD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/psn/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/psn/api.ts"],"names":[],"mappings":"AAcA;;;;;;GAMG;AACH,MAAM,OAAO,MAAM;IACY;IAA7B,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD,2EAA2E;IAE3E,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CACtB,kCAAkC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAC3E,CAAC;IACJ,CAAC;IAED,aAAa,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/psn/api.ts"],"names":[],"mappings":"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"}
|
package/dist/psn/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/psn/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,SAAS,GAAG,gDAAgD,CAAC;AACnE,MAAM,SAAS,GAAG,sCAAsC,CAAC;AACzD,MAAM,aAAa,GAAG,kBAAkB,CAAC;AACzC,MAAM,YAAY,GAAG,4CAA4C,CAAC;AAClE,MAAM,KAAK,GAAG,kCAAkC,CAAC;AAWjD,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAWD,+DAA+D;AAC/D,KAAK,UAAU,oBAAoB,CAAC,KAAa;IAC/C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,WAAW,EAAE,SAAS;QACtB,SAAS,EAAE,SAAS;QACpB,YAAY,EAAE,YAAY;QAC1B,aAAa,EAAE,MAAM;QACrB,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,cAAc,MAAM,EAAE,EAAE;QAC1D,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,KAAK,EAAE,EAAE;QACrC,QAAQ,EAAE,QAAQ;KACnB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,YAAY,CACpB,+DAA+D;YAC7D,uEAAuE;YACvE,8EAA8E,CACjF,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,YAAY,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/psn/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/psn/http.js
CHANGED
|
@@ -27,7 +27,9 @@ export class PsnHttpClient {
|
|
|
27
27
|
headers: {
|
|
28
28
|
Authorization: `Bearer ${accessToken}`,
|
|
29
29
|
"Accept-Language": "en-US",
|
|
30
|
-
...(options.body !== undefined
|
|
30
|
+
...(options.body !== undefined
|
|
31
|
+
? { "Content-Type": "application/json" }
|
|
32
|
+
: {}),
|
|
31
33
|
...options.headers,
|
|
32
34
|
},
|
|
33
35
|
body: options.body !== undefined ? JSON.stringify(options.body) : undefined,
|
package/dist/psn/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/psn/http.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AAEpD,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGlB;IACA;IAHlB,YACE,OAAe,EACC,MAAc,EACd,IAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAU;QAG9B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAYD,kEAAkE;AAClE,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAErD,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,UAA0B,EAAE;QACzD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAEvD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,QAAQ,GAAG,IAAI,EAAE,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/D,IAAI,KAAK,KAAK,SAAS;gBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;YAC/B,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,WAAW,EAAE;gBACtC,iBAAiB,EAAE,OAAO;gBAC1B,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/psn/http.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AAEpD,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGlB;IACA;IAHlB,YACE,OAAe,EACC,MAAc,EACd,IAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAU;QAG9B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAYD,kEAAkE;AAClE,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAErD,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,UAA0B,EAAE;QACzD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAEvD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,QAAQ,GAAG,IAAI,EAAE,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/D,IAAI,KAAK,KAAK,SAAS;gBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;YAC/B,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,WAAW,EAAE;gBACtC,iBAAiB,EAAE,OAAO;gBAC1B,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS;oBAC5B,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBACxC,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,OAAO,CAAC,OAAO;aACnB;YACD,IAAI,EACF,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SACxE,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,IAAa,CAAC;YAClB,IAAI,OAAO,GAAG,sBAAsB,IAAI,qBAAqB,GAAG,CAAC,MAAM,EAAE,CAAC;YAC1E,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAI,IAAyC,CAAC,KAAK,CAAC;gBAC7D,IAAI,GAAG,EAAE,OAAO;oBAAE,OAAO,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,iDAAiD;YACnD,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,OAAO;oBACL,qFAAqF,CAAC;YAC1F,CAAC;YACD,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;QAED,6CAA6C;QAC7C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAM,CAAC;IAC7C,CAAC;CACF"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PlayStation Store catalog access (deals, search, product details).
|
|
3
|
+
*
|
|
4
|
+
* The store's GraphQL API only accepts whitelisted persisted queries, so
|
|
5
|
+
* instead of chasing query hashes this module reads the same data from the
|
|
6
|
+
* server-rendered store pages: every page embeds its Apollo state (products,
|
|
7
|
+
* prices, discounts) and micro-frontend payloads (star ratings) in a
|
|
8
|
+
* __NEXT_DATA__ JSON blob. No authentication is required - this is the
|
|
9
|
+
* public web store.
|
|
10
|
+
*/
|
|
11
|
+
/** The store's evergreen "All deals" category. */
|
|
12
|
+
export declare const ALL_DEALS_CATEGORY_ID = "3f772501-f6f8-49b7-abac-874a88ca4897";
|
|
13
|
+
export declare class PsnStoreError extends Error {
|
|
14
|
+
readonly status?: number | undefined;
|
|
15
|
+
constructor(message: string, status?: number | undefined);
|
|
16
|
+
}
|
|
17
|
+
export interface StorePrice {
|
|
18
|
+
basePrice?: string;
|
|
19
|
+
discountedPrice?: string;
|
|
20
|
+
discountText?: string;
|
|
21
|
+
isFree?: boolean;
|
|
22
|
+
isTiedToSubscription?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface StoreItem {
|
|
25
|
+
productId: string;
|
|
26
|
+
name: string;
|
|
27
|
+
type?: string;
|
|
28
|
+
platforms?: string[];
|
|
29
|
+
price?: StorePrice;
|
|
30
|
+
imageUrl?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface StarRating {
|
|
33
|
+
averageRating: number;
|
|
34
|
+
totalRatingsCount: number;
|
|
35
|
+
ratingsDistribution?: Array<{
|
|
36
|
+
rating: number;
|
|
37
|
+
percentage: string;
|
|
38
|
+
}>;
|
|
39
|
+
}
|
|
40
|
+
export interface CategoryGridPage {
|
|
41
|
+
categoryId: string;
|
|
42
|
+
categoryName?: string;
|
|
43
|
+
page: number;
|
|
44
|
+
pageSize: number;
|
|
45
|
+
totalCount?: number;
|
|
46
|
+
items: StoreItem[];
|
|
47
|
+
}
|
|
48
|
+
export interface StoreProduct extends StoreItem {
|
|
49
|
+
starRating?: StarRating;
|
|
50
|
+
conceptId?: string;
|
|
51
|
+
url: string;
|
|
52
|
+
}
|
|
53
|
+
export declare class PsnStore {
|
|
54
|
+
private readonly locale;
|
|
55
|
+
constructor(locale?: string);
|
|
56
|
+
private fetchNextData;
|
|
57
|
+
private toStoreItem;
|
|
58
|
+
/** One page (24 items) of a store category grid, e.g. the "All deals" category. */
|
|
59
|
+
getCategoryGrid(categoryId: string, page?: number): Promise<CategoryGridPage>;
|
|
60
|
+
/** Product details including price and the community star rating. */
|
|
61
|
+
getProduct(productId: string): Promise<StoreProduct>;
|
|
62
|
+
/**
|
|
63
|
+
* Star ratings are rendered by the "star-rating" micro-frontend, whose
|
|
64
|
+
* Apollo cache is embedded in the page as an inner JSON script tag.
|
|
65
|
+
*/
|
|
66
|
+
private extractStarRating;
|
|
67
|
+
/** Search the store catalog (games, add-ons, bundles) by name. */
|
|
68
|
+
search(term: string): Promise<StoreItem[]>;
|
|
69
|
+
/**
|
|
70
|
+
* A page of deals, optionally enriched with each product's star rating
|
|
71
|
+
* (one extra page fetch per product, done concurrently).
|
|
72
|
+
*/
|
|
73
|
+
getDeals(page?: number, includeRatings?: boolean, categoryId?: string): Promise<CategoryGridPage & {
|
|
74
|
+
items: Array<StoreItem & {
|
|
75
|
+
starRating?: StarRating;
|
|
76
|
+
}>;
|
|
77
|
+
}>;
|
|
78
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PlayStation Store catalog access (deals, search, product details).
|
|
3
|
+
*
|
|
4
|
+
* The store's GraphQL API only accepts whitelisted persisted queries, so
|
|
5
|
+
* instead of chasing query hashes this module reads the same data from the
|
|
6
|
+
* server-rendered store pages: every page embeds its Apollo state (products,
|
|
7
|
+
* prices, discounts) and micro-frontend payloads (star ratings) in a
|
|
8
|
+
* __NEXT_DATA__ JSON blob. No authentication is required - this is the
|
|
9
|
+
* public web store.
|
|
10
|
+
*/
|
|
11
|
+
const STORE_BASE = "https://store.playstation.com";
|
|
12
|
+
/** The store's evergreen "All deals" category. */
|
|
13
|
+
export const ALL_DEALS_CATEGORY_ID = "3f772501-f6f8-49b7-abac-874a88ca4897";
|
|
14
|
+
const PAGE_SIZE = 24; // fixed by the store's category grid
|
|
15
|
+
export class PsnStoreError extends Error {
|
|
16
|
+
status;
|
|
17
|
+
constructor(message, status) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.status = status;
|
|
20
|
+
this.name = "PsnStoreError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class PsnStore {
|
|
24
|
+
locale;
|
|
25
|
+
constructor(locale = "en-us") {
|
|
26
|
+
this.locale = locale;
|
|
27
|
+
}
|
|
28
|
+
async fetchNextData(path) {
|
|
29
|
+
const url = `${STORE_BASE}/${this.locale}${path}`;
|
|
30
|
+
const res = await fetch(url, {
|
|
31
|
+
headers: {
|
|
32
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36",
|
|
33
|
+
"Accept-Language": "en-US,en;q=0.9",
|
|
34
|
+
},
|
|
35
|
+
redirect: "follow",
|
|
36
|
+
signal: AbortSignal.timeout(30_000),
|
|
37
|
+
});
|
|
38
|
+
if (!res.ok) {
|
|
39
|
+
throw new PsnStoreError(`PlayStation Store request to ${url} failed with HTTP ${res.status}`, res.status);
|
|
40
|
+
}
|
|
41
|
+
const html = await res.text();
|
|
42
|
+
const match = html.match(/<script id="__NEXT_DATA__" type="application\/json">(.*?)<\/script>/s);
|
|
43
|
+
if (!match) {
|
|
44
|
+
throw new PsnStoreError(`Could not find embedded page data at ${url}; the store layout may have changed.`);
|
|
45
|
+
}
|
|
46
|
+
const data = JSON.parse(match[1]);
|
|
47
|
+
const title = html.match(/<title>([^<]*)<\/title>/)?.[1];
|
|
48
|
+
return {
|
|
49
|
+
apollo: data.props?.apolloState ?? {},
|
|
50
|
+
pageProps: data.props?.pageProps ?? {},
|
|
51
|
+
title,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
toStoreItem(entity) {
|
|
55
|
+
const price = entity.price;
|
|
56
|
+
const media = entity.media;
|
|
57
|
+
const image = media?.find((m) => m.type === "IMAGE" && m.role === "MASTER") ??
|
|
58
|
+
media?.find((m) => m.type === "IMAGE");
|
|
59
|
+
return {
|
|
60
|
+
productId: String(entity.id ?? ""),
|
|
61
|
+
name: String(entity.name ?? ""),
|
|
62
|
+
type: (entity.localizedStoreDisplayClassification ??
|
|
63
|
+
entity.storeDisplayClassification),
|
|
64
|
+
platforms: entity.platforms,
|
|
65
|
+
price: price && {
|
|
66
|
+
basePrice: price.basePrice,
|
|
67
|
+
discountedPrice: price.discountedPrice,
|
|
68
|
+
discountText: price.discountText,
|
|
69
|
+
isFree: price.isFree,
|
|
70
|
+
isTiedToSubscription: price.isTiedToSubscription,
|
|
71
|
+
},
|
|
72
|
+
imageUrl: image?.url,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** One page (24 items) of a store category grid, e.g. the "All deals" category. */
|
|
76
|
+
async getCategoryGrid(categoryId, page = 1) {
|
|
77
|
+
const { apollo, title } = await this.fetchNextData(`/category/${encodeURIComponent(categoryId)}/${page}`);
|
|
78
|
+
const grid = Object.entries(apollo).find(([key]) => key.startsWith("CategoryGrid:"))?.[1];
|
|
79
|
+
if (!grid) {
|
|
80
|
+
throw new PsnStoreError(`No category grid found for category ${categoryId} (page ${page}). ` +
|
|
81
|
+
"The category id may be invalid or the page out of range.");
|
|
82
|
+
}
|
|
83
|
+
// The grid lists products as Apollo refs; resolve them in grid order.
|
|
84
|
+
const refs = grid.products ?? [];
|
|
85
|
+
const items = refs
|
|
86
|
+
.map((ref) => "__ref" in ref && typeof ref.__ref === "string"
|
|
87
|
+
? apollo[ref.__ref]
|
|
88
|
+
: ref)
|
|
89
|
+
.filter((p) => Boolean(p && p.id))
|
|
90
|
+
.map((p) => this.toStoreItem(p));
|
|
91
|
+
const pageInfo = grid.pageInfo;
|
|
92
|
+
return {
|
|
93
|
+
categoryId,
|
|
94
|
+
categoryName: title?.split("|")[0]?.trim(),
|
|
95
|
+
page,
|
|
96
|
+
pageSize: PAGE_SIZE,
|
|
97
|
+
totalCount: pageInfo?.totalCount,
|
|
98
|
+
items,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/** Product details including price and the community star rating. */
|
|
102
|
+
async getProduct(productId) {
|
|
103
|
+
const { apollo, pageProps } = await this.fetchNextData(`/product/${encodeURIComponent(productId)}`);
|
|
104
|
+
const entity = apollo[`Product:${productId}`] ??
|
|
105
|
+
Object.entries(apollo).find(([key, value]) => key.startsWith("Product:") && value.__typename === "Product")?.[1];
|
|
106
|
+
if (!entity) {
|
|
107
|
+
throw new PsnStoreError(`Product ${productId} not found on the PlayStation Store.`);
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
...this.toStoreItem(entity),
|
|
111
|
+
starRating: this.extractStarRating(pageProps, productId),
|
|
112
|
+
url: `${STORE_BASE}/${this.locale}/product/${productId}`,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Star ratings are rendered by the "star-rating" micro-frontend, whose
|
|
117
|
+
* Apollo cache is embedded in the page as an inner JSON script tag.
|
|
118
|
+
*/
|
|
119
|
+
extractStarRating(pageProps, productId) {
|
|
120
|
+
const batarangs = pageProps.batarangs;
|
|
121
|
+
const text = batarangs?.["star-rating"]?.text;
|
|
122
|
+
if (!text)
|
|
123
|
+
return undefined;
|
|
124
|
+
const inner = text.match(/<script[^>]*>(.*)<\/script>/s)?.[1];
|
|
125
|
+
if (!inner)
|
|
126
|
+
return undefined;
|
|
127
|
+
try {
|
|
128
|
+
const payload = JSON.parse(inner);
|
|
129
|
+
const cached = payload.cache?.[`Product:${productId}`] ??
|
|
130
|
+
Object.values(payload.cache ?? {}).find((v) => v.__typename === "Product" && v.starRating);
|
|
131
|
+
const rating = cached?.starRating;
|
|
132
|
+
if (rating?.averageRating === undefined)
|
|
133
|
+
return undefined;
|
|
134
|
+
return {
|
|
135
|
+
averageRating: rating.averageRating,
|
|
136
|
+
totalRatingsCount: rating.totalRatingsCount ?? 0,
|
|
137
|
+
ratingsDistribution: rating.ratingsDistribution?.map(({ rating: r, percentage }) => ({
|
|
138
|
+
rating: r,
|
|
139
|
+
percentage,
|
|
140
|
+
})),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Search the store catalog (games, add-ons, bundles) by name. */
|
|
148
|
+
async search(term) {
|
|
149
|
+
const { apollo } = await this.fetchNextData(`/search/${encodeURIComponent(term)}`);
|
|
150
|
+
return Object.entries(apollo)
|
|
151
|
+
.filter(([key, value]) => key.startsWith("Product:") &&
|
|
152
|
+
value.__typename === "Product" &&
|
|
153
|
+
value.name)
|
|
154
|
+
.map(([, value]) => this.toStoreItem(value));
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* A page of deals, optionally enriched with each product's star rating
|
|
158
|
+
* (one extra page fetch per product, done concurrently).
|
|
159
|
+
*/
|
|
160
|
+
async getDeals(page = 1, includeRatings = false, categoryId = ALL_DEALS_CATEGORY_ID) {
|
|
161
|
+
const grid = await this.getCategoryGrid(categoryId, page);
|
|
162
|
+
if (!includeRatings)
|
|
163
|
+
return grid;
|
|
164
|
+
const items = await mapWithConcurrency(grid.items, 6, async (item) => {
|
|
165
|
+
try {
|
|
166
|
+
const product = await this.getProduct(item.productId);
|
|
167
|
+
return { ...item, starRating: product.starRating };
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return item; // rating unavailable; keep the deal itself
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
return { ...grid, items };
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async function mapWithConcurrency(inputs, concurrency, fn) {
|
|
177
|
+
const results = new Array(inputs.length);
|
|
178
|
+
let next = 0;
|
|
179
|
+
const workers = Array.from({ length: Math.min(concurrency, inputs.length) }, async () => {
|
|
180
|
+
while (next < inputs.length) {
|
|
181
|
+
const index = next++;
|
|
182
|
+
results[index] = await fn(inputs[index]);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
await Promise.all(workers);
|
|
186
|
+
return results;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/psn/store.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { PsnApi } from "./psn/api.js";
|
|
3
|
-
|
|
3
|
+
import { type PsnStore } from "./psn/store.js";
|
|
4
|
+
export declare function registerTools(server: McpServer, psn: PsnApi, store: PsnStore): void;
|
package/dist/tools.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { ALL_DEALS_CATEGORY_ID } from "./psn/store.js";
|
|
2
3
|
const userParam = z
|
|
3
4
|
.string()
|
|
4
5
|
.describe('PSN user: "me" for the authenticated account, a PSN online id (username), or a numeric account id.');
|
|
@@ -7,7 +8,9 @@ const npServiceNameParam = z
|
|
|
7
8
|
.describe('Trophy service: "trophy2" for PS5/PS VR2 titles, "trophy" for PS4 and earlier. ' +
|
|
8
9
|
"Use the npServiceName reported by psn_get_trophy_titles.");
|
|
9
10
|
function jsonResult(data) {
|
|
10
|
-
return {
|
|
11
|
+
return {
|
|
12
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
13
|
+
};
|
|
11
14
|
}
|
|
12
15
|
function errorResult(error) {
|
|
13
16
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -24,7 +27,7 @@ function handle(fn) {
|
|
|
24
27
|
}
|
|
25
28
|
};
|
|
26
29
|
}
|
|
27
|
-
export function registerTools(server, psn) {
|
|
30
|
+
export function registerTools(server, psn, store) {
|
|
28
31
|
server.registerTool("psn_get_profile", {
|
|
29
32
|
title: "Get PSN profile",
|
|
30
33
|
description: "Get a PlayStation Network user's profile: online id, about-me, avatars, " +
|
|
@@ -37,7 +40,13 @@ export function registerTools(server, psn) {
|
|
|
37
40
|
"account ids, and avatars. Useful for finding a user's account id.",
|
|
38
41
|
inputSchema: {
|
|
39
42
|
query: z.string().describe("Name or online id to search for."),
|
|
40
|
-
limit: z
|
|
43
|
+
limit: z
|
|
44
|
+
.number()
|
|
45
|
+
.int()
|
|
46
|
+
.min(1)
|
|
47
|
+
.max(50)
|
|
48
|
+
.default(20)
|
|
49
|
+
.describe("Max results."),
|
|
41
50
|
},
|
|
42
51
|
}, handle(async ({ query, limit }) => {
|
|
43
52
|
const res = await psn.searchPlayers(query, limit);
|
|
@@ -59,8 +68,19 @@ export function registerTools(server, psn) {
|
|
|
59
68
|
"own are only visible if that user's privacy settings allow it.",
|
|
60
69
|
inputSchema: {
|
|
61
70
|
user: userParam.default("me"),
|
|
62
|
-
limit: z
|
|
63
|
-
|
|
71
|
+
limit: z
|
|
72
|
+
.number()
|
|
73
|
+
.int()
|
|
74
|
+
.min(1)
|
|
75
|
+
.max(500)
|
|
76
|
+
.default(50)
|
|
77
|
+
.describe("Max friends to return."),
|
|
78
|
+
offset: z
|
|
79
|
+
.number()
|
|
80
|
+
.int()
|
|
81
|
+
.min(0)
|
|
82
|
+
.default(0)
|
|
83
|
+
.describe("Pagination offset."),
|
|
64
84
|
},
|
|
65
85
|
}, handle(async ({ user, limit, offset }) => {
|
|
66
86
|
const accountId = await psn.resolveAccountId(user);
|
|
@@ -69,7 +89,11 @@ export function registerTools(server, psn) {
|
|
|
69
89
|
const profiles = await Promise.all(friends.friends.map(async (id) => {
|
|
70
90
|
try {
|
|
71
91
|
const profile = await psn.getProfile(id);
|
|
72
|
-
return {
|
|
92
|
+
return {
|
|
93
|
+
accountId: id,
|
|
94
|
+
onlineId: profile.onlineId,
|
|
95
|
+
isPlus: profile.isPlus,
|
|
96
|
+
};
|
|
73
97
|
}
|
|
74
98
|
catch {
|
|
75
99
|
return { accountId: id };
|
|
@@ -100,8 +124,19 @@ export function registerTools(server, psn) {
|
|
|
100
124
|
"npCommunicationId and npServiceName for use with the trophy detail tools.",
|
|
101
125
|
inputSchema: {
|
|
102
126
|
user: userParam.default("me"),
|
|
103
|
-
limit: z
|
|
104
|
-
|
|
127
|
+
limit: z
|
|
128
|
+
.number()
|
|
129
|
+
.int()
|
|
130
|
+
.min(1)
|
|
131
|
+
.max(800)
|
|
132
|
+
.default(50)
|
|
133
|
+
.describe("Max titles to return."),
|
|
134
|
+
offset: z
|
|
135
|
+
.number()
|
|
136
|
+
.int()
|
|
137
|
+
.min(0)
|
|
138
|
+
.default(0)
|
|
139
|
+
.describe("Pagination offset."),
|
|
105
140
|
},
|
|
106
141
|
}, handle(async ({ user, limit, offset }) => psn.getTrophyTitles(await psn.resolveAccountId(user), limit, offset)));
|
|
107
142
|
server.registerTool("psn_get_title_trophies", {
|
|
@@ -136,16 +171,70 @@ export function registerTools(server, psn) {
|
|
|
136
171
|
limit: z.number().int().min(1).max(500).default(200),
|
|
137
172
|
offset: z.number().int().min(0).default(0),
|
|
138
173
|
},
|
|
139
|
-
}, handle(async ({ user, npCommunicationId, npServiceName, trophyGroupId, limit, offset }) => psn.getEarnedTrophies(await psn.resolveAccountId(user), npCommunicationId, npServiceName, trophyGroupId, limit, offset)));
|
|
174
|
+
}, handle(async ({ user, npCommunicationId, npServiceName, trophyGroupId, limit, offset, }) => psn.getEarnedTrophies(await psn.resolveAccountId(user), npCommunicationId, npServiceName, trophyGroupId, limit, offset)));
|
|
140
175
|
server.registerTool("psn_get_played_games", {
|
|
141
176
|
title: "Get played games",
|
|
142
177
|
description: "List the PS4/PS5 games a user has played, with play counts, first/last " +
|
|
143
178
|
"played dates, and total play duration. Subject to the user's privacy settings.",
|
|
144
179
|
inputSchema: {
|
|
145
180
|
user: userParam.default("me"),
|
|
146
|
-
limit: z
|
|
147
|
-
|
|
181
|
+
limit: z
|
|
182
|
+
.number()
|
|
183
|
+
.int()
|
|
184
|
+
.min(1)
|
|
185
|
+
.max(200)
|
|
186
|
+
.default(50)
|
|
187
|
+
.describe("Max games to return."),
|
|
188
|
+
offset: z
|
|
189
|
+
.number()
|
|
190
|
+
.int()
|
|
191
|
+
.min(0)
|
|
192
|
+
.default(0)
|
|
193
|
+
.describe("Pagination offset."),
|
|
148
194
|
},
|
|
149
195
|
}, handle(async ({ user, limit, offset }) => psn.getPlayedGames(await psn.resolveAccountId(user), limit, offset)));
|
|
196
|
+
// ---- PlayStation Store (no PSN account required) -----------------------
|
|
197
|
+
server.registerTool("psn_get_store_deals", {
|
|
198
|
+
title: "Get PlayStation Store deals",
|
|
199
|
+
description: "List games currently on sale on the PlayStation Store, with base price, " +
|
|
200
|
+
"sale price, and discount percentage. Set includeRatings to also fetch each " +
|
|
201
|
+
"game's community star rating (0-5) and rating count - useful for ranking " +
|
|
202
|
+
"deals by review score. Returns 24 items per page; pass page to paginate. " +
|
|
203
|
+
"Store region comes from the PSN_STORE_LOCALE env var (default en-us).",
|
|
204
|
+
inputSchema: {
|
|
205
|
+
page: z
|
|
206
|
+
.number()
|
|
207
|
+
.int()
|
|
208
|
+
.min(1)
|
|
209
|
+
.default(1)
|
|
210
|
+
.describe("Grid page (24 deals per page)."),
|
|
211
|
+
includeRatings: z
|
|
212
|
+
.boolean()
|
|
213
|
+
.default(false)
|
|
214
|
+
.describe("Also fetch each product's star rating (slower: one extra fetch per item)."),
|
|
215
|
+
categoryId: z
|
|
216
|
+
.string()
|
|
217
|
+
.default(ALL_DEALS_CATEGORY_ID)
|
|
218
|
+
.describe('Store category to browse; defaults to the "All deals" category.'),
|
|
219
|
+
},
|
|
220
|
+
}, handle(({ page, includeRatings, categoryId }) => store.getDeals(page, includeRatings, categoryId)));
|
|
221
|
+
server.registerTool("psn_get_store_product", {
|
|
222
|
+
title: "Get PlayStation Store product",
|
|
223
|
+
description: "Get a store product's details: current price, discount, platforms, and " +
|
|
224
|
+
"community star rating with rating count and distribution. Product ids look " +
|
|
225
|
+
'like "UP0006-PPSA27360_00-26STANDARDBUNDLE" and come from psn_get_store_deals ' +
|
|
226
|
+
"or psn_search_store.",
|
|
227
|
+
inputSchema: {
|
|
228
|
+
productId: z.string().describe("PlayStation Store product id."),
|
|
229
|
+
},
|
|
230
|
+
}, handle(({ productId }) => store.getProduct(productId)));
|
|
231
|
+
server.registerTool("psn_search_store", {
|
|
232
|
+
title: "Search the PlayStation Store",
|
|
233
|
+
description: "Search the PlayStation Store catalog for games, bundles, and add-ons by " +
|
|
234
|
+
"name. Returns product ids, current prices, and any active discounts.",
|
|
235
|
+
inputSchema: {
|
|
236
|
+
query: z.string().describe("Game or product name to search for."),
|
|
237
|
+
},
|
|
238
|
+
}, handle(({ query }) => store.search(query)));
|
|
150
239
|
}
|
|
151
240
|
//# sourceMappingURL=tools.js.map
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "psn-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "MCP server for interfacing with the PlayStation Network",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/tmrp/psn-mcp.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/tmrp/psn-mcp#readme",
|
|
12
|
+
"bugs": "https://github.com/tmrp/psn-mcp/issues",
|
|
7
13
|
"bin": {
|
|
8
14
|
"psn-mcp": "dist/index.js"
|
|
9
15
|
},
|
|
10
16
|
"main": "dist/index.js",
|
|
11
17
|
"files": [
|
|
12
|
-
"dist"
|
|
18
|
+
"dist",
|
|
19
|
+
"package.json",
|
|
20
|
+
"LICENSE",
|
|
21
|
+
"README.md"
|
|
13
22
|
],
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
},
|
|
17
|
-
"scripts": {
|
|
18
|
-
"build": "tsc",
|
|
19
|
-
"prepublishOnly": "tsc",
|
|
20
|
-
"dev": "tsx src/index.ts",
|
|
21
|
-
"start": "node dist/index.js",
|
|
22
|
-
"typecheck": "tsc --noEmit"
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"provenance": true
|
|
23
25
|
},
|
|
24
26
|
"keywords": [
|
|
25
27
|
"mcp",
|
|
@@ -33,8 +35,26 @@
|
|
|
33
35
|
"zod": "^3.24.0"
|
|
34
36
|
},
|
|
35
37
|
"devDependencies": {
|
|
36
|
-
"@
|
|
38
|
+
"@changesets/changelog-github": "^0.7.0",
|
|
39
|
+
"@changesets/cli": "^2.31.0",
|
|
40
|
+
"@types/node": "^22.20.1",
|
|
41
|
+
"prettier": "^3.5.0",
|
|
37
42
|
"tsx": "^4.19.0",
|
|
38
43
|
"typescript": "^5.7.0"
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=24.18.0"
|
|
47
|
+
},
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "tsc",
|
|
50
|
+
"changeset": "changeset",
|
|
51
|
+
"dev": "tsx src/index.ts",
|
|
52
|
+
"start": "node dist/index.js",
|
|
53
|
+
"lint": "prettier --check .",
|
|
54
|
+
"lint:fix": "prettier --write .",
|
|
55
|
+
"test": "node --import tsx --test tests/*.test.ts",
|
|
56
|
+
"typecheck": "tsc --noEmit",
|
|
57
|
+
"version:packages": "changeset version && pnpm install --lockfile-only && prettier --write \"**/CHANGELOG.md\"",
|
|
58
|
+
"release": "changeset publish"
|
|
39
59
|
}
|
|
40
|
-
}
|
|
60
|
+
}
|