{"serverId":"mcp-registry/io.github.firstkeyhq/firstkey-mcp","tools":[{"name":"check_cycles","fixed":{"name":"check_cycles","description":"Read an ICP principal's cycles balance on the cycles ledger.","inputSchema":{"type":"object","required":["principal"],"properties":{"principal":{"type":"string","description":"ICP principal (text form)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":69,"tokensAfter":69},{"name":"create_wallet","fixed":{"name":"create_wallet","description":"Generate a fresh Ed25519 wallet for an AI agent: returns the ICP principal and the PKCS#8 PEM private key. The private key is returned exactly once over this call and is never stored anywhere. No signup, no on-chain registration — the keypair IS the wallet.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":97,"tokensAfter":97},{"name":"deploy_site","fixed":{"name":"deploy_site","description":"Deploy a static website for an agent: creates a canister on the Internet Computer, installs the FirstKey static host, uploads every file, and returns the live https URL. The agent is added as a controller of its site canister. One free deploy per agent principal, funded from the FirstKey deploy pool; files must fit in one call (total under ~1.4 MB decoded) — use deploy_upload_chunk for larger files.","inputSchema":{"type":"object","required":["agent","files"],"properties":{"agent":{"type":"string","description":"The agent's ICP principal — becomes a controller of the site canister."},"files":{"type":"array","items":{"type":"object","required":["path","content_base64"],"properties":{"path":{"type":"string","description":"Site path, e.g. index.html or css/main.css"},"content_type":{"type":"string","description":"Optional MIME type; guessed from extension when omitted."},"content_base64":{"type":"string","description":"File bytes, base64-encoded."}}},"description":"Files to publish. Include at least index.html."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":296,"tokensAfter":296},{"name":"deploy_upload_chunk","fixed":{"name":"deploy_upload_chunk","description":"Upload one chunk of a large file to an already-deployed agent site (for files that don't fit in a single deploy_site call). Chunks are appended in order; set is_last on the final chunk to publish the file.","inputSchema":{"type":"object","required":["agent","canister","path","chunk_index","chunk_base64","is_last"],"properties":{"path":{"type":"string","description":"Site path, e.g. assets/video.mp4"},"agent":{"type":"string","description":"The agent's ICP principal (must own the site)."},"is_last":{"type":"boolean","description":"True on the final chunk: assembles and publishes the file."},"canister":{"type":"string","description":"The site canister principal returned by deploy_site."},"chunk_index":{"type":"integer","description":"0-based chunk number. 0 starts a new upload for this path."},"total_bytes":{"type":"string","description":"Total file size in bytes, as a decimal string (only used on the first chunk)."},"chunk_base64":{"type":"string","description":"Chunk bytes, base64-encoded."},"content_type":{"type":"string","description":"MIME type (only used on the first chunk)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":319,"tokensAfter":319},{"name":"get_fuel_link","fixed":{"name":"get_fuel_link","description":"Get the FirstKey Fuel payment link for a principal: a human pays by card (Stripe) and cycles land in the agent's wallet — the sovereign refuel path when the free faucet grant or deploy pool is exhausted.","inputSchema":{"type":"object","required":["principal"],"properties":{"principal":{"type":"string","description":"The agent's ICP principal to refuel."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":111,"tokensAfter":111},{"name":"get_swap_quote","fixed":{"name":"get_swap_quote","description":"Get a live, read-only swap quote on ICPSwap (the deepest on-chain DEX on ICP): how much receive_token you would get for pay_amount of pay_token. No tokens move — this prices the intent; execution happens in the agent's own wallet/canister. Tokens can be symbols (ICP, ckUSDC, ckUSDT, ckBTC, ckETH) or ledger principals.","inputSchema":{"type":"object","required":["pay_token","receive_token","pay_amount"],"properties":{"fee":{"type":"integer","description":"Optional pool fee tier in hundredths of a bps (3000 = 0.3%). Defaults to trying 3000, then 10000, then 500."},"pay_token":{"type":"string","description":"Token to sell: symbol or ledger principal."},"pay_amount":{"type":"string","description":"Amount to sell, in base units as a decimal string (e.g. \"100000000\" = 1 ICP)."},"receive_token":{"type":"string","description":"Token to buy: symbol or ledger principal."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":256,"tokensAfter":256},{"name":"get_swap_route","fixed":{"name":"get_swap_route","description":"Route a swap intent across ICPSwap: prices the direct pool and every two-hop path through ICP, ckUSDC, ckUSDT, ckBTC, and ckETH live on-chain, chains each leg's quoted output into the next leg's input, and returns the best route leg-by-leg. Read-only — no tokens move. Use this instead of get_swap_quote when a direct pool may be thin or missing.","inputSchema":{"type":"object","required":["pay_token","receive_token","pay_amount"],"properties":{"fee":{"type":"integer","description":"Optional pool fee tier in hundredths of a bps (3000 = 0.3%), applied to every leg. Defaults to trying 3000, then 10000, then 500 per leg."},"max_hops":{"type":"integer","description":"1 = direct path only, 2 = also try two-hop routes via intermediate tokens (default 2)."},"pay_token":{"type":"string","description":"Token to sell: symbol or ledger principal."},"pay_amount":{"type":"string","description":"Amount to sell, in base units as a decimal string (e.g. \"100000000\" = 1 ICP)."},"receive_token":{"type":"string","description":"Token to buy: symbol or ledger principal."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":309,"tokensAfter":309}],"toolsChanged":7,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}