Skip to main content
Glama

pathiel

An AI trading agent for Hyperliquid: Claude trades perps from Claude Code, with an exact stop and target on every order.

Claude Code plugin pathiel MCP server – quality and maintenance score on Glama Listed on mcpservers.org Version 0.7.1 MCP server CI License: MIT

Real money. A public install runs on Hyperliquid mainnet. With no key it only reads; once you add a key, orders are real. Read Before you trade first. Practice on testnet with one line: PATHIEL_NETWORK=testnet.

What it does

pathiel is a free, open-source Hyperliquid MCP server and Claude Code plugin: 30 tools that read Hyperliquid perpetual futures (perps) markets and your account, and place orders, from Claude Code, Claude Desktop, Cursor or any MCP client. Every trade is one bracket order: an entry, a stop-loss and a take-profit target, sized from your risk profile (3x and 1% of equity per trade by default). Desk briefs for crude oil (Brent and WTI) and metals (gold and silver) on Hyperliquid's HIP-3 markets give Claude a written call to trade from; nothing trades unless you ask.

Related MCP server: Hyperliquid MCP Server

Install in 30 seconds

In Claude Code:

/plugin marketplace add Julian-dev28/pathiel
/plugin install pathiel@pathiel
/pathiel:setup

From a shell instead:

claude plugin marketplace add Julian-dev28/pathiel
claude plugin install pathiel@pathiel

Claude Code v2.1.275 or later also takes the first two lines as one: /plugin install pathiel --marketplace Julian-dev28/pathiel. If Claude Code says Run /reload-plugins to apply, do that, then run /pathiel:setup.

/pathiel:setup shows the network and the risks, builds a private Python environment, creates ~/.pathiel/.env.local (mode 600) for your keys, seeds the default risk profile, checks the install without printing any key, and connects the MCP server. The steps are in commands/setup.md.

You need Claude Code, Python 3.11 or later, and for trading a Hyperliquid account and a browser wallet (or an API wallet you make in the Hyperliquid app). Reading markets needs no account. docs/GETTING_STARTED.md walks through the account setup.

Other MCP clients

Cursor, Claude Desktop, Pathiel Agent and any other MCP client register the launcher scripts/pathiel-mcp from a clone as the server command, or run the published container (amd64 and arm64). It is listed in the official MCP registry as io.github.Julian-dev28/pathiel.

docker run -i --rm --user "$(id -u):$(id -g)" -v "$HOME/.pathiel:/data" \
  ghcr.io/julian-dev28/pathiel-mcp:0.7.1

To build it yourself: docker build -f Dockerfile.mcp -t pathiel-mcp .

Both are the public install: keys and config come from ~/.pathiel, with the same default network, profile and fee rules as the plugin. Starting scripts/pathiel-mcp-server.py directly, or accepting the repo .mcp.json when you open a clone in Claude Code, is the maintainer path (see Maintainer setup).

First prompts to try

Paste these into Claude Code once /mcp shows pathiel connected.

you type

what answers

What's the oil desk's call right now?

get_desk_brief: direction, entry, stop, target, the R it pays, and "Your size"

Show me BTC's order book and funding.

get_order_book, get_market

What's my balance and what's open?

get_account, get_positions

What are my risk limits?

get_risk_limits

Size a long on gold with the stop under today's low.

size_trade

Dry-run that as a bracket.

place_bracket with dry_run: true: judged and sized, nothing sent

Place it.

place_bracket: live money, Claude Code asks you first

Run one oil desk tick.

/pathiel:desk-tick oil: brief, sweep, levels, one decision

What Claude can do

scripts/pathiel-mcp-server.py lists 30 tools over stdio to a plugin install: one tool per job, verb_noun names (contracts/mcp_public). The maintainer's own checkout lists the 60 only, the operator set the live desks use. Every older tool name still answers when called; it is just no longer listed. The full table, generated from the server's own tool lists, is docs/overhaul/MCP.md.

group

tools

names

Market data (no key)

5

get_market, list_markets, get_candles, get_order_book, get_funding_regime

Account reads

4

get_account, get_positions, get_orders, get_history

Risk and sizing

2

get_risk_limits, size_trade

Orders (live money)

7

place_bracket, set_stop (tighter only), set_target, cancel_order, close_position, set_leverage, sweep_brackets

Desks

5

list_desks, get_desk_brief, refresh_desk, submit_desk_call, get_desk_record

Setup

4

get_status, get_config, update_config, connect_wallet (approve an API wallet with one signature)

Research pool

3

get_pool_status, join_pool, leave_pool

get_account, get_positions, get_orders and get_history take an address to read any other wallet, and only read it. The server signs with one key, yours, so it has no path to place, close or resize an order on any other account.

