@phantom/mcp-server@1.2.9 returns from tools/list.
wallet_status reports the session stored on this machine. It does not prove that Phantom still accepts that session. Call wallet_addresses when you need a server-backed check.Wallet operations
wallet_status
Reads the session stored on this machine. It does not authenticate and it does not call Phantom.connected: true means the local session has a wallet id and an organization id.
Call wallet_addresses when the server must accept the session.
No parameters.
The first tool call that needs the wallet after the server starts loads the stored session and checks it with Phantom. If Phantom rejects it with HTTP 401 or 403, the server deletes the session and opens the device-code sign-in in the browser. That call waits for approval and then continues. wallet_status does not run this check.
After that startup check, on HTTP 401, the shared CLI wrapper refreshes the session once and retries that call. If the refresh fails, it clears the local session and returns AUTH_EXPIRED. Call login, then retry the original tool yourself.
That wrapper only runs when the original HTTP error reaches it. In @phantom/cli@3.0.0, wallet_addresses catches the client error and throws a new error that keeps only the message, so the wrapper never sees status 401. A rejected session on that call fails as Failed to get wallet addresses: ..., with no refresh and no AUTH_EXPIRED. Call login and retry. The sign, send, and transfer handlers in that release replace errors the same way. This is a defect in the published package, not a difference in which tools exist.
A transaction submission failure is separate from an expired session. HTTP 403 responses with type submission-failed, and errors with code -32009, stay submission errors. A rejected submission is not a reason to rotate the session.
wallet_addresses
Gets all blockchain addresses for the authenticated embedded wallet (Solana, Ethereum, Bitcoin, Sui). Sui address output has been deprecated.
Example response:
wallet_balances
Returns token holdings for the authenticated wallet with live USD pricing via the Phantom portfolio API.solana_send
Simulates, signs, and broadcasts a Solana transaction.
Example request:
evm_send
Simulates, signs, and broadcasts an EVM transaction with automatic gas estimation.
Chain reads use the SDK endpoint for the selected network.
rpcUrl is not an input. Arbitrum (chainId 42161) is rejected before signing. BNB Smart Chain (chainId 56, eip155:56) is unsupported and fails before signing. See the supported networks.
Example request:
solana_sign
Signs a UTF-8 message on Solana.evm_sign
Signs a UTF-8 message using EIP-191 personal signing for EVM chains.evm_sign-typed
Signs structured data using EIP-712 for EVM chains. Used for DeFi permits and other typed data flows.simulate
Simulates a transaction and returns expected asset changes, security warnings, and blocking conditions without submitting on-chain. Use this to preview what a transaction will do before signing or sending. Supports Solana, EVM (Ethereum, Base, Polygon), Bitcoin, and an Arbitrum preview. Sending on Arbitrum is rejected. Monad and Sui simulation support have been deprecated. TheuserAccount wallet address is auto-derived from the authenticated session for Solana and EVM chains. Supply it explicitly for Sui and Bitcoin.
Chain-specific
params shapes:
- Solana:
{ transactions: ["<base58>"] } - EVM:
{ transactions: [{ from, to, value, data, chainId, type }] } - Sui:
{ rawTransaction: "<bytes>" } - Bitcoin:
{ transaction: "<raw>", userAddresses?: ["bc1q..."] } - EVM message:
{ message: "0x..." }
Response shape
The result is a discriminated union ontype ("transaction" or "message") with a strongly typed schema. Treat any non-empty block as a blocking condition that should prevent signing or sending.
Each
expectedChanges[] entry is one of:
type: "AssetChange"-name,changeText,changeSign(PLUS|MINUS|EQUAL),asset({ type: "fungible" | "collectible" | "native" | "unknown", symbol, decimals, amount, usdValue? }),changeType(approval|revokal|transfer|mint|unknown), and optionalimage,context,metadata.type: "MessageOnly"-message,fallbackMessage,changeType, and optionalimage,context,metadata.
block or warnings[]) has { message, severity, kind? }. severity is an integer where lower numbers are more severe:
advancedDetails shape depends on the chain and request type:
- EVM transaction:
{ chainId, advancedRows, gas, gasLimit, tokenChange?, contractAddresses }. Each contract address has atypeofspender,contract, orunknown. - Solana transaction:
{ chainId, tokenChange, advancedRows, requestId, safeguard?, totalFee, feePayers }. - Sui transaction:
{ chainId, tokenChange, requestId, gas: { computationCost, storageCost, storageRebate, nonRefundableStorageFee, totalGasUsed } }. - Bitcoin transaction:
{ inputs, outputs }with amounts in satoshis. - EVM message:
{ contractAddress }. - Solana message:
{ errorSignInWithSolana }.
evm_allowance
Returns the ERC-20 token allowance granted by an owner address to a spender address on any supported EVM chain. Use this before a swap to check whether an approval transaction is needed. WhenownerAddress is omitted, the authenticated wallet address is used automatically.
Allowance reads use the SDK endpoint for
chainId. rpcUrl is not an input.
Example response:
transfer
Transfers native tokens or SPL/ERC-20 tokens across Solana and supported EVM networks using a simulation-first flow.
Chain reads use the SDK endpoint for
networkId. rpcUrl is not an input. Arbitrum (eip155:42161) is rejected before signing. BNB Smart Chain (eip155:56) is unsupported and fails before signing. See the supported networks.
Example (SOL transfer):
Swaps and portfolio
buy
No fees on swaps. Phantom does not charge transaction fees, platform fees, or commission on swaps executed through the MCP server. Your users keep what they swap. Fetches a swap quote from the Phantom routing engine for Solana, supported EVM networks, and cross-chain swaps. Optionally signs and sends the initiation transaction whenexecute: true.
Cross-chain swaps work in both directions: Solana to EVM and EVM to Solana. Cross-chain swaps can also target Hypercore/Hyperliquid when supported.
Quotes use the SDK endpoint for the selected network.
rpcUrl and quoteApiUrl are not inputs. Arbitrum is rejected as a sell or buy chain. BNB Smart Chain (eip155:56) is unsupported; do not use it as a sell or buy chain.
Example (Solana swap: sell SOL for USDC):
wallet_rebalance
Analyzes portfolio allocation and rebalances via token swaps. No fees on any swaps executed during rebalancing. Portfolio rebalancing uses the same zero-fee swap routing asbuy.
Analyzes portfolio allocation and rebalances to target percentages via token swaps. Currently supports Solana only. Uses a two-phase flow: call with phase: "analyze" to inspect current allocations, then phase: "execute" with targetAllocations to rebalance. Pass dryRun in the execute phase to preview without executing.
Session and billing
login
Re-authenticates with Phantom. Use this to log in for the first time, switch accounts, or refresh an expired session.logout
Clears the stored session and credentials from disk. It does not call Phantom. The next tool call needs a new login. No parameters.price
Returns the portfolio price for one token.pay
Pays for daily API access when another tool returnsAPI_PAYMENT_REQUIRED. Pass the preparedTx value from that error response, then retry the original tool call.
Perpetuals
Looking for a Hyperliquid-focused walkthrough instead of the full tool catalog? See the dedicated perps tools guide.
Read-only
All five accept an optional
walletId. All except perps_markets also accept an optional derivationIndex (default: 0).
perps_deposit
Bridges tokens from an external chain (Solana, Base, Ethereum, Polygon) into Hyperliquid as USDC via cross-chain swap. Uses a quote-first flow by default. Arbitrum is rejected as a source chain. BNB Smart Chain (eip155:56) is unsupported; do not use it as a source chain.
Example (deposit SOL into Hyperliquid as USDC):
perps_open
Opens a market or limit long/short perpetual position.
Example (market long):
perps_close
Closes a perpetual position fully or partially.perps_cancel
Cancels an open perpetual order by ID.perps_leverage
Updates leverage and margin mode for a market.perps_transfer
Moves USDC from Hypercore spot into the perps margin account.perps_withdraw
Bridges USDC from the Hyperliquid perpetuals account to an external chain (Solana, Base, Ethereum, Arbitrum, Polygon) via the Relay bridge.
Example:
perps_deposit and perps_withdraw-hl-spot return a quote until you pass execute: true. The other perp write tools submit the signed action on the call. Use perps_markets, perps_account, and perps_positions first to verify the intended trade.
Funding flow
Moving funds in and out of perps is a two-step process: Deposit chain (external → perps):perps_deposit— bridges tokens from Solana, Base, Ethereum, or Polygon into Hyperliquid as USDC. Arbitrum is rejected as a source chain. BNB Smart Chain (eip155:56) is unsupported; do not use it as a source chain.perps_transfer— moves USDC from Hyperliquid spot into the perps margin account.
perps_withdraw— bridges USDC from perps directly to the destination chain in one step.
perps_withdraw-hl-spot
Bridges USDC from the Hyperliquid spot account to an external chain. Funds must already be in spot. Arbitrum is a valid destination here.
The CLI command is
phantom perps withdraw-hl-spot. Arbitrum remains a valid bridge destination for this withdrawal and for perps_withdraw.
Supported networks
Network identifiers follow the CAIP-2/CAIP-10 format.Solana
Ethereum and EVM networks
Arbitrum One (
eip155:42161) and Arbitrum Sepolia (eip155:421614) stay in the CLI for Hyperliquid EIP-712 signing, portfolio balance reads, and withdraw bridge destinations. transfer, evm_send, buy, and perps_deposit reject them.
BNB Smart Chain (BSC, eip155:56; chain ID 56) is not supported by the released MCP/CLI transaction tools. The same EVM address can receive assets on BSC without the MCP being able to move them. Balance visibility and quote availability do not establish signing or sending support.