MCP tools and trading
Tool reference
| Tool | Mode | Purpose |
|---|---|---|
nord_list_markets | Public and authenticated | Discover IDs, symbols, precision, and CLOB/RFQ modes; optional search and mode filters |
nord_get_market | Public and authenticated | Pricing, availability, and up to 50 CLOB levels per side, or indicative RFQ reference data; requires marketId |
nord_get_connection | Authenticated | Profile identity, network, account, and session readiness |
nord_get_account | Authenticated | Selected-account balances and provider risk metrics |
nord_list_positions | Authenticated | Positions, optionally filtered by marketId |
nord_list_open_orders | Authenticated | Current CLOB orders and remaining sizes |
nord_list_order_history | Authenticated | A page of CLOB/RFQ account history |
nord_get_order | Authenticated | Order state and a page of fills; requires orderId |
nord_preview_order | Authenticated | Prepare an indicative order without signing |
nord_place_order | Authenticated | Submit a protected order with a stable requestId |
nord_cancel_order | Authenticated | Cancel one CLOB order using orderId and a stable requestId |
nord_get_request | Authenticated | Inspect and reconcile an operation by requestId |
Identifiers and financial quantities are decimal strings. Paginated tools
accept limit (default 20, maximum 50) and an optional cursor. Pass returned
cursors unchanged. History can lag execution; an empty page or open-order list
is not proof that an order was rejected. Unknown values are null, not zero;
account equity is not fabricated from other risk metrics.
Tools return structured content and text. Check the result's ok value and
error or request state, rather than treating a completed tool call as proof of
execution. observedAt is the fetch time, not a guarantee that the underlying
market data is fresh.
Order inputs
Discover the market ID first. Both preview and placement use these fields:
| Field | Meaning |
|---|---|
marketId | Decimal-string market ID, not a symbol |
side | buy or sell |
type | market or limit |
baseSize | Positive decimal-string base quantity; mutually exclusive with quoteNotional |
quoteNotional | Positive decimal-string quote-denominated position notional; mutually exclusive with baseSize |
limitPrice | Required for limit orders; not accepted for market orders |
slippageBps | Required integer from 0 to 9999 for market orders; not accepted for limit orders |
reduceOnly | Optional boolean, defaults to false |
Quote notional is the position size, not collateral or a leverage setting. It excludes fees. Explicit precision must match the market; it is not silently truncated. Derived quantities round down, and protective prices round toward the user's bound.
For example, after confirming the ID and capabilities of your intended market,
pass this directly to nord_preview_order. The ID below is illustrative:
{
"marketId": "0",
"side": "buy",
"type": "market",
"quoteNotional": "100",
"slippageBps": 50,
"reduceOnly": false
}
A preview is neither a firm quote nor reusable authorization. Placement fetches
fresh state and revalidates the session, account, market, precision, and pricing.
If you decide to submit, nord_place_order wraps those inputs in order and
requires a stable request ID:
{
"requestId": "order-example-001",
"order": {
"marketId": "0",
"side": "buy",
"type": "market",
"quoteNotional": "100",
"slippageBps": 50,
"reduceOnly": false
}
}
Use a new request ID for each new intent, and retain it to inspect or retry that same operation. Client approval settings govern submission.
CLOB and RFQ behavior
| Behavior | CLOB | RFQ |
|---|---|---|
| Market orders | IOC with a protective limit derived from the executable side of the book | Market-style user request with a worst acceptable price |
| Limit orders | Supported | Unsupported |
| Cancellation | Supported; can race fills | Unsupported |
| Quote sizing | Native quote sizing | Converted to a conservative base quantity; a notional target, not a native quote-amount execution cap |
| Outcome | May fill partially; inspect fills, resting size, and unfilled amount | Placement acknowledgement is separate from eventual fill or expiry |
CLOB orders use expire-maker self-trade prevention. RFQ pricing requires a
complete finalized sample no older than 30 seconds and a current-index
observation no older than 10 seconds. Stale or missing pricing fails closed.
RFQ data remains indicative even when fresh; it does not guarantee liquidity.
Inspect nord_get_order for fills and finalization rather than reporting an
RFQ acknowledgement as a completed trade.
See execution modes for the underlying market behavior.
Recover interrupted requests
The server persists request identity before submission and receipts before responding. Submission state and order lifecycle are separate: an accepted request does not necessarily mean a fully filled order.
If a write times out or the client disconnects:
- Call
nord_get_requestwith the originalrequestIdto inspect and advance reconciliation. Repeat this read if evidence is still missing. - If retrying the original write, use the same request ID and exactly the
same arguments. Changed arguments conflict. A request still in
preparedstate is incomplete; it can resume only if no action identity was persisted. - Keep
unknownoutcomes unresolved until evidence establishes what happened. Do not submit a replacement with a new ID to bypass recovery.
The package does not promise permanent exactly-once execution based on client order IDs or Nord's temporary deduplication cache. Cancelling an MCP call, closing the client, or stopping the server does not cancel an already submitted order.
For CLI inspection and access removal, see session management.