The oil desk is the one active desk on a fresh install. It trades Brent (xyz:BRENTOIL) on mainnet, and WTI (xyz:CL) on testnet, where Brent is not listed. The metals desk (gold, silver) is registered and off by default; get_desk_brief still reads it. The rules each bracket must pass are in docs/strategy/OIL_RULES.md.

Before you trade

Networks and modes

The mode follows from what is in ~/.pathiel/.env.local:

you have

mode

what works

no key

read-only, mainnet (the default) data

every read tool; order tools answer that no key is configured

an API wallet key

mainnet (the default)

everything, with real money

a key and PATHIEL_NETWORK=testnet

testnet

everything, with test funds; the oil desk trades WTI (xyz:CL)

Connect your wallet is the quick way to a key: /pathiel:setup (or asking Claude to connect your wallet) runs connect_wallet. It makes a new API wallet key on your machine and opens a local page where your browser wallet approves it with one signature, on the network you run. The key goes into ~/.pathiel/.env.local (mode 600) and nowhere else: it can trade, never withdraw, and your main key never leaves the wallet. Pasting an API wallet from the Hyperliquid app by hand still works.

State (theses, journals, caches) is kept per network, so testnet and mainnet never share it. Testnet needs its own API wallet, created and approved in the testnet app. How to create one, step by step: Connect your Hyperliquid account. The network is read once when the server starts: after editing the env file, reconnect pathiel in /mcp.

