Skip to main content
Glama
agasavenue17

dreamDEX Perps MCP

by agasavenue17

dreamDEX Perps MCP

An MCP server that lets AI agents trade dreamDEX perpetuals.

Ready configs ship in this repo for the agent harnesses people already use: Claude Code, Claude Desktop, OpenCode, OpenAI Codex, ZCode, and Cursor, plus a generic mcpServers template that also fits Windsurf, Gemini CLI, Cline, and any other MCP client. Connect one of them to dreamDEX perps on the Somnia Hideki testnet and the agent can read markets, inspect a portfolio, and place real on-chain orders through plain tool calls. Per-harness setup is under MCA below.

Built for the dreamDEX Perps Builder Bounty (MVP track).

Why

dreamDEX is built for the agentic era: the order book is on-chain, the APIs are open, and agents are first-class participants. What was missing is a standard, safe way for an LLM agent to actually use the perps book. MCP (Model Context Protocol) is that standard. This server wraps the official @somnia-chain/markets-sdk (v0.32.1, the version the dreamDEX app runs) and exposes a small, auditable tool surface with guardrails an agent cannot talk its way around.

Related MCP server: limitless-mcp

An autonomous agent, not another trading bot

Conventional trading bots are automation. A programmer decides the strategy in advance, the code repeats it forever, and nothing in the system can decide that today is a bad day to trade. Change the behavior and you rewrite and redeploy code.

This project is built the other way around. The server ships no strategy at all. It gives an AI agent a set of guarded tools, and the agent decides: it studies the market, argues both sides of the trade, sizes the position, and can walk away. In live sessions with this build, the agent's own risk team and portfolio manager have rejected trades that a rule-based bot would have taken without a second thought.

Risk routines work the same way. Take-profit and stop-loss watching, margin guarding, funding plays: none of these are baked in as fixed code paths. They are standing instructions to the agent, changed in plain language, and the agent can weigh context a rigid strategy cannot, like closing early because funding flipped hard against the position before the stop was ever touched.

Conventional strategy bot

This project

Who decides

The programmer, months earlier, in code

The agent, per session, from live data

Refusing a trade

Not a concept that exists

The risk team and PM can and do reject

Changing behavior

Edit code, redeploy

Change the instruction

Judgment inputs

One strategy's signals

An analyst team: funding and open interest, technicals, news, sentiment

Risk routines

Hard-coded per strategy

Standing instructions the agent executes and adapts

Interface

CLI, config files, logs

Any MCP client, plus a visual Trading Desk

The signing key

Usually holds the funds it trades

Holds nothing in trading-key mode: trades for your account, cannot withdraw

What's inside

The MCP server. Seven tools (below) over the official markets SDK: markets, account state, voucher claim, and guarded order placement, cancellation and closing.

Trading-key mode. Link a bot key to your DreamDEX account in the app (wallet, Link a bot, Perps), set OWNER_ADDRESS, and the server trades for the account through the pool's placeOrderFor entrypoint, the same pattern as the official bot kit. Margin locks from the account, fills settle to the account, and the key pays STT gas only. The key holds no funds and cannot withdraw, and it works with the 1,000 USDso perps credit sitting in the account, which can never be transferred to a bot wallet because it is perps margin, not spot funds.

The agent team. A reference crew that runs on top of the tools: a Market Analyst (funding, open interest), a Technical Analyst (candles, RSI, MACD), news and sentiment readers, a Bull and a Bear that debate the trade in the open, a Trader that posts a sized proposal, a Risk Team with three stances (aggressive, neutral, conservative), and a Portfolio Manager with the final call.

The Trading Desk. A visual front end (npm run ui) with a live BTC chart and TradingView-style drawing tools, the debate streamed as it happens, an order ticket with margin and projected ROE, and a position panel whose ROE tracks the live mark tick by tick. Paper mode runs the full session on live market data with nothing sent on-chain.

Tools

Tool

Type

What it does

list_markets

read

All live perp markets: pool, margin bank, tick/lot, min size, max leverage

get_market

read

One market by symbol (BTC, ETH, SOL, …)

get_account

read

