internet-court/mppx
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.
npx skills add https://github.com/internet-court/internet-court-skill --skill mppx
TypeScript SDK for the "Payment" HTTP Authentication Scheme. Full 402 flow: challenge → credential → receipt.
402 payment handling to a client with Fetch.polyfill or Fetch.from.tempo.charge.tempo.session.stripe.charge.MPP_SECRET_KEY.4217 unless a page explicitly covers Moderato testnet.MPP_SECRET_KEY server-side and out of logs.402 Challenges as authoritative for current payment terms.id and opaque unchanged when responding to a Challenge.USDC.e for Tempo bridged USDC examples, not generic USDC.import { Mppx, tempo } from 'mppx/client'
// Polyfills globalThis.fetch to handle 402 automatically
Mppx.create({
methods: [tempo({ account })],
})
const res = await fetch('https://api.example.com/resource')
Without polyfilling:
const mppx = Mppx.create({
methods: [tempo({ account })],
polyfill: false,
})
const res = await mppx.fetch('https://api.example.com/resource')
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.challenge
return result.withReceipt(Response.json({ data: '...' }))
}
| 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.
| 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 |
mppx includes a CLI for making paid requests during development:
npx mppx account create # create wallet
npx mppx mpp.dev/api/ping/paid # make paid request
npx mppx example.com -v # verbose output
Take internet-court/mppx from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npx.
Without those the skill loads but fails at the first command.