{"name":"grailswap","version":"cd7eaf15bd27fd50551bd9120ad7be9755583b85","description":"Connect your agent: https://www.grailswap.io/api/mcp uses MCP Streamable HTTP; mcp.grailswap.io does not exist. POST /api/agent/v1/keys/challenge, sign the returned message exactly with the wallet, then POST /api/agent/v1/keys with the same intent plus nonce and base58 signature. Send Authorization: Bearer gsk_... on each authenticated request. The signing wallet IS the account (one wallet = one account); Google/email sign-in creates a different embedded wallet. Required intent fields: wallet_address, label, scopes, per_tx_cap_micro_usdc, daily_cap_micro_usdc, attested_not_wa: true, attested_age_18: true. Attestations must be accurate; access eligibility, location and enable switch apply. Caps bound outgoing USDC per transaction and rolling 24h; 1000000 micros = 1 USDC. Example tools/call sequence: search_market_listings {query: 'Charizard', max_price_usd: 50, limit: 1} -> buy_listing {mint: MINT_FROM_SEARCH, max_price_micro_usdc: '50000000', idempotency_key: 'scbot-market-buy-0001'} -> review/sign returned transactions locally -> submit_signed_transaction {attempt_id: RETURNED_UUID, transactions: [{index: 0, signed_transaction: SIGNED_BASE64}]}. update_profile accepts username/avatarUrl with an idempotency_key and a newly granted profile:write scope; 10 calls/hour/key. Usernames are permanent. GrailSwap never holds private keys. Prices change and insured values are references.","transport":"streamable-http","url":"https://www.grailswap.io/api/mcp","authentication":{"discovery":"none","agent_tools":"Authorization: Bearer gsk_... (on every HTTP request)","key_setup":"https://www.grailswap.io/settings/agents","key_challenge":"https://www.grailswap.io/api/agent/v1/keys/challenge","key_issue":"https://www.grailswap.io/api/agent/v1/keys","key_creation":"Choose scopes and USDC caps, attest age 18+ and not in Washington, and sign the wallet challenge. The key is shown once; GrailSwap never holds wallet private keys."},"instructions":"Supply idempotency_key per action. Review returned transactions, sign their exact messages locally, then call submit_signed_transaction with the signed base64 bytes. Use get_attempt_status after timeouts and get_me for cap reconciliation. Never replace an uncertain payment with a new purchase.","openapi":"https://www.grailswap.io/openapi.json","guide":"https://www.grailswap.io/docs/agent-api.md","tools":["search_market_listings","get_card","get_collector_inventory","list_packs","find_trade_matches","preview_trade","get_pack_summary","list_pack_contents","get_buyback_quote","get_sign_ready_attempt","list_events","create_standing_want","list_standing_wants","update_standing_want","delete_standing_want","create_standing_have","list_standing_haves","delete_standing_have","list_order_matches","get_auto_accept_rules","set_auto_accept_rules","disable_auto_accept_rules","get_sign_ready_settlement","request_limit_increase","get_limit_requests","lower_limits","link_owner","update_webhook","create_webhook","list_webhooks","delete_webhook","test_webhook","rotate_webhook_secret","list_trade_proposals","get_trade_proposal","accept_cc_bid","send_card","update_profile","buy_listing","list_card","unlist_card","make_offer","accept_offer","cancel_offer","create_trade_proposal","accept_trade_proposal","decline_trade_proposal","cancel_trade_proposal","build_trade_settlement","trade_bot_quote","trade_bot_swap","buy_pack","open_pack","buyback_sell","get_me","submit_signed_transaction","get_attempt_status"]}