Open orders, recent fills, open positions, margin account, voucher eligibility

claim_voucher

write

Claim the one-time 1,000 paper USDso perps credit

place_order

write

Limit or market (IOC) perp order, pre-checked and capped

cancel_order

write

Cancel a resting order by id

close_position

write

Flatten a whole position with one opposite IOC order

In trading-key mode (OWNER_ADDRESS set), the write tools act on the linked account instead of the key's own account: place_order verifies the pool's operator grant first, pre-flights against the account's margin, and sends placeOrderFor; cancel_order and close_position follow the same path.

Safety model

An agent with a signing key is a loaded weapon, so the server is built defensive by default:

  • Read-only unless you say otherwise. No PRIVATE_KEY → no signing at all. Key present but TRADING_ENABLED unset → write tools still refuse.

  • Hard notional cap. Every order is rejected if its USD value exceeds MAX_ORDER_NOTIONAL_USD (default $50). The cap is enforced in code, not in a prompt.

  • Exchange-side pre-flight. Before sending, each order is checked with the SDK's getMaxPerpOrderSize, the same check the dreamDEX app runs, so margin, position caps and voucher allowlists are respected instead of discovered via reverts.

  • A key that holds nothing. In trading-key mode the signing key is a linked bot key: it can place, cancel and reduce orders for the account and pay gas, and that is all. Funds stay in the account, fills settle to the account, and withdrawal is not something the key can do.

  • Exact sizing. Quantities and prices are rounded to the market's own lotSize / tickSize, and per-market decimals (6–24 on the base side!) are read from the market row, never assumed.

  • Testnet only. The server is wired to the Hideki testnet chain (chain id 50383) and paper USDso. There is no mainnet switch.

Quick start

git clone https://github.com/agasavenue17/dreamdex-perps-mcp
cd dreamdex-perps-mcp
npm install
cp .env.example .env   # fill in PRIVATE_KEY if you want trading enabled
npm run build
npm start

Verify the wiring without any key (talks to the live testnet indexer):

node scripts/smoke.mjs

Use it from an MCP client

{
  "mcpServers": {
    "dreamdex-perps": {
      "command": "node",
      "args": ["/path/to/dreamdex-perps-mcp/dist/index.js"],
      "env": {
        "PRIVATE_KEY": "0x…your-testnet-key…",
        "TRADING_ENABLED": "true",
        "MAX_ORDER_NOTIONAL_USD": "50",
        "OWNER_ADDRESS": "0x…your-dreamdex-account, if the key is a linked bot key…"
      }
    }
  }
}

MCA: plug into the harness you already use

People do not need another app to try this. They need it inside the agent harness they already open every day. MCA ships a ready config for each of the popular ones, with the path to this checkout filled in for you:

npm run mca -- claude     # Claude Code and Claude Desktop
npm run mca -- opencode   # OpenCode (opencode.json)
npm run mca -- codex      # OpenAI Codex (~/.codex/config.toml)
npm run mca -- zcode      # ZCode (~/.zcode/cli/config.json)
npm run mca -- cursor     # Cursor, Windsurf, Gemini CLI, Cline, generic mcpServers clients

Static templates live in configs/ if you prefer to copy by hand: claude.mcp.json, opencode.json, codex.config.toml, and zcode.config.json, with the generic template covering Cursor and the other mcpServers clients. Every variant starts the same stdio server; only the config shape differs, because that is the only thing that differs between harnesses.

Run with Docker

docker build -t dreamdex-perps-mcp .
docker run -i --rm \
  -e PRIVATE_KEY=0x… \
  -e TRADING_ENABLED=true \
  -e OWNER_ADDRESS=0x… \
  dreamdex-perps-mcp

The server speaks MCP over stdio, so run it with -i, or point your MCP client at the docker run command directly. Configuration is environment variables only; see .env.example.

Then ask your agent things like:

  • "List the perp markets and show me BTC's max leverage."

  • "What's my account state? Any open positions?"

  • "Open a $20 long on BTC at market."

