{"id":"59da7aa0-21f9-4ba6-84ff-bdf713c8b126","shortId":"dXU9Vb","kind":"skill","title":"mpp","tagline":"Build with MPP (Machine Payments Protocol) - the open protocol for machine-to-machine payments over HTTP 402. Use when developing paid APIs, payment-gated content, AI agent payment flows, MCP tool payments, pay-per-token streaming, or any service using HTTP 402 Payment Required. ","description":"# MPP - Machine Payments Protocol\n\nMPP is an open protocol (co-authored by Tempo and Stripe) that standardizes HTTP `402 Payment Required` for machine-to-machine payments. Clients pay in the same HTTP request - no accounts, API keys, or checkout flows needed.\n\nThe core protocol spec is submitted to the IETF as the [Payment HTTP Authentication Scheme](https://datatracker.ietf.org/doc/draft-ryan-httpauth-payment/).\n\n## Tempo token addresses\n\nPublic Tempo token addresses referenced throughout this skill. Use the placeholder names in code; full addresses are in the [Tempo documentation](https://docs.tempo.finance).\n\n| Token              | Network  | Placeholder          |\n|--------------------|----------|----------------------|\n| USDC.e (mainnet)   | mainnet  | `<USDC_TEMPO_MAINNET>` |\n| pathUSD (testnet)  | testnet  | `<PATHUSD_TESTNET>`  |\n\n## When to Use\n\n- Building a **paid API** that charges per request\n- Adding a **paywall** to endpoints or content\n- Enabling **AI agents** to pay for services autonomously\n- **MCP tool calls** that require payment\n- **Pay-per-token streaming** (LLM inference, content generation)\n- **Session-based metered billing** (pay-as-you-go)\n- Accepting **stablecoins** (Tempo), **cards** (Stripe), or **Bitcoin** (Lightning) for API access\n- Building a **payments proxy** to gate existing APIs (OpenAI, Anthropic, etc.)\n\n## Core Architecture\n\nThree primitives power every MPP payment:\n\n1. **Challenge** - server-issued payment requirement (in `WWW-Authenticate: Payment` header)\n2. **Credential** - client-submitted payment proof (in `Authorization: Payment` header)\n3. **Receipt** - server confirmation of successful payment (in `Payment-Receipt` header)\n\n```\nClient                                          Server\n  │  (1) GET /resource                            │\n  ├──────────────────────────────────────────────>│\n  │         (2) 402 + WWW-Authenticate: Payment   │\n  │<──────────────────────────────────────────────┤\n  │  (3) Sign payment proof                       │\n  │  (4) GET /resource + Authorization: Payment   │\n  ├──────────────────────────────────────────────>│\n  │         (5) Verify + settle                   │\n  │         (6) 200 OK + Payment-Receipt          │\n  │<──────────────────────────────────────────────┤\n```\n\n## Payment Methods & Intents\n\nMPP is payment-method agnostic. Each method defines its own settlement rail:\n\n| Method | Rail | SDK Package | Status |\n|--------|------|-------------|--------|\n| [Tempo](/payment-methods/tempo) | TIP-20 stablecoins on Tempo chain | `mppx` (built-in) | Production |\n| [Stripe](/payment-methods/stripe) | Cards, wallets via Shared Payment Tokens | `mppx` (built-in) | Production |\n| [Lightning](/payment-methods/lightning) | Bitcoin over Lightning Network | `@buildonspark/lightning-mpp-sdk` | Production |\n| [Stellar](/payment-methods/stellar) | SEP-41 tokens on Stellar | `@stellar/mpp` | Production |\n| [Card](/payment-methods/card) | Encrypted network tokens (Visa) | `mpp-card` | Production |\n| Custom | Any rail | `Method.from()` + `Method.toClient/toServer` | Extensible |\n\nTwo payment intents:\n\n| Intent | Pattern | Best For |\n|--------|---------|----------|\n| **charge** | One-time payment per request | API calls, content access, fixed-price endpoints |\n| **session** | Pay-as-you-go over payment channels | LLM streaming, metered billing, high-frequency APIs |\n\n## Quick Start: Server (TypeScript)\n\n```typescript\nimport { Mppx, tempo } from 'mppx/server'\n\nconst mppx = Mppx.create({\n  methods: [tempo({\n    currency: '<PATHUSD_TESTNET>', // pathUSD testnet\n    recipient: '0xYourAddress',\n  })],\n})\n\nexport async function handler(request: Request) {\n  const result = await mppx.charge({ amount: '0.01' })(request)\n  if (result.status === 402) return result.challenge\n  return result.withReceipt(Response.json({ data: '...' }))\n}\n```\n\nInstall: `npm install mppx viem`\n\n## Quick Start: Client (TypeScript)\n\n```typescript\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { Mppx, tempo } from 'mppx/client'\n\n// Polyfills globalThis.fetch to handle 402 automatically\nMppx.create({\n  methods: [tempo({ account: privateKeyToAccount('0x...') })],\n})\n\nconst res = await fetch('https://api.example.com/paid')\n// Payment happens transparently when server returns 402\n```\n\n## Quick Start: Server (Python)\n\n```python\nfrom fastapi import FastAPI, Request\nfrom mpp.server import Mpp\nfrom mpp.methods.tempo import tempo, ChargeIntent\n\napp = FastAPI()\nmpp = Mpp.create(method=tempo(\n    currency=\"<PATHUSD_TESTNET>\",\n    recipient=\"0xYourAddress\", intents={\"charge\": ChargeIntent()},\n))\n\n@app.get(\"/resource\")\nasync def get_resource(request: Request):\n    result = await mpp.charge(authorization=request.headers.get(\"Authorization\"), amount=\"0.50\")\n    if isinstance(result, Challenge):\n        return JSONResponse(status_code=402, content={\"error\": \"Payment required\"},\n            headers={\"WWW-Authenticate\": result.to_www_authenticate(mpp.realm)})\n    return {\"data\": \"paid content\"}\n```\n\nInstall: `pip install \"pympp[tempo]\"`. See `references/python-sdk.md` for full patterns.\n\n## Quick Start: Server (Rust)\n\nInstall: `cargo add mpp --features tempo,server`. See `references/rust-sdk.md` for full patterns.\n\n## Framework Middleware (TypeScript)\n\nEach framework has its own import (`mppx/nextjs`, `mppx/hono`, `mppx/express`, `mppx/elysia`):\n\n```typescript\n// Next.js\nimport { Mppx, tempo } from 'mppx/nextjs'\nconst mppx = Mppx.create({ methods: [tempo({ currency: '0x20c0...', recipient: '0x...' })] })\nexport const GET = mppx.charge({ amount: '0.1' })(() => Response.json({ data: '...' }))\n\n// Hono\nimport { Mppx, tempo } from 'mppx/hono'\napp.get('/resource', mppx.charge({ amount: '0.1' }), (c) => c.json({ data: '...' }))\n```\n\nSee `references/typescript-sdk.md` for Express and Elysia examples.\n\n## Sessions: Pay-as-You-Go Streaming\n\nSessions open a payment channel once, then use off-chain vouchers for each request - no blockchain transaction per request. Sub-100ms latency, near-zero per-request fees.\n\n```typescript\n// Server - session endpoint\nconst result = await mppx.session({\n  amount: '0.001',\n  unitType: 'token',\n})(request)\nif (result.status === 402) return result.challenge\nreturn result.withReceipt(Response.json({ data: '...' }))\n\n// Server - SSE streaming with per-word billing\nconst mppx = Mppx.create({\n  methods: [tempo({ currency: '0x20c0...', recipient: '0x...', sse: true })],\n})\nexport const GET = mppx.session({ amount: '0.001', unitType: 'word' })(\n  async () => {\n    const words = ['hello', 'world']\n    return async function* (stream) {\n      for (const word of words) {\n        await stream.charge()\n        yield word\n      }\n    }\n  }\n)\n\n// Client - session with auto-managed channel\nimport { Mppx, tempo } from 'mppx/client'\nMppx.create({\n  methods: [tempo({ account, maxDeposit: '1' })], // Lock up to 1 pathUSD\n})\nconst res = await fetch('http://localhost:3000/api/resource')\n// 1st request: opens channel on-chain\n// 2nd+ requests: off-chain vouchers (no on-chain tx)\n```\n\n**WebSocket transport**: Sessions also support WebSocket streaming via `Ws.serve()`. The WebSocket protocol uses typed messages (`mpp: 'authorization'`, `mpp: 'message'`, `mpp: 'payment-close-request'`, etc.) for payment negotiation alongside data delivery. See `references/sessions.md` for the full session lifecycle, escrow contracts, SSE patterns, and WebSocket integration.\n\n## Multi-Method Support\n\nAccept Tempo stablecoins, Stripe cards, and Lightning Bitcoin on a single endpoint:\n\n```typescript\nimport Stripe from 'stripe'\nimport { Mppx, tempo, stripe } from 'mppx/server'\nimport { spark } from '@buildonspark/lightning-mpp-sdk/server'\n\nconst mppx = Mppx.create({\n  methods: [\n    tempo({ currency: '0x20c0...', recipient: '0x...' }),\n    stripe.charge({ client: new Stripe(key), networkId: 'internal', paymentMethodTypes: ['card'] }),\n    spark.charge({ mnemonic: process.env.MNEMONIC! }),\n  ],\n})\n```\n\nUse `compose()` to present multiple methods in a single 402 response with per-route pricing. See `references/typescript-sdk.md` for compose patterns.\n\n## Payment Links (HTML)\n\nPayment links render a browser-friendly payment UI when a 402 endpoint is visited in a browser. Set `html: true` on the payment method config. Supports theming, multi-method compose (Tempo + Stripe tabs), and Solana wallets.\n\n```typescript\nimport { Mppx, tempo } from 'mppx/nextjs'\n\nconst mppx = Mppx.create({\n  methods: [tempo.charge({\n    currency: '0x20c0...', recipient: '0x...',\n    html: true, // auto-renders payment page for browsers\n  })],\n})\nexport const GET = mppx.charge({ amount: '0.1' })(() => Response.json({ data: '...' }))\n```\n\nCustomize via `mppx/html` exports (`Config`, `Text`, `Theme`). Service workers handle credential submission - the page reloads with the paid response. For multi-method compose, tabs auto-switch between payment options.\n\n## Zero-Dollar Auth (Proof Credentials)\n\nAuthenticate agent identity without payment. Clients sign an EIP-712 proof over the challenge ID instead of creating a transaction - no gas burned, no funds transferred.\n\n```typescript\n// Server - zero-dollar charge (amount: '0')\nconst result = await mppx.charge({ amount: '0' })(request)\n\n// Enable replay protection (makes each proof single-use)\nconst mppx = Mppx.create({\n  methods: [tempo.charge({ currency: '0x20c0...', recipient: '0x...', store: Store.memory() })],\n})\n```\n\nUse cases: identity verification, long-running job polling (prove identity once, poll freely), paid unlock with free subsequent access, multi-step agent pipelines. See mpp.dev/advanced/identity for full patterns.\n\n## Payments Proxy\n\nGate existing APIs behind MPP payments:\n\n```typescript\nimport { openai, Proxy } from 'mppx/proxy'\nimport { Mppx, tempo } from 'mppx/server'\n\nconst mppx = Mppx.create({ methods: [tempo()] })\nconst proxy = Proxy.create({\n  title: 'My API Gateway',\n  description: 'Paid access to AI APIs',\n  services: [\n    openai({\n      apiKey: 'sk-...', // pragma: allowlist secret\n      routes: {\n        'POST /v1/chat/completions': mppx.charge({ amount: '0.05' }),\n        'GET /v1/models': mppx.free(), // mppx.free() marks a route as free (no payment)\n      },\n    }),\n  ],\n})\n// Discovery: GET /openapi.json (canonical), GET /llms.txt (legacy /discover* returns 410)\n```\n\n## MCP Transport\n\nMCP tool calls can require payment using JSON-RPC error code `-32042`:\n\n```typescript\n// Server - MCP with payment (import tempo from mppx/server, NOT mppx/tempo)\nimport { McpServer } from 'mppx/mcp-sdk/server'\nimport { tempo } from 'mppx/server'\nconst server = McpServer.wrap(baseServer, {\n  methods: [tempo.charge({ ... })],\n  secretKey: '...',\n})\n\n// Client - payment-aware MCP client (import tempo from mppx/client)\nimport { McpClient } from 'mppx/mcp-sdk/client'\nimport { tempo } from 'mppx/client'\nconst mcp = McpClient.wrap(client, { methods: [tempo({ account })] })\nconst result = await mcp.callTool({ name: 'premium_tool', arguments: {} })\n```\n\nSee `references/transports.md` for the full MCP encoding (challenge in error.data.challenges, credential in _meta).\n\n## Privy Server Wallets\n\nUse [Privy](https://docs.privy.io) server wallets as MPP signers for agentic payment flows. The pattern: create a custom viem `Account` via `toAccount()` that delegates `signMessage`, `signTransaction`, and `signTypedData` to Privy's API (`@privy-io/node`), then pass it to `tempo({ account })`. Tempo's custom serializer requires using `signSecp256k1` (raw hash signing) for transactions instead of Privy's higher-level `signTransaction`.\n\nInstall: `npm install @privy-io/node mppx viem`. See `references/typescript-sdk.md` for the full implementation, [Privy agentic wallets docs](https://docs.privy.io/recipes/agent-integrations/agentic-wallets), and the [demo app](https://github.com/privy-io/examples/tree/main/privy-next-mpp-agent-demo).\n\n## Testing & CLI\n\n```bash\n# Create an account (stored in keychain, auto-funded on testnet)\nnpx mppx account create\n\n# Make a paid request\nnpx mppx http://localhost:3000/resource\n\n# Inspect challenge without paying\nnpx mppx --inspect http://localhost:3000/resource\n```\n\n**CLI config file**: Extend the CLI with custom payment methods via `mppx.config.(js|mjs|ts)`:\n```typescript\n// mppx.config.ts\nimport { defineConfig } from 'mppx/cli'\nexport default defineConfig({ plugins: [myCustomMethod()] })\n```\n\n## SDK Packages\n\n| Language | Package | Install |\n|----------|---------|---------|\n| TypeScript | [`mppx`](https://github.com/wevm/mppx) | `npm install mppx` |\n| Python | [`pympp`](https://github.com/tempoxyz/pympp) | `pip install pympp` or `pip install \"pympp[tempo]\"` |\n| Rust | [`mpp`](https://github.com/tempoxyz/mpp-rs) | `cargo add mpp --features tempo,client,server` |\n| Go | [`mppx`](https://github.com/cp0x-org/mppx) (community) | `go get github.com/cp0x-org/mppx` |\n| Stellar | [`@stellar/mpp`](https://github.com/stellar/stellar-mpp-sdk) | `npm install @stellar/mpp` |\n\nTypeScript subpath exports:\n- Server: `mppx/server` (generic), `mppx/hono`, `mppx/express`, `mppx/nextjs`, `mppx/elysia` (framework middleware)\n- Client: `mppx/client`\n- Proxy: `mppx/proxy`\n- MCP: `mppx/mcp-sdk/server`, `mppx/mcp-sdk/client`\n- HTML: `mppx/html` (exports `Config`, `Text`, `Theme` types and `init()` for payment link customization)\n- Discovery: `mppx/discovery` (OpenAPI-first discovery tooling)\n- SSE utilities: `mppx/tempo` (exports `Session` with `Session.Sse.iterateData` for SSE stream parsing)\n\nAlways import `Mppx` and `tempo` from the appropriate subpath for your context (e.g. `mppx/hono` for Hono, `mppx/server` for generic/MCP server, `mppx/client` for client). Note: `Mppx` and `tempo` are NOT exported from `mppx/tempo` - that subpath only exports `Session`.\n\n## Key Concepts\n\n- **Challenge/Credential/Receipt**: The three protocol primitives. Challenge IDs are HMAC-SHA256 bound to prevent tampering. See `references/protocol-spec.md`\n- **Payment methods**: Tempo (stablecoins), Stripe (cards), Lightning (Bitcoin), Card (network tokens), or custom. See method-specific references\n- **Intents**: `charge` (one-time) and `session` (streaming). See `references/sessions.md` for session details\n- **Payment links**: Browser-rendered 402 payment pages with `html: true`. Supports theming and multi-method compose tabs\n- **Zero-dollar auth**: `proof` credential type for identity without payment. Amount `'0'` triggers EIP-712 proof signing. Add `store` for replay protection\n- **Split payments**: Distribute a charge across multiple recipients in a single transaction (Tempo charge, 0.4.12+)\n- **Transports**: HTTP (headers), MCP (JSON-RPC), and WebSocket (streaming). See `references/transports.md`\n- **Tempo gas model**: Tempo has **no native gas token** (no ETH equivalent). All transaction fees are paid in stablecoins (USDC, pathUSD) via the `feeToken` transaction field. Accounts must either set `feeToken` per-transaction or call `setUserToken` on the FeeManager precompile to set a default. Without this, transactions fail with `gas_limit: 0`. See `references/tempo-method.md`\n- **Fee sponsorship**: Server pays gas fees on behalf of clients (Tempo). See `references/tempo-method.md`\n- **Push/pull modes**: Client broadcasts tx (push) or server broadcasts (pull). See `references/tempo-method.md`\n- **Custom methods**: Implement any payment rail with `Method.from()`. See `references/custom-methods.md`\n\n## Production Gotchas\n\n### Tempo Gas (CRITICAL)\n\n**Tempo has no native gas token.** Unlike Ethereum (ETH for gas) or Solana (SOL for fees), Tempo charges transaction fees in stablecoins. Every transaction must specify which stablecoin pays for gas. There are two ways:\n\n1. **Per-transaction `feeToken`** - set in the transaction itself:\n```typescript\nconst prepared = await prepareTransactionRequest(client, {\n  account,\n  calls: [{ to, data }],\n  feeToken: '<USDC_TEMPO_MAINNET>', // USDC mainnet (see Tempo token addresses table)\n} as never)\n```\n\n2. **Account-level default via `setUserToken`** - one-time setup, applies to all future transactions:\n```typescript\nimport { setUserToken } from 'viem/tempo'\nawait client.fee.setUserTokenSync({\n  token: '<USDC_TEMPO_MAINNET>', // USDC mainnet\n})\n```\n\n**Without either, transactions fail silently with `gas_limit: 0`.** The mppx SDK handles this internally for payment transactions, but any direct on-chain calls (settle, close, custom contract interactions) must set `feeToken` explicitly or ensure `setUserToken` was called for the account.\n\n**Fee token addresses:** see the [Tempo token addresses](#tempo-token-addresses) table above (`<USDC_TEMPO_MAINNET>`, `<PATHUSD_TESTNET>`).\n\n### Setup\n\n**Self-payment trap**: The payer and recipient cannot be the same wallet address. When testing with `npx mppx`, create a separate client account (`npx mppx account create -a client`) and fund it separately.\n\n**Recipient wallet initialization**: TIP-20 token accounts on Tempo must be initialized before they can receive tokens (similar to Solana ATAs). Send a tiny amount (e.g. 0.01 USDC) to the recipient address first: `tempo wallet transfer 0.01 <USDC_TEMPO_MAINNET> <recipient>`.\n\n### Server\n\n**Set `realm` explicitly for mppscan attribution.** The `realm` value is hashed into Tempo's attribution memo (bytes 5-14 of the 32-byte `transferWithMemo` data) and is how mppscan correlates on-chain transactions to registered servers. `Mppx.create()` auto-detects `realm` from env vars (`MPP_REALM`, `FLY_APP_NAME`, `HEROKU_APP_NAME`, `HOST`, `HOSTNAME`, `RAILWAY_PUBLIC_DOMAIN`, `RENDER_EXTERNAL_HOSTNAME`, `VERCEL_URL`, `WEBSITE_HOSTNAME`). On PaaS platforms (Vercel, Railway, Heroku) these are stable app names and work fine. **In Kubernetes, `HOSTNAME` is the pod name** (e.g. `web-69d986c8d8-6dtdx`) which rotates on every deploy - causing a new server fingerprint each time, so mppscan can't track your transactions. Fix by setting `MPP_REALM` env var to your stable public domain or passing `realm` directly:\n```typescript\nMppx.create({\n  methods: [tempo({ ... })],\n  realm: 'web.surf.cascade.fyi', // or process.env.MPP_REALM\n  secretKey,\n})\n```\n\n**`tempo()` vs explicit registration**: `tempo({ ... })` registers both `charge` and `session` intents with shared config. When you need different config per intent (e.g. session needs `store` and `sse: { poll: true }` but charge doesn't), register them explicitly:\n```typescript\nimport { Mppx, Store, tempo } from 'mppx/server'\nMppx.create({\n  methods: [\n    tempo.charge({ currency, recipient }),\n    tempo.session({ currency, recipient, store: Store.memory(), sse: { poll: true } }),\n  ],\n  secretKey,\n})\n```\n\n**Hono multiple headers**: `c.header(name, value)` replaces by default. When emitting multiple `WWW-Authenticate` values (e.g. charge + session intents), the second call silently overwrites the first. Prefer using `mppx.compose()` which handles multi-header emission correctly. If composing manually, use `{ append: true }`:\n```typescript\nc.header('WWW-Authenticate', chargeWwwAuth)\nc.header('WWW-Authenticate', sessionWwwAuth, { append: true })\n```\n\n**CORS headers**: `WWW-Authenticate` and `Payment-Receipt` must be listed in `access-control-expose-headers` or browsers/clients won't see them.\n\n**SSE utilities import path**: `Session.Sse.iterateData` is exported from `mppx/tempo`, NOT `mppx/server`:\n```typescript\nimport { Mppx, Store, tempo } from 'mppx/server'\nimport { Session } from 'mppx/tempo'\nconst iterateSseData = Session.Sse.iterateData\n```\n\n### Stores\n\n**Never use `Store.memory()` in production.** It loses all channel state on server restart/redeploy. When state is lost, the server can't close channels or settle funds - client deposits stay locked in escrow indefinitely. Use a persistent store.\n\nBuilt-in store adapters (all handle BigInt serialization via `ox`'s `Json` module):\n```typescript\nimport { Store } from 'mppx/server'\n\nStore.memory()              // development only\nStore.redis(redisClient)    // ioredis, node-redis, Valkey (added in 0.4.9)\nStore.upstash(upstashClient) // Upstash Redis / Vercel KV\nStore.cloudflare(kvNamespace) // Cloudflare KV\nStore.from({ get, put, delete }) // custom adapter\n```\n\n**AtomicStore** (0.5.7+): Extends `Store` with an `update(key, fn)` method for safe concurrent read-modify-write. Used internally for replay protection and channel state. All built-in adapters (redis, upstash, cloudflare) support atomic updates. Custom adapters via `Store.from()` get an optimistic-retry implementation automatically.\n\n**Polling mode**: If your store doesn't implement the optional `waitForUpdate()` method (e.g. custom adapters via `Store.from()`), pass `sse: { poll: true }` to `tempo.session()`. Otherwise SSE streams will hang waiting for event-driven wakeups that never come.\n\n### Channel Recovery After Restarts\n\nPass `channelId` to `mppx.session()` so returning clients recover existing on-chain channels instead of opening new ones (which locks more funds in escrow). See `references/sessions.md` for the full pattern with `Credential.fromRequest()` and `tryRecoverChannel()`.\n\n### Request Handling\n\n**Session voucher POSTs have no body.** Mid-stream voucher POSTs carry only `Authorization: Payment` - no JSON body. If your middleware decides charge vs session based on `body.stream`, vouchers will hit the charge path. Check the **credential's intent** instead. As of mppx 0.4.9, the SDK skips route amount/currency/recipient validation for topUp and voucher credentials (the on-chain voucher signature is the real validation), so body-derived pricing mismatches no longer cause spurious 402 rejections.\n\n**Clone the request before reading the body.** `request.json()` consumes the Request body. If you parse the body first and then pass the original request to `mppx.session()` or `mppx.charge()`, the mppx handler gets an empty body and returns 402. Clone before reading.\n\n### Pricing & Streaming\n\n**Cheap model zero-charge floor**: Tempo USDC has 6-decimal precision. For very cheap models, per-token cost like `(0.10 / 1_000_000) * 1.3 = 0.00000013` rounds to `\"0.000000\"` via `toFixed(6)` - effectively zero. Add a minimum tick cost floor:\n```typescript\nconst MIN_TICK_COST = 0.000001 // smallest Tempo USDC unit (6 decimals)\nconst tickCost = Math.max((outputRate / 1_000_000) * margin, MIN_TICK_COST)\n```\n\n**SSE chunks != tokens**: Per-SSE-event `stream.charge()` is an acceptable approximation. `stream.charge()` is serial (Redis GET + SET per call, per-channelId mutex) - no bulk API exists yet.\n\n**Add upstream timeouts**: Always use `AbortSignal.timeout()` on upstream fetches. A stalled upstream holds the payment channel open, locking client funds.\n\n### Infrastructure\n\n**Nginx proxy buffer overflow**: Large 402 headers can exceed nginx's default 4k `proxy_buffer_size`, causing **502 Bad Gateway**. Fix: `nginx.ingress.kubernetes.io/proxy-buffer-size: \"16k\"`. Debug: port-forward directly to the pod - if you get 402, the issue is in the ingress layer.\n\n### Client / Tempo CLI\n\n**CLI defaults to mainnet** (0.5.4+): The `mppx` CLI now defaults to Tempo mainnet when `--rpc-url` is omitted. Previously it defaulted to testnet. Use `--rpc-url` or set `MPPX_RPC_URL`/`RPC_URL` env vars for testnet.\n\n**Stale sessions after redeploy**: When the server redeploys and loses in-memory session state, clients get `\"Session invalidation claim for channel 0x... was not confirmed on-chain\"`. Fix: `tempo wallet sessions close` or `tempo wallet sessions sync`. Dispute window is 4-15 min.\n\n## References\n\n| File | Content |\n|------|---------|\n| `references/protocol-spec.md` | Core protocol: Challenge/Credential/Receipt structure, status codes, error handling, security, caching, extensibility |\n| `references/typescript-sdk.md` | mppx TypeScript SDK: server/client/middleware, proxy, MCP SDK, CLI, AtomicStore, Privy wallets |\n| `references/tempo-method.md` | Tempo: charge + session, fee sponsorship, push/pull, auto-swap, split payments, config |\n| `references/stripe-method.md` | Stripe payment method: SPT flow, server/client config, Stripe Elements, createToken proxy, metadata |\n| `references/sessions.md` | Sessions: payment channels, vouchers, SSE/WebSocket streaming, escrow, channel recovery |\n| `references/transports.md` | HTTP, MCP, and WebSocket transport bindings: header/message encoding, comparison |\n| `references/python-sdk.md` | pympp Python SDK: FastAPI/server patterns, async client, streaming sessions |\n| `references/rust-sdk.md` | mpp Rust SDK: server/client, feature flags, reqwest middleware |\n| `references/lightning-method.md` | Lightning payment method: charge (BOLT11), session (bearer tokens), Spark SDK |\n| `references/custom-methods.md` | Custom payment methods: Method.from, Method.toClient, Method.toServer patterns |\n\n## Official Resources\n\n- Website: https://mpp.dev\n- GitHub: https://github.com/wevm/mppx (TypeScript SDK)\n- Protocol spec: https://paymentauth.org\n- Stripe docs: https://docs.stripe.com/payments/machine/mpp\n- Tempo docs: https://docs.tempo.xyz\n- Privy MPP guide: https://docs.privy.io (search \"MPP\" or see agentic wallets recipes)\n- x402 migration: https://mpp.dev/guides/upgrade-x402\n- LLM docs: https://mpp.dev/llms-full.txt","tags":["mpp","skills","tenequm","agent-skills","ai-agents","claude-code","claude-skills","clawhub","erc-8004","openclaw","solana","x402"],"capabilities":["skill","source-tenequm","skill-mpp","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-claude-skills","topic-clawhub","topic-erc-8004","topic-mpp","topic-openclaw","topic-skills","topic-solana","topic-x402"],"categories":["skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/tenequm/skills/mpp","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add tenequm/skills","source_repo":"https://github.com/tenequm/skills","install_from":"skills.sh"}},"qualityScore":"0.464","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 28 github stars · SKILL.md body (25,141 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:04:38.819Z","embedding":null,"createdAt":"2026-04-18T23:05:18.775Z","updatedAt":"2026-05-18T19:04:38.819Z","lastSeenAt":"2026-05-18T19:04:38.819Z","tsv":"'-14':2035 '-15':2888 '-20':314,1983 '-32042':1212 '-41':348 '-712':1043,1667 '/advanced/identity':1123 '/cp0x-org/mppx':1487 '/cp0x-org/mppx)':1481 '/discover':1195 '/doc/draft-ryan-httpauth-payment/).':109 '/guides/upgrade-x402':3037 '/llms-full.txt':3042 '/llms.txt':1193 '/node':1322,1355 '/openapi.json':1190 '/paid'')':490 '/payment-methods/card':355 '/payment-methods/lightning':338 '/payment-methods/stellar':346 '/payment-methods/stripe':325 '/payment-methods/tempo':312 '/payments/machine/mpp':3018 '/privy-io/examples/tree/main/privy-next-mpp-agent-demo).':1377 '/proxy-buffer-size:':2782 '/recipes/agent-integrations/agentic-wallets),':1370 '/resource':265,278,530,640 '/stellar/stellar-mpp-sdk)':1492 '/tempoxyz/mpp-rs)':1469 '/tempoxyz/pympp)':1456 '/toserver':370 '/v1/chat/completions':1173 '/v1/models':1178 '/wevm/mppx':3008 '/wevm/mppx)':1448 '0':1067,1073,1664,1754,1896 '0.000000':2674 '0.00000013':2671 '0.000001':2691 '0.001':701,738 '0.01':442,2005,2015 '0.05':1176 '0.1':630,643,994 '0.10':2666 '0.4.12':1689 '0.4.9':2384,2568 '0.5.4':2810 '0.5.7':2402 '0.50':544 '000':2668,2669,2703,2704 '0x':483,624,730,890,979,1092,2867 '0x20c0':622,728,888,977,1090 '0xyouraddress':430,525 '1':225,263,776,780,1832,2667,2702 '1.3':2670 '100ms':683 '16k':2783 '1st':788 '2':238,266,1862 '200':285 '2nd':795 '3':249,272 '3000/api/resource':787 '3000/resource':1403,1412 '32':2038 '4':276,2887 '402':19,46,68,267,446,476,497,553,707,912,938,1638,2600,2639,2764,2795 '410':1197 '4k':2771 '5':281,2034 '502':2776 '6':284,2654,2677,2696 '69d986c8d8':2106 '6dtdx':2107 'abortsignal.timeout':2743 'accept':195,855,2719 'access':205,389,1114,1160,2280 'access-control-expose-head':2279 'account':85,481,774,1263,1306,1328,1383,1394,1728,1848,1864,1929,1968,1971,1985 'account-level':1863 'across':1680 'ad':155,2382 'adapt':2357,2400,2430,2438,2462 'add':586,1471,1670,2680,2738 'address':112,116,128,1858,1932,1937,1941,1958,2010 'agent':30,164,1035,1118,1297,1365,3030 'agnost':298 'ai':29,163,1162 'allowlist':1169 'alongsid':834 'also':809 'alway':1546,2741 'amount':441,543,629,642,700,737,993,1066,1072,1175,1663,2003 'amount/currency/recipient':2573 'anthrop':215 'api':24,86,150,204,213,386,410,1131,1156,1163,1318,2735 'api.example.com':489 'api.example.com/paid'')':488 'apikey':1166 'app':517,1374,2065,2068,2091 'app.get':529,639 'append':2251,2264 'appli':1873 'appropri':1553 'approxim':2720 'architectur':218 'argument':1271 'async':432,531,741,747,2969 'ata':1999 'atom':2435 'atomicstor':2401,2914 'attribut':2022,2031 'auth':1031,1655 'authent':105,235,270,561,564,1034,2224,2257,2262,2270 'author':60,246,279,540,542,822,2538 'auto':763,983,1023,1388,2056,2925 'auto-detect':2055 'auto-fund':1387 'auto-manag':762 'auto-rend':982 'auto-swap':2924 'auto-switch':1022 'automat':477,2447 'autonom':169 'await':439,486,538,698,755,784,1070,1266,1845,1883 'awar':1242 'bad':2777 'base':187,2550 'baseserv':1235 'bash':1380 'bearer':2989 'behalf':1764 'behind':1132 'best':377 'bigint':2360 'bill':189,406,721 'bind':2959 'bitcoin':201,339,862,1609 'blockchain':677 'bodi':2530,2542,2592,2608,2613,2618,2636 'body-deriv':2591 'body.stream':2552 'bolt11':2987 'bound':1596 'broadcast':1773,1778 'browser':932,944,988,1636 'browser-friend':931 'browser-rend':1635 'browsers/clients':2285 'buffer':2761,2773 'build':2,147,206 'buildonspark/lightning-mpp-sdk':343 'buildonspark/lightning-mpp-sdk/server':881 'built':321,334,2354,2428 'built-in':320,333,2353,2427 'bulk':2734 'burn':1056 'byte':2033,2039 'c':644 'c.header':2213,2254,2259 'c.json':645 'cach':2903 'call':172,387,1202,1737,1849,1912,1926,2232,2728 'cannot':1953 'canon':1191 'card':198,326,354,362,859,899,1607,1610 'cargo':585,1470 'carri':2536 'case':1096 'caus':2113,2598,2775 'chain':318,671,794,799,804,1911,2049,2500,2583,2873 'challeng':226,548,1047,1279,1405,1590 'challenge/credential/receipt':1585,2896 'channel':402,665,765,791,2324,2338,2424,2485,2501,2753,2866,2946,2951 'channelid':2490,2731 'charg':152,379,527,1065,1621,1679,1688,1814,2160,2183,2227,2547,2557,2649,2919,2986 'chargeint':516,528 'chargewwwauth':2258 'cheap':2645,2659 'check':2559 'checkout':89 'chunk':2710 'claim':2864 'cli':1379,1413,1418,2805,2806,2813,2913 'client':77,241,261,460,759,892,1039,1239,1244,1260,1475,1508,1568,1766,1772,1847,1967,1974,2342,2495,2756,2803,2860,2970 'client-submit':240 'client.fee.setusertokensync':1884 'clone':2602,2640 'close':828,1914,2337,2878 'cloudflar':2393,2433 'co':59 'co-author':58 'code':126,552,1211,2899 'come':2484 'communiti':1482 'comparison':2962 'compos':904,922,958,1020,1650,2248 'concept':1584 'concurr':2413 'config':952,1001,1414,1518,2166,2171,2929,2937 'confirm':252,2870 'const':421,437,484,616,626,696,722,734,742,751,782,882,971,990,1068,1084,1146,1151,1232,1257,1264,1843,2312,2687,2698 'consum':2610 'content':28,161,183,388,554,569,2892 'context':1557 'contract':845,1916 'control':2281 'cor':2266 'core':93,217,2894 'correct':2246 'correl':2046 'cost':2664,2684,2690,2708 'creat':1051,1302,1381,1395,1964,1972 'createtoken':2940 'credenti':239,1007,1033,1282,1657,2561,2579 'credential.fromrequest':2520 'critic':1796 'currenc':426,523,621,727,887,976,1089,2199,2202 'custom':364,997,1304,1331,1420,1527,1614,1782,1915,2399,2437,2461,2994 'data':452,567,632,646,713,835,996,1851,2041 'datatracker.ietf.org':108 'datatracker.ietf.org/doc/draft-ryan-httpauth-payment/).':107 'debug':2784 'decid':2546 'decim':2655,2697 'def':532 'default':1435,1746,1866,2218,2770,2807,2815,2827 'defin':301 'defineconfig':1431,1436 'deleg':1310 'delet':2398 'deliveri':836 'demo':1373 'deploy':2112 'deposit':2343 'deriv':2593 'descript':1158 'detail':1632 'detect':2057 'develop':22,2373 'differ':2170 'direct':1908,2142,2788 'discoveri':1188,1528,1533 'disput':2884 'distribut':1677 'doc':1367,3015,3020,3039 'docs.privy.io':1290,1369,3025 'docs.privy.io/recipes/agent-integrations/agentic-wallets),':1368 'docs.stripe.com':3017 'docs.stripe.com/payments/machine/mpp':3016 'docs.tempo.finance':134 'docs.tempo.xyz':3021 'document':133 'doesn':2184,2453 'dollar':1030,1064,1654 'domain':2074,2138 'driven':2480 'e.g':1558,2004,2103,2174,2226,2460 'effect':2678 'eip':1042,1666 'either':1730,1889 'element':2939 'elysia':652 'emiss':2245 'emit':2220 'empti':2635 'enabl':162,1075 'encod':1278,2961 'encrypt':356 'endpoint':159,393,695,866,939 'ensur':1923 'env':2060,2132,2841 'equival':1713 'error':555,1210,2900 'error.data.challenges':1281 'escrow':844,2347,2512,2950 'etc':216,830 'eth':1712,1805 'ethereum':1804 'event':2479,2715 'event-driven':2478 'everi':222,1819,2111 'exampl':653 'exceed':2767 'exist':212,1130,2497,2736 'explicit':1921,2019,2155,2188 'export':431,625,733,989,1000,1434,1498,1517,1538,1575,1581,2296 'expos':2282 'express':650 'extend':1416,2403 'extens':371,2904 'extern':2076 'fail':1750,1891 'fastapi':504,506,518 'fastapi/server':2967 'featur':588,1473,2978 'fee':691,1716,1757,1762,1812,1816,1930,2921 'feemanag':1741 'feetoken':1725,1732,1836,1852,1920 'fetch':487,785,2746 'field':1727 'file':1415,2891 'fine':2095 'fingerprint':2117 'first':1532,2011,2236,2619 'fix':391,2127,2779,2874 'fixed-pric':390 'flag':2979 'fli':2064 'floor':2650,2685 'flow':32,90,1299,2935 'fn':2409 'forward':2787 'framework':596,600,1506 'free':1112,1185 'freeli':1108 'frequenc':409 'friend':933 'full':127,578,594,841,1125,1276,1362,2517 'function':433,748 'fund':1058,1389,1976,2341,2510,2757 'futur':1876 'gas':1055,1703,1709,1752,1761,1795,1801,1807,1827,1894 'gate':27,211,1129 'gateway':1157,2778 'generat':184 'generic':1501 'generic/mcp':1564 'get':264,277,533,627,735,991,1177,1189,1192,1484,2396,2441,2633,2725,2794,2861 'github':3005 'github.com':1376,1447,1455,1468,1480,1486,1491,3007 'github.com/cp0x-org/mppx':1485 'github.com/cp0x-org/mppx)':1479 'github.com/privy-io/examples/tree/main/privy-next-mpp-agent-demo).':1375 'github.com/stellar/stellar-mpp-sdk)':1490 'github.com/tempoxyz/mpp-rs)':1467 'github.com/tempoxyz/pympp)':1454 'github.com/wevm/mppx':3006 'github.com/wevm/mppx)':1446 'globalthis.fetch':473 'go':194,399,659,1477,1483 'gotcha':1793 'guid':3024 'handl':475,1006,1900,2241,2359,2524,2901 'handler':434,2632 'hang':2475 'happen':492 'hash':1337,2027 'header':237,248,260,558,1692,2212,2244,2267,2283,2765 'header/message':2960 'hello':744 'heroku':2067,2087 'high':408 'high-frequ':407 'higher':1346 'higher-level':1345 'hit':2555 'hmac':1594 'hmac-sha256':1593 'hold':2750 'hono':633,1561,2210 'host':2070 'hostnam':2071,2077,2081,2098 'html':926,946,980,1515,1642 'http':18,45,67,82,104,1691,2954 'id':1048,1591 'ident':1036,1097,1105,1660 'ietf':100 'implement':1363,1784,2446,2455 'import':416,463,467,505,510,514,604,611,634,766,868,872,878,966,1136,1141,1218,1224,1228,1245,1249,1253,1430,1547,1879,2190,2292,2302,2308,2368 'in-memori':2855 'indefinit':2348 'infer':182 'infrastructur':2758 'ingress':2801 'init':1523 'initi':1981,1990 'inspect':1404,1410 'instal':453,455,570,572,584,1349,1351,1443,1450,1458,1462,1494 'instead':1049,1341,2502,2564 'integr':850 'intent':292,374,375,526,1620,2163,2173,2229,2563 'interact':1917 'intern':897,1902,2419 'invalid':2863 'io':1321,1354 'ioredi':2377 'isinst':546 'issu':229,2797 'iteratessedata':2313 'job':1102 'js':1425 'json':1208,1695,2365,2541 'json-rpc':1207,1694 'jsonrespons':550 'key':87,895,1583,2408 'keychain':1386 'kubernet':2097 'kv':2390,2394 'kvnamespac':2392 'languag':1441 'larg':2763 'latenc':684 'layer':2802 'legaci':1194 'level':1347,1865 'lifecycl':843 'lightn':202,337,341,861,1608,2983 'like':2665 'limit':1753,1895 'link':925,928,1526,1634 'list':2277 'llm':181,403,3038 'localhost':786,1402,1411 'lock':777,2345,2508,2755 'long':1100 'long-run':1099 'longer':2597 'lose':2322,2854 'lost':2332 'machin':5,13,15,50,73,75 'machine-to-machin':12,72 'mainnet':139,140,1854,1887,2809,2818 'make':1078,1396 'manag':764 'manual':2249 'margin':2705 'mark':1181 'math.max':2700 'maxdeposit':775 'mcp':33,170,1198,1200,1215,1243,1258,1277,1512,1693,2911,2955 'mcp.calltool':1267 'mcpclient':1250 'mcpclient.wrap':1259 'mcpserver':1225 'mcpserver.wrap':1234 'memo':2032 'memori':2857 'messag':820,824 'meta':1284 'metadata':2942 'meter':188,405 'method':291,297,300,306,424,479,521,619,725,772,853,885,908,951,957,974,1019,1087,1149,1236,1261,1422,1603,1617,1649,1783,2145,2197,2410,2459,2933,2985,2996 'method-specif':1616 'method.from':367,1789,2997 'method.toclient':369,2998 'method.toclient/toserver':368 'method.toserver':2999 'mid':2532 'mid-stream':2531 'middlewar':597,1507,2545,2981 'migrat':3034 'min':2688,2706,2889 'minimum':2682 'mismatch':2595 'mjs':1426 'mnemon':901 'mode':1771,2449 'model':1704,2646,2660 'modifi':2416 'modul':2366 'mpp':1,4,49,53,223,293,361,511,519,587,821,823,825,1133,1294,1466,1472,2062,2130,2974,3023,3027 'mpp-card':360 'mpp.charge':539 'mpp.create':520 'mpp.dev':1122,3004,3036,3041 'mpp.dev/advanced/identity':1121 'mpp.dev/guides/upgrade-x402':3035 'mpp.dev/llms-full.txt':3040 'mpp.methods.tempo':513 'mpp.realm':565 'mpp.server':509 'mppscan':2021,2045,2121 'mppx':319,332,417,422,456,468,612,617,635,723,767,873,883,967,972,1085,1142,1147,1356,1393,1401,1409,1445,1451,1478,1548,1570,1898,1963,1970,2191,2303,2567,2631,2812,2836,2906 'mppx.charge':440,628,641,992,1071,1174,2629 'mppx.compose':2239 'mppx.config':1424 'mppx.config.ts':1429 'mppx.create':423,478,618,724,771,884,973,1086,1148,2054,2144,2196 'mppx.free':1179,1180 'mppx.session':699,736,2492,2627 'mppx/cli':1433 'mppx/client':471,770,1248,1256,1509,1566 'mppx/discovery':1529 'mppx/elysia':608,1505 'mppx/express':607,1503 'mppx/hono':606,638,1502,1559 'mppx/html':999,1516 'mppx/mcp-sdk/client':1252,1514 'mppx/mcp-sdk/server':1227,1513 'mppx/nextjs':605,615,970,1504 'mppx/proxy':1140,1511 'mppx/server':420,877,1145,1221,1231,1500,1562,2195,2300,2307,2371 'mppx/tempo':1223,1537,1577,2298,2311 'multi':852,956,1018,1116,1648,2243 'multi-head':2242 'multi-method':851,955,1017,1647 'multi-step':1115 'multipl':907,1681,2211,2221 'must':1729,1821,1918,1988,2275 'mutex':2732 'mycustommethod':1438 'name':124,1268,2066,2069,2092,2102,2214 'nativ':1708,1800 'near':686 'near-zero':685 'need':91,2169,2176 'negoti':833 'network':136,342,357,1611 'networkid':896 'never':1861,2316,2483 'new':893,2115,2505 'next.js':610 'nginx':2759,2768 'nginx.ingress.kubernetes.io':2781 'nginx.ingress.kubernetes.io/proxy-buffer-size:':2780 'node':2379 'node-redi':2378 'note':1569 'npm':454,1350,1449,1493 'npx':1392,1400,1408,1962,1969 'off-chain':669,797 'offici':3001 'ok':286 'omit':2824 'on-chain':792,802,1909,2047,2498,2581,2871 'one':381,1623,1870,2506 'one-tim':380,1622,1869 'open':9,56,662,790,2504,2754 'openai':214,1137,1165 'openapi':1531 'openapi-first':1530 'optimist':2444 'optimistic-retri':2443 'option':1027,2457 'origin':2624 'otherwis':2471 'outputr':2701 'overflow':2762 'overwrit':2234 'ox':2363 'paa':2083 'packag':309,1440,1442 'page':986,1010,1640 'paid':23,149,568,1014,1109,1159,1398,1718 'pars':1545,2616 'pass':1324,2140,2465,2489,2622 'path':2293,2558 'pathusd':141,427,781,1722 'pattern':376,579,595,847,923,1126,1301,2518,2968,3000 'pay':37,78,166,177,191,396,656,1407,1760,1825 'pay-as-you-go':190,395,655 'pay-per-token':36,176 'payer':1950 'payment':6,16,26,31,35,47,51,69,76,103,175,208,224,230,236,243,247,255,258,271,274,280,288,290,296,330,373,383,401,491,556,664,827,832,924,927,934,950,985,1026,1038,1127,1134,1187,1205,1217,1241,1298,1421,1525,1602,1633,1639,1662,1676,1786,1904,1947,2273,2539,2752,2928,2932,2945,2984,2995 'payment-awar':1240 'payment-close-request':826 'payment-g':25 'payment-method':295 'payment-receipt':257,287,2272 'paymentauth.org':3013 'paymentmethodtyp':898 'paywal':157 'per':38,153,178,384,679,689,719,916,1734,1834,2172,2662,2713,2727,2730 'per-channelid':2729 'per-request':688 'per-rout':915 'per-sse-ev':2712 'per-token':2661 'per-transact':1733,1833 'per-word':718 'persist':2351 'pip':571,1457,1461 'pipelin':1119 'placehold':123,137 'platform':2084 'plugin':1437 'pod':2101,2791 'poll':1103,1107,2180,2207,2448,2467 'polyfil':472 'port':2786 'port-forward':2785 'post':1172,2527,2535 'power':221 'pragma':1168 'precis':2656 'precompil':1742 'prefer':2237 'premium':1269 'prepar':1844 'preparetransactionrequest':1846 'present':906 'prevent':1598 'previous':2825 'price':392,918,2594,2643 'primit':220,1589 'privatekeytoaccount':464,482 'privi':1285,1289,1316,1320,1343,1353,1364,2915,3022 'privy-io':1319,1352 'process.env.mnemonic':902 'process.env.mpp':2150 'product':323,336,344,353,363,1792,2320 'proof':244,275,1032,1044,1080,1656,1668 'protect':1077,1674,2422 'protocol':7,10,52,57,94,817,1588,2895,3011 'prove':1104 'proxi':209,1128,1138,1152,1510,2760,2772,2910,2941 'proxy.create':1153 'public':113,2073,2137 'pull':1779 'push':1775 'push/pull':1770,2923 'put':2397 'pympp':573,1453,1459,1463,2964 'python':501,502,1452,2965 'quick':411,458,498,580 'rail':305,307,366,1787 'railway':2072,2086 'raw':1336 'read':2415,2606,2642 'read-modify-writ':2414 'real':2588 'realm':2018,2024,2058,2063,2131,2141,2147,2151 'receipt':250,259,289,2274 'receiv':1994 'recip':3032 'recipi':429,524,623,729,889,978,1091,1682,1952,1979,2009,2200,2203 'recov':2496 'recoveri':2486,2952 'redeploy':2848,2852 'redi':2380,2388,2431,2724 'rediscli':2376 'refer':1619,2890 'referenc':117 'references/custom-methods.md':1791,2993 'references/lightning-method.md':2982 'references/protocol-spec.md':1601,2893 'references/python-sdk.md':576,2963 'references/rust-sdk.md':592,2973 'references/sessions.md':838,1629,2514,2943 'references/stripe-method.md':2930 'references/tempo-method.md':1756,1769,1781,2917 'references/transports.md':1273,1701,2953 'references/typescript-sdk.md':648,920,1359,2905 'regist':2052,2158,2186 'registr':2156 'reject':2601 'reload':1011 'render':929,984,1637,2075 'replac':2216 'replay':1076,1673,2421 'request':83,154,385,435,436,443,507,535,536,675,680,690,704,789,796,829,1074,1399,2523,2604,2612,2625 'request.headers.get':541 'request.json':2609 'requir':48,70,174,231,557,1204,1333 'reqwest':2980 'res':485,783 'resourc':534,3002 'respons':913,1015 'response.json':451,631,712,995 'restart':2488 'restart/redeploy':2328 'result':438,537,547,697,1069,1265 'result.challenge':448,709 'result.status':445,706 'result.to':562 'result.withreceipt':450,711 'retri':2445 'return':447,449,496,549,566,708,710,746,1196,2494,2638 'rotat':2109 'round':2672 'rout':917,1171,1183,2572 'rpc':1209,1696,2821,2832,2837,2839 'rpc-url':2820,2831 'run':1101 'rust':583,1465,2975 'safe':2412 'scheme':106 'sdk':308,1439,1899,2570,2908,2912,2966,2976,2992,3010 'search':3026 'second':2231 'secret':1170 'secretkey':1238,2152,2209 'secur':2902 'see':575,591,647,837,919,1120,1272,1358,1600,1615,1628,1700,1755,1768,1780,1790,1855,1933,2288,2513,3029 'self':1946 'self-pay':1945 'send':2000 'sep':347 'separ':1966,1978 'serial':1332,2361,2723 'server':228,251,262,413,495,500,582,590,693,714,1061,1214,1233,1286,1291,1476,1499,1565,1759,1777,2016,2053,2116,2327,2334,2851 'server-issu':227 'server/client':2936,2977 'server/client/middleware':2909 'servic':43,168,1004,1164 'session':186,394,654,661,694,760,808,842,1539,1582,1626,1631,2162,2175,2228,2309,2525,2549,2846,2858,2862,2877,2882,2920,2944,2972,2988 'session-bas':185 'session.sse.iteratedata':1541,2294,2314 'sessionwwwauth':2263 'set':945,1731,1744,1837,1919,2017,2129,2726,2835 'settl':283,1913,2340 'settlement':304 'setup':1872,1944 'setusertoken':1738,1868,1880,1924 'sha256':1595 'share':329,2165 'sign':273,1040,1338,1669 'signatur':2585 'signer':1295 'signmessag':1311 'signsecp256k1':1335 'signtransact':1312,1348 'signtypeddata':1314 'silent':1892,2233 'similar':1996 'singl':865,911,1082,1685 'single-us':1081 'size':2774 'sk':1167 'skill':120 'skill-mpp' 'skip':2571 'smallest':2692 'sol':1810 'solana':963,1809,1998 'source-tenequm' 'spark':879,2991 'spark.charge':900 'spec':95,3012 'specif':1618 'specifi':1822 'split':1675,2927 'sponsorship':1758,2922 'spt':2934 'spurious':2599 'sse':715,731,846,1535,1543,2179,2206,2290,2466,2472,2709,2714 'sse/websocket':2948 'stabl':2090,2136 'stablecoin':196,315,857,1605,1720,1818,1824 'stale':2845 'stall':2748 'standard':66 'start':412,459,499,581 'state':2325,2330,2425,2859 'status':310,551,2898 'stay':2344 'stellar':345,351,1488 'stellar/mpp':352,1489,1495 'step':1117 'store':1093,1384,1671,2177,2192,2204,2304,2315,2352,2356,2369,2404,2452 'store.cloudflare':2391 'store.from':2395,2440,2464 'store.memory':1094,2205,2318,2372 'store.redis':2375 'store.upstash':2385 'stream':40,180,404,660,716,749,812,1544,1627,1699,2473,2533,2644,2949,2971 'stream.charge':756,2716,2721 'stripe':64,199,324,858,869,871,875,894,960,1606,2931,2938,3014 'stripe.charge':891 'structur':2897 'sub':682 'sub-100ms':681 'submiss':1008 'submit':97,242 'subpath':1497,1554,1579 'subsequ':1113 'success':254 'support':810,854,953,1644,2434 'swap':2926 'switch':1024 'sync':2883 'tab':961,1021,1651 'tabl':1859,1942 'tamper':1599 'tempo':62,110,114,132,197,311,317,418,425,469,480,515,522,574,589,613,620,636,726,768,773,856,874,886,959,968,1143,1150,1219,1229,1246,1254,1262,1327,1329,1464,1474,1550,1572,1604,1687,1702,1705,1767,1794,1797,1813,1856,1935,1939,1987,2012,2029,2146,2153,2157,2193,2305,2651,2693,2804,2817,2875,2880,2918,3019 'tempo-token-address':1938 'tempo.charge':975,1088,1237,2198 'tempo.session':2201,2470 'test':1378,1960 'testnet':142,143,428,1391,2829,2844 'text':1002,1519 'theme':954,1003,1520,1645 'three':219,1587 'throughout':118 'tick':2683,2689,2707 'tickcost':2699 'time':382,1624,1871,2119 'timeout':2740 'tini':2002 'tip':313,1982 'titl':1154 'toaccount':1308 'tofix':2676 'token':39,111,115,135,179,331,349,358,703,1612,1710,1802,1857,1885,1931,1936,1940,1984,1995,2663,2711,2990 'tool':34,171,1201,1270,1534 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-claude-skills' 'topic-clawhub' 'topic-erc-8004' 'topic-mpp' 'topic-openclaw' 'topic-skills' 'topic-solana' 'topic-x402' 'topup':2576 'track':2124 'transact':678,1053,1340,1686,1715,1726,1735,1749,1815,1820,1835,1840,1877,1890,1905,2050,2126 'transfer':1059,2014 'transferwithmemo':2040 'transpar':493 'transport':807,1199,1690,2958 'trap':1948 'trigger':1665 'true':732,947,981,1643,2181,2208,2252,2265,2468 'tryrecoverchannel':2522 'ts':1427 'two':372,1830 'tx':805,1774 'type':819,1521,1658 'typescript':414,415,461,462,598,609,692,867,965,1060,1135,1213,1428,1444,1496,1842,1878,2143,2189,2253,2301,2367,2686,2907,3009 'ui':935 'unit':2695 'unittyp':702,739 'unlik':1803 'unlock':1110 'updat':2407,2436 'upstash':2387,2432 'upstashcli':2386 'upstream':2739,2745,2749 'url':2079,2822,2833,2838,2840 'usdc':1721,1853,1886,2006,2652,2694 'usdc.e':138 'use':20,44,121,146,668,818,903,1083,1095,1206,1288,1334,2238,2250,2317,2349,2418,2742,2830 'util':1536,2291 'valid':2574,2589 'valkey':2381 'valu':2025,2215,2225 'var':2061,2133,2842 'vercel':2078,2085,2389 'verif':1098 'verifi':282 'via':328,813,998,1307,1423,1723,1867,2362,2439,2463,2675 'viem':457,1305,1357 'viem/accounts':466 'viem/tempo':1882 'visa':359 'visit':941 'voucher':672,800,2526,2534,2553,2578,2584,2947 'vs':2154,2548 'wait':2476 'waitforupd':2458 'wakeup':2481 'wallet':327,964,1287,1292,1366,1957,1980,2013,2876,2881,2916,3031 'way':1831 'web':2105 'web-69d986c8d8-6dtdx':2104 'web.surf.cascade.fyi':2148 'websit':2080,3003 'websocket':806,811,816,849,1698,2957 'window':2885 'without':1037,1406,1661,1747,1888 'won':2286 'word':720,740,743,752,754,758 'work':2094 'worker':1005 'world':745 'write':2417 'ws.serve':814 'www':234,269,560,563,2223,2256,2261,2269 'www-authent':233,268,559,2222,2255,2260,2268 'x402':3033 'yet':2737 'yield':757 'zero':687,1029,1063,1653,2648,2679 'zero-charg':2647 'zero-dollar':1028,1062,1652","prices":[{"id":"6219987a-bf67-4ef8-b19b-9829244caa00","listingId":"59da7aa0-21f9-4ba6-84ff-bdf713c8b126","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"tenequm","category":"skills","install_from":"skills.sh"},"createdAt":"2026-04-18T23:05:18.775Z"}],"sources":[{"listingId":"59da7aa0-21f9-4ba6-84ff-bdf713c8b126","source":"github","sourceId":"tenequm/skills/mpp","sourceUrl":"https://github.com/tenequm/skills/tree/main/skills/mpp","isPrimary":false,"firstSeenAt":"2026-04-18T23:05:18.775Z","lastSeenAt":"2026-05-18T19:04:38.819Z"}],"details":{"listingId":"59da7aa0-21f9-4ba6-84ff-bdf713c8b126","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"tenequm","slug":"mpp","github":{"repo":"tenequm/skills","stars":28,"topics":["agent-skills","ai-agents","claude-code","claude-skills","clawhub","erc-8004","mpp","openclaw","skills","solana","x402"],"license":"mit","html_url":"https://github.com/tenequm/skills","pushed_at":"2026-05-14T18:04:24Z","description":"Agent skills for building, shipping, and growing software products","skill_md_sha":"1530c48f460a965132bcdede399fb089e8e3013a","skill_md_path":"skills/mpp/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/tenequm/skills/tree/main/skills/mpp"},"layout":"multi","source":"github","category":"skills","frontmatter":{"name":"mpp","description":"Build with MPP (Machine Payments Protocol) - the open protocol for machine-to-machine payments over HTTP 402. Use when developing paid APIs, payment-gated content, AI agent payment flows, MCP tool payments, pay-per-token streaming, or any service using HTTP 402 Payment Required. Covers the mppx TypeScript SDK with Hono/Express/Next.js/Elysia middleware, pympp Python SDK, and mpp Rust SDK. Supports Tempo stablecoins, Stripe cards, Lightning Bitcoin, and custom payment methods. Includes charge (one-time) and session (streaming pay-as-you-go) intents. Make sure to use this skill whenever the user mentions mpp, mppx, machine payments, HTTP 402 payments, Tempo payments, payment channels, pay-per-token, paid API endpoints, or payment-gated services."},"skills_sh_url":"https://skills.sh/tenequm/skills/mpp"},"updatedAt":"2026-05-18T19:04:38.819Z"}}