Ophis MCP
by ophis.fi · remote · no sign-in to list tools · v0.2.0 · published by fi.ophis
Gasless, MEV-protected onchain token swaps for AI agents on 14 EVM chains, built on CoW Protocol.
13 tools: 1 can delete or cancel things, 3 change things and 9 only read.
Scanned Oct 21, 2026
- Deletes or cancels1Claude Code: deny: see these tools
- Can't be undone0Claude Code: ask
- Changes things3Claude Code: ask: see these tools
- Only reads9Claude Code: allow: see these tools
No check matched anything in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http ophis https://mcp.ophis.fi/mcpTools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
13 tools
Deletes or cancels 1Claude Code: deny
submit_orderRelay a pre-signed order to the chain's Ophis orderbook.No findings
Why it is in this group
- The name "submit_order" says "submit": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Relay a pre-signed order to the chain's Ophis orderbook. Pass the exact `order` object and `fullAppData` from build_order, plus your EIP-712 `signature` and `from` (owner). Returns the order UID on success and enrolls the owner for indexing, referral attribution, and trade rewards.
Annotations the server declares
- title: Submit signed order
- readOnlyHint: false
- destructiveHint: true
- openWorldHint: true
Changes things 3Claude Code: ask
build_orderBuild a bounded, ready-to-sign CoW order on Ophis.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it Build a bounded, ready-to-sign CoW order on Ophis. Returns { order, signing:{domain,types,primaryType}, fullAppData, appDataHash, partnerFee, next }. The receiver is ALWAYS PINNED to the owner (proceeds cannot leave the account); this public endpoint exposes no custom-receiver option. Uses the correct per-chain settlement contract (Optimism, Unichain, Robinhood Chain, and Arc are non-canonical) and applies the canonical Ophis fee policy. Apply slippage to the LIMIT side by kind: for kind 'sell' lower buyAmount (your minimum out); for kind 'buy' raise sellAmount (your maximum in). slippageBips is capped at 5000 (50%); when omitted, the enforced backstop defaults to 100 bps (1%). ENFORCED: build_order fetches a live quote and REJECTS the call if the limit is worse than slippageBips vs that quote (or if a quote cannot be fetched; retry). Sign `order` as EIP-712 with `signing`, then call submit_order.
Annotations the server declares
- title: Build signable order
- readOnlyHint: true
- openWorldHint: true
expected_surplusEstimate how much better Ophis quotes than the open market for a sell: fetches the Ophis orderbook sell-quote and a public all-DEX aggregator (KyberSwap) quote for the same input, …No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it Estimate how much better Ophis quotes than the open market for a sell: fetches the Ophis orderbook sell-quote and a public all-DEX aggregator (KyberSwap) quote for the same input, and returns `beatBps` (+ = Ophis returns more of the buy token). Use before build_order to show the expected edge. The reference can reflect thin or manipulated liquidity, so treat beatBps as advisory, not a sole execution signal. Sell-side (exact-in) only. Read-only.
Annotations the server declares
- title: Estimate beat-the-market surplus
- readOnlyHint: true
- openWorldHint: true
parse_intentParse a plain-English swap request (e.g.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it Parse a plain-English swap request (e.g. "swap 100 USDC for ETH on Optimism") into a structured intent: { intent: "swap"|"unknown", entities: [{type: sellToken|buyToken|amount|chain, value, raw}] }. Backed by the live Ophis parser.
Annotations the server declares
- title: Parse swap intent
- readOnlyHint: true
- openWorldHint: true
Only reads 9Claude Code: allow
get_balancesRead a wallet's native-token balance plus ERC-20 balances for the given token addresses on one chain, via a public RPC (one multicall).No findings
Why it is in this group
- The name "get_balances" says "get": a word for reading.
Description, as the server wrote it Read a wallet's native-token balance plus ERC-20 balances for the given token addresses on one chain, via a public RPC (one multicall). Returns each token's symbol, decimals, raw atoms, and human-readable amount. A token address that is not an ERC-20 is reported with an `error` and does not fail the batch. Read-only; holds no keys. Supported chains are those with a public RPC (most Ophis chains).
Annotations the server declares
- title: Get wallet balances
- readOnlyHint: true
- openWorldHint: true
get_gasRead a chain's current gas price (EIP-1559 maxFee/maxPriority suggestion when supported, plus an effective gasPrice in wei and gwei).No findings
Why it is in this group
- The name "get_gas" says "get": a word for reading.
Description, as the server wrote it Read a chain's current gas price (EIP-1559 maxFee/maxPriority suggestion when supported, plus an effective gasPrice in wei and gwei). Ophis trades are gasless for the trader, so this mainly bounds the cost of a one-time ERC-20 approval to the VaultRelayer. Read-only.
Annotations the server declares
- title: Get chain gas price
- readOnlyHint: true
- openWorldHint: true
get_integrator_earningsLook up routed volume, the Ophis base fee, and the integrator's own fee on CoW-hosted chains, by appCode (your widget appCode or SDK ophisReferrer code).No findings
Why it is in this group
- The name "get_integrator_earnings" says "get": a word for reading.
Description, as the server wrote it Look up routed volume, the Ophis base fee, and the integrator's own fee on CoW-hosted chains, by appCode (your widget appCode or SDK ophisReferrer code). Routed volume is reported in USD, split by chain and by Ophis-operated versus CoW-hosted chains. Read-only, keyless, cumulative.
Annotations the server declares
- title: Get integrator earnings
- readOnlyHint: true
- openWorldHint: true
get_portfolioRead a wallet's native and (optionally) ERC-20 balances across multiple chains at once.No findings
Why it is in this group
- The name "get_portfolio" says "get": a word for reading.
Description, as the server wrote it Read a wallet's native and (optionally) ERC-20 balances across multiple chains at once. Pass tokensByChain (chainId -> token addresses) to include token balances; omit chainIds to scan every chain with a public RPC (max 13 chains, and at most 100 token reads total across all chains). Per-chain RPC failures are returned inline so one dead endpoint does not sink the result. Read-only; holds no keys.
Annotations the server declares
- title: Get cross-chain balances
- readOnlyHint: true
- openWorldHint: true
get_quoteFetch a best-execution quote from the chain's Ophis orderbook (use a chainId from list_chains' `tradeable`).No findings
Why it is in this group
- The name "get_quote" says "get": a word for reading.
Description, as the server wrote it Fetch a best-execution quote from the chain's Ophis orderbook (use a chainId from list_chains' `tradeable`). Amounts are in atoms (smallest unit, uint256 decimal string). For kind='sell' the amount is the sell amount before fee; for kind='buy' it is the desired buy amount. Returns the orderbook quote (sellAmount/buyAmount/feeAmount/validTo). Before build_order, apply slippage to the limit side by kind: kind='sell' -> lower buyAmount (min out); kind='buy' -> raise sellAmount (max in).
Annotations the server declares
- title: Get swap quote
- readOnlyHint: true
- openWorldHint: true
get_token_chartFetch OHLCV price history for a token from the keyless GeckoTerminal market API (resolves the token's deepest pool, then returns candles).No findings
Why it is in this group
- The name "get_token_chart" says "get": a word for reading.
Description, as the server wrote it Fetch OHLCV price history for a token from the keyless GeckoTerminal market API (resolves the token's deepest pool, then returns candles). Use for an agent to reason about recent price action before quoting. Prices come from a single pool that may be thin or manipulated, so treat them as advisory, not a sole execution signal. The keyless tier is a shared ~30 req/min quota, so cache and do not poll tightly. Read-only.
Annotations the server declares
- title: Get token OHLCV chart
- readOnlyHint: true
- openWorldHint: true
list_chainsList configured EVM orderbook chains, split into `tradeable` (orderbook URL configured; only route get_quote/build_order to these) and `paused` (no configured orderbook URL, so tho…No findings
Why it is in this group
- The name "list_chains" says "list": a word for reading.
Description, as the server wrote it List configured EVM orderbook chains, split into `tradeable` (orderbook URL configured; only route get_quote/build_order to these) and `paused` (no configured orderbook URL, so those tools reject the chain). This is configuration, not a live health or liquidity check. The standalone app's externally funded NEAR networks are not orderbook chains. Each tradeable chain includes its orderbook host, GPv2Settlement contract (Optimism, Unichain, Robinhood Chain, and Arc are non-canonical), and canonical Ophis fee config. No input.
Annotations the server declares
- title: List Ophis chains
- readOnlyHint: true
- openWorldHint: false
resolve_tokenResolve an ERC-20 token SYMBOL to its CANONICAL on-chain address from the trusted Ophis token list (the same curated list the swap UI uses).No findings
Why it is in this group
- The name "resolve_token" says "resolve": a word for reading.
Description, as the server wrote it Resolve an ERC-20 token SYMBOL to its CANONICAL on-chain address from the trusted Ophis token list (the same curated list the swap UI uses). Use this BEFORE quoting or building so you never trade an address taken from chat, the web, or memory: a token can spoof the symbol "USDC" at a scam address, and this fails closed. Returns { found, ambiguous, canonical: {address, decimals, name} | null, matches: [...] }. found=false means no trusted match (do NOT guess: confirm any candidate with get_balances and the user). ambiguous=true means several trusted tokens share the symbol (e.g. native vs bridged); confirm which the user means. Native coins are not returned; resolve the wrapped symbol (e.g. WETH). Read-only.
Annotations the server declares
- title: Resolve token symbol to canonical address
- readOnlyHint: true
- openWorldHint: true
validate_orderOffline preflight for an order you built OUTSIDE build_order (no network call, no keys).No findings
Why it is in this group
- The name "validate_order" says "validate": a word for reading.
Description, as the server wrote it Offline preflight for an order you built OUTSIDE build_order (no network call, no keys). Catches the documented silent-failure modes before you sign or submit: wrong appCode (prevents Ophis referral attribution), wrong orderbook host (api.cow.fi silently bypasses the Ophis stack on Ophis-operated chains), wrong EIP-712 domain (signing against CoW's canonical settlement on an Ophis-operated chain yields a domain the deployed contract rejects), appData hash mismatch (order.appData must equal keccak256 of the exact fullAppData string), an unpinned receiver (proceeds leaving the owner), an expired or non-zero-fee order, and malformed partnerFee entries. Pass whatever you have (chainId is required; owner, order, fullAppData, signingDomain, orderbookUrl are all optional and each is checked if present). Returns { valid, errors, warnings, expected } where `expected` echoes the correct per-chain orderbook host, settlement, EIP-712 domain, appCode, and partnerFee. Prefer build_order to construct orders; use this to verify externally-built ones.
Annotations the server declares
- title: Validate order preflight
- readOnlyHint: true
- openWorldHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 0.2.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http ophis https://mcp.ophis.fi/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__ophis__get_quote",
"mcp__ophis__get_integrator_earnings",
"mcp__ophis__list_chains",
"mcp__ophis__get_balances",
"mcp__ophis__get_portfolio",
"mcp__ophis__get_gas",
"mcp__ophis__get_token_chart",
"mcp__ophis__resolve_token",
"mcp__ophis__validate_order"
],
"ask": [
"mcp__ophis__parse_intent",
"mcp__ophis__build_order",
"mcp__ophis__expected_surplus"
],
"deny": [
"mcp__ophis__submit_order"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as ophis. Review it before you use it.