https://app.ravn.exchange/api/mcp
Transport: Streamable HTTP
Auth: None required. Every tool works anonymously; pass your own API key as the optional
apiKey argument on any tool for a higher rate limit (see Authentication).
Cost: Free. These tools call the same free /v1/* endpoints as the REST API, not the
paid x402 endpoints.
Add to Claude.ai
One click, no config file editing. Opens Claude.ai’s “Add custom connector” dialog with RAVN’s
name and endpoint pre-filled, so you just review and confirm.
Add to Cursor
One click from a machine with Cursor installed. Opens Cursor’s MCP install dialog with RAVN’s
name and endpoint pre-filled.
No equivalent deep link exists for Codex CLI yet. It only supports
codex mcp add for local
(stdio) servers, and remote HTTP servers like RAVN’s have to go in config.toml by hand. See
the Codex tab below.Connect a client
Try it: one prompt, one loop
With the config above added, prompt your client with something like:Swap 0.01 ETH on Ethereum to USDC on Base for 0x1234…5678, my wallet address.A capable MCP client resolves that into:
ravn_quote({ inputChainId: 1, outputChainId: 8453, inputToken: "0xEeee...EEeE", outputToken: "<Base USDC address>", inputAmount: "10000000000000000", userAddress: "0x1234...5678" })→ returns aquoteTokenplus the priced route.ravn_execute({ quoteToken })→ returns{ executionType: "TRANSACTION", transaction: {...} }for this route (0x Gasless/RFQ-style routes instead returnSIGNATURE).- Your agent signs and sends the returned
transactionwith its own wallet; RAVN never touches it. ravn_status({ quoteToken, ref: <statusRef from step 2> }), polled untilstatusis terminal (success,refunded, orfailed).
transaction looks like for each executionType, and Signing: who holds the wallet?
for how an autonomous agent handles step 3 without a human clicking “confirm.”
Tools
ravn_quote
Get a swap quote, same-chain or cross-chain, across all 17 supported chains including native
Bitcoin and Solana as source or destination. Returns a quoteToken to pass to ravn_execute,
plus an executable flag: false means the quote is a preview only, priced against a
placeholder address rather than the ones you supplied (or didn’t), and ravn_execute will
reject it with QUOTE_NOT_EXECUTABLE.
Response fields worth knowing about beyond
quoteToken and executable:
ravn_execute
Turn a quoteToken from ravn_quote into an execution payload.
Returns one of three shapes, tagged by
executionType:
TRANSACTION: sign and broadcast yourselfSIGNATURE: sign, RAVN submits on your behalfDEPOSIT: send the input asset to a given address (the common case for Bitcoin-source swaps; seeravn_btc_prepare_sendbelow)
ravn_submit_signature
For a SIGNATURE-type ravn_execute result only: submit the signature(s) you collected (over
typedData, and approvalData if present) to actually place the order. RAVN decodes the venue
from quoteToken and routes to the right venue-specific submit path, you never touch a
per-venue endpoint.
Returns a
statusRef, pass it to ravn_status as ref to poll this swap.
ravn_status
Poll a swap’s status.
Status is authoritative where the venue exposes it. Jupiter is the one venue that reports
"unknown" honestly rather than guessing. Check the response’s tracking field. Once
terminal, deliveredAmount and txHash are included when the venue reports them, txHash is
only ever populated once the swap is done, never while it’s still in flight.
ravn_health
No arguments. Liveness check across every venue RAVN routes through, useful to call before a
swap if you want to know whether a route is degraded ahead of time.
ravn_tokens
RAVN’s own listed token registry for one chain. Populate a token picker without hardcoding one.
This is “what RAVN knows about and might route,” not a per-pair routability guarantee for any
specific pair, call ravn_quote to check that.
Returns an array of
{ symbol, name, address, decimals, chainId, isNative, logoUrl? }.
ravn_tokens_resolve
Resolve an arbitrary token address to its metadata (symbol, name, decimals) via an on-chain
read, for a paste-any-address flow when the token isn’t necessarily on ravn_tokens’s list.
Returns
{ token: {...same shape as ravn_tokens's items} }.
ravn_btc_coverage
For a swap where native BTC is the source, not every token on the destination chain is
reachable. Returns which of ravn_tokens’s list on chainId a BTC venue can actually route
to, and how many venues serve each, so you can build a token list that matches what will really
quote instead of discovering it one NO_LIQUIDITY at a time.
BTC-as-source only. Selling a token into BTC isn’t restricted the same way (nearly any
token can be sold into BTC), so this has nothing useful to say about that direction.
Returns
{ chainId, filtered, coverage }. coverage maps a lowercased token address to the
number of BTC venues (1 to 3) that route to it, a token no venue serves is omitted, not listed
at 0. filtered: false means the upstream venue lists couldn’t be reached right now, treat
that as unknown, not as “nothing routes.”
ravn_chains
Every chain RAVN lists a token registry for (see ravn_tokens). Static, doesn’t change per
request, safe to cache instead of hardcoding a chain table.
No arguments beyond the optional apiKey. Returns an array of { chainId, name, shortName, nativeCurrency: { name, symbol, decimals }, explorerUrl, logoUrl? }.
ravn_btc_prepare_send
Turns a DEPOSIT-type ravn_execute result into a ready-to-sign Bitcoin transaction (a PSBT),
so your agent doesn’t have to implement UTXO selection or fee estimation itself.
UTXOs and the fee rate are fetched from the public mempool.space API,
with no keys and no auth required.
RAVN never sees or handles a private key at any point. The response is an unsigned PSBT
(
psbtBase64): sign it with your own wallet’s key and broadcast it yourself.Chain IDs
Bitcoin and Solana use negative sentinel IDs rather than their (non-existent, in Bitcoin’s
case) EVM chain IDs. Don’t assume 0 or a positive placeholder.
A full loop, end to end
ravn_quote: get aquoteTokenravn_execute: get backTRANSACTION,SIGNATURE, orDEPOSITTRANSACTION: sign and broadcast the returnedtransactionwith your own walletSIGNATURE: sign the returnedtypedData(andapprovalData, if present) with your own wallet, then callravn_submit_signaturewith the signature(s) to actually place the order, it returns thestatusRefto poll nextDEPOSIT: if the input asset is Bitcoin,ravn_btc_prepare_send→ sign the PSBT with your own wallet → broadcast. Otherwise, send the input asset to the returned address yourself
ravn_status: poll until terminal

