{
  "name": "io.github.FranciscoEira/swapper",
  "title": "Swapper - XMR to USDC swaps",
  "version": "0.2.0",
  "description": "Non-custodial Monero (XMR) to USDC on Arbitrum swaps. No account or API key.",
  "websiteUrl": "https://xmrtousdc.xyz",
  "documentationUrl": "https://docs.xmrtousdc.xyz",
  "protocolVersions": [
    "2025-11-25",
    "2025-06-18",
    "2025-03-26",
    "2024-11-05"
  ],
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://xmrtousdc.xyz/mcp",
      "authentication": "none"
    }
  ],
  "capabilities": {
    "tools": {
      "listChanged": false
    }
  },
  "instructions": "Swapper swaps Monero (XMR) to USDC on Arbitrum (and USDC back to XMR). Non-custodial, no account or API key.\nFlow: get_quote -> (confirm amount + destination with the user) -> create_swap -> follow customerState and poll get_swap_status until terminal.\nAmounts are human decimal strings (\"0.5\" XMR, \"100\" USDC), never atomic units. direction defaults to x2u (XMR->USDC); chain defaults to Arbitrum.\nPass an idempotencyKey to create_swap. If creation times out or its outcome is unknown, do not retry automatically; reconcile the original attempt first.\nShow the user `userMessage` from create_swap verbatim. Only present deposit instructions when customerState permits funding; never invent or round deposit data.\nPoll get_swap_status every `next.pollIntervalSec` seconds; stop when `terminal` is true. On terminal_failure call create_support_ticket.",
  "tools": [
    {
      "name": "get_quote",
      "title": "Get XMR/USDC swap quote",
      "description": "STEP 1 of 3. Live price quote for swapping Monero (XMR) -> USDC on Arbitrum (default) or USDC -> XMR. Read-only: creates no order and reserves nothing. Returns estimated receive amount, minimum received and ETA. Only `amount` is required. Next: confirm the destination address with the user, then call create_swap with the same amount.",
      "annotations": {
        "title": "Get swap quote",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "create_swap",
      "title": "Create XMR/USDC swap order",
      "description": "STEP 2 of 3. Create a swap order and return funding instructions: deposit address, EXACT deposit amount and expiry. Nothing moves until the user sends funds; non-custodial, no account. Confirm amount and destination with the user first. Pass an idempotencyKey (unique per user intent, reused on retries) so retries never create duplicate orders. includeQuote=true fetches a quote in parallel (quote + create in one round-trip). After success show `userMessage` to the user verbatim, then call get_swap_status with the returned orderId every next.pollIntervalSec seconds.",
      "annotations": {
        "title": "Create swap order",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "get_swap_status",
      "title": "Get swap status",
      "description": "STEP 3 of 3. Check an order's progress. States: waiting_for_funding -> deposit_detected -> swap_processing -> completed | terminal_failure. Poll every next.pollIntervalSec seconds until terminal=true; do not poll faster. On terminal_failure call create_support_ticket.",
      "annotations": {
        "title": "Get swap status",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "plan_swap",
      "title": "Validate swap inputs",
      "description": "Optional, offline. Validate a partial swap request and get the next question to ask the user (one at a time). Use when the user's intent is incomplete; skip it when you already have amount and destination.",
      "annotations": {
        "title": "Plan swap",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_capabilities",
      "title": "Swapper capabilities",
      "description": "Optional. Supported directions, live chains, defaults, validation rules and the recommended flow. No network call.",
      "annotations": {
        "title": "Capabilities",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "create_support_ticket",
      "title": "Open support ticket",
      "description": "Open a support ticket for a stuck or failed swap. Include the orderId and a short description of what happened.",
      "annotations": {
        "title": "Support ticket",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    }
  ]
}