Skip to main content
Glama
tranzen21

storekit-verify-mcp

by tranzen21

storekit-verify-mcp

Decode and cryptographically verify Apple App Store Server Notifications V2 — as an MCP server and a CLI.

Apple delivers subscription webhooks (SUBSCRIBED, DID_RENEW, EXPIRED, REFUND, …) as signed JWS payloads. Verifying them properly means checking the ES256 signature, walking a 3-certificate chain to a pinned Apple root, checking Apple's policy OIDs, and doing it again for the nested transaction and renewal payloads. Most servers either skip verification entirely or trust a decode. This tool does it right, and explains what each notification means while it's at it.

I built this logic for Talli, my live App Store app, where server-side webhook verification drives subscription entitlements. This is that experience packaged as a standalone tool.

What it checks

  • ✅ ES256 signature of the outer signedPayload and the nested signedTransactionInfo / signedRenewalInfo

  • ✅ Full x5c chain: leaf → intermediate → root, each link's signature verified

  • ✅ Root pinned to Apple Root CA – G3 (bundled, SHA-256 fingerprint documented in source)

  • ✅ Apple's policy OIDs on the leaf (receipt signing) and intermediate (WWDR)

  • ✅ Certificate validity windows at the payload's signedDate

  • ✅ Optional bundleId and environment (Sandbox/Production) assertions

Related MCP server: meok-attestation-verify

MCP server

Add to Claude Code:

claude mcp add storekit-verify -- npx -y github:tranzen21/storekit-verify-mcp

Or any MCP client:

{
  "mcpServers": {
    "storekit-verify": {
      "command": "npx",
      "args": ["-y", "github:tranzen21/storekit-verify-mcp"]
    }
  }
}

Tools

Tool

What it does

verify_notification

Full cryptographic verification → {valid, errors[], decoded}

decode_notification

Decode without verification (inspect payloads fast)

decode_transaction

Decode a single signed transaction/renewal JWS

explain_notification_type

What a notificationType/subtype means and how to handle it

Ask your agent things like "verify this webhook body and tell me if I should revoke entitlement" — it can decode, verify, and explain in one pass.

CLI

# Verify a webhook body (file or stdin). Exit code 0 = valid.
npx github:tranzen21/storekit-verify-mcp storekit-verify verify webhook.json \
  --bundle-id com.example.app --environment Production

# Decode without verification
storekit-verify decode webhook.json

# What does DID_FAIL_TO_RENEW / GRACE_PERIOD mean?
storekit-verify explain DID_FAIL_TO_RENEW GRACE_PERIOD

Library

import { verifyNotification } from "storekit-verify-mcp";

const result = await verifyNotification(requestBody, {
  expectedBundleId: "com.example.app",
  expectedEnvironment: "Production",
});
if (!result.valid) throw new Error(result.errors.join("; "));
// result.decoded.payload.notificationType, result.decoded.transactionInfo, ...

Development

npm install
npm run fixtures   # generates a test CA chain (openssl) + signed sample payloads
npm test           # builds + runs node:test suite

The test suite covers: valid chain verification, root-pin rejection, mismatched-key signatures, tampered payloads, bundle/environment mismatches, expired certificates, and malformed input.

Notes

  • Requires Node 20+.

  • No network calls at runtime: the Apple root is bundled; verification is fully offline.

  • Not affiliated with or endorsed by Apple. For the official server library, see apple/app-store-server-library-node — this project exists to make the same verification available to MCP agents and as a zero-setup CLI.

License

MIT © Marcquin Taylor

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    MCP server for offline verification of signed artifacts — receipts, manifests, and audit bundles. MIT licensed, works without accounts or API calls. Tools: self_test, verify_receipt, verify_bundle, explain_artifact.
    4
    53 npm
    5
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Verifies MEOK AI Labs compliance attestations (DORA, NIS2, CRA, EU AI Act, etc.) using HMAC-SHA256. Enables piping a signed certificate on stdin to get VALID/INVALID output.
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides timing-safe, replay-resistant webhook signature verification for Stripe, GitHub, Slack, Shopify, and Twilio, returning valid/invalid with precise failure reasons.
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables read-only verification of Foster Rx certificates against the public Ed25519 trust anchor, returning verdicts such as verified, signature_invalid, not_found, or tool_fault, and also allows retrieval of certificate records and trust anchor material.
    -