Koskamo

XRPLHub MCP

XRPLHub MCP provides on-chain creditworthiness tools for the XRP Ledger, including wallet scoring, credential verification, MPT risk assessment, and community grant management. It enables agents to check wallet health, verify permissions, and manage unsigned transactions without holding keys.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

XRPLHub MCP logo, by XRPLHubCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by XRPLHub
MCP endpoint (Streamable HTTP)
https://www.xrplhub.io/api/mcp
Vendor documentation

What its tools do

21 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

21 of 21 have a description · 0 of 21 declare behavior hints · 17 of 18 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Check XRPL wallet credit score and breakdown
  • Verify account credentials and domain eligibility
  • Assess MPT issuer risk and registry data
  • Submit applications for community micro-grants

Source and maintenance

Community listingRegistry 1.18.0
Maintenance checked

Protocol and capabilities

Server
xrplhub 1.18.0
MCP protocol negotiated in check
2024-11-05
Tools
21 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {}
}

Tools

21 advertised

issue_score_credential
Advertised by the server during the last successful anonymous check.

Get a certificate of a wallet's XRPLScore, signed by XRPLHub, with the score computed fresh at issuance. A counterparty checks it by asking XRPLHub's verify URL — the signature is an HMAC under a key only XRPLHub holds, so this is XRPLHub's own attestation, not independently verifiable proof, and the buyer need not control the wallet. Two calls: first returns a Xaman payment request (1 XRP or 1 RLUSD, valid 90 days); call again with the same wallet_address + returned uuid after signing to get certId and verifyUrl. Params: wallet_address (r..., required), currency (XRP|RLUSD, default XRP), uuid (2nd call only). No signup.

issue_score_credential input schema
{
  "type": "object",
  "required": [
    "wallet_address"
  ],
  "properties": {
    "uuid": {
      "type": "string",
      "description": "Only for the second call: the payment uuid returned by the first call, after the user has signed in Xaman."
    },
    "currency": {
      "enum": [
        "XRP",
        "RLUSD"
      ],
      "type": "string",
      "description": "Payment currency. Defaults to XRP."
    },
    "wallet_address": {
      "type": "string",
      "description": "XRP Ledger wallet address the credential will attest to (starts with r)"
    }
  }
}
check_xrpl_score
Advertised by the server during the last successful anonymous check.

Get a 300–850 creditworthiness score for any XRP Ledger wallet before you pay, lend to, trade with, or onboard it. You get back: the score, a letter grade, peer percentile, a per-signal breakdown (account age, lifetime tx history, financial health, token engagement, DEX activity, AMM participation, security config, NFTs), and ranked tips to raise it. Params: wallet_address (r... classic address, 25–35 chars, required). Free — no API key, no signup, 100% public ledger data.

check_xrpl_score input schema
{
  "type": "object",
  "required": [
    "wallet_address"
  ],
  "properties": {
    "wallet_address": {
      "type": "string",
      "description": "XRP Ledger classic address to score (starts with r, 25–35 characters)"
    }
  }
}
get_account_credentials
Advertised by the server during the last successful anonymous check.

Get every XLS-70 credential an XRPL account holds — issuer, type, whether it has been accepted, whether it's expired, and its expiry date. Live against a validated mainnet ledger (never stale). Use this before trusting a counterparty who claims to hold a credential. Default walks the owner directory (bounded ~20s; response has coverage "complete"/"partial" — for an exchange-scale account it can be partial). Pass issuer (and credential_type unless it is XRPLHub's issuer) to do a direct ledger lookup instead — always fast and always complete. Params: wallet_address (r..., required), issuer (r..., optional), credential_type (name or hex, optional). Free, no signup.

get_account_credentials input schema
{
  "type": "object",
  "required": [
    "wallet_address"
  ],
  "properties": {
    "issuer": {
      "type": "string",
      "description": "Optional — restrict to one issuer via a direct ledger lookup (no owner-directory walk)"
    },
    "wallet_address": {
      "type": "string",
      "description": "XRPL classic address to look up (starts with r)"
    },
    "credential_type": {
      "type": "string",
      "description": "Optional — credential type (plain name or hex); required with issuer unless the issuer is XRPLHub's"
    }
  }
}
get_issuer_credentials
Advertised by the server during the last successful anonymous check.

Get everything an issuer account has issued: every credential type, distinct subject count, and acceptance rate. Served from a network-wide census rebuilt on a schedule — the response includes coverage ("complete" or "partial") so a mid-walk answer is never mistaken for a finished count. Params: issuer_address (r..., required). Free, no signup.