How the safety works

  • An exact stop on every order. place_bracket is the one entry path: entry, stop and target together. It refuses a bracket that pays under 2R, and a stop that sits outside half the distance to liquidation. A market entry fills first and its stop goes on right after; if the venue refuses that stop, the output says FILLED WITHOUT A STOP and sweep_brackets checks every open position for one.

  • Default profile: 3x, 1%, one position. At most 3x leverage, 1% of equity at the stop per trade (up to 2% only when the venue's minimum order size forces it), one position at a time. set_leverage refuses above the cap. You change the profile with update_config or in ~/.pathiel/.agent-config.json; nothing raises it for you.

  • Read-only without a key. No key, no orders. The API wallet key can trade and can never withdraw.

  • Testnet when you want it. PATHIEL_NETWORK=testnet in ~/.pathiel/.env.local switches to test funds.

  • Claude Code asks before each live-money call. The seven order tools, and update_config, are marked destructive, so Claude Code asks you before each call unless you allow the tool for good. Nothing runs in the background: no bot, no scheduler. The /loop desk tick trades only while your session runs it.

Builder fee

None. pathiel is free: no order it places carries a Hyperliquid builder fee, so you pay only Hyperliquid's own trading fee. There is nothing to approve.

If a fee ever comes back

It would ship as a new version with the rate in the changelog, and it could not touch your orders on its own: Hyperliquid charges a builder fee only after you approve that exact rate with your master wallet, and rejects any order whose builder fee is above the max you approved. Hyperliquid caps a perp builder fee at 0.1%. If you approved the 0.01% fee of pathiel 0.4.0, it is no longer charged; docs/BUILDER_FEE.md shows how to revoke it anyway.

Risk

Leveraged perps can lose the whole account, fast. The default profile limits how much one trade can lose at its stop; it does not limit gaps, slippage or a run of losses. The profile's daily loss figure is shown, not enforced. There is no demonstrated edge and no return is promised. This is software, not financial advice. You decide every trade and carry its result.

Restricted jurisdictions

Hyperliquid's terms bar use from restricted jurisdictions, including by US persons. The current list is in Hyperliquid's terms. pathiel does not check where you are; staying within the rules where you live is on you.

Your data

pathiel runs on your computer and the project runs no server, so nothing is sent to the maintainer. No analytics, no telemetry. What does leave your machine:

  • Hyperliquid API (api.hyperliquid.xyz, or the testnet API): market and account reads, the orders you ask for, the API wallet approval you sign.

  • Public data feeds the desk briefs read: EIA, FRED, CFTC, Congress and the Federal Register, prediction markets and news. An optional API key for one of them goes only to that feed.

  • GitHub, only if you join the research pool: the signed statement you submit as a pull request.

Keys, theses, the desk journal and your config stay in ~/.pathiel. Details: docs/PRIVACY.md.

Research pool (opt-in)

pathiel can grade your trades alongside everyone else's. You register your Hyperliquid address with one signed statement; you upload nothing, since pathiel only reads fills Hyperliquid already makes public. From the time you join, your public fills on the pool coins (xyz:BRENTOIL, xyz:CL, xyz:SILVER, xyz:GOLD) are graded with the same harness the project runs on its own trades, and published on a public scoreboard at least 24 hours late.

What you get: your own graded report (fluke or edge on your trades, with ranges, through get_pool_status with report: true), and pool-level stats on which desks and setups hold up across members.

What it is not: not a fee waiver, since pathiel charges no fee to anyone, member or not, and joining never changes what you pay. No payout, refund or reward is ever tied to your returns. Not a copy-trading feed: results are published at least 24 hours late, never live. No edge is demonstrated by joining, or by anything the pool's stats show.

Run /pathiel:share to join or leave. It shows you the exact statement before it signs anything, and the pull request it opens for you.

Scoreboard: https://julian-dev28.github.io/pathiel/scoreboard/

Privacy

What is public: your account address (shortened, with an explorer link), the date you joined, your closed and graded trade counts, your graded row (win rate, mean result in R, a label, a luck score), and pool totals that include your trades. What is never public: anything closed in the last 24 hours, any open position, single trades, prices, sizes, dollar results, account value, leverage, or any key.

Leaving is one more signed statement, or a request in a GitHub issue with no signature. Coming back takes a new signed join; only trades after the new join count, and deleting a leave file never brings an account back on its own.

Full details, including the exact text you sign: docs/PRIVACY.md.

FAQ

How do I connect Claude to Hyperliquid? Install pathiel as a Claude Code plugin with the three lines in Install in 30 seconds. Market data works at once with no key; add an API wallet key to ~/.pathiel/.env.local to trade. Claude Desktop, Cursor and other MCP clients use the launcher or the container described in Other MCP clients. No Anthropic API key is needed: the one model step, the desk thesis behind refresh_desk, runs through your local Claude Code CLI.

Is pathiel a Hyperliquid trading bot? No, and it never trades on its own. It is an MCP server that gives Claude tools: Claude places an order when you ask for one in the session, and Claude Code asks before each live-money call. /loop 15m /pathiel:desk-tick oil re-prompts Claude on a timer, only while that session stays open.

Can it withdraw my money? No. pathiel signs with an API wallet, which Hyperliquid lets trade and never withdraw. Your master key is never stored, and pathiel needs it for nothing: the only script that takes it revokes a builder fee approval, at a hidden prompt in your own terminal.

Does pathiel charge a fee? No. Orders carry no builder fee; you pay Hyperliquid's own trading fee only.

How do I practice without real money? Add PATHIEL_NETWORK=testnet to ~/.pathiel/.env.local, create an API wallet in the testnet app (app.hyperliquid-testnet.xyz), and reconnect pathiel in /mcp. The oil desk trades WTI (xyz:CL) there.

Is there an edge? None is demonstrated. The desk briefs are a structured, written call with levels, not a forecast. get_desk_record grades every call in the open.

How do I remove it? Revoke the API wallet in the Hyperliquid app (More, API), then claude plugin uninstall pathiel@pathiel and delete ~/.pathiel if you want the keys and state gone.

Docs

doc

for

docs/GETTING_STARTED.md

account setup, permissions, prompts from first read to first trade

docs/BUILDER_FEE.md

the fee is waived; revoking a 0.4.0 approval; how it works if it returns

docs/strategy/OIL_RULES.md

the rules every oil bracket must pass, and what is not known

docs/overhaul/MCP.md

all 30 public tools, and the operator's 60

docs/PRIVACY.md

the research pool: what is public, what is not, how to join, leave and come back

Scoreboard

the research pool's public, graded results

SECURITY.md

where keys live, what pathiel never does, how to report a problem

CONTRIBUTING.md

dev setup, the test gate, style rules

CHANGELOG.md

what changed per version

Maintainer setup

Maintainer path: this runs mainnet with the tracked repo config (20x, whole-equity sizing). It is not the public install.

This is how the maintainer runs pathiel on his own account, from a checkout. It is not the public install and its numbers are not the defaults.

git clone https://github.com/Julian-dev28/pathiel
cd pathiel
cp .env.local.example .env.local
scripts/restart.sh          # FastAPI Desk page on http://localhost:8000/ and the log rotator
scripts/restart.sh status
  • MCP server. The repo .mcp.json starts scripts/pathiel-mcp-server.py directly, with no install marker, so it runs mainnet on the tracked .agent-config.json. Opening a clone in Claude Code offers that server; accepting it is the maintainer path, not the public install. Other clients that want the public path register scripts/pathiel-mcp.

  • Risk profile. The tracked config sets 20x, the whole equity per position less the opening fee, one position. The rules place_bracket enforces (2R minimum, stop inside half the distance to liquidation, one slot) hold on both paths.

  • Desk loop. .claude/skills/desk-tick/SKILL.md on /loop 15m /desk-tick oil. scripts/build_plugin_skill.py generates the plugin copies under skills/ and agents/; the gate fails when a copy is stale.

  • Gate. PATHIEL_STATE_DIR=$(mktemp -d) .venv/bin/python -m pytest -q, offline, run by scripts/hooks/pre-commit (scripts/install_hooks.sh wires it in). scripts/mcp_tool_table.py regenerates the tool table; .venv/bin/python scripts/mcp_smoke.py is a live, read-only MCP smoke.

  • Keys. scripts/preflight_secrets.py checks the env file without printing it; docs/SECRETS.md lists every secret and how to rotate it.

More: CONTRIBUTING.md for the code layout, SECURITY.md for the hardening checks.

License

MIT. See LICENSE.

Available Tools

30 tools
cancel_orderA
Destructive

LIVE MONEY: acts on the real account. Cancel one resting order by its order id. order_id comes from get_orders; pass coin with it (asset, the numeric index, only when coin is unknown). Cancelling a position's only stop leaves it unprotected: to move a stop use set_stop, and to clear leftover orders on a flat coin use sweep_brackets. Use for a stale entry or a mistaken order. Needs a trading key. Returns {ok}; an order already filled or cancelled, or a missing coin and asset, returns the venue's {error} with isError true.

Inputs: order_id (required), coin, asset.

close_positionA
Destructive

LIVE MONEY: acts on the real account. Close a coin's entire open position now with one market order for the full size; partial closes are not supported, and like any market order it pays the spread and slippage of the book. A flat coin returns ok=true with noop already_flat and sends nothing. Closes are never refused for a delisted coin. Afterwards run sweep_brackets on the coin to cancel the stop and target that no longer protect anything. Use when the user asks to exit now; to exit at a price instead, move the level with set_stop or set_target. Needs a trading key. Returns {ok, result: {total_sz, avg_px}} or {error} with isError true.

Inputs: coin (required).

connect_walletA
Destructive

Connect the user's Hyperliquid wallet so pathiel can trade: makes a new API wallet key on this machine, opens a local page where the user's browser wallet approves it with one signature, and saves the key to ~/.pathiel/.env.local. The API wallet can trade and never withdraw. status=true reports a connect in progress (waiting, done or failed) and starts nothing; cancel=true stops a waiting one; replace=true swaps a key already set, only when the user said so; open_browser=false prints the page link instead of opening it. Call only when the user asked; get_status shows whether trading is enabled. It returns at once and does not wait for the signature: poll with status=true. With a key already set it keeps that key unless replace=true. A failure returns {ok: false, state: failed, code, error, next} saying what to do. Returns the connect state (waiting, done or failed) and the page link.

Inputs: cancel, status, replace, open_browser.

get_accountA
Read-only

Get the account's money in one call: total equity across the main perp dex, every HIP-3 dex and spot USDC, withdrawable, whether it can trade (and what blocks it), open positions in brief, plus risk: account leverage, cross margin ratio (1.0 = liquidation) and distance to liquidation. detail=full adds PnL per window (day, week, month, all time), the fee tier and API rate-limit use, for the configured account only. address reads any wallet instead. Use for balance and liquidation-risk questions. For each position in detail use get_positions; for what the risk profile allows use get_risk_limits. Needs a configured account or an address, never a key; with neither it returns {error, no_account: true}. Returns {account, risk}, plus {pnl, fees, rate_limits} with detail=full (ignored with address).

Inputs: detail, address.

get_candlesA
Read-only

Get OHLCV candles for one coin. Returns [{t, o, h, l, c, v}], oldest first, t in unix ms. Two modes: the last count candles at interval (default 100 x 1h; the newest one may still be forming, so one extra can come back), or a fixed window when start_time is given (end_time defaults to now; count is then ignored). interval is one of Hyperliquid's: 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 8h, 12h, 1d, 3d, 1w, 1M. Use for trend, levels, volatility and backtests. For the price right now use get_market; for depth use get_order_book. Read-only; needs no key. Window mode returns {coin, interval, start, end, count, candles[]}.

Inputs: coin (required), count, end_time, interval, +1 more.

get_configA
Read-only

Get the trading config from ~/.pathiel/.agent-config.json: mode (LIVE or OFF), HIP-3 on or off, coin and HIP-3 dex allow and block lists, the risk profile when set, and every other top-level key. Changes nothing. Use before update_config to see current values and key names; for what the risk profile allows in dollars use get_risk_limits, and for whether trading is enabled use get_status. A missing file reads as the defaults. Returns the config object.

Inputs: no named parameters.

get_desk_briefA
Read-only

Get one desk's current trade call to trade from: side, entry, stop and targets, the reasoning, and your_size, the size this account would take at those levels under its risk profile and desk share. mode=quick (default) is short markdown with the call first; mode=full adds the evidence (news, levels, scenarios). stale lists what is out of date; when the thesis is stale or its target was hit, call refresh_desk. Use before placing a desk trade with place_bracket. Not for the desk's past accuracy (get_desk_record) or the list of desks (list_desks). Read-only; needs no key. An unknown desk id returns {error: no such desk}. Returns {desk, mode, markdown, your_size: {side, size, notional_usd, leverage, margin_usd}, stale[]}.

Inputs: desk (required), mode.

get_desk_recordA

Get a desk's graded track record: calls graded, direction hit rate, mean Brier score, mean return, results by outcome, machine calls vs the user's own, and trades taken against each call. grade=true first grades expired calls and closed trades (writes the local journal, places no order); use it when calls have expired since the last grading, else leave it off and read. Use to judge whether a desk's calls deserve trust; for the current call use get_desk_brief. A desk with nothing graded yet returns n_graded 0. Returns {desk, track_record}, or {graded, record} with grade=true.

Inputs: desk (required), grade.

get_funding_regimeA
Read-only

Get the market-wide funding regime: whether longs or shorts are paying to hold (crowded) overall and per asset class (crypto, equity, commodity), with the coins whose funding is most extreme (funding as the hourly rate). asset_class narrows the coin list to one class; limit caps it (default 25, max 1000), most extreme first. Use to judge crowding before taking a side. For one coin's funding use get_market; for every coin ranked by funding use list_markets view=funding. Read-only; needs no key. Returns {regime, regimes_by_class, assets[]: {asset, asset_class, funding_rate, regime, oi, volume_24h}, assets_total}.

Inputs: limit, asset_class.

get_historyA
Read-only

Get the account's ledger, one kind per call. kind=fills (default): executed trades with price, size, side, fee and closed PnL, the latest fills by default, narrowed by coin and limit; start_time and end_time cut a time window (for another wallet, within its newest 2000 fills, the venue's cap). kind=funding: funding paid or received per coin between start_time and end_time. kind=deposits, withdrawals or transfers: money in, out and between perp, spot, sub-accounts and vaults since start_time; withdrawal_id checks one withdrawal's settlement. pathiel cannot move funds (its API wallet can trade, never withdraw), so these are records only. address reads any wallet. Rows come oldest first; limit (default 100, max 2000) keeps the newest. Use for PnL review and audits; for resting or cancelled orders use get_orders. Needs a configured account or an address; with neither it returns {error, no_account: true}. Returns {count, fills[]} for fills and {count, rows[]} for the other kinds.

