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 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, audit your whole portfolio,
18
- and reach the entire API, from whatever AI agent you already use.
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 shown near your legal entity / at the top of the reports.
33
+ and Trends**) — it's the **Vendor #** shown at the top:
34
+
35
+ ![Where to find the Vendor Number in App Store Connect → Payments and Financial Reports](https://raw.githubusercontent.com/fil-technology/appstore-api-mcp/main/assets/where-to-find-vendor-number.png)
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.1",
4
- "description": "MCP server for Apple App Store Connect — manage apps, keywords, descriptions, titles, screenshots, versions and the full API from any MCP client (Claude, Codex, Cursor, Cline, Windsurf, VS Code, Zed, Continue, Gemini CLI, Google Antigravity, Amazon Q, Goose, and custom agents). Includes a fleet-wide ASO audit and dry-run previews.",
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
- return {
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) {