<< All versions
Skill v1.0.0
currentAutomated scan100/100internet-court/internet-court-skill/mppx
──Details
PublishedOctober 24, 2026 at 12:58 PM
Content Hashsha256:566502e60fd05925...
Git SHAfa89195eeb5c
──Files
Files (1 file, 4.2 KB)
SKILL.md4.2 KBactive
SKILL.md · 129 lines · 4.2 KB
version: "1.0.0" name: mppx description: TypeScript SDK for the Payment HTTP Authentication Scheme. Handles 402 Payment Required flows with Tempo, Stripe, and other payment methods. Use when integrating payments or mppx into a client or server application.
mppx
TypeScript SDK for the "Payment" HTTP Authentication Scheme. Full 402 flow: challenge → credential → receipt.
What I can accomplish
- Add
402payment handling to a client withFetch.polyfillorFetch.from. - Protect HTTP routes with server-side MPP Challenges and Receipt responses.
- Accept one-time Tempo stablecoin payments with
tempo.charge. - Accept metered Tempo stablecoin payments with
tempo.session. - Accept one-time card payments with
stripe.charge. - Verify Credentials directly for custom transports or background workflows.
- Wrap MCP clients and servers so tool calls can require payment.
Required inputs
- Client integrations need a signing account and one or more client payment methods.
- Server integrations need a recipient, currency, amount, and
MPP_SECRET_KEY. - Tempo examples use chain ID
4217unless a page explicitly covers Moderato testnet. - Stripe examples need a configured Stripe account and Shared Payment Token flow.
- MCP integrations need the MCP client or server object to wrap.
Constraints
- Keep
MPP_SECRET_KEYserver-side and out of logs. - Never commit private keys or wallet seeds.
- Treat runtime
402Challenges as authoritative for current payment terms. - Return
idandopaqueunchanged when responding to a Challenge. - Use
USDC.efor Tempo bridged USDC examples, not generic USDC.
Client
ts
import { Mppx, tempo } from 'mppx/client'// Polyfills globalThis.fetch to handle 402 automaticallyMppx.create({methods: [tempo({ account })],})const res = await fetch('https://api.example.com/resource')
Without polyfilling:
ts
const mppx = Mppx.create({methods: [tempo({ account })],polyfill: false,})const res = await mppx.fetch('https://api.example.com/resource')
Server
ts
import { Mppx, Store, tempo } from 'mppx/server'import { privateKeyToAccount } from 'viem/accounts'const account = privateKeyToAccount('0x...')const mppx = Mppx.create({methods: [tempo.charge({ currency: '0x...', recipient: '0x...' }),tempo.session({account,chainId: 4217,currency: '0x...',store: Store.memory(),}),],secretKey: process.env.MPP_SECRET_KEY,})async function handler(request: Request): Promise<Response> {const result = await mppx.charge({ amount: '1.00' })(request)if (result.status === 402) return result.challengereturn result.withReceipt(Response.json({ data: '...' }))}
Methods
| Method | Intent | Description | |
|---|---|---|---|
tempo.charge | charge | One-time stablecoin payment (TIP-20 token transfer on Tempo) | |
tempo.session | session | Streaming payments via payment channels on Tempo | |
stripe.charge | charge | One-time payment via Stripe |
tempo() returns [tempo.charge, tempo.session] as a tuple using the current v2 Sessions implementation. Use tempo.charge() or tempo.session() individually if you only need one intent. Use tempo.sessionLegacy only for Legacy Sessions v1 compatibility.
Exports
| Path | Purpose | |
|---|---|---|
mppx | Core primitives (Challenge, Credential, Method, Receipt, PaymentRequest) | |
mppx/client | Mppx, tempo, stripe, session, Transport | |
mppx/server | Mppx, tempo, stripe, Transport, Store, NodeListener | |
mppx/hono | Hono middleware | |
mppx/express | Express middleware | |
mppx/nextjs | Next.js middleware | |
mppx/elysia | Elysia middleware |
CLI
mppx includes a CLI for making paid requests during development:
sh
npx mppx account create # create walletnpx mppx mpp.dev/api/ping/paid # make paid requestnpx mppx example.com -v # verbose output