get_issuer_credentials input schema
{
  "type": "object",
  "required": [
    "issuer_address"
  ],
  "properties": {
    "issuer_address": {
      "type": "string",
      "description": "XRPL classic address of the credential issuer (starts with r)"
    }
  }
}
check_mpt_risk
Advertised by the server during the last successful anonymous check.

Get the risk view of one XLS-33 Multi-Purpose Token issuance before touching it: what the issuer CAN DO to a holder (clawback, freeze, require-auth, whether it's transferable at all) plus the issuer's XRPLScore. Free. For the full issuer picture — account age, xrp-ledger.toml-verified domain, credentials held (live ledger reads) — GET /api/x402/usdc/mpt/{id} pays $0.01 USDC on Base via x402. Every response states its source and returns 'unknown', never 'does not exist', when an issuance isn't found. Params: issuance_id (48-hex MPTokenIssuanceID, required). No signup.

check_mpt_risk input schema
{
  "type": "object",
  "required": [
    "issuance_id"
  ],
  "properties": {
    "issuance_id": {
      "type": "string",
      "description": "The MPTokenIssuanceID — 48 hexadecimal characters (XLS-33, 192-bit)"
    }
  }
}
search_mpts
Advertised by the server during the last successful anonymous check.

Search the XRPL Multi-Purpose Token (XLS-33) registry index by issuer address, MPTokenIssuanceID (or a hex prefix of one), or token name / ticker. Returns each match with issuer powers (clawback, freeze, require-auth, transferable), supply, holder count and source. Served from the index — the response carries coverage ('complete' or 'partial') and lastCompletedPassAt; treat 'partial' as a floor, not the whole population. Params: q (required). Free, no signup.

search_mpts input schema
{
  "type": "object",
  "required": [
    "q"
  ],
  "properties": {
    "q": {
      "type": "string",
      "description": "Issuer address (r...), MPTokenIssuanceID or hex prefix, or token name/ticker"
    }
  }
}
get_issuer_mpts
Advertised by the server during the last successful anonymous check.

Everything one issuer has put out as Multi-Purpose Tokens (XLS-33), from the registry index, plus the issuer's own XRPLScore. Each issuance lists the issuer's powers over a holder. Response carries coverage ('complete-per-known-issuer'/'partial'). Params: issuer_address (r..., required). Free, no signup.

get_issuer_mpts input schema
{
  "type": "object",
  "required": [
    "issuer_address"
  ],
  "properties": {
    "issuer_address": {
      "type": "string",
      "description": "XRPL issuer address (starts with r)"
    }
  }
}
check_service_health
Advertised by the server during the last successful anonymous check.

Check whether the XRPLHub money path is working BEFORE you pay: database, Xaman, both x402 facilitators (t54 RLUSD + CDP USDC-on-Base), the on-ledger anchor config, the credential signing secret, and alerting. Returns overall "ok" | "warn" | "down" plus a per-component list. Poll this if a prior paid call failed. No params. Free, no signup.

check_service_health input schema
{
  "type": "object",
  "properties": {}
}
verify_mpt_registry
Advertised by the server during the last successful anonymous check.

Get the latest on-ledger anchor of the MPT registry (BIS Working Paper 1374 pattern): a Merkle root over the canonicalised index, committed in a Memo on a transaction from a dedicated anchor wallet (not the credential issuer). Returns the root, its tx hash, ledger index, issuance/issuer counts, coverage, and the exact canonicalisation + Merkle scheme so you can reproduce the root from the published /api/mpt/search + /api/mpt/issuer data and check that those rows match the root we anchored on-ledger at a known time (proves published-rows-match-anchored-root, not immutability). No params. Free, no signup.

verify_mpt_registry input schema
{
  "type": "object",
  "properties": {}
}
check_domain_eligibility
Advertised by the server during the last successful anonymous check.

Check whether an XRPL account holds a credential that satisfies a PermissionedDomain (XLS-80d) — the question every domain operator and every would-be participant actually asks before a real transaction. Live against a validated mainnet ledger. Eligibility is OR: any ONE accepted, unexpired credential matching the domain's AcceptedCredentials is enough. Params: wallet_address (r..., required), domain_id (64-hex DomainID, the PermissionedDomain ledger index, required). Free, no signup.

check_domain_eligibility input schema
{
  "type": "object",
  "required": [
    "wallet_address",
    "domain_id"
  ],
  "properties": {
    "domain_id": {
      "type": "string",
      "description": "The PermissionedDomain's ledger index — 64 hex characters"
    },
    "wallet_address": {
      "type": "string",
      "description": "XRPL classic address to check (starts with r)"
    }
  }
}
submit_grant_application
Advertised by the server during the last successful anonymous check.

Apply for a community micro-grant ($25–$100) paid wallet-to-wallet from the XRPLHub on-chain treasury for rent, utilities, groceries, medical, transport, or childcare. Returns a grant id and status. A person reviews every application and makes every decision — no automated triage, no middleman. Params: wallet_address (r..., required), category (RENT|UTILITIES|GROCERIES|MEDICAL|TRANSPORT|CHILDCARE|OTHER, required), amount (25–100, required), description (2–4 sentences, required). No signup.

submit_grant_application input schema
{
  "type": "object",
  "required": [
    "wallet_address",
    "category",
    "amount",
    "description"
  ],
  "properties": {
    "amount": {
      "type": "number",
      "description": "Amount requested in RLUSD (1–100)"
    },
    "category": {
      "type": "string",
      "description": "Grant category: RENT, UTILITIES, GROCERIES, MEDICAL, TRANSPORT, CHILDCARE, or OTHER"
    },
    "currency": {
      "type": "string",
      "description": "Payout currency. Default and recommended: RLUSD"
    },
    "description": {
      "type": "string",
      "description": "Clear description of the need, situation, and urgency (2–4 sentences). Be specific — vague applications are harder for the reviewer to verify."
    },
    "wallet_address": {
      "type": "string",
      "description": "XRPL wallet address where the grant will be sent if approved"
    }
  }
}
donate_to_community_fund
Advertised by the server during the last successful anonymous check.

Donate XRP or RLUSD to the XRPLHub Community Grant Treasury — a transparent on-chain fund that pays approved applicants wallet-to-wallet with zero overhead. Returns the treasury address and, if you pass donor_wallet, a ready-to-sign Payment txjson; every donation and payout is recorded on the XRP Ledger and publicly verifiable. Params: amount (number, required), currency (XRP|RLUSD, default XRP), donor_wallet (r..., optional), message (optional). No signup.

donate_to_community_fund input schema
{
  "type": "object",
  "required": [
    "amount"
  ],
  "properties": {
    "amount": {
      "type": "number",
      "description": "Amount to donate. Minimum 1. Any size welcome — even 1-5 XRP helps fund a real grant."
    },
    "message": {
      "type": "string",
      "description": "Optional. A short dedication or message to attach to the donation record."
    },
    "currency": {
      "type": "string",
      "description": "XRP or RLUSD. Default: XRP. Use RLUSD for a stable USD-equivalent donation."
    },
    "donor_wallet": {
      "type": "string",
      "description": "Optional. XRPL wallet address of the donor. Providing this allows building a ready-to-sign Payment transaction."
    }
  }
}
screen_address_ofac
Advertised by the server during the last successful anonymous check.

Compare one XRPL address against a vintage-pinned snapshot of the US Treasury OFAC SDN list (exact address-string match only) and get a factual, Merkle-anchored receipt. ATTESTS TO PROCESS, NOT GROUND TRUTH: the receipt records that the address was compared against a named list snapshot (its OFAC publish date + the SHA-256 of the exact file) at a stated time, and what the comparison found. A "no match" means the address did NOT appear on that list version — it is NOT a statement that the address is clean, safe, or unsanctioned. This is not legal or compliance advice, makes no compliance decision, and does not discharge your own screening obligations. Scope: OFAC SDN only — no EU/UK/UN lists, no name/alias/fuzzy matching, no transaction-graph analysis. Returns queryId (verify it later with verify_attestation), the list {name,vintage,sha256}, result {listed, matches[]}, and a one-sentence factual statement. Params: address (r..., required). Free via MCP. Terms: /legal/screening.

screen_address_ofac input schema
{
  "type": "object",
  "required": [
    "address"
  ],
  "properties": {
    "address": {
      "type": "string",
      "description": "XRPL classic address (r..., 25–35 chars) to compare against the OFAC SDN list"
    }
  }
}
get_monitoring_info
Advertised by the server during the last successful anonymous check.

Describe XRPLHub's continuous-monitoring service so an agent can decide whether to use it: what it watches for a list of wallets (score drops against a threshold YOU set, OFAC SDN list hits, and — once XLS-66 activates — first loan / overdue / impaired / defaulted), how it is delivered (HMAC-signed webhooks, once-a-day checks, attested Merkle-anchored history), per-plan watch slots, the shared capacity limit, the consumer-use acknowledgement text that subscribing requires (no FCRA/ECOA consumer credit, insurance, employment or housing decisions) and the endpoints. Layered on top of underwriting, never a replacement; no recommendation, no probability of default. Subscribing needs an API key over HTTP (POST /api/monitor/subscribe), not this tool. No params. Free.

get_monitoring_info input schema
{
  "type": "object",
  "properties": {}
}
verify_attestation
Advertised by the server during the last successful anonymous check.

Given a queryId from screen_address_ofac OR get_lending_exposure, return everything needed to verify that receipt WITHOUT trusting XRPLHub: the canonical leaf, its Merkle inclusion proof, the on-ledger anchor transaction hash + ledger close time, and the SHA-256 of the source data (the OFAC SDN snapshot, or — for lending — the exact list of Loan ids observed). Rebuild the leaf, fold the proof to the Merkle root, confirm that root is in the anchor tx's MemoData. Before the daily anchor runs it shows status "pending" with the leaf hash only. Params: query_id (UUID, required). Free, no signup.

verify_attestation input schema
{
  "type": "object",
  "required": [
    "query_id"
  ],
  "properties": {
    "query_id": {
      "type": "string",
      "description": "The queryId (UUID) from screen_address_ofac or get_lending_exposure"
    }
  }
}
get_lending_exposure
Advertised by the server during the last successful anonymous check.

A borrower's TOTAL XLS-66 lending exposure across ALL loan brokers in one call — the XRP Ledger has no aggregate borrower-debt object, so a broker carrying first-loss capital cannot see a borrower's total leverage elsewhere. Returns: outstanding by asset, loan count, distinct broker count, defaults / impairments / overdue, XRPLHub's XRPLScore, and an observation history summary. IMPORTANT: XLS-66 keeps CURRENT exposure only. A defaulted loan zeroes its own amounts (the flag is the credit event, not the balance), and either the borrower or the broker can delete a paid or defaulted loan to reclaim the borrower's reserve — a borrower can erase evidence of their own default. Every call here persists an immutable Merkle-anchored snapshot. `disposition` = 'no-loans-ever' means we have never observed a loan (NOT proof of none); 'history-only' means loans were seen before but none are on the ledger now. XLS-66 is not yet enabled on mainnet — until it is, this returns amendment-not-active with the live XRPLScore. Not underwriting or credit advice. Params: borrower (r..., required). Free via MCP.

get_lending_exposure input schema
{
  "type": "object",
  "required": [
    "borrower"
  ],
  "properties": {
    "borrower": {
      "type": "string",
      "description": "XRPL classic address (r..., 25–35 chars) of the borrower"
    }
  }
}
get_underwriting_inputs
Advertised by the server during the last successful anonymous check.

The full underwriting-inputs bundle a LoanBroker needs for an XLS-66 decision, in one call: cross-broker exposure, XRPLScore + grade, OFAC SDN screening (with its own verifiable receipt), observation history + gaps, and one Merkle-anchored attestation over the whole bundle. FACTS ONLY — it never returns a recommended principal, rate, approve/decline, or probability of default; the broker decides. This is a PAID x402 call: $0.05 USDC on Base at GET /api/x402/lending/underwrite?borrower=r... (no free tier, no API key). For the free components use get_lending_exposure and screen_address_ofac. This tool returns the payment resource details. Params: borrower (r..., required).

get_underwriting_inputs input schema
{
  "type": "object",
  "required": [
    "borrower"
  ],
  "properties": {
    "borrower": {
      "type": "string",
      "description": "XRPL classic address (r...) of the borrower"
    }
  }
}
precheck_payment
Advertised by the server during the last successful anonymous check.

Before your agent pays an XRPL address: one verdict (block / caution / proceed) by fixed published rules — the destination's XRPLScore, a sanctions screen against every list XRPLHub holds (with a verifiable receipt), account age and ledger flags, and whether the ledger would REJECT the payment (missing destination tag, Deposit Authorization, no RLUSD trust line, unfunded account). This is a PAID x402 call: $0.03 in USDC on Base or RLUSD on the XRP Ledger at GET /api/x402/precheck. This tool returns the payment resource to call; it does not run the check. Params: destination (r..., required), amount, currency (XRP|RLUSD), destination_tag, from (your paying address).

precheck_payment input schema
{
  "type": "object",
  "required": [
    "destination"
  ],
  "properties": {
    "from": {
      "type": "string",
      "description": "Optional: your paying address — lets the check test Deposit Authorization preauth"
    },
    "amount": {
      "type": "string",
      "description": "Optional: the amount you intend to send (plain decimal)"
    },
    "currency": {
      "enum": [
        "XRP",
        "RLUSD"
      ],
      "type": "string",
      "description": "Optional: XRP (default when amount is given) or RLUSD"
    },
    "destination": {
      "type": "string",
      "description": "The XRPL address (r...) you are about to pay"
    },
    "destination_tag": {
      "type": "integer",
      "description": "Optional: the destination tag you will use"
    }
  }
}
check_wallet_permissions
Advertised by the server during the last successful anonymous check.

Who can move money out of an XRPL wallet: its master key, a regular key, a multi-sign signer list, permission delegations (given and received — live on mainnet since 2026-10-08), and money others can pull without a new approval (checks, payment channels, escrows, open DEX and NFT offers, tickets). One plain-English sentence per finding plus the raw ledger facts. This is a PAID x402 call: $0.02 in USDC on Base or RLUSD on the XRP Ledger at GET /api/x402/permissions?address=r.... This tool returns the payment resource to call; it does not run the check. People can use the free page at https://www.xrplhub.io/permissions.

check_wallet_permissions input schema
{
  "type": "object",
  "required": [
    "address"
  ],
  "properties": {
    "address": {
      "type": "string",
      "description": "The XRPL account (r...) to check"
    }
  }
}
prepare_batch_send
Advertised by the server during the last successful anonymous check.

Pay 2 to 8 XRPL addresses with ONE signature, all or nothing (XRPL Batch, tfAllOrNothing — live on mainnet since 2026-10-09). Checks every payment on the live ledger first (destination exists or will be created, destination tag, Deposit Authorization, RLUSD trust line, sender balance + fee) and refuses a batch that would fail. Returns the UNSIGNED Batch transaction and a Xaman sign link. FREE. XRPLHub never signs: the sender signs with its own wallet, before sending any other transaction from that account (the batch uses the next sequence numbers).

prepare_batch_send input schema
{
  "type": "object",
  "required": [
    "from",
    "recipients"
  ],
  "properties": {
    "from": {
      "type": "string",
      "description": "The paying XRPL account (r...)"
    },
    "recipients": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "address",
          "amount"
        ],
        "properties": {
          "amount": {
            "type": "string",
            "description": "Plain decimal, e.g. \"10\" or \"2.5\""
          },
          "address": {
            "type": "string"
          },
          "currency": {
            "enum": [
              "XRP",
              "RLUSD"
            ],
            "type": "string"
          },
          "destinationTag": {
            "type": "integer"
          }
        }
      },
      "maxItems": 8,
      "minItems": 2
    }
  }
}
get_lending_history
Advertised by the server during the last successful anonymous check.

