{"name":"token_account","oldName":"find_ata","title":"Where to send a token","category":"tokens","useWhen":"Run before sending a token to someone. Tokens go to the recipient's token account, not their wallet, and models can't work this address out in their heads.","benefit":{"kind":"money","text":"Works out the token account with the token's real program and prices creating it, so tokens aren't sent to a made-up or wrong-program address."},"description":"Works out the recipient's token account (ATA) for a wallet and token using the token's real program, checks whether it exists, and prices creating it if not.","price":"$0.01","priceText":"25 free calls a day, then $0.01 USDC per call (x402)","http":{"method":"POST","path":"/api/tools/token_account","body":"JSON object with the inputs below"},"mcp":{"method":"tools/call","name":"token_account"},"inputs":[{"name":"wallet","type":"string (base58 address)","required":true,"lookingFor":"The wallet that will own the token account (usually the recipient).","whereToGet":"The recipient's wallet address."},{"name":"token","type":"string (token address)","required":true,"lookingFor":"The token's address.","whereToGet":"From find_token or tokens. Not a ticker."},{"name":"network","type":"\"mainnet-beta\" | \"devnet\"","required":false,"lookingFor":"Which Solana network to read. Default \"mainnet-beta\" (real money).","whereToGet":"Leave it out for mainnet. Use \"devnet\" only for test wallets."}],"outputs":[{"field":"address","type":"string","is":"The recipient's token account for this token. Send the tokens here.","howWorkedOut":"getAssociatedTokenAddressSync(token, wallet) with the token's own program."},{"field":"token_program","type":"\"spl-token\" | \"token-2022\"","is":"The token program the transfer must use.","howWorkedOut":"The program that owns the token."},{"field":"exists","type":"boolean","is":"Whether the account already exists on chain.","howWorkedOut":"Looked up on chain."},{"field":"balance","type":"string | null","is":"What the account holds now, when it exists.","howWorkedOut":"Token amount with the token's decimals."},{"field":"decimals","type":"number","is":"The token's decimals.","howWorkedOut":"From the token."},{"field":"create_cost_lamports","type":"string | null","is":"The SOL deposit (in lamports) to create the account when it doesn't exist. You get it back if the account is closed later.","howWorkedOut":"getMinimumBalanceForRentExemption for the account size, counting the token's Token-2022 extensions."},{"field":"create_cost_sol","type":"string | null","is":"The same deposit in SOL.","howWorkedOut":"create_cost_lamports / 10^9."},{"field":"owner_is_program","type":"boolean","is":"True when the wallet is a program-derived address, not a normal wallet. Fine for protocols, odd for people.","howWorkedOut":"The address is off the ed25519 curve."}],"notes":[],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"wallet":{"type":"string"},"token":{"type":"string"},"network":{"default":"mainnet-beta","type":"string","enum":["mainnet-beta","devnet"]}},"required":["wallet","token"]}}