Getting testnet funds

  1. STT for gas: sign in at app.testnet.dreamdex.io, use Link a Bot with your key's address, and use Send it … for gas / Top up. A perp order costs roughly 0.0003–0.003 STT in gas.

  2. Paper USDso: with a fresh wallet (no positions or orders), call the claim_voucher tool once to receive the 1,000 USDso perps credit. Note the credit can only open positions in the markets on its allowlist.

How it works

AI agent ──MCP (stdio)──> this server ──> @somnia-chain/markets-sdk ──> Somnia Hideki testnet
                                            │                             ├─ Indexer (GraphQL): markets, portfolio
                                            └─ trader (viem signer)       └─ PerpPool contracts: orders settle on-chain

Reads go through the unified Somnia Markets indexer; writes are signed locally and sent straight to the perp pool contracts, where fills settle atomically on-chain. In trading-key mode the writes go to the pool's placeOrderFor / cancelOrderFor entrypoints (the markets SDK has no …For writes, so those calls are sent with viem, mirroring the official bot kit) after a read of the pool's operator registry confirms the link. Every placement returns the transaction hash and decoded fills, so an agent's work is verifiable in the testnet explorer.

Network reference

Chain

Somnia Hideki testnet (id 50383)

RPC

https://api.hideki2.infra.testnet.somnia.network

Indexer

https://hideki-dev.smk.somnia.host/v1/graphql

MarginBank

0x478769E1177C0773c43A593DCCc4Ad15F15F1394

Collateral

USDso (paper, via voucher)

Running behind a proxy

The SDK talks to the chain over a raw WebSocket and has no HTTP fallback, so networks that force traffic through an HTTP(S) proxy break its chain reads (genesis check failed). If that is your environment, run the bundled bridge and point the server at it:

node scripts/ws-bridge.mjs          # ws://127.0.0.1:8787/ws -> Hideki, via HTTPS_PROXY
WS_RPC_URL=ws://127.0.0.1:8787/ws npm start

License

MIT

Available Tools

7 tools
cancel_orderA

Cancel a resting perp order by its order id (see get_account for open orders).

NameRequiredDescriptionDefault
symbolYesBase symbol of the market, e.g. BTC
orderIdYesuint128 order id, decimal string

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden. 'Resting' usefully implies only open/unfilled orders can be cancelled, which is real behavioral signal, but there is no mention of what happens on an already-filled or nonexistent order, whether cancellation is irreversible, or any permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with the action and identifier front-loaded and a parenthetical pointer at the end. Nothing is redundant or padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation with no annotations and no output schema, the description covers the happy path adequately — how to find the id and what gets cancelled — but leaves outcome and failure semantics unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with strong per-property descriptions (base symbol example 'BTC', 'uint128 order id, decimal string'), so the schema already does the heavy lifting. The description only restates that the order is identified by its id, adding no format or validation detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb (cancel) plus a precise resource (resting perp order) and identifies the keying parameter (order id). The word 'resting' also implicitly separates it from close_position, though it never names that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an actionable workflow pointer — 'see get_account for open orders' — which tells the agent where the orderId comes from. It stops short of stating exclusions or when to prefer close_position over cancel.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

claim_voucherA

Claim the one-time 1,000 paper USDso perps credit for the server wallet (testnet play money). Only works if the wallet holds no perp positions or orders.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does real work: it reveals this is a one-time, non-repeatable mutation, specifies the credit amount, and flags the state precondition (no open positions or orders) that causes failure. It stops short of saying how failure surfaces (error vs. silent no-op) or what the call returns, which matters for a write with no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both load-bearing: the first defines the action and reward, the second defines the gate. The most decision-relevant facts (one-time, amount, precondition) are front-loaded with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter mutation with no annotations and no output schema, the description supplies what an agent needs to decide whether to call it: what it grants, that it is single-use, and the blocking state condition. Minor gap: no hint about the result (transaction hash, balance change) or how a rejected claim is reported.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The description correctly implies nothing is passed in — the wallet is fixed as the server wallet — leaving no parameter ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb (claim), the exact resource and amount (one-time 1,000 paper USDso perps credit), the target (server wallet) and environment (testnet play money). No sibling tool performs anything resembling a credit claim, so it is unambiguously separable from list_markets, get_account, place_order, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition that also functions as a when-not-to-use rule: 'Only works if the wallet holds no perp positions or orders.' No alternative tool is named, but there is no plausible substitute action here, so the guidance is operationally complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