Inputs: coin, kind, limit, address, +3 more.

get_marketA
Read-only

Get one coin's market snapshot in a single call: mid, mark and oracle price, current funding and the predicted next funding per venue, open interest, 24h volume, previous-day price and max leverage. Use it for any question about one coin right now. Not for many coins at once (list_markets), price over time (get_candles) or depth and slippage (get_order_book). Read-only; needs no key or account. A HIP-3 coin (xyz:GOLD) is read from its own dex. Returns {coin, mid: {price}, context: {funding, openInterest, markPx, oraclePx, midPx, dayNtlVlm, prevDayPx}, funding_next: {venues[]}, max_leverage}; a part the venue cannot answer carries its own error while the rest still returns, and an unknown coin returns {error} with isError true.

Inputs: coin (required).

get_order_bookA
Read-only

Get the live L2 order book for one coin: levels [bids, asks], up to 20 each, every level {px, sz, n orders}. Give size (in coins) or notional_usd, not both, to also walk the book for a market order of that size: average fill, worst price, slippage % and any unfilled amount; is_buy picks the side (default buy). Use before a large entry or exit to judge slippage. For the mid price alone use get_market. Read-only; needs no key. Returns {coin, time, levels}, or {book, impact: {avg_fill_px, worst_px, slippage_pct, filled_usd, unfilled_usd, book_exhausted}} when a size is given; an unknown coin returns {error}.

