Swapper - XMR to USDC swaps
Swap Monero (XMR) <-> native USDC on Arbitrum One. No account or API key required. For AI agents.
我該用這個嗎
品質與安全性
根據工具定義與協定合規性的自動化分析。
上下文成本
這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。
安裝
一鍵安裝
將以下內容加入你的 `claude_desktop_config.json` 檔案:
{
"mcpServers": {
"monero-swap": {
"url": "https://xmrtousdc.xyz/mcp"
}
}
}遠端端點
https://xmrtousdc.xyz/mcpstreamable-http它能做什麼
工具清單
工具(11)
🟢get_quote(amount, receiveAmount, direction, to, basis, ...)
Step 1. Quote Monero (XMR) <-> native USDC on Arbitrum One; no account or API key. Creates no order. Quotes are estimates. Buy XMR ("get me 1 XMR"): {direction:"u2x", receiveAmount:"1"}. Sell XMR: {direction:"x2u", amount:"0.5"}. direction plus exactly one of amount (what the user sends) or receiveAmount (what they want). Pass to if known. Next: create_swap with next.arguments.
輸入結構描述
{
"type": "object",
"properties": {
"amount": {
"type": "string",
"pattern": "^(?:[0-9]+(?:\\.[0-9]+)?|\\.[0-9]+)$",
"description": "What the user SENDS (x2u: XMR, u2x: USDC). Digits and one dot; no commas or units."
},
"receiveAmount": {
"type": "string",
"pattern": "^(?:[0-9]+(?:\\.[0-9]+)?|\\.[0-9]+)$",
"description": "What the user wants to RECEIVE (u2x: XMR, x2u: USDC); needs direction.",
"examples": [
"1"
]
},
"direction": {
"type": "string",
"enum": [
"x2u",
"u2x"
],
"description": "Required. u2x: send USDC, get XMR. x2u: send XMR, get USDC."
},
"to": {
"type": "string",
"description": "Destination from the user: x2u an Arbitrum One 0x address, u2x a Monero address. Never guess."
},
"basis": {
"type": "string",
"enum": [
"estimate",
"minimum"
],
"description": "receiveAmount met by the estimate (default) or the provider minimum (if published)."
},
"requoteOf": {
"type": "string",
"pattern": "^q_[a-f0-9]{32}$",
"description": "Re-quote this quoteId's stored parameters; pass it alone."
},
"chain": {
"type": "string",
"description": "Default arbitrum (42161)."
},
"agentKey": {
"type": "string",
"pattern": "^swk_[a-f0-9]{40}$",
"description": "Optional key from request_agent_key."
},
"detail": {
"type": "string",
"enum": [
"lean",
"full"
]
}
},
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"operation": {
"type": "string"
},
"state": {
"type": "string"
},
"agentKey": {
"type": [
"object",
"null"
]
},
"quoteId": {
"type": [
"string",
"null"
]
},
"direction": {
"type": "string"
},
"acceptUntil": {
"type": [
"string",
"null"
]
},
"expiresInSec": {
"type": [
"integer",
"null"
]
},
"acceptWindowSec": {
"type": [
"integer",
"null"
]
},
"guaranteed": {
"type": "boolean"
},
"quote": {
"type": [
"object",
"null"
]
},
"destination": {
"type": [
"string",
"null"
]
},
"belowProviderMinimum": {
"type": [
"boolean",
"null"
]
},
"minimumSwapUsd": {
"type": [
"number",
"null"
]
},
"target": {
"type": [
"object",
"null"
]
},
"delta": {
"type": [
"object",
"null"
]
},
"prerequisites": {
"type": [
"object",
"null"
]
},
"userMessage": {
"type": "string"
},
"next": {
"type": "object",
"required": [
"tool",
"arguments"
],
"properties": {
"tool": {
"type": [
"string",
"null"
]
},
"arguments": {
"type": "object"
}
}
},
"error": {
"type": "object"
},
"data": {
"type": "object"
}
},
"required": [
"ok",
"operation",
"next"
]
}🟡create_swap(quoteId, to, idempotencyKey, quoteIntentDigest, detail)
Step 2. Creates the order from get_quote's next.arguments (quoteId, plus to if the quote had none): one order per quote; moves no funds. An order cannot be cancelled; unfunded, it expires. Retry with the same arguments: the default idempotencyKey returns the same order. Fund once, only while payable is true: before signing deposit.payment, get_swap_status {orderId, payment} must return paymentCheck.safeToSend. Next: get_swap_status.
輸入結構描述
{
"type": "object",
"properties": {
"quoteId": {
"type": "string",
"pattern": "^q_[a-f0-9]{32}$",
"description": "From get_quote's next.arguments."
},
"to": {
"type": "string",
"description": "Destination, only if the quote had none (next.missing). Never guess."
},
"idempotencyKey": {
"type": "string",
"pattern": "^[A-Za-z0-9:_-]{8,128}$",
"description": "Optional; default q_<quoteId>. Reuse on every retry. A custom key: a fresh random UUID per intent.",
"examples": [
"75d26b1d-11b6-4283-9a06-8a612dcc4ffd"
]
},
"quoteIntentDigest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "From next.arguments: create fails if the quote's terms differ."
},
"detail": {
"type": "string",
"enum": [
"lean",
"full"
]
}
},
"required": [
"quoteId"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"operation": {
"type": "string"
},
"state": {
"type": "string"
},
"queue": {
"type": [
"object",
"null"
]
},
"orderId": {
"type": [
"string",
"null"
]
},
"idempotencyKey": {
"type": [
"string",
"null"
]
},
"fromQueue": {
"type": "boolean"
},
"replayed": {
"type": "boolean"
},
"recovered": {
"type": "boolean"
},
"payable": {
"type": "boolean"
},
"payableReason": {
"type": [
"string",
"null"
]
},
"deposit": {
"type": [
"object",
"null"
]
},
"expectedReceive": {
"type": [
"object",
"null"
]
},
"destination": {
"type": [
"string",
"null"
]
},
"reconfirmRequired": {
"type": "boolean"
},
"trackUrl": {
"type": [
"string",
"null"
]
},
"userMessage": {
"type": "string"
},
"next": {
"type": "object",
"required": [
"tool",
"arguments"
],
"properties": {
"tool": {
"type": [
"string",
"null"
]
},
"arguments": {
"type": "object"
}
}
},
"error": {
"type": "object"
},
"data": {
"type": "object"
}
},
"required": [
"ok",
"operation",
"next"
]
}🟢get_swap_status(orderId, waitSec, sinceState, verify, payment, ...)
Step 3. waiting_for_funding -> deposit_detected -> swap_processing -> completed, or refunding / terminal_failure (outcome refunded, failed, expired). Long-poll with waitSec 25 and sinceState = the last state; repeat next until terminal. Call it before funding or showing a deposit again. payment: what your wallet will sign; sign only if paymentCheck.safeToSend.
輸入結構描述
{
"type": "object",
"properties": {
"orderId": {
"type": "string",
"description": "From create_swap or list_swaps."
},
"waitSec": {
"type": "integer",
"minimum": 0,
"description": "Long-poll seconds for a change from sinceState (max 25; more is capped)."
},
"sinceState": {
"type": "string",
"enum": [
"waiting_for_funding",
"deposit_detected",
"swap_processing",
"refunding",
"completed",
"terminal_failure",
"unknown"
],
"description": "State from your previous call."
},
"verify": {
"type": "string",
"description": "Destination address (optional extra check)."
},
"payment": {
"type": "string",
"maxLength": 20000,
"description": "Unsigned only: tx JSON {to,data,value,chainId}, an ethereum:/monero: URI, calldata or an unsigned raw tx. Never a signed transaction."
},
"detail": {
"type": "string",
"enum": [
"lean",
"full"
]
}
},
"required": [
"orderId"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"operation": {
"type": "string"
},
"state": {
"type": "string"
},
"orderId": {
"type": [
"string",
"null"
]
},
"status": {
"type": [
"string",
"null"
]
},
"terminal": {
"type": "boolean"
},
"outcome": {
"type": [
"string",
"null"
]
},
"mayChange": {
"type": "boolean"
},
"payable": {
"type": "boolean"
},
"payableReason": {
"type": [
"string",
"null"
]
},
"deposit": {
"type": [
"object",
"null"
]
},
"destination": {
"type": [
"string",
"null"
]
},
"received": {
"type": [
"object",
"null"
]
},
"receivedBelowMinimum": {
"type": "boolean"
},
"evidence": {
"type": [
"object",
"null"
]
},
"attention": {
"type": "array"
},
"paymentCheck": {
"type": [
"object",
"null"
]
},
"waited": {
"type": [
"object",
"null"
]
},
"trackUrl": {
"type": [
"string",
"null"
]
},
"userMessage": {
"type": "string"
},
"next": {
"type": "object",
"required": [
"tool",
"arguments"
],
"properties": {
"tool": {
"type": [
"string",
"null"
]
},
"arguments": {
"type": "object"
}
}
},
"error": {
"type": "object"
},
"data": {
"type": "object"
}
},
"required": [
"ok",
"operation",
"next"
]
}🟢get_funding_options(direction, from, amount, detail)
Offline. How to get what the user sends: native USDC (not USDC.e) plus a little ETH for gas on Arbitrum One (u2x, default), or XMR in their own wallet (x2u). Pass from {chain, asset} (and amount) for one ordered checklist: quote, fund, re-quote (requoteOf).
輸入結構描述
{
"type": "object",
"properties": {
"direction": {
"type": "string",
"enum": [
"u2x",
"x2u"
],
"description": "u2x (default): the user sends USDC. x2u: XMR."
},
"from": {
"type": "object",
"additionalProperties": false,
"description": "Where the funds are now.",
"properties": {
"chain": {
"type": "string",
"description": "arbitrum, ethereum, another chain, or exchange (or its name)."
},
"asset": {
"type": "string",
"description": "E.g. USDC, USDC.e, ETH, XMR."
}
}
},
"amount": {
"type": "string",
"pattern": "^(?:[0-9]+(?:\\.[0-9]+)?|\\.[0-9]+)$",
"description": "Send amount from a quote, if known."
},
"detail": {
"type": "string",
"enum": [
"lean",
"full"
]
}
},
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"operation": {
"type": "string"
},
"state": {
"type": "string"
},
"direction": {
"type": "string"
},
"matched": {
"type": [
"boolean",
"null"
]
},
"route": {
"type": [
"object",
"null"
]
},
"checklist": {
"type": "array",
"items": {
"type": "string"
}
},
"userMessage": {
"type": "string"
},
"next": {
"type": "object",
"required": [
"tool",
"arguments"
],
"properties": {
"tool": {
"type": [
"string",
"null"
]
},
"arguments": {
"type": "object"
}
}
},
"error": {
"type": "object"
},
"data": {
"type": "object"
}
},
"required": [
"ok",
"operation",
"next"
]
}🟢list_swaps(idempotencyKey, sessionId, detail)
Find orders when the orderId is lost (new chat, crash, unknown create outcome): pass the idempotencyKey create_swap used (default q_<quoteId>), or a sessionId. Read-only; addresses redacted; states can lag. Next: get_swap_status (live state, payable).
輸入結構描述
{
"type": "object",
"properties": {
"idempotencyKey": {
"type": "string",
"pattern": "^[A-Za-z0-9:_-]{8,128}$",
"description": "The key create_swap used (default q_<quoteId>)."
},
"sessionId": {
"type": "string",
"description": "Session UUID, instead of idempotencyKey."
},
"detail": {
"type": "string",
"enum": [
"lean",
"full"
]
}
},
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"operation": {
"type": "string"
},
"state": {
"type": "string"
},
"lookup": {
"type": "string"
},
"payable": {
"type": "boolean"
},
"payableReason": {
"type": [
"string",
"null"
]
},
"orders": {
"type": "array"
},
"note": {
"type": [
"string",
"null"
]
},
"userMessage": {
"type": "string"
},
"next": {
"type": "object",
"required": [
"tool",
"arguments"
],
"properties": {
"tool": {
"type": [
"string",
"null"
]
},
"arguments": {
"type": "object"
}
}
},
"error": {
"type": "object"
},
"data": {
"type": "object"
}
},
"required": [
"ok",
"operation",
"next"
]
}🟢plan_swap(direction, amount, receiveAmount, to, detail)
Optional, offline. Checks a partial request (direction, amount or receiveAmount, to) and returns the next question for the user. Skip it when you have what get_quote needs.
輸入結構描述
{
"type": "object",
"properties": {
"direction": {
"type": "string",
"description": "u2x or x2u, as the user said it."
},
"amount": {
"type": "string",
"description": "What the user sends."
},
"receiveAmount": {
"type": "string",
"description": "What the user wants to receive."
},
"to": {
"type": "string",
"description": "Destination from the user: x2u an Arbitrum One 0x address, u2x a Monero address. Never guess."
},
"detail": {
"type": "string",
"enum": [
"lean",
"full"
]
}
},
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"operation": {
"type": "string"
},
"state": {
"type": "string"
},
"missingInputs": {
"type": "array",
"items": {
"type": "string"
}
},
"validationErrors": {
"type": "array",
"items": {
"type": "string"
}
},
"question": {
"type": [
"object",
"null"
]
},
"userMessage": {
"type": "string"
},
"next": {
"type": "object",
"required": [
"tool",
"arguments"
],
"properties": {
"tool": {
"type": [
"string",
"null"
]
},
"arguments": {
"type": "object"
}
}
},
"error": {
"type": "object"
},
"data": {
"type": "object"
}
},
"required": [
"ok",
"operation",
"next"
]
}🟢get_capabilities(detail)
Optional. Chains, limits (provider minimum, USD), quote window, idempotency, validation rules, polling and the flow.
輸入結構描述
{
"type": "object",
"properties": {
"detail": {
"type": "string",
"enum": [
"lean",
"full"
]
}
},
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"operation": {
"type": "string"
},
"state": {
"type": "string"
},
"contractVersion": {
"type": "string"
},
"userMessage": {
"type": "string"
},
"next": {
"type": "object",
"required": [
"tool",
"arguments"
],
"properties": {
"tool": {
"type": [
"string",
"null"
]
},
"arguments": {
"type": "object"
}
}
},
"error": {
"type": "object"
},
"data": {
"type": "object"
}
},
"required": [
"ok",
"operation",
"next"
]
}🟡create_support_ticket(message, ticketId, replyToken, orderId, category, ...)
Stuck or failed swap, or a question: Support answers (get_support_ticket). Follow up with ticketId + replyToken. Never seed phrases or keys.
輸入結構描述
{
"type": "object",
"properties": {
"message": {
"type": "string",
"minLength": 3,
"maxLength": 2000,
"description": "What happened (sent what, when, what the user sees), or your question."
},
"ticketId": {
"type": "string",
"pattern": "^[0-9a-fA-F-]{36}$",
"description": "Follow-up: an existing ticket."
},
"replyToken": {
"type": "string",
"pattern": "^rt_[a-f0-9]{48}$",
"description": "With ticketId."
},
"orderId": {
"type": "string",
"description": "ord_... of the affected order."
},
"category": {
"type": "string",
"description": "Short topic, e.g. \"stuck\", \"refund\". Default \"agent\"."
},
"walletAddress": {
"type": "string",
"description": "Public address involved (sending wallet or destination)."
},
"sessionId": {
"type": "string",
"description": "Session UUID, if known."
},
"detail": {
"type": "string",
"enum": [
"lean",
"full"
]
}
},
"required": [
"message"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"operation": {
"type": "string"
},
"state": {
"type": "string"
},
"ticketId": {
"type": [
"string",
"null"
]
},
"replyToken": {
"type": [
"string",
"null"
]
},
"userMessage": {
"type": "string"
},
"next": {
"type": "object",
"required": [
"tool",
"arguments"
],
"properties": {
"tool": {
"type": [
"string",
"null"
]
},
"arguments": {
"type": "object"
}
}
},
"error": {
"type": "object"
},
"data": {
"type": "object"
}
},
"required": [
"ok",
"operation",
"next"
]
}🟢get_support_ticket(ticketId, replyToken, detail)
Support's answer on your ticket: status, awaiting, thread. Answers take minutes to hours.
輸入結構描述
{
"type": "object",
"properties": {
"ticketId": {
"type": "string",
"pattern": "^[0-9a-fA-F-]{36}$"
},
"replyToken": {
"type": "string",
"pattern": "^rt_[a-f0-9]{48}$"
},
"detail": {
"type": "string",
"enum": [
"lean",
"full"
]
}
},
"required": [
"ticketId",
"replyToken"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"operation": {
"type": "string"
},
"state": {
"type": "string"
},
"ticketId": {
"type": [
"string",
"null"
]
},
"status": {
"type": [
"string",
"null"
]
},
"awaiting": {
"type": [
"string",
"null"
]
},
"replies": {
"type": [
"integer",
"null"
]
},
"thread": {
"type": "array",
"items": {
"type": "object"
}
},
"userMessage": {
"type": "string"
},
"next": {
"type": "object",
"required": [
"tool",
"arguments"
],
"properties": {
"tool": {
"type": [
"string",
"null"
]
},
"arguments": {
"type": "object"
}
}
},
"error": {
"type": "object"
},
"data": {
"type": "object"
}
},
"required": [
"ok",
"operation",
"next"
]
}🟡submit_feedback(rating, comment, orderId, publishable, agentName, ...)
Optional, after a swap: a rating 1-5 and a comment. The published average counts one rating per completed Swapper order; a comment marked publishable is shown after operator review.
輸入結構描述
{
"type": "object",
"properties": {
"rating": {
"type": "integer",
"minimum": 1,
"maximum": 5
},
"comment": {
"type": "string",
"maxLength": 600
},
"orderId": {
"type": "string"
},
"publishable": {
"type": "boolean",
"description": "May other agents read the comment?"
},
"agentName": {
"type": "string",
"maxLength": 64
},
"detail": {
"type": "string",
"enum": [
"lean",
"full"
]
}
},
"required": [
"rating"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"operation": {
"type": "string"
},
"state": {
"type": "string"
},
"feedbackId": {
"type": [
"string",
"null"
]
},
"verifiedSwap": {
"type": "boolean"
},
"userMessage": {
"type": "string"
},
"next": {
"type": "object",
"required": [
"tool",
"arguments"
],
"properties": {
"tool": {
"type": [
"string",
"null"
]
},
"arguments": {
"type": "object"
}
}
},
"error": {
"type": "object"
},
"data": {
"type": "object"
}
},
"required": [
"ok",
"operation",
"next"
]
}⚪request_agent_key(agentName, contact, purpose, detail)
Optional. Issues a key that identifies this agent; quotes made with it (get_quote agentKey) and their orders use the agent fee (swapper://trust). The operator sees the name and contact given.
輸入結構描述
{
"type": "object",
"properties": {
"agentName": {
"type": "string",
"minLength": 2,
"maxLength": 64,
"description": "Default: the MCP client's name (clientInfo)."
},
"contact": {
"type": "string",
"maxLength": 200,
"description": "Optional; stored, shown to the operator."
},
"purpose": {
"type": "string",
"maxLength": 500,
"description": "Optional; stored, shown to the operator."
},
"detail": {
"type": "string",
"enum": [
"lean",
"full"
]
}
},
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"operation": {
"type": "string"
},
"state": {
"type": "string"
},
"agentKey": {
"type": [
"string",
"null"
]
},
"keyId": {
"type": [
"string",
"null"
]
},
"feePercent": {
"type": [
"number",
"null"
]
},
"standardFeePercent": {
"type": [
"number",
"null"
]
},
"userMessage": {
"type": "string"
},
"next": {
"type": "object",
"required": [
"tool",
"arguments"
],
"properties": {
"tool": {
"type": [
"string",
"null"
]
},
"arguments": {
"type": "object"
}
}
},
"error": {
"type": "object"
},
"data": {
"type": "object"
}
},
"required": [
"ok",
"operation",
"next"
]
}社群
證據