The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Ophis listing page.
Describe a trade in plain English. Ophis does the rest.
An intent-based DEX aggregator with a natural-language layer, built for humans and agents alike.
Swap App · Docs · Explorer · Agents · SDK · Security
Say swap 100 USDC for ETH on Base and Ophis resolves the tokens, chain, and
amount, then fills the order through a competitive solver auction that settles
on-chain. It is a fork of CoW Protocol (orderbook, autopilot,
driver, and baseline solver) with a natural-language intent layer over a
rebranded CoW Swap UI. On Optimism, Ophis runs the whole stack under its own
settlement contracts and keeps the full fee; on the other supported chains
(Ethereum, Base, Arbitrum, and more) it routes through CoW Protocol's hosted
network.
What that buys you on every trade:
Live across 13 EVM chains, with Ophis-operated settlement on Optimism (chain 10), Unichain (130), and Robinhood Chain (4663), plus CoW-hosted settlement on the other supported chains.
Ophis's one bespoke API turns natural language into a structured order. No key, no account, just POST your request:
Map the chain slug to a chain ID and hand the user a swap deep link to review and
sign. The endpoint only normalizes text, it never places, signs, or executes a
trade. It is rate-limited to 30 requests per minute per IP; non-browser callers
(no Origin header) are allowed, which is the path agents use. Full reference:
docs.ophis.fi/intent-api.
Ophis is built to be traded by autonomous agents, not just people. Pick your integration depth, all of it non-custodial and keyless:
Point any MCP client (Claude, Cursor, a custom agent) at the hosted Model Context Protocol server:
It speaks Streamable-HTTP MCP and exposes 14 tools: intent parsing, canonical
token resolution, chain discovery, quoting, bounded order build/validation and
submission, rebate and integrator lookups, balances, portfolios, gas, charts,
and expected-surplus comparison. The server holds no keys and never signs.
build_order returns a bounded, ready-to-sign EIP-712 order with the receiver
pinned to the owner; the agent signs locally with its own key and submits. See
the complete tool reference. (A bare request
without an Accept: text/event-stream header returns HTTP 406, that is the
transport negotiating, not an outage.)
For agents that build and sign CoW orders directly:
The SDK encodes four fork details that fail silently if you guess them:
getOphisOrderbookUrl(chainId) picks the right host. Optimism self-hosts
its orderbook (not api.cow.fi); the wrong host bypasses the Ophis solver and
zeroes the fee.getOphisOrderDomain(chainId) gives the EIP-712 domain with the correct
verifyingContract. The OP settlement is non-canonical, so the cow-sdk default
is rejected on-chain.buildOphisAppDataPartnerFee(chainId) builds the exact CIP-75 volume-fee
fragment { volumeBps, recipient }, not the price-improvement shape.assertReceiverIsOwner(owner, receiver) pins the order receiver. An
unpinned receiver is the number one drain vector for an automated signer.Ophis publishes machine-readable manifests for agent discovery under
https://ophis.fi/.well-known/: mcp.json, ai-plugin.json, agent-skills/,
and api-catalog (RFC 9727), plus the root-served auth.md, llms.txt, and
openapi.json.
These off-chain helpers make the safe path the easy path, but they are guards, not an authorization boundary: a prompt-injected agent can ignore them. For an agent that signs without a human in the loop, enforce policy where the agent cannot reach it: funds in a Safe smart account, a deterministic policy gate (allowlisted tokens, pinned receiver and appData, an oracle-bounded limit price, spend caps), a guardian key, and the same policy checked again at orderbook ingestion. Full guide: docs.ophis.fi/ai-agents.
Ophis settles across two kinds of chains.
Ophis-operated (self-hosted orderbook, solver, and settlement; Ophis keeps the full fee):
| Chain | Chain ID | Status |
|---|---|---|
| Optimism | 10 | Live: settlement, solver, partner fee |
| Unichain | 130 | Live: settlement, solver, partner fee |
| Robinhood Chain | 4663 | Live: settlement, solver, partner fee |
CoW-hosted (orders route through CoW Protocol's settlement and solver network, with the partner fee disbursed by CoW): Ethereum, Base, Arbitrum, Polygon, BNB, Gnosis, Avalanche, Linea, and the other CoW-supported chains, all live.
On BNB Smart Chain (BSC, chain ID 56) Ophis is live: orders placed through Ophis
(SupportedChainId.BNB in cowSdk.ts,
mapped from the bnb slug in chainMap.ts)
settle on-chain through CoW Protocol's GPv2Settlement at
0x9008D19f58AAbD9eD0D60971565AA8510560ab41 on BSC, giving gasless, MEV-protected
swaps with no Ophis-side custody. Ophis does not deploy its own settlement on BSC;
BNB trades use CoW Protocol's canonical BSC deployment.
The two have different settlement contracts and orderbook hosts, so resolve them
per chain via @ophis/sdk or the MCP list_chains tool rather than assuming.
Full live status: docs.ophis.fi/status.
Cross-chain destinations (Solana, Bitcoin) are surfaced via NEAR Intents.
Canonical contract addresses and the disclosure policy live in
SECURITY.md.
| Path | Origin | Purpose |
|---|---|---|
apps/frontend/ | cowprotocol/cowswap (subtree) | Vite/Nx monorepo holding several surfaces: apps/cowswap-frontend is the swap UI (Ophis code under src/ophis/ and src/modules/mevReceipt/), apps/explorer is the order explorer, apps/ophis-landing is the ophis.fi landing site. Self-contained pnpm workspace (own lockfile, excluded from the root). |
apps/backend/ | cowprotocol/services (subtree) | Rust orderbook, autopilot, driver, baseline solver. Ophis additions live in dedicated crates and ophis:: module paths. |
apps/mcp-server/ | New | @ophis/mcp-server: agent-facing MCP server (Streamable-HTTP) deployed as a Cloudflare Worker at mcp.ophis.fi/mcp. Holds no keys and never signs. |
apps/rebate-indexer/ | New | @ophis/rebate-indexer: off-chain volume-tier and WETH rebate indexer plus Safe batch proposer (rebates.ophis.fi). |
apps/docs-ophis/ | New | Docusaurus docs portal (docs.ophis.fi). Self-contained app (own lockfile, excluded from the root, like apps/frontend). |
packages/sdk/ | New | @ophis/sdk: dependency-free helpers for the per-chain orderbook host, EIP-712 order domain, CIP-75 partner-fee appData, receiver-pinning guards, tier assignment, and the supported-chain registry. |
contracts/ | cowprotocol/contracts (subtree) | GPv2Settlement, GPv2VaultRelayer, GPv2AllowListAuthentication, deployed under an Ophis-controlled solver allowlist. Per-network artifacts in contracts/deployments/. |
functions/ | New | Cloudflare Pages Functions: api/intent.ts (the natural-language parser, shared by swap and landing), _middleware.ts (host routing). |
infra/ | New | Per-chain runtime stacks (optimism-mainnet/, unichain-mainnet/, robinhood-mainnet/, local/), plus rpc/ (eRPC) and cloudflare/ config. |
Upstream subtrees are vendored as-is; Ophis changes are catalogued in
apps/frontend/.ophis-divergences.md and apps/backend/.ophis-divergences.md
so git subtree pull stays tractable.
Root workspace (pnpm 9, Node 20.19+ or 22.12+, turborepo):
Only packages/sdk has a build step today. apps/rebate-indexer,
apps/mcp-server, and infra/rpc run directly (no build script) and are
validated by pnpm typecheck and pnpm test. The Rust backend (apps/backend)
is a Cargo workspace, not a pnpm package, so build and test it with Cargo:
apps/frontend and apps/docs-ophis are self-contained pnpm workspaces with
their own lockfiles, deliberately excluded from the root. Build them from inside
their own directory (see each app's README):
The contracts use Foundry (forge build); forge-std is a git submodule, so run
git submodule update --init first.
Every surface deploys independently from main:
cloudflare-deploy.yml: two sequential Cloudflare Pages deploys (swap.ophis.fi / ophis.fi, then explorer.ophis.fi).landing-deploy.yml: path-filtered build with a Playwright and Lighthouse budget gate, to Cloudflare Pages.docs-deploy.yml: the Docusaurus site to its own Cloudflare Pages project.mcp-deploy.yml: to Cloudflare Workers (custom domain mcp.ophis.fi) with a least-privilege Workers token; mcp-registry-release.yml publishes matching versioned metadata to the official MCP Registry from protected mcp-v* tags.rebate-indexer-deploy.yml: to self-hosted infrastructure over a private network.infra/optimism-mainnet/, infra/unichain-mainnet/, and
infra/robinhood-mainnet/. They are not deployed by a GitHub workflow.Quality gates: ci.yml (lint, typecheck, tests),
codeql.yml,
security.yml (dependency and supply-chain
scans), and echidna.yml (contract fuzzing).
sdk-release.yml publishes @ophis/sdk to npm.
All package and MCP publishing controls are documented in the
release runbook.
On every supported chain, Ophis charges a 0.01% (1 bp) base plus a capped share of reference-quote improvement: 80% capped at 99 bps for volatile pairs and 50% capped at 20 bps for stable pairs. Operated-chain backends apply the improvement policy; hosted orders encode it in CIP-75 appData and separately pay CoW Protocol's upstream fees.
Part of the fee flows back to traders:
https://swap.ophis.fi/?ref=YOURCODE, and earn
8% of the verified base fee Ophis keeps on trades your referrals route, paid monthly in WETH.Full numbers and the tier ladder: docs.ophis.fi/fees and docs.ophis.fi/affiliate.
See SECURITY.md for the disclosure policy, canonical contract
addresses, the partner-fee recipient and governance model, in-scope components,
and audit history.
GPL-3.0, inherited from upstream CoW Protocol.