appstore-api-mcp 1.1.1 → 1.1.3
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/CHANGELOG.md +14 -0
- package/README.md +3 -2
- package/docs/ANALYTICS.md +4 -1
- package/package.json +7 -3
- package/src/client.js +3 -0
- package/src/index.js +5 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,20 @@ All notable changes to this project are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/) and the project uses
|
|
5
5
|
[Semantic Versioning](https://semver.org/).
|
|
6
6
|
|
|
7
|
+
## [1.1.3] - 2026-06-02
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
- Lead with analytics in the package/repo description, README one-liner, and
|
|
11
|
+
keywords — downloads, revenue, and subscriptions are now front and center.
|
|
12
|
+
|
|
13
|
+
## [1.1.2] - 2026-06-02
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- Report tools now treat a `404` ("no data for this report/date") as a clean
|
|
17
|
+
empty result with an explanatory `note`, instead of surfacing it as an error.
|
|
18
|
+
Validated end-to-end with an Admin key: sales, subscriptions, finance, and the
|
|
19
|
+
Analytics Reports API all return real data.
|
|
20
|
+
|
|
7
21
|
## [1.1.1] - 2026-06-02
|
|
8
22
|
|
|
9
23
|
### Changed
|
package/README.md
CHANGED
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
**Run App Store Connect by talking to your AI.** An
|
|
15
15
|
[MCP](https://modelcontextprotocol.io) server that turns Apple's
|
|
16
16
|
[App Store Connect API](https://developer.apple.com/documentation/appstoreconnectapi)
|
|
17
|
-
into plain-language actions — edit your listings,
|
|
18
|
-
and reach the entire API, from
|
|
17
|
+
into plain-language actions — edit your listings, **track downloads, revenue &
|
|
18
|
+
subscriptions**, audit your whole portfolio, and reach the entire API, from
|
|
19
|
+
whatever AI agent you already use.
|
|
19
20
|
|
|
20
21
|
### ✨ What makes it stand out
|
|
21
22
|
|
package/docs/ANALYTICS.md
CHANGED
|
@@ -30,7 +30,10 @@ Sales and finance reports are scoped to a **Vendor Number** — an 8–9 digit I
|
|
|
30
30
|
**not** the same as your Key ID or Issuer ID.
|
|
31
31
|
|
|
32
32
|
- Find it in **App Store Connect → Payments and Financial Reports** (or **Sales
|
|
33
|
-
and Trends**) — it's
|
|
33
|
+
and Trends**) — it's the **Vendor #** shown at the top:
|
|
34
|
+
|
|
35
|
+

|
|
36
|
+
|
|
34
37
|
- Provide it either way:
|
|
35
38
|
- **Per call:** pass `vendorNumber` in the tool arguments, or
|
|
36
39
|
- **Globally:** set the `ASC_VENDOR_NUMBER` environment variable in your MCP config.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appstore-api-mcp",
|
|
3
|
-
"version": "1.1.
|
|
4
|
-
"description": "MCP server for Apple App Store Connect —
|
|
3
|
+
"version": "1.1.3",
|
|
4
|
+
"description": "MCP server for Apple App Store Connect — edit listings (keywords, descriptions, titles, screenshots), track analytics (downloads, proceeds, subscriptions, retention), run a fleet-wide ASO audit, preview changes with dry-run, and reach the full API. Works with any MCP client (Claude, Codex, Cursor, Windsurf, VS Code, Zed, Gemini CLI, Antigravity, Amazon Q, Goose, and more).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"appstore-api-mcp": "src/index.js"
|
|
@@ -33,7 +33,11 @@
|
|
|
33
33
|
"cursor",
|
|
34
34
|
"keywords",
|
|
35
35
|
"screenshots",
|
|
36
|
-
"metadata"
|
|
36
|
+
"metadata",
|
|
37
|
+
"analytics",
|
|
38
|
+
"app-analytics",
|
|
39
|
+
"subscriptions",
|
|
40
|
+
"aso-tools"
|
|
37
41
|
],
|
|
38
42
|
"license": "MIT",
|
|
39
43
|
"author": "Sviatoslav Fil",
|
package/src/client.js
CHANGED
|
@@ -157,6 +157,9 @@ export class AppStoreConnectClient {
|
|
|
157
157
|
headers: { Authorization: `Bearer ${token}`, Accept: "application/a-gzip" },
|
|
158
158
|
});
|
|
159
159
|
const buf = Buffer.from(await res.arrayBuffer());
|
|
160
|
+
// 404 from a report endpoint means "no data for this report/date" — not a
|
|
161
|
+
// failure. Return empty so callers get an empty result, not an error.
|
|
162
|
+
if (res.status === 404) return "";
|
|
160
163
|
if (!res.ok) {
|
|
161
164
|
let detail = buf.toString("utf8");
|
|
162
165
|
try {
|
package/src/index.js
CHANGED
|
@@ -134,7 +134,7 @@ const DEFAULT_VENDOR = process.env.ASC_VENDOR_NUMBER;
|
|
|
134
134
|
/** Cap parsed report rows so large reports don't flood the response. */
|
|
135
135
|
function reportResult(reportType, parsed, limit = 200) {
|
|
136
136
|
const rows = parsed.rows;
|
|
137
|
-
|
|
137
|
+
const out = {
|
|
138
138
|
reportType,
|
|
139
139
|
columns: parsed.columns,
|
|
140
140
|
rowCount: rows.length,
|
|
@@ -142,6 +142,10 @@ function reportResult(reportType, parsed, limit = 200) {
|
|
|
142
142
|
truncated: rows.length > limit,
|
|
143
143
|
rows: rows.slice(0, limit),
|
|
144
144
|
};
|
|
145
|
+
if (rows.length === 0)
|
|
146
|
+
out.note =
|
|
147
|
+
"No data found for the requested report/date. The period may have no activity, or the data isn't available yet (reports lag ~1 day). Check the date and frequency format.";
|
|
148
|
+
return out;
|
|
145
149
|
}
|
|
146
150
|
|
|
147
151
|
function requireVendor(v) {
|