v0.18.0
Minor Changes
-
b959be2: v0.19 — Customer reviews + review summarizations. The last planned roadmap row before v1.0+: read what customers say, reply publicly (with guardrails), and pull Apple's AI-aggregated review summary.
6 new tools in 1 sub-domain —
src/domains/customer-reviews.ts.asc_list_customer_reviews— app-wide (/v1/apps/{id}/customerReviews) or version-scoped (/v1/appStoreVersions/{id}/customerReviews); pass exactly one of appId / appStoreVersionId. Filters: rating (STRINGS "1".."5" per the wire contract), territory, andhasPublishedResponse(wireexists[publishedResponse]) —falseis the unanswered queue. Sorts: ±createdDate, ±rating. Digest shows star bars, title/body previews, and the developer-response state viainclude=response.asc_get_customer_review— full review body + response included.asc_get_customer_review_response— the review's single developer reply (state PUBLISHED / PENDING_PUBLISH).asc_post_customer_review_response—⚠️ PUBLIC-FACING WRITE: publishes the reply on the App Store under the review; one response per review (re-posting REPLACES). The tool description instructs models to draft → show the human → post only on explicit approval. responseBody capped at 5,970 chars per Apple's UI limit.asc_delete_customer_review_response— removes the public reply; the review itself is untouched.asc_list_customer_review_summarizations— Apple's AI-aggregated summary per (platform, territory, locale), the same text shown on the product page.filter[platform]REQUIRED by Apple; empty lists are common (feature rollout + review-volume gated).
Apple-contract gotchas pinned by tests:
- Exists-param strip variant: Swift
isExistsPublishedResponse→ wireexists[publishedResponse]— a new member of the is-prefix strip family, on a query param rather than an attribute. filter[rating]values are strings, not numbers.- CustomerReviewResponseV1CreateRequest: responseBody attribute REQUIRED + review relationship.
include=responsebaked into the list (v0.16 lesson — relationship objects don't materialize without include).- No sentiment filter exists on Apple's side — rating is the documented proxy.
Live-smoke spec corrections caught on 2026-06-12 (real WikiCatch reviews via
scripts/smoke-reviews.ts, strictly read-only — the respond tool is public-facing and was NOT drilled):- A review with no developer response returns 200 +
data: nullon/v1/customerReviews/{id}/response— not a 404. The tool detects it and reports "no response yet" instead of dumping{"data": null}. - Verified live: app-wide list (2 real reviews with star bars + previews), the
exists[publishedResponse]=falseunanswered queue, rating filters, single-review get with include, version-scoped list, and a clean empty-list summarizations read (Apple hasn't generated one for this app). Respond/delete paths covered by body-builder tests only — intentionally not exercised against the live store.
Schemas (5 new):
CustomerReviewIdSchema,CustomerReviewResponseIdSchema,ReviewRatingFilterSchema,ReviewSortSchema,SummarizationPlatformSchema.Digests (2 new):
digestCustomerReviews(star bars + response state),digestCustomerReviewSummarizations(full summary text blocks).
Patch Changes
- ebf09b0: Document the
ASC_VENDOR_NUMBERenv var (introduced in v0.18 as the vendor-number fallback forasc_get_sales_report/asc_get_finance_report): README gets an "Optional: vendor number" config section (where to find it in App Store Connect, role requirements for the report endpoints), andappstoreconnect-mcp --helplists it alongside the other optional env vars.