Tools

Everything the agent can call, in one list. Names are solana_<group>_<verb>_<object>. Tier read has no side effects, simulate builds and simulates and never sends, execute signs and sends. Amounts in SOL are decimals; lamports and token amounts are decimal strings.

Same tools from the CLI: solos mcp call <tool> --args '{...}'. Longer notes per group are in the repo reference.

discovery 1 tool

solana_discovery_search_tools read

Find the tools for a request

Find which solOS tools serve a request, and make them callable. Most tools are withheld until asked for, so call this first: give a query in your own words, one group name, or exact tool names. On the MCP server the matching tools then join the tool list with their full schema. The result names every match, marks the ones this server's tier ceiling withholds and says how to raise it, counts matches beyond the listed cap, and when nothing matches says what solOS does not cover. Costs no funds and reads nothing on chain.

ArgumentTypeRequiredDescription
querystringnoThe request in your own words, e.g. "swap SOL for USDC". Give exactly one of query, group or names.
groupstringnoOne tool group to list in full: discovery, launch, lend, liquidity, market, perp, portfolio, swap, transfer or wallet.
namesstring[]noExact tool names to look up, e.g. ["solana_swap_get_quote"].
limitintegernoHow many matches to list; the rest are counted, not listed. default 8 · 0 to 255

launch 5 tools

solana_launch_execute_buy execute

Buy a pump.fun coin

Buy a pump.fun coin with a bounded SOL budget and submit it. amount is the maximum SOL the wallet may spend, in lamports, including Pump's trading fees — it is never a token quantity, and the same maximum is encoded in the transaction, so nothing more can ever be spent. Network fees and any account rent are reported separately and sit outside that budget. The executor re-reads live curve state and derives the minimum tokens the program must deliver from it and maxSlippageBps; that minimum is enforced on chain, so a curve that moves between planning and landing reverts the buy instead of filling it badly. The exact transaction that will be submitted is simulated first unless skipSimulation is true, which bypasses only the simulation and never the validation or that minimum. A completed curve, a curve quoted in anything but SOL, a missing curve, an unsupported mint extension or an underfunded wallet sends nothing, and the buy is never rerouted to PumpSwap or Jupiter. An ambiguous submission keeps its signature in a structured failure and is never re-sent or rebuilt; confirmation is not proof of the requested fill. The curve-side exit is solana_launch_execute_sell, which stops working once the curve completes. Use solana_launch_simulate_buy to preview.

ArgumentTypeRequiredDescription
mintstringyesBase58 mint of the coin to buy, whose bonding curve must be live
amountstringyesMaximum SOL to spend in lamports, including Pump trading fees; never a token amount
maxSlippageBpsintegernoHow far below the quoted tokens the enforced minimum may sit. Default 50 (0.5%). default 50 · 1 to 9999
skipSimulationbooleannoSkip the pre-send simulation. Validation and the enforced minimum still apply. default false

solana_launch_execute_sell execute

Sell a pump.fun coin

Sell a pump.fun coin back to its bonding curve and submit it. amount is the exact quantity of the coin to sell, in its base units — it is never a SOL figure. The executor re-reads live curve state and derives the least SOL the program must return from it and maxSlippageBps; that minimum is enforced on chain, so a curve that moves between planning and landing reverts the sell instead of filling it badly. Network fees are reported separately. The exact transaction that will be submitted is simulated first unless skipSimulation is true, which bypasses only the simulation and never the validation or that minimum. A completed curve, a curve quoted in anything but SOL, a missing curve, an unsupported mint extension, or a wallet holding less of the coin than the sell asks for sends nothing, and the sell is never rerouted to PumpSwap or Jupiter. An ambiguous submission keeps its signature in a structured failure and is never re-sent or rebuilt; confirmation is not proof of the requested fill. This is the curve-side exit for a coin bought with solana_launch_execute_buy. Use solana_launch_simulate_sell to preview.

ArgumentTypeRequiredDescription
mintstringyesBase58 mint of the coin to sell, whose bonding curve must be live
amountstringyesExact quantity of the coin to sell, in its base units; never a SOL amount
maxSlippageBpsintegernoHow far below the quoted SOL the enforced minimum may sit. Default 50 (0.5%). default 50 · 1 to 9999
skipSimulationbooleannoSkip the pre-send simulation. Validation and the enforced minimum still apply. default false

solana_launch_get_curve read

Get bonding curve state

Read the current state of a pump.fun bonding curve for one launched token mint: whether the curve is complete, its sold progress in basis points (0-10000, floored), and its virtual SOL and token reserves as exact base-unit integer strings. progressBps is floored to the integer basis point below the exact value. Only SOL-paired curves are supported — a curve trading against any other quote asset fails with UnsupportedQuoteAsset. complete is the on-chain curve flag only; it does not prove a PumpSwap migration pool exists. Read-only: nothing is bought, sold, signed, or sent, and there is no Jupiter fallback.

ArgumentTypeRequiredDescription
mintstringyesBase58 mint of the launched token whose bonding curve to read

solana_launch_simulate_buy simulate

Simulate a pump.fun buy

Simulate buying a pump.fun coin with a bounded SOL budget without submitting anything. amount is the maximum SOL the wallet may spend, in lamports, including Pump's trading fees — it is never a token quantity, and the same maximum is encoded in the transaction, so nothing more can ever be spent. Network fees and any account rent are reported separately and sit outside that budget. The executor re-reads live curve state and derives the minimum tokens the program must deliver from it and maxSlippageBps; that minimum is enforced on chain, so a curve that moves reverts the buy instead of filling it badly. A completed curve, a curve quoted in anything but SOL, a missing curve, an unsupported mint extension or an underfunded wallet is reported without building or sending, and the buy is never rerouted to PumpSwap or Jupiter. Nothing is ever signed for submission, and a later execute re-plans and may differ. The curve-side exit is solana_launch_simulate_sell / solana_launch_execute_sell, which stop working once the curve completes. Use solana_launch_execute_buy to send.

