npm arb-dex-mcpstdioMITupdated 17d ago
Live cross-DEX crypto prices for your AI agent โ per-venue pool price, pool liquidity and the gross cross-venue spread on 6 EVM chains, read straight from on-chain pool state.
What can you do with Cross DEX Prices & Spreads?
arb-dex-mcp
Live cross-DEX crypto prices for your AI agent โ per-venue pool price, pool liquidity and the gross cross-venue spread on 6 EVM chains, read straight from on-chain pool state.
Chains: BSC ยท Polygon ยท Arbitrum ยท Base ยท Avalanche ยท Optimism. Venues: PancakeSwap (v2 + v3), Uniswap v3, SushiSwap, QuickSwap, Biswap, ApeSwap, BaseSwap, Trader Joe, Pangolin โ every v2-style pool and every v3 fee tier separately, because a $12k 1% pool and a $19M 0.01% pool are not the same quote.
Nothing is modelled, estimated or backfilled. Every payload states its own block number and carries its own scope note, so an agent that quotes a figure also has the caveats attached to it.
Works with no API key against a free hourly public snapshot. Docs ยท npm
Quickstart
Nothing to clone or build. Your MCP client fetches the package. Requires Node 18+.
Claude Desktop
claude_desktop_config.json โ macOS ~/Library/Application Support/Claude/,
Windows %APPDATA%\Claude\:
{
"mcpServers": {
"arb-dex": {
"command": "npx",
"args": ["-y", "arb-dex-mcp"],
"env": {
"RAPIDAPI_KEY": "your-rapidapi-key-here"
}
}
}
}
Restart Claude Desktop; the six tools appear under the connectors icon.
Drop the env block entirely to run keyless โ the server still starts and the
free-snapshot tools still answer.
Claude Code
claude mcp add arb-dex --env RAPIDAPI_KEY=your-rapidapi-key-here -- npx -y arb-dex-mcp
Keyless:
claude mcp add arb-dex -- npx -y arb-dex-mcp
Then /mcp to confirm it connected.
Cursor
~/.cursor/mcp.json (global) or .cursor/mcp.json (per project):
{
"mcpServers": {
"arb-dex": {
"command": "npx",
"args": ["-y", "arb-dex-mcp"],
"env": {
"RAPIDAPI_KEY": "your-rapidapi-key-here"
}
}
}
}
Cursor โ Settings โ MCP shows the server and its tools once the file is saved.
Any other MCP client
Same three facts: command npx, args ["-y", "arb-dex-mcp"], transport stdio,
optional env RAPIDAPI_KEY.
Try it
Real prompts, and the real shape that comes back. Payloads below were measured live on 2026-08-15; they are trimmed for width but nothing is invented.
1. "What is WBNB/USDT trading at on every BSC venue right now?"
get_prices reads every pool holding the pair โ v2 pairs and each v3 fee tier separately โ
at one stated block:
{
"pair": "WBNB/USDT",
"network": "bsc",
"chainId": 56,
"blockNumber": 116151268,
"pricesByVenue": [
{ "venue": "pancake", "surface": "v2", "feeBps": 25, "price": 611.7347, "tvlUsd": 56834814.36 },
{ "venue": "biswap", "surface": "v2", "feeBps": 10, "price": 610.8278, "tvlUsd": 415733.94 },
{ "venue": "apeswap", "surface": "v2", "feeBps": 20, "price": 611.1244, "tvlUsd": 3659.06 },
{ "venue": "pancakeV3:1", "surface": "v3", "feeBps": 1, "price": 610.5684, "tvlUsd": 18596810.32 },
{ "venue": "pancakeV3:5", "surface": "v3", "feeBps": 5, "price": 610.6531, "tvlUsd": 4941099.44 },
{ "venue": "pancakeV3:25", "surface": "v3", "feeBps": 25, "price": 610.6304, "tvlUsd": 52534.35 },
{ "venue": "pancakeV3:100", "surface": "v3", "feeBps": 100, "price": 609.1025, "tvlUsd": 12206.21 }
],
"bestBuy": { "venue": "pancakeV3:100", "price": 609.1025 },
"bestSell": { "venue": "pancake", "price": 611.7347 },
"midSpreadBps": 43.22,
"crossDex": {
"grossSpreadBps": 0,
"grossUsd": 0,
"optimalInput": { "amount": 0, "token": "WBNB", "usd": 0 },
"buyVenue": "-",
"sellVenue": "-"
},
"liquidity": { "venues": 7, "totalTvlUsd": 80856857.67 },
"source": "rpc"
}
Read the two spread numbers against each other. The raw mid spread is 43 bps โ and the
gross capturable spread is 0. The 609.10 quote lives in a $12k pool; the size that would
actually clear it moves the price past the gap before you get there. A tool that reported only
the 43 bps would be handing an agent a number it cannot trade. This one reports both, and
optimalInput is where the honesty lands.
2. "Show me the cross-DEX spreads on Base โ are any actually capturable?"
get_spreads sweeps a whole chain and ranks by gross USD at the optimal size, not by
headline basis points:
{
"network": "base",
"chainId": 8453,
"scannedPairs": 11,
"opportunities": [],
"found": 0,
"filters": { "minSpreadBps": 10, "minVenueTvlUsd": 1000, "minGrossUsd": 0.01, "limit": 5 },
"ranking": "gross USD at the optimal trade size, NOT raw spread โ a large spread with a tiny optimal size is not an opportunity",
"scope": "GROSS cross-venue spread from live pool state, BEFORE gas, MEV and any slippage beyond the optimal size. Not a profit estimate and not trade advice. Venues below the liquidity floor are excluded because a spread against a dust pool is an artefact, not an opportunity.",
"elapsedMs": 2847
}
found: 0 is a real answer and it is the common one. Eleven pairs scanned, nothing cleared
the floor. Venues under $1,000 TVL are dropped outright. When rows do come back, each carries
capturable, warning and shallowestSideTvlUsd so a big basis-point number cannot mislead on
its own. This tool will tell your agent there is nothing there โ which is the whole point of
asking it.
3. "How much history does arb-dex actually have, and for which chains?"
get_history_summary sizes the archive before you query it:
{
"rows": 133,
"rowsWithPairDetail": 103,
"rowsByEra": { "digest-totals-only": 30, "top-list-pairs": 5, "full-sweep": 98 },
"pairsTracked": 107,
"firstAt": "2026-08-10T17:35:09.355Z",
"lastAt": "2026-08-15T20:54:34.417Z",
"spanHours": 123.32,
"chainsSeen": ["arbitrum", "avalanche", "base", "bsc", "optimism", "polygon"],
"pairs": [
{ "chain": "polygon", "pair": "WBTC/USDC", "observations": 103, "qualifiedObservations": 39 },
{ "chain": "bsc", "pair": "BTCB/USDT", "observations": 99, "qualifiedObservations": 15 },
{ "chain": "arbitrum", "pair": "ARB/USDC", "observations": 98, "qualifiedObservations": 0 }
]
}
Coverage is only what was measured. A gap stays a gap โ rowsByEra says how much detail each
era of rows carries, and ARB/USDC having 98 observations but 0 qualified is the archive
telling you that pair has never once cleared the spread floor.
Tools
| Tool | What it answers | Access |
|---|---|---|
get_chains |
Which chains are covered, their chain IDs, tokens and DEX venues | Any key ยท keyless returns the chain list only, and says so |
get_pairs |
What is priceable on one chain: token universe, venues, pair syntax | Any key ยท keyless returns the measured subset, labelled as such |
get_prices |
One pair's price at every venue holding a pool for it, plus reserves, TVL, fee tier and the cross-DEX spread | Any key |
get_spreads |
A whole chain's cross-venue dislocations, ranked by gross USD at the optimal size | Any key for live: true ยท keyless serves the free hourly snapshot |
get_history_summary |
What the measurement archive covers: rows, pairs tracked, chains seen, span, retention | Any key (free tier included) |
get_history |
One pair's per-venue price/liquidity series and gross cross-venue spread over 24h / 7d / 30d | PRO plan โ see Plans |
The two history tools read the service's own measurement archive, so they answer the question
the live tools cannot: whether a dislocation persisted or was a single sample. Sampling is
roughly hourly, and gaps are never interpolated or backfilled. Call get_history_summary first
to see what span exists before asking for a window.
What it will not do
- Spreads are gross โ before gas, MEV and slippage beyond the optimal size. Not a profit estimate and not trade advice.
- It never fabricates a row. Without a key,
get_chains,get_pairsandget_spreadsanswer from the free public surface and each carries alimitationfield naming exactly what a key would add.get_prices,get_history_summaryandget_historyreturn an explicit key-required error with the signup link rather than a thinner answer dressed up as a full one. - It does not execute trades, hold funds, or touch a wallet. It is read-only market data.
- This package ships no credentials of any kind. The key is yours and stays in your config.
Get a key
The paid tools call the API through RapidAPI using your own key.
- Subscribe โ there is a free tier: https://rapidapi.com/donnydev/api/multi-chain-dex-prices-liquidity
- Copy your
X-RapidAPI-Keyfrom the RapidAPI dashboard. - Put it in
RAPIDAPI_KEYin the config above โ never in code, and never in a commit.
Plans
Five of the six tools work on the free tier. Only the per-pair history series is gated:
| Plan | Adds |
|---|---|
| BASIC ($0) | Live quotes on every chain, plus get_history_summary so you can size the archive before you buy it |
| PRO ($15/mo) | get_history โ the measured per-venue series for one pair, 24h window, 1000 calls/mo |
| ULTRA ($49/mo) | No window limit and no history meter, plus depth/slippage and spread alerts |
| MEGA ($149/mo) | Bulk paging over the complete archive for your own store |
Calling get_history below PRO returns an explicit tier_required error naming the plan and
the upgrade URL โ it does not fail silently or return an empty series.
Configuration
| Env var | Default | Purpose |
|---|---|---|
RAPIDAPI_KEY |
โ | Your RapidAPI key. Required for the paid tools. |
ARB_DEX_TIMEOUT_MS |
45000 |
Request timeout. A live full-chain sweep is a real on-chain read and can take ~30s. |
ARB_DEX_FREE_BASE_URL |
production origin | Override the free-surface host. |
ARB_DEX_RAPIDAPI_HOST |
multi-chain-dex-prices-liquidity.p.rapidapi.com |
Override the RapidAPI host. |
Set these in your MCP client's env block (see the configs above). .env.example ships in the
package and documents the same variables for local runs from a clone.
Test
The test suite is not in the npm tarball โ run it from a clone:
git clone https://github.com/donnywin85/arb-dex-mcp.git
cd arb-dex-mcp && npm install
npm run selftest # keyless: exercises the free fallbacks
RAPIDAPI_KEY=... npm run selftest # keyed: exercises the paid routes
The test spawns the server over stdio and calls every tool against the real production API โ nothing is mocked. It asserts on live values (block number, per-venue prices, scanned-pair counts), so a run that passes is evidence the data path works end to end.
Links
- npm: https://www.npmjs.com/package/arb-dex-mcp
- Docs: https://donnywin85.github.io/arb-dex-mcp/
- Official MCP Registry:
io.github.donnywin85/arb-dex-mcp - TensorBlock MCP Index: https://www.tensorblock.co/mcp/servers/github-donnywin85-arb-dex-mcp-7dd9a70c
- Source: https://github.com/donnywin85/arb-dex-mcp
- The API behind it: https://rapidapi.com/donnydev/api/multi-chain-dex-prices-liquidity
License
MIT โ see LICENSE.
Install
Add Cross DEX Prices & Spreads to your client. Pick the one you use.
claude mcp add arb-dex-mcp -- npx -y arb-dex-mcpcodex mcp add arb-dex-mcp -- npx -y arb-dex-mcpamp mcp add arb-dex-mcp -- npx -y arb-dex-mcp{
"mcpServers": {
"arb-dex-mcp": {
"command": "npx",
"args": [
"-y",
"arb-dex-mcp"
]
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"arb-dex-mcp": {
"command": "npx",
"args": [
"-y",
"arb-dex-mcp"
]
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
code --add-mcp '{"name":"arb-dex-mcp","command":"npx","args":["-y","arb-dex-mcp"]}'Or add the block manually to `.vscode/mcp.json` under `servers`.
{
"mcpServers": {
"arb-dex-mcp": {
"command": "npx",
"args": [
"-y",
"arb-dex-mcp"
]
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
{
"mcpServers": {
"arb-dex-mcp": {
"command": "npx",
"args": [
"-y",
"arb-dex-mcp"
]
}
}
}Add to `cline_mcp_settings.json` via the MCP Servers panel.
{
"mcpServers": {
"arb-dex-mcp": {
"command": "npx",
"args": [
"-y",
"arb-dex-mcp"
]
}
}
}Add to `~/.gemini/settings.json`.
{
"mcpServers": {
"arb-dex-mcp": {
"type": "local",
"command": "npx",
"args": [
"-y",
"arb-dex-mcp"
],
"tools": [
"*"
]
}
}
}Add to `~/.copilot/mcp-config.json`, or run `/mcp add` inside the CLI.
{
"context_servers": {
"arb-dex-mcp": {
"command": {
"path": "npx",
"args": [
"-y",
"arb-dex-mcp"
]
}
}
}
}Add to your Zed `settings.json`.
npx -y arb-dex-mcpRun `goose configure`, choose **Add Extension โ Command-line Extension**, and paste this command.
6 tools
Cross DEX Prices & Spreads exposes 6 tools to a connected agent.
- get_chains
- Which chains are covered, their chain IDs, tokens and DEX venues
- get_pairs
- What is priceable on one chain: token universe, venues, pair syntax
- get_prices
- One pair's price at **every** venue holding a pool for it, plus reserves, TVL, fee tier and the cross-DEX spread
- get_spreads
- A whole chain's cross-venue dislocations, ranked by gross USD at the optimal size
- get_history_summary
- What the measurement archive covers: rows, pairs tracked, chains seen, span, retention
- get_history
- One pair's per-venue price/liquidity series and gross cross-venue spread over 24h / 7d / 30d
Score
75 / 100
Good
- Documentation25/25
- Maintenance19/25
- Trust13/20
- Capability6/15
- Install experience12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 10 days ago
- Has a release history
- Repository is not archived
- Licensed MIT
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 6 tool(s) documented
- Provides prompt templates
- Provides resources
- 12 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint โ no local install
Version history
| Versions | Published |
|---|---|
| 1.0.1Latest | Aug 15, 2026 |
| 1.0.0 | Aug 13, 2026 |