MCP server by patricleehua
中文🇨🇳
Hyperliquid MCP Trader
A trading toolchain built on the Model Context Protocol (MCP).
It wraps commonly used Hyperliquid Python SDK endpoints and exposes them as MCP tools:
get_mark_price(symbol): fetch the latest mark priceplace_omarket/limit(symbol, side, qty, price, tif): place a market or limit orderplace_spot_market/limit(...): spot entry points (not yet implemented in the current Hyperliquid SDK; calls raiseNotImplementedError)cancel_order(order_id): cancel an order by idget_positions(dex): return current positions (dexcan be empty,perp, orspot)get_balances(dex): return balances and margin summaries (samedexoptions as above)
1. Environment Setup
- Install uv (
pip install uvor follow the upstream guide). - Create a virtual environment at the project root and sync dependencies:
uv venv uv syncPrefer manual installs? Run
uv pip install -r requirements.txt. - Copy
.env.exampleto.env(or export variables manually) and fill in real credentials:cp .env.example .env # Edit .env: # HL_ACCOUNT_ADDRESS=0xYourMainWalletAddress # HL_SECRET_KEY=0xYourApiWalletPrivateKey # HL_NETWORK=testnet # or mainnet
Security tip: use Hyperliquid’s API wallet (trading permission only) and never commit real private keys.
Optional variables:HL_API_BASE_URL(custom endpoint),HL_SKIP_WS(set to true to skip WebSocket),MCP_AUTH_HEADER_VALUE(shared secret that must appear in theAuthorizationheader),MCP_AUTH_HEADER_NAME(override header name; defaults toAuthorization).
2. Run the MCP Server
uv run --env-file .env python -m app.mcp_server
The .env file is optional. If it exists the loader grabs it automatically, but you can omit the --env-file flag entirely and provide the credentials as environment variables:
HL_ACCOUNT_ADDRESS=0xYourMainWalletAddress \
HL_SECRET_KEY=0xYourApiWalletPrivateKey \
HL_NETWORK=testnet \
uv run python -m app.mcp_server --transport streamable-http --host 0.0.0.0 --port 9000
Typical MCP host entry (pseudo JSON):
Cherry Studio
{
"mcpServers": {
"hyperliquid-trading": {
"isActive": true,
"name": "hyperliquid-trading",
"type": "streamableHttp",
"description": "hyperliquid-trading",
"baseUrl": " http://0.0.0.0:9000/mcp",
"headers": {
"Authorization": "Bearer your-shared-secret"
}
}
}
}
By default the server speaks over stdin/stdout, which is ideal for local development.
To integrate with an MCP host (e.g., Claude Desktop, OpenAI Agents), register the same command in the host config.
Alternatively activate .venv manually and run python -m app.mcp_server.
To host over HTTP or SSE, specify the transport and network parameters:
# Streamable HTTP (defaults to 127.0.0.1:8000/mcp)
uv run python -m app.mcp_server --transport streamable-http --host 0.0.0.0 --port 9000
# SSE (works with OpenAI Agents, default mount path /sse)
uv run python -m app.mcp_server --transport sse
Environment variables are also supported: MCP_TRANSPORT=streamable-http, FASTMCP_HOST, FASTMCP_PORT, etc.
When MCP_AUTH_HEADER_VALUE is set, every HTTP/SSE request must include the configured header/value pair (defaults to Authorization:Bearer <value>); leaving it empty disables the check.
Request header validation
- Set a shared secret:
export MCP_AUTH_HEADER_VALUE=super-secret-token. - (Optional) override the header name:
export MCP_AUTH_HEADER_NAME=X-Custom-Auth. - Restart the server. Any HTTP/SSE request that omits the header will receive
403 Missing or invalid request header.
Example Streamable HTTP call:
curl -H "Authorization: super-secret-token" \
-H "Content-Type: application/json" \
-d '{"method":"list_tools","params":{}}' \
http://127.0.0.1:8000/mcp
Clear MCP_AUTH_HEADER_VALUE (or unset it) if you want to disable the guard for local testing.
Docker deployment
Option A – build locally
docker build -t hl-mcp .
docker run --rm \
-e HL_ACCOUNT_ADDRESS=0xYourMainWalletAddress \
-e HL_SECRET_KEY=0xYourApiWalletPrivateKey \
-e HL_NETWORK=testnet \
-e MCP_AUTH_HEADER_VALUE=super-secret-token \
-p 9000:9000 \
hl-mcp
Option B – pull the prebuilt image
docker pull patricleee/hyperliquid-trading-mcp:1.0.0
docker run --rm \
-e HL_ACCOUNT_ADDRESS=0xYourMainWalletAddress \
-e HL_SECRET_KEY=0xYourApiWalletPrivateKey \
-e HL_NETWORK=testnet \
-e MCP_AUTH_HEADER_VALUE=super-secret-token \
-p 9000:9000 \
patricleee/hyperliquid-trading-mcp:1.0.0
Option C – Docker Compose
A ready-to-use docker-compose.yml is included at the project root. Populate .env (same keys as usual) and launch:
cp .env.example .env # edit the values first
docker compose -f docker-compose.yml up -d
3. Troubleshooting
- Ensure
HL_ACCOUNT_ADDRESSandHL_SECRET_KEYmatch the chosen network (HL_NETWORK). - For rate limits (429) or timeouts, add retry/limit logic inside
HLClient. - Always test on the testnet first; switch to mainnet only after validating the workflow.
The project structure follows patterns from Hyperliquid’s official/community SDK samples and the MCP Python SDK documentation.