pons-mcp
Integrates with the Pons launchpad on Robinhood Chain (chainId 4663), exposing read and opt-in write tools for token launches, bonding-curve buys/sells, graduations, Uniswap V4 pool quotes and swaps, creator fee management, buyback vaults, fee escrow claims, factory admin operations, and launch/token/event analysis.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@pons-mcp show me the Pons protocol overview and current launch fee"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
pons-mcp
Model Context Protocol server for the Pons launchpad on Robinhood Chain (chainId 4663) — full 1:1 parity with the Pons v2 contracts, driven entirely from live chain state.
20 read tools — protocol parameters, launch configs, token/curve state, event scans (launches, graduations, creator history, curve trades), exact curve buy/sell quotes cross-checked against the chain, V4 pool quotes for graduated tokens (native- and ERC-20-quoted), supply/burn stats, claimable fee balances and buyback vesting, pending fee-recipient changes, V1 (legacy) launchpad reads, plus on-chain “interesting launch” scoring (
pons_scan_interesting).15 write tools (opt-in) — launch, curve buy/sell, graduation, creator fee-recipient transfer + owner timelock flow, curve controls, fee-escrow claims, buyback-vault release, factory admin surface, Uniswap V4 swaps. Every write tool dry-runs by default and only broadcasts when explicitly confirmed.
3 MCP resources + 3 prompts — live protocol/token state as readable resources (
pons://protocol/overview,pons://launches/recent,pons://token/{address}) and guided workflows (launch-a-token,analyze-token,safe-trade).
Read-only by default. With no key configured the server performs eth_call, eth_getLogs,
eth_blockNumber, eth_chainId, and eth_gasPrice only — no keys, no
transactions, no code path that can spend funds. All reads are at the latest block (Robinhood
Chain has no archive node).
No web3 framework anywhere: raw JSON-RPC over fetch, hand-rolled ABI codec and RLP, BigInt
throughout, secp256k1 via @noble/curves. See docs/ARCHITECTURE.md for
why.
Hosted server (no install)
A read-only instance runs at https://mcp.ponsmcp.ai/mcp (Streamable HTTP, stateless, no auth). It exposes the 20 read tools, 3 resources and 3 prompts; the write tools do not exist on it by construction, so nothing there can sign or send.
claude mcp add --transport http pons https://mcp.ponsmcp.ai/mcpAny client that takes a remote MCP URL (Claude Desktop connectors, Cursor, Windsurf, VS Code, ChatGPT) works the same way.
Rate limit: 60 requests per minute per IP. For write mode, run the server locally with PONS_PRIVATE_KEY, see below.
Site and docs: https://ponsmcp.ai.
To host your own: npm run build && npm run start:http (env PORT, PONS_RPC_URL, PONS_HTTP_RATE_LIMIT,
PONS_HTTP_PUBLIC_URL), or build the included Dockerfile.
Related MCP server: OpenHooks MCP
Quickstart
npm install
npm run build # tsc → dist/
npm test # 163 offline tests: ABI codec, curve math, RLP/signing, RPC policy, write gating
npm run smoke # live-chain smoke test (chainId, factory params, log re-filtering)
npm start # node dist/index.js (stdio MCP server)
npm run start:http # hosted read-only Streamable HTTP server on $PORT (dist/serve.js)Node ≥ 20. The server asserts eth_chainId == 4663 at startup and exits if the RPC points at
another chain.
The test suite (npm test) is fully offline — it covers the ABI codec, curve math (including the
clamped-fill price bound), EIP-1559/Permit2 signing with address recovery, RPC retry and
sanitization policy, log re-filtering and scan chunking, and the write-gating invariants (nothing
broadcasts without dryRun=false + confirm=true, drift gates, caps, fake-curve rejection).
The smoke test (npm run smoke) then verifies the decode contract against the live chain.
MCP client configuration
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"pons": {
"command": "node",
"args": ["/absolute/path/to/pons-mcp/dist/index.js"],
"env": {
"PONS_RPC_URL": "https://rpc.mainnet.chain.robinhood.com"
}
}
}
}Claude Code:
claude mcp add pons -- node /absolute/path/to/pons-mcp/dist/index.js
# with write mode:
claude mcp add pons --env PONS_PRIVATE_KEY=0x<32-byte-hex> -- node /absolute/path/to/pons-mcp/dist/index.jsAny stdio-capable MCP client can launch it the same way (node dist/index.js), or via the
installed bin: pons-mcp.
Tools
Read tools (always registered)
Tool | What it returns |
| Chain id, latest block, launch fee/enabled, tax caps, snipe-tax parameters, every launch config decoded, governance timelocks, all contract addresses |
| Full state of one launched token: factory record, ERC-20 metadata, 26 curve views (reserves, graduation progress, snipe tax, fees, balances). |
| What a launch with a given config/pair token would do: config, economics digest, pair-token economics |
| Exact bonding-curve quote (fee, creator tax, snipe tax, price impact, clamping) computed locally and cross-checked on-chain via |
| Whether an address may launch (whitelist + global flag) |
| Approval status and economics (phantom quote, threshold, decimals) of a pair token |
|
|
| Score recent launches for traction (unique buyers, ETH in, age); no LLM, no spend |
|
|
| All launches by one creator, with graduated status per token |
|
|
| Live decaying snipe tax for a recipient, exemption status, seconds since launch, window status (window read from the curve's frozen value) |
| Pending owner-initiated creator-fee-recipient change with effective/expires timestamps and window status |
| Total supply and burned balance/% (defaults to the PONS token) |
| V1 (legacy, Uniswap V3 generation) launchpad: token record + graduation status + metadata, and historical launch scans (absolute block ranges supported) |
| Claimable fees in the shared fee escrow (ETH + per-token) and buyback-vault vesting state for a token |
| Measured gas/cost constants (labelled, 2026-09) plus live |
| On-chain V4 quoter price for a graduated token's pool (native- and ERC-20-quoted) |
Write tools (registered only when PONS_PRIVATE_KEY is set)
Tool | What it does |
| Launch via factory (or atomic launch + dev buy via the forwarder). Enforces metadata limits, economics pinning, dev-buy and per-day caps |
| Trade a live bonding curve; exact-amount ERC-20 approvals bundled automatically when needed |
| Permissionless graduation: drain the curve, then seed the V4 pool (phase-aware) |
| Transfer the creator fee recipient — immediate on broadcast, no timelock (creator-gated) |
| Execute / cancel a pending owner-initiated fee-recipient change |
| Toggle buyback for a token (creator/owner-gated, via factory) |
| Sweep all accrued curve fees (arg is the buyback min-output floor) / rescue stuck fees (owner-gated) |
| Claim accrued fees from the shared fee escrow — native ETH or any ERC-20, full or partial amount |
| Release the vested slice of a launch's 5-year buyback lock into the escrow (creator/protocol recipient only) |
| Always errors with an explanation — post-launch exemptions are impossible by construction; set them at launch |
| Uniswap V4 swap via UniversalRouter: native buy = V4_SWAP with ETH value; any token input = Permit2 EIP-712 permit + V4_SWAP (ERC-20-quoted pools supported) |
| Factory owner surface (fees, configs, whitelist, executors, ownership). |
Write mode
Warning: use a dedicated hot wallet funded only with what you intend to spend. The key in
PONS_PRIVATE_KEYcan spend everything that wallet holds. Never reuse a wallet that stores anything else.
Setting PONS_PRIVATE_KEY (32-byte hex, 0x prefix optional) registers the 15 write tools. Only the
derived signer address is ever logged (stderr). Every write tool follows the same discipline:
Dry-run (default): every step is simulated via
eth_call— with state-diff overrides where the node enforces balances, so unfunded dry-runs still exercise contract logic — plus gas estimation, full cost preview, and the exact calldata. Nothing is broadcast.Broadcast: re-call with
dryRun=false, confirm=true. The server re-simulates, refuses if any step reverts, then signs (EIP-1559, hand-rolled RLP + secp256k1, byte-for-byte verified against viem) and broadcasts, waiting for each receipt. Multi-step flows (approve → sell, graduate → createGraduatedPool, approve → PERMIT2_PERMIT+V4_SWAP) are sent sequentially, each waiting for the prior receipt.
Additional safeguards: pons_buy/pons_sell only accept the factory-registered curve for a
token; RPC-read contract addresses used as value destinations (launchForwarder, memeHook)
are pinned and drift blocks broadcast unless acknowledged with acceptContractDrift; broadcast
tx hashes are verified against the locally computed hash of the signed payload; and dry-runs
never create signatures (the Permit2 permit in a swap sell is signed only at broadcast time).
Safety caps (fail closed — a malformed value stops startup, not the cap):
PONS_MAX_DEV_BUY_ETH(default"0.05") — hard cap on a launch's opening buy.PONS_MAX_LAUNCHES_PER_DAY(default5) — hard cap on launch broadcasts per rolling 24 h.
Details and per-tool mechanics: docs/TOOLS.md. Threat model: docs/SECURITY.md.
Environment variables
Var | Default | Purpose |
|
| RPC endpoint; comma-separated list = failover across endpoints |
| unset | Opt-in write mode. 32-byte hex (0x optional). Unset → read-only, no write tools registered. Only the derived address is logged (stderr) at startup |
|
| Hard cap on the |
|
| Hard cap on launch broadcasts per rolling 24h (in-memory) |
| see docs/TOOLS.md | Optional gate tuning for |
Errors
Every tool returns JSON. Failures are structured:
{ "error": { "code": "NOT_A_LAUNCH", "message": "…" } }Code | Meaning |
| Malformed address parameter |
| Bad input (amounts, flags), or a state precondition failed (curve graduated, threshold not met, …) |
| Address is not a Pons-launched token/curve |
|
|
| The RPC is not serving chainId 4663 |
| The contract reverted (simulation or mined transaction) |
| Transport/node failure after retries, or a permanent non-revert RPC error (message preserved) |
Design notes
~0.1 s blocks (~10 blocks/s): 500k blocks ≈ 14 h. Log scans are block-count based (10k-block chunks, newest chunk first, client-side re-filtered — node topic filters are never trusted).
Retry policy: only network failures and HTTP 429/5xx retry (3 attempts, backoff, endpoint failover). Permanent errors — reverts included — fail immediately with their real message.
All quantities are BigInt internally and formatted with unit labels (
"0.0005 ETH") only at the output boundary. Pair tokens can be 6-decimal (e.g. USDG) — per-tokendecimals()is always used.ABI selectors and event topics are computed from canonical signatures via keccak-256 (
@noble/hashes) at startup and asserted against hardcoded constants; a mismatch crashes the server rather than serving stale calldata.The contract assumptions are verified against ground truth: the factory and launchAndBuy router are Sourcify exact-matches on chain 4663, and every selector, tuple layout, event layout, and curve-math rule in this repo was cross-checked against that verified source.
Documentation
Doc | Contents |
Full reference for all tools: params, outputs, errors, examples with real chain values | |
Module map, raw-JSON-RPC decision, selector assertions, simulation design, signing pipeline | |
Threat model, key custody, gating, caps, hot-wallet guidance | |
Pons v2 as this server understands it: addresses, function↔tool map, event/tuple layouts, chain-vs-docs divergences | |
Common failures and fixes (CHAIN_MISMATCH, 429s, revert decodings, …) |
Smoke-test note: the PONS token
An obvious smoke check would use the PONS token (0x39dBED…4571) for the
getLaunchedToken assertion (exists == true, phase == 2). Live chain state
contradicts this: the v2 factory has no record of that token
(getLaunchedToken → exists=false, and zero TokenLaunched/PoolGraduated
events mention it across full chain history — it was presumably launched via an
earlier factory). Following the "chain wins" rule, the smoke test
probes the PONS address as a printed NOTE, and asserts the decode contract
against a real graduated token taken from an actual PoolGraduated log (phase 2
PoolCreated, or 3 Rescued). The PONS address remains the default for
pons_token_supply, which works (ERC-20 reads only).
Contracts: factory 0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7e, launchAndBuy router
0xe33E9E479dF8802cb0866d5d05258bEc4cF62948, Uniswap v4 PoolManager
0x8366a39cc670b4001a1121b8f6a443a643e40951. Explorer:
https://robinhoodchain.blockscout.com.
License
MIT
Available Tools
20 toolspons_can_launchA
Check whether an address is allowed to launch on Pons right now: canLaunch, whitelistedLaunchers, and the global launchEnabled flag.
Inputs: address (required).
pons_creator_launchesA
All launches by a given creator (TokenLaunched with deployer = creator), newest-first, with per-token graduated status.
Inputs: creatorAddress (required), limit, lookbackBlocks.
pons_curve_tradesA
CurveBuy + CurveSell events on one bonding curve, decoded and merged newest-first with side, trader, recipient, amounts, fee, tax.
Inputs: curveAddress (required), limit, lookbackBlocks.
pons_fee_balancesA
Claimable fee balances in the shared PonsV2FeeEscrow for an address (native ETH always; per-token when tokenAddress is given), plus buyback-vault vesting state for a token (totalLocked, vested, releasable, terms). Read-only.
Inputs: address (required), tokenAddress.
pons_get_tokenA
Full state of one Pons-launched token: getLaunchedToken struct, ERC-20 metadata, curve reserves (real vs phantom quote), graduation progress, snipe tax, fees. Errors NOT_A_LAUNCH if the token was not launched via the Pons factory.
Inputs: tokenAddress (required).
pons_launch_costsA
Measured launch/buy/sell gas costs on Pons (static, measured 2026-09, clearly labelled) plus live eth_gasPrice for comparison.
Inputs: no named parameters.
pons_pair_token_economicsB
Pair-token economics from the factory: approved status, phantom quote, graduation threshold, and decimals (e.g. ETH or USDG pairs).
Inputs: pairTokenAddress (required).
pons_pending_fee_changeA
Read the factory's pendingCreatorFeeRecipient for a token: proposed recipient, proposed/executable timestamps, and window status (timelocked / executable / expired) using the live timelock and execution-window constants.
Inputs: tokenAddress (required).
pons_preview_launchA
Preview a launch config before launching: getLaunchConfig decoded (supply, curve fee, phantom quote, graduation threshold, pool fee/tick spacing, enabled), the previewLaunchEconomics bytes32 guard, and pair-token economics. Explains every field; performs no writes.
Inputs: pairToken, launchConfigId.
pons_protocol_overviewA
Pons launchpad protocol parameters on Robinhood Chain: launch fee, launch enabled flag, max creator tax, snipe-tax start/duration, all launch configs decoded, contract addresses, explorer link.
Inputs: no named parameters.
pons_quote_buyA
Quote a bonding-curve buy: local exact curve math (fees, creator tax, live snipe tax, clamp at reserved allocation) cross-checked against an on-chain eth_call of buy(). Returns tokensOut, fee legs, price impact, and the cross-check result.
Inputs: amount (required), curveAddress (required), recipient.
pons_quote_sellA
Quote a bonding-curve sell: local exact curve math (fees on output) cross-checked against an on-chain eth_call of sell() using state-diff overrides. Returns quoteOut, fee legs, price impact, and the cross-check result.
Inputs: tokenAmount (required), curveAddress (required), seller.
pons_quote_swapA
Quote a Uniswap V4 swap for a GRADUATED token via the on-chain V4Quoter (hook fees included). Native ETH-quoted and ERC-20-quoted pools. Returns amountOut, quoter gas estimate, pool key, sqrtPrice/tick/liquidity.
Inputs: side (required), amount (required), tokenAddress (required).
pons_recent_graduationsA
Scan factory PoolGraduated events newest-first: token, positionId, swept token/pair amounts, block, tx hash.
Inputs: limit, lookbackBlocks.
pons_recent_launchesA
Scan factory TokenLaunched events newest-first. Optional deployer filter (server-side topic) and pairToken filter (client-side). Returns token, curve, deployer, pairToken, threshold, block, tx hash.
Inputs: limit, deployer, pairToken, lookbackBlocks.
pons_scan_interestingA
Score recent Pons v2 launches for traction using on-chain data only (unique buyers excluding deployer, ETH in the curve, buy/sell mix, age, serial-deployer filter). No LLM, no spend. Sorted by score descending.
Inputs: limit, lookbackBlocks.
pons_snipe_taxA
Live decaying snipe tax for a recipient on a curve (99% at launch → ~0% after 3s), exemption status, launchedAt, seconds since launch, and whether the tax window is still active.
Inputs: curveAddress (required), recipient.
pons_token_supplyB
ERC-20 totalSupply and burned amounts (balances of 0x…dEaD and 0x0…0) with burn % of supply. Defaults to the PONS token.
Inputs: tokenAddress.
pons_v1_get_tokenA
V1 (legacy, Uniswap V3 generation) Pons launch state: legacy-factory record (deployer, paired token, position, pool fee, initial buy), live graduationStatus (current/threshold/graduated), ERC-20 metadata, and getTokenInfo metadata (logo, description, socials). V1 is closed to new launches since 2026-08-12. Errors NOT_A_LAUNCH if the token is not in the legacy factory.
Inputs: tokenAddress (required).
pons_v1_launchesA
Scan the V1 legacy factory's TokenLaunched events (Uniswap V3 generation), newest-first: token, deployer, dexFactory, pairToken, pool, positionId, initialBuyAmount, block, tx. Optional deployer filter (server-side topic).
Inputs: limit, toBlock, deployer, fromBlock, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 20 tools
Tools are largely distinct and prefixed by domain, with clear separation between V1/V2, quotes, scans, and fee tools. A few pairs (recent_launches vs creator_launches, get_token vs v1_get_token) could be confused at a glance but descriptions resolve the boundaries.
All names share the pons_ prefix and snake_case style, which makes the surface predictable. The mix of noun-phrase and verb-style names plus the v1_get_token ordering is a minor inconsistency but not confusing.
20 tools is on the heavy side and sits in the 16–25 range that starts to feel bulky. The protocol's V1/V2, quoting, scanning, and fee surface justifies most of them, but a few scan/list tools could potentially be consolidated.
The set covers protocol parameters, token state, launch eligibility, launch/graduation history, creator history, curve trades, snipe tax, supply, gas costs, launch previews, buy/sell/swap quotes, fee changes, fee balances, and legacy V1 data. For a read-only protocol analysis server there are no obvious dead ends.
Maintenance
Related MCP Connectors
Dual-version MCP for pons token launches on Robinhood Chain: v1 trading, v2 curve reads (plan-only).
Official Aave MCP for V3 and V4 markets, positions, governance, and transaction preparation.
Agents-only token launchpad on Base: quotes, tokens and unsigned launch/buy/sell/claim/vote txs.
Deterministic MCP utilities, validation, evidence verification, and x402 commerce on Base.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables launching tokens on pump.fun and StonkFun with user-signed transactions, plus a disclosed two-sided quoter for market making.MIT

OpenHooks MCPofficial
AlicenseAqualityCmaintenanceEnables AI agents to discover launchpad tokens trading on Uniswap v4 bonding curves, inspect pools, quotes, balances and protocol stats, and receive unsigned swap transactions the user signs in their own wallet. It runs on Robinhood Chain for Pons tokens, holding no keys and sending nothing itself.6MIT- AlicenseBqualityCmaintenanceAgent token launchpad on Base: agents launch tokens on bonding curves, anyone trades. Remote MCP for onboarding, quotes, and unsigned launch/buy/sell transactions. Unaudited.24MIT
- AlicenseNot gradedqualityBmaintenanceEnables coordinated pump.fun buys, sells, and token launches using encrypted local Rust wallets, with previews, simulation, Jito bundle submission, status tracking, and pump.fun API/RPC access through MCP tools.MIT