@pionex/pionex-trade-mcp 0.2.11 → 0.2.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -35,6 +35,6 @@ Credentials are read from `~/.pionex/config.toml` when the server starts; the cl
35
35
 
36
36
  ## Tools
37
37
 
38
- - **Market** (no auth): `pionex.market.get_depth`, `pionex.market.get_trades`, `pionex.market.get_symbol_info`, `pionex.market.get_tickers`, `pionex.market.get_klines`
39
- - **Account** (auth): `pionex.account.get_balance`
40
- - **Orders** (auth): `pionex.orders.new_order`, `pionex.orders.get_order`, `pionex.orders.get_order_by_client_order_id`, `pionex.orders.get_open_orders`, `pionex.orders.get_all_orders`, `pionex.orders.cancel_order`, `pionex.orders.get_fills`, `pionex.orders.cancel_all_orders`
38
+ - **Market** (no auth): `pionex_market_get_depth`, `pionex_market_get_trades`, `pionex_market_get_symbol_info`, `pionex_market_get_tickers`, `pionex_market_get_klines`
39
+ - **Account** (auth): `pionex_account_get_balance`
40
+ - **Orders** (auth): `pionex_orders_new_order`, `pionex_orders_get_order`, `pionex_orders_get_order_by_client_order_id`, `pionex_orders_get_open_orders`, `pionex_orders_get_all_orders`, `pionex_orders_cancel_order`, `pionex_orders_get_fills`, `pionex_orders_cancel_all_orders`
@@ -118,7 +118,7 @@ function errorContent(err) {
118
118
  // src/tools/market/index.ts
119
119
  function registerMarketTools(server2) {
120
120
  server2.tool(
121
- "pionex.market.get_depth",
121
+ "pionex_market_get_depth",
122
122
  "Get order book depth (bids and asks) for a symbol. Use for spread, liquidity, or best bid/ask.",
123
123
  {
124
124
  schema: z.object({
@@ -140,7 +140,7 @@ function registerMarketTools(server2) {
140
140
  }
141
141
  );
142
142
  server2.tool(
143
- "pionex.market.get_trades",
143
+ "pionex_market_get_trades",
144
144
  "Get recent trades for a symbol. Use for latest price and volume.",
145
145
  {
146
146
  schema: z.object({
@@ -162,7 +162,7 @@ function registerMarketTools(server2) {
162
162
  }
163
163
  );
164
164
  server2.tool(
165
- "pionex.market.get_symbol_info",
165
+ "pionex_market_get_symbol_info",
166
166
  "Get symbol metadata (precision, min size, price limits). Call before placing orders to avoid TRADE_AMOUNT_FILTER_DENIED errors.",
167
167
  {
168
168
  schema: z.object({
@@ -187,7 +187,7 @@ function registerMarketTools(server2) {
187
187
  }
188
188
  );
189
189
  server2.tool(
190
- "pionex.market.get_tickers",
190
+ "pionex_market_get_tickers",
191
191
  "Get 24-hour ticker(s): open, close, high, low, volume, amount, count. Optional symbol or type (SPOT/PERP).",
192
192
  {
193
193
  schema: z.object({
@@ -209,7 +209,7 @@ function registerMarketTools(server2) {
209
209
  }
210
210
  );
211
211
  server2.tool(
212
- "pionex.market.get_klines",
212
+ "pionex_market_get_klines",
213
213
  "Get OHLCV klines (candlestick) for a symbol. Use for charts or historical price/volume.",
214
214
  {
215
215
  schema: z.object({
@@ -239,7 +239,7 @@ function registerMarketTools(server2) {
239
239
  import { z as z2 } from "zod";
240
240
  function registerAccountTools(server2) {
241
241
  server2.tool(
242
- "pionex.account.get_balance",
242
+ "pionex_account_get_balance",
243
243
  "Query spot account balances for all currencies. Requires API key and secret in ~/.pionex/config.toml or env.",
244
244
  {
245
245
  // Accept any input; handler ignores params.
@@ -263,7 +263,7 @@ function registerAccountTools(server2) {
263
263
  import { z as z3 } from "zod";
264
264
  function registerOrdersTools(server2) {
265
265
  server2.tool(
266
- "pionex.orders.new_order",
266
+ "pionex_orders_new_order",
267
267
  'Create a spot order on Pionex. For LIMIT orders, you must provide `symbol`, `side`, `type="LIMIT"`, `price` and `size` (quantity). For MARKET BUY orders, you must provide `symbol`, `side="BUY"`, `type="MARKET"`, and `amount` (quote amount to spend). For MARKET SELL orders, you must provide `symbol`, `side="SELL"`, `type="MARKET"`, and `size` (base quantity). Common error codes: TRADE_AMOUNT_FILTER_DENIED, TRADE_SIZE_FILTER_DENIED, TRADE_NOT_ENOUGH_MONEY, TRADE_INVALID_SYMBOL.',
268
268
  {
269
269
  schema: z3.object({
@@ -297,7 +297,7 @@ function registerOrdersTools(server2) {
297
297
  }
298
298
  );
299
299
  server2.tool(
300
- "pionex.orders.get_order",
300
+ "pionex_orders_get_order",
301
301
  "Get a single order by order ID.",
302
302
  {
303
303
  schema: z3.object({
@@ -317,7 +317,7 @@ function registerOrdersTools(server2) {
317
317
  }
318
318
  );
319
319
  server2.tool(
320
- "pionex.orders.get_order_by_client_order_id",
320
+ "pionex_orders_get_order_by_client_order_id",
321
321
  "Get a single order by client order ID.",
322
322
  {
323
323
  schema: z3.object({
@@ -340,7 +340,7 @@ function registerOrdersTools(server2) {
340
340
  }
341
341
  );
342
342
  server2.tool(
343
- "pionex.orders.get_open_orders",
343
+ "pionex_orders_get_open_orders",
344
344
  "List open (unfilled) orders for a symbol.",
345
345
  { schema: z3.object({ symbol: z3.string().describe("e.g. BTC_USDT") }) },
346
346
  async (paramsRaw) => {
@@ -355,7 +355,7 @@ function registerOrdersTools(server2) {
355
355
  }
356
356
  );
357
357
  server2.tool(
358
- "pionex.orders.get_all_orders",
358
+ "pionex_orders_get_all_orders",
359
359
  "List order history for a symbol (filled and cancelled), with optional limit.",
360
360
  {
361
361
  schema: z3.object({
@@ -377,7 +377,7 @@ function registerOrdersTools(server2) {
377
377
  }
378
378
  );
379
379
  server2.tool(
380
- "pionex.orders.cancel_order",
380
+ "pionex_orders_cancel_order",
381
381
  "Cancel an open order by order ID.",
382
382
  {
383
383
  schema: z3.object({
@@ -397,7 +397,7 @@ function registerOrdersTools(server2) {
397
397
  }
398
398
  );
399
399
  server2.tool(
400
- "pionex.orders.get_fills",
400
+ "pionex_orders_get_fills",
401
401
  "Get filled trades (fills) for a symbol in a time range. Requires API key. Returns up to 100 latest fills.",
402
402
  {
403
403
  schema: z3.object({
@@ -421,7 +421,7 @@ function registerOrdersTools(server2) {
421
421
  }
422
422
  );
423
423
  server2.tool(
424
- "pionex.orders.cancel_all_orders",
424
+ "pionex_orders_cancel_all_orders",
425
425
  "Cancel all open orders for a symbol.",
426
426
  {
427
427
  schema: z3.object({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/run-server.ts","../src/tools/market/index.ts","../src/tools/common/client.ts","../src/tools/common/utils.ts","../src/tools/account/index.ts","../src/tools/orders/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { registerMarketTools } from \"./tools/market/index.js\";\nimport { registerAccountTools } from \"./tools/account/index.js\";\nimport { registerOrdersTools } from \"./tools/orders/index.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nconst server = new McpServer(\n {\n name: \"pionex-trade-mcp\",\n version: \"0.2.0\",\n },\n {\n capabilities: {\n tools: {},\n },\n },\n);\n\nregisterMarketTools(server);\nregisterAccountTools(server);\nregisterOrdersTools(server);\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n\n","import { z } from \"zod\";\nimport { publicGet } from \"../common/client.js\";\nimport { textContent, errorContent } from \"../common/utils.js\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nexport function registerMarketTools(server: McpServer): void {\n server.tool(\n \"pionex.market.get_depth\",\n \"Get order book depth (bids and asks) for a symbol. Use for spread, liquidity, or best bid/ask.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n limit: z.number().int().min(1).max(100).optional().describe(\"Price levels, default 5\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, limit } = params;\n const q: Record<string, unknown> = { symbol };\n if (limit != null) q.limit = limit;\n const data = await publicGet(\"/api/v1/market/depth\", q);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex.market.get_trades\",\n \"Get recent trades for a symbol. Use for latest price and volume.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n limit: z.number().int().min(1).max(100).optional().describe(\"Default 5\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, limit } = params;\n const q: Record<string, unknown> = { symbol };\n if (limit != null) q.limit = limit;\n const data = await publicGet(\"/api/v1/market/trades\", q);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex.market.get_symbol_info\",\n \"Get symbol metadata (precision, min size, price limits). Call before placing orders to avoid TRADE_AMOUNT_FILTER_DENIED errors.\",\n {\n schema: z.object({\n symbols: z\n .string()\n .optional()\n .describe(\n 'Optional. One or more symbols, comma-separated, e.g. \"BTC_USDT\" or \"BTC_USDT,ADA_USDT\".',\n ),\n type: z\n .enum([\"SPOT\", \"PERP\"])\n .optional()\n .describe(\"Optional. If no symbols are specified, filter by type (default is SPOT).\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbols, type } = params ?? {};\n const q: Record<string, unknown> = {};\n if (symbols) q.symbols = symbols;\n if (!symbols && type) q.type = type;\n const data = await publicGet(\"/api/v1/common/symbols\", q);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex.market.get_tickers\",\n \"Get 24-hour ticker(s): open, close, high, low, volume, amount, count. Optional symbol or type (SPOT/PERP).\",\n {\n schema: z.object({\n symbol: z\n .string()\n .optional()\n .describe(\"e.g. BTC_USDT; if omitted, returns all tickers filtered by type\"),\n type: z\n .enum([\"SPOT\", \"PERP\"])\n .optional()\n .describe(\"If symbol is not specified, filter by type (default SPOT).\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const q: Record<string, unknown> = {};\n if (params?.symbol) q.symbol = params.symbol;\n if (params?.type) q.type = params.type;\n const data = await publicGet(\"/api/v1/market/tickers\", q);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex.market.get_klines\",\n \"Get OHLCV klines (candlestick) for a symbol. Use for charts or historical price/volume.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n interval: z\n .enum([\"1M\", \"5M\", \"15M\", \"30M\", \"60M\", \"4H\", \"8H\", \"12H\", \"1D\"])\n .describe(\"Kline interval.\"),\n endTime: z.number().int().optional().describe(\"End time in milliseconds.\"),\n limit: z.number().int().min(1).max(500).optional().describe(\"Default 100.\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, interval, endTime, limit } = params;\n const q: Record<string, unknown> = { symbol, interval };\n if (endTime != null) q.endTime = endTime;\n if (limit != null) q.limit = limit;\n const data = await publicGet(\"/api/v1/market/klines\", q);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n}\n\n","import crypto from \"crypto\";\nimport process from \"process\";\nimport fetch from \"node-fetch\";\n\nconst API_KEY_ENV = \"PIONEX_API_KEY\";\nconst API_SECRET_ENV = \"PIONEX_API_SECRET\";\nconst BASE_URL_ENV = \"PIONEX_BASE_URL\";\n\nexport function getBaseUrl(): string {\n return process.env[BASE_URL_ENV] || \"https://api.pionex.com\";\n}\n\nexport function isAuthenticated(): boolean {\n return Boolean(process.env[API_KEY_ENV] && process.env[API_SECRET_ENV]);\n}\n\nexport function requireAuth(): void {\n if (!isAuthenticated()) {\n throw new Error(\n \"This tool requires authentication. Run 'pionex config init' to create ~/.pionex/config.toml, or set PIONEX_API_KEY and PIONEX_API_SECRET.\",\n );\n }\n}\n\nfunction getApiKey(): string {\n const v = process.env[API_KEY_ENV];\n if (!v) throw new Error(`Environment variable ${API_KEY_ENV} is required.`);\n return v;\n}\n\nfunction getApiSecret(): string {\n const v = process.env[API_SECRET_ENV];\n if (!v) throw new Error(`Environment variable ${API_SECRET_ENV} is required.`);\n return v;\n}\n\nfunction buildSignedRequest(\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n query: Record<string, unknown>,\n bodyJson: string | null = null,\n): { url: string; headers: Record<string, string>; bodyJson: string | null } {\n const baseUrl = getBaseUrl();\n const apiKey = getApiKey();\n const apiSecret = getApiSecret();\n const timestamp = Date.now().toString();\n const params: Record<string, unknown> = { ...query, timestamp };\n\n const sortedKeys = Object.keys(params).sort();\n const queryString = sortedKeys.map((k) => `${k}=${params[k]}`).join(\"&\");\n const pathUrl = `${path}?${queryString}`;\n let payload = `${method}${pathUrl}`;\n if (bodyJson != null) payload += bodyJson;\n\n const signature = crypto.createHmac(\"sha256\", apiSecret).update(payload).digest(\"hex\");\n\n const url = `${baseUrl}${pathUrl}`;\n const headers = {\n \"PIONEX-KEY\": apiKey,\n \"PIONEX-SIGNATURE\": signature,\n \"Content-Type\": \"application/json\",\n };\n return { url, headers, bodyJson };\n}\n\nexport async function publicGet(\n path: string,\n query: Record<string, unknown> = {},\n): Promise<unknown> {\n const baseUrl = getBaseUrl();\n const qs = new URLSearchParams(query as Record<string, string>).toString();\n const url = qs ? `${baseUrl}${path}?${qs}` : `${baseUrl}${path}`;\n const res = await fetch(url, { method: \"GET\", headers: { \"Content-Type\": \"application/json\" } });\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n return res.json();\n}\n\nexport async function signedGet(\n path: string,\n query: Record<string, unknown> = {},\n): Promise<unknown> {\n requireAuth();\n const { url, headers } = buildSignedRequest(\"GET\", path, query);\n const res = await fetch(url, { method: \"GET\", headers });\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n return res.json();\n}\n\nexport async function signedPost(path: string, body: Record<string, unknown>): Promise<unknown> {\n requireAuth();\n const bodyJson = JSON.stringify(body);\n const { url, headers } = buildSignedRequest(\"POST\", path, {}, bodyJson);\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body: bodyJson,\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n return res.json();\n}\n\nexport async function signedDelete(\n path: string,\n body: Record<string, unknown>,\n): Promise<unknown> {\n requireAuth();\n const bodyJson = JSON.stringify(body);\n const { url, headers } = buildSignedRequest(\"DELETE\", path, {}, bodyJson);\n const res = await fetch(url, {\n method: \"DELETE\",\n headers,\n body: bodyJson,\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n return res.json();\n}\n\n","export function toText(value: unknown): string {\n return JSON.stringify(\n value,\n (_, v) => (typeof v === \"bigint\" ? v.toString() : v),\n 2,\n );\n}\n\nexport function textContent(value: unknown): { content: { type: \"text\"; text: string }[] } {\n return { content: [{ type: \"text\", text: toText(value) }] };\n}\n\nexport function errorContent(\n err: unknown,\n): { content: { type: \"text\"; text: string }[]; isError: true } {\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\", text: `Error: ${message}` }], isError: true };\n}\n\n","import { z } from \"zod\";\nimport { signedGet } from \"../common/client.js\";\nimport { textContent, errorContent } from \"../common/utils.js\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nexport function registerAccountTools(server: McpServer): void {\n server.tool(\n \"pionex.account.get_balance\",\n \"Query spot account balances for all currencies. Requires API key and secret in ~/.pionex/config.toml or env.\",\n {\n // Accept any input; handler ignores params.\n // This avoids incompatibilities between clients that send {} vs { schema: {} }.\n schema: z.any(),\n },\n async (paramsRaw) => {\n try {\n // Some clients (or adapters) may wrap arguments as { schema: {...} }.\n // For this zero-arg tool we just normalize and ignore them.\n const _params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : paramsRaw ?? {};\n\n void _params;\n\n const data = await signedGet(\"/api/v1/account/balances\");\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n}\n\n","import { z } from \"zod\";\nimport { signedGet, signedPost, signedDelete } from \"../common/client.js\";\nimport { textContent, errorContent } from \"../common/utils.js\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nexport function registerOrdersTools(server: McpServer): void {\n server.tool(\n \"pionex.orders.new_order\",\n \"Create a spot order on Pionex. \" +\n \"For LIMIT orders, you must provide `symbol`, `side`, `type=\\\"LIMIT\\\"`, `price` and `size` (quantity). \" +\n \"For MARKET BUY orders, you must provide `symbol`, `side=\\\"BUY\\\"`, `type=\\\"MARKET\\\"`, and `amount` (quote amount to spend). \" +\n \"For MARKET SELL orders, you must provide `symbol`, `side=\\\"SELL\\\"`, `type=\\\"MARKET\\\"`, and `size` (base quantity). \" +\n \"Common error codes: TRADE_AMOUNT_FILTER_DENIED, TRADE_SIZE_FILTER_DENIED, TRADE_NOT_ENOUGH_MONEY, TRADE_INVALID_SYMBOL.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n side: z.enum([\"BUY\", \"SELL\"]),\n type: z.enum([\"LIMIT\", \"MARKET\"]),\n clientOrderId: z.string().max(64).optional(),\n size: z.string().optional().describe(\"Quantity; required for limit and market sell\"),\n price: z.string().optional().describe(\"Required for limit order\"),\n amount: z.string().optional().describe(\"Buying amount; required for market buy\"),\n IOC: z.boolean().optional().describe(\"Immediate-or-cancel, default false\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const body: Record<string, unknown> = {};\n if (params.symbol) body.symbol = params.symbol;\n if (params.side) body.side = params.side;\n if (params.type) body.type = params.type;\n if (params.clientOrderId != null) body.clientOrderId = params.clientOrderId;\n if (params.size != null) body.size = params.size;\n if (params.price != null) body.price = params.price;\n if (params.amount != null) body.amount = params.amount;\n if (params.IOC != null) body.IOC = params.IOC;\n const data = await signedPost(\"/api/v1/trade/order\", body);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex.orders.get_order\",\n \"Get a single order by order ID.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n orderId: z.number().int().describe(\"Order id\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, orderId } = params;\n const data = await signedGet(\"/api/v1/trade/order\", { symbol, orderId });\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex.orders.get_order_by_client_order_id\",\n \"Get a single order by client order ID.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n clientOrderId: z.string().describe(\"Client order id\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, clientOrderId } = params;\n const data = await signedGet(\"/api/v1/trade/orderByClientOrderId\", {\n symbol,\n clientOrderId,\n });\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex.orders.get_open_orders\",\n \"List open (unfilled) orders for a symbol.\",\n { schema: z.object({ symbol: z.string().describe(\"e.g. BTC_USDT\") }) },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol } = params;\n const data = await signedGet(\"/api/v1/trade/openOrders\", { symbol });\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex.orders.get_all_orders\",\n \"List order history for a symbol (filled and cancelled), with optional limit.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n limit: z.number().int().min(1).max(100).optional().describe(\"Default 1\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, limit } = params;\n const q: Record<string, unknown> = { symbol };\n if (limit != null) q.limit = limit;\n const data = await signedGet(\"/api/v1/trade/allOrders\", q);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex.orders.cancel_order\",\n \"Cancel an open order by order ID.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n orderId: z.number().int().describe(\"Order id\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, orderId } = params;\n const data = await signedDelete(\"/api/v1/trade/order\", { symbol, orderId });\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex.orders.get_fills\",\n \"Get filled trades (fills) for a symbol in a time range. Requires API key. Returns up to 100 latest fills.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n startTime: z.number().int().optional().describe(\"Start time in milliseconds.\"),\n endTime: z.number().int().optional().describe(\"End time in milliseconds.\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, startTime, endTime } = params;\n const q: Record<string, unknown> = { symbol };\n if (startTime != null) q.startTime = startTime;\n if (endTime != null) q.endTime = endTime;\n const data = await signedGet(\"/api/v1/trade/fills\", q);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex.orders.cancel_all_orders\",\n \"Cancel all open orders for a symbol.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol } = params;\n const data = await signedDelete(\"/api/v1/trade/allOrders\", { symbol });\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n}\n\n"],"mappings":"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","names":["server","z","server","z","z","server","z"]}
1
+ {"version":3,"sources":["../src/run-server.ts","../src/tools/market/index.ts","../src/tools/common/client.ts","../src/tools/common/utils.ts","../src/tools/account/index.ts","../src/tools/orders/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { registerMarketTools } from \"./tools/market/index.js\";\nimport { registerAccountTools } from \"./tools/account/index.js\";\nimport { registerOrdersTools } from \"./tools/orders/index.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nconst server = new McpServer(\n {\n name: \"pionex-trade-mcp\",\n version: \"0.2.0\",\n },\n {\n capabilities: {\n tools: {},\n },\n },\n);\n\nregisterMarketTools(server);\nregisterAccountTools(server);\nregisterOrdersTools(server);\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n\n","import { z } from \"zod\";\nimport { publicGet } from \"../common/client.js\";\nimport { textContent, errorContent } from \"../common/utils.js\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nexport function registerMarketTools(server: McpServer): void {\n server.tool(\n \"pionex_market_get_depth\",\n \"Get order book depth (bids and asks) for a symbol. Use for spread, liquidity, or best bid/ask.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n limit: z.number().int().min(1).max(100).optional().describe(\"Price levels, default 5\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, limit } = params;\n const q: Record<string, unknown> = { symbol };\n if (limit != null) q.limit = limit;\n const data = await publicGet(\"/api/v1/market/depth\", q);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex_market_get_trades\",\n \"Get recent trades for a symbol. Use for latest price and volume.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n limit: z.number().int().min(1).max(100).optional().describe(\"Default 5\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, limit } = params;\n const q: Record<string, unknown> = { symbol };\n if (limit != null) q.limit = limit;\n const data = await publicGet(\"/api/v1/market/trades\", q);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex_market_get_symbol_info\",\n \"Get symbol metadata (precision, min size, price limits). Call before placing orders to avoid TRADE_AMOUNT_FILTER_DENIED errors.\",\n {\n schema: z.object({\n symbols: z\n .string()\n .optional()\n .describe(\n 'Optional. One or more symbols, comma-separated, e.g. \"BTC_USDT\" or \"BTC_USDT,ADA_USDT\".',\n ),\n type: z\n .enum([\"SPOT\", \"PERP\"])\n .optional()\n .describe(\"Optional. If no symbols are specified, filter by type (default is SPOT).\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbols, type } = params ?? {};\n const q: Record<string, unknown> = {};\n if (symbols) q.symbols = symbols;\n if (!symbols && type) q.type = type;\n const data = await publicGet(\"/api/v1/common/symbols\", q);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex_market_get_tickers\",\n \"Get 24-hour ticker(s): open, close, high, low, volume, amount, count. Optional symbol or type (SPOT/PERP).\",\n {\n schema: z.object({\n symbol: z\n .string()\n .optional()\n .describe(\"e.g. BTC_USDT; if omitted, returns all tickers filtered by type\"),\n type: z\n .enum([\"SPOT\", \"PERP\"])\n .optional()\n .describe(\"If symbol is not specified, filter by type (default SPOT).\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const q: Record<string, unknown> = {};\n if (params?.symbol) q.symbol = params.symbol;\n if (params?.type) q.type = params.type;\n const data = await publicGet(\"/api/v1/market/tickers\", q);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex_market_get_klines\",\n \"Get OHLCV klines (candlestick) for a symbol. Use for charts or historical price/volume.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n interval: z\n .enum([\"1M\", \"5M\", \"15M\", \"30M\", \"60M\", \"4H\", \"8H\", \"12H\", \"1D\"])\n .describe(\"Kline interval.\"),\n endTime: z.number().int().optional().describe(\"End time in milliseconds.\"),\n limit: z.number().int().min(1).max(500).optional().describe(\"Default 100.\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, interval, endTime, limit } = params;\n const q: Record<string, unknown> = { symbol, interval };\n if (endTime != null) q.endTime = endTime;\n if (limit != null) q.limit = limit;\n const data = await publicGet(\"/api/v1/market/klines\", q);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n}\n\n","import crypto from \"crypto\";\nimport process from \"process\";\nimport fetch from \"node-fetch\";\n\nconst API_KEY_ENV = \"PIONEX_API_KEY\";\nconst API_SECRET_ENV = \"PIONEX_API_SECRET\";\nconst BASE_URL_ENV = \"PIONEX_BASE_URL\";\n\nexport function getBaseUrl(): string {\n return process.env[BASE_URL_ENV] || \"https://api.pionex.com\";\n}\n\nexport function isAuthenticated(): boolean {\n return Boolean(process.env[API_KEY_ENV] && process.env[API_SECRET_ENV]);\n}\n\nexport function requireAuth(): void {\n if (!isAuthenticated()) {\n throw new Error(\n \"This tool requires authentication. Run 'pionex config init' to create ~/.pionex/config.toml, or set PIONEX_API_KEY and PIONEX_API_SECRET.\",\n );\n }\n}\n\nfunction getApiKey(): string {\n const v = process.env[API_KEY_ENV];\n if (!v) throw new Error(`Environment variable ${API_KEY_ENV} is required.`);\n return v;\n}\n\nfunction getApiSecret(): string {\n const v = process.env[API_SECRET_ENV];\n if (!v) throw new Error(`Environment variable ${API_SECRET_ENV} is required.`);\n return v;\n}\n\nfunction buildSignedRequest(\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n query: Record<string, unknown>,\n bodyJson: string | null = null,\n): { url: string; headers: Record<string, string>; bodyJson: string | null } {\n const baseUrl = getBaseUrl();\n const apiKey = getApiKey();\n const apiSecret = getApiSecret();\n const timestamp = Date.now().toString();\n const params: Record<string, unknown> = { ...query, timestamp };\n\n const sortedKeys = Object.keys(params).sort();\n const queryString = sortedKeys.map((k) => `${k}=${params[k]}`).join(\"&\");\n const pathUrl = `${path}?${queryString}`;\n let payload = `${method}${pathUrl}`;\n if (bodyJson != null) payload += bodyJson;\n\n const signature = crypto.createHmac(\"sha256\", apiSecret).update(payload).digest(\"hex\");\n\n const url = `${baseUrl}${pathUrl}`;\n const headers = {\n \"PIONEX-KEY\": apiKey,\n \"PIONEX-SIGNATURE\": signature,\n \"Content-Type\": \"application/json\",\n };\n return { url, headers, bodyJson };\n}\n\nexport async function publicGet(\n path: string,\n query: Record<string, unknown> = {},\n): Promise<unknown> {\n const baseUrl = getBaseUrl();\n const qs = new URLSearchParams(query as Record<string, string>).toString();\n const url = qs ? `${baseUrl}${path}?${qs}` : `${baseUrl}${path}`;\n const res = await fetch(url, { method: \"GET\", headers: { \"Content-Type\": \"application/json\" } });\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n return res.json();\n}\n\nexport async function signedGet(\n path: string,\n query: Record<string, unknown> = {},\n): Promise<unknown> {\n requireAuth();\n const { url, headers } = buildSignedRequest(\"GET\", path, query);\n const res = await fetch(url, { method: \"GET\", headers });\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n return res.json();\n}\n\nexport async function signedPost(path: string, body: Record<string, unknown>): Promise<unknown> {\n requireAuth();\n const bodyJson = JSON.stringify(body);\n const { url, headers } = buildSignedRequest(\"POST\", path, {}, bodyJson);\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body: bodyJson,\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n return res.json();\n}\n\nexport async function signedDelete(\n path: string,\n body: Record<string, unknown>,\n): Promise<unknown> {\n requireAuth();\n const bodyJson = JSON.stringify(body);\n const { url, headers } = buildSignedRequest(\"DELETE\", path, {}, bodyJson);\n const res = await fetch(url, {\n method: \"DELETE\",\n headers,\n body: bodyJson,\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n return res.json();\n}\n\n","export function toText(value: unknown): string {\n return JSON.stringify(\n value,\n (_, v) => (typeof v === \"bigint\" ? v.toString() : v),\n 2,\n );\n}\n\nexport function textContent(value: unknown): { content: { type: \"text\"; text: string }[] } {\n return { content: [{ type: \"text\", text: toText(value) }] };\n}\n\nexport function errorContent(\n err: unknown,\n): { content: { type: \"text\"; text: string }[]; isError: true } {\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\", text: `Error: ${message}` }], isError: true };\n}\n\n","import { z } from \"zod\";\nimport { signedGet } from \"../common/client.js\";\nimport { textContent, errorContent } from \"../common/utils.js\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nexport function registerAccountTools(server: McpServer): void {\n server.tool(\n \"pionex_account_get_balance\",\n \"Query spot account balances for all currencies. Requires API key and secret in ~/.pionex/config.toml or env.\",\n {\n // Accept any input; handler ignores params.\n // This avoids incompatibilities between clients that send {} vs { schema: {} }.\n schema: z.any(),\n },\n async (paramsRaw) => {\n try {\n // Some clients (or adapters) may wrap arguments as { schema: {...} }.\n // For this zero-arg tool we just normalize and ignore them.\n const _params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : paramsRaw ?? {};\n\n void _params;\n\n const data = await signedGet(\"/api/v1/account/balances\");\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n}\n\n","import { z } from \"zod\";\nimport { signedGet, signedPost, signedDelete } from \"../common/client.js\";\nimport { textContent, errorContent } from \"../common/utils.js\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nexport function registerOrdersTools(server: McpServer): void {\n server.tool(\n \"pionex_orders_new_order\",\n \"Create a spot order on Pionex. \" +\n \"For LIMIT orders, you must provide `symbol`, `side`, `type=\\\"LIMIT\\\"`, `price` and `size` (quantity). \" +\n \"For MARKET BUY orders, you must provide `symbol`, `side=\\\"BUY\\\"`, `type=\\\"MARKET\\\"`, and `amount` (quote amount to spend). \" +\n \"For MARKET SELL orders, you must provide `symbol`, `side=\\\"SELL\\\"`, `type=\\\"MARKET\\\"`, and `size` (base quantity). \" +\n \"Common error codes: TRADE_AMOUNT_FILTER_DENIED, TRADE_SIZE_FILTER_DENIED, TRADE_NOT_ENOUGH_MONEY, TRADE_INVALID_SYMBOL.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n side: z.enum([\"BUY\", \"SELL\"]),\n type: z.enum([\"LIMIT\", \"MARKET\"]),\n clientOrderId: z.string().max(64).optional(),\n size: z.string().optional().describe(\"Quantity; required for limit and market sell\"),\n price: z.string().optional().describe(\"Required for limit order\"),\n amount: z.string().optional().describe(\"Buying amount; required for market buy\"),\n IOC: z.boolean().optional().describe(\"Immediate-or-cancel, default false\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const body: Record<string, unknown> = {};\n if (params.symbol) body.symbol = params.symbol;\n if (params.side) body.side = params.side;\n if (params.type) body.type = params.type;\n if (params.clientOrderId != null) body.clientOrderId = params.clientOrderId;\n if (params.size != null) body.size = params.size;\n if (params.price != null) body.price = params.price;\n if (params.amount != null) body.amount = params.amount;\n if (params.IOC != null) body.IOC = params.IOC;\n const data = await signedPost(\"/api/v1/trade/order\", body);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex_orders_get_order\",\n \"Get a single order by order ID.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n orderId: z.number().int().describe(\"Order id\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, orderId } = params;\n const data = await signedGet(\"/api/v1/trade/order\", { symbol, orderId });\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex_orders_get_order_by_client_order_id\",\n \"Get a single order by client order ID.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n clientOrderId: z.string().describe(\"Client order id\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, clientOrderId } = params;\n const data = await signedGet(\"/api/v1/trade/orderByClientOrderId\", {\n symbol,\n clientOrderId,\n });\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex_orders_get_open_orders\",\n \"List open (unfilled) orders for a symbol.\",\n { schema: z.object({ symbol: z.string().describe(\"e.g. BTC_USDT\") }) },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol } = params;\n const data = await signedGet(\"/api/v1/trade/openOrders\", { symbol });\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex_orders_get_all_orders\",\n \"List order history for a symbol (filled and cancelled), with optional limit.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n limit: z.number().int().min(1).max(100).optional().describe(\"Default 1\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, limit } = params;\n const q: Record<string, unknown> = { symbol };\n if (limit != null) q.limit = limit;\n const data = await signedGet(\"/api/v1/trade/allOrders\", q);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex_orders_cancel_order\",\n \"Cancel an open order by order ID.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n orderId: z.number().int().describe(\"Order id\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, orderId } = params;\n const data = await signedDelete(\"/api/v1/trade/order\", { symbol, orderId });\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex_orders_get_fills\",\n \"Get filled trades (fills) for a symbol in a time range. Requires API key. Returns up to 100 latest fills.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n startTime: z.number().int().optional().describe(\"Start time in milliseconds.\"),\n endTime: z.number().int().optional().describe(\"End time in milliseconds.\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol, startTime, endTime } = params;\n const q: Record<string, unknown> = { symbol };\n if (startTime != null) q.startTime = startTime;\n if (endTime != null) q.endTime = endTime;\n const data = await signedGet(\"/api/v1/trade/fills\", q);\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n\n server.tool(\n \"pionex_orders_cancel_all_orders\",\n \"Cancel all open orders for a symbol.\",\n {\n schema: z.object({\n symbol: z.string().describe(\"e.g. BTC_USDT\"),\n }),\n },\n async (paramsRaw) => {\n try {\n const params =\n paramsRaw && typeof (paramsRaw as any).schema === \"object\"\n ? (paramsRaw as any).schema\n : (paramsRaw as any);\n const { symbol } = params;\n const data = await signedDelete(\"/api/v1/trade/allOrders\", { symbol });\n return textContent(data);\n } catch (e) {\n return errorContent(e);\n }\n },\n );\n}\n\n"],"mappings":"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","names":["server","z","server","z","z","server","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pionex/pionex-trade-mcp",
3
- "version": "0.2.11",
3
+ "version": "0.2.14",
4
4
  "description": "Pionex MCP Server - reads credentials from ~/.pionex/config.toml",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -5,7 +5,7 @@ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
 
6
6
  export function registerAccountTools(server: McpServer): void {
7
7
  server.tool(
8
- "pionex.account.get_balance",
8
+ "pionex_account_get_balance",
9
9
  "Query spot account balances for all currencies. Requires API key and secret in ~/.pionex/config.toml or env.",
10
10
  {
11
11
  // Accept any input; handler ignores params.
@@ -5,7 +5,7 @@ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
 
6
6
  export function registerMarketTools(server: McpServer): void {
7
7
  server.tool(
8
- "pionex.market.get_depth",
8
+ "pionex_market_get_depth",
9
9
  "Get order book depth (bids and asks) for a symbol. Use for spread, liquidity, or best bid/ask.",
10
10
  {
11
11
  schema: z.object({
@@ -31,7 +31,7 @@ export function registerMarketTools(server: McpServer): void {
31
31
  );
32
32
 
33
33
  server.tool(
34
- "pionex.market.get_trades",
34
+ "pionex_market_get_trades",
35
35
  "Get recent trades for a symbol. Use for latest price and volume.",
36
36
  {
37
37
  schema: z.object({
@@ -57,7 +57,7 @@ export function registerMarketTools(server: McpServer): void {
57
57
  );
58
58
 
59
59
  server.tool(
60
- "pionex.market.get_symbol_info",
60
+ "pionex_market_get_symbol_info",
61
61
  "Get symbol metadata (precision, min size, price limits). Call before placing orders to avoid TRADE_AMOUNT_FILTER_DENIED errors.",
62
62
  {
63
63
  schema: z.object({
@@ -92,7 +92,7 @@ export function registerMarketTools(server: McpServer): void {
92
92
  );
93
93
 
94
94
  server.tool(
95
- "pionex.market.get_tickers",
95
+ "pionex_market_get_tickers",
96
96
  "Get 24-hour ticker(s): open, close, high, low, volume, amount, count. Optional symbol or type (SPOT/PERP).",
97
97
  {
98
98
  schema: z.object({
@@ -124,7 +124,7 @@ export function registerMarketTools(server: McpServer): void {
124
124
  );
125
125
 
126
126
  server.tool(
127
- "pionex.market.get_klines",
127
+ "pionex_market_get_klines",
128
128
  "Get OHLCV klines (candlestick) for a symbol. Use for charts or historical price/volume.",
129
129
  {
130
130
  schema: z.object({
@@ -5,7 +5,7 @@ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
 
6
6
  export function registerOrdersTools(server: McpServer): void {
7
7
  server.tool(
8
- "pionex.orders.new_order",
8
+ "pionex_orders_new_order",
9
9
  "Create a spot order on Pionex. " +
10
10
  "For LIMIT orders, you must provide `symbol`, `side`, `type=\"LIMIT\"`, `price` and `size` (quantity). " +
11
11
  "For MARKET BUY orders, you must provide `symbol`, `side=\"BUY\"`, `type=\"MARKET\"`, and `amount` (quote amount to spend). " +
@@ -47,7 +47,7 @@ export function registerOrdersTools(server: McpServer): void {
47
47
  );
48
48
 
49
49
  server.tool(
50
- "pionex.orders.get_order",
50
+ "pionex_orders_get_order",
51
51
  "Get a single order by order ID.",
52
52
  {
53
53
  schema: z.object({
@@ -71,7 +71,7 @@ export function registerOrdersTools(server: McpServer): void {
71
71
  );
72
72
 
73
73
  server.tool(
74
- "pionex.orders.get_order_by_client_order_id",
74
+ "pionex_orders_get_order_by_client_order_id",
75
75
  "Get a single order by client order ID.",
76
76
  {
77
77
  schema: z.object({
@@ -98,7 +98,7 @@ export function registerOrdersTools(server: McpServer): void {
98
98
  );
99
99
 
100
100
  server.tool(
101
- "pionex.orders.get_open_orders",
101
+ "pionex_orders_get_open_orders",
102
102
  "List open (unfilled) orders for a symbol.",
103
103
  { schema: z.object({ symbol: z.string().describe("e.g. BTC_USDT") }) },
104
104
  async (paramsRaw) => {
@@ -117,7 +117,7 @@ export function registerOrdersTools(server: McpServer): void {
117
117
  );
118
118
 
119
119
  server.tool(
120
- "pionex.orders.get_all_orders",
120
+ "pionex_orders_get_all_orders",
121
121
  "List order history for a symbol (filled and cancelled), with optional limit.",
122
122
  {
123
123
  schema: z.object({
@@ -143,7 +143,7 @@ export function registerOrdersTools(server: McpServer): void {
143
143
  );
144
144
 
145
145
  server.tool(
146
- "pionex.orders.cancel_order",
146
+ "pionex_orders_cancel_order",
147
147
  "Cancel an open order by order ID.",
148
148
  {
149
149
  schema: z.object({
@@ -167,7 +167,7 @@ export function registerOrdersTools(server: McpServer): void {
167
167
  );
168
168
 
169
169
  server.tool(
170
- "pionex.orders.get_fills",
170
+ "pionex_orders_get_fills",
171
171
  "Get filled trades (fills) for a symbol in a time range. Requires API key. Returns up to 100 latest fills.",
172
172
  {
173
173
  schema: z.object({
@@ -195,7 +195,7 @@ export function registerOrdersTools(server: McpServer): void {
195
195
  );
196
196
 
197
197
  server.tool(
198
- "pionex.orders.cancel_all_orders",
198
+ "pionex_orders_cancel_all_orders",
199
199
  "Cancel all open orders for a symbol.",
200
200
  {
201
201
  schema: z.object({