Inputs: coin (required), size, is_buy, notional_usd.

get_ordersA
Read-only

Get orders, one query per call. status=open (default): resting orders on every dex with order type (Stop Market, Take Profit Limit, Limit), trigger price, size and reduce-only flag; this is how to see a position's stop and target. status=history: filled and cancelled orders, newest first. oid or cloid looks up one order and overrides status. coin and limit narrow the list (limit default 100 open, 50 history, max 2000); address reads any wallet. Use before cancel_order (it needs the oid) and to check a position is protected. For executed trades use get_history. Needs a configured account or an address; with neither it returns {error, no_account: true}. Returns {count, orders[]: {coin, oid, side, sz, limitPx, triggerPx, orderType, reduceOnly}} or one order's status.

Inputs: oid, coin, cloid, limit, +2 more.

get_pool_statusA
Read-only

Get this account's research pool status (the pool is mainnet only): joined or not (and when), what is published and what stays private, the pool's latest counts, the scoreboard URL and how to join or leave. report=true adds your own graded report from your public fills since joining: win rate, mean R with ranges, labelled fluke or edge (members only). Use before join_pool or leave_pool and to see your grade; not for market data or balances (get_account) or your fills (get_history). Reads local files (the report also reads your public fills); signs and publishes nothing. Returns the status object, or {status, report}.

