mppx
SkillSecurityLets your agent add payment handling to apps, managing paywall responses with services like Stripe and Tempo.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the mppx skill
About this capability
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.
What this skill tells your AI
The instructions your AI receives, as published by internet-court/internet-court-skill in vendored/tempo/mppx/SKILL.md and read by ahel’s review.
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
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')
Server
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: '...' }))
}
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:
npx mppx account create # create wallet
npx mppx mpp.dev/api/ping/paid # make paid request
npx mppx example.com -v # verbose output
References
Signals
- GitHub stars
- 6k
- Forks
- 104
- Last commit
- Aug 2026
Advanced
- Catalog kind
- skill
- Gateway key
mppx- Source
- github.com/internet-court/internet-court-skill