Agent infra: email, phone, social, domains, VPS, wallets. Paid per-action via x402, no API key.
ai.palmyr/palmyr (MCP) Server
The ai.palmyr/palmyr MCP server provides agent infrastructure for communications and account/compute tooling. Its description includes handling email, phone, social, domains, VPS, and wallets. The service is paid per action via x402 and does not require an API key. Tooling includes 20 available tools.
๐ ๏ธ Key Features
Email and phone support
Social and X accounts integration
Domains and VPS/compute provisioning
Wallets as identity (wallet-based usage)
Paid per action using x402 (USDC)
๐ Use Cases
Building AI agents that need contact channels (email/phone)
Managing social presence and X accounts
Setting up domains and VPS resources for agent workflows
Using wallet-linked identity for agent operations
โก Developer Benefits
One CLI for required agent components (per readme excerpt)
No API key requirement mentioned in server description
State an intent, get a priced execution plan. The i402 orchestrator turns a natural-language outcome into an ordered list of x402 calls your agent signs and runs. Costs 0.10 USDC per plan, paid per-action via x402.
Parameters8
intent
string
required
Natural-language outcome, e.g. 'register a .com and set up email on it'
budget_usdc
number
required
Max total USDC to spend across the whole plan
params
object
optional
Optional structured parameters for the intent
deadline_seconds
number
optional
quality
string
optional
Optional quality hint, e.g. 'fast' | 'best'
constraints
object
optional
allow_budget_exceeded
boolean
optional
Return an executable plan even if it exceeds budget_usdc
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Raw schema
{
"type": "object",
"properties": {
"intent": {
"type": "string",
"description": "Natural-language outcome, e.g. 'register a .com and set up email on it'"
},
"budget_usdc": {
"type": "number",
"description": "Max total USDC to spend across the whole plan"
},
"params": {
"type": "object",
"additionalProperties": {},
"description": "Optional structured parameters for the intent"
},
"deadline_seconds": {
"type": "number"
},
"quality": {
"type": "string",
"description": "Optional quality hint, e.g. 'fast' | 'best'"
},
"constraints": {
"type": "object",
"additionalProperties": {}
},
"allow_budget_exceeded": {
"type": "boolean",
"description": "Return an executable plan even if it exceeds budget_usdc"
},
"payment": {
"type": "string",
"description": "base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions"
}
},
"required": [
"intent",
"budget_usdc"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
card_buy
Buy a USA prepaid Visa card loaded with EXACTLY the requested balance ($5โ$1000). Dynamic x402 price = amount + fee (3% min 0.50 USDC) โ the 402 instructions carry the exact total. Returns 202 with an operation_id: poll card_status until ready (~10s), then fetch the number with card_get. US merchants only; non-reloadable (spend across transactions until depleted); max 6 cards per agent per rolling 24h (issuer limit).
Parameters2
amount
number
required
USD balance to load on the card (min $5, max $1000, whole cents)
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Raw schema
{
"type": "object",
"properties": {
"amount": {
"type": "number",
"description": "USD balance to load on the card (min $5, max $1000, whole cents)"
},
"payment": {
"type": "string",
"description": "base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions"
}
},
"required": [
"amount"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
card_status
Poll a card purchase started by card_buy (free). done=true when status is 'ready' (fetch details with card_get) or 'failed' (payment auto-refunded โ see refund_status).
Retrieve a prepaid card you own: full card number, CVV, expiry, live balance. Owner-verified (0.01 USDC ownership proof; the paying wallet must be the card's buyer).
Parameters2
card_id
string
required
card_id returned by card_buy
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Raw schema
{
"type": "object",
"properties": {
"card_id": {
"type": "string",
"description": "card_id returned by card_buy"
},
"payment": {
"type": "string",
"description": "base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions"
}
},
"required": [
"card_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
card_list
List cards owned by the paying wallet: status, last4, balance (never full numbers โ those are per-card via card_get). 0.01 USDC ownership proof.
Parameters1
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Raw schema
{
"type": "object",
"properties": {
"payment": {
"type": "string",
"description": "base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
email_create_inbox
Provision an email inbox at {name}@palmyr.ai (or a custom domain you own), keyed to your wallet. Costs 2.00 USDC, paid per-action via x402.
Parameters5
name
string
required
Local part of the address; inbox becomes {name}@palmyr.ai
walletAddress
string
optional
Solana pubkey to enable E2E encryption (defaults to the payer)
solanaPublicKey
string
optional
domain
string
optional
A Namecheap-registered domain you own; auto-sets MX/SPF/DKIM
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Raw schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Local part of the address; inbox becomes {name}@palmyr.ai"
},
"walletAddress": {
"type": "string",
"description": "Solana pubkey to enable E2E encryption (defaults to the payer)"
},
"solanaPublicKey": {
"type": "string"
},
"domain": {
"type": "string",
"description": "A Namecheap-registered domain you own; auto-sets MX/SPF/DKIM"
},
"payment": {
"type": "string",
"description": "base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions"
}
},
"required": [
"name"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
email_create_temp
Provision a cheap, disposable, receive-only email inbox at tmp-XXXX@palmyr.ai โ ideal for receiving a one-off verification or order-confirmation email during a checkout/signup flow. Auto-expires (default 24h). Reads return plaintext to the owning wallet (no E2E key to manage). Costs 0.50 USDC, paid per-action via x402.
Parameters2
ttl_seconds
number
optional
Lifetime in seconds before the inbox auto-expires (default 86400 = 24h, min 300, max 604800)
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Raw schema
{
"type": "object",
"properties": {
"ttl_seconds": {
"type": "number",
"description": "Lifetime in seconds before the inbox auto-expires (default 86400 = 24h, min 300, max 604800)"
},
"payment": {
"type": "string",
"description": "base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
email_send
Send an email from an inbox you own. Costs 0.08 USDC, paid per-action via x402.
Parameters6
inbox_id
string
required
Inbox id returned by email_create_inbox
to
string
required
Recipient email address
subject
string
required
body
string
required
html
string
optional
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Read decrypted messages from an inbox you own (payment wallet must match the inbox). Costs 0.02 USDC, paid per-action via x402.
Parameters4
inbox_id
string
required
Inbox id returned by email_create_inbox
limit
number
optional
Page size (default 50, max 200)
cursor
string
optional
id of the last message from the previous page
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Raw schema
{
"type": "object",
"properties": {
"inbox_id": {
"type": "string",
"description": "Inbox id returned by email_create_inbox"
},
"limit": {
"type": "number",
"description": "Page size (default 50, max 200)"
},
"cursor": {
"type": "string",
"description": "id of the last message from the previous page"
},
"payment": {
"type": "string",
"description": "base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions"
}
},
"required": [
"inbox_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
phone_buy_number
Provision a real phone number (SMS + voice) for your agent. Costs 3.00 USDC, paid per-action via x402.
Parameters3
country
string
required
ISO-2 country code, e.g. 'US'
areaCode
string
optional
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Raw schema
{
"type": "object",
"properties": {
"country": {
"type": "string",
"description": "ISO-2 country code, e.g. 'US'"
},
"areaCode": {
"type": "string"
},
"payment": {
"type": "string",
"description": "base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions"
}
},
"required": [
"country"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
phone_send_sms
Send an SMS from a phone number you own. Costs 0.05 USDC, paid per-action via x402.
Parameters4
number_id
string
required
Phone number id returned by phone_buy_number
to
string
required
Recipient number in E.164, e.g. '+15551234567'
body
string
required
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Raw schema
{
"type": "object",
"properties": {
"number_id": {
"type": "string",
"description": "Phone number id returned by phone_buy_number"
},
"to": {
"type": "string",
"description": "Recipient number in E.164, e.g. '+15551234567'"
},
"body": {
"type": "string"
},
"payment": {
"type": "string",
"description": "base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions"
}
},
"required": [
"number_id",
"to",
"body"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
phone_read_messages
Read SMS messages received on a phone number you own. Costs 0.02 USDC, paid per-action via x402.
Parameters2
number_id
string
required
Phone number id returned by phone_buy_number
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Raw schema
{
"type": "object",
"properties": {
"number_id": {
"type": "string",
"description": "Phone number id returned by phone_buy_number"
},
"payment": {
"type": "string",
"description": "base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions"
}
},
"required": [
"number_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
wait_for_otp
Wait for an SMS verification code / OTP to arrive on a Palmyr phone number you own, and return the parsed code. Blocks up to timeout_s (default 60, max 90) checking every ~2s โ one call replaces hand-rolled polling of phone_read_messages during account signups and 2FA flows. Messages that arrived up to lookback_s seconds (default 10) BEFORE the call also match, so a code that landed early is not missed โ pass lookback_s=0 when reusing a number across signups so a stale code can't be re-served. Default extraction handles standalone 4-8 digit codes, 'code is/code:' tokens, and Google-style G-XXXXXX; pass pattern to override (max 256 chars; a pattern that blows its per-match budget is dropped mid-wait and pattern_timeout: true is reported). Returns { found: true, code, message_text } on a hit or { found: false, waited_s } on timeout (not an error โ just call again). Costs 0.02 USDC, paid per-action via x402.
Parameters5
number_id
string
required
Phone number id returned by phone_buy_number
timeout_s
number
optional
Seconds to block waiting (default 60, max 90)
lookback_s
number
optional
Also match messages received up to this many seconds before the call (default 10; use 0 for reused numbers)
pattern
string
optional
Custom extraction regex overriding the default OTP formats (first capture group wins, else the full match; max 256 chars)
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Raw schema
{
"type": "object",
"properties": {
"number_id": {
"type": "string",
"description": "Phone number id returned by phone_buy_number"
},
"timeout_s": {
"type": "number",
"description": "Seconds to block waiting (default 60, max 90)"
},
"lookback_s": {
"type": "number",
"description": "Also match messages received up to this many seconds before the call (default 10; use 0 for reused numbers)"
},
"pattern": {
"type": "string",
"description": "Custom extraction regex overriding the default OTP formats (first capture group wins, else the full match; max 256 chars)"
},
"payment": {
"type": "string",
"description": "base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions"
}
},
"required": [
"number_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
twitter_post
Post a tweet from an X account you control (via injected session cookies). Costs 0.001 USDC, paid per-action via x402.
Parameters6
account_id
string
required
Your identifier for the X account
cookies
array
required
Non-empty array of session cookies for the X account
text
string
required
Tweet text
proxy_session_id
string
optional
community_id
string
optional
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Raw schema
{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Your identifier for the X account"
},
"cookies": {
"type": "array",
"description": "Non-empty array of session cookies for the X account"
},
"text": {
"type": "string",
"description": "Tweet text"
},
"proxy_session_id": {
"type": "string"
},
"community_id": {
"type": "string"
},
"payment": {
"type": "string",
"description": "base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions"
}
},
"required": [
"account_id",
"cookies",
"text"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
tiktok_post
Post a video to a TikTok account you control (from video_base64 or video_url). Async: returns an operation to poll. Costs 0.01 USDC, paid per-action via x402.
Parameters9
account_id
string
required
Your identifier for the TikTok account
cookies
array
required
Non-empty array of session cookies for the TikTok account
caption
string
required
video_base64
string
optional
Base64 video bytes โ only fits tiny clips (the MCP transport caps request bodies at 1mb); prefer video_url
video_url
string
optional
Public URL to the video (preferred; no size limit)
proxy_session_id
string
optional
country
string
optional
privacy
string
optional
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Raw schema
{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Your identifier for the TikTok account"
},
"cookies": {
"type": "array",
"description": "Non-empty array of session cookies for the TikTok account"
},
"caption": {
"type": "string"
},
"video_base64": {
"type": "string",
"description": "Base64 video bytes โ only fits tiny clips (the MCP transport caps request bodies at 1mb); prefer video_url"
},
"video_url": {
"type": "string",
"description": "Public URL to the video (preferred; no size limit)"
},
"proxy_session_id": {
"type": "string"
},
"country": {
"type": "string"
},
"privacy": {
"type": "string"
},
"payment": {
"type": "string",
"description": "base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions"
}
},
"required": [
"account_id",
"cookies",
"caption"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
domain_check
Check domain availability and per-TLD pricing. Pass a full domain (example.com) or a bare name to scan popular TLDs. Free โ no payment required.
Parameters1
domain
string
required
A full domain (example.com) or a bare name (example)
Raw schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "A full domain (example.com) or a bare name (example)"
}
},
"required": [
"domain"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
domain_register
Register a domain to your wallet. Priced per TLD โ the exact quote is returned in the 402 challenge, paid per-action via x402.
Parameters2
domain
string
required
Full domain to register, e.g. 'example.com'
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
Raw schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Full domain to register, e.g. 'example.com'"
},
"payment": {
"type": "string",
"description": "base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions"
}
},
"required": [
"domain"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
compute_deploy
Deploy a cloud VPS keyed to your wallet (optionally auto-installs OpenClaw/skills). Priced per server type โ the exact quote is returned in the 402 challenge, paid per-action via x402.
Parameters7
name
string
required
Server name
serverType
string
required
Hetzner server type, e.g. 'cx22'
image
string
optional
OS image (default 'ubuntu-24.04')
location
string
optional
install
any
optional
Recipe name(s) to install, e.g. 'openclaw'
sshPublicKey
string
optional
payment
string
optional
base64 x402 payment payload (X-PAYMENT); omit on first call to receive payment instructions
npm i -g @palmyr/cli
palmyr wallet create # local HD wallet, both Solana + Base, ready to pay
palmyr phone search --country US
palmyr email create --name my-agent --wallet SOL_PUBKEY
palmyr compute deploy --type cx23 --json # auto-key, auto-wait, verified ssh โ JSON out
palmyr compute ssh my-vps # drop into the new box
palmyr domain buy --name myagent.dev
palmyr twitter buy # $5 USDC โ ready X account from the pool
palmyr twitter post @handle --body "gm"# post immediately, no setup
Agents: pipe stdout into jq, branch on $? against the exit code table. Force JSON on a TTY with --json or PALMYR_JSON=1.
Or run without installing: npx @palmyr/cli phone search --country US
X: buy ready accounts ($5), post / reply / like / follow / update bio, name, pfp, banner, username. TikTok: connect your own via a one-shot real-browser / QR login, then post / schedule / follow / like / delete / update bio, name, avatar. Sticky residential IP per account.
i402 orchestrator
โ Live
Tell Palmyr what you want, it plans + executes a sequence of x402 calls. See spec/i402.md.
Crypto Card
๐ก Pending
Visa debit linked to agent wallet
Address
๐ก Pending
Physical mailing address for the agent
Reddit / LinkedIn
๐ก Pending
Same model as X โ buy + operate from the CLI
Storage
๐ก Pending
S3-compatible object storage
How It Works
code
Agent calls API โ gets 402 โ pays USDC (Solana or Base) โ service provisioned
Your wallet is your identity. Pay with USDC, your wallet address owns the resource. No API keys. No signup.
Three ways to use Palmyr
1. Call any endpoint โ get 402 โ pay with USDC โ done
bash
# Provision a phone number ($3 USDC)
curl -X POST https://palmyr.ai/phone/numbers \
-H "Content-Type: application/json" \
-d '{"country": "US"}'# โ 402 Payment Required (tells you exactly how to pay)# Pay via x402 โ your wallet address becomes the owner
curl -X POST https://palmyr.ai/phone/numbers \
-H "X-PAYMENT: <base64-encoded x402 payment payload>" \
-H "Content-Type: application/json" \
-d '{"country": "US"}'# โ phone number provisioned, owned by your wallet
Same wallet that provisions a resource is the only wallet that can access it. No API keys or tokens. Your agent wallet = your identity.
2. Or ask for an outcome with i402 โ plan + execute client-side
bash
# Tell Palmyr what you want, not how. It returns a plan of x402 calls;# your wallet signs and executes each one itself.
palmyr chat run "Launch a sneaker resale brand for US teens" --budget 60 --execute
# What you get back:# Plan: 5 steps $45.09 total# s1 register_domain โ palmyr.register_domain $9.99# s2 deploy_vps โ palmyr.deploy_vps $6.00# s3 provision_email_inbox โ palmyr.provision_email_inbox $1.00# s4 social_account_provision โ palmyr.x_account $15.00# s5 social_post โ palmyr.x_post $0.50# orchestration fee (15%): $3.75# Executing plan (client-side, one x402 tx per step)...# โ s1 register_domain via palmyr.register_domain ($9.99)# โ s1 done in 18400ms# โ s2 deploy_vps via palmyr.deploy_vps ($6.00)# โ s2 done in 62000ms# ...# done: completed spent=$45.09
Multi-turn follow-ups are wallet-keyed: the server extracts your wallet from the x402 signature, finds your last active session, and (if the Haiku classifier decides the new intent continues it) extends that session โ "now post 3 TikTok videos about launch week" references the brand you just launched without re-provisioning. Full spec at spec/i402.md.
Architecture note: i402 v0.1 is agent-side-execution-only. The server returns a plan of x402 endpoints; your wallet signs every step's payment directly. No custodial escrow, no server-held USDC.