ArgumentTypeRequiredDescription
mintstringyesBase58 mint of the coin to buy, whose bonding curve must be live
amountstringyesMaximum SOL to spend in lamports, including Pump trading fees; never a token amount
maxSlippageBpsintegernoHow far below the quoted tokens the enforced minimum may sit. Default 50 (0.5%). default 50 · 1 to 9999

solana_launch_simulate_sell simulate

Simulate a pump.fun sell

Simulate selling a pump.fun coin back to its bonding curve without submitting anything. amount is the exact quantity of the coin to sell, in its base units — it is never a SOL figure. The executor re-reads live curve state and derives the least SOL the program must return from it and maxSlippageBps; that minimum is enforced on chain, so a curve that moves reverts the sell instead of filling it badly. Network fees are reported separately. A completed curve, a curve quoted in anything but SOL, a missing curve, an unsupported mint extension, or a wallet holding less of the coin than the sell asks for is reported without building or sending, and the sell is never rerouted to PumpSwap or Jupiter. Nothing is ever signed for submission, and a later execute re-plans and may differ. Use solana_launch_execute_sell to send.

ArgumentTypeRequiredDescription
mintstringyesBase58 mint of the coin to sell, whose bonding curve must be live
amountstringyesExact quantity of the coin to sell, in its base units; never a SOL amount
maxSlippageBpsintegernoHow far below the quoted SOL the enforced minimum may sit. Default 50 (0.5%). default 50 · 1 to 9999

lend 6 tools

solana_lend_execute_deposit execute

Execute Kamino deposit

