local402
๐ local402
One-command local paywall for AI agents
Turn any local server into a payable resource in seconds. Perfect for testing agents that need to pay before they can access your API or MCP tool.

npx local402 --target http://localhost:3000 --price 0.001
Website ยท npm ยท Report a bug
What is this?
local402 drops an x402-style HTTP 402 Payment Required paywall in front of any local HTTP server or MCP tool โ with a single command, zero config, and no blockchain.
Requests without payment get a clean 402. Requests that "pay" get proxied straight through to your real server. That's it.
It runs in fully simulated mode by default: no wallets, no gas, no external services, no waiting. Just instant, deterministic 402s you can build and test against locally.
agent โโโถ local402 (402 paywall) โโโถ your server
โ
โโโ no payment? โ 402 Payment Required
paid? โ proxied response โ
๐ธ Why local402?
Agents are learning to pay for things โ API calls, tool invocations, data, compute. The x402 protocol makes HTTP-native payments real. But there's a gap:
How do you test a paying agent without spending real money, standing up a wallet, or wiring a whole payment stack โ every single time?
You don't want to deploy a facilitator and fund a testnet wallet just to check that your agent notices a 402 and retries with payment. You want a paywall you can throw up in one command and tear down just as fast.
That's local402.
Without local402 | With local402 |
Stand up a facilitator + wallet + testnet funds |
|
Real transactions on every test run | Instant, free, deterministic |
Blockchain latency in your test loop | 0ms โ it's all local |
Payment logic tangled into your app | One reverse proxy in front of it |
Hard to reproduce the "unpaid" path | Guaranteed |
Use it to:
โ Test that your AI agent handles
402and retries with anx-paymentheaderโ Demo a "pay-per-call" API or MCP tool without touching a chain
โ Develop x402 client logic offline, on a plane, in CI
โ Prototype pricing before committing to real settlement
โก Quick Start
You don't even need to install it.
# 1. Have any local server running (your API, MCP tool, whatever)
# e.g. something on http://localhost:3000
# 2. Put a paywall in front of it
npx local402 --target http://localhost:3000 --price 0.001local402 is now listening on http://localhost:4020 and guarding your server.
# โ No payment โ 402 Payment Required
curl -i http://localhost:4020/
# โ
"Pay" โ request is proxied to your real server
curl -i http://localhost:4020/ -H "x-payment: simulated"Point your agent at http://localhost:4020 instead of your real server, and watch it learn to pay. ๐
๐ Usage
local402 --target <url> [options]Flag | Alias | Default | Description |
|
| (required) | The server to protect, e.g. |
|
|
| Port local402 listens on |
|
| Price advertised in the | |
|
| Currency / asset label for the price | |
|
| Simulated mode โ no blockchain, instant (default) | |
| Reserved for real x402 settlement (coming soon) | ||
| Disable colored console output |
The rule
No
x-paymentheader โ402 Payment Required(with a helpful JSON body + headers).Has
x-payment: simulated(orpaid) โ request is proxied to--target, and the real response comes back untouched.
In simulated mode, any non-empty x-payment value is accepted โ simulated and paid are just the canonical ones.
Examples
# Guard an MCP tool on a custom port, charge 0.01
local402 --target http://localhost:8787 --port 9000 --price 0.01
# Free status check โ always open, never paywalled
curl http://localhost:4020/__local402๐ How it works
local402 is a tiny reverse proxy with one opinion: pay first, then pass through.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ local402 โ
โ :4020 (paywall) โ
โโโโโโโโโโโ โ โ โโโโโโโโโโโโโโโโ
โ agent โ โโโโโโโโถ โ x-payment header present? โ โ your server โ
โ / curl โ โ โ โ :3000 โ
โโโโโโโโโโโ โ NO โโถ 402 Payment Required โ โโโโโโโโโโโโโโโโ
โฒ โ โ โฒ
โ โ YES โโถ proxy the request โโโผโโโโโโโโโโโโโโโโโโ
โ โ return real response โ โ
โโโโโโโโโโโโโโโโโคโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโ
402 or proxied response โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโThe unpaid response (HTTP 402):
{
"x402Version": 1,
"error": "Payment Required",
"message": "This resource costs 0.001 USD. Retry with header 'x-payment: simulated'.",
"accepts": [
{
"scheme": "simulated",
"network": "local",
"maxAmountRequired": "0.001",
"asset": "USD",
"payTo": "local402-simulated",
"resource": "/",
"description": "local402 simulated paywall",
"mimeType": "application/json"
}
],
"hint": "x-payment: simulated"
}Response headers on a 402:
HTTP/1.1 402 Payment Required
x-payment-required: true
x-payment-amount: 0.001
x-payment-asset: USD
x-payment-network: local
accept-payment: x-payment: simulatedOn a paid request, local402 attaches a simulated settlement receipt so your client can verify the flow end-to-end:
x-payment-response: <base64 JSON receipt with a sim txHash>๐บ Roadmap
local402 starts simple on purpose. The plan:
v0.1 โ Simulated mode. Instant, local, blockchain-free
402paywall. (you are here)v0.2 โ Real x402 settlement. Verify actual
X-PAYMENTpayloads via a pluggable facilitator.v0.3 โ MCP-native mode. First-class paywalling for MCP tools/resources, not just HTTP.
v0.4 โ Per-route pricing. Different prices for different paths and methods.
v0.5 โ Usage dashboard. Live TUI of requests, payments, and revenue.
Want to shape it? Open an issue.
๐ค Contributing
Contributions, ideas, and bug reports are all welcome โ this is meant to be a friendly little tool.
git clone https://github.com/wushu75/local402.git
cd local402
npm install
npm run dev -- --target http://localhost:3000 # run from source
npm run build # compile to dist/Fork it ๐ด
Create a branch (
git checkout -b feat/amazing-thing)Commit your changes (
git commit -m 'feat: amazing thing')Push and open a PR
No contribution is too small โ even a typo fix helps.
๐ License
MIT ยฉ the local402 contributors. Do whatever you want with it.
โญ Star the repo if this is useful
If local402 saved you from standing up a payment stack just to test an agent,
drop a star โ it genuinely helps other people find it.
Built for the agents that pay their way. ๐
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/wushu75/local402'
If you have feedback or need assistance with the MCP directory API, please join our Discord server