Skip to main content
Glama
t3rmed

Hyperliquid MCP Server

by t3rmed

place_order

Execute limit or trigger orders on Hyperliquid DEX to buy or sell crypto assets. Specify asset, direction, price, size, and time parameters to manage trading positions.

Instructions

Place a limit or trigger order on Hyperliquid

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
assetIndexYesAsset index for the coin (0 for BTC, 1 for ETH, etc.)
clientOrderIdNoClient order ID (optional)
isBuyYesTrue for buy order, false for sell order
priceYesOrder price as string
reduceOnlyNoWhether this is a reduce-only order (optional, default false)
sizeYesOrder size as string
timeInForceYesTime in force

Implementation Reference

  • The main handler function for the 'place_order' tool. It parses input arguments, constructs an OrderRequest and PlaceOrderAction, calls the HyperliquidClient's place_order method, and returns a formatted response.
    async def handle_place_order(client: HyperliquidClient, args: Dict[str, Any]) -> Dict[str, Any]: """Handle place order request.""" asset_index = args["assetIndex"] is_buy = args["isBuy"] price = args["price"] size = args["size"] reduce_only = args.get("reduceOnly", False) time_in_force = args["timeInForce"] client_order_id = args.get("clientOrderId") order = OrderRequest( a=asset_index, b=is_buy, p=price, s=size, r=reduce_only, t={"limit": LimitOrderType(tif=time_in_force)}, ) if client_order_id: order.c = client_order_id action = PlaceOrderAction(orders=[order]) result = await client.place_order(action) if not result.success: raise ValueError(f"Failed to place order: {result.error}") return { "content": [ TextContent( type="text", text=f"Order placed successfully!\n\n{json.dumps(result.data, indent=2)}", ) ] }
  • Defines the Tool object for 'place_order' including name, description, and detailed input schema for validation.
    place_order_tool = Tool( name="place_order", description="Place a limit or trigger order on Hyperliquid", inputSchema={ "type": "object", "properties": { "assetIndex": { "type": "number", "description": "Asset index for the coin (0 for BTC, 1 for ETH, etc.)", }, "isBuy": { "type": "boolean", "description": "True for buy order, false for sell order", }, "price": { "type": "string", "description": "Order price as string", }, "size": { "type": "string", "description": "Order size as string", }, "reduceOnly": { "type": "boolean", "description": "Whether this is a reduce-only order (optional, default false)", }, "timeInForce": { "type": "string", "description": "Time in force", "enum": ["Gtc", "Ioc", "Alo"], }, "clientOrderId": { "type": "string", "description": "Client order ID (optional)", }, }, "required": ["assetIndex", "isBuy", "price", "size", "timeInForce"], }, )
  • Registers the 'place_order' tool (via place_order_tool) in the MCP server's list of available tools.
    @app.list_tools() async def list_tools() -> list: """List all available tools.""" return [ # Market data tools get_all_mids_tool, get_l2_book_tool, get_candle_snapshot_tool, # Account info tools get_open_orders_tool, get_user_fills_tool, get_user_fills_by_time_tool, get_portfolio_tool, # Trading tools place_order_tool, place_trigger_order_tool, cancel_order_tool, cancel_all_orders_tool, ]
  • Dispatches tool calls to the 'handle_place_order' function when 'place_order' is requested.
    result = await handle_get_portfolio(client, args) elif name == "place_order": result = await handle_place_order(client, args) elif name == "place_trigger_order":
  • Core helper method in HyperliquidClient that signs and submits the place order action to the Hyperliquid API.
    async def place_order(self, action: PlaceOrderAction) -> ApiResponse[Any]: """Place an order.""" try: if not self.account: raise ValueError("Private key required for trading operations") nonce = self._generate_nonce() signature = await self._sign_action(action.model_dump(), nonce) payload = { "action": action.model_dump(), "nonce": nonce, "signature": signature, "vaultAddress": self.config.wallet_address, } response = await self.client.post("/exchange", json=payload) response.raise_for_status() return ApiResponse(success=True, data=response.json()) except Exception as e: return ApiResponse(success=False, error=str(e))

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/t3rmed/hyperliquid-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server