
OMX for Hyperliquid
io.github.Lumen-Founder由 GitHub 账号 Lumen-Founder 发布v0.1.3更新于 Nov 5, 2026
Non-custodial Hyperliquid execution for AI agents: pre-trade limits, kill switch, audit log.
概览
非托管的 Hyperliquid 永续合约执行引擎,让 AI 代理在本地策略限额内报价、预览并提交受控订单。
- 可以做什么
- 查询行情并预览订单意图(市价、限价、TWAP、POV、追价)
- 提交订单意图、查询状态并撤单,分片订单由本地守护进程推进
- 触发紧急停止开关,阻止新订单并撤销挂单中的 OMX 订单
- 查看待人工审批的请求与哈希链审计日志
- 在模拟或实时公开订单簿上运行无需密钥的演示与模拟盘模式
- 适用场景
- 适合希望让 AI 代理在自己机器上为 Hyperliquid 永续合约下单并管理订单的人:每个子订单都会按配置的盘前策略校验,超过阈值需人工审批,并留有审计记录。建议先在演示或模拟盘模式中测试代理交易流程。
- 运行要求
- 本地 Python 3.11+ 包(omx-hyperliquid,可用 uvx 或 pip 运行);实盘签名还需 eth_account。需要由 omx init 生成、路径写在 OMX_CONFIG 中的配置文件,以及持续运行的 omx daemon。还需在自己账户中创建的 Hyperliquid API/代理钱包密钥文件,并通过资格声明。演示与模拟盘模式无需密钥、账户或配置。
安装
在 SourceWeft 中
- 打开 控制台中的 OMX for Hyperliquid,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
OMX: Hyperliquid execution for AI agents (MCP)
OMX is a non-custodial execution engine for Hyperliquid perpetuals. It runs on your own machine, turns an order intent (market, limit, TWAP, POV, chase) into child orders, checks every child against a pre-trade policy you configure, and writes every decision to a hash-chained audit log. A command line and an MCP server let a human or an AI agent drive it inside those limits.
OMX makes no claim about trading performance or profit. It is execution plumbing with guard rails.
Path: the keyless demo, then paper trading on live Hyperliquid books (also keyless), then testnet, then mainnet with small size.
Try it now: no key, no account
One click installs the MCP server in demo mode (a simulated venue in its own process; nothing real can be traded):
[Install in Cursor] [Install in VS Code] [Add to LM Studio] [Install in Goose] [Add to Kiro]
Or one line:
- Claude Code plugin:
/plugin marketplace add Lumen-Founder/omx, then/plugin install omx@omx. - Gemini CLI extension:
gemini extensions install https://github.com/Lumen-Founder/omx. - Any other MCP client (Claude Desktop, Cline, Windsurf, Zed, JetBrains, ...):
{"mcpServers": {"omx": {"command": "uvx", "args": ["omx-hyperliquid"]}}}. Claude Desktop keeps it inclaude_desktop_config.json(Settings > Developer > Edit Config; Windows%APPDATA%\Claude\, macOS~/Library/Application Support/Claude/); Cursor in~/.cursor/mcp.json. Pin a version with"[email protected]". - No
uv? Windows:powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"; macOS / Linux:curl -LsSf https://astral.sh/uv/install.sh | sh; then open a new terminal. Orpip install omx-hyperliquidand useomx-hyperliquidas the command.
With no --config, no OMX_CONFIG and no ./omx.toml, omx-hyperliquid runs
the demo (--demo forces it). The engine, policy checks, approval threshold,
agent budget, kill switch and audit log are the real code; prices are a
random-walk model, not Hyperliquid data. Every answer carries "demo": true.
State lives in a temporary directory that is deleted on exit. A config that is
named but missing is an error, never a silent demo.
Then ask the agent to quote ETH, preview a small TWAP and submit it (for
example buy 0.1 ETH over 10 s in 5 slices), and poll order_status until it
is done. An intent above 1,000 USD returns an approval_id and waits for a
human; the demo has no approval step, so it stays pending and expires. After
kill_switch every new order is refused. In real use only a human clears it,
with omx unkill (it asks you to type I UNDERSTAND); the demo has no
unkill, so restart the server to start fresh.
Paper trading on live Hyperliquid books
omx-hyperliquid --paper (or omx-mcp --paper, omx paper) runs the same
tools with simulated fills against Hyperliquid mainnet's live public order
books. No key, no account, no config, no daemon: it only reads public market
data (/info l2Book, allMids, metaAndAssetCtxs) and never signs or sends an
order. The paper account starts at 10,000 USD (--paper-equity 2500 to change
it); taker orders walk the real book at Hyperliquid's base-tier fees (0.045 %
taker, 0.015 % maker), resting orders fill only when the book trades through
their price, and the default policy limits apply (including Hyperliquid's 10
USD minimum order). Every answer carries "paper": true. Fills are a model,
not Hyperliquid's matching engine; see docs/PAPER.md.
Any other client: {"command": "uvx", "args": ["omx-hyperliquid", "--paper"]}.
Codex CLI waits 10 s for a server to start by default, and the first uvx run
downloads the dependencies; if it times out, add startup_timeout_sec = 60
under [mcp_servers.omx] in ~/.codex/config.toml.
Set up your own account
omx setup walks you through the network (testnet first), your main
account's public address, an API wallet key (typed into a hidden prompt and
saved to a file only your user can read, or a key file you already saved), the
eligibility questions, agent limits, the builder-fee choice, then read-only
checks. It never asks for your main wallet key or seed phrase, and refuses a
key whose address is your main account. omx mcp-config prints the settings
for Claude Code, Codex, Gemini, VS Code, Cursor or Claude Desktop, filled in
with your config's absolute path. See docs/SETUP.md and the
Quick start for each step by hand.
Agent frameworks: omx-integrations has copy-and-run examples for the OpenAI Agents SDK, LangChain, the Claude Agent SDK, PydanticAI and CrewAI, each checked against this server with the framework's own MCP client (demo mode by default).
Status (v0.1.6): pre-1.0. The full path (agent intent -> policy -> signed order with a builder code -> fill -> kill switch -> audit verify) has been run end to end on Hyperliquid testnet. OMX has not had an external security audit. Start on testnet, then mainnet with small size. MIT licensed, no warranty.
Eligibility
OMX is not available to persons or entities residing, located, incorporated or
with a registered office in the United States, Ontario (Canada) or sanctioned
territories, nor to citizens of sanctioned territories, per the Hyperliquid
Terms of Use. Using a VPN or proxy, or a false residency statement, to get
around this is a breach; OMX offers no way around a block. OMX does not offer
outcome markets. omx eligibility asks these questions and refuses to trade
when the answer is blocked; it stores only country/region codes and yes/no
answers.
Non-custodial model
- Your funds stay in your own Hyperliquid account. OMX has no withdrawal or transfer code path.
- You create an API / agent wallet in your own account. It can place and cancel orders but cannot withdraw. OMX signs with that key only.
- OMX never asks for your MAIN wallet key or seed phrase. The builder-fee approval (if any) is signed by you in your own wallet.
- The config holds the agent key's file PATH or env var NAME, never the key. A config containing anything shaped like a private key is rejected, and so is a command-line argument shaped like one.
Install
From a checkout (development, tests):
The commands below also work as python -m omx.cli ... from a checkout.
Requires Python 3.11+ (tomllib; developed on 3.12). The MCP server uses the
official mcp Python SDK 2.x. The live Hyperliquid venue also needs
eth_account for signing.
Quick start (testnet)
OMX runs as one long-lived process, omx daemon, which owns the engine (the
only thing that talks to Hyperliquid and holds the agent key), the audit-log
writer and the approval executor. The CLI and the MCP server are thin clients
that talk to it through files in state_dir/ipc/.
- Create an agent wallet at app.hyperliquid-testnet.xyz (API page) and save
its key in a file only your user can read, e.g.
secrets/hl_agent_testnet.key. - Write the config and answer the eligibility questions:
config.example.tomlshows every field. Eligibility must be renewed everyeligibility_ttl_days(default and maximum 30):omx eligibility. - Start the daemon in its own terminal and leave it running while you trade:
It steps every working intent every 200 ms (TWAP/POV/chase slices are sent
only while it runs). Only one daemon can run per
state_dir, and only one per account (a per-account lock in%LOCALAPPDATA%\omx\locks, orlock_dirin the config). It refuses to start without a valid eligibility attestation; there is no bypass for trading. It re-checks eligibility every 10 minutes and turns cancel-only when the check fails.daemon --cancel-onlystarts without the check and only cancels resting OMX orders (for an expired or blocked user). Approvals,unkill,eligibilityandaudit repairsent to the daemon are shown in its terminal with what they would do and the request id the CLI printed; they run only after you type theconfirm <code>line it prints there. Keep that terminal interactive (a real console, not< NULor a pipe; seedocs/SECURITY.md). - In another terminal, dry run, then send:
preview,submit,status,cancelandapprovals approveneed the daemon; without it (heartbeat older than 5 s) they stop with a message telling you to startomx daemon. After a daemon restartstatusof an older intent answersunknown(check the audit log and the venue), neverrejected. - Stop everything at once:
python -m omx.cli --config omx.toml kill --reason "...". It always writes thestate_dir/KILLfile first (no new orders from any OMX process), then cancels resting OMX orders through the daemon, or, if no daemon is running, through a one-shot cancel-only engine it builds for this (no eligibility check). Either way it exits with code 3 and aWARNINGif the sweep failed or an order could not be cancelled.--allcancels every open order on the account, not only OMX ones; the scope is stored in the KILL file and honoured by the next daemon. Clearing it (unkill) asks you to typeI UNDERSTAND.submitprints the intent id; after a timeout check it withstatus <id>and retry with--intent-id <id>(the daemon refuses an id it already took). - AI agents:
python -m omx.cli --config omx.toml mcp(usually started by your MCP client, seedocs/AGENTS.md). It holds no key and no engine and needs the daemon running.
Stopping the daemon (Ctrl+C) does not set the kill switch and cancels
nothing: resting OMX orders stay on the venue and sliced intents stop sending.
On the next start the engine cancels orphan OMX orders from the previous run.
To cancel immediately, use omx kill.
Other commands: cancel, approvals list|approve|reject, audit verify,
audit repair, fees, mcp, eligibility, approve-builder, doctor. audit verify tells a torn last
line from a crash (TRUNCATED_TAIL, exit 4) apart from tampering (BROKEN,
exit 3); audit repair moves only a torn tail aside, after you type
REPAIR AUDIT.
Controls
Every child order passes all of these before it can leave your machine:
- Coin allowlist
- Liquidity floor (24 h traded notional) and resting depth near mid
- Price band vs mid, intent limit price, per-intent slippage cap
- Per-coin worst-case notional (position plus all same-side resting orders)
- Account-wide worst-case notional
- Worst-case leverage vs equity
- Daily loss limit (deposits and withdrawals kept out of P&L)
- Market-data freshness
- Kill switch (a file in
state_dir; any process can trip it;omx killalso cancels resting OMX orders) - Hash-chained audit log (
omx audit verify)
Plus a per-child notional cap, reduce-only checks, and for AI agents: an
on/off switch, an agent coin subset, a per-intent human-approval threshold, a
daily agent notional budget, approvals that expire, and no ability to unkill
or change limits. See docs/SECURITY.md, docs/FEES.md, docs/AGENTS.md.
Builder fee
OMX is open source (MIT) and costs nothing to install or run. The maintainers
are paid through an optional Hyperliquid builder fee on mainnet fills. When omx/config.py names a default builder for the network
(DEFAULT_BUILDER), omx init sets it at 1 bp (0.01 % of filled notional).
--no-builder sends no builder code, --fee-tenths-bps sets a lower fee, and
--builder-address uses your own. Nothing is charged until you approve the
fee from your own wallet (omx approve-builder), and you can revoke it at any
time. omx fees shows the exact rate and the exact max rate you would
approve, before you approve anything. Details in docs/FEES.md.
Enforcement. With [builder] address and fee_tenths_bps > 0 set, the
engine itself attaches {"b": address, "f": fee} to every order it sends.
Intents (CLI, MCP, approvals) have no builder field, so no caller can set or
remove it; a child order carrying any other builder is refused. The builder
address must differ from the account and from the agent wallet. The daemon
reads maxBuilderFee for (account, builder) at start and every 10 minutes
(every 60 s while blocked). While the approved maximum is below the configured
fee it is in BUILDER_NOT_APPROVED: new intents are refused with that reason
and the hint omx approve-builder; working intents finish or can be
cancelled; omx kill always works.
Approve in your browser, no key in OMX:
It serves one page on 127.0.0.1 (random port and path) and opens your
browser (--no-browser only prints the URL; --timeout-s stops it, default
900). The page uses your browser wallet (window.ethereum): it checks that the
selected account is account_address, asks the wallet to sign
HyperliquidTransaction:ApproveBuilderFee, sends the signed approval from the
browser straight to Hyperliquid's /exchange and re-reads maxBuilderFee.
OMX's Python process never receives a key or the signature.
Check the setup: python -m omx.cli --config omx.toml doctor prints
OK / FAIL (with the fix) / SKIP for: config, key file, agent address (never the
key), endpoint, account exists, account mode, account value, agent approved for
the account, builder approval vs configured fee, builder account value >= 100
USDC, builder account mode, eligibility, daemon running. It only reads /info,
and only when you run it.
Account modes: OMX reads the account's Hyperliquid userAbstraction at
start and every 10 minutes. Standard accounts (disabled / default) use the
perp account value as equity. Unified accounts (unifiedAccount, the default
for users) keep one USDC balance in the spot clearinghouse, so OMX takes equity
from the spot USDC total. The docs do not say whether total already holds
the open positions' unrealized P&L; a testnet measurement (2026-11-05, 9 of 9
intervals: total moved with the unrealized P&L to 1e-6) shows it does, so the
equity is total itself. Positions always come from the
perp clearinghouse state. portfolioMargin, dexAbstraction or an unreadable
mode refuse new intents with ACCOUNT_MODE_UNSUPPORTED (kill and cancels still
work). Switching to Manual / Standard is optional; builder addresses must be
standard to accrue fees. python tools/measure_account_mode.py --config omx.toml --samples 10 --interval 30 (read-only, no key) prints both candidate equities
and, with an open position whose P&L moves, which one the venue uses.
Test wallets: python tools/new_test_wallet.py --out secrets/testnet_builder.key
creates a new throwaway key (never overwrites a file, restricts it to your
user) and prints only its address. Use it for test wallets only (a testnet
builder, a Base Sepolia payer), never for real funds.
来源:README.md,提交 aa95ebc
工具
0版本历史
1- v0.1.3最新Nov 5, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分