Inputs: report.

get_positionsA
Read-only

Get open perp positions on every dex (main and HIP-3): coin, signed size (negative = short), entry, position value, unrealized PnL, margin, leverage and liquidation price. coin narrows to one position and, for the configured account, adds the venue's liquidation price for it. address reads any wallet. Use to see what is open before placing, moving or closing anything. For balances use get_account; for the resting stop and target use get_orders. Needs a configured account or an address; with neither it returns {error, no_account: true}. Returns {count, positions[]} (count 0 when flat), or {positions, liquidation: {source, liquidation_price}} with coin.

Inputs: coin, address.

get_risk_limitsA
Read-only

Get what this account may trade under its saved risk profile: positions at once, dollars at risk per trade at the stop, max leverage, the minimum equity to trade and whether each book can trade now, with a one-line headline. equity_usd and preset answer what-if questions (a different account size or preset) and change nothing. Use to explain the limits, or before changing the profile with update_config. To size one specific trade use size_trade; for the raw config use get_config. Needs a configured account unless equity_usd is given (else {error, no_account: true}). A book is one strategy slot the profile allows (desk or manual). Returns {headline, can_trade, max_open_positions, risk_per_trade_usd, max_leverage, books[], notes[]}.

Inputs: preset, equity_usd.

get_statusA
Read-only

Start here. Get the install's status: the trading mode, equity with open positions in brief, and the registered accounts with the one that trades; on a public install also the network (mainnet or testnet), whether trading is enabled (an API wallet key is configured) or read-only, and the builder fee. Use first in a session and whenever an order is refused as read-only. For full balances and liquidation risk use get_account; for settings use get_config. Read-only. With no wallet connected it still answers, showing trading as read-only; a venue that cannot be reached shows in the equity fields. Returns {status: {mode, equity, equity_by_dex, positions, install (public installs): {network, trading, builder_fee}}, accounts: {count, accounts[], bot_trades_with}}.

Inputs: no named parameters.

join_poolA

Join the research pool, which grades your public fills on a public scoreboard. Two steps: without confirm it shows the exact statement and signs nothing; with confirm=true and the joined_at that first call returned, it SIGNS that statement with your key and writes the member file for a pull request. No order is placed and no money moves. Call only when the user asked to join, and confirm only after they read the statement. Check get_pool_status first. Needs a trading key and mainnet: on testnet it returns {error, code: testnet} and signs nothing. The user opens the pull request; leave_pool undoes it. Returns the statement, then the signed member file path.

Inputs: confirm, joined_at.

leave_poolA

Leave the research pool: the next scoreboard build drops your address and every row of it, and the leave stays in force until a later join. Two steps: without confirm it shows the exact statement and signs nothing; with confirm=true and the left_at that first call returned, it SIGNS that statement with your key and writes the leave file, which the user opens a pull request with, as for join_pool. No order is placed and no money moves. Call only when the user asked to leave, and confirm only after they read the statement; check membership first with get_pool_status. Needs a trading key and mainnet: on testnet it returns {error, code: testnet} and signs nothing. Returns the statement, then the signed leave file path.

Inputs: confirm, left_at.

list_desksA
Read-only

List every trading desk (crude oil, metals, ...) as a one-line card: id, primary coin, mid, 1-day return, the latest call's side and one-liner, how old the thesis is, the next catalyst and the track record. Use first to pick a desk, then get_desk_brief for its full call; for raw market listings use list_markets instead. Reads the local desk journal and live mids; needs no key. Returns {count, desks[]}.

Inputs: no named parameters.

list_marketsA
Read-only

List many coins at once, one board per call, to scan or rank the market. view=instruments (default): tradable perps and spot, highest 24h volume first, each with max leverage, funding, open interest and mid; query, type and limit narrow this view only. view=mids: every mid price (coins narrows it). view=funding: every coin by hourly funding. view=open_interest: the top 100 by open interest. view=assets: size decimals and max leverage per main-dex perp, for order sizing. limit defaults to 50 (max 1000). For one coin's full snapshot use get_market instead; for price history use get_candles. Read-only; needs no key. Returns {instruments[], counts, matched} for instruments, {count, mids} for mids, {count, rows[]} for funding and open_interest, and {count, assets[]} for assets; a venue failure returns {error} with isError true.