Every loan XRPLHub has EVER observed for a borrower, built from append-only exposure snapshots — the credit file the XRP Ledger can't keep. Per loan: first/last observed ledger, last-known status, monotonic everDefaulted / everImpaired / everOverdue flags, and for loans since deleted from the ledger, the ledger window in which they vanished. A borrower who defaulted and then deleted the loan shows nothing on-ledger; here it shows as vanished with everDefaulted true. `observationWindow` says how far back our view goes — loans deleted before we first saw this borrower are invisible to us. Params: borrower (r..., required). Free, no signup.

get_lending_history input schema
{
  "type": "object",
  "required": [
    "borrower"
  ],
  "properties": {
    "borrower": {
      "type": "string",
      "description": "XRPL classic address (r...) of the borrower"
    }
  }
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-07: 2 of 2 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
462 ms
95th percentile latency
462 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 462 ms · metadata changed · 21 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http xrplhub-mcp https://www.xrplhub.io/api/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add xrplhub-mcp --url https://www.xrplhub.io/api/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable xrplhub-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "xrplhub-mcp": {
      "url": "https://www.xrplhub.io/api/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "xrplhub-mcp": {
      "type": "streamableHttp",
      "url": "https://www.xrplhub.io/api/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start xrplhub-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "xrplhub-mcp": {
      "type": "http",
      "url": "https://www.xrplhub.io/api/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http xrplhub-mcp https://www.xrplhub.io/api/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://www.xrplhub.io/api/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "xrplhub-mcp": {
      "serverUrl": "https://www.xrplhub.io/api/mcp"
    }
  }
}

Let your agent find its tools

Find servers like XRPLHub MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.