Skip to main content

Stripe Mpp

@magistr/stripe-mppv2026.10.25.10beta· MIT· 1d agoBEHAVIORSSKILLS
01README

Stripe Machine Payments Protocol (MPP) — agent buyer (probe/mint/pay over HTTP-402 Payment auth), consumer buyer (grant a Shared Payment Token from a Link wallet via link-cli, spend by reference), and full seller API (challenge/verify/charge/receipt/reconcile/refund) for fiat Shared Payment Tokens, built on mppx and the Stripe preview SDK

02Release Notes

2026.10.25.10

  • Repo-wide republish; no functional change.
03Behaviors1
@magistr/stripe-mppv2026.10.25.10extensions/models/stripe_mpp.ts

Global Arguments

ArgumentTypeDescription
secretKeystringStripe secret key (sk_test_... / sk_live_...). Use a vault reference:
serverSecret?stringSeller-side HMAC secret (>=32 chars) binding challenge ids
networkId?stringStripe Business Network Profile id (profile_test_... / profile_...).
realm?stringProtection-space identifier advertised in seller challenges (RFC 9110).
stripeVersion?stringStripe-Version header. SPT endpoints need the preview channel.
testMode?booleanGates test helpers (createTestGrantedToken). Must match the key mode.
allowInsecure?booleanTest-fixture escape: permit plain http:// to loopback, allow private/
timeoutMs?numberPer-request timeout for resource fetches and Stripe calls.
paymentMethodTypes?arrayPayment method types advertised in seller challenges.
linkCliPath?stringABSOLUTE path to the installed @stripe/link-cli binary (a non-writable
linkCliVersion?stringPinned link-cli version. The MCP initialize serverInfo.version is
allowLiveGrants?booleanConsumer-grant live-money opt-in. Default false forces link-cli test
fn probe()
Request a resource WITHOUT paying and record the parsed payment
fn mintToken(paymentMethodId: string, maxAmount: string, currency: string, expiresAt?: number, sellerNetworkId?: string, externalId?: string)
Mint a fiat Shared Payment Token from an existing payment method
ArgumentTypeDescription
paymentMethodIdstringExisting payment method (pm_...). Raw-PAN creation is PCI-gated in
maxAmountstringUsage-limit ceiling, minor units string.
currencystringUsage-limit currency (ISO, lowercase).
expiresAt?numberUnix timestamp for usage_limits.expires_at.
sellerNetworkId?stringSeller network profile the token is granted to (defaults to networkId).
externalId?stringCorrelation id; also drives the Idempotency-Key.
fn pay(sptId: string, maxAmount: string, currency: string, expectedNetworkId?: string, expectedRealm?: string, externalId?: string)
Pay for a resource end-to-end: request it, parse the 402 stripe
ArgumentTypeDescription
sptIdstringShared Payment Token (spt_...) to present.
maxAmountstringSpend ceiling, minor units string. The challenge amount must not
currencystringExpected challenge currency. Mismatch blocks the payment.
expectedNetworkId?stringPin the payee: the Stripe Business Network Profile (profile_...) the
expectedRealm?stringPin the challenge realm (issuing authority); mismatch blocks the payment.
externalId?stringCorrelation id.
fn getIssuedToken(sptId: string)
Retrieve an issued Shared Payment Token
ArgumentTypeDescription
sptIdstringShared Payment Token id (spt_...).
fn revokeToken(sptId: string)
Revoke an issued Shared Payment Token
ArgumentTypeDescription
sptIdstringShared Payment Token id (spt_...).
fn createChallenge(amount: string, currency: string, description?: string, externalId?: string, expiresInSeconds?: number, networkId?: string, scope?: string)
Produce seller challenge material for a payment-gated resource:
ArgumentTypeDescription
amountstringAmount demanded, minor units string.
currencystringCurrency (ISO, lowercase).
description?string
externalId?string
expiresInSeconds?numberChallenge validity window; recommended to keep challenges short-lived.
networkId?stringOverride the global networkId.
scope?stringBind the challenge to a specific resource/route. Carried inside the
fn verifyCredential(authorizationHeader: string, expectedAmount?: string, expectedCurrency?: string, expectedScope?: string)
Verify a received Authorization: Payment credential — HMAC-bound
ArgumentTypeDescription
authorizationHeaderstringThe received Authorization value ("Payment <base64url>").
expectedAmount?string
expectedCurrency?string
expectedScope?stringRequire the credential's challenge `opaque` to equal this route scope
fn chargeToken(sptId?: string, amount?: string, currency?: string, authorizationHeader?: string, expectedScope?: string, description?: string, externalId?: string)
Settle a granted Shared Payment Token via a confirmed
ArgumentTypeDescription
sptId?stringGranted token to settle (or pass authorizationHeader).
amount?stringMinor units string.
currency?string
authorizationHeader?stringFull received credential; verified (HMAC + expiry) before settling.
expectedScope?stringWhen settling from an authorizationHeader, require the challenge
description?string
externalId?string
fn issueReceipt(chargeId: string, externalId?: string)
Produce the Payment-Receipt header value for a SETTLED charge
ArgumentTypeDescription
chargeIdstringSettled PaymentIntent id (pi_...).
externalId?string
fn getCharge(chargeId: string)
Retrieve a charge (GET /v1/payment_intents/{id}).
ArgumentTypeDescription
chargeIdstringPaymentIntent id (pi_...).
fn listCharges(externalId?: string, createdGte?: number, createdLte?: number, maxResults?: number, pageSize?: number)
Reconciliation fan-out: list charges by created range
ArgumentTypeDescription
externalId?stringFilter by metadata externalId (uses /v1/payment_intents/search).
createdGte?numberUnix lower bound.
createdLte?numberUnix upper bound.
maxResults?number
pageSize?number
fn refundCharge(chargeId: string, amount: string, reason?: enum, externalId?: string)
Refund a settled charge (POST /v1/refunds) with
ArgumentTypeDescription
chargeIdstringPaymentIntent id (pi_...) to refund.
amountstringRefund amount, minor units string. Must not exceed the remaining
reason?enum
externalId?string
fn getGrantedToken(sptId: string)
Retrieve a granted Shared Payment Token (seller view). Card
ArgumentTypeDescription
sptIdstringShared Payment Token id (spt_...).
fn createTestGrantedToken(maxAmount: string, currency: string, paymentMethodId?: string, expiresAt?: number)
TEST MODE ONLY: fabricate a granted Shared Payment Token via
ArgumentTypeDescription
maxAmountstringUsage-limit ceiling, minor units string.
currencystringUsage-limit currency.
paymentMethodId?stringPayment method the fabricated granted token draws on (required by the
expiresAt?number
fn listConsumerPaymentMethods()
List the consumer's Link wallet payment methods (csmrpd_). Fan-out:
fn getSpendRequest(id: string)
Retrieve a consumer spend request by lsrq_ (single-shot; interval 0).
ArgumentTypeDescription
idstringSpend request id (lsrq_...).
fn cancelSpendRequest(id: string)
Cancel a PENDING consumer spend request (read-before-cancel). Note:
ArgumentTypeDescription
idstringSpend request id (lsrq_...).
fn createSpendRequest(amount: string, currency?: string, context: string, networkId?: string, paymentMethodId?: string, externalId?: string)
Create a consumer Link spend request — the PRIMARY (binding) guard
ArgumentTypeDescription
amountstringAmount to authorise, minor-units STRING (e.g. "500" = $5.00).
currency?stringCurrency (ISO, lowercase). US-only Link; default usd.
contextstringPurchase description + rationale the consumer READS when approving.
networkId?stringPayee Business Network Profile (profile_...). Defaults to the global
paymentMethodId?stringConsumer Link payment method (csmrpd_...). Omit to let the consumer pick
externalId?stringCorrelation id; also anchors the deterministic intent key persisted on
fn paySpendRequest(id: string, maxAmount: string, currency: string, expectedNetworkId?: string, expectedRealm?: string, externalId?: string)
Spend an APPROVED consumer grant against an MPP-protected URL, by
ArgumentTypeDescription
idstringApproved spend request id (lsrq_...) to spend.
maxAmountstringADVISORY pre-flight ceiling (minor units). NOTE: the binding cap is the
currencystringExpected challenge currency (advisory).
expectedNetworkId?stringAdvisory payee pin for the pre-flight challenge.
expectedRealm?stringAdvisory realm pin.
externalId?stringCorrelation id.

Resources

challenge(infinite)— Probe result: HTTP status + parsed payment challenges.
payment(infinite)— Buyer payment attempt — written on EVERY pay outcome (audit trail).
issuedToken(infinite)— Issued Shared Payment Token (buyer view).
challengeSpec(infinite)— Seller challenge material: WWW-Authenticate value + problem+json body.
credential(infinite)— Seller-side credential verification verdict.
charge(infinite)— Seller charge (PaymentIntent) state.
receipt(infinite)— Issued Payment-Receipt header value for a settled charge.
refund(infinite)— Refund outcome — written on every refundCharge attempt (audit trail).
grantedToken(infinite)— Granted Shared Payment Token (seller view; card details trimmed).
summary(infinite)— Fan-out listing summary.
spendRequest(infinite)— Consumer Link spend-request lifecycle — written on EVERY outcome
consumerPaymentMethod(infinite)— Consumer Link payment method (csmrpd_; display as link-cli returns
04Skills1
stripe-mpp2 files
05Previous Versions18
2026.10.25.2MIT

2026.10.25.2

Fixed

  • Consumer-buyer methods were broken against link-cli 0.19.1+ (including the pinned 0.28.0). link-cli's stdio MCP server (built on incur) uses progressive tool discovery: tools/list returns only search_tools, get_tool_details, call_read_tool and call_write_tool, and a direct tools/call of spend-request_create (or any other inner tool) fails with JSON-RPC -32602 "Tool … not found". lib/link_cli.ts now reaches every inner tool as call_write_tool { name, arguments }. The reads go through call_write_tool too: link-cli 0.28.0 annotates no tool readOnlyHint, and call_read_tool refuses such tools ("Tool is not read-only"). The routing is a pinned per-tool table; the strict linkCliVersion check still guards it.
  • Streamed results are unwrapped. spend-request_create, spend-request_retrieve and mpp_pay are generator commands, so their result is a JSON array of chunks; the model now uses the last chunk. An empty array is a failure: incur drops a generator's c.error (for example NOT_FOUND, POLLING_TIMEOUT or a duplicate spend request) and returns [].
  • Error results are unwrapped to their message (the wrapper's {"error": …}, an inner validation error's code: message, or plain text), and the call-to-action text incur appends after a success result is stripped before parsing.
  • paySpendRequest records pay-failed when mpp_pay returns the paid request's HTTP response with a status of 400 or above (link-cli reports that as a successful tool result), and sends domain, which link-cli's report schema requires.

Method names, arguments and resource schemas are unchanged.

2026.10.25.1MIT

2026.10.25.1

Dependency bump for the upstream release drift tracked in #231: mppx@0.9.3 → 0.13.5, stripe@22.7.0-beta.1 → 23.1.0-beta.1, and the linkCliVersion drift-detection default 0.19.1 → 0.28.0. No source change was needed. Contract (stripe_mpp_test.ts) and adversarial/tamper (stripe_mpp_adversarial_test.ts) suites pass unmodified apart from the pin strings.

  • mppx (0.10.0 … 0.13.5, read release notes for every version):
    • The Stripe SPT rail is byte-identical. dist/Challenge.js, dist/Credential.js, dist/PaymentRequest.js, dist/Expires.js and dist/stripe/server/Charge.js match 0.9.3 exactly, so the HMAC challenge-id binding, the codec and the per-currency canOffer minimums are unchanged. The crypto primitives in the regenerated lock are unchanged too: @noble/hashes@1.8.0, @noble/curves@1.9.1, @scure/base@1.2.6, @scure/bip32@1.7.0 and @scure/bip39@1.6.0.
    • Receipt gains an optional fundingCurrency field. The change is additive.
    • Since 0.13.4, server-issued challenges carry an HMAC-bound random issuance nonce in opaque (_mppx_nonce). Route scope still lives in request.methodDetails.metadata.scope, so expectedScope checks are unaffected. A swamp-runtime smoke test (createChallenge, then verifyCredential) confirmed that an in-scope credential is accepted and a cross-scope one is rejected.
    • Breaking changes in the range only affect surfaces this model does not use: Tempo, EVM, x402, sessions, stripe.create()'s new shared-store requirement, and the CLI.
    • Peer viem floor is now 2.57.1 (locked at 2.57.10). The direct zod floor is now ^4.6.5, but zod stays externalized and shared with swamp. mppx uses only basic zod/mini APIs.
  • stripe (public-preview channel): the model pins its own API version (2026-04-22.preview), so the SDK's new pinned API version does not change the wire format. No changes in the range touch the endpoints this model uses: SharedPayment issued/granted tokens, PaymentIntents, Refunds and rawRequest. From the 23.0.0 GA notes: incomplete response bodies now throw StripeConnectionError instead of StripeAPIError. Only the message is surfaced, and it is redacted.
  • link-cli: the inputs of the six MCP tools this model calls (spend-request_create/_retrieve/_cancel, payment-methods_list, mpp_pay, report) were compared between 0.19.1 and 0.28.0 via get_tool_details. Changes are additive only (useApprovalPolicy, approvedChallenge, recurring fields), currency became optional (this model always sends it), and the removed executionMethod field was never sent. Hosts must upgrade the link-cli binary to 0.28.0, because the version check is fatal.
  • README: setup now stores secrets with a prompting swamp vault put <vault> <key> instead of passing the value on the command line.
2026.10.15.9MIT

2026.10.15.9

Changed

  • Repo-wide maintenance release: version bump to republish the current source. No schema change.
2026.10.15.8MIT

2026.10.15.8

Changed

  • Repo-wide maintenance release: version bump to republish the current source. No schema change.
2026.10.15.6MIT

2026.10.15.6

Changed

  • Repo-wide maintenance release: version bump to republish the current source. No schema change.
2026.10.15.5MIT

2026.10.15.5

Changed

  • Repo-wide maintenance release: version bump to republish the current source. No schema change.
2026.10.15.4MIT

2026.10.15.4

Changed

  • Repo-wide maintenance release: version bump to republish the current source. No schema change.
2026.10.15.3MIT

2026.10.15.3

Changed

  • Repo-wide maintenance release: version bump to republish the current source. No schema change.
2026.10.15.2MIT

2026.10.15.2

Changed

  • Repo-wide maintenance release: version bump to republish the current source. No schema change.
2026.10.15.1MIT

2026.10.15.1

Changed

  • Repo-wide maintenance release: version bump to republish the current source. No schema change.
2026.10.14.2MIT(was none)

2026.10.14.2

Changed

  • Repo-wide maintenance release: version bump to republish the current source. No schema change.

Security

  • Bump the bundle-resolution pin @modelcontextprotocol/sdk 1.30.0 → 1.32.1 to clear GHSA-6qxp-vccf-f47h (HIGH), which blocked the dependency-trust gate.
2026.09.19.2

2026.09.19.2

Changed

  • Repo-wide maintenance release: version bump to republish the current source. No schema change.
  • idemKey's NUL-byte domain separator is now written as the literal \x00 escape instead of a raw embedded NUL byte in the source. Source-representation change only: the hashed string, SHA-256 digests and idempotency keys are byte-identical before and after (verified against fixed inputs). stripe_mpp.ts is now ordinary UTF-8 text — see docs/MAINTAINING.md.
2026.09.19.1

2026.09.19.1

Dependency bump: mppx@0.8.14 → 0.9.3 (minor, preview channel, bundled runtime dep) + stripe@22.4.0-beta.1 → 22.7.0-beta.1 (public-preview dist-tag moved) + linkCliVersion drift-detection default 0.10.1 → 0.19.1. Required a real source change, not just version strings — see below.

  • mppx: NO-OP on the fiat/SPT wire contract, confirmed on durable evidence. The crypto primitives are byte-identical in the regenerated lock (@noble/hashes@1.8.0 backs the HMAC-SHA256 id-binding, @noble/curves@1.9.1, @scure/base@1.2.6, @scure/bip32@1.7.0, @scure/bip39@1.6.0 all unmoved), and the upstream release notes for every intervening version (0.8.15, 0.8.17..0.8.19, 0.9.0..0.9.3) show no change to the HMAC challenge-id binding, key derivation, domain separators, or the Challenge/Credential/Receipt codec. stripe_mpp_test.ts's golden vectors and stripe_mpp_adversarial_test.ts both pass UNMODIFIED. 0.9.0's breaking removal of the machineUSD charge/session flows does not apply — this model only imports the Stripe rail (stripeServer.charge()); no machineUSD, Tempo, x402, or EVM usage anywhere in the extension.
    • Behavioural change (not wire format) required a source fix: 0.8.17 added a canOffer gate in mppx's Stripe rail (dist/stripe/server/Charge.js, minimumChargeAmountByCurrency) that refuses to offer a charge below Stripe's per-currency minimum, surfacing as a bare "No payment offers are available for this request" from inside the library. Extended the model's own MIN_CHARGE table (usd only until now) to mirror all 32 currencies mppx enforces, and added a pre-flight check in createChallenge (immediately after the existing isCanonicalMinorUnits guard) so a sub-minimum request fails closed with a clear, model-level error naming the amount, currency, and floor — before a consumer is ever prompted — instead of the opaque library error. Raised the amount floor in stripe_mpp_flow_property_test.ts's and stripe_mpp_invariant_property_test.ts's amount arbitraries (1n → 50n) to stop generating amounts Stripe itself would never have accepted; this is correcting the property domain, not weakening it.
    • New drift guard: mppx's minimumChargeAmountByCurrency is module-local and not exported, so MIN_CHARGE is a hand-maintained copy that can silently diverge from upstream. Added 5 contract tests (stripe_mpp_test.ts) that probe mppx's REAL canOffer behaviour at the boundary — refuses at floor - 1, offers at floor — for a representative currency spread (usd, gbp, huf, czk, jpy: the two Link-relevant currencies, the two highest floors in the table, and a zero-decimal currency) rather than comparing the constant to itself, so a future upstream table change reddens this suite instead of the two copies quietly drifting apart.
  • stripe: public-preview dist-tag genuinely moved (npm view stripe dist-tags). No SDK-surface changes this model depends on.
  • link-cli: @stripe/link-cli drift-detection default re-pinned 0.10.1 → 0.19.1 on maintainer instruction (nine minors, release-notes evidence only — Link is still US-only, not live-verified). Runtime consequence: lib/link_cli.ts's version check is FATAL, not advisory — it throws and aborts the call if the real binary's reported version differs from linkCliVersion. Any host still running a link-cli older than 0.19.1 will now hard-fail every consumer-grant call until the binary is upgraded. Updated the three fixture literals (stripe_mpp_methods_test.ts, stripe_mpp_live_test.ts, lib/link_cli.test.ts) alongside the default.
  • Transitive drift from the lockfile regeneration: viem 2.55.10 → 2.56.8, ox gains a 0.14.45 peer variant, @stripe/stripe-js 9.9.0 → 9.13.0, peer zod 4.4.3 → 4.5.4 (this package's own zod import already floats on npm:zod@4). stripe's and mppx's deps all keep sha512 integrity hashes; no stale mppx@0.8.14 specifier remains.
  • Re-bundle republishes with 0.9.3/22.7.0-beta.1 inlined. Full offline suite: 126 passed, 0 failed, 1 ignored (stripe_mpp_live_test.ts, requires real Link test-mode secrets, not run). 10000-run property soak: 28 passed, 0 failed. Contract (stripe_mpp_test.ts) and adversarial/tamper (stripe_mpp_adversarial_test.ts) suites pass UNMODIFIED aside from the pin string and, in the contract suite, the new drift-guard tests appended at the end (no existing test body touched).
2026.09.17.1

2026.09.17.1

Changed

  • Repo-wide maintenance release: version bump to republish the current source. No schema change.
2026.09.01.1

2026.09.01.1

Re-release of 2026.08.19.1 (beta), whose publish never reached the registry — the repo-wide 2026.08.19.1 bump's extension-publish job did not complete for this package, and that job only fires on a version bump. Content is unchanged from 2026.08.19.1; its notes are carried forward below.

  • Version bump and smoke test
2026.08.01.1

2026.08.01.1

Dependency bump: mppx@0.8.12 → 0.8.14 (patch, preview channel, bundled runtime dep) + linkCliVersion drift-detection default 0.9.0 → 0.10.1 (fixture/default only, no bundle impact).

  • mppx: NO-OP on the fiat/SPT wire contract, confirmed on durable evidence. deno task check stayed clean (no method signature the model calls moved) and the full offline suite (121 tests) + the 10000-run property soak pass UNMODIFIED, including the byte-exact stripe_mpp_test.ts golden-vector test — the Challenge / Credential / Receipt codec, HMAC challenge-id binding, key derivation, and domain separators are unchanged. The 0.8.13/0.8.14 deltas are Tempo/SQLite/stablecoin patch changes plus additive APIs this fiat/SPT model does not import.
    • Watch item: 0.8.14 marks the legacy combined payment-verification hooks DEPRECATED (not removed, not yet used by this model) — a future mppx major that removes them will need re-verification, not just a version bump.
  • link-cli: @stripe/link-cli re-pinned 0.9.0 → 0.10.1 on release-notes evidence only (additive/security changes, no documented stdio-MCP contract change) — not live-verified, Link is still US-only and the maintainer's account is EU (stripe_mpp_live_test.ts stays ignored). The bump is required regardless: the drift-detection preflight (lib/link_cli.ts) rejects a real 0.10.1 binary unless linkCliVersion is bumped to match. Updated the three fixture literals (lib/link_cli.test.ts, stripe_mpp_methods_test.ts, stripe_mpp_live_test.ts) alongside the default; the mpp_pay / paySpendRequest spend-by-reference path stays on the same watch list as the rest of the consumer-buyer surface for the next real observation.
  • Transitive drift from the lockfile regeneration: viem 2.55.4 → 2.55.10, ox gains a 0.14.33 peer variant alongside the existing 0.14.30 (mppx/viem resolve different ox ranges), mppx picks up the matching viem@2.55.10 peer combination. stripe stays 22.4.0-beta.1 and @stripe/stripe-js stays 9.9.0 (both unchanged); the crypto primitives are byte-identical in the regenerated lock (@noble/hashes@1.8.0, @noble/curves@1.9.1, @scure/base@1.2.6, @scure/bip32@1.7.0, @scure/bip39@1.6.0) and every dep keeps its sha512 integrity hash.
  • Re-bundle republishes with 0.8.14 inlined (extension deps are bundled at build time). All fixtures stay synthetic (RFC 2606 hosts, _test_fixture_ ids) — no vectors were re-derived, since the golden test passed unmodified.
2026.07.21.2

2026.07.21.2

Dependency bump: mppx@0.8.6 → 0.8.12 (patch, preview channel). No breaking changes to the Challenge / Credential / Receipt codecs or the Mppx / Stripe server APIs.

  • Wire format unchanged, on durable evidence: the crypto primitives are byte-identical in the regenerated lock (@noble/hashes@1.8.0 backs the HMAC-SHA256 id-binding, @noble/curves@1.9.1, @scure/* all unmoved), and the upstream review of the 0.8.6..0.8.12 releases (0.8.7, 0.8.8, 0.8.9, 0.8.11, 0.8.12 — 0.8.10 was never published) found no change to the HMAC challenge-id binding, key derivation, domain separators, or the challenge/credential/receipt serialization. The 0.8.7..0.8.12 deltas are Celo/Tempo/session-voucher and mppx validate-command code this fiat/SPT model does not import.
  • Transitive drift from the lockfile regeneration: viem 2.54.2 → 2.55.4, ox 0.14.29 → 0.14.30, @stripe/stripe-js 9.8.0 → 9.9.0, and a prerelease inversion @modelcontextprotocol/server 2.0.0-beta.2 → 2.0.0-alpha.4 (pulled via incur, off the crypto/wire path), plus test-only dedupes. stripe stays 22.4.0-beta.1 (unchanged — still the current public-preview dist-tag); every dep keeps its sha512 integrity hash.
  • Re-bundle republishes with 0.8.12 inlined (extension deps are bundled at build time). Regression coverage: the full suite (120 offline tests) + the 10000-run property soak re-run green against 0.8.12, and the spec-fixture contract (stripe_mpp_test.ts) and adversarial/tamper (stripe_mpp_adversarial_test.ts) suites pass UNMODIFIED.
2026.07.21.1

2026.07.21.1

Consumer buyer (Link grant): a human WITHOUT a Stripe account can now fund agent payments from their Link wallet. Five methods behind a new lib/link_cli.ts anti-corruption layer that drives Stripe's link-cli as an MCP server over stdio (link-cli --mcp) — deliberately NOT its HTTP serve mode, which binds all interfaces with Access-Control-Allow-Origin: * and no auth (see SPIKE-link-cli.md).

  • listConsumerPaymentMethods, createSpendRequest, getSpendRequest, cancelSpendRequest, paySpendRequest.
  • The grant is spent BY REFERENCE (mpp_pay --spendRequestId); the model never holds a raw spt_ (persists lsrq_ only, strictObject resources). No Link token custody — link-cli owns its device-flow session on disk; the subprocess is spawned clearEnv.
  • createSpendRequest is the PRIMARY binding guard (anchored payee, amount cap ≤500000 + $0.50 USD floor, context≥100, response-echo) before the consumer is prompted; paySpendRequest's pre-flight is advisory only.
  • New non-secret globals: linkCliPath (absolute, fail-closed), linkCliVersion (drift-detection preflight), allowLiveGrants (default false → test mode).
  • Extracted pay's spend-guard into the shared challengeGuardViolation() helper (behaviour-preserving).
  • US-only (Stripe Link) and inert without an authenticated co-located link-cli session; the four consumer methods fail closed, the existing 14 are unaffected. Not live-verified (Link is US-only; the maintainer is EU) — built on the observed v0.9.0 tool contract, pinned by fixtures.

Modified 1 behaviors. Modified 1 skills

06Stats
A
93 / 100
Downloads
41
Archive size
897.7 KB
  • Has README or module doc2/2earned
  • README has a code example1/1earned
  • README is substantive1/1earned
  • Most symbols documented1/1earned
  • No slow types (deprecated)1/1earned
  • Dependencies pass trust audit2/2earned
  • Has description1/1earned
  • Platform support declared (or universal)2/2earned
  • License1/2partial

    no SPDX license declared

  • Verified public repository2/2earned
07Platforms
08Labels