omniroute-bridge-mcp
OfficialEnables cross-chain bridging and multi-wallet gas refueling involving Ethereum, with read-only quotes, unsigned transaction plans, and fee estimates for tokens such as USDC and ETH.
Enables cross-chain bridging and gas funding involving Optimism as a source or destination network, returning unsigned plans and live quote data.
Enables cross-chain bridging to Polygon, including Polymarket onboarding that targets Polygon bridged USDC.e and optional POL gas refueling.
Enables cross-chain bridging involving Solana, preserving non-EVM Relay step data and returning unsigned Solana transaction plans.
OmniRoute Bridge MCP
One terminal for cross-chain funding, platform onboarding, and multi-wallet gas.
Zero API keys. Zero npm runtime dependencies. MIT-licensed Node.js SDK, CLI, and MCP server. Supports Ethereum, Base, Arbitrum, Optimism, Polygon, BNB Smart Chain, HyperEVM, and Solana.
Free to install and use: no subscription or API-key purchase. Every Relay quote includes a 30 bps (0.30%) integrator fee, plus applicable Relay and network fees. It is not fee-free bridging. Fast routes may settle in roughly 2 seconds, but sub-3-second execution is not guaranteed; quote latency, approvals, network confirmation and final settlement vary. Always use the live quote estimate.
Quick start
From this source checkout (no installation required):
node bin/omniroute.js chains --json
node bin/omniroute.js quote --from base --to arbitrum --token USDC --to-token ETH --amount 10 --json
npm test
npm startAfter the maintainer publishes version 1.0.0 to npm, the equivalent commands are:
npx -y --package omniroute-bridge-mcp omniroute-bridge chains
npx -y --package omniroute-bridge-mcp omniroute-bridge-mcp mcpPublication and GitHub Pages deployment are separate maintainer actions; this repository does not automatically publish itself.
Claude Desktop, Cursor and Windsurf
Use the following mcpServers entry in Claude Desktop's MCP configuration, Cursor's MCP settings, or Windsurf's MCP configuration. Replace the project path with your checkout location. No secret or environment variable is needed.
{
"mcpServers": {
"omniroute": {
"command": "node",
"args": ["/absolute/path/to/omniroute-bridge-mcp/bin/omniroute.js", "mcp"]
}
}
}After npm publication, use "command": "npx" and "args": ["-y", "--package", "omniroute-bridge-mcp", "omniroute-bridge-mcp", "mcp"] instead.
Try asking: “Quote 10 USDC from Base to native POL on Polygon,” or “Plan gas funding for these three wallets.” All six tools are read-only: they return unsigned plans and never hold keys, sign, broadcast, or trade.
Related MCP server: persistenceone-bridgekitty
CLI
# List supported chains and tokens
node bin/omniroute.js chains --json
# Read-only bridge preview
node bin/omniroute.js quote --from solana --to base --token USDC --to-token ETH --amount 10 --json
# Include real source and destination wallet addresses for executable quote data
node bin/omniroute.js quote --from base --to arbitrum --token USDC --to-token ETH --amount 10 --sender YOUR_EVM_ADDRESS --recipient YOUR_EVM_ADDRESS --json
# Polymarket: Polygon USDC.e plus an additional approximately $2 source spend for POL
node bin/omniroute.js polymarket --from base --token USDC --amount 50 --recipient YOUR_POLYGON_ADDRESS --json
# Skip the extra gas route
node bin/omniroute.js polymarket --from base --token USDC --amount 50 --no-gas --json
# HyperEVM native HYPE
node bin/omniroute.js hyperliquid --from arbitrum --token USDC --amount 25 --mode hyperevm_hype --json
# Prepare Arbitrum USDC for the official Hyperliquid deposit flow
node bin/omniroute.js hyperliquid --from base --token USDC --amount 25 --mode arbitrum_usdc --json
# Spend 2 source USDC per destination wallet to buy Polygon POL
node bin/omniroute.js refuel --from base --token USDC --to polygon --amount-per-wallet 2 --recipients ADDRESS_1,ADDRESS_2 --sender YOUR_SOURCE_ADDRESS --json
node bin/omniroute.js status --request-id RELAY_REQUEST_ID --json
node bin/omniroute.js --help--sender is supported by all quote-producing commands. Without it, returned data is marked previewOnly; do not sign preview calldata. For cross-VM routes, also specify the real destination recipient. --slippage-bps 50 means 0.50% on the quote command. --gas-usd changes the additional Polymarket gas budget. --mode both quotes two full-size Hyperliquid funding routes and doubles the source input budget.
Onboarding boundaries
Polymarket: the preset targets Polygon bridged USDC.e (
0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174), distinct from native USDC. Optional gas is a separate POL route. Use the intended platform wallet; a transfer to an arbitrary EOA does not create or fund every kind of Polymarket account automatically. Account setup, approvals and current platform deposit requirements still apply.HyperEVM: native HYPE on chain 999 funds EVM gas. This is not Hyperliquid L1 perpetuals collateral.
Arbitrum USDC: prepares funds for the official Hyperliquid deposit flow; it does not call Bridge2. Keep Arbitrum ETH for the separate deposit transaction and check the platform's current minimums.
Gas refuel:
amountPerWalletis input in the source token. Output native gas is quoted after fees. Up to 20 recipients, four concurrent quote requests, ordered unsigned steps. Duplicate recipients mean repeated allocations. Execution is not atomic; track each submitted transaction separately.USD gas budget: estimated using the primary quote's source USD valuation. The gas route is additional spend, not deducted from the primary amount. It is not a guarantee of that many dollars of POL after fees; missing USD pricing causes an explicit error.
See Polymarket's official bridge guide and Hyperliquid onboarding for the destination platform flows.
Node.js SDK
import {
getBridgeQuote,
getPolymarketOnboardPlan,
getHyperliquidOnboardPlan,
planMultiWalletGasRefuel,
checkBridgeOrderStatus,
fetchAppFeeBalances
} from 'omniroute-bridge-mcp';
const quote = await getBridgeQuote({
fromChain: 'base', toChain: 'arbitrum',
fromToken: 'USDC', toToken: 'ETH', amount: '10',
userAddress: 'YOUR_SOURCE_ADDRESS',
recipientAddress: 'YOUR_DESTINATION_ADDRESS',
slippageBps: 50
});
console.log(quote.currencyOut, quote.fees, quote.steps);
// No signing occurs. Review and execute with your own wallet integration.In a source checkout, import from ./src/index.js. The illustrative address placeholders must be replaced with valid addresses. To preview instead, omit the address fields.
All network methods accept a final options object: { fetchImpl, timeoutMs, signal, feeRecipient, feeBps }. Default timeout is 15 seconds. Injectable fetch supports deterministic offline tests. Fee overrides are explicit testing/configuration options; CLI and MCP expose no fee override. There is no automatic retry of quotes or transactions.
resolveToken(chain, rawAddress, customDecimals) supports custom tokens with explicit decimals. getBridgeQuote accepts fromTokenDecimals / toTokenDecimals for raw addresses. Registered tokens use the audited registry decimals; arbitrary mint/contract metadata is not fetched. Address validation checks syntax and Solana decoded length, not ownership or token safety.
Use decimal strings for exact amounts. parseUnits returns BigInt, rejects zero, negatives, scientific notation, excess decimals and uint256 overflow. JavaScript numbers cannot recover precision already lost before the call. formatUnits returns an exact decimal string, with support for zero and negative values for display.
Quote result
Results include requestId, chain metadata, input/output amounts and USD values, minimum output, rate, impact, estimated seconds, gas/relayer/app fees, payload, quotedAt, previewOnly and ordered steps. Missing upstream estimates are null, never invented. Relay step data and check endpoints are preserved, including non-EVM data. A signature or Solana transaction cannot be passed to EVM eth_sendTransaction.
MCP tools
Tool | Purpose |
| Registry, presets and fee disclosure |
| Cross-chain unsigned quote |
| Polygon USDC.e and optional POL |
| HyperEVM HYPE / Arbitrum USDC |
| Up to 20 native gas allocations |
| Relay intent status v2 |
Each tool has a title, read-only/non-destructive/idempotent annotations and descriptions on every parameter. openWorldHint is false only for the local registry tool. The idempotent annotation describes absence of transaction side effects; live quotes and request IDs can change. Metadata coverage is locally tested; no external Glama grade is claimed.
The stdio server accepts modern newline-delimited JSON and legacy Content-Length framing (UTF-8 byte counts), fragmented frames, notifications, and initialize, ping, tools/list, tools/call, resources/list, prompts/list. Responses use each request's framing. Stdout contains only protocol responses in MCP mode. Messages are limited to 1 MiB.
Fees and Relay integration
Every HTTP quote request includes:
{
"appFees": [{
"recipient": "0x8c2279495094C284e1293cdE9DBC52cc4f55C6bd",
"fee": "30"
}]
}The dedicated project wallets are EVM 0x8c2279495094C284e1293cdE9DBC52cc4f55C6bd and Solana FJCcoqJHmoJyuthUY773gnxBsAY8yQuAgfYwL3zETVVW; both are disclosed by listSupportedRoutes().integratorFee.
The Relay app fee recipient is always an EVM address, including Solana routes. The default is centralized and the HTTP boundary reconstructs the fee field even when a low-level caller omits it. Default balances can be queried with fetchAppFeeBalances(); there is no automatic fee withdrawal.
Endpoints: POST https://api.relay.link/quote, GET /intents/status/v2?requestId=..., GET /app-fees/{wallet}/balances. This project intentionally uses the requested /quote endpoint. Relay currently documents it as deprecated; compatibility and public rate limits are upstream concerns. The project does not promise unlimited API access or perpetual upstream availability. HTTP, JSON, timeout and cancellation errors propagate clearly; no private key or API key is required.
Architecture
CLI / MCP client / Node.js application
|
service.js presets, validation, batch aggregation, tool schemas
|
relay.js HTTP boundary, fees, timeout, normalization
|
api.relay.link unsigned quote / status
constants.js chain registry and exact amount arithmeticsrc/index.js exports the public SDK. src/mcp-server.js provides stdio transport. src/cli.js handles CLI arguments; bin/omniroute.js is the executable entry. No signing keys, telemetry, database, server account or hosted backend are needed.
Development and release
npm test
node --check src/service.js
npm pack --dry-run
# Optional, with Docker installed:
docker build -t omniroute-bridge-mcp .
docker run --rm -i omniroute-bridge-mcpTests use native node:test, node:assert, deterministic Relay fixtures, stream fragmentation and CLI subprocesses. They never spend funds. They cover fee injection, EVM/Solana directions, input precision and validation, all service/tool/CLI entry points and protocol framing. Mock tests do not establish live liquidity, settlement performance, browser wallet compatibility or platform crediting.
Before a public release, independently verify supported live routes and browser-wallet behavior, review executable transactions, publish the npm package, and enable GitHub Pages from docs/. Do not execute stale quotes or resend a transaction whose submission status is unknown. Nothing in the SDK automatically broadcasts a transaction.
License
MIT · maintained by c-viper-work.
Static web app
Serve docs/ over HTTPS (GitHub Pages) or a local HTTP server, for example
python3 -m http.server 8080 --directory docs. Open http://localhost:8080.
The app calls Relay directly, with no keys or third-party JavaScript. Wallet
execution requires an injected EIP-1193 provider; CLI/JSON export also works
without a wallet. CLI commands request fresh unsigned plans, never broadcast.
Quotes expire after 60 seconds. Chain/account changes require a new quote.
Transaction hashes remain visible after failures; never automatically retry a
submitted plan. Source confirmation and Relay destination delivery are separate.
After changing shared quote modules, synchronize the deployed browser copies:
cp src/constants.js src/relay.js src/service.js docs/lib/
npm testTests enforce byte equality for these modules. No build step is required.
Available Tools
6 toolscheck_bridge_order_statusARead-onlyIdempotent
Read Relay intent status v2 for a request ID. Does not submit or retry transactions.
| Name | Required | Description | Default |
|---|---|---|---|
| requestId | Yes | Relay requestId returned by the quote or executable step, at most 256 characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description reinforces the read-only boundary but adds little beyond annotations, such as rate limits or return details, so a baseline 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with the core action front-loaded. Every clause earns its place by stating what is read and what is explicitly not done.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter status tool with strong annotations, the description is largely complete and makes the non-mutating scope clear. It could say more about what status information is returned, since there is no output schema, but the essential invocation context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the requestId parameter is already documented with its origin from quote or executable steps and a 256-character limit. The description only repeats that a request ID is required, adding no further parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Read Relay intent status v2 for a request ID." It also explicitly rules out submission and retry behavior, which helps distinguish it from action-oriented bridge tools in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It makes the usage context clear by tying the tool to a request ID and stating that it does not submit or retry transactions. It does not explicitly name an alternative or say when not to use it, but the boundary is sufficiently clear for a read-only status check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cross_chain_bridge_quoteARead-onlyIdempotent
Fetch a Relay quote with fee breakdown and unsigned steps. Never signs or broadcasts; missing sender creates a preview.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Positive human-readable source-token amount as a decimal string; no exponent notation. Use strings to preserve precision. | |
| toChain | Yes | Supported chain slug, alias or numeric chain ID as a string (for example base, arb, solana, 8453). | |
| toToken | No | Destination token symbol, native, or raw contract/mint address. | |
| fromChain | Yes | Supported chain slug, alias or numeric chain ID as a string (for example base, arb, solana, 8453). | |
| fromToken | No | Source token symbol such as ETH, USDC or native; amounts are denominated in this token. | |
| slippageBps | No | Maximum slippage in basis points: 50 means 0.50%. Omit for Relay automatic tolerance. | |
| userAddress | No | Real sender address on the source chain. Omit only for a read-only preview that cannot be executed. | |
| toTokenDecimals | No | Required decimal precision for an unregistered raw destination token address. | |
| recipientAddress | No | Destination wallet address, matching the destination chain VM. Verify the platform wallet before onboarding. | |
| fromTokenDecimals | No | Required decimal precision for an unregistered raw source token address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the bar is lower, yet the description adds real value by confirming it 'Never signs or broadcasts' and disclosing that omitting a sender degrades to a preview. Still no mention of rate limits or quote expiry, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no waste: the core action and return contents come first, followed by the safety and preview caveats. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 100% schema coverage, no output schema, and annotations covering the safety profile, the description supplies enough for correct invocation plus the preview/unsigned semantics. It stops short of covering quote lifetime or supported-chain preconditions, which the sibling list tool presumably handles.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already carries all ten parameters with formats and ranges. The description's only param-relevant claim (missing sender -> preview) duplicates what userAddress's schema description already says, so it adds no meaning beyond structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Fetch a Relay quote') and names the payload contents ('fee breakdown and unsigned steps'), which is well beyond a tautology. It implicitly separates itself from check_bridge_order_status by being a quote rather than a status lookup, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The when-to-use is implied (get a quote before executing a bridge) and the fallback mode is noted ('missing sender creates a preview'), but there is no explicit statement of when to prefer this over check_bridge_order_status or the onboarding tools, and no prerequisites are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hyperliquid_one_click_onboardARead-onlyIdempotent
Plan HyperEVM HYPE or Arbitrum USDC funding. L1 deposits remain a separate action.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Positive human-readable source-token amount as a decimal string; no exponent notation. Use strings to preserve precision. | |
| fromChain | Yes | Supported chain slug, alias or numeric chain ID as a string (for example base, arb, solana, 8453). | |
| fromToken | No | Source token symbol such as ETH, USDC or native; amounts are denominated in this token. | |
| targetMode | No | Funding destination. both quotes two routes, each spending the entire specified source amount. | hyperevm_hype |
| userAddress | No | Real sender address on the source chain. Omit only for a read-only preview that cannot be executed. | |
| recipientAddress | No | Destination wallet address, matching the destination chain VM. Verify the platform wallet before onboarding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered structurally; the description's contribution is the L1 scope boundary plus the implication that this is a planning step. It does not say whether execution ever occurs, what the plan contains, or any auth/rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the supported destinations front-loaded and the scope caveat second. Nothing repeats the name or wastes tokens.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter, open-world, read-only planning tool with no output schema, the description is thin: it never says what a 'plan' returns (routes, quotes, fees) or that omitting userAddress yields a non-executable preview. The schema covers inputs, but the output/behavior side of a planning tool is left for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (including the targetMode enum and the userAddress preview caveat) are already documented in the schema. The description only echoes the two destinations and adds no syntax or format detail beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Plan') and resource (HyperEVM HYPE or Arbitrum USDC funding), and the second sentence scopes out L1 deposits. It is clear what the tool produces (a funding plan), though it does not name a sibling alternative the way the strongest definitions do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The exclusion 'L1 deposits remain a separate action' gives one useful when-not boundary, but there is no explicit guidance on when to use this versus get_cross_chain_bridge_quote or the other onboarding tool. Usage is implied by the tool name and funding destinations rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_supported_chains_and_tokensARead-onlyIdempotent
List eight supported chains, token addresses, onboarding presets and the disclosed 30 bps integrator fee.
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Supported chain slug, alias or numeric chain ID as a string (for example base, arb, solana, 8453). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered structurally. The description adds genuinely non-derivable context: the breadth of coverage (eight chains), that onboarding presets are included, and notably the disclosed 30 bps integrator fee, which an agent could not infer. No mention of caching or response freshness, hence not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no filler; the most important payload items (chains, token addresses) come first. The hardcoded 'eight' is a slight liability since the count may drift, but the sentence itself is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description correctly carries the burden of describing what is returned, and it does so for a zero-required-parameter listing tool with a fully documented optional filter. It only misses stating that omitting 'chain' returns the full set and how presets map to the onboarding siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional 'chain' filter is fully documented there, so the baseline is 3. The description describes only the return payload and adds no meaning about how the chain filter narrows results or what happens when it is omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) plus a concrete resource set: supported chains, token addresses, onboarding presets, and the integrator fee. This is clearly distinguishable from the sibling quote/onboard/refuel/status tools. It stops short of naming any sibling explicitly, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus the onboarding siblings (polymarket_one_click_onboard, hyperliquid_one_click_onboard) that likely consume this data, nor on whether it should be called before quoting or bridging. The listing nature implies a discovery/discovery-first use, but nothing is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
multi_wallet_gas_refuelARead-onlyIdempotent
Quote native gas delivery for 1–20 recipients without broadcasting, preserving recipient order.
| Name | Required | Description | Default |
|---|---|---|---|
| fromChain | Yes | Supported chain slug, alias or numeric chain ID as a string (for example base, arb, solana, 8453). | |
| fromToken | No | Source token symbol such as ETH, USDC or native; amounts are denominated in this token. | |
| recipients | Yes | Ordered list of 1–20 destination addresses. Duplicate addresses intentionally receive multiple allocations. | |
| targetChain | Yes | Supported chain slug, alias or numeric chain ID as a string (for example base, arb, solana, 8453). | |
| senderAddress | No | Real sender address on the source chain. Omit only for a read-only preview that cannot be executed. | |
| amountPerWallet | Yes | Positive decimal source-token amount spent for EACH wallet, not the amount of destination gas. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so "without broadcasting" is largely reinforcing known safety. The genuinely additive disclosure is "preserving recipient order," a behavioral guarantee about ordered handling that the annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the operation front-loaded and no filler. Every clause (quote, gas delivery, 1–20 recipients, no broadcast, order preserved) carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only quote tool with rich annotations and 100% schema coverage, the description covers purpose and the key ordering guarantee. With no output schema present, it would ideally say something about what the quote returns (estimated cost, delivery amounts), which is the only real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including minItems/maxItems and per-field semantics, so the schema already carries parameter meaning. The description only restates the 1–20 recipient bound and ordering, adding almost nothing beyond the schema, which puts it at the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (quote) and resource (native gas delivery) plus a scope constraint (1–20 recipients), so an agent knows exactly what operation this is. It does not name or distinguish itself from the sibling get_cross_chain_bridge_quote, which is also a quote tool, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"without broadcasting" implies this is a preview/quote step rather than an execution step, which is useful implied guidance. However there is no explicit when-to-use versus the bridge-quote sibling, no stated prerequisites, and no guidance on when a quote should precede a refuel.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
polymarket_one_click_onboardCRead-onlyIdempotent
Plan Polygon USDC.e plus optional POL gas. Extra gas spends additional input; this does not create a trading account.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Positive human-readable source-token amount as a decimal string; no exponent notation. Use strings to preserve precision. | |
| fromChain | Yes | Supported chain slug, alias or numeric chain ID as a string (for example base, arb, solana, 8453). | |
| fromToken | No | Source token symbol such as ETH, USDC or native; amounts are denominated in this token. | |
| userAddress | No | Real sender address on the source chain. Omit only for a read-only preview that cannot be executed. | |
| includeGasTopup | No | Whether to quote a separate native POL top-up in addition to the full primary input. | |
| recipientAddress | No | Destination wallet address, matching the destination chain VM. Verify the platform wallet before onboarding. | |
| gasTopupAmountUsd | No | Approximate USD source spend for POL gas, before fees, valued from the primary quote; zero disables it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds two real facts beyond them: extra gas consumes additional input, and the call does not open a trading account. It still says nothing about what the plan contains or whether downstream execution is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, purpose front-loaded. The downside is that the brevity reflects under-specification rather than tight writing, but nothing in the text is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a 7-parameter tool with no output schema, so the description should describe what a 'plan' returns and how the read-only preview path (userAddress omitted) differs from a runnable plan. Neither is addressed, leaving a material gap for an agent deciding how to use the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 7 parameters, so the schema already documents amount, fromChain, fromToken, userAddress, gasTopupAmountUsd, and the rest. The description only echoes the gas top-up behavior, adding no new syntax or format detail. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the intended resources (Polygon USDC.e, optional POL gas) and the verb 'plan', which points toward a quote/preview tool. However, 'plan' is never unpacked, so the agent cannot tell whether the tool returns a price quote, a list of transactions, or a multi-step route. It only partially separates itself from sibling hyperliquid_one_click_onboard.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no reference to any sibling tool such as get_cross_chain_bridge_quote or hyperliquid_one_click_onboard. The clause 'this does not create a trading account' is a scope boundary, but it rules out a capability rather than telling the agent when to pick this tool over an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v1.0.0- First observed
check_bridge_order_status - First observed
get_cross_chain_bridge_quote - First observed
hyperliquid_one_click_onboard - First observed
list_supported_chains_and_tokens - First observed
multi_wallet_gas_refuel - First observed
polymarket_one_click_onboard
TDQS
Scored across 6 tools
Each tool has a distinct primary action: listing chains, quoting a bridge, onboarding to two named venues, refueling gas, and checking status. The only mild overlap is between the generic bridge quote and the venue-specific onboarding plans, but descriptions clarify their boundaries.
All names use snake_case, which is consistent. However, three tools start with a verb (list_, get_, check_) while three start with a domain or resource prefix (polymarket_, hyperliquid_, multi_wallet_), creating a mixed naming convention.
Six tools is a well-scoped set for a cross-chain bridge and onboarding planning server. Each tool has a clear, non-redundant role and none feels extraneous.
The surface covers listing supported assets, quoting bridges, planning onboarding for two venues, refueling gas, and checking bridge order status. Minor gaps exist, such as status tracking for non-bridge onboarding or gas refuel operations, but core workflows are covered.
Maintenance
Related MCP Connectors
Li.Fi tools over MCP: cross-chain quotes, routes, execution status, chains, tokens, balances.
Li.Fi MCP: cross-chain aggregation — quotes, routes, status, chains, tokens, execution.
Multi-chain wallet MCP. 18 tools: balance, swap, bridge, stake, claim. Pay-per-call USDC (x402 v2).
Multi-aggregator swap router for AI agents on Base. 10 bps fee. MCP-native, non-custodial.
Related MCP Servers
AlicenseAqualityDmaintenancedeBridge MCP finds optimal cross-chain swap routes, check fees and conditions, and initiate non-custodial trades across major blockchain networks. Supported: Ethereum, Solana, Arbitrum, Base, BNB Chain, Polygon, Optimism, Avalanche, Linea, Berachain, Tron, Cronos, Gnosis, Monad, Sonic, Flow, HyperEVM, Sei, Story, Injective, Abstract, MegaETH, Mantle, Plasma, Zilliqa, Sophon, Bob, Neon, and more572 npm31MIT- AlicenseAqualityCmaintenanceCross-chain bridge aggregator MCP server for AI agents. Compares routes across LI.FI, deBridge, Relay, Across and Squid to find the best rate. Use when an agent needs to bridge or swap tokens between EVM chains, Solana, or Cosmos. The aggregator of aggregators.1257 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables cross-chain transactions (swap, send, balance) on 10 blockchains from a single NEAR account, designed for AI agents and humans via MCP.6Apache 2.0
- AlicenseNot gradedqualityDmaintenanceMulti-chain MCP server enabling AI agents to interact with Arbitrum — ERC-8004 identity registration, GMX ecosystem integration, cross-chain reputation via RepuLayer, and 37 governance tools across 6 chains.13 npmMIT