psn-mcp 0.2.2 → 0.3.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/README.md +80 -40
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/psn/browser-login.d.ts.map +1 -1
- package/dist/psn/browser-login.js +17 -8
- package/dist/psn/browser-login.js.map +1 -1
- package/dist/psn/concurrency.d.ts +8 -0
- package/dist/psn/concurrency.d.ts.map +1 -0
- package/dist/psn/concurrency.js +22 -0
- package/dist/psn/concurrency.js.map +1 -0
- package/dist/psn/store.d.ts +5 -0
- package/dist/psn/store.d.ts.map +1 -1
- package/dist/psn/store.js +126 -38
- package/dist/psn/store.js.map +1 -1
- package/dist/tools.d.ts +12 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +29 -13
- package/dist/tools.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,48 +1,44 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
interfacing with the PlayStation Network. Lets MCP clients like Claude look up
|
|
5
|
-
PSN profiles, friends, online presence, trophies, and play history.
|
|
3
|
+
# 🎮 psn-mcp
|
|
6
4
|
|
|
7
|
-
|
|
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.
|
|
5
|
+
**A [Model Context Protocol](https://modelcontextprotocol.io) server for the PlayStation Network**
|
|
11
6
|
|
|
12
|
-
|
|
7
|
+
Let MCP clients like Claude look up PSN profiles, friends, online presence,
|
|
8
|
+
trophies, play history, and store deals — in plain language.
|
|
13
9
|
|
|
14
|
-
|
|
15
|
-
- A PlayStation Network account
|
|
10
|
+
<br />
|
|
16
11
|
|
|
17
|
-
|
|
12
|
+
[](https://www.npmjs.com/package/psn-mcp)
|
|
13
|
+
[](https://www.npmjs.com/package/psn-mcp)
|
|
14
|
+
[](https://nodejs.org)
|
|
15
|
+
[](./LICENSE)
|
|
16
|
+
[](https://modelcontextprotocol.io)
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
</div>
|
|
20
19
|
|
|
21
|
-
|
|
22
|
-
2. Call the `psn_begin_login` tool.
|
|
23
|
-
3. Sign in to PlayStation in the browser window it opens.
|
|
24
|
-
4. Call the `psn_complete_login` tool.
|
|
20
|
+
---
|
|
25
21
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
22
|
+
The PSN API layer is written from scratch in TypeScript on Node's built-in
|
|
23
|
+
`fetch` — no PSN client dependencies. It authenticates the same way the official
|
|
24
|
+
PlayStation mobile app does and talks directly to Sony's `m.np.playstation.com`
|
|
25
|
+
API.
|
|
30
26
|
|
|
31
|
-
|
|
27
|
+
## ✨ Highlights
|
|
32
28
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
- 🧑🤝🧑 **Profiles & friends** — look up any player, resolve friends lists to full profiles
|
|
30
|
+
- 🟢 **Live presence** — see who's online, on which platform, and what they're playing
|
|
31
|
+
- 🏆 **Trophies** — levels, tiers, per-game progress, earned state, and global rarity
|
|
32
|
+
- ⏱️ **Play history** — PS4/PS5 games with play counts and total durations
|
|
33
|
+
- 🛒 **Store** — deals, prices, discounts, and review scores, **no PSN account required**
|
|
34
|
+
- 🔒 **Zero client deps** — pure TypeScript on Node `fetch`, credentials stored owner-only
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
refreshes it automatically. NPSSO tokens expire after about two months; when
|
|
39
|
-
tools start failing with an auth error, run the login flow again.
|
|
36
|
+
## 📦 Requirements
|
|
40
37
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
> settings.
|
|
38
|
+
- Node.js 24.18+
|
|
39
|
+
- A PlayStation Network account (not needed for the store tools)
|
|
44
40
|
|
|
45
|
-
## Usage with an MCP client
|
|
41
|
+
## 🚀 Usage with an MCP client
|
|
46
42
|
|
|
47
43
|
No installation needed — run it with `npx`. Add to your client's MCP
|
|
48
44
|
configuration (e.g. `claude_desktop_config.json`):
|
|
@@ -64,7 +60,40 @@ Or for Claude Code:
|
|
|
64
60
|
claude mcp add psn -- npx -y psn-mcp
|
|
65
61
|
```
|
|
66
62
|
|
|
67
|
-
##
|
|
63
|
+
## 🔑 Signing in
|
|
64
|
+
|
|
65
|
+
The MCP server can automate NPSSO capture through an isolated browser profile:
|
|
66
|
+
|
|
67
|
+
1. Start the MCP server without `PSN_NPSSO`.
|
|
68
|
+
2. Call the `psn_begin_login` tool.
|
|
69
|
+
3. Sign in to PlayStation in the browser window it opens.
|
|
70
|
+
4. Call the `psn_complete_login` tool.
|
|
71
|
+
|
|
72
|
+
`psn_complete_login` reads the PlayStation `npsso` browser cookie, verifies it,
|
|
73
|
+
and stores it in `~/.config/psn-mcp/credentials.json` with owner-only file
|
|
74
|
+
permissions. Future server starts use the stored token automatically. Set
|
|
75
|
+
`PSN_NPSSO_FILE` to choose a different credential file.
|
|
76
|
+
|
|
77
|
+
<details>
|
|
78
|
+
<summary><strong>Manual NPSSO setup</strong> (if browser automation is unavailable)</summary>
|
|
79
|
+
|
|
80
|
+
<br />
|
|
81
|
+
|
|
82
|
+
1. Sign in at [playstation.com](https://www.playstation.com).
|
|
83
|
+
2. In the same browser, open <https://ca.account.sony.com/api/v1/ssocookie>.
|
|
84
|
+
3. Copy the 64-character `npsso` value from the JSON response into `PSN_NPSSO`.
|
|
85
|
+
|
|
86
|
+
</details>
|
|
87
|
+
|
|
88
|
+
The server exchanges the NPSSO for an OAuth access token on first use and
|
|
89
|
+
refreshes it automatically. NPSSO tokens expire after about two months; when
|
|
90
|
+
tools start failing with an auth error, run the login flow again.
|
|
91
|
+
|
|
92
|
+
> [!NOTE]
|
|
93
|
+
> This uses your personal account session. What you can see (other users'
|
|
94
|
+
> friends, presence, play history) is governed by normal PSN privacy settings.
|
|
95
|
+
|
|
96
|
+
## 🧰 Tools
|
|
68
97
|
|
|
69
98
|
| Tool | Description |
|
|
70
99
|
| ------------------------- | ------------------------------------------------------------------ |
|
|
@@ -95,12 +124,12 @@ The three `store` tools browse the public PlayStation Store and need **no PSN
|
|
|
95
124
|
account**. Set `PSN_STORE_LOCALE` (e.g. `en-gb`, `de-de`, `ja-jp`) to change the
|
|
96
125
|
store region and currency; the default is `en-us`.
|
|
97
126
|
|
|
98
|
-
## Examples
|
|
127
|
+
## 💬 Examples
|
|
99
128
|
|
|
100
129
|
Once the server is connected, just ask in natural language. Some prompts and the
|
|
101
130
|
tools they exercise:
|
|
102
131
|
|
|
103
|
-
|
|
132
|
+
#### 🟢 Presence and friends
|
|
104
133
|
|
|
105
134
|
> _"Is anyone on my friends list online right now? What are they playing?"_
|
|
106
135
|
|
|
@@ -112,7 +141,7 @@ who is online, on which platform, and in what game.
|
|
|
112
141
|
Calls `psn_get_profile` with `user: "Hakoom"` — any tool that takes a `user`
|
|
113
142
|
accepts `"me"`, an online id, or a numeric account id.
|
|
114
143
|
|
|
115
|
-
|
|
144
|
+
#### 🏆 Trophies
|
|
116
145
|
|
|
117
146
|
> _"What's my trophy level, and what game did I most recently earn trophies
|
|
118
147
|
> in?"_
|
|
@@ -127,13 +156,13 @@ Finds the game via `psn_get_trophy_titles` (getting its `npCommunicationId` and
|
|
|
127
156
|
descriptions) with `psn_get_earned_trophies` (earned state and global rarity) to
|
|
128
157
|
list the unearned ones, rarest first.
|
|
129
158
|
|
|
130
|
-
|
|
159
|
+
#### ⏱️ Play history
|
|
131
160
|
|
|
132
161
|
> _"How many hours have I put into my ten most-played PS5 games?"_
|
|
133
162
|
|
|
134
163
|
Calls `psn_get_played_games` and ranks by total play duration.
|
|
135
164
|
|
|
136
|
-
|
|
165
|
+
#### 🛒 Store (no PSN account needed)
|
|
137
166
|
|
|
138
167
|
> _"Give me the top 10 games currently on sale based on review score."_
|
|
139
168
|
|
|
@@ -145,7 +174,7 @@ Calls `psn_get_store_deals` with `includeRatings: true` and ranks by
|
|
|
145
174
|
Calls `psn_search_store` with `query: "Elden Ring"`, then
|
|
146
175
|
`psn_get_store_product` for the price, discount, and star-rating breakdown.
|
|
147
176
|
|
|
148
|
-
## Architecture
|
|
177
|
+
## 🏗️ Architecture
|
|
149
178
|
|
|
150
179
|
```
|
|
151
180
|
src/
|
|
@@ -165,12 +194,23 @@ the Apollo state and star-rating payloads that the store server-renders into
|
|
|
165
194
|
every page's `__NEXT_DATA__` blob. This needs no authentication but is
|
|
166
195
|
inherently coupled to the store's page structure.
|
|
167
196
|
|
|
197
|
+
> **Need help outside this package?** I offer a €250 fixed-scope repair for one
|
|
198
|
+
> reproducible bug in a public TypeScript or React repository: an agreed
|
|
199
|
+
> acceptance test, a patch with relevant automated tests, a draft pull request,
|
|
200
|
+
> and one revision. [Submit a public request](https://github.com/tmrp/tmrp/issues/new?template=fixed-scope.yml&title=%5BRepair%20request%20via%20psn-mcp%5D%3A%20).
|
|
201
|
+
> Requests are reviewed before acceptance; no payment is due on submission.
|
|
202
|
+
|
|
168
203
|
Authentication is lazy: the server starts and lists tools without credentials;
|
|
169
204
|
the token exchange happens on the first tool call. Access tokens are refreshed
|
|
170
205
|
ahead of expiry, falling back to a full NPSSO re-exchange if the refresh token
|
|
171
206
|
has expired.
|
|
172
207
|
|
|
173
|
-
## Disclaimer
|
|
208
|
+
## ⚠️ Disclaimer
|
|
174
209
|
|
|
175
210
|
This project uses undocumented PSN endpoints and is not affiliated with or
|
|
176
211
|
endorsed by Sony Interactive Entertainment. Use at your own risk.
|
|
212
|
+
|
|
213
|
+
<div align="center">
|
|
214
|
+
<br />
|
|
215
|
+
<sub>Licensed under <a href="./LICENSE">MIT</a></sub>
|
|
216
|
+
</div>
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
2
5
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
6
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
7
|
import { TokenManager } from "./psn/auth.js";
|
|
@@ -7,6 +10,10 @@ import { PsnHttpClient } from "./psn/http.js";
|
|
|
7
10
|
import { PsnApi } from "./psn/api.js";
|
|
8
11
|
import { PsnStore } from "./psn/store.js";
|
|
9
12
|
import { registerTools } from "./tools.js";
|
|
13
|
+
// Read the version at runtime rather than hardcoding it. package.json sits one
|
|
14
|
+
// level up from this file in both dev (src/) and the published package (dist/),
|
|
15
|
+
// and is included in the package's `files` list.
|
|
16
|
+
const { version } = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), "..", "package.json"), "utf8"));
|
|
10
17
|
async function main() {
|
|
11
18
|
const npsso = process.env.PSN_NPSSO || (await loadStoredNpsso()) || "";
|
|
12
19
|
if (!npsso) {
|
|
@@ -21,7 +28,7 @@ async function main() {
|
|
|
21
28
|
const psn = new PsnApi(new PsnHttpClient(tokens));
|
|
22
29
|
// Store browsing is public web data; no PSN account needed.
|
|
23
30
|
const store = new PsnStore(process.env.PSN_STORE_LOCALE ?? "en-us");
|
|
24
|
-
const server = new McpServer({ name: "psn-mcp", version
|
|
31
|
+
const server = new McpServer({ name: "psn-mcp", version });
|
|
25
32
|
registerTools(server, psn, store, tokens);
|
|
26
33
|
await server.connect(new StdioServerTransport());
|
|
27
34
|
console.error("psn-mcp server running on stdio");
|
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,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,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,CAAC,MAAM,eAAe,EAAE,CAAC,IAAI,EAAE,CAAC;IACvE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,qEAAqE;QACrE,OAAO,CAAC,KAAK,CACX,+FAA+F;YAC7F,mFAAmF;YACnF,+BAA+B,CAClC,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,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,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,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,+EAA+E;AAC/E,gFAAgF;AAChF,iDAAiD;AACjD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CACV,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,EACnE,MAAM,CACP,CACqB,CAAC;AAEzB,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,eAAe,EAAE,CAAC,IAAI,EAAE,CAAC;IACvE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,qEAAqE;QACrE,OAAO,CAAC,KAAK,CACX,+FAA+F;YAC7F,mFAAmF;YACnF,+BAA+B,CAClC,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,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,CAAC,CAAC;IAC3D,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAE1C,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-login.d.ts","sourceRoot":"","sources":["../../src/psn/browser-login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"browser-login.d.ts","sourceRoot":"","sources":["../../src/psn/browser-login.ts"],"names":[],"mappings":"AA2CA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAkD1E;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,0BAA0B,CAAC,CAiBhF;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAExD"}
|
|
@@ -140,7 +140,9 @@ async function readNpssoCookie(port) {
|
|
|
140
140
|
}
|
|
141
141
|
const socket = await openCdpSocket(page.webSocketDebuggerUrl);
|
|
142
142
|
try {
|
|
143
|
-
|
|
143
|
+
// Storage.getCookies is the non-deprecated replacement for the older
|
|
144
|
+
// Network.getAllCookies; both return every cookie in the browser context.
|
|
145
|
+
const response = await sendCdp(socket, "Storage.getCookies");
|
|
144
146
|
const cookie = response.cookies.find((candidate) => candidate.name.toLowerCase() === "npsso" && candidate.value);
|
|
145
147
|
return cookie?.value ?? null;
|
|
146
148
|
}
|
|
@@ -151,7 +153,7 @@ async function readNpssoCookie(port) {
|
|
|
151
153
|
async function openCdpSocket(url) {
|
|
152
154
|
const WebSocketCtor = globalThis.WebSocket;
|
|
153
155
|
if (!WebSocketCtor) {
|
|
154
|
-
throw new Error("This Node.js runtime does not expose WebSocket. Use Node.js
|
|
156
|
+
throw new Error("This Node.js runtime does not expose WebSocket. Use Node.js 24.18+ for browser login.");
|
|
155
157
|
}
|
|
156
158
|
const socket = new WebSocketCtor(url);
|
|
157
159
|
await new Promise((resolve, reject) => {
|
|
@@ -162,23 +164,30 @@ async function openCdpSocket(url) {
|
|
|
162
164
|
}
|
|
163
165
|
async function sendCdp(socket, method) {
|
|
164
166
|
const id = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
|
|
165
|
-
|
|
166
|
-
const
|
|
167
|
-
socket.addEventListener("message", (event) => {
|
|
167
|
+
return new Promise((resolve, reject) => {
|
|
168
|
+
const onMessage = (event) => {
|
|
168
169
|
const data = JSON.parse(String(event.data));
|
|
169
170
|
if (data.id !== id)
|
|
170
171
|
return;
|
|
171
|
-
|
|
172
|
+
cleanup();
|
|
172
173
|
if (data.error) {
|
|
173
174
|
reject(new Error(data.error.message ?? `${method} failed.`));
|
|
174
175
|
}
|
|
175
176
|
else {
|
|
176
177
|
resolve(data.result);
|
|
177
178
|
}
|
|
178
|
-
}
|
|
179
|
+
};
|
|
180
|
+
const cleanup = () => {
|
|
181
|
+
clearTimeout(timeout);
|
|
182
|
+
socket.removeEventListener("message", onMessage);
|
|
183
|
+
};
|
|
184
|
+
const timeout = setTimeout(() => {
|
|
185
|
+
cleanup();
|
|
186
|
+
reject(new Error(`Timed out calling Chrome DevTools ${method}.`));
|
|
187
|
+
}, 5_000);
|
|
188
|
+
socket.addEventListener("message", onMessage);
|
|
179
189
|
socket.send(JSON.stringify({ id, method }));
|
|
180
190
|
});
|
|
181
|
-
return result;
|
|
182
191
|
}
|
|
183
192
|
async function fetchJson(url) {
|
|
184
193
|
const res = await fetch(url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-login.js","sourceRoot":"","sources":["../../src/psn/browser-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,SAAS,GAAG,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-login.js","sourceRoot":"","sources":["../../src/psn/browser-login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps over `items`, running at most `limit` calls at a time and preserving the
|
|
3
|
+
* input order in the returned array. Used to fan out per-item lookups (e.g.
|
|
4
|
+
* resolving a friends list to profiles) without firing hundreds of parallel
|
|
5
|
+
* requests at the PSN API, which invites throttling.
|
|
6
|
+
*/
|
|
7
|
+
export declare function mapWithConcurrency<T, R>(items: readonly T[], limit: number, fn: (item: T, index: number) => Promise<R>): Promise<R[]>;
|
|
8
|
+
//# sourceMappingURL=concurrency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/psn/concurrency.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC,CAAC,EAAE,CAAC,CAgBd"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps over `items`, running at most `limit` calls at a time and preserving the
|
|
3
|
+
* input order in the returned array. Used to fan out per-item lookups (e.g.
|
|
4
|
+
* resolving a friends list to profiles) without firing hundreds of parallel
|
|
5
|
+
* requests at the PSN API, which invites throttling.
|
|
6
|
+
*/
|
|
7
|
+
export async function mapWithConcurrency(items, limit, fn) {
|
|
8
|
+
if (limit < 1)
|
|
9
|
+
throw new Error("Concurrency limit must be at least 1.");
|
|
10
|
+
const results = new Array(items.length);
|
|
11
|
+
let next = 0;
|
|
12
|
+
const worker = async () => {
|
|
13
|
+
while (next < items.length) {
|
|
14
|
+
const index = next++;
|
|
15
|
+
results[index] = await fn(items[index], index);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const workerCount = Math.min(limit, items.length);
|
|
19
|
+
await Promise.all(Array.from({ length: workerCount }, () => worker()));
|
|
20
|
+
return results;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=concurrency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/psn/concurrency.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAmB,EACnB,KAAa,EACb,EAA0C;IAE1C,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAExE,MAAM,OAAO,GAAG,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;QACvC,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/psn/store.d.ts
CHANGED
|
@@ -54,7 +54,12 @@ export declare class PsnStore {
|
|
|
54
54
|
private readonly locale;
|
|
55
55
|
constructor(locale?: string);
|
|
56
56
|
private fetchNextData;
|
|
57
|
+
private toStorePrice;
|
|
57
58
|
private toStoreItem;
|
|
59
|
+
private extractBatarangCaches;
|
|
60
|
+
private mergeProductEntities;
|
|
61
|
+
private findProductPrice;
|
|
62
|
+
private toStarRating;
|
|
58
63
|
/** One page (24 items) of a store category grid, e.g. the "All deals" category. */
|
|
59
64
|
getCategoryGrid(categoryId: string, page?: number): Promise<CategoryGridPage>;
|
|
60
65
|
/** Product details including price and the community star rating. */
|
package/dist/psn/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/psn/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/psn/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,kDAAkD;AAClD,eAAO,MAAM,qBAAqB,yCAAyC,CAAC;AAI5E,qBAAa,aAAc,SAAQ,KAAK;aAGpB,MAAM,CAAC,EAAE,MAAM;IAFjC,YACE,OAAO,EAAE,MAAM,EACC,MAAM,CAAC,EAAE,MAAM,YAAA,EAIhC;CACF;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAiBD,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAnC,YAA6B,MAAM,GAAE,MAAgB,EAAI;YAE3C,aAAa;IA4C3B,OAAO,CAAC,YAAY;IA6BpB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,qBAAqB;IAsB7B,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,gBAAgB;IAsCxB,OAAO,CAAC,YAAY;IAiBpB,mFAAmF;IAC7E,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,IAAI,SAAI,GACP,OAAO,CAAC,gBAAgB,CAAC,CAoC3B;IAED,qEAAqE;IAC/D,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAkCzD;IAED;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA0BzB,kEAAkE;IAC5D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAY/C;IAED;;;OAGG;IACG,QAAQ,CACZ,IAAI,SAAI,EACR,cAAc,UAAQ,EACtB,UAAU,SAAwB,GACjC,OAAO,CACR,gBAAgB,GAAG;QAAE,KAAK,EAAE,KAAK,CAAC,SAAS,GAAG;YAAE,UAAU,CAAC,EAAE,UAAU,CAAA;SAAE,CAAC,CAAA;KAAE,CAC7E,CAaA;CACF"}
|
package/dist/psn/store.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* __NEXT_DATA__ JSON blob. No authentication is required - this is the
|
|
9
9
|
* public web store.
|
|
10
10
|
*/
|
|
11
|
+
import { mapWithConcurrency } from "./concurrency.js";
|
|
11
12
|
const STORE_BASE = "https://store.playstation.com";
|
|
12
13
|
/** The store's evergreen "All deals" category. */
|
|
13
14
|
export const ALL_DEALS_CATEGORY_ID = "3f772501-f6f8-49b7-abac-874a88ca4897";
|
|
@@ -51,8 +52,32 @@ export class PsnStore {
|
|
|
51
52
|
title,
|
|
52
53
|
};
|
|
53
54
|
}
|
|
54
|
-
|
|
55
|
-
|
|
55
|
+
toStorePrice(value) {
|
|
56
|
+
if (!value || typeof value !== "object")
|
|
57
|
+
return undefined;
|
|
58
|
+
const price = value;
|
|
59
|
+
const discountText = [
|
|
60
|
+
price.discountText,
|
|
61
|
+
price.displayDiscountText,
|
|
62
|
+
price.savingTag,
|
|
63
|
+
].find((field) => typeof field === "string" && field.length > 0);
|
|
64
|
+
const normalized = {
|
|
65
|
+
basePrice: typeof price.basePrice === "string" ? price.basePrice : undefined,
|
|
66
|
+
discountedPrice: typeof price.discountedPrice === "string"
|
|
67
|
+
? price.discountedPrice
|
|
68
|
+
: undefined,
|
|
69
|
+
discountText,
|
|
70
|
+
isFree: typeof price.isFree === "boolean" ? price.isFree : undefined,
|
|
71
|
+
isTiedToSubscription: typeof price.isTiedToSubscription === "boolean"
|
|
72
|
+
? price.isTiedToSubscription
|
|
73
|
+
: undefined,
|
|
74
|
+
};
|
|
75
|
+
return Object.values(normalized).some((field) => field !== undefined)
|
|
76
|
+
? normalized
|
|
77
|
+
: undefined;
|
|
78
|
+
}
|
|
79
|
+
toStoreItem(entity, priceOverride) {
|
|
80
|
+
const price = priceOverride ?? this.toStorePrice(entity.price);
|
|
56
81
|
const media = entity.media;
|
|
57
82
|
const image = media?.find((m) => m.type === "IMAGE" && m.role === "MASTER") ??
|
|
58
83
|
media?.find((m) => m.type === "IMAGE");
|
|
@@ -62,16 +87,92 @@ export class PsnStore {
|
|
|
62
87
|
type: (entity.localizedStoreDisplayClassification ??
|
|
63
88
|
entity.storeDisplayClassification),
|
|
64
89
|
platforms: entity.platforms,
|
|
65
|
-
price
|
|
66
|
-
basePrice: price.basePrice,
|
|
67
|
-
discountedPrice: price.discountedPrice,
|
|
68
|
-
discountText: price.discountText,
|
|
69
|
-
isFree: price.isFree,
|
|
70
|
-
isTiedToSubscription: price.isTiedToSubscription,
|
|
71
|
-
},
|
|
90
|
+
price,
|
|
72
91
|
imageUrl: image?.url,
|
|
73
92
|
};
|
|
74
93
|
}
|
|
94
|
+
extractBatarangCaches(pageProps) {
|
|
95
|
+
const batarangs = pageProps.batarangs;
|
|
96
|
+
const caches = [];
|
|
97
|
+
for (const batarang of Object.values(batarangs ?? {})) {
|
|
98
|
+
const text = batarang.text;
|
|
99
|
+
if (!text)
|
|
100
|
+
continue;
|
|
101
|
+
const inner = text.match(/<script[^>]*>(.*)<\/script>/s)?.[1];
|
|
102
|
+
if (!inner)
|
|
103
|
+
continue;
|
|
104
|
+
try {
|
|
105
|
+
const payload = JSON.parse(inner);
|
|
106
|
+
if (payload.cache)
|
|
107
|
+
caches.push(payload.cache);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// A malformed optional micro-frontend must not hide the base product.
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return caches;
|
|
114
|
+
}
|
|
115
|
+
mergeProductEntities(states, productId) {
|
|
116
|
+
const matches = [];
|
|
117
|
+
for (const state of states) {
|
|
118
|
+
for (const [key, value] of Object.entries(state)) {
|
|
119
|
+
const productKey = `Product:${productId}`;
|
|
120
|
+
if ((key === productKey ||
|
|
121
|
+
key.startsWith(`${productKey}:`) ||
|
|
122
|
+
(value.__typename === "Product" && value.id === productId)) &&
|
|
123
|
+
!matches.includes(value)) {
|
|
124
|
+
matches.push(value);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return matches.length > 0 ? Object.assign({}, ...matches) : undefined;
|
|
129
|
+
}
|
|
130
|
+
findProductPrice(product, states, productId) {
|
|
131
|
+
const direct = this.toStorePrice(product.price);
|
|
132
|
+
if (direct)
|
|
133
|
+
return direct;
|
|
134
|
+
const ctaRefs = product.webctas ?? [];
|
|
135
|
+
for (const ref of ctaRefs) {
|
|
136
|
+
if (!ref.__ref)
|
|
137
|
+
continue;
|
|
138
|
+
for (const state of states) {
|
|
139
|
+
const price = this.toStorePrice(state[ref.__ref]?.price);
|
|
140
|
+
if (price)
|
|
141
|
+
return price;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Current product pages keep the price on a GameCTA entity in a
|
|
145
|
+
// micro-frontend cache. The primary product id is part of that entity key.
|
|
146
|
+
for (const state of states) {
|
|
147
|
+
for (const [key, value] of Object.entries(state)) {
|
|
148
|
+
const matchesProduct = key.split(":").some((segment) => {
|
|
149
|
+
if (segment === productId)
|
|
150
|
+
return true;
|
|
151
|
+
const skuSuffix = segment.slice(productId.length);
|
|
152
|
+
return (segment.startsWith(`${productId}-U`) && /^-U\d+$/.test(skuSuffix));
|
|
153
|
+
});
|
|
154
|
+
if (value.__typename !== "GameCTA" || !matchesProduct) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const price = this.toStorePrice(value.price);
|
|
158
|
+
if (price)
|
|
159
|
+
return price;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
toStarRating(value) {
|
|
165
|
+
if (!value || typeof value !== "object")
|
|
166
|
+
return undefined;
|
|
167
|
+
const rating = value;
|
|
168
|
+
if (rating.averageRating === undefined)
|
|
169
|
+
return undefined;
|
|
170
|
+
return {
|
|
171
|
+
averageRating: rating.averageRating,
|
|
172
|
+
totalRatingsCount: rating.totalRatingsCount ?? 0,
|
|
173
|
+
ratingsDistribution: rating.ratingsDistribution?.map(({ rating: score, percentage }) => ({ rating: score, percentage })),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
75
176
|
/** One page (24 items) of a store category grid, e.g. the "All deals" category. */
|
|
76
177
|
async getCategoryGrid(categoryId, page = 1) {
|
|
77
178
|
const { apollo, title } = await this.fetchNextData(`/category/${encodeURIComponent(categoryId)}/${page}`);
|
|
@@ -101,15 +202,24 @@ export class PsnStore {
|
|
|
101
202
|
/** Product details including price and the community star rating. */
|
|
102
203
|
async getProduct(productId) {
|
|
103
204
|
const { apollo, pageProps } = await this.fetchNextData(`/product/${encodeURIComponent(productId)}`);
|
|
104
|
-
|
|
105
|
-
|
|
205
|
+
// Sony now normalizes product pages across several independently rendered
|
|
206
|
+
// micro-frontends. Merge every fragment for this exact product so the
|
|
207
|
+
// result contains the image/platform/type fields as well as the base name.
|
|
208
|
+
const states = [apollo, ...this.extractBatarangCaches(pageProps)];
|
|
209
|
+
const entity = this.mergeProductEntities(states, productId);
|
|
106
210
|
if (!entity) {
|
|
107
211
|
throw new PsnStoreError(`Product ${productId} not found on the PlayStation Store.`);
|
|
108
212
|
}
|
|
213
|
+
const concept = entity.concept;
|
|
214
|
+
const conceptId = entity.conceptId == null
|
|
215
|
+
? (concept?.id?.toString() ?? concept?.__ref?.replace(/^Concept:/, ""))
|
|
216
|
+
: String(entity.conceptId);
|
|
109
217
|
return {
|
|
110
|
-
...this.toStoreItem(entity),
|
|
111
|
-
starRating: this.
|
|
112
|
-
|
|
218
|
+
...this.toStoreItem(entity, this.findProductPrice(entity, states, productId)),
|
|
219
|
+
starRating: this.toStarRating(entity.starRating) ??
|
|
220
|
+
this.extractStarRating(pageProps, productId),
|
|
221
|
+
conceptId,
|
|
222
|
+
url: `${STORE_BASE}/${this.locale}/product/${encodeURIComponent(productId)}`,
|
|
113
223
|
};
|
|
114
224
|
}
|
|
115
225
|
/**
|
|
@@ -127,18 +237,8 @@ export class PsnStore {
|
|
|
127
237
|
try {
|
|
128
238
|
const payload = JSON.parse(inner);
|
|
129
239
|
const cached = payload.cache?.[`Product:${productId}`] ??
|
|
130
|
-
Object.values(payload.cache ?? {}).find((v) => v.__typename === "Product" && v.starRating);
|
|
131
|
-
|
|
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
|
-
};
|
|
240
|
+
Object.values(payload.cache ?? {}).find((v) => v.__typename === "Product" && v.id === productId && v.starRating);
|
|
241
|
+
return this.toStarRating(cached?.starRating);
|
|
142
242
|
}
|
|
143
243
|
catch {
|
|
144
244
|
return undefined;
|
|
@@ -173,16 +273,4 @@ export class PsnStore {
|
|
|
173
273
|
return { ...grid, items };
|
|
174
274
|
}
|
|
175
275
|
}
|
|
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
276
|
//# sourceMappingURL=store.js.map
|
package/dist/psn/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/psn/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,UAAU,GAAG,+BAA+B,CAAC;AAEnD,kDAAkD;AAClD,MAAM,CAAC,MAAM,qBAAqB,GAAG,sCAAsC,CAAC;AAE5E,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,qCAAqC;AAE3D,MAAM,OAAO,aAAc,SAAQ,KAAK;IAGpB,MAAM;IAFxB,YACE,OAAe,EACC,MAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;sBAFC,MAAM;QAGtB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/psn/store.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
CHANGED
|
@@ -2,5 +2,17 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
2
2
|
import type { PsnApi } from "./psn/api.js";
|
|
3
3
|
import { type TokenManager } from "./psn/auth.js";
|
|
4
4
|
import { type PsnStore } from "./psn/store.js";
|
|
5
|
+
interface ResolvedFriend {
|
|
6
|
+
accountId: string;
|
|
7
|
+
onlineId?: string;
|
|
8
|
+
isPlus?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Resolves bare friend account ids to lightweight profiles, capping the number
|
|
12
|
+
* of in-flight requests. A profile that can't be fetched (e.g. the friend's
|
|
13
|
+
* privacy settings) falls back to just the account id.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveFriendProfiles(psn: Pick<PsnApi, "getProfile">, accountIds: readonly string[]): Promise<ResolvedFriend[]>;
|
|
5
16
|
export declare function registerTools(server: McpServer, psn: PsnApi, store: PsnStore, tokens: TokenManager): void;
|
|
17
|
+
export {};
|
|
6
18
|
//# sourceMappingURL=tools.d.ts.map
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAGzE,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAUtE,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAC/B,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAAC,cAAc,EAAE,CAAC,CAiB3B;AAqCD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,YAAY,GACnB,IAAI,CAyXN"}
|
package/dist/tools.js
CHANGED
|
@@ -1,8 +1,36 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { beginBrowserLogin, cancelBrowserLogin, completeBrowserLogin, hasActiveBrowserLogin, } from "./psn/browser-login.js";
|
|
3
3
|
import { authenticateWithNpsso } from "./psn/auth.js";
|
|
4
|
+
import { mapWithConcurrency } from "./psn/concurrency.js";
|
|
4
5
|
import { credentialsPath, saveStoredNpsso } from "./psn/credentials.js";
|
|
5
6
|
import { ALL_DEALS_CATEGORY_ID } from "./psn/store.js";
|
|
7
|
+
/**
|
|
8
|
+
* How many friend profiles to resolve at once. The friends endpoint returns
|
|
9
|
+
* bare account ids, so each friend needs a profile lookup; bounding the
|
|
10
|
+
* parallelism keeps a large friends list from fanning out into hundreds of
|
|
11
|
+
* simultaneous PSN requests.
|
|
12
|
+
*/
|
|
13
|
+
const FRIEND_RESOLUTION_CONCURRENCY = 8;
|
|
14
|
+
/**
|
|
15
|
+
* Resolves bare friend account ids to lightweight profiles, capping the number
|
|
16
|
+
* of in-flight requests. A profile that can't be fetched (e.g. the friend's
|
|
17
|
+
* privacy settings) falls back to just the account id.
|
|
18
|
+
*/
|
|
19
|
+
export async function resolveFriendProfiles(psn, accountIds) {
|
|
20
|
+
return mapWithConcurrency(accountIds, FRIEND_RESOLUTION_CONCURRENCY, async (id) => {
|
|
21
|
+
try {
|
|
22
|
+
const profile = await psn.getProfile(id);
|
|
23
|
+
return {
|
|
24
|
+
accountId: id,
|
|
25
|
+
onlineId: profile.onlineId,
|
|
26
|
+
isPlus: profile.isPlus,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return { accountId: id };
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
6
34
|
const userParam = z
|
|
7
35
|
.string()
|
|
8
36
|
.describe('PSN user: "me" for the authenticated account, a PSN online id (username), or a numeric account id.');
|
|
@@ -128,19 +156,7 @@ export function registerTools(server, psn, store, tokens) {
|
|
|
128
156
|
const accountId = await psn.resolveAccountId(user);
|
|
129
157
|
const friends = await psn.getFriends(accountId, limit, offset);
|
|
130
158
|
// The friends endpoint returns bare account ids; resolve them to profiles.
|
|
131
|
-
const profiles = await
|
|
132
|
-
try {
|
|
133
|
-
const profile = await psn.getProfile(id);
|
|
134
|
-
return {
|
|
135
|
-
accountId: id,
|
|
136
|
-
onlineId: profile.onlineId,
|
|
137
|
-
isPlus: profile.isPlus,
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
catch {
|
|
141
|
-
return { accountId: id };
|
|
142
|
-
}
|
|
143
|
-
}));
|
|
159
|
+
const profiles = await resolveFriendProfiles(psn, friends.friends);
|
|
144
160
|
return {
|
|
145
161
|
totalItemCount: friends.totalItemCount,
|
|
146
162
|
nextOffset: friends.nextOffset,
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|