# Swapper - XMR to USDC swaps (remote · xmrtousdc.xyz)

Swap Monero (XMR) <-> native USDC on Arbitrum One. No account or API key required. For AI agents.

- Trust score: 84/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `xmrtousdc.xyz`: 84/100 (this document), [markdown](https://verifymcp.io/servers/xyz-xmrtousdc-monero-swap/xmrtousdc.md), [page](https://verifymcp.io/servers/xyz-xmrtousdc-monero-swap/xmrtousdc)

## Channel facts

- Endpoint: `https://xmrtousdc.xyz/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.6.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Endpoint Security**: 80/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 79/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 2143 tokens (~107/item across 20 items; 11 tools + 9 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 77/100
  - Stability observed for 23 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 91/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 69% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 11 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 13 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the Swapper - XMR to USDC swaps MCP server?

Swapper - XMR to USDC swaps is a hosted endpoint at https://xmrtousdc.xyz/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http xyz-xmrtousdc-monero-swap 'https://xmrtousdc.xyz/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "xyz-xmrtousdc-monero-swap": {
      "url": "https://xmrtousdc.xyz/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "xyz-xmrtousdc-monero-swap": {
      "type": "http",
      "url": "https://xmrtousdc.xyz/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.xyz-xmrtousdc-monero-swap]
url = "https://xmrtousdc.xyz/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "xyz-xmrtousdc-monero-swap": {
      "type": "remote",
      "url": "https://xmrtousdc.xyz/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add xyz-xmrtousdc-monero-swap --url 'https://xmrtousdc.xyz/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  xyz-xmrtousdc-monero-swap:
    url: "https://xmrtousdc.xyz/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "xyz-xmrtousdc-monero-swap": {
      "Transport": "http",
      "Url": "https://xmrtousdc.xyz/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add xyz-xmrtousdc-monero-swap -t streamable-http -u 'https://xmrtousdc.xyz/mcp'
```

### Other

```json
{
  "mcpServers": {
    "xyz-xmrtousdc-monero-swap": {
      "type": "http",
      "url": "https://xmrtousdc.xyz/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 84, +1)

No change was recorded against any check on this day. Stability & Change Management went from 70 to 73. That category is still filling its 30-day observation window: 21 days of observed history at the previous scan, 22 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-02 (score 83, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-31 (score 82, +1)

No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-28 (score 81, +1)

No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-26 (score 80, +1)

No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-24 (score 79, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-22 (score 78, +1)

No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-20 (score 77, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (11)

### `get_quote` (~333 tokens)

Get XMR/USDC swap quote

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.

Input parameters:

- `agentKey` (string): Optional key from request_agent_key.
- `amount` (string): What the user SENDS (x2u: XMR, u2x: USDC). Digits and one dot; no commas or units.
- `basis` (string): receiveAmount met by the estimate (default) or the provider minimum (if published).
- `chain` (string): Default arbitrum (42161).
- `detail` (string)
- `direction` (string): Required. u2x: send USDC, get XMR. x2u: send XMR, get USDC.
- `receiveAmount` (string): What the user wants to RECEIVE (u2x: XMR, x2u: USDC); needs direction.
- `requoteOf` (string): Re-quote this quoteId's stored parameters; pass it alone.
- `to` (string): Destination from the user: x2u an Arbitrum One 0x address, u2x a Monero address. Never guess.

Output parameters:

- `acceptUntil` (string|null)
- `acceptWindowSec` (integer|null)
- `agentKey` (object|null)
- `belowProviderMinimum` (boolean|null)
- `data` (object)
- `delta` (object|null)
- `destination` (string|null)
- `direction` (string)
- `error` (object)
- `expiresInSec` (integer|null)
- `guaranteed` (boolean)
- `minimumSwapUsd` (number|null)
- `next` (object)
- `ok` (boolean)
- `operation` (string)
- `prerequisites` (object|null)
- `quote` (object|null)
- `quoteId` (string|null)
- `state` (string)
- `target` (object|null)
- `userMessage` (string)

### `create_swap` (~206 tokens)

Create XMR/USDC swap order

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.

Input parameters:

- `detail` (string)
- `idempotencyKey` (string): Optional; default q_<quoteId>. Reuse on every retry. A custom key: a fresh random UUID per intent.
- `quoteId` (string, required): From get_quote's next.arguments.
- `quoteIntentDigest` (string): From next.arguments: create fails if the quote's terms differ.
- `to` (string): Destination, only if the quote had none (next.missing). Never guess.

Output parameters:

- `data` (object)
- `deposit` (object|null)
- `destination` (string|null)
- `error` (object)
- `expectedReceive` (object|null)
- `fromQueue` (boolean)
- `idempotencyKey` (string|null)
- `next` (object)
- `ok` (boolean)
- `operation` (string)
- `orderId` (string|null)
- `payable` (boolean)
- `payableReason` (string|null)
- `queue` (object|null)
- `reconfirmRequired` (boolean)
- `recovered` (boolean)
- `replayed` (boolean)
- `state` (string)
- `trackUrl` (string|null)
- `userMessage` (string)

### `get_swap_status` (~204 tokens)

Get swap status

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.

Input parameters:

- `detail` (string)
- `orderId` (string, required): From create_swap or list_swaps.
- `payment` (string): Unsigned only: tx JSON {to,data,value,chainId}, an ethereum:/monero: URI, calldata or an unsigned raw tx. Never a signed transaction.
- `sinceState` (string): State from your previous call.
- `verify` (string): Destination address (optional extra check).
- `waitSec` (integer): Long-poll seconds for a change from sinceState (max 25; more is capped).

Output parameters:

- `attention` (array)
- `data` (object)
- `deposit` (object|null)
- `destination` (string|null)
- `error` (object)
- `evidence` (object|null)
- `mayChange` (boolean)
- `next` (object)
- `ok` (boolean)
- `operation` (string)
- `orderId` (string|null)
- `outcome` (string|null)
- `payable` (boolean)
- `payableReason` (string|null)
- `paymentCheck` (object|null)
- `received` (object|null)
- `receivedBelowMinimum` (boolean)
- `state` (string)
- `status` (string|null)
- `terminal` (boolean)
- `trackUrl` (string|null)
- `userMessage` (string)
- `waited` (object|null)

### `get_funding_options` (~146 tokens)

How to fund a swap

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).

Input parameters:

- `amount` (string): Send amount from a quote, if known.
- `detail` (string)
- `direction` (string): u2x (default): the user sends USDC. x2u: XMR.
- `from` (object): Where the funds are now.

Output parameters:

- `checklist` (array)
- `data` (object)
- `direction` (string)
- `error` (object)
- `matched` (boolean|null)
- `next` (object)
- `ok` (boolean)
- `operation` (string)
- `route` (object|null)
- `state` (string)
- `userMessage` (string)

### `list_swaps` (~117 tokens)

Find my swaps

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).

Input parameters:

- `detail` (string)
- `idempotencyKey` (string): The key create_swap used (default q_<quoteId>).
- `sessionId` (string): Session UUID, instead of idempotencyKey.

Output parameters:

- `data` (object)
- `error` (object)
- `lookup` (string)
- `next` (object)
- `note` (string|null)
- `ok` (boolean)
- `operation` (string)
- `orders` (array)
- `payable` (boolean)
- `payableReason` (string|null)
- `state` (string)
- `userMessage` (string)

### `plan_swap` (~132 tokens)

Validate swap inputs

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.

Input parameters:

- `amount` (string): What the user sends.
- `detail` (string)
- `direction` (string): u2x or x2u, as the user said it.
- `receiveAmount` (string): What the user wants to receive.
- `to` (string): Destination from the user: x2u an Arbitrum One 0x address, u2x a Monero address. Never guess.

Output parameters:

- `data` (object)
- `error` (object)
- `missingInputs` (array)
- `next` (object)
- `ok` (boolean)
- `operation` (string)
- `question` (object|null)
- `state` (string)
- `userMessage` (string)
- `validationErrors` (array)

### `get_capabilities` (~42 tokens)

Swapper capabilities

Optional. Chains, limits (provider minimum, USD), quote window, idempotency, validation rules, polling and the flow.

Input parameters:

- `detail` (string)

Output parameters:

- `contractVersion` (string)
- `data` (object)
- `error` (object)
- `next` (object)
- `ok` (boolean)
- `operation` (string)
- `state` (string)
- `userMessage` (string)

### `create_support_ticket` (~163 tokens)

Open support ticket

Stuck or failed swap, or a question: Support answers (get_support_ticket). Follow up with ticketId + replyToken. Never seed phrases or keys.

Input parameters:

- `category` (string): Short topic, e.g. "stuck", "refund". Default "agent".
- `detail` (string)
- `message` (string, required): What happened (sent what, when, what the user sees), or your question.
- `orderId` (string): ord_... of the affected order.
- `replyToken` (string): With ticketId.
- `sessionId` (string): Session UUID, if known.
- `ticketId` (string): Follow-up: an existing ticket.
- `walletAddress` (string): Public address involved (sending wallet or destination).

Output parameters:

- `data` (object)
- `error` (object)
- `next` (object)
- `ok` (boolean)
- `operation` (string)
- `replyToken` (string|null)
- `state` (string)
- `ticketId` (string|null)
- `userMessage` (string)

### `get_support_ticket` (~51 tokens)

Read support replies

Support's answer on your ticket: status, awaiting, thread. Answers take minutes to hours.

Input parameters:

- `detail` (string)
- `replyToken` (string, required)
- `ticketId` (string, required)

Output parameters:

- `awaiting` (string|null)
- `data` (object)
- `error` (object)
- `next` (object)
- `ok` (boolean)
- `operation` (string)
- `replies` (integer|null)
- `state` (string)
- `status` (string|null)
- `thread` (array)
- `ticketId` (string|null)
- `userMessage` (string)

### `submit_feedback` (~98 tokens)

Rate a swap

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.

Input parameters:

- `agentName` (string)
- `comment` (string)
- `detail` (string)
- `orderId` (string)
- `publishable` (boolean): May other agents read the comment?
- `rating` (integer, required)

Output parameters:

- `data` (object)
- `error` (object)
- `feedbackId` (string|null)
- `next` (object)
- `ok` (boolean)
- `operation` (string)
- `state` (string)
- `userMessage` (string)
- `verifiedSwap` (boolean)

### `request_agent_key` (~105 tokens)

Register agent key

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.

Input parameters:

- `agentName` (string): Default: the MCP client's name (clientInfo).
- `contact` (string): Optional; stored, shown to the operator.
- `detail` (string)
- `purpose` (string): Optional; stored, shown to the operator.

Output parameters:

- `agentKey` (string|null)
- `data` (object)
- `error` (object)
- `feePercent` (number|null)
- `keyId` (string|null)
- `next` (object)
- `ok` (boolean)
- `operation` (string)
- `standardFeePercent` (number|null)
- `state` (string)
- `userMessage` (string)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/xyz-xmrtousdc-monero-swap/xmrtousdc#diagnostics

## Score history

- 2026-11-05: 84
- 2026-11-04: 84
- 2026-11-03: 83
- 2026-11-02: 83
- 2026-11-01: 82
- 2026-10-31: 82
- 2026-10-30: 81
- 2026-10-29: 81
- 2026-10-28: 81
- 2026-10-27: 80
- 2026-10-26: 80
- 2026-10-25: 79
- 2026-10-24: 79
- 2026-10-23: 78
- 2026-10-22: 78
- 2026-10-21: 77
- 2026-10-20: 77
- 2026-10-19: 76
- 2026-10-18: 76
- 2026-10-17: 75
- 2026-10-16: 75
- 2026-10-15: 74
- 2026-10-14: 74
- 2026-10-13: 74

## Common questions

### What is the Swapper - XMR to USDC swaps MCP server?

Swapper - XMR to USDC swaps is an MCP server listed in the public MCP registry as xyz.xmrtousdc/monero-swap. Swap Monero (XMR) <-> native USDC on Arbitrum One. No account or API key required. For AI agents. This page covers its hosted endpoint (https://xmrtousdc.xyz/mcp).

### Is the Swapper - XMR to USDC swaps MCP server safe to use?

Swapper - XMR to USDC swaps scores 84 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Swapper - XMR to USDC swaps MCP server expose?

Swapper - XMR to USDC swaps exposes 11 tools: get_quote, create_swap, get_swap_status, get_funding_options, list_swaps, and 6 more. Their descriptions and schemas cost roughly 1,597 tokens of context every time the server is loaded.

### Does the Swapper - XMR to USDC swaps MCP server require authentication?

No. We connected to Swapper - XMR to USDC swaps without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Swapper - XMR to USDC swaps MCP server still maintained?

Swapper - XMR to USDC swaps is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://xmrtousdc.xyz/mcp
- Website: https://xmrtousdc.xyz/
- Changelog RSS feed: https://verifymcp.io/servers/xyz-xmrtousdc-monero-swap/xmrtousdc.xml
- Changelog JSON feed: https://verifymcp.io/servers/xyz-xmrtousdc-monero-swap/xmrtousdc.json
- HTML version of this page: https://verifymcp.io/servers/xyz-xmrtousdc-monero-swap/xmrtousdc
