{"server":{"name":"ai.palmyr/palmyr","title":"Palmyr","$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","remotes":[{"url":"https://palmyr.ai/mcp","type":"streamable-http"}],"version":"1.0.0","repository":{"url":"https://github.com/0xArtex/Palmyr","source":"github"},"websiteUrl":"https://palmyr.ai","description":"Agent infra: email, phone, social, domains, VPS, wallets. Paid per-action via x402, no API key."},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","isLatest":true,"updatedAt":"2026-07-03T00:26:09.037913Z","publishedAt":"2026-07-03T00:26:09.037913Z","statusChangedAt":"2026-07-03T00:26:09.037913Z"},"dev.protogrid/connectability":{"class":"R0","autonomous":true,"human_steps":[],"preferred":{"kind":"remote","idx":0},"remotes":[{"idx":0,"url":"https://palmyr.ai/mcp","transport":"streamable-http","templated":false,"headers":[],"auth":{"type":"none","location":null,"secret_name":null,"oauth":null},"protocol":{"supported_versions":["2025-11-25"],"stateless":true},"health":{"reachable":true,"uptime_30d":0.9189189,"latency_ms_p50":584,"consecutive_failures":0,"last_probe_at":"2026-10-10T02:04:10.052Z","last_ok_at":"2026-10-10T02:04:10.052Z"}}],"packages":[]},"dev.protogrid/tools":[{"name":"card_buy","title":"Buy prepaid Visa card","description":"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).","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"card_get","title":"Get card number/CVV","description":"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).","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"card_list","title":"List your prepaid cards","description":"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.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"card_status","title":"Check card purchase status","description":"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).","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"compute_deploy","title":"Deploy VPS","description":"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.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"domain_check","title":"Check domain availability","description":"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.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"domain_register","title":"Register domain","description":"Register a domain to your wallet. Priced per TLD — the exact quote is returned in the 402 challenge, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"email_create_inbox","title":"Create email inbox","description":"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.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"email_create_temp","title":"Create disposable temp inbox","description":"Provision a cheap, disposable, receive-only email inbox — ideal for receiving a one-off verification or order-confirmation email during a checkout/signup flow. The address (a natural-looking handle on a dedicated inbox domain) is returned in the response. 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.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"email_extend_temp","title":"Extend disposable temp inbox","description":"Rent another 7 days on a live disposable temp inbox — each call pushes expires_at exactly 7 days further (fixed, stackable, no cap). Owner-only; expired temp inboxes cannot be revived (buy a new one via email_create_temp). Costs 0.50 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"email_read_messages","title":"Read email messages","description":"Read decrypted messages from an inbox you own (payment wallet must match the inbox). Costs 0.02 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"email_send","title":"Send email","description":"Send an email from an inbox you own. Costs 0.08 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"i402_plan","title":"i402 plan (intent resolver)","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.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"palmyr_capabilities","title":"Palmyr capabilities","description":"List the i402 capabilities Palmyr can plan and execute (the intent-resolver catalog). Free — no payment required.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"palmyr_pricing","title":"Palmyr pricing","description":"List every paid Palmyr capability and its live x402 price (USDC on Solana/Base). Free — no payment required.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"phone_buy_number","title":"Buy phone number","description":"Provision a real phone number (SMS + voice) for your agent. Costs 3.00 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"phone_extend_temp","title":"Extend disposable temp phone number","description":"Rent another 30 minutes on a live disposable temp number — each call pushes expires_at 30 min further (stackable up to 24h total lease). Owner-only; expired temp leases cannot be revived (lease a fresh one via phone_temp_number). Costs 0.20 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"phone_read_messages","title":"Read SMS messages","description":"Read SMS messages received on a phone number you own. Costs 0.02 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"phone_send_sms","title":"Send SMS","description":"Send an SMS from a phone number you own. Costs 0.05 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"phone_temp_number","title":"Lease disposable temp phone number","description":"Lease a cheap, instant, receive-only US phone number from a pool to receive one SMS verification code — the phone analogue of a disposable temp email inbox. $0.20 for 30 min (ttl_seconds, clamped 300–1800), returned to the pool at expiry; call wait_for_otp to catch the code. Good for one-time SMS verification and phone-gated signups. Works with major sites like Google, X, and Discord; some (Telegram, WhatsApp, OpenAI) may reject it as a VoIP number — for strict sites, buy a dedicated number with phone_buy_number. Pool numbers are recycled after the lease, so use them for one-time codes only, not long-term 2FA. Costs 0.20 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"tiktok_accounts","title":"List your TikTok accounts","description":"List the TikTok accounts the paying wallet owns, with session health (status, profile_present, hours_since_success, last_error_code) — i.e. which of your accounts are still logged in. Costs 0.001 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"tiktok_analytics","title":"Fetch TikTok analytics","description":"Scrape per-post analytics (views, likes, comments, shares) for a TikTok account you control, and record a sample so tiktok_series can answer 'is it still growing'. Async: returns an operation to poll with tiktok_operation_status. Costs 0.005 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"tiktok_cancel_scheduled","title":"Cancel a scheduled TikTok post","description":"Cancel a post queued with tiktok_post(schedule_at). TikTok has no 'unschedule', so this deletes the held video — the cancellation is recorded only once that succeeded. Async: returns an operation to poll with tiktok_operation_status. Costs 0.001 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"tiktok_connect","title":"Connect a TikTok account (server-side login)","description":"Attach a TikTok account by logging in ON THE SERVER, into that account's own persistent browser profile: returns a connect_url to hand a human, who scans the QR in the TikTok app. The recommended path — the browser that authenticates is the browser that later acts, and every other TikTok tool then works with `cookies` omitted (no jar to move). The paying wallet becomes the account's owner. Async: poll tiktok_connect_status with the returned token. Costs 0.01 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"tiktok_connect_status","title":"Check TikTok connect status","description":"Poll a server-side login started by tiktok_connect (free). done=true when state is 'completed' (the account is live and usable with cookies omitted) or 'failed'.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"tiktok_hooks","title":"TikTok hook analysis","description":"Which caption openings actually earn views. Pass account_id or tag to measure YOUR accounts against their own median (0.001 USDC). Pass niche to report what is working in that niche across TikTok, needing no posting history — the answer for a brand-new account (0.05 USDC; tiktok_niches lists them, free). The two are never blended. Pass caption to classify a draft before posting. Paid per-action via x402 — the 402 challenge carries the exact price for the arguments you sent.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"tiktok_niches","title":"List TikTok niches","description":"List the niches tiktok_hooks can report on, with how fresh each corpus is. Free — an agent should not pay to learn what it may ask for.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"tiktok_operation_status","title":"Check TikTok operation status","description":"Poll an async TikTok operation started by tiktok_post / tiktok_analytics / tiktok_cancel_scheduled (free). done=true when status is 'posted' / 'done' (carries video_url or the op's result) or 'failed' (payment auto-refunded — see refund_status).","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"tiktok_post","title":"Post to TikTok","description":"Post a video to a TikTok account you control (from video_base64 or video_url), immediately or scheduled. Async: returns an operation to poll with tiktok_operation_status. Costs 0.01 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"tiktok_scheduled","title":"List scheduled TikTok posts","description":"List the posts you have queued with tiktok_post(schedule_at), and whether each is still pending, due, or confirmed published. Palmyr's own record — TikTok exposes no way to read pending posts back, so edits made directly in TikTok Studio are invisible to it. Costs 0.001 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"tiktok_series","title":"Read TikTok engagement history","description":"Read the stored per-post history for an account you own: the full time series for one video (video_id), per-video growth over a window (hours), or the latest sample per video (neither). Samples come from tiktok_analytics runs, so history exists only for what you have scraped. Costs 0.001 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"twitter_post","title":"Post to X (Twitter)","description":"Post a tweet from an X account you control (via injected session cookies). Costs 0.001 USDC, paid per-action via x402.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"},{"name":"wait_for_otp","title":"Wait for SMS verification code (OTP)","description":"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.","annotations":null,"source":"probe","observed_at":"2026-10-10T02:04:10.052Z"}],"dev.protogrid/trust":{"score":88,"components":{"hygiene":100,"liveness":97,"freshness":65,"provenance":85},"drivers":["+repository","+dns-namespace","+website","+reachable","+uptime-92%","~updated-99d-ago"],"flags":[],"blocked":false,"computed_at":"2026-10-10T02:23:34.570Z","disclaimer":"Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed."},"dev.protogrid/quality":{"score":79,"label":"good","components":{"auth":null,"hygiene":71,"protocol":75,"stability":100,"dependencies":null},"checks":[{"id":"protocol.modern","detail":"newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28","status":"warn","category":"protocol"},{"id":"protocol.stateless","detail":"only applies to 2026-07-28 servers","status":"na","category":"protocol"},{"id":"protocol.transport","detail":"streamable HTTP","status":"pass","category":"protocol"},{"id":"protocol.list_ttl","detail":"only applies to 2026-07-28 servers","status":"na","category":"protocol"},{"id":"auth.prm","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.as_metadata","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.cimd","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.secret_in_url","detail":"no templated URL","status":"na","category":"auth"},{"id":"tools.descriptions","detail":"every tool has a description","status":"pass","category":"hygiene"},{"id":"tools.description_length","detail":"descriptions are concise","status":"pass","category":"hygiene"},{"id":"tools.schemas","detail":"every tool has an object input schema","status":"pass","category":"hygiene"},{"id":"tools.annotations","detail":"no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones","status":"fail","category":"hygiene"},{"id":"tools.directory_hints","detail":"no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: email_create_temp (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); email_extend_temp (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); email_send (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …","status":"fail","category":"hygiene"},{"id":"tools.token_cost","detail":"about 6,142 tokens to load every tool","status":"pass","category":"hygiene"},{"id":"tools.api_dump","detail":"tools are not a one-to-one API dump","status":"pass","category":"hygiene"},{"id":"stability.changes","detail":"no tool changes in 30 days","status":"pass","category":"stability"},{"id":"stability.rug_pull","detail":"no tool changed its meaning under the same name","status":"pass","category":"stability"},{"id":"deps.known_vulns","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.mcp_sdk_version","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.resolvable","detail":"no npm or PyPI package","status":"na","category":"dependencies"}],"drivers":["-tools.annotations","-tools.directory_hints","~protocol.modern"],"flags":[],"tool_count":33,"token_estimate":6142,"tools_hash":"73139faa44df873d930939a90a456e5c","tools_changed_at":null,"computed_at":"2026-10-10T02:27:51.671Z","disclaimer":"Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed."},"dev.protogrid/identity":{"canonical_id":"ai.palmyr/palmyr","aliases":[],"alias_count":0,"repository_key":"github:0xartex/palmyr","owner":{"verified":false,"method":null,"since":null}}},"next_actions":[{"action":"list_tools","description":"Every current tool with input schemas","href":"/v1/servers/ai.palmyr%2Fpalmyr/tools","arguments":{"name":"ai.palmyr/palmyr"}},{"action":"get_connection","description":"Minimal connection block for the preferred remote or package","href":"/v1/servers/ai.palmyr%2Fpalmyr/connection?target=mcpServers","arguments":{"name":"ai.palmyr/palmyr","target":"mcpServers"}},{"action":"search","description":"Find other servers by intent","href":"/v1/search?q={query}","arguments":{"q":"{query}"}}]}