close_positionA

Close the server wallet's entire position in one market with an opposite-side IOC market order sized exactly to the open position.

NameRequiredDescriptionDefault
symbolYesBase symbol, e.g. BTC

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations at all, the description still discloses the meaningful mechanics: it is a market order (so price impact/slippage applies), it is IOC (won't rest on the book), it hits the server wallet specifically, and the size is derived rather than supplied. It does not state required permissions, what happens if the position is zero, or how a residual after partial IOC fill is handled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence that states scope, mechanism, order type, time-in-force, and sizing rule with zero padding. Nothing to trim and nothing reordered.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating trading tool with no annotations and no output schema, the description covers the mechanism well but omits failure/no-position behavior, permissions, and what the response contains (fill price/quantity, residual position after a partial IOC fill). Those gaps matter for an agent deciding whether to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single parameter with 100% schema coverage, so the schema already explains symbol as the base symbol. The description only adds that the symbol identifies the single market whose position is closed, which is minimal but consistent; baseline 3 applies when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

A specific verb and resource ("Close ... entire position in one market") plus the exact mechanism: an opposite-side IOC market order sized to the open position. This distinguishes it from the generic place_order/cancel_order siblings without needing to open their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the name and description — you call it to flatten an existing position rather than to open or partially adjust one. There is no explicit when-to-use vs. place_order guidance and no stated preconditions (e.g. behavior when no position exists), so the agent must infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_accountB

Full perp account snapshot for an address (defaults to the server wallet): open orders, recent fills, open positions, margin account and paper-USDso voucher eligibility.

NameRequiredDescriptionDefault
addressNoAccount address; defaults to the configured wallet

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description bears the full burden; it usefully discloses the default server-wallet behavior and the categories of data returned. However, it does not explicitly state read-only semantics, permission requirements, freshness, or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single front-loaded sentence that immediately identifies the resource and then enumerates returned data. There is no wasted framing or redundant text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with no output schema, the description is nearly complete because it names the returned data categories and the default address behavior. It could be strengthened with explicit read-only or freshness/limit context, but no critical calling information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one optional parameter and the schema description coverage is 100%, including the same default-wallet behavior. The description reinforces the default but adds no syntax, formatting, or validation details beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource and scope: a full perp account snapshot for an address, defaulting to the server wallet. It clearly distinguishes this from market or order-action siblings by enumerating account-centric contents, though it does not explicitly name sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies usage by listing what the snapshot includes, but gives no explicit guidance on when to call this instead of siblings like claim_voucher or list_markets. There are no when-not conditions or alternatives mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_marketA

Get one perp market by base symbol (e.g. BTC, ETH, SOL): pool, tick/lot sizes, min quantity, margin and leverage.

NameRequiredDescriptionDefault
symbolYesBase symbol, e.g. BTC

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It discloses the kinds of values returned (pool, tick/lot sizes, min quantity, margin, leverage) but does not state read-only behavior, error handling for invalid symbols, or authentication requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero waste. It states the action, the key parameter, and the useful returned fields compactly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with no output schema, the description gives enough detail about what the returned market record contains. Minor gaps around invalid-symbol behavior and exact response shape remain, but the essential information is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the single symbol parameter is already documented with an example. The description reinforces that it is a base symbol and adds ETH/SOL examples, but does not add format or validation semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: get one perp market by base symbol. The scope 'one' and the listed returned fields distinguish it clearly from list_markets without needing to name the sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the usage condition clear: look up a single perp market by base symbol. It does not explicitly say when to use list_markets instead or what happens for unknown symbols, so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_marketsA

List all dreamDEX perpetual markets live on the Somnia Hideki testnet, with pool addresses, margin requirements and order-size rules.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does useful work by previewing the payload (pool addresses, margin requirements, order-size rules) in the absence of an output schema, and 'List' implies a safe read. It does not state auth requirements, testnet-only limitations, or whether results are paginated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler: scope, environment, and payload contents in one pass.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-param read tool with no output schema and no annotations, the description supplies the environment context and the shape of the returned data. Only operational details such as pagination or testnet constraints are missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the schema baseline of 4 applies; there is nothing further the description could clarify about inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all dreamDEX perpetual markets') plus the environment (Somnia Hideki testnet) and the returned fields. The plural 'all markets' implicitly contrasts with the singular sibling get_market, though it never names that alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The scope 'all ... markets' versus get_market's single-market retrieval is implied by naming and the sibling list, but there is no explicit when-to-use guidance, prerequisites, or exclusion. Usage must be inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

place_orderA

Place a perp order on dreamDEX testnet for the server wallet. Guarded: trading must be enabled, notional is capped by MAX_ORDER_NOTIONAL_USD, quantity/price are rounded to the market's lot/tick, and the order is pre-checked with getMaxPerpOrderSize before sending.

NameRequiredDescriptionDefault
sideYeslong = buy/bid, short = sell/ask
typeYesmarket = IOC order priced through the book with slippage
priceNoLimit price in USD per whole base. Required for limit orders.
symbolYesBase symbol, e.g. BTC
quantityYesOrder size in whole base units, e.g. '0.001' BTC

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does it well: it discloses the execution guards (trading enabled, MAX_ORDER_NOTIONAL_USD notional cap), that quantity/price are silently rounded to the market's lot/tick, and that a getMaxPerpOrderSize pre-check happens before submission. Gaps remain on failure behavior and what is returned on success or rejection.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The action and target lead the sentence, followed by the guard list as a compact enumeration. Every clause supplies a distinct operational fact — no restatement of the tool name, no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a state-mutating tool with no annotations and no output schema, the description covers environment, signer, preconditions, rounding, and a pre-check. It stops short of describing the result shape or how rejections surface, which is the one thing left unstated for a mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: submitted quantity/price may be adjusted to lot/tick increments and the effective size is bounded by a notional cap. Those facts change what values an agent should pass, which is exactly what parameter prose should add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Place a perp order') plus two scoping facts an agent needs: dreamDEX testnet and the server wallet as signer. None of the siblings (list_markets, get_market, get_account, cancel_order, close_position, claim_voucher) can be confused with this action, so differentiation is achieved without naming one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the precondition that selects this tool ('trading must be enabled') and an environmental constraint (testnet, server wallet) that tells the agent who is trading. It does not name alternatives for exiting or unwinding exposure (close_position, cancel_order) or say when not to place an order, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 7 tool updatesv0.1.0
    • First observedcancel_order
    • First observedclaim_voucher
    • First observedclose_position
    • First observedget_account
    • First observedget_market
    • First observedlist_markets
    • First observedplace_order

