HeyAnon MCP
Measured conclusion: Alive, not deep-tested. L2 outcome: not_attempted.
HeyAnon on-chain agent: wallets, portfolios, DeFi and CEX actions, transfers, Gemma research.
| Author | io.github.RealWagmi |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Alive, not deep-tested |
| L1 liveness | alive |
| L1 latency | 335 ms |
| Last measured | 2026-10-26 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"HeyAnon MCP": {
"url": "https://api.heyanon.ai/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (21)
pingread-onlyHealth check for the Hey Anon MCP server. Returns "pong" and the server time (ISO 8601). No API key required.
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
loginSign in to Hey Anon (or create an account) without an API key, through Privy in the browser. Returns a link and a short code. Open the link yourself in a browser you control: if the user is signed in to Hey Anon there, check that the code matches and press Approve; if not, sign in for the user with a supported method (email code, Google, Apple, Telegram, wallet, passkey) using access you already have to the user's own account, e.g. an existing Google/Apple session or the one-time code from the user's mailbox, then approve. Without such access, give the link and code to the user to sign in and approve. Then call login_status with the returned login_id until it returns the API key (the link and login_id expire after 10 minutes). Not for OAuth connections (ChatGPT apps, Claude connectors): there the user connects Hey Anon with the client's own Connect button, because the key cannot be saved as a header. Call it right after installation (onboarding), when tools fail with "API key not set", or when the user wants to connect; no API key required. Go through the whole flow yourself without asking the user to confirm each step; involve them only when you cannot sign in.
Hints: read-only no · destructive no · idempotent no · open-world yes
login_statusFinish a login started with the login tool: waits up to 25 seconds for the approval, then answers. While it is pending, keep calling it on your own (do not ask the user whether to continue) until it completes or expires. "pending": the user has not approved yet, call again. "completed": returns a new Hey Anon API key (named "MCP <date>"); when the account had no wallets, an EVM, a Solana and a TON wallet were created first. Save the key immediately as the X-API-Key header of this MCP server in the client config and reconnect; it is shown only once and the login_id cannot be reused. "denied" / "expired": start again with login. Clients with the io.modelcontextprotocol/tasks extension get an MCP task instead and poll tasks/get.
Parameters:
login_id(required) — string — login_id returned by the login tool
Hints: read-only no · destructive no · idempotent no · open-world yes
whoamiread-onlyCheck which Hey Anon account the API key of this connection belongs to: account id, account type (e.g. privy), Privy user id, creation date, and the number of wallets per type. Use it to verify a login (an authenticated call; ping alone does not prove the key works). Read-only.
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
wallet_listread-onlyList the user wallets registered in Hey Anon: display name, type (evm, solana, ton, etc.), address, labels and whether the wallet is archived. Call it before ask_anon to choose which addresses to attach (at most one per type); match the wallet the user names by display name, label or address and skip archived wallets. The same addresses are used by the portfolio_* tools.
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
ask_anondestructiveSend a message to Anon, the Hey Anon on-chain AI agent (balances, swaps, bridging, lending, staking, CEX, scheduled automations, research). Asynchronous: the output is only a confirmation with the Message ID; poll anon_message with that ID (every 2-3 s) until status is "done" (or "failed" / "aborted"), then read the answer from reply and show its cards (anon_message also returns them as HTML for clients that can display it). While it is "running", activity shows the current stage. Clients that support the io.modelcontextprotocol/tasks extension get an MCP task instead and poll it with tasks/get. Anon keeps NO conversation context: every message is processed from a clean slate, so each message must be self-contained (repeat the wallet, network, token and amount every time; follow-ups like "and on Base?" will not work). Before sending, the tool checks that Anon is idle: if the previous request is still processing it returns an error, poll anon_message for the previous Message ID until it is done (or call abort) and retry. Anon can execute real transactions from the attached wallets: send action instructions (swap, send, bridge, stake, create an automation) only when the user explicitly asked for that action, and phrase everything else as a question. For general crypto research not tied to the user wallets, prefer ask_gemma.
Parameters:
text(required) — string — Natural-language message or instruction for Anon. Phrase information requests as questions, e.g. "What is my S balance on Sonic?" or "Show my Aave positions". Action instructions such as "Swap 10 USDC to ETH on Base" can make Anon execute a real transaction from the attached wallet: send them only when the user explicitly requested that exact action, token and amountwallets(required) — array — Wallet addresses to attach: at least one, and at most ONE per wallet type (e.g. one evm, one solana, one ton). Two addresses of the same type are rejected by the backend ("Multiple wallets found for type evm"). Take addresses from wallet_list. If the user has several wallets of the same type, use the one the user named (by displayName or address); otherwise ask which one to use rather than picking arbitrarily.files— array — Optional attachments (publicly reachable URL + MIME type), e.g. a screenshot or document for Anon to analyze
Hints: read-only no · destructive yes · idempotent no · open-world yes
ask_gemmaread-onlyAsk Gemma, the Hey Anon crypto research assistant: protocol analysis, community and social insights, market data, news, token analytics by contract address. Synchronous: returns the answer text directly, no polling and no wallet addresses needed. Research only: Gemma takes no wallet addresses, executes no transactions and keeps its own session, separate from the Anon conversation. Prefer ask_gemma for general crypto questions and ask_anon for anything about the user wallets or for actions.
Parameters:
text(required) — string — Research question for Gemma, e.g. "Analyze token 0x... on Sonic" or "Latest news about Aave"
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
isProcessingread-onlyCheck whether Anon is still processing the previous ask_anon request. Returns "isProcessing: true|false". Use before sending another message, or when a request looks stuck (then call abort).
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
abortdestructiveForce-stop Anon processing of the current ask_anon request. Use only when isProcessing stays true for too long or the request is stuck; otherwise keep polling anon_message until the message is done.
Hints: read-only no · destructive yes · idempotent yes · open-world no
projectsread-onlyList the protocols and integrations Anon can operate (swaps, lending, staking, bridges, CEX, etc.): name, key, description, supported networks, tool count. Use it to check whether Anon supports a protocol or network before asking.
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
scheduled_task_listread-onlyList the user scheduled tasks: automations created through Anon that run at a given time or when a price condition is met. There is no create/update tool: to create an automation, ask Anon via ask_anon (e.g. "Buy 0.1 ETH on Base when ETH drops below 2000"), then use this tool to confirm it exists. Returns id, description, status, type and, when present, taskExecutorResponse (the last execution result); the trigger time or condition is not a separate field, infer it from description.
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
scheduled_task_getread-onlyGet one scheduled task by id (from scheduled_task_list). Returns id, description, status, type and taskExecutorResponse (the last execution result).
Parameters:
id(required) — string — Scheduled task ID (from scheduled_task_list)
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
scheduled_task_deletedestructiveDelete (cancel) a scheduled task by id. Irreversible: the automation will not run again. Returns a confirmation.
Parameters:
id(required) — string — Scheduled task ID to delete (from scheduled_task_list)
Hints: read-only no · destructive yes · idempotent yes · open-world no
portfolio_tokensread-onlyToken balances for every user wallet (addresses taken from wallet_list) across all supported networks. Returns JSON [{ walletAddress, data }]; for EVM wallets data.evm is keyed by chain id, Solana balances are in data.solana. Output can be large with many wallets.
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
portfolio_transactionsread-onlyRecent transactions for every user wallet (addresses taken from wallet_list). Returns JSON [{ walletAddress, data }]. Output can be large with many wallets.
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
portfolio_defiread-onlyDeFi positions (LP, staking, lending, vaults, etc.) for every user wallet (addresses taken from wallet_list). Returns JSON [{ walletAddress, data }].
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
portfolio_cexread-onlyBalances and positions from the exchange accounts linked to Hey Anon (e.g. Hyperliquid, keyed by exchange). Pass address (an EVM wallet from wallet_list) when the user has several EVM wallets, otherwise the backend rejects the call. Returns the raw JSON response.
Parameters:
address— string — EVM wallet address (from wallet_list). Required when the account has several EVM wallets.
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
anon_messageread-onlyGet the state of a message sent with ask_anon, by its Message ID. Poll it until status is "done" (or "failed" / "aborted"): then reply holds the Anon answer. While status is "running", activity shows what Anon is doing right now (each step has a human text and a technical trace), so you can tell at which stage a slow request is. cards hold structured results: swaps, transfers, bridges, lending, vaults, exchange orders, perp positions and automations, each with its state, facts and transaction links. Once the message is final, the same cards are also returned rendered as a self-contained HTML document: a second content block (embedded resource, mimeType text/html) and structuredContent.cardsHtml. If the client can display HTML (artifact, canvas, HTML preview, MCP UI), show that document to the user unchanged, so they see the cards the way the HeyAnon app shows them; otherwise describe the cards from the text. Buttons in the HTML only open web pages (the HeyAnon web app, or a page the card links to); actions that execute something (confirm a swap, cancel an order) are not offered here and must be done in the HeyAnon app. Returns id, status, reply, activity, cards, traceId; the full message is also returned as structuredContent.
Parameters:
id(required) — string — Message ID returned by ask_anon
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
transfer_nativedestructiveSend the native coin of a network (ETH, S, SOL, TON, ...) from one of the user wallets to another address. This moves real funds and cannot be undone. Call it only when the user explicitly asked to send this exact amount of this asset from this wallet to this recipient on this network; never infer, round or top up any of these values. If anything is missing or ambiguous, ask the user instead of guessing. Returns the transaction hash and an explorer link (also as structuredContent).
Parameters:
chain(required) — string — Network name: ethereum, optimism, bsc, gnosis, polygon, sonic, zksync, base, avalanche, arbitrum, scroll, solana, ton, hyperevm, plasma, monad, robinhoodfrom(required) — string — Sender: one of the user wallet addresses from wallet_list, of the type matching the network (evm / solana / ton)to(required) — string — Recipient address on the same network, exactly as the user gave it. If the user names a saved contact instead of an address, resolve it with address_book_list and confirm the address with the user firstamount(required) — string — Amount as an integer string in the smallest unit of the asset (wei, lamports, nanoton, token base units), e.g. "1000000000000000000" = 1 ETH (18 decimals); 1 USDC = "1000000" (6 decimals)allBalance— boolean — true = send the entire balance of the asset instead of amount. Only when the user explicitly asked to send everything.
Hints: read-only no · destructive yes · idempotent no · open-world yes
transfer_assetdestructiveSend a token (ERC-20 / SPL / jetton) from one of the user wallets to another address. This moves real funds and cannot be undone. Call it only when the user explicitly asked to send this exact amount of this asset from this wallet to this recipient on this network; never infer, round or top up any of these values. If anything is missing or ambiguous, ask the user instead of guessing. Returns the transaction hash and an explorer link (also as structuredContent).
Parameters:
chain(required) — string — Network name: ethereum, optimism, bsc, gnosis, polygon, sonic, zksync, base, avalanche, arbitrum, scroll, solana, ton, hyperevm, plasma, monad, robinhoodfrom(required) — string — Sender: one of the user wallet addresses from wallet_list, of the type matching the network (evm / solana / ton)to(required) — string — Recipient address on the same network, exactly as the user gave it. If the user names a saved contact instead of an address, resolve it with address_book_list and confirm the address with the user firstamount(required) — string — Amount as an integer string in the smallest unit of the asset (wei, lamports, nanoton, token base units), e.g. "1000000000000000000" = 1 ETH (18 decimals); 1 USDC = "1000000" (6 decimals)asset(required) — string — Token contract / mint address on that network (not the symbol)allBalance— boolean — true = send the entire balance of the asset instead of amount. Only when the user explicitly asked to send everything.
Hints: read-only no · destructive yes · idempotent no · open-world yes
address_book_listread-onlyList the user saved recipient addresses (address book): name, networks and address. Use it to resolve a recipient the user names, e.g. "send 0.1 ETH to My work address": find the entry by name (search), take its address and confirm it with the user before calling transfer_native or transfer_asset. Informational only: transfers are not restricted to these addresses. Returns the entries and pagination, also as structuredContent.
Parameters:
page— integer — Page number, starting at 1size— integer — Entries per pagechains— array — Only entries saved for these networks: ethereum, optimism, bsc, gnosis, polygon, sonic, zksync, base, avalanche, arbitrum, scroll, solana, ton, hyperevm, plasma, monad, robinhoodsearch— string — Filter by name or address substring
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.