{
  "schemaVersion": 1,
  "factsSchemaVersion": 2,
  "contentReviewedAt": "2026-09-12",
  "title": "Monivo agent surfaces — WebMCP and server MCP",
  "description": "Monivo is a non-custodial cryptocurrency swap aggregator and fiat on/off-ramp front end operating at https://monivo.io.",
  "website": "https://monivo.io",
  "documentation": "https://monivo.io/developers",
  "webmcp": {
    "status": "implemented, gated by browser support",
    "interface": "document.modelContext.registerTool(definition, { signal })",
    "unregister": "Abort the AbortSignal passed at registration. There is no unregisterTool().",
    "requirements": [
      "A secure context (HTTPS).",
      "A browser that exposes document.modelContext. The API is still behind a Chrome origin trial; where it is absent Monivo registers nothing and installs no shim."
    ],
    "legacyInterface": {
      "shape": "navigator.modelContext / provideContext() / clearContext()",
      "note": "Superseded (deprecated in Chromium 150). Monivo reads it as a fallback for detection only and never creates it."
    },
    "readOnly": true,
    "boundary": "Every WebMCP tool is backed by an endpoint that is already anonymous and public. No order creation, no deposit addresses, no account or per-customer data is reachable from the browser tools.",
    "tools": [
      {
        "name": "get_monivo_facts",
        "description": "Read Monivo's audited structured facts: what Monivo is (a non-custodial crypto swap aggregator), how routing works, the fee model, the scope of identity verification, asset coverage, and the statements Monivo authorises for citation.",
        "inputSchema": {
          "type": "object",
          "properties": {}
        },
        "readOnly": true
      },
      {
        "name": "get_swap_quote",
        "description": "Get live swap quotes for a pair and amount from the providers connected to Monivo, ranked by expected delivered output. Estimates only — the rate is not held, and Monivo does not execute the swap. Omit `amount` to use a default that clears provider minimums; omit the assets to price the pair currently shown on screen. This never creates an order.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "from": {
              "type": "string",
              "description": "Source asset id or ticker, e.g. \"BTC\"."
            },
            "to": {
              "type": "string",
              "description": "Destination asset id or ticker, e.g. \"XMR\"."
            },
            "amount": {
              "type": "number",
              "description": "Amount of the source asset to send."
            },
            "rate": {
              "type": "string",
              "enum": [
                "floating",
                "fixed"
              ],
              "description": "Rate type. Floating by default; fixed locks the output until it expires."
            }
          },
          "required": []
        },
        "readOnly": true
      },
      {
        "name": "get_current_swap_screen",
        "description": "Read what the visitor currently has on screen: the swap pair in the page URL, the page path and the display language. Use this to ground a quote in what the person is actually looking at.",
        "inputSchema": {
          "type": "object",
          "properties": {}
        },
        "readOnly": true
      }
    ]
  },
  "serverMcp": {
    "status": "live",
    "endpoint": {
      "url": "https://monivo.io/api/public/mcp",
      "transport": "streamable-http",
      "methods": [
        "POST"
      ],
      "note": "POST-only JSON-RPC. A GET returns 405 by design."
    },
    "authentication": {
      "required": true,
      "type": "oauth",
      "issuer": "https://qzzmcksilubvqwhlszci.supabase.co/auth/v1",
      "acceptedAudiences": [
        "authenticated"
      ],
      "protectedResourceMetadata": "https://monivo.io/.well-known/oauth-protected-resource",
      "note": "Every tool call requires a bearer token for a signed-in Monivo user. There is no anonymous access to this server."
    },
    "policies": {
      "custody": "none — the third-party provider selected for a route holds the deposit during settlement; Monivo never takes custody.",
      "humanConfirmationRequired": [
        "create_swap_order"
      ],
      "anonymousAccess": false,
      "scope": "Crypto-to-crypto swaps only. Fiat on-ramp and off-ramp are not exposed through MCP."
    },
    "humanConfirmationRequired": [
      "create_swap_order"
    ],
    "tools": [
      {
        "name": "list_supported_assets",
        "title": "List supported assets",
        "description": "Look up assets by free-text query (matches symbol, name, or former ticker) and/or network. IMPORTANT: this returns a short hand-picked list of common assets, NOT the full catalog — Monivo's providers support far more. An asset missing from this list is not evidence that Monivo cannot swap it; attempt a quote instead, and the providers will say whether the pair is supported. The full human-readable catalog is at https://monivo.io/currencies. Many tickers exist on several networks (USDT on Ethereum, Tron and BSC are different assets with different addresses and fees), so always resolve the network before quoting.",
        "readOnly": true,
        "requiresHumanConfirmation": false
      },
      {
        "name": "get_market_price",
        "title": "Get market price",
        "description": "Get the current USD market price for one or more cryptocurrencies by ticker symbol (BTC, ETH, USDT, SOL, etc.). Backed by Monivo's cached CMC feed; suitable for sizing a swap or showing a user the going rate.",
        "readOnly": true,
        "requiresHumanConfirmation": false
      },
      {
        "name": "get_swap_quote",
        "title": "Get swap quote",
        "description": "Get live swap quotes from the connected providers and return the one with the highest expected delivered output. Monivo compares only the providers connected to it right now (changenow, simpleswap, letsex, stealthex, godex, changelly, fixedfloat, changehero, lizex) — this is not a survey of the whole market, so do not describe the result as the cheapest rate available anywhere. Monivo adds no fee or markup of its own; the provider's spread and network fees are already reflected in the quoted output. Because those costs are largely fixed per transaction, small amounts lose a disproportionate share and may return no usable quote at all. Non-custodial: the user always sends from their own wallet, and the selected provider — not Monivo — executes the swap and holds the deposit during settlement. Set `fixed: true` to lock the output amount; a fixed quote holds only until it expires and only if the exact quoted input amount arrives inside the provider's deposit window, otherwise the provider's own terms apply. Monivo performs no identity verification for crypto-to-crypto swaps, but the executing provider may request verification on an individual order under its own AML policy — never promise the user that no verification can occur.",
        "readOnly": true,
        "requiresHumanConfirmation": false
      },
      {
        "name": "create_swap_order",
        "title": "Create swap order",
        "description": "Create a swap order with the chosen provider. REQUIRES EXPLICIT HUMAN CONFIRMATION: before calling this, show the human the pair, the exact send amount, the expected output, the provider, the rate type and the destination address, and get their explicit go-ahead. Never call this speculatively, to explore, or to retry without asking again. Returns the deposit address, exact send amount, expiration, and (for FixedFloat) a `token` that must be passed back to `get_swap_status`. The user must send exactly `fromAmount` to `payinAddress` from their own wallet, on the correct network, before the quote expires — a wrong network, a wrong amount or a late deposit is handled under the provider's terms and may be refunded at a floating rate rather than the quoted one. The destination address cannot be changed after the order is created; have the human verify it character by character.",
        "readOnly": false,
        "requiresHumanConfirmation": true
      },
      {
        "name": "get_swap_status",
        "title": "Get swap status",
        "description": "Check the current lifecycle status of a previously created swap order. Lifecycle: waiting → confirming → exchanging → sending → finished. Side branches: refunded, failed, expired, and `verifying`, which means the executing provider has requested identity verification for that specific order under its own AML policy — that is the provider's decision, not a Monivo requirement. Status is reported by the executing provider; Monivo relays it and does not control settlement timing.",
        "readOnly": true,
        "requiresHumanConfirmation": false
      }
    ],
    "card": "https://monivo.io/.well-known/mcp.json"
  },
  "anonymousEndpoints": [
    {
      "id": "facts",
      "url": "https://monivo.io/api/public/facts.json",
      "mediaType": "application/json",
      "summary": "Structured facts about Monivo: identity, mechanism, fee model, verification scope, coverage, endpoints."
    },
    {
      "id": "knowledge",
      "url": "https://monivo.io/api/public/knowledge.txt",
      "mediaType": "text/plain",
      "summary": "Long-form plain-text description of Monivo. Accepts ?lang= for each published locale."
    },
    {
      "id": "quote",
      "url": "https://monivo.io/api/public/quote.json",
      "mediaType": "application/json",
      "summary": "Anonymous read-only swap pricing: live provider estimates for a pair and amount, ranked by expected delivered output. No account, no key. Read-only — order creation is not exposed here."
    },
    {
      "id": "rate-index",
      "url": "https://monivo.io/api/public/rate-index.json",
      "mediaType": "application/json",
      "summary": "Monivo Crypto Swap Rate Index — sampled provider rate-dispersion dataset. Free to reuse with attribution."
    },
    {
      "id": "rate-index-badge",
      "url": "https://monivo.io/api/public/rate-index/badge.svg",
      "mediaType": "image/svg+xml",
      "summary": "Embeddable SVG badge showing the current Rate Index headline figure."
    },
    {
      "id": "openapi",
      "url": "https://monivo.io/api/public/openapi.json",
      "mediaType": "application/json",
      "summary": "OpenAPI 3.1 description of Monivo's public read-only endpoints."
    },
    {
      "id": "webmcp",
      "url": "https://monivo.io/api/public/webmcp.json",
      "mediaType": "application/json",
      "summary": "Agent surface document: the browser WebMCP tools Monivo registers on the page, the authenticated server MCP, and live Rate Index figures read from the Rate Index endpoint at request time."
    }
  ],
  "marketData": {
    "policy": "The Rate Index endpoint is the only source of market figures in this document. Nothing here is hardcoded, cached or extrapolated; when the live read fails the figures are omitted rather than estimated.",
    "rateIndex": {
      "available": true,
      "source": "https://monivo.io/api/public/rate-index.json",
      "humanReadable": "https://monivo.io/research/crypto-swap-rate-index",
      "window": "30d",
      "license": "Free to reuse with attribution and a link to the source URL.",
      "citation": "Monivo Crypto Swap Rate Index — https://monivo.io/research/crypto-swap-rate-index",
      "method": "Every connected provider that can route a pair is asked for the same amount, rate type and instant; the gap between the best and worst fillable payout is recorded per quote set.",
      "limitations": "A sample of the quotes returned to Monivo, not a census of the market. Figures move as new observations land.",
      "observed": {
        "quotes": 1000,
        "providers": 8,
        "pairs": 12,
        "comparableQuoteSets": 179,
        "medianSpreadPercent": 1.7,
        "meanSpreadPercent": 1.83,
        "firstObservedAt": "2026-09-14T08:00:09.239742+00:00",
        "lastObservedAt": "2026-09-14T08:41:14.479398+00:00"
      },
      "widestPairs": [
        {
          "from": "BTC",
          "to": "XMR",
          "comparableQuoteSets": 15,
          "medianSpreadPercent": 2.65,
          "widestSpreadPercent": 3.21
        },
        {
          "from": "XMR",
          "to": "BTC",
          "comparableQuoteSets": 15,
          "medianSpreadPercent": 2.52,
          "widestSpreadPercent": 3.03
        },
        {
          "from": "USDT",
          "to": "BTC",
          "comparableQuoteSets": 15,
          "medianSpreadPercent": 1.79,
          "widestSpreadPercent": 2.11
        },
        {
          "from": "ETH",
          "to": "USDT",
          "comparableQuoteSets": 15,
          "medianSpreadPercent": 1.72,
          "widestSpreadPercent": 1.75
        },
        {
          "from": "USDT",
          "to": "ETH",
          "comparableQuoteSets": 15,
          "medianSpreadPercent": 1.72,
          "widestSpreadPercent": 1.8
        },
        {
          "from": "BTC",
          "to": "ETH",
          "comparableQuoteSets": 16,
          "medianSpreadPercent": 1.67,
          "widestSpreadPercent": 1.74
        },
        {
          "from": "BTC",
          "to": "USDT",
          "comparableQuoteSets": 15,
          "medianSpreadPercent": 1.67,
          "widestSpreadPercent": 1.79
        },
        {
          "from": "ETH",
          "to": "BTC",
          "comparableQuoteSets": 15,
          "medianSpreadPercent": 1.66,
          "widestSpreadPercent": 1.98
        },
        {
          "from": "XMR",
          "to": "USDT",
          "comparableQuoteSets": 15,
          "medianSpreadPercent": 1.64,
          "widestSpreadPercent": 1.74
        },
        {
          "from": "XMR",
          "to": "USDC",
          "comparableQuoteSets": 15,
          "medianSpreadPercent": 1.61,
          "widestSpreadPercent": 1.74
        }
      ],
      "retrievedAt": "2026-09-14T08:46:02.530Z"
    }
  },
  "contact": {
    "email": "support@monivo.io",
    "website": "https://monivo.io"
  }
}
