protogrid

Search / xyz.xmrtousdc/monero-swap

Swapper - XMR to USDC swaps

R0· no sign-in

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

v0.6.0 · active · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality84good
Trust82of 100
Uptime, 30 days97%
Latency p50857 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "monero-swap": {
      "type": "http",
      "url": "https://xmrtousdc.xyz/mcp"
    }
  }
}
claude mcp add --transport http monero-swap https://xmrtousdc.xyz/mcp
[mcp_servers.monero-swap]
url = "https://xmrtousdc.xyz/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "monero-swap": {
      "type": "remote",
      "url": "https://xmrtousdc.xyz/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "monero-swap": {
      "type": "http",
      "url": "https://xmrtousdc.xyz/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=monero-swap&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8veG1ydG91c2RjLnh5ei9tY3AifQ%3D%3D"
}
{
  "servers": {
    "monero-swap": {
      "type": "http",
      "url": "https://xmrtousdc.xyz/mcp"
    }
  }
}
{
  "mcpServers": {
    "monero-swap": {
      "httpUrl": "https://xmrtousdc.xyz/mcp"
    }
  }
}
extensions:
  "monero-swap":
    enabled: true
    name: "monero-swap"
    type: streamable_http
    uri: "https://xmrtousdc.xyz/mcp"
    timeout: 300

Quality 84 / 100good

protocol100 · weight 25
  • pass
    protocol.modernsupports 2026-07-28 (server/discover)
  • pass
    protocol.statelessanswers without a session
  • pass
    protocol.transportstreamable HTTP
  • pass
    protocol.list_ttltool list is cacheable (ttlMs 600000)
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene100 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations11 of 11 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 2,486 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability25 · weight 15
  • warn
    stability.changes7 tool changes in 30 days
  • fail
    stability.rug_pull1 tools kept their name but changed most of their description in 30 days; review before trusting them
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

11 tools, about 2,486 tokens to load them all · tool set 6a2c9f1b2f97 · tools last changed 2026-10-13 · checked 2026-10-21 02:10 UTC

Tool changes

  • request_agent_keyadded

    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.

  • submit_feedbackadded

    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.

  • get_support_ticketadded

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

  • create_support_ticketchangeddescription, input schema, output schemameaning changed
    before

    For a failed or stuck swap: orderId and what happened; never seed phrases or private keys. Returns ticketId; no tool reads replies (follow up at [email protected]).

    after · 39% of words in common

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

  • get_swap_statuschangeddescription, input schema
    before

    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. deposit.payment may be used only while payable is true. Call it before funding or showing a deposit again. payment: what your wallet will sign; sign only if paymentCheck.matches.

    after · 84% of words in common

    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.

  • create_swapchangeddescription, output schema
    before

    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. 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.matches. Next: get_swap_status.

    after · 83% of words in common

    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.

  • get_quotechangeddescription, input schema, output schema
    before

    Step 1. Quote Monero (XMR) <-> native USDC on Arbitrum One; no KYC, account or API key. Read-only; 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; re-quote with {requoteOf}. Next: create_swap with next.arguments; no confirmation step is required.

    after · 83% of words in common

    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.

Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 82 / 100

no-repository
provenance55
liveness99
freshness100
hygiene80

+dns-namespace +website +reachable +uptime-97% +updated-7d-ago -no-repository

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://xmrtousdc.xyz/mcp streamable-httpnoneyes97%857 ms2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-052026-10-21

Tools (11)

create_support_ticketStuck or failed swap, or a question: Support answers (get_support_ticket). Follow up with ticketId + replyToken. Never seed phrases or keys.
create_swapStep 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.
get_capabilitiesread-onlyOptional. Chains, limits (provider minimum, USD), quote window, idempotency, validation rules, polling and the flow.
get_funding_optionsread-onlyOffline. 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).
get_quoteread-onlyStep 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.
get_support_ticketread-onlySupport's answer on your ticket: status, awaiting, thread. Answers take minutes to hours.
get_swap_statusread-onlyStep 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.
list_swapsread-onlyFind 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).
plan_swapread-onlyOptional, 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.
request_agent_keyOptional. 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.
submit_feedbackOptional, 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.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "xyz.xmrtousdc/monero-swap",
  "_meta": {
    "io.modelcontextprotocol.registry/publisher-provided": {
      "xyz.xmrtousdc/transparency": {
        "docs": "https://xmrtousdc.xyz/mcp#verify",
        "attestationKeys": [
          {
            "x": "AYtBHQ6I3i5LrC5ycMA3jdru5L3p8itLUAOSm32u8mU",
            "alg": "EdDSA",
            "crv": "Ed25519",
            "kid": "att-2026-10",
            "purpose": "swapper.order-attestation.v1",
            "thumbprint": "5yWF-doLdALe_RYnlor-yMpnZp_qft-8XYDJ03hbi84"
          }
        ]
      }
    }
  },
  "icons": [
    {
      "src": "https://xmrtousdc.xyz/favicon.svg",
      "sizes": [
        "any"
      ],
      "mimeType": "image/svg+xml"
    },
    {
      "src": "https://xmrtousdc.xyz/icon-512.png",
      "sizes": [
        "512x512"
      ],
      "mimeType": "image/png"
    },
    {
      "src": "https://xmrtousdc.xyz/icon-192.png",
      "sizes": [
        "192x192"
      ],
      "mimeType": "image/png"
    }
  ],
  "title": "Swapper - XMR to USDC swaps",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://xmrtousdc.xyz/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "0.6.0",
  "websiteUrl": "https://xmrtousdc.xyz",
  "description": "Swap Monero (XMR) <-> native USDC on Arbitrum One. No account or API key required. For AI agents."
}