Inputs: type, view, coins, limit, +1 more.

place_bracketA
Destructive

LIVE MONEY: acts on the real account. Open one trade as a bracket: an entry plus an exact stop-loss and take-profit, sized by the risk profile exactly as size_trade reports. The side follows the levels (stop below the entry or mark is a long). entry_px rests a limit order and the stop and target attach when it fills; omit entry_px to enter at market now. The take-profit is placed 0.5% inside tp_px so it fills before the level (the result shows both). leverage defaults to the profile's max and is set on the coin first. Refused, with nothing sent: reward to risk under min_r (never below 2R), a stop outside half the distance to liquidation, a coin not listed on this network, or a second position or resting entry on the coin, unless add=true, which tops an open same-side position up to full size with a stop no wider than the current one. dry_run=true runs every check and returns the sizing without placing. Call only when the user asked for this trade; size it first with size_trade, adjust it later with set_stop or set_target, exit with close_position. Needs a trading key. Returns {ok, placed, mode, entry_px, stop_px, tp_px, size, leverage, result, network, builder_fee}; a refusal is ok=false, placed=false with the reason. If a market entry fills but the venue refuses the stop, the result is ok=false, placed=true, reason "FILLED WITHOUT A STOP": place one at once with set_stop.

Inputs: coin (required), tp_px (required), stop_px (required), add, +4 more.

refresh_deskA

Write a NEW thesis for one desk: pulls fresh market data, news, policy and odds, then makes one local Claude Code call (about a minute, billed to the local Claude Code plan; needs the claude CLI on PATH, else it fails fast). A refresh already running for the desk is joined, not repeated; force=true refreshes even when the desk's data is still fresh. Writes only the local desk journal; places no order. Use when get_desk_brief says the thesis is stale or its target was hit; otherwise read the current call with get_desk_brief. Returns the new call or the error.

Inputs: desk (required), force.

set_leverageA
Destructive

LIVE MONEY: acts on the real account. Set a coin's leverage, a whole number from 1 up to the coin's max (default 5 when omitted). It is capped by the risk profile's max_leverage and refused above it (raise the cap with update_config first). An open position keeps its own margin type (cross or isolated); a venue refusal, such as leverage too low for the margin in use, comes back as an error. place_bracket already sets leverage when given one, so call this alone only to change an open position or prepare a coin. Confirm with get_positions. Needs a trading key. Returns {ok, coin, leverage} or the error.

Inputs: coin (required), leverage.

set_stopA
Destructive

LIVE MONEY: acts on the real account. Move an open position's stop-loss tighter, toward the mark, to lock in gains or cut risk; never wider. One stop for the whole position goes on first, then every older stop on the coin is cancelled, so the position is never unprotected and a refused new order leaves the old one in place. Refused: no open position, a stop past the mark (it would fire at once), or a stop wider than or equal to the current one (a long's new stop must be above it, a short's below). With no stop at all, any stop on the right side of the mark is placed. Never changes the target or the size. To widen a stop, close and re-enter with place_bracket; to move the target use set_target. Needs a trading key. Returns {ok, stop_px, size, mark, replaced: old stop prices}; a refusal is {ok: false, reason, mark, current_stop} with isError true and nothing sent.

Inputs: coin (required), stop_px (required).

set_targetA
Destructive

LIVE MONEY: acts on the real account. Move an open position's take-profit to tp_px. One limit take-profit for the whole position goes on first, then every older target on the coin is cancelled, so the position always has a target and a refused new order leaves the old one in place. Refused: no open position, or a target on the losing side of the mark (it would fill at once). Never changes the stop or the size. Use to raise or lower a target. To move the stop use set_stop; to exit now use close_position. Needs a trading key. Returns {ok, tp_px, size, replaced: old target prices}; a refusal is {ok: false, reason} with isError true and nothing sent.

Inputs: coin (required), tp_px (required).

size_tradeA
Read-only

Size one trade before placing it, with the rules place_bracket uses: size, notional, leverage, margin, dollars at risk at the stop, payoff at each target and the liquidation price, plus the most this account's margin allows on the coin. The side follows the levels: stop below entry is a long, above is a short. targets adds a payoff per target price; leverage overrides the default (capped by the profile); equity_usd sizes a what-if account and skips the margin check. Use before every place_bracket; never size a trade by hand. Places nothing. Needs a configured account unless equity_usd is given. Returns {sizing: {side, size, notional_usd, leverage, margin_usd, risk_usd, risk_pct, targets[], liq_px, reason, warnings[]}, max_by_margin}, or the sizing alone for a what-if. A trade that cannot be sized (stop at the entry, equity too small) comes back can_trade false with size null and the reason.

