{
  "name": "app.swapwallet/mcp",
  "title": "SwapWallet",
  "description": "Crypto wallet: balances, P&L, history. Swaps, transfers and withdrawals need Telegram approval.",
  "version": "1.0.0",
  "websiteUrl": "https://swapwallet.app/docs/mcp",
  "icons": [
    {
      "src": "https://swapwallet.app/icon.png",
      "mimeType": "image/png",
      "sizes": [
        "256x256"
      ]
    }
  ],
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://swapwallet.app/mcp"
    }
  ],
  "supportedProtocolVersions": [
    "2025-06-18",
    "2025-03-26",
    "2024-11-05"
  ],
  "serverInfo": {
    "name": "swapwallet",
    "title": "SwapWallet",
    "version": "1.0.0",
    "description": "SwapWallet crypto wallet: balances, P&L and transaction history, plus swaps, transfers and withdrawals that run only after the user approves them in Telegram.",
    "websiteUrl": "https://swapwallet.app",
    "icons": [
      {
        "src": "https://swapwallet.app/icon.png",
        "mimeType": "image/png",
        "sizes": [
          "256x256"
        ]
      }
    ]
  },
  "protocolVersion": "2025-06-18",
  "transport": {
    "type": "streamable-http",
    "endpoint": "https://swapwallet.app/mcp"
  },
  "capabilities": {
    "tools": {
      "listChanged": false
    }
  },
  "authentication": {
    "required": true,
    "schemes": [
      "oauth2"
    ]
  },
  "documentationUrl": "https://swapwallet.app/docs/mcp",
  "iconUrl": "https://swapwallet.app/icon.png",
  "tools": [
    {
      "name": "get_total_balance",
      "title": "Total balance",
      "description": "The user's total portfolio value plus a per-token breakdown of every non-zero holding.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "title": "Total balance",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_balance",
      "title": "Balance of specific coins",
      "description": "Balance and value of the given tokens only.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "tokens": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Tokens to report on, e.g. [\"USDT\", \"BTC\"]."
          }
        },
        "required": [
          "tokens"
        ]
      },
      "annotations": {
        "title": "Balance of specific coins",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_user_info",
      "title": "Account details",
      "description": "The user's profile, verification level and account settings.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "title": "Account details",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_deposit_address",
      "title": "Deposit address",
      "description": "The user's deposit address for a token on a network, creating one if needed.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token to deposit, e.g. USDT, BTC or TON (tools/list has the full enum)."
          },
          "network": {
            "type": "string",
            "description": "Blockchain network of the address, e.g. TRON, BSC or TON (tools/list has the full enum)."
          }
        },
        "required": [
          "token",
          "network"
        ]
      },
      "annotations": {
        "title": "Deposit address",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_profit_and_loss",
      "title": "Profit and loss",
      "description": "Realized and unrealized profit and loss, for all assets or the given tokens.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "tokens": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Limit to these tokens, e.g. [\"USDT\", \"BTC\"]; omit for all."
          }
        }
      },
      "annotations": {
        "title": "Profit and loss",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_transactions",
      "title": "Transaction history",
      "description": "Recent deposits, withdrawals, transfers and trades, newest first.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "description": "How many to return, 1 to 20. Defaults to 5."
          },
          "types": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Limit to these transaction types."
          },
          "tokens": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Limit to these tokens, e.g. [\"USDT\", \"BTC\"]."
          },
          "startDate": {
            "type": "string",
            "description": "ISO-8601 instant to start from."
          },
          "endDate": {
            "type": "string",
            "description": "ISO-8601 instant to stop at."
          }
        }
      },
      "annotations": {
        "title": "Transaction history",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_contacts",
      "title": "Saved contacts",
      "description": "The user's saved SwapWallet contacts, ten per page.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "integer",
            "description": "Zero-based page number."
          }
        }
      },
      "annotations": {
        "title": "Saved contacts",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_ibans",
      "title": "Verified IBANs",
      "description": "The user's verified bank accounts, usable as a Rial withdrawal destination.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "title": "Verified IBANs",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_action_request",
      "title": "Check an approval request",
      "description": "The current status of a request created by one of the request_* tools: PENDING while the user has not answered, then EXECUTED, REJECTED, EXPIRED or FAILED.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "requestId": {
            "type": "integer",
            "description": "The requestId returned by a request_* tool."
          }
        },
        "required": [
          "requestId"
        ]
      },
      "annotations": {
        "title": "Check an approval request",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "request_swap",
      "title": "Request a swap",
      "description": "Prices a swap between two tokens and sends it to the user's Telegram for approval.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "sourceToken": {
            "type": "string",
            "description": "Token to swap from, e.g. USDT, BTC or TON (tools/list has the full enum)."
          },
          "destinationToken": {
            "type": "string",
            "description": "Token to receive, e.g. USDT, BTC or TON (tools/list has the full enum)."
          },
          "amount": {
            "type": "string",
            "description": "Amount of the source token to swap, as a decimal string."
          }
        },
        "required": [
          "sourceToken",
          "destinationToken",
          "amount"
        ]
      },
      "annotations": {
        "title": "Request a swap",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "request_transfer",
      "title": "Request a transfer to another user",
      "description": "Prepares a transfer to another SwapWallet user and sends it to the user's Telegram for approval. The recipient must already be one of the user's contacts.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token to transfer, e.g. USDT, BTC or TON (tools/list has the full enum)."
          },
          "amount": {
            "type": "string",
            "description": "Amount to transfer, as a decimal string."
          },
          "recipient": {
            "type": "string",
            "description": "Contact phone number, username or user id."
          }
        },
        "required": [
          "token",
          "amount",
          "recipient"
        ]
      },
      "annotations": {
        "title": "Request a transfer to another user",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "request_crypto_withdraw",
      "title": "Request a crypto withdrawal",
      "description": "Prepares a crypto withdrawal and sends it to the user's Telegram for approval. Returns immediately with a pending request; nothing is sent until the user approves. Tell the user to check Telegram, then poll get_action_request.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token to withdraw, e.g. USDT, BTC or TON (tools/list has the full enum)."
          },
          "network": {
            "type": "string",
            "description": "Blockchain network to send on, e.g. TRON, BSC or TON (tools/list has the full enum)."
          },
          "amount": {
            "type": "string",
            "description": "Amount to withdraw, as a decimal string."
          },
          "address": {
            "type": "string",
            "description": "Destination address."
          },
          "memo": {
            "type": "string",
            "description": "Memo or destination tag, when the network needs one."
          }
        },
        "required": [
          "token",
          "network",
          "amount",
          "address"
        ]
      },
      "annotations": {
        "title": "Request a crypto withdrawal",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "request_fiat_withdraw",
      "title": "Request a Rial withdrawal",
      "description": "Prepares a Rial (IRT) withdrawal to one of the user's verified IBANs and sends it to their Telegram for approval. Nothing is paid out until the user approves.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "amount": {
            "type": "string",
            "description": "Amount in IRT, as a decimal string."
          },
          "iban": {
            "type": "string",
            "description": "Destination IBAN, from get_ibans."
          }
        },
        "required": [
          "amount",
          "iban"
        ]
      },
      "annotations": {
        "title": "Request a Rial withdrawal",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    }
  ]
}