# ZeroK, privacy primitive for Solana (for LLMs and AI agents) ZeroK lets an agent or app send SOL PRIVATELY and GASLESS on Solana. You shield any amount of SOL into one shared shielded vault, then send to any address with no on chain link back to you. A relayer pays the network fee, so the recipient needs zero SOL. ZeroK is a tool you plug into, not an agent itself. Live mainnet program: HVcTokFF4rwvcU7sC7GjS317CSf7QDgfCvW7edijKS2v Model: one shared shielded vault (single vault). Deposit ANY amount, from 0.01 SOL. Amounts go in steps of 0.01 SOL. send() handles any amount up to your balance, including large or awkward amounts, splitting across notes automatically. Fee: 0.3% per note, minimum 0.002 SOL. Spending is gasless (the relayer pays). ## Two ways to integrate ### MCP server (best for AI agents) Run: npx -y zerok-mcp (stdio MCP server) Env: SOLANA_KEYPAIR= (required), ZEROK_NETWORK=mainnet-beta|devnet (default mainnet-beta), HELIUS_API_KEY (recommended, for recover and reliability), ZEROK_RPC (optional full URL), ZEROK_RELAY (optional), ZEROK_NOTES_DIR (optional). Tools (full parity with the SDK): - zerok_address() -> { address } - zerok_balance() -> { balanceSol, notes } - zerok_deposit({ amount_sol }) -> deposit confirmation - zerok_send({ amount_sol, recipient }) -> { sentSol, feeSol, signatures } - zerok_recover() -> { recovered, balanceSol } (reattach to funds from chain on a new machine or restart) ### SDK (Node, for code and apps), npm install zerok-agent const { Keypair } = require('@solana/web3.js'); const { ZeroK } = require('zerok-agent'); const zk = new ZeroK({ wallet }); // network defaults to mainnet-beta await zk.recover(); // reattach to funds from chain (new machine or restart) await zk.deposit(1.37); // shield any amount (from 0.01 SOL) as one private note await zk.send(0.25, 'RecipientAddress'); // private and gasless zk.balance(); // { balanceSol, notes } zk.address(); // base58 pubkey ## Key facts for correct usage - The funding wallet must hold the SOL being deposited. The recipient needs nothing. - Your funds persist automatically and are encrypted to your wallet, so the same wallet recovers the same funds anywhere. Back up only the keypair. - For recover() and volume, set HELIUS_API_KEY (memo supporting RPC). A public RPC fallback is used otherwise. - send() throws a clear error if your private balance cannot cover the requested amount. - The keypair stays local. It is never sent to the relay or any server. Docs: https://docs.zerok.app/agents