Inputs: coin (required), stop_px (required), entry_px (required), targets, +2 more.

submit_desk_callA

Record the user's own trade call on a desk in the local journal (author=user), graded later beside the machine's theses in get_desk_record. call needs side (long, short, flat or pair), instrument, a one-liner of at most 160 characters, confidence from 0 to 1 and the invalidation; entry_px (or an entry_zone [lo, hi]), stop_px, targets and leverage are optional. scenarios, when given, are {name, probability, move_lo_pct, move_hi_pct (percent moves), description, triggers[]} whose probabilities sum to 1; a call that breaks a rule returns {error} naming it. Places no order and changes no config. Use when the user states a view they want tracked; to trade it use place_bracket. Returns the journaled call.

Inputs: call (required), desk (required), notes, scenarios.

sweep_bracketsA
Destructive

LIVE MONEY: acts on the real account. Tidy one coin's protective orders (one coin per call). On a flat coin it cancels stops and targets left behind after a stop or target fired (a resting entry's own attached stop and target are kept) and lists resting entries. With an open position it checks the stop covers the full size and folds several stops or targets at one price (one per fill) into a single pair, placing the new order before cancelling the old ones. Never opens, closes or moves a level. Run it after every close or fill; to move a level use set_stop or set_target. Needs a trading key. Returns {ok, position, stop_px[], tp_px[], stop_covers} with an open position, or {ok, position: 0, cancelled_stranded, resting_entries[]: {oid, px, sz}} when flat; ok=false with reason "POSITION NOT FULLY COVERED BY A STOP" means place one now with set_stop.

Inputs: coin (required).

update_configA
DestructiveIdempotent

Change the trading config on this machine; it applies at once to every later order. Pass only the keys to change: mode (LIVE or OFF), enable_hip3, coin_allowlist, coin_blocklist, hip3_dex_allowlist, hip3_dex_blocklist, or any other top-level key get_config shows, such as risk_profile; nested objects merge into the current ones and a list replaces the old list. mode is a label only: OFF does not stop the live-money tools. A call with nothing to change is refused. Read current values with get_config first, and call only when the user asked for this exact change. Not for one coin's leverage (set_leverage) or for sizing questions (get_risk_limits). Returns the updated config.

Inputs: mode, enable_hip3, coin_allowlist, coin_blocklist, +2 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.4/5.0

    Scored across 30 tools

    Disambiguation4/5

    Almost every tool targets a distinct resource/action pair (market snapshot, candles, book, positions, orders, history, desk brief, pool status), and descriptions explicitly cross-reference siblings to steer selection (e.g. get_market vs list_markets vs get_candles). The few adjacent pairs — size_trade vs place_bracket, set_stop/set_target vs sweep_brackets, cancel_order vs sweep_brackets — are clearly separated by the text, though the sheer density leaves some residual risk of misselection.

    Naming Consistency5/5

    All 30 tools use a uniform snake_case verb_noun pattern (get_market, list_markets, set_stop, close_position, join_pool, submit_desk_call, update_config), with verbs drawn from a small consistent vocabulary (get/list/set/place/close/cancel/refresh/join/leave). No camelCase or stylistic mixing anywhere.

    Tool Count3/5

    30 tools is heavy for a single server, well above the comfortable 3-15 band, though the surface legitimately spans market data, account state, order lifecycle, desk research, pool membership and configuration. Each tool does seem to earn its place, but the count is large enough that discovery cost is real.

    Completeness4/5

    Coverage is strong: market data (snapshot, board, candles, depth, funding regime), account state (balances, positions, orders, fills/funding/transfers, risk limits), full trade lifecycle (size, bracket, move stop/target, leverage, close, cancel, sweep), plus desks, pool and config. Minor gaps exist by design rather than oversight — no partial closes, no order modification (only cancel), and no fund movement — which agents can work around.

    Maintenance

    ActivityActive
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables Claude Desktop to interact with Hyperliquid DEX for trading perpetual futures using natural language, supporting 27 tools across trading, account management, market data analysis, and real-time WebSocket subscriptions.
      36
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Enables interaction with the Hyperliquid exchange to trade perpetuals, check positions, and manage risk through natural language. It provides tools for fetching real-time market data, tracking portfolio value, and executing orders with a focus on safety through default paper trading.
      10
      1
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to securely trade on Hyperliquid perpetual exchange, including order placement, position management, market data retrieval, and vault operations via natural language.
      23 PyPI
      24
      MIT