MCP-Server

ChangeNOW

io.changenow/crypto-swap
Krypto & Web3 Payments & Fintech Öffentlich und erreichbar MCP 2026-07-28

Was dieses MCP kann

Quotes, creates, validates, and tracks non-custodial cross-chain cryptocurrency swap orders.

check_swap_status
Check a swap order
Follow an existing order by id: where it stands, what the deposit and payout amounts turned out to be, the transaction hashes, and a plain-language explanation of what the current stage means and what happens next. Use it after create_swap, and again whenever the user asks where their swap is.
Nur Lesen Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Order id returned by create_swap.'}, 'sub_id': {'type': 'string', 'description': 'Sub order id, for an order the provider split in two.'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['id', 'status', 'stage_explanation', 'provider', 'from', 'to', 'expected_amount_from', 'expected_amount_to', 'amount_from', 'amount_to', 'payin_address', 'payin_extra_id', 'payout_address', 'payout_extra_id', 'refund_address', 'refund_memo', 'payin_hash', 'payout_hash', 'refund_hash', 'refund_amount', 'deposit_received_at', 'valid_until', 'created_at', 'updated_at', 'track_url'], 'properties': {'id': {'type': 'string'}, 'to': {'type': 'string'}, 'from': {'type': 'string'}, 'status': {'type': 'string'}, 'provider': {'enum': ['changenow', 'third-party', 'unknown'], 'type': 'string'}, 'amount_to': {'type': ['string', 'null']}, 'track_url': {'type': 'string'}, 'created_at': {'type': ['string', 'null']}, 'payin_hash': {'type': ['string', 'null']}, 'updated_at': {'type': ['string', 'null']}, 'amount_from': {'type': ['string', 'null']}, 'payout_hash': {'type': ['string', 'null']}, 'refund_hash': {'type': ['string', 'null']}, 'refund_memo': {'type': ['string', 'null']}, 'valid_until': {'type': ['string', 'null']}, 'payin_address': {'type': 'string'}, 'refund_amount': {'type': ['string', 'null']}, 'payin_extra_id': {'type': ['string', 'null']}, 'payout_address': {'type': 'string'}, 'refund_address': {'type': ['string', 'null']}, 'payout_extra_id': {'type': ['string', 'null']}, 'stage_explanation': {'type': 'string'}, 'expected_amount_to': {'type': ['string', 'null']}, 'deposit_received_at': {'type': ['string', 'null']}, 'expected_amount_from': {'type': ['string', 'null']}}, 'additionalProperties': False}
create_swap
Create a swap order
Create a real swap order and return the deposit address the user has to send funds to. This call moves no money by itself, but the order is real: it exists in support, it can expire, and a fixed rate is locked against it. Quote the swap first, validate the recipient address, and confirm the amount and the address with the user before calling this. If the user has not explicitly approved both, use swap_link instead and let them confirm on the page. The answer names who executes the order, and that has to be relayed: some orders are routed to a partner aggregator rather than ChangeNOW.
Externer Zugriff
Eingabeschema
{'type': 'object', 'required': ['from', 'to', 'address'], 'properties': {'to': {'type': 'string', 'description': 'Asset the user receives, canonical id, for example "usdt.trx".'}, 'from': {'type': 'string', 'description': 'Asset the user sends, canonical id, for example "eth.eth".'}, 'memo': {'type': 'string', 'description': 'Memo or destination tag for the recipient address, when the asset needs one.'}, 'address': {'type': 'string', 'description': 'Address that receives the swapped asset. Check it with validate_address first; a wrong network here loses the funds.'}, 'rate_id': {'type': 'string', 'description': 'The rate_id from quote_swap with rate_type "fixed". Required for a fixed rate order. It holds for about two minutes, so quote again right before this call if the user needed time to decide.'}, 'amount_to': {'type': 'string', 'description': 'Amount the user wants to receive. Requires rate_id from quote_swap.'}, 'promo_code': {'type': 'string', 'description': 'Promo code to apply, if the user has one.'}, 'amount_from': {'type': 'string', 'description': 'Amount the user sends. Pass this or amount_to, never both.'}, 'refund_memo': {'type': 'string', 'description': 'Memo for the refund address.'}, 'contact_email': {'type': 'string', 'format': 'email', 'pattern': "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", 'description': 'Optional email for status notifications about this order.'}, 'refund_address': {'type': 'string', 'description': 'Where the deposit returns if the swap cannot complete. Strongly recommended: without it a failed swap needs support.'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['id', 'status', 'provider', 'from', 'to', 'amount_from', 'amount_to', 'rate_type', 'payin_address', 'payin_extra_id', 'payout_address', 'payout_extra_id', 'refund_address', 'refund_memo', 'valid_until', 'created_at', 'track_url', 'warnings'], 'properties': {'id': {'type': 'string'}, 'to': {'type': 'string'}, 'from': {'type': 'string'}, 'status': {'type': ['string', 'null']}, 'provider': {'enum': ['changenow', 'third-party', 'unknown'], 'type': 'string'}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'amount_to': {'type': ['string', 'null']}, 'rate_type': {'enum': ['float', 'fixed'], 'type': 'string'}, 'track_url': {'type': 'string'}, 'created_at': {'type': ['string', 'null']}, 'amount_from': {'type': ['string', 'null']}, 'refund_memo': {'type': ['string', 'null']}, 'valid_until': {'type': ['string', 'null']}, 'payin_address': {'type': 'string'}, 'payin_extra_id': {'type': ['string', 'null']}, 'payout_address': {'type': 'string'}, 'refund_address': {'type': ['string', 'null']}, 'payout_extra_id': {'type': ['string', 'null']}}, 'additionalProperties': False}
get_asset
Asset details
Everything needed to build a swap for one asset: the canonical id, the legacy ticker used in website links, decimals, whether a memo is required and what the receiving side calls it, the address format, the token contract and the warnings to relay to the user. Minimum and maximum amounts are not here because they belong to the pair, not to the asset: get them from quote_swap.
Nur Lesen Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'required': ['asset'], 'properties': {'asset': {'type': 'string', 'description': 'Canonical id "usdt.trx". A legacy ticker "usdttrc20" or a page slug "tether-trc20" is also accepted.'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['asset', 'ticker', 'name', 'network', 'kind', 'fixed_rate', 'memo', 'slug', 'decimals', 'memo_name', 'address_regex', 'memo_regex', 'token_contract', 'warning_send', 'warning_receive', 'explorer_address_url', 'explorer_tx_url', 'price_usd'], 'properties': {'kind': {'type': 'string'}, 'memo': {'type': 'boolean'}, 'name': {'type': 'string'}, 'slug': {'type': ['string', 'null']}, 'asset': {'type': 'string'}, 'ticker': {'type': 'string'}, 'network': {'type': 'string'}, 'decimals': {'type': ['number', 'null']}, 'memo_name': {'type': ['string', 'null']}, 'price_usd': {'type': ['number', 'null']}, 'fixed_rate': {'type': 'boolean'}, 'memo_regex': {'type': ['string', 'null']}, 'warning_send': {'type': ['string', 'null']}, 'address_regex': {'type': ['string', 'null']}, 'token_contract': {'type': ['string', 'null']}, 'explorer_tx_url': {'type': ['string', 'null']}, 'warning_receive': {'type': ['string', 'null']}, 'explorer_address_url': {'type': ['string', 'null']}}, 'additionalProperties': False}
list_assets
List exchangeable assets
Find the assets ChangeNOW can exchange and turn what the user said into a canonical asset id. Search by ticker, name or network, filter by network, by fiat or crypto, and by whether a fixed rate is possible. Always call this before quoting: the same ticker exists on several networks and only the canonical id "ticker.network" identifies one of them. When has_more is false the response is the complete answer and no paging is needed.
Nur Lesen Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'properties': {'q': {'type': 'string', 'description': 'Substring search over canonical id, legacy ticker, name and network. Case insensitive. Example: "usdt", "bitcoin", "tron".'}, 'kind': {'enum': ['crypto', 'fiat', 'all'], 'type': 'string', 'default': 'crypto', 'description': 'crypto for swappable coins and tokens, fiat for currencies that can only start a purchase, all for both.'}, 'limit': {'type': 'integer', 'default': 50, 'maximum': 500, 'minimum': 1, 'description': 'How many assets to return. Default 50, maximum 500.'}, 'cursor': {'type': 'string', 'description': 'Cursor from next_cursor of the previous page. Only needed when has_more is true.'}, 'network': {'type': 'string', 'description': 'Keep only assets on this network, for example "eth", "trx", "sol".'}, 'popular': {'type': 'boolean', 'default': False, 'description': 'Return the short curated list. Use this to answer "what can I swap" without paging.'}, 'fixed_rate': {'type': 'boolean', 'default': False, 'description': 'Keep only assets the catalogue flags as fixed rate capable. The flag is a hint: a pair flagged false can still get a fixed rate, so confirm with quote_swap rather than filtering a user out.'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['assets', 'returned', 'total', 'has_more', 'next_cursor', 'catalogue_version'], 'properties': {'total': {'type': 'number'}, 'assets': {'type': 'array', 'items': {'type': 'object', 'required': ['asset', 'ticker', 'name', 'network', 'kind', 'fixed_rate', 'memo'], 'properties': {'kind': {'type': 'string'}, 'memo': {'type': 'boolean'}, 'name': {'type': 'string'}, 'asset': {'type': 'string'}, 'ticker': {'type': 'string'}, 'network': {'type': 'string'}, 'fixed_rate': {'type': 'boolean'}}, 'additionalProperties': False}}, 'has_more': {'type': 'boolean'}, 'returned': {'type': 'number'}, 'next_cursor': {'type': ['string', 'null']}, 'catalogue_version': {'type': 'string'}}, 'additionalProperties': False}
quote_swap
Quote a swap
Ask what a swap would give, in either direction: pass amount_from to learn what the user receives, or amount_to to learn what the user must send. Returns the rate, the pair minimum and maximum, who would execute the order, and the warnings to relay. With rate_type "fixed" it also returns the rate_id that create_swap needs; that lock lasts about two minutes, so quote again right before creating the order. A fixed rate is not offered on every pair and the tool says so rather than quietly falling back to a float rate. Nothing is created and no funds move.
Nur Lesen Externer Zugriff
Eingabeschema
{'type': 'object', 'required': ['from', 'to'], 'properties': {'to': {'type': 'string', 'description': 'Asset the user receives, canonical id, for example "usdt.trx".'}, 'from': {'type': 'string', 'description': 'Asset the user sends, canonical id, for example "btc.btc".'}, 'amount_to': {'type': 'string', 'description': 'Amount the user wants to receive, as a decimal string. The answer then says how much to send.'}, 'rate_type': {'enum': ['float', 'fixed'], 'type': 'string', 'default': 'float', 'description': 'float: the rate is settled when the deposit arrives. fixed: the rate is held until valid_until, about two minutes, and returns the rate_id create_swap needs, usually at a slightly worse rate. Ask for fixed whenever the user wants a guaranteed number; if this pair cannot hold one the answer says so instead of quietly returning a float rate.'}, 'promo_code': {'type': 'string', 'description': 'Promo code to apply, if the user has one.'}, 'amount_from': {'type': 'string', 'description': 'Amount the user sends, as a decimal string. Pass this or amount_to, never both.'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['from', 'to', 'from_name', 'to_name', 'amount_from', 'amount_to', 'rate', 'rate_type', 'rate_id', 'valid_until', 'min_amount', 'max_amount', 'limits_in', 'provider', 'high_network_fee', 'speed_forecast_minutes', 'quote_id', 'warnings'], 'properties': {'to': {'type': 'string'}, 'from': {'type': 'string'}, 'rate': {'type': ['string', 'null']}, 'rate_id': {'type': ['string', 'null']}, 'to_name': {'type': 'string'}, 'provider': {'enum': ['changenow', 'third-party', 'unknown'], 'type': 'string'}, 'quote_id': {'type': ['string', 'null']}, 'warnings': {'type': 'array', 'items': {'type': 'string'}}, 'amount_to': {'type': ['string', 'null']}, 'from_name': {'type': 'string'}, 'limits_in': {'type': 'string'}, 'rate_type': {'enum': ['float', 'fixed'], 'type': 'string'}, 'max_amount': {'type': ['string', 'null']}, 'min_amount': {'type': ['string', 'null']}, 'amount_from': {'type': ['string', 'null']}, 'valid_until': {'type': ['string', 'null']}, 'high_network_fee': {'type': 'boolean'}, 'speed_forecast_minutes': {'type': ['string', 'null']}}, 'additionalProperties': False}
swap_link
Build a confirmation link
Build a changenow.io link with the pair, the amount, the recipient address and the memo already filled in, so the user checks the numbers on the real page and presses Confirm themselves. Opening the link creates nothing. This is the recommended way to finish a swap: the user sees the rate and the address with their own eyes, which no amount of care in a chat transcript can replace. Use create_swap instead only when the user has explicitly approved this exact amount and address.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['from', 'to'], 'properties': {'to': {'type': 'string', 'description': 'Asset the user receives, canonical id.'}, 'from': {'type': 'string', 'description': 'Asset the user sends, canonical id.'}, 'memo': {'type': 'string', 'description': 'Memo or destination tag to prefill.'}, 'locale': {'type': 'string', 'maxLength': 2, 'minLength': 2, 'description': 'Two letter locale for the page, for example "es". English needs no locale.'}, 'address': {'type': 'string', 'description': 'Recipient address to prefill. The user can still change it on the page.'}, 'amount_to': {'type': 'string', 'description': 'Amount to prefill as the amount received. Implies a fixed rate on the page.'}, 'rate_type': {'enum': ['float', 'fixed'], 'type': 'string', 'default': 'float', 'description': 'Which rate the page opens with.'}, 'amount_from': {'type': 'string', 'description': 'Amount to prefill as the amount sent.'}, 'refund_address': {'type': 'string', 'description': 'Refund address to prefill.'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['url', 'prefilled', 'creates_order', 'notes'], 'properties': {'url': {'type': 'string'}, 'notes': {'type': 'array', 'items': {'type': 'string'}}, 'prefilled': {'type': 'array', 'items': {'type': 'string'}}, 'creates_order': {'type': 'boolean', 'const': False}}, 'additionalProperties': False}
validate_address
Validate a recipient address
Check a recipient address, and its memo when the asset needs one, against the format the network requires, before any order exists. Call this on every address the user gives. A valid-looking address on the wrong network is the one mistake in a swap that destroys the funds with no way back, so when the address belongs to another network the answer names that network instead of just refusing. A few assets carry no address format in the catalogue; for those the answer says the address could not be checked rather than calling it valid.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['asset', 'address'], 'properties': {'memo': {'type': 'string', 'description': 'Memo or destination tag, when the asset needs one.'}, 'asset': {'type': 'string', 'description': 'Asset that will be received at this address, canonical id.'}, 'address': {'type': 'string', 'description': 'Recipient address to check.'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['asset', 'network', 'valid', 'format_checked', 'reason', 'memo_required', 'memo_name', 'memo_valid', 'network_hint', 'warning'], 'properties': {'asset': {'type': 'string'}, 'valid': {'type': 'boolean'}, 'reason': {'type': ['string', 'null']}, 'network': {'type': 'string'}, 'warning': {'type': ['string', 'null']}, 'memo_name': {'type': ['string', 'null']}, 'memo_valid': {'type': ['boolean', 'null']}, 'network_hint': {'type': ['string', 'null']}, 'memo_required': {'type': 'boolean'}, 'format_checked': {'type': 'boolean'}}, 'additionalProperties': False}
Hinzugefügt
check_swap_status
17. September 2026 12:40
Hinzugefügt
create_swap
17. September 2026 12:40
Hinzugefügt
swap_link
17. September 2026 12:40
Hinzugefügt
validate_address
17. September 2026 12:40
Hinzugefügt
quote_swap
17. September 2026 12:40
Hinzugefügt
get_asset
17. September 2026 12:40
Hinzugefügt
list_assets
17. September 2026 12:40

SAP MCP Server

ai.oobeprotocol.sap.mcp/sap-mcp

Provides an MCP gateway connecting SAP-related tools with Solana, DeFi, decentralized identity, and x402 payments.

FortFi Treasury MCP

io.github.rebelArtists/fortfi-treasury-mcp

Provides policy-controlled crypto treasury operations across chains, including wallets, payments, token discovery, swaps, bridges…

DPX — Institutional Cross-Border Settlement

io.github.untitledfinancial/dpx

Provides compliance-gated cross-border crypto settlement, agent registration and spending mandates, stablecoin routing, ESG and s…

Peer

io.github.zkp2p/peer

Reads Peer protocol, checkout, deposit, wallet, Peer Cash, cross-chain routing, payout, and IntentGuardian data on Base and relat…

Robyn — Gasless Cross-Chain for AI Agents

io.github.ox31461/robyn

Supports gasless cross-chain transfers, wallet and transaction checks, spending mandates, privacy-preserving messaging, and signe…

MERX - TRON Resource Exchange

exchange.merx/mcp

Manages TRON energy and bandwidth purchasing, resource monitoring, transaction cost estimation, wallet operations, token transfer…

Wisely x402 Agent-Payment Infrastructure

com.wiselyenterprisesllc/x402-agent-payment-infrastructure

Provides agent payment workflows for x402 endpoints, wallet handoffs, receipts, creator catalogs, local commerce bridges, endpoin…

AgentTools Hub

io.github.Thyphex/agenttools-hub

Offers calculators, unit and data converters, reference lookups, live crypto data, wallet utilities, and paid x402 access.