Developer Documentation

34 MCP tools for ENS

Search, value, trade, and manage ENS names programmatically. Dual transport — connect via HTTP or stdio.

HTTP POST https://namewhisper.ai/mcp
stdio RUN node mcp-server.js
Quick Start
Connect to the Name Whisper MCP server in under a minute. Choose HTTP for remote agents or stdio for local development.
Remote
HTTP Transport
import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; const transport = new StreamableHTTPClientTransport({ url: "https://namewhisper.ai/mcp", }); const client = new Client({ name: "my-agent", version: "1.0.0", }); await client.connect(transport); // Call a tool const result = await client.callTool({ name: "search_ens_names", arguments: { query: "3-letter words under 0.1 ETH" }, });
Stateful sessions with 30-minute idle timeout. No API key required.
Local
stdio Transport
// Claude Desktop / Cursor config { "mcpServers": { "name-whisper": { "command": "node", "args": ["mcp-server.js"], "cwd": "/path/to/nw-terminal", "env": { "SUPABASE_URL": "...", "SUPABASE_KEY": "..." } } } }
Requires the repository cloned with npm install and environment variables configured.
All 34 tools
Each tool accepts JSON parameters and returns { content: [{ type: "text", text: "..." }] }. Click a tool to see parameters and examples.
Discovery Read-Only 4 tools
search_ens_names Natural language search across 3.6M names
Automatic intent detection routes to filtered DB search, semantic vector search, creative AI generation, or bulk availability check.
ParamTypeDescription
querystringrequiredNatural language query
Example
{ "query": "ocean themed names under 0.5 ETH" }
get_name_details Full metadata + listings + ENSIP-25 agent bindings
Owner, expiry, tags, active listings with prices, active offers, and agent identity text records.
ParamTypeDescription
namestringrequiredENS name or label (e.g. "vitalik.eth")
Example
{ "name": "vitalik.eth" }
check_availability Bulk verify registration status
Returns status (AVAILABLE, REGISTERED, EXPIRED, INVALID), owner, expiry, and registration cost for each name.
ParamTypeDescription
namesstring[]requiredArray of ENS names or labels
Example
{ "names": ["coffee.eth", "tea.eth", "pixel.eth"] }
get_similar_names Semantic vector search for related names
256-dimensional vector embeddings across 3.6M+ names. Returns similarity scores and live marketplace data.
ParamTypeDescription
namestringrequiredENS name or label
limitnumberdefault: 20Max results (max 50)
Example
{ "name": "coffee", "limit": 10 }
Intelligence Read-Only 4 tools
get_valuation Three-track valuation with confidence rating
Track A: comparable sales with IQR outlier removal. Track B: quality-reference from word frequency + entity fame + search interest. Track C: self-history. Final = max(A, B, C).
ParamTypeDescription
namestringrequiredENS name or label to value
Example
{ "name": "bitcoin.eth" }
get_market_activity Recent sales, listings, offers, transfers
ParamTypeDescription
eventTypesstring[]default: allSALE, LISTING_CREATED, OFFER_CREATED, MINT, TRANSFER, RENEWAL, BURN
limitnumberdefault: 25Max results (max 100)
offsetnumberdefault: 0Pagination offset
Example
{ "eventTypes": ["SALE"], "limit": 10 }
get_wallet_portfolio All ENS names owned by a wallet
ParamTypeDescription
walletstringrequiredWallet address (0x...) or ENS name
limitnumberdefault: 100Max results (max 200)
offsetnumberdefault: 0Pagination offset
Example
{ "wallet": "vitalik.eth" }
find_alpha Discover underpriced listings
Scan for names listed below their comparable-sales valuation. Returns ranked opportunities with discount percentage and confidence.
ParamTypeDescription
maxPriceEthnumberno capMax listing price in ETH
minDiscountPctnumberdefault: 20Min discount vs estimated value (1-99)
minLengthnumberoptionalMin label length
maxLengthnumberoptionalMax label length
tagsstring[]optionalLETTERS_ONLY, NUMBERS_ONLY, EMOJI, PALINDROME
minConfidenceenumdefault: LOWHIGH (20+ sales), MEDIUM (10+), LOW (3+)
limitnumberdefault: 25Max results (max 100)
Example
{ "maxPriceEth": 0.5, "minDiscountPct": 30, "limit": 10 }
Commerce Transaction 4 tools
purchase_name Register available or buy listed names
Auto-detects available vs listed. Available: returns registration recipe (commit → wait 60s → register). Listed: searches all marketplaces for best price, returns Seaport order data.
ParamTypeDescription
namestringrequiredENS name to purchase
walletAddressstringrequiredBuyer wallet address
maxPriceEthnumberoptionalMax price (for listed names)
durationYearsnumberdefault: 1Registration duration
actionenumdefault: autobuy_listing, register, or auto
make_offer Submit a bid on a registered name
ParamTypeDescription
namestringrequiredENS name to bid on
amountEthnumberrequiredOffer amount in ETH
walletAddressstringrequiredYour wallet address
currencyenumdefault: WETHWETH, USDC, or DAI
expiryHoursnumberdefault: 72Offer expiry in hours
bulk_register Batch register up to 20 names in 2 txns
All names batched into a single batchCommit + batchRegister via Multicall3. Each name gets its own front-running protection secret.
ParamTypeDescription
namesstring[]requiredArray of ENS names (max 20)
walletAddressstringrequiredOwner wallet address
durationYearsnumberdefault: 1Duration (same for all)
bulk_set_records Batch set records across up to 50 names
All record updates batched into one resolver.multicall() call. Supports addresses, texts, contentHash, and ENSIP-25 agent-registration.
ParamTypeDescription
nameRecordsobject[]requiredArray of { name, records } pairs (max 50)
walletAddressstringrequiredOwner wallet address
Management Transaction 6 tools
set_ens_records Set resolver records (addresses, texts, content hash)
Multiple records batched into a single multicall transaction. Supports ENSIP-25 agent-registration via agentRegistration shorthand.
ParamTypeDescription
namestringrequiredENS name to configure
recordsobjectrequired{ addresses, texts, contentHash, agentRegistration }
walletAddressstringrequiredOwner wallet address
Example
{ "name": "myagent.eth", "records": { "texts": { "ai.agent": "true", "ai.capabilities": "trading" }, "agentRegistration": { "registryAddress": "0xABC...", "agentId": "42" } }, "walletAddress": "0x1234..." }
renew_ens_name Renew single or batch names (Multicall3)
No commit/reveal needed. Any duration (no minimum). Anyone can renew any name. Batch renewals bundled into a single Multicall3 transaction.
ParamTypeDescription
namesstring | string[]requiredName or array of names
durationnumberdefault: 365Duration in days
transfer_ens_name Transfer ownership (wrapped + unwrapped)
Auto-detects wrapped (ERC-1155) vs unwrapped (ERC-721). Resolver records are NOT affected by transfer.
ParamTypeDescription
namestringrequiredENS name to transfer
fromAddressstringrequiredCurrent owner (must sign)
toAddressstringrequiredRecipient wallet
bulk_transfer_ens_names Batch transfer up to 20 names in 1 txn
Transfer multiple ENS names in a single Multicall3 transaction. Each name can go to a different recipient. Auto-detects wrapped (ERC-1155) vs unwrapped (ERC-721) per name.
ParamTypeDescription
transfersarrayrequiredArray of { name, toAddress } pairs. Max 20.
fromAddressstringrequiredCurrent owner of all names (must sign)
set_primary_name Set reverse resolution (primary name)
Controls what name displays when someone looks up your address. Name's ETH record must point to the wallet. One primary per address.
ParamTypeDescription
namestringrequiredENS name to set as primary
walletAddressstringrequiredWallet address (must sign)
set_resolver Change resolver contract
Pass "public" to use the ENS Public Resolver. Records on the old resolver won't be visible after switching.
ParamTypeDescription
namestringrequiredENS name
resolverstringrequiredResolver address or "public"
manage_ens_name Status check with recommendations
Returns registration status, expiry, wrapper state, owner, renewal pricing, and recommended actions. Use before any management operation.
ParamTypeDescription
namestringrequiredENS name to check
includeRenewalPricingbooleandefault: trueInclude on-chain pricing
NameWrapper Transaction 5 tools
wrap_name Wrap name into NameWrapper (ERC-1155)
ERC-721 → ERC-1155. Enables fuse permissions and protected subnames. Returns two-step recipe: approve + wrap.
ParamTypeDescription
namestringrequiredENS name to wrap
ownerstringrequiredCurrent owner address
fusesstring[]optionalFuses to burn on wrap (irreversible)
unwrap_name Unwrap back to BaseRegistrar (ERC-721)
Clears all fuses. Fails if CANNOT_UNWRAP has been burned.
ParamTypeDescription
namestringrequiredENS name to unwrap
ownerstringrequiredCurrent wrapped owner
manage_fuses Read/burn fuses on wrapped names
Three modes: read (check current), burn_owner_fuses, burn_child_fuses. All burning is irreversible. Fuses expire when the name expires.
ParamTypeDescription
namestringrequiredENS name
actionenumdefault: readread, burn_owner_fuses, burn_child_fuses
fusesstring[]conditionalRequired for burn actions
expirynumberoptionalUnix timestamp (burn_child_fuses only)
mint_subnames Bulk create subnames for agent fleets
Each subname gets its own owner and records. Free to create — only gas costs. Designed for agent001.company.eth style fleet deployment.
ParamTypeDescription
parentNamestringrequiredParent ENS name
subnamesobject[]requiredArray of { label, owner?, records? }
walletAddressstringrequiredParent name owner
extend_subname_expiry Extend subname expiry
Cannot exceed parent expiry. Parent owner can always extend; subname owner can only if CAN_EXTEND_EXPIRY fuse is burned.
ParamTypeDescription
namestringrequiredFull subname (e.g. "sub.coffee.eth")
yearsnumberdefault: 1Years to extend (1-10)
Access & Recovery Transaction 2 tools
approve_operator Approve/revoke operator for ENS contracts
setApprovalForAll — covers ALL tokens on the specified contract. Use before wrapping, marketplace trading, or batch operations.
ParamTypeDescription
ownerstringrequiredAddress granting approval
operatorstringrequiredAddress being approved
contractenumrequiredbase_registrar, name_wrapper, or ens_registry
approvedbooleandefault: truetrue to approve, false to revoke
reclaim_name Reclaim ENS Registry ownership
Syncs the ENS Registry owner to match the BaseRegistrar token owner. Used when ownership is out of sync after direct token transfers.
ParamTypeDescription
namestringrequiredENS name to reclaim
ownerstringrequiredAddress (must own BaseRegistrar token)
Agent Identity Read + Write 5 tools
get_caller_identity Resolve authenticated agent identity via ERC-8128
Returns the identity of an ERC-8128 authenticated agent: wallet address, primary ENS name, text records, ENSIP-25 status, and portfolio summary. Call this first to confirm your identity is recognised.
ParamTypeDescription
No parameters — identity is derived from the ERC-8128 signed request
provision_agent_identity One-call agent identity setup with ENSIP-25
Describe your agent's purpose and budget → get name recommendations with registration recipes, suggested ENS records, and ENSIP-25 agent-registration binding.
ParamTypeDescription
purposestringrequiredWhat the agent does
walletAddressstringrequiredAgent wallet address
budgetEthnumberdefault: 0.1Max budget in ETH
preferencesobjectoptional{ maxLength, style, mustInclude }
agentRegistryobjectoptionalENSIP-25: { registryAddress, agentId, chainId? }
Example
{ "purpose": "DeFi trading bot", "walletAddress": "0x1234...", "budgetEth": 5.0, "preferences": { "style": "technical" } }
get_agent_reputation Check agent credentials via ENSIP-25 + ERC-8004
ENSIP-25 verification is live: reads agent-registration text records. ERC-8004 reputation data is live on mainnet via the IdentityRegistry contract. Browse the agent registry →
ParamTypeDescription
nameOrWalletstringrequiredENS name or wallet address
search_agent_directory Search registered AI agents via ERC-8004 registry
Queries the ERC-8004 IdentityRegistry on mainnet via 8004scan. Search by keyword, filter by capabilities or minimum reputation score. Returns on-chain agent profiles with ENS names and metadata.
ParamTypeDescription
querystringoptionalSearch query
capabilitiesstring[]optionalFilter by capabilities
minReputationnumberoptionalMinimum score (0-100)
limitnumberdefault: 25Max results
search_knowledge Search ENS governance + protocol knowledge base
Governance proposals, protocol docs, developer insights, blog posts, forum discussions, and Farcaster casts from key ENS figures.
ParamTypeDescription
querystringrequiredWhat you want to know about ENS
sourceenumdefault: allens-forum, vitalik-blog, ens-blog, ens-docs, farcaster
limitnumberdefault: 6Number of results
Internal Session 1 tool
get_usage_stats Session tool call counts, success rates, latency
No parameters. Returns per-tool call counts, success rates, and average latency for the current MCP session.
60+ HTTP endpoints
In addition to MCP tools, Name Whisper exposes a full REST API at https://namewhisper.ai/api/. All responses are JSON. Authenticated routes require a Bearer token from /api/auth/connect.
Authentication Public 3 endpoints
POST /api/auth/connect Wallet connection (returns JWT)
Simple address-based authentication. Send a wallet address, receive a JWT token for authenticated routes. No signature required.
Request
{ "address": "0x1234..." }
Response
{ "token": "eyJ...", "user": { "address": "0x1234..." } }
Use the token in subsequent requests:
Authorization: Bearer <token>
GET /api/auth/nonce Generate SIWE nonce
Generate a nonce for Sign-In with Ethereum (EIP-4361) authentication flow.
POST /api/auth/signin SIWE signature verification
Verify a SIWE message + signature. Returns JWT token on success.
ParamTypeDescription
messagestringrequiredSIWE message string
signaturestringrequiredWallet signature of the message
Name Profiles Public 5 endpoints
GET /api/name-profile/:label Comprehensive name profile
Registration info, transfer history, sales history, ownership, social scores, avatar, website, ENS records, holder intelligence (ETH balance, wallet age, ENS count). Aggregates data from ENS Subgraph, Etherscan, Web3.bio, and Alchemy.
GET /api/name-profile/:label/market Live marketplace data for a name
Current listings and offers across all marketplaces, aggregated and filtered by current owner.
GET /api/name/:label/records On-chain resolver records
Address records, text records (avatar, description, socials, AI metadata), and contenthash read directly from the on-chain resolver.
POST /api/name/:label/build-record-tx Build record update transaction
Returns encoded transaction calldata to update resolver records. Sign and broadcast with your wallet.
GET /api/wallet/:address/names All names owned by an address
Deduplicated list of ENS names owned or registered by a wallet address.
Market Intelligence Public 4 endpoints
GET /api/market-stats Global market overview
Sales counts, volume (24h & 7d), floor prices by category (3L, 4L, 5L, 999, 100K), top sale, trending categories, 24h floor deltas. Cached 5 minutes.
GET /api/protocol-analytics Protocol-wide analytics
Total registrations, renewal counts, historical trends. Auto-refreshes every 24h, persisted to disk.
GET /api/recent-sales Recent name sales
Filterable by category, price, and event type.
Query ParamTypeDescription
daysnumberdefault: 7Lookback period (max 90)
minPricenumberoptionalMinimum sale price in ETH
categorystringoptionalFilter by category
GET /api/recent-sales/:label Sales history for a specific name
Last 20 sales for a specific ENS name.
Categories & Collections Public 4 endpoints
GET /api/categories All categories with 7-day stats
Sales, volume, avg price, floor, ceiling per category. Includes Grails club mappings. Cached 5 minutes.
GET /api/categories/:slug Category detail with trends
Member list, Grails data, 7d/30d trends, badges.
GET /api/categories/:slug/ai-report AI-generated category analysis
AI analysis of category trends, market health, and opportunities.
GET /api/collections All collections
Complete list of ENS name collections with metadata.
Expiry Calendar Public 2 endpoints
GET /api/expiry-calendar Upcoming name expirations
Query ParamTypeDescription
daysnumberdefault: 30Days ahead (max 90)
minLengthnumberoptionalMinimum label length
maxLengthnumberoptionalMaximum label length
charTypestringoptionalCharacter type filter
dictionarybooleanoptionalDictionary words only
statusstringoptionalactive, grace, premium
sortstringoptionalexpiry, value, length
limitnumberdefault: 50Max results (max 500)
GET /api/expiry-summary Expiry rollup by date range
High-level summary of upcoming expirations grouped by date range.
Whale Analytics Public 4 endpoints
GET /api/whales/addresses Top whale addresses
Query ParamTypeDescription
daysnumberdefault: 7Lookback period (max 90)
GET /api/whales Whale leaderboard
Ranking, purchase count, total spent, average price. Includes ENS name resolution.
GET /api/whale/:address Individual whale detail
Purchase history, portfolio size, ENS names owned, total spent.
GET /api/sellers Top sellers in a period
Query ParamTypeDescription
daysnumberdefault: 7Lookback period (max 90)
limitnumberdefault: 20Max results (max 50)
Category Statistics Public 2 endpoints
GET /api/category-stats Sales stats by name length
Sale count, volume, avg/median/floor/ceiling prices for 3L, 4L, 5L, etc. Cached 5 minutes.
GET /api/category-trends Time-series category trends
Daily breakdown of sales trends per category. Cached 10 minutes.
Query ParamTypeDescription
daysnumberdefault: 7Lookback period (max 90)
lengthnumberoptionalFilter to specific label length
Trading Auth Required 17 endpoints
GET /api/trade/listings/:label Current listings for a name
Aggregated marketplace listings. Public, no auth required.
GET /api/trade/offers/:label Current offers on a name
All active offers. Public, no auth required.
GET /api/trade/market-data/:label Combined listings + offers
One-call aggregation of all marketplace data for a name.
GET /api/trade/availability/:label Registration availability + pricing
Check if a name is available for registration and get pricing tiers.
GET /api/trade/name-status/:label On-chain name status
Available, registered, premium auction, grace period, etc.
GET /api/trade/expiry/:label Expiry date + premium price
Days remaining, expiry timestamp, premium price if applicable.
GET /api/trade/rent-price/:label NameWrapper rental pricing
ENS rental pricing tiers for wrapped domains.
POST /api/trade/register-recipe Build registration transaction
Returns complete registration recipe with contract, ABI, steps, and gas estimate. Requires auth.
POST /api/trade/renew-recipe Build renewal transaction
Returns transaction data to extend name registration. Requires auth.
POST /api/trade/batch-renew-recipe Batch renewal via Multicall3
Bundle multiple renewals into a single transaction. Requires auth.
POST /api/trade/transfer-recipe Build transfer transaction
Returns transaction data to transfer name ownership. Auto-detects wrapped vs unwrapped. Requires auth.
POST /api/trade/set-primary-name Set primary ENS name
Set reverse resolution for a wallet address. Requires auth.
POST /api/trade/set-records Update resolver records
Build a multicall transaction to set address records, text records, and contenthash. Requires auth.
POST /api/trade/fulfillment Execute purchase/offer
Fulfill a Seaport order (buy listing or accept offer). Requires auth.
POST /api/trade/create-offer Create a marketplace offer
Submit a bid on any registered name. Requires auth.
POST /api/trade/create-listing List a name for sale
Create a Seaport listing for a name you own. Requires auth.
DELETE /api/trade/order/:orderId Cancel an order
Cancel an active listing or offer. Requires auth.
User Management Auth Required 14 endpoints
GET /api/user/me Current user profile
Address, ENS name, email, settings.
Watchlist GET, POST, PATCH, DELETE /api/user/watchlist
CRUD operations for the user's watchlist. POST to add, GET to list, PATCH /:label to update notes/tags, DELETE /:label to remove.
Search History GET, DELETE /api/user/history
GET to retrieve search history, DELETE to clear it.
Portfolio 5 endpoints under /api/user/portfolio-*
GET /api/user/portfolio-history — Historical portfolio snapshots
POST /api/user/portfolio-snapshot — Create point-in-time snapshot
GET /api/user/portfolio-stats — Aggregate stats (total value, count, unrealized PnL)
GET /api/user/portfolio-pnl — Detailed P&L per name
GET /api/user/portfolio-realized — Realized gains/losses on sold names
Email PUT, DELETE /api/user/email
PUT to set email for alerts, DELETE to remove.
Terminal / Chat Auth Required 5 endpoints
POST /api/terminal/chat AI chat (SSE stream)
Multi-turn conversation with the Claude-powered ENS agent. Returns Server-Sent Events stream. Backed by RAG over the ENS knowledge base.
Sessions CRUD at /api/terminal/sessions
GET /api/terminal/sessions — List user's chat sessions
GET /api/terminal/sessions/:id — Fetch session messages
POST /api/terminal/sessions — Create new session
DELETE /api/terminal/sessions/:id — Delete session
Knowledge Public 1 endpoint
GET /api/knowledge-search Search ENS knowledge base
Governance proposals, protocol docs, developer insights, blog posts, forum discussions, and Farcaster casts from key ENS figures.
Query ParamTypeDescription
qstringrequiredSearch query
sourcestringoptionalens-forum, vitalik-blog, ens-blog, ens-docs, farcaster
limitnumberdefault: 6Number of results
Media Public 1 endpoint
POST /api/upload-avatar Upload avatar to IPFS
Multipart upload. Accepts PNG, JPG, GIF, WebP, SVG (max 5 MB). Returns IPFS URI, gateway URL, and CID. Use the IPFS URI as the ENS avatar text record value.
Common Workflows
Provision an agent identity
  • Call provision_agent_identity with purpose, budget, and wallet
  • Pick a name from the recommendations
  • Execute the registration recipe with your wallet (commit → wait 60s → register)
  • Call set_ens_records with the suggested records (ai.agent, ai.capabilities, etc.)
  • Call set_primary_name to set reverse resolution
