ArcBox
Onix
A PayBox-style remote MCP server for ChatGPT: each ChatGPT user signs in with OAuth, gets a Circle developer-controlled wallet on Arc Testnet, can send USDC, and can pay x402 APIs.
What it does
ChatGPT connects to
https://<your-host>/mcpwith OAuth (not “No Auth”).The user signs in with Google or an email code.
Onix creates one Circle wallet on
ARC-TESTNETfor that user (or reuses the existing one).ChatGPT can then call:
get_wallet— address, explorer, faucetget_balance— USDC on Arc Testnetestimate_send_usdc— fee previewsend_usdc— Circle REST transfer (requiresconfirm: true)x402_probe— inspect an HTTP 402 paywallx402_pay— sign and pay an x402 API on Arc Testnetlist_transfers— recent sends from this appmint_probe— paste a collection URL; check whitelist and remaining mintsmint_nft— preview, then mint or reserve until drop time (confirm: true)cancel_mint— cancel an upcoming reservationlist_mints— this user's mint history
NFT mint sites
Onix does not scrape an unknown HTML mint button. Your collection site should expose a JSON spec (the page URL, /.well-known/onix-mint.json, or <link rel="onix-mint" href="...">):
{
"version": 1,
"name": "My collection",
"network": "eip155:5042002",
"chainId": 5042002,
"contract": "0x…",
"mintStartsAt": "2026-09-01T18:00:00.000Z",
"priceUsdc": "0",
"eligibilityUrl": "https://your-site.com/api/mint/eligibility",
"abiFunctionSignature": "mint(uint256)",
"abiParameters": ["$quantity"],
"maxPerWallet": 3
}abiParameters placeholders: $to (the user's Onix wallet), $quantity, $proof (from eligibility).
Eligibility (GET eligibilityUrl?address=0x…):
{
"address": "0x…",
"whitelisted": true,
"maxMints": 3,
"minted": 0,
"remaining": 3,
"proof": []
}Onix only mints if whitelisted is true, quantity is 1..remaining, and the user confirmed. If mintStartsAt is in the future, it reserves and mints automatically at that time.
Example spec for discovery testing: https://onixmpc.vercel.app/mint/example.json (does not mint on-chain).
Prerequisites
Node.js 22+
A Circle Console testnet API key
A registered entity secret
A public HTTPS URL so ChatGPT can reach this server (Cloudflare Tunnel or ngrok)
Setup
cd arcbox
copy .env.example .envEdit .env:
PUBLIC_URL=https://your-tunnel-host
PORT=8787
COOKIE_SECRET=a-long-random-string
CIRCLE_API_KEY=TEST_API_KEY:...
CIRCLE_ENTITY_SECRET=your-64-char-entity-secretnpm install
npm run devOpen PUBLIC_URL in a browser and create an account. Confirm a wallet address appears on /dashboard. Fund it from the Circle faucet (Arc Testnet USDC).
Connect ChatGPT
Copy
https://<your-host>/mcpOn ChatGPT web, open Settings and turn on Developer mode
Plugins → Browse plugins → + → New Plugin
Name:
OnixServer URL: the
/mcpURLAuthentication: OAuth — do not leave No Auth selected
Save, connect, and complete the Onix login
Then in chat:
What’s my Arc Testnet wallet and USDC balance?
Send 1.00 USDC to 0x…
send_usdc first returns a preview unless ChatGPT passes confirm: true.
Auth model
OAuth 2.1 authorization code + PKCE (
S256)Dynamic client registration and Client ID Metadata Documents
Refresh tokens (required by ChatGPT)
resource/ audience bound to/mcpOne Circle EOA per Onix user, inside one shared wallet set
This is developer-controlled custody: Circle holds the keys, your server signs with the entity secret. Do not treat this as a non-custodial PayBox clone.
Firebase auth
Sign-in is Google or email + 6-digit code. Firebase Auth holds the user; Firestore maps email / uid to the Circle wallet.
Create a Firebase project and enable Authentication → Google.
Create a Firestore database (production mode is fine — the Admin SDK bypasses rules).
Deploy
firestore.rules(clients have no direct access).Add
onixmpc.vercel.appandlocalhostunder Authentication → Settings → Authorized domains.Project settings → service account → generate a private key.
Project settings → Your apps → Web app: copy apiKey, authDomain, appId.
For email codes, set RESEND_API_KEY (or install the Firebase Trigger Email extension, which reads the mail collection).
Deploy on Vercel
Push this repo to GitHub.
Import the repo in Vercel.
Set these environment variables in the Vercel project:
PUBLIC_URL=https://onixmpc.vercel.app
COOKIE_SECRET=
CIRCLE_API_KEY=
CIRCLE_ENTITY_SECRET=
MCP_DANGEROUSLY_ALLOW_INSECURE_ISSUER_URL=false
FIREBASE_PROJECT_ID=
FIREBASE_CLIENT_EMAIL=
FIREBASE_PRIVATE_KEY=
FIREBASE_WEB_API_KEY=
FIREBASE_AUTH_DOMAIN=
FIREBASE_APP_ID=
RESEND_API_KEY=
EMAIL_FROM=PUBLIC_URL must be the live https:// origin (no trailing slash). After the first deploy, copy the Vercel URL into PUBLIC_URL and redeploy if needed.
ChatGPT plugin URL:
https://your-project.vercel.app/mcp
User accounts and email→wallet maps live in Firestore once Firebase is configured.
Local-only note
ChatGPT will not talk to http://localhost. Use a tunnel, or the Vercel HTTPS URL, and set PUBLIC_URL to that origin.
Safety
Testnet only
Daily send cap via
SEND_DAILY_LIMIT_USDC(default 100)Sends require an explicit
confirm: truetool argument
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/kahaki1/arcbox'
If you have feedback or need assistance with the MCP directory API, please join our Discord server