TDQS

A4/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a clearly distinct action: market listing vs single-market lookup, account snapshot, voucher claim, and three unmistakable order operations (place, cancel, close). There is no ambiguous overlap between any pair.

Naming Consistency5/5

All seven tools follow a strict verb_noun snake_case convention (list_markets, get_market, get_account, claim_voucher, place_order, cancel_order, close_position). The pattern is uniform and predictable throughout.

Tool Count5/5

Seven tools is well-scoped for a perps trading server, covering market data, account state, funding, and core order actions without bloat. Every tool earns its place with a distinct role.

Completeness4/5

Core lifecycle is covered: market discovery, account/position reads, order placement, cancellation, and position closing. Minor gaps remain—no order-modify/amend tool and no explicit leverage-adjustment tool despite leverage being central to perps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to interact with Hyperliquid perpetual futures exchange for market analysis, account management, and risk-managed trading.
    5
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to trade on Limitless prediction markets on Base via MCP, with tools for wallet management, market discovery, order placement, and portfolio tracking.
    PolyForm Noncommercial 1.0.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to browse, trade, and create prediction markets on Context Markets. Supports wallet management, order placement, and market creation through MCP tools.
    8 npm
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables agents to access live crypto market data and execute risk-controlled paper trades through standardized MCP tool calls.
    -