Supply an exact underlying amount into the one configured Kamino lending market from the configured signer wallet and wait for confirmation. Signs and submits a real transaction that moves funds. amount is the exact deposit in base units of the mint's underlying token; the transaction encodes exactly that amount and cannot spend more. The executor re-validates the configured market and reserve against chain state and targets the signer's plain (vanilla) supply obligation — initializing it and its user metadata when absent (rent is the signer's), never touching borrowing, leverage or elevation-group obligations, and refusing an obligation that already carries borrows. Simulates the exact transaction first and sends nothing when simulation, validation, or the blockhash lifetime fails; skipSimulation bypasses only the simulation, never validation. Never re-sends or rebuilds after an ambiguous submission — the signature is reported in the structured failure, and confirmation alone is not proof of the requested economic fill. Use solana_lend_simulate_deposit to preview without sending. Live funded deposits stay an operator QA step until the matching withdrawal twin exists and is checked.

ArgumentTypeRequiredDescription
mintstringyesUnderlying token mint to supply in the configured Kamino market
amountstringyesExact underlying amount to deposit, in base units as a positive integer string
skipSimulationbooleannoSkip the pre-send simulation of the exact transaction. Defaults to false default false

solana_lend_execute_withdraw execute

Execute Kamino withdrawal

Redeem fixed collateral units chosen from a target underlying base-unit amount at the read-time rate. The target is NOT a guaranteed minimum or exact on-chain output: the reserve can change before inclusion. Check the estimated output and encoded collateral in simulation; read the wallet and position after execution. Simulates before sending unless skipSimulation is true; failed simulations send nothing. Never retries ambiguous sends.

ArgumentTypeRequiredDescription
mintstringyesUnderlying token mint in the configured Kamino market
amountstringyesTarget underlying base units at the read-time rate. Redemption encodes fixed collateral units; actual underlying output can differ, with no on-chain minimum
skipSimulationbooleannoSkip pre-send simulation; never skip validation default false

solana_lend_get_position read

Get a Kamino supply position

Read one owner's total supplied amount for an underlying token in the configured Kamino market. The exact base-unit amount is converted from collateral tokens at the reserve exchange rate and rounded down once after aggregation. positions lists each distinct contributing obligation; debt is never netted from supply. A known reserve with no supply returns zero. owner defaults to the configured signer. Read-only: nothing is deposited, withdrawn, signed, or sent.

ArgumentTypeRequiredDescription
mintstringyesUnderlying token mint in the configured Kamino market
ownerstringnoSupply owner. Defaults to the configured signer wallet when omitted

solana_lend_get_reserve read

Get Kamino reserve rates and liquidity

Read one token's reserve in the configured Kamino lending market (Main Market by default): the exact reserve address, its supply and borrow APYs as annual fractional decimals excluding incentive rewards, and its available liquidity as the underlying token's exact base-unit amount. Returns the market and reserve identities so later reads and execution stay in the same market; a mint the configured market has no reserve for fails ReserveUnavailable rather than answering from a different market. Rates are observations and move every slot — they are not promised returns. Read-only: nothing is deposited, withdrawn, signed, or sent.

ArgumentTypeRequiredDescription
mintstringyesBase58 mint of the token whose reserve to read in the configured market

solana_lend_simulate_deposit simulate

Simulate Kamino deposit

Simulate supplying an exact underlying amount into the one configured Kamino lending market without submitting anything. amount is the exact deposit in base units of the mint's underlying token — the same exact amount is encoded in the transaction, so nothing more can ever be spent. The executor re-validates the configured market and reserve against chain state, targets the signer's plain (vanilla) supply obligation — initializing it and its user metadata when absent, never touching borrowing, leverage or elevation-group obligations — and simulates exactly the transaction it would send, reporting compute units, program logs, the predicted collateral receipt at the read-time reserve exchange rate, and the rent and transaction fee the operation would pay. A missing or underfunded source token account, an unsupported mint extension, or any validation failure is reported without building or sending. Nothing is ever signed for submission, and a later execute re-plans and may differ. Use solana_lend_execute_deposit to send.

ArgumentTypeRequiredDescription
mintstringyesUnderlying token mint to supply in the configured Kamino market
amountstringyesExact underlying amount to deposit, in base units as a positive integer string

solana_lend_simulate_withdraw simulate

Simulate Kamino withdrawal

Simulate redeeming collateral for a target amount of underlying token base units from the signer's plain Kamino supply obligation. The target selects fixed receipt units; output is estimated at the read-time exchange rate, NOT an on-chain minimum. Reject targets that cannot be predicted exactly at that rate or exceed position/liquidity. Does not submit.

ArgumentTypeRequiredDescription
mintstringyesUnderlying token mint in the configured Kamino market
amountstringyesTarget underlying base units at the read-time rate. Redemption encodes fixed collateral units; actual underlying output can differ, with no on-chain minimum

liquidity 9 tools

solana_liquidity_execute_close_position execute

Close a liquidity position

Close an emptied concentrated-liquidity position and reclaim its rent. raydium (CLMM) refuses while any liquidity, unclaimed fee, or unclaimed reward remains, and burns the position NFT. meteora (DLMM) refuses while any liquidity share remains, so remove them with the withdraw tool first. A meteora position is the PositionV2 account, not an NFT. Supported venues: point reads orca, raydium and meteora, deposits orca, raydium and meteora, withdrawals orca, raydium and meteora, owner enumeration orca, raydium and meteora; opens and closes raydium and an empty meteora position. Submits and waits for confirmation; simulates the exact transaction first unless skipSimulation is true. Use solana_liquidity_simulate_close_position to preview.

ArgumentTypeRequiredDescription
protocolorca | meteora | raydiumyesLiquidity protocol. raydium (CLMM) and meteora (DLMM) can close an emptied position; orca fails before any network access
positionstringyesProtocol position account to close. On meteora this is the PositionV2 account, never an NFT mint and never the pool
skipSimulationbooleannoSkip the pre-send simulation only default false

solana_liquidity_execute_deposit execute

Execute position deposit

Add liquidity to one existing Orca, Raydium, or Meteora position from the configured signer and wait for confirmation. Signs and submits a real transaction that moves funds. amountA and amountB are maximum spends in the pool's canonical mint order. Orca and Raydium encode on-chain spend bounds at the quote plus slippage, capped by the budgets. Meteora signs those amounts as the caps and spreads them across the position's existing bins only; if the active bin moved more than ceil(maxSlippageBps / binStep) bins the deposit is refused before send, and that check is not on chain. position is the Whirlpool PDA, the Raydium personal position, or the Meteora PositionV2 account, never an NFT mint. The signer holds the Orca or Raydium position NFT, or owns the Meteora position. New positions and bin-range changes are refused. A missing funding account on a side the quote needs nothing from is created idempotently. Simulates the exact transaction first and sends nothing when simulation, validation, or the blockhash lifetime fails; skipSimulation bypasses only the simulation, never validation. Use solana_liquidity_simulate_deposit to preview. Supported venues: point reads orca, raydium and meteora, deposits orca, raydium and meteora, withdrawals orca, raydium and meteora, owner enumeration orca, raydium and meteora; opens and closes raydium and an empty meteora position.

ArgumentTypeRequiredDescription
protocolorca | meteora | raydiumyesLiquidity protocol. orca (Whirlpools), raydium (CLMM), and meteora (DLMM) deposits are implemented. Opens and closes cover raydium and an empty meteora position
poolstringyesPool address the position belongs to; the deposit fails typed when the position references a different pool
positionstringyesExisting protocol position account: the Whirlpool position PDA, the Raydium personal position, or the Meteora PositionV2 account. Never an NFT mint and never the pool. New positions and bin-range changes are refused
amountAstringyesMaximum token A spend, in base units of the pool's canonical token A mint; unused funds stay in the wallet
amountBstringyesMaximum token B spend, in base units of the pool's canonical token B mint; unused funds stay in the wallet
maxSlippageBpsintegernoPrice-movement tolerance in basis points, 0..9999. Default 50 (0.5%). Orca and Raydium encode on-chain spend bounds at the quote plus this tolerance, capped by the budgets. Meteora caps spend at the signed token amounts and refuses before send if the active bin moved more than ceil(maxSlippageBps / binStep) bins; that drift check is not on chain default 50 · 0 to 9999
wrapSolbooleannoWrap exactly the native SOL the quote is short on a wSOL side, in this same transaction, and unwrap the remainder when this transaction created the account. Leave false when the wSOL side is already funded default false
skipSimulationbooleannoSkip the pre-send simulation of the exact transaction. Defaults to false; bypassing only skips simulation, never validation default false

solana_liquidity_execute_open_position execute

Open a liquidity position

Open a new concentrated-liquidity position at a range you choose. raydium (CLMM): tickLower and tickUpper must each be a multiple of the pool's tick spacing; an unaligned range is refused rather than rounded. amountA and amountB are maximum spends in base units, never targets. The position NFT is generated for this transaction. meteora (DLMM): pass lowerBinId and width. Width must be an integer from 1 to 70; an illegal width is refused, never clamped. The open is empty (initialize_position); add liquidity afterwards with the deposit tools. The position account is a fresh keypair and its pubkey is returned on the execute result. Rent is the signer's and is reclaimed by closing. Supported venues: point reads orca, raydium and meteora, deposits orca, raydium and meteora, withdrawals orca, raydium and meteora, owner enumeration orca, raydium and meteora; opens and closes raydium and an empty meteora position. Submits and waits for confirmation; simulates the exact transaction first unless skipSimulation is true. Use solana_liquidity_simulate_open_position to preview.

ArgumentTypeRequiredDescription
protocolorca | meteora | raydiumyesLiquidity protocol. raydium (CLMM) and meteora (DLMM) can open a position; orca fails before any network access
poolstringyesPool to open the position in. On meteora this is the LbPair address
tickLowerintegernoRaydium lower tick, inclusive. Must be a multiple of the pool's tick spacing -9007199254740991 to 9007199254740991
tickUpperintegernoRaydium upper tick, exclusive. Must be a multiple of the pool's tick spacing -9007199254740991 to 9007199254740991
lowerBinIdintegernoMeteora lower bin id, inclusive. The caller chooses it; solOS does not -9007199254740991 to 9007199254740991
widthintegernoMeteora position width in bins, an integer from 1 to 70. An illegal width is refused, never clamped -9007199254740991 to 9007199254740991
amountAstringnoRaydium maximum token A spend in base units; never a target
amountBstringnoRaydium maximum token B spend in base units; never a target
maxSlippageBpsintegernoRaydium price-movement tolerance in basis points. Ignored by an empty meteora open default 50 · 0 to 9999
wrapSolbooleannoWrap exactly the native SOL the quote is short on a wSOL side, in this same transaction, and unwrap the remainder when this transaction created the account. Leave false when the wSOL side is already funded default false
skipSimulationbooleannoSkip the pre-send simulation only default false

solana_liquidity_execute_withdraw execute

Execute position withdrawal

Remove liquidity from one existing Orca, Raydium, or Meteora position to the configured signer wallet and wait for confirmation. Signs and submits a real transaction that moves funds. The wallet receives token A and token B principal quoted from the position's liquidity at the current price. Fees and rewards are not claimed, so Meteora fee balances stay on the position. bps is the fraction of CURRENT liquidity to remove, 1..10000. Meteora applies that bps independently to each occupied bin; 10000 removes every share on those bins. Fractional shares round down, and a removal that computes to zero liquidity is rejected. Minimum receipts are floor(quote * (10000 - maxSlippageBps) / 10000) and are encoded on chain, so a move that would pay a side under its minimum aborts. Meteora also refuses on chain if the active bin moves more than ceil(maxSlippageBps / binStep) bins, and it does not change the position's bin range. position is the Whirlpool PDA, the Raydium personal position, or the Meteora PositionV2 account, never an NFT mint. The position is never closed. If a receiving token account for a side the position owes does not exist yet, an idempotent create for it is prepended (its rent is distinct from removed principal). Simulates the exact transaction first and sends nothing when simulation, validation, or the blockhash lifetime fails; skipSimulation bypasses only the simulation, never validation. Never re-sends after an ambiguous submission. Use solana_liquidity_simulate_withdraw to preview without sending. Supported venues: point reads orca, raydium and meteora, deposits orca, raydium and meteora, withdrawals orca, raydium and meteora, owner enumeration orca, raydium and meteora; opens and closes raydium and an empty meteora position.

ArgumentTypeRequiredDescription
protocolorca | meteora | raydiumyesLiquidity protocol. orca (Whirlpools), raydium (CLMM), and meteora (DLMM) withdrawals are implemented. Opens and closes cover raydium and an empty meteora position
positionstringyesProtocol position account: the Whirlpool PDA, the Raydium personal position, or the Meteora PositionV2 account (its owner field). Never an NFT mint and never the pool. The position is not closed and its range is not changed
bpsintegeryesFraction of the position's CURRENT liquidity to remove, in basis points: 1..10000. Meteora applies it independently to each occupied bin. 10000 removes every share. Fractional shares round down; a removal that computes to zero liquidity is rejected 1 to 10000
maxSlippageBpsintegernoPrice-movement tolerance in basis points, 0..9999. Default 50 (0.5%). Minimum receipts are floor(quoted principal * (10000 - tolerance) / 10000) and are encoded on chain. The quote is liquidity principal only: Meteora does not claim fees or rewards in this transaction. Meteora also refuses on chain if the active bin moves more than ceil(maxSlippageBps / binStep) bins default 50 · 0 to 9999
skipSimulationbooleannoSkip the pre-send simulation of the exact transaction. Defaults to false; bypassing only skips simulation, never validation default false

solana_liquidity_get_position read

Get a concentrated-liquidity LP position

Read one existing concentrated-liquidity LP position on orca (Whirlpools), raydium (CLMM), or meteora (DLMM): its raw liquidity and the underlying token A and token B amounts in base units with the mints' decimals. position is the protocol position account (the Whirlpool position PDA on orca, the PersonalPositionState PDA on raydium, the PositionV2 account on meteora), never an NFT mint and never the pool. On orca and raydium, ownership is custody of the position NFT. On meteora, the position account's owner field must equal the requested owner. A missing, foreign-owned, or corrupt position is a typed error, never a fabricated zero; an owned zero-liquidity position is a successful zero read. owner defaults to the configured signer, so any third party's position can be read by naming its owner. valueUsd is always null. Deposits and withdrawals stay inside the existing bins. Read-only: nothing is deposited, withdrawn, claimed, or signed. Supported venues: point reads orca, raydium and meteora, deposits orca, raydium and meteora, withdrawals orca, raydium and meteora, owner enumeration orca, raydium and meteora; opens and closes raydium and an empty meteora position.

ArgumentTypeRequiredDescription
protocolorca | meteora | raydiumyesLiquidity protocol. orca (Whirlpools), raydium (CLMM), and meteora (DLMM) are implemented for this read. Deposits and withdrawals stay inside the position's existing bins. Opens and closes cover raydium and an empty meteora position
positionstringyesProtocol position-account address: the Whirlpool position PDA on orca, the PersonalPositionState PDA on raydium, the PositionV2 account on meteora. Never an NFT mint and never the pool
ownerstringnoOwner to prove against. Orca and Raydium require custody of the position NFT; Meteora matches the position account's owner field. Defaults to the configured signer wallet

solana_liquidity_simulate_close_position simulate

Simulate closing a liquidity position

Close an emptied concentrated-liquidity position and reclaim its rent. raydium (CLMM) refuses while any liquidity, unclaimed fee, or unclaimed reward remains, and burns the position NFT. meteora (DLMM) refuses while any liquidity share remains, so remove them with the withdraw tool first. A meteora position is the PositionV2 account, not an NFT. Supported venues: point reads orca, raydium and meteora, deposits orca, raydium and meteora, withdrawals orca, raydium and meteora, owner enumeration orca, raydium and meteora; opens and closes raydium and an empty meteora position. Simulates without submitting anything; use solana_liquidity_execute_close_position to send.

ArgumentTypeRequiredDescription
protocolorca | meteora | raydiumyesLiquidity protocol. raydium (CLMM) and meteora (DLMM) can close an emptied position; orca fails before any network access
positionstringyesProtocol position account to close. On meteora this is the PositionV2 account, never an NFT mint and never the pool

solana_liquidity_simulate_deposit simulate

Simulate position deposit

Simulate adding liquidity to one existing Orca, Raydium, or Meteora position without submitting anything. amountA and amountB are maximum spends in the pool's canonical mint order. Orca and Raydium encode on-chain spend bounds at the quote plus slippage, capped by the budgets. Meteora signs those amounts as the caps and spreads them across the position's existing bins only; if the active bin moved more than ceil(maxSlippageBps / binStep) bins the deposit is refused before send, and that check is not on chain. position is the Whirlpool PDA, the Raydium personal position, or the Meteora PositionV2 account, never an NFT mint. The signer holds the Orca or Raydium position NFT, or owns the Meteora position. New positions and bin-range changes are refused. A missing funding account on a side the quote needs nothing from is created idempotently. The executor builds and simulates exactly the transaction it would send. Nothing is sent. Use solana_liquidity_execute_deposit to send. Supported venues: point reads orca, raydium and meteora, deposits orca, raydium and meteora, withdrawals orca, raydium and meteora, owner enumeration orca, raydium and meteora; opens and closes raydium and an empty meteora position.

ArgumentTypeRequiredDescription
protocolorca | meteora | raydiumyesLiquidity protocol. orca (Whirlpools), raydium (CLMM), and meteora (DLMM) deposits are implemented. Opens and closes cover raydium and an empty meteora position
poolstringyesPool address the position belongs to; the deposit fails typed when the position references a different pool
positionstringyesExisting protocol position account: the Whirlpool position PDA, the Raydium personal position, or the Meteora PositionV2 account. Never an NFT mint and never the pool. New positions and bin-range changes are refused
amountAstringyesMaximum token A spend, in base units of the pool's canonical token A mint; unused funds stay in the wallet
amountBstringyesMaximum token B spend, in base units of the pool's canonical token B mint; unused funds stay in the wallet
maxSlippageBpsintegernoPrice-movement tolerance in basis points, 0..9999. Default 50 (0.5%). Orca and Raydium encode on-chain spend bounds at the quote plus this tolerance, capped by the budgets. Meteora caps spend at the signed token amounts and refuses before send if the active bin moved more than ceil(maxSlippageBps / binStep) bins; that drift check is not on chain default 50 · 0 to 9999
wrapSolbooleannoWrap exactly the native SOL the quote is short on a wSOL side, in this same transaction, and unwrap the remainder when this transaction created the account. Leave false when the wSOL side is already funded default false

solana_liquidity_simulate_open_position simulate

Simulate opening a liquidity position

Open a new concentrated-liquidity position at a range you choose. raydium (CLMM): tickLower and tickUpper must each be a multiple of the pool's tick spacing; an unaligned range is refused rather than rounded. amountA and amountB are maximum spends in base units, never targets. The position NFT is generated for this transaction. meteora (DLMM): pass lowerBinId and width. Width must be an integer from 1 to 70; an illegal width is refused, never clamped. The open is empty (initialize_position); add liquidity afterwards with the deposit tools. The position account is a fresh keypair and its pubkey is returned on the execute result. Rent is the signer's and is reclaimed by closing. Supported venues: point reads orca, raydium and meteora, deposits orca, raydium and meteora, withdrawals orca, raydium and meteora, owner enumeration orca, raydium and meteora; opens and closes raydium and an empty meteora position. Simulates without submitting anything; use solana_liquidity_execute_open_position to send.

ArgumentTypeRequiredDescription
protocolorca | meteora | raydiumyesLiquidity protocol. raydium (CLMM) and meteora (DLMM) can open a position; orca fails before any network access
poolstringyesPool to open the position in. On meteora this is the LbPair address
tickLowerintegernoRaydium lower tick, inclusive. Must be a multiple of the pool's tick spacing -9007199254740991 to 9007199254740991
tickUpperintegernoRaydium upper tick, exclusive. Must be a multiple of the pool's tick spacing -9007199254740991 to 9007199254740991
lowerBinIdintegernoMeteora lower bin id, inclusive. The caller chooses it; solOS does not -9007199254740991 to 9007199254740991
widthintegernoMeteora position width in bins, an integer from 1 to 70. An illegal width is refused, never clamped -9007199254740991 to 9007199254740991
amountAstringnoRaydium maximum token A spend in base units; never a target
amountBstringnoRaydium maximum token B spend in base units; never a target
maxSlippageBpsintegernoRaydium price-movement tolerance in basis points. Ignored by an empty meteora open default 50 · 0 to 9999
wrapSolbooleannoWrap exactly the native SOL the quote is short on a wSOL side, in this same transaction, and unwrap the remainder when this transaction created the account. Leave false when the wSOL side is already funded default false

solana_liquidity_simulate_withdraw simulate

Simulate position withdrawal

Simulate removing liquidity from one existing Orca, Raydium, or Meteora position without submitting anything. The wallet would receive token A and token B principal quoted from the position's liquidity at the current price. Fees and rewards are not claimed, so a Meteora withdrawal does not pay fee balances. bps is the fraction of CURRENT liquidity to remove, 1..10000. Meteora applies that bps independently to each occupied bin; 10000 removes every share on those bins. Fractional shares round down, and a removal that computes to zero liquidity is rejected. Minimum receipts are floor(quote * (10000 - maxSlippageBps) / 10000) and are encoded on chain. Meteora also refuses on chain if the active bin moves more than ceil(maxSlippageBps / binStep) bins, and it does not change the position's bin range. position is the Whirlpool PDA, the Raydium personal position, or the Meteora PositionV2 account, never an NFT mint. The position is never closed. If a receiving token account for a side the position owes does not exist yet, an idempotent create for it is prepended (its rent is distinct from removed principal). The executor builds and simulates exactly the transaction it would send. Nothing is sent. Use solana_liquidity_execute_withdraw to send. Supported venues: point reads orca, raydium and meteora, deposits orca, raydium and meteora, withdrawals orca, raydium and meteora, owner enumeration orca, raydium and meteora; opens and closes raydium and an empty meteora position.

ArgumentTypeRequiredDescription
protocolorca | meteora | raydiumyesLiquidity protocol. orca (Whirlpools), raydium (CLMM), and meteora (DLMM) withdrawals are implemented. Opens and closes cover raydium and an empty meteora position
positionstringyesProtocol position account: the Whirlpool PDA, the Raydium personal position, or the Meteora PositionV2 account (its owner field). Never an NFT mint and never the pool. The position is not closed and its range is not changed
bpsintegeryesFraction of the position's CURRENT liquidity to remove, in basis points: 1..10000. Meteora applies it independently to each occupied bin. 10000 removes every share. Fractional shares round down; a removal that computes to zero liquidity is rejected 1 to 10000
maxSlippageBpsintegernoPrice-movement tolerance in basis points, 0..9999. Default 50 (0.5%). Minimum receipts are floor(quoted principal * (10000 - tolerance) / 10000) and are encoded on chain. The quote is liquidity principal only: Meteora does not claim fees or rewards in this transaction. Meteora also refuses on chain if the active bin moves more than ceil(maxSlippageBps / binStep) bins default 50 · 0 to 9999

market 6 tools

solana_market_ask_iris read

Ask Iris about the market

Ask Iris for current market context, catalysts, and risks behind one market question, answered from live social and market intelligence. Every call spends Elfa API credits and the response reports how many. Links appear only when the provider includes them.

ArgumentTypeRequiredDescription
questionstringyesOne market question, e.g. what changed for SOL in the last 24 hours

solana_market_get_event_summary read

Summarize market events

Summarize recent events matching keywords, with source links supplied by Elfa. Costs 5 Elfa credits per call, available on Free. May take up to 180 seconds or return no summaries for a quiet window.

ArgumentTypeRequiredDescription
keywordsstring[]yesOne to ten search terms, e.g. [Solana, SOL]
timeWindow30m | 1h | 4h | 24h | 7d | 30dnoLookback window; defaults to 24h default "24h"
searchTypeand | ornoMatch all terms (and) or any term (or) default "or"

solana_market_get_price read

Get token USD price

Get the current USD price of one token mint from Jupiter's price feed. Returns the price as an exact decimal string and the local receipt time. A mint Jupiter does not price is reported as PriceUnavailable, never as a zero price.

ArgumentTypeRequiredDescription
mintstringyesToken mint address to price in USD

solana_market_get_token read

Get token metadata

Read verified on-chain metadata for one token mint: name, symbol, decimals, and logoUri. Covers standard SPL mints with Metaplex metadata and Token-2022 mints with metadata extensions or a metadata pointer. An address that does not exist or is not a mint account fails UnknownToken; a valid mint whose metadata is absent or unreadable fails TokenMetadataUnavailable, so the ticker is never invented. Wrapped SOL and USDC fall back to their canonical names only after the mint account, owner, and decimals were verified on chain. logoUri is null unless a real logo URI lives on chain; the metadata JSON uri is not a logo and no off-chain URL is ever fetched.

ArgumentTypeRequiredDescription
mintstringyesToken mint address to read on-chain metadata for

solana_market_get_token_news read

Find token news

Find recent news-source posts about CoinGecko coin IDs. Returns X post links, timestamps and engagement, not article or tweet text. Consumes Elfa API credits, available on Free.

ArgumentTypeRequiredDescription
coinIdsstring[]yesCoinGecko coin IDs, e.g. [solana]; not tickers or mint addresses
timeWindow30m | 1h | 4h | 24h | 7d | 30dnoLookback window; defaults to 24h default "24h"
pageintegernoPage number, starting at 1 default 1 · 1 to 9007199254740991
pageSizeintegernoResults per page, 1–50 default 10 · 1 to 50

perp 12 tools

solana_perp_execute_close execute

Submit a reduce-only Phoenix IOC close

Submit one reduce-only IOC close for the current signed position; confirmation is not proof it filled. Read residual exposure.

ArgumentTypeRequiredDescription
marketstringyesPhoenix perpetual market symbol, e.g. SOL
limitPriceUsdstringyesFinite minimum sell or maximum buy price in USD per base token

solana_perp_execute_deposit_collateral execute

Deposit USDC into Phoenix collateral

Deposit exact USDC input from the current wallet, then report actual balance changes. Output is not guaranteed; never opens an order.

ArgumentTypeRequiredDescription
amountstringyesExact USDC base units to debit from the configured wallet; output is estimated, not guaranteed

solana_perp_execute_onboard_trader execute

Enroll current wallet with Phoenix

Explicitly register and activate the current wallet's Phoenix trader after simulation. Does not fund the trader or open a position.

No arguments.

solana_perp_execute_open execute

Submit a bounded Phoenix IOC open

Submit a one-shot Phoenix Perps IOC open after preflight; confirmation does not guarantee a fill. Fund and verify the close path first.

ArgumentTypeRequiredDescription
marketstringyesPhoenix perpetual market symbol, e.g. SOL
sidelong | shortyesLong to buy or short to sell
notionalUsdstringyesMaximum order notional in integer 1e6 USD units
maxLeverageintegeryesMaximum requested leverage (1 through 100) 1 to 100
limitPriceUsdstringyesFinite maximum buy or minimum sell price in USD per base token

solana_perp_execute_withdraw_collateral execute

Withdraw Phoenix collateral to your wallet

Remove an exact Phoenix-token input only when all markets are flat and settled, then report actual wallet USDC receipt (not guaranteed).

ArgumentTypeRequiredDescription
amountstringyesExact Phoenix collateral-token base units to debit; wallet USDC receipt is estimated, not guaranteed

solana_perp_get_onboarding_status read

Check Phoenix trader enrollment

Check whether the current wallet's Phoenix trader can place orders and deposit collateral.

No arguments.

solana_perp_get_position read

Get Phoenix perp position

Read one Phoenix perp position with an explicit long/short/flat side, absolute base exposure, and the trader account's signed USD equity (null when it cannot be justified). Flat means exactly zero; a valid market with no account is a zero-position success, not an error.

ArgumentTypeRequiredDescription
marketstringyesPerp market symbol, e.g. SOL or SOL-PERP (normalized to the exchange symbol)
ownerstringnoTrader address to read. Defaults to the configured signer wallet

solana_perp_simulate_close simulate

Simulate a reduce-only Phoenix IOC close

Preview closing an existing Phoenix Perps position with a finite limit, without sending an order.

ArgumentTypeRequiredDescription
marketstringyesPhoenix perpetual market symbol, e.g. SOL
limitPriceUsdstringyesFinite minimum sell or maximum buy price in USD per base token

solana_perp_simulate_deposit_collateral simulate

Simulate funding Phoenix collateral

Preview an explicit fixed-input USDC deposit for the current Phoenix trader. The credited amount is only an estimate.

ArgumentTypeRequiredDescription
amountstringyesExact USDC base units to debit from the configured wallet; output is estimated, not guaranteed

solana_perp_simulate_onboard_trader simulate

Simulate Phoenix trader enrollment

Preview registration and trading activation of the current wallet's default Phoenix trader without submitting.

No arguments.

solana_perp_simulate_open simulate

Simulate a bounded Phoenix IOC open

Preview a price- and leverage-bounded Phoenix Perps position open without sending an order or funding collateral.

ArgumentTypeRequiredDescription
marketstringyesPhoenix perpetual market symbol, e.g. SOL
sidelong | shortyesLong to buy or short to sell
notionalUsdstringyesMaximum order notional in integer 1e6 USD units
maxLeverageintegeryesMaximum requested leverage (1 through 100) 1 to 100
limitPriceUsdstringyesFinite maximum buy or minimum sell price in USD per base token

solana_perp_simulate_withdraw_collateral simulate

Simulate Phoenix collateral removal

Preview an explicit fixed Phoenix-token input withdrawal to the current wallet's USDC account, after all-market risk checks.

ArgumentTypeRequiredDescription
amountstringyesExact Phoenix collateral-token base units to debit; wallet USDC receipt is estimated, not guaranteed

portfolio 1 tool

solana_portfolio_get_state read

Get portfolio state

Read one owner's supported-portfolio state: cash (native SOL and recognized stablecoins), wallet token, lending, LP and perp positions, one equity observation per trader account, and a USD valuation when every nonzero holding and account is priced. A supported-assets view, never a claim of full net worth; unknown prices keep valuation null instead of inventing numbers. Defaults to the configured signer when no owner is given.

ArgumentTypeRequiredDescription
ownerstringnoOwner to read. Omit to use the configured signer's address.

swap 3 tools

solana_swap_execute_swap execute

Execute swap

Execute a swap: sell an amount of one mint for another on Jupiter from the configured signer wallet and wait for confirmation. Signs and submits a real transaction that moves funds. A fresh Jupiter build is fetched for this call — a quote from an earlier read or simulate is never reused, so prices may differ between calls. Simulates the exact transaction first and sends nothing when simulation, validation, or the blockhash lifetime fails; skipSimulation bypasses the simulation and with it the measured spend bound. Use solana_swap_simulate_swap to preview without sending. Requires JUPITER_API_KEY.

ArgumentTypeRequiredDescription
inputMintstringyesMint of the token to sell
outputMintstringyesMint of the token to buy
amountstringyesInput amount in base units of inputMint, as an exact decimal string
slippageBpsintegernoMax slippage in basis points. Default 50 (0.5%). default 50 · 0 to 10000
skipSimulationbooleannoSkip the pre-send simulation of the exact transaction. Defaults to false. Skipping also removes the measured spend bound, which is taken from that simulation (ADR-0024); validation still runs. default false

solana_swap_get_quote read

Get indicative swap quote

Get an indicative Jupiter swap quote for selling an amount of one mint for another: exact input and output amounts in base units, the worst-case minimum output after slippage, price impact as a decimal ratio, the routed hops, and a short local expiry. Routing is pinned to Jupiter's Metis router. Nothing is sent or signed — a later execution re-quotes. Requires JUPITER_API_KEY in the environment.

ArgumentTypeRequiredDescription
inputMintstringyesMint of the token to sell
outputMintstringyesMint of the token to buy
amountstringyesInput amount in base units of inputMint, as an exact decimal string
slippageBpsintegernoMax slippage in basis points. Default 50 (0.5%). default 50 · 0 to 10000

solana_swap_simulate_swap simulate

Simulate swap

Simulate selling an amount of one mint for another on Jupiter without submitting anything. The executor builds a fresh transaction for the configured signer and simulates exactly that transaction, reporting compute units and program logs. Nothing is ever sent or signed for submission, and a later execute builds its own fresh quote that may differ. Requires JUPITER_API_KEY in the environment.

ArgumentTypeRequiredDescription
inputMintstringyesMint of the token to sell
outputMintstringyesMint of the token to buy
amountstringyesInput amount in base units of inputMint, as an exact decimal string
slippageBpsintegernoMax slippage in basis points. Default 50 (0.5%). default 50 · 0 to 10000

transfer 2 tools

solana_transfer_execute_sol execute

Send SOL

Send SOL from the configured signer wallet to a recipient address and wait for confirmation. Signs and submits a real transaction that moves funds. Simulates first unless skipSimulation is true. Use solana_transfer_simulate_sol to preview without sending.

ArgumentTypeRequiredDescription
tostringyesRecipient wallet address
amountSolnumber | stringyesAmount of SOL to send, e.g. 0.1
skipSimulationbooleannoSend without a prior simulateTransaction. Default false. default false

solana_transfer_simulate_sol simulate

Simulate SOL transfer

Simulate sending SOL from the configured signer wallet to a recipient without submitting anything. Returns compute units and program logs. Use to preview or validate a transfer before solana_transfer_execute_sol.

ArgumentTypeRequiredDescription
tostringyesRecipient wallet address
amountSolnumber | stringyesAmount of SOL to send, e.g. 0.1
skipSimulationbooleannoSend without a prior simulateTransaction. Default false. default false

wallet 4 tools

solana_wallet_execute_close_token_account execute

Close a token account

Close one of the wallet's token accounts and wait for confirmation: reclaim the rent of an empty account, or unwrap wrapped SOL (wSOL) back into native SOL. Signs and submits a real transaction. account is the token account address, as solana_wallet_get_balance lists it. It must be a Token or Token-2022 account the configured signer owns, not frozen, with no other close authority, and empty unless it is the wrapped-SOL account, whose whole balance returns as native SOL. Every lamport it holds goes to the signer. Simulates the exact transaction first and sends nothing when validation, simulation or the blockhash lifetime fails; skipSimulation bypasses only the simulation. Never re-sends after an ambiguous submission; the signature is reported in the structured failure. Use solana_wallet_simulate_close_token_account to preview.

ArgumentTypeRequiredDescription
accountstringyesA token account the signer owns. It must be empty, except the wrapped-SOL account: closing that unwraps its whole balance to native SOL
skipSimulationbooleannoSkip the pre-send simulation of the exact transaction; never skip validation default false

solana_wallet_get_address read

Get signer address

Get the public address and backend type of the wallet this server signs with. Use to know which account will pay fees and send funds before transferring or swapping.

No arguments.

solana_wallet_get_balance read

Get wallet balance

Get the SOL balance and all SPL token balances (Token and Token-2022) of a Solana wallet. Defaults to the configured signer's wallet when no owner is given. Use to check funds, holdings, or portfolio.

ArgumentTypeRequiredDescription
ownerstringnoWallet address to inspect. Omit to use the configured signer's address.

solana_wallet_simulate_close_token_account simulate

Simulate closing a token account

Preview closing one of the wallet's token accounts to get its rent back, or to unwrap wrapped SOL (wSOL) into native SOL, without sending anything. account is the token account address, as solana_wallet_get_balance lists it. The executor reads the account on chain: it must be a Token or Token-2022 account the configured signer owns, not frozen, with no other close authority, and empty unless it is the wrapped-SOL account, whose whole balance is unwrapped. Reports the mint, the token program, the lamports the close returns and the lamports unwrapped, and simulates exactly the transaction it would send. Anything it may not close is refused before building. Use solana_wallet_execute_close_token_account to send.

ArgumentTypeRequiredDescription
accountstringyesA token account the signer owns. It must be empty, except the wrapped-SOL account: closing that unwraps its whole balance to native SOL