Find and buy underpriced names
  • Call find_alpha with your price ceiling and minimum discount
  • For each opportunity, call get_valuation for deep analysis
  • Call purchase_name to get the Seaport fulfillment data
  • Sign and broadcast the transaction with your wallet
Deploy an agent fleet
  • Register the parent name: purchase_name with action "register"
  • Wrap it: wrap_name to enable subname features
  • Mint fleet subnames: mint_subnames (e.g. agent001.fleet.eth, agent002.fleet.eth)
  • Configure all at once: bulk_set_records with agent metadata per subname
Protocol Support
Name Whisper implements emerging standards for AI agent identity on Ethereum.
ENSIP-25
Agent-to-ENS binding protocol. Cryptographically links an ENS name to an on-chain agent registry entry via standardized text records. Supported in set_ens_records, bulk_set_records, provision_agent_identity, and get_agent_reputation.
Live
ERC-8004
Agent identity registry standard. On-chain agent registration, reputation scoring, and capability validation. Live on Ethereum mainnet since Jan 2026. View the live registry feed →
Live
Machine Payment Protocols
Name Whisper supports two machine-to-machine payment protocols for agent transactions. All tools are currently free — fee switches exist to activate either protocol later.
x402
HTTP-native payment protocol via Coinbase. USDC on Base (chain ID 8453). Payment challenges and receipts flow through HTTP 402 responses and headers. x402.org
Dormant
MPP
MCP-native payment protocol via Stripe/Tempo. pathUSD on Tempo network. Payment challenges, credentials, and receipts flow through JSON-RPC _meta fields in the MCP SDK transport. mpp.dev
Dormant
Tool Classification
27 tools are permanently free (search, valuation, portfolio, market data, knowledge). 4 transaction tools (purchase_name, make_offer, set_ens_records, mint_subnames) are wrapped with payment gating. When fees activate, these tools return a 402 challenge that the agent resolves via the active protocol.
Payment Discovery
Agents can query the payment discovery endpoint to check which protocols are available, which tools are free vs paid, and current pricing.
GET /mcp/payments Payment protocol discovery
Returns supported payment protocols, active protocol, and per-tool classification with current pricing.
Response
{ "activeProtocol": null, "protocols": { "x402": { "supported": true, "enabled": false, "currency": "USDC", "network": "base", "chainId": 8453 }, "mpp": { "supported": true, "enabled": false, "currency": "pathUSD", "network": "tempo", "transport": "mcp-sdk" } }, "tools": [ { "name": "search_ens_names", "classification": "FREE", "requiresPayment": false }, { "name": "purchase_name", "classification": "TRANSACTION", "requiresPayment": false, "currentPrice": "0" }, // ... all 34 tools listed ] }
Payment Flow
When fee switches are activated, transaction tools use this flow:
x402 (HTTP transport)
  1. Agent calls a TRANSACTION tool via HTTP
  2. Server responds with HTTP 402 + payment challenge (USDC amount, pay-to address)
  3. Agent pays on Base, receives receipt
  4. Agent retries the tool call with payment receipt in headers
  5. Server verifies receipt and executes the tool
MPP (MCP SDK transport)
  1. Agent calls a TRANSACTION tool via MCP SDK
  2. Server returns an MCP error -32042 with payment challenge in _meta
  3. Agent pays on Tempo (pathUSD), receives credential
  4. Agent retries with payment credential in the _meta field
  5. Server verifies credential and executes the tool