bitget-mcp-server 1.0.0
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/dist/index.d.ts +3 -0
- package/dist/index.js +3605 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/utils/errors.ts","../src/config.ts","../src/server.ts","../src/utils/signature.ts","../src/utils/rate-limiter.ts","../src/client/rest-client.ts","../src/tools/helpers.ts","../src/tools/common.ts","../src/tools/earn.ts","../src/tools/account.ts","../src/tools/broker.ts","../src/tools/convert.ts","../src/tools/copy-trading.ts","../src/tools/futures-market.ts","../src/tools/futures-trade.ts","../src/tools/margin.ts","../src/tools/p2p.ts","../src/tools/spot-market.ts","../src/tools/spot-trade.ts","../src/tools/index.ts","../src/tools/types.ts"],"sourcesContent":["import { parseArgs } from \"node:util\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { loadConfig } from \"./config.js\";\nimport { SERVER_NAME, SERVER_VERSION } from \"./constants.js\";\nimport { createServer } from \"./server.js\";\nimport { toToolErrorPayload } from \"./utils/errors.js\";\n\nfunction printHelp(): void {\n const help = `\nUsage: ${SERVER_NAME} [options]\n\nOptions:\n --modules <list> Comma-separated list of modules to load\n Available: spot, futures, account, margin, copytrading,\n convert, earn, p2p, broker\n Special: \"all\" loads all modules\n Default: spot,futures,account\n\n --read-only Expose only read/query tools and disable write operations\n --help Show this help message\n --version Show version\n\nEnvironment Variables:\n BITGET_API_KEY Bitget API key (required for private endpoints)\n BITGET_SECRET_KEY Bitget secret key (required for private endpoints)\n BITGET_PASSPHRASE Bitget passphrase (required for private endpoints)\n BITGET_API_BASE_URL Optional API base URL (default: https://api.bitget.com)\n BITGET_TIMEOUT_MS Optional request timeout in milliseconds (default: 15000)\n`;\n process.stdout.write(help);\n}\n\nfunction parseCli(): {\n modules?: string;\n readOnly: boolean;\n help: boolean;\n version: boolean;\n} {\n const parsed = parseArgs({\n options: {\n modules: {\n type: \"string\",\n },\n \"read-only\": {\n type: \"boolean\",\n default: false,\n },\n help: {\n type: \"boolean\",\n default: false,\n },\n version: {\n type: \"boolean\",\n default: false,\n },\n },\n allowPositionals: false,\n });\n\n return {\n modules: parsed.values.modules,\n readOnly: parsed.values[\"read-only\"],\n help: parsed.values.help,\n version: parsed.values.version,\n };\n}\n\nexport async function main(): Promise<void> {\n const cli = parseCli();\n\n if (cli.help) {\n printHelp();\n return;\n }\n\n if (cli.version) {\n process.stdout.write(`${SERVER_VERSION}\\n`);\n return;\n }\n\n const config = loadConfig({\n modules: cli.modules,\n readOnly: cli.readOnly,\n });\n const server = createServer(config);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain().catch((error: unknown) => {\n const payload = toToolErrorPayload(error);\n process.stderr.write(`${JSON.stringify(payload, null, 2)}\\n`);\n process.exitCode = 1;\n});\n","export const SERVER_NAME = \"bitget-mcp-server\";\nexport const SERVER_VERSION = \"1.0.0\";\n\nexport const MODULES = [\n \"spot\",\n \"futures\",\n \"account\",\n \"margin\",\n \"copytrading\",\n \"convert\",\n \"earn\",\n \"p2p\",\n \"broker\",\n] as const;\n\nexport type ModuleId = (typeof MODULES)[number];\n\nexport const DEFAULT_MODULES: ModuleId[] = [\"spot\", \"futures\", \"account\"];\n","export type ErrorType =\n | \"ConfigError\"\n | \"AuthenticationError\"\n | \"RateLimitError\"\n | \"ValidationError\"\n | \"BitgetApiError\"\n | \"NetworkError\"\n | \"InternalError\";\n\nexport interface ToolErrorPayload {\n error: true;\n type: ErrorType;\n code?: string;\n message: string;\n suggestion?: string;\n endpoint?: string;\n timestamp: string;\n}\n\nexport class BitgetMcpError extends Error {\n public readonly type: ErrorType;\n public readonly code?: string;\n public readonly suggestion?: string;\n public readonly endpoint?: string;\n\n public constructor(\n type: ErrorType,\n message: string,\n options?: {\n code?: string;\n suggestion?: string;\n endpoint?: string;\n cause?: unknown;\n },\n ) {\n super(message, options?.cause ? { cause: options.cause } : undefined);\n this.name = type;\n this.type = type;\n this.code = options?.code;\n this.suggestion = options?.suggestion;\n this.endpoint = options?.endpoint;\n }\n}\n\nexport class ConfigError extends BitgetMcpError {\n public constructor(message: string, suggestion?: string) {\n super(\"ConfigError\", message, { suggestion });\n }\n}\n\nexport class ValidationError extends BitgetMcpError {\n public constructor(message: string, suggestion?: string) {\n super(\"ValidationError\", message, { suggestion });\n }\n}\n\nexport class RateLimitError extends BitgetMcpError {\n public constructor(message: string, suggestion?: string, endpoint?: string) {\n super(\"RateLimitError\", message, { suggestion, endpoint });\n }\n}\n\nexport class AuthenticationError extends BitgetMcpError {\n public constructor(message: string, suggestion?: string, endpoint?: string) {\n super(\"AuthenticationError\", message, { suggestion, endpoint });\n }\n}\n\nexport class BitgetApiError extends BitgetMcpError {\n public constructor(\n message: string,\n options?: {\n code?: string;\n suggestion?: string;\n endpoint?: string;\n cause?: unknown;\n },\n ) {\n super(\"BitgetApiError\", message, options);\n }\n}\n\nexport class NetworkError extends BitgetMcpError {\n public constructor(message: string, endpoint?: string, cause?: unknown) {\n super(\"NetworkError\", message, {\n endpoint,\n cause,\n suggestion:\n \"Please check network connectivity and retry the request in a few seconds.\",\n });\n }\n}\n\nexport function toToolErrorPayload(\n error: unknown,\n fallbackEndpoint?: string,\n): ToolErrorPayload {\n if (error instanceof BitgetMcpError) {\n return {\n error: true,\n type: error.type,\n code: error.code,\n message: error.message,\n suggestion: error.suggestion,\n endpoint: error.endpoint ?? fallbackEndpoint,\n timestamp: new Date().toISOString(),\n };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n error: true,\n type: \"InternalError\",\n message,\n suggestion:\n \"Unexpected server error. Check tool arguments and retry. If it persists, inspect server logs.\",\n endpoint: fallbackEndpoint,\n timestamp: new Date().toISOString(),\n };\n}\n","import { DEFAULT_MODULES, MODULES, type ModuleId } from \"./constants.js\";\nimport { ConfigError } from \"./utils/errors.js\";\n\nexport interface CliOptions {\n modules?: string;\n readOnly: boolean;\n}\n\nexport interface BitgetConfig {\n apiKey?: string;\n secretKey?: string;\n passphrase?: string;\n hasAuth: boolean;\n baseUrl: string;\n timeoutMs: number;\n modules: ModuleId[];\n readOnly: boolean;\n}\n\nfunction parseModuleList(rawModules?: string): ModuleId[] {\n if (!rawModules || rawModules.trim().length === 0) {\n return [...DEFAULT_MODULES];\n }\n\n const trimmed = rawModules.trim().toLowerCase();\n if (trimmed === \"all\") {\n return [...MODULES];\n }\n\n const requested = trimmed\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n\n if (requested.length === 0) {\n return [...DEFAULT_MODULES];\n }\n\n const deduped = new Set<ModuleId>();\n for (const moduleId of requested) {\n if (!MODULES.includes(moduleId as ModuleId)) {\n throw new ConfigError(\n `Unknown module \"${moduleId}\".`,\n `Use one of: ${MODULES.join(\", \")} or \"all\".`,\n );\n }\n deduped.add(moduleId as ModuleId);\n }\n\n return Array.from(deduped);\n}\n\nfunction loadTimeoutMs(): number {\n const raw = process.env.BITGET_TIMEOUT_MS;\n if (!raw) {\n return 15_000;\n }\n\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new ConfigError(\n `Invalid BITGET_TIMEOUT_MS value \"${raw}\".`,\n \"Set BITGET_TIMEOUT_MS as a positive integer in milliseconds.\",\n );\n }\n\n return Math.floor(parsed);\n}\n\nfunction loadBaseUrl(): string {\n const baseUrl = process.env.BITGET_API_BASE_URL?.trim() || \"https://api.bitget.com\";\n if (!baseUrl.startsWith(\"http://\") && !baseUrl.startsWith(\"https://\")) {\n throw new ConfigError(\n `Invalid BITGET_API_BASE_URL \"${baseUrl}\".`,\n \"BITGET_API_BASE_URL must start with http:// or https://\",\n );\n }\n return baseUrl.replace(/\\/+$/, \"\");\n}\n\nexport function loadConfig(cli: CliOptions): BitgetConfig {\n const apiKey = process.env.BITGET_API_KEY?.trim();\n const secretKey = process.env.BITGET_SECRET_KEY?.trim();\n const passphrase = process.env.BITGET_PASSPHRASE?.trim();\n\n const hasAuth = Boolean(apiKey && secretKey && passphrase);\n const partialAuth =\n Boolean(apiKey) || Boolean(secretKey) || Boolean(passphrase);\n\n if (partialAuth && !hasAuth) {\n throw new ConfigError(\n \"Partial API credentials detected.\",\n \"Set BITGET_API_KEY, BITGET_SECRET_KEY and BITGET_PASSPHRASE together.\",\n );\n }\n\n return {\n apiKey,\n secretKey,\n passphrase,\n hasAuth,\n baseUrl: loadBaseUrl(),\n timeoutMs: loadTimeoutMs(),\n modules: parseModuleList(cli.modules),\n readOnly: cli.readOnly,\n };\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type CallToolResult,\n type Tool,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { BitgetConfig } from \"./config.js\";\nimport { BitgetRestClient } from \"./client/rest-client.js\";\nimport { MODULES, SERVER_NAME, SERVER_VERSION, type ModuleId } from \"./constants.js\";\nimport { getEarnCapabilityStatus, warmupEarnCapability } from \"./tools/earn.js\";\nimport { buildTools } from \"./tools/index.js\";\nimport { toMcpTool, type ToolSpec } from \"./tools/types.js\";\nimport { BitgetApiError, toToolErrorPayload } from \"./utils/errors.js\";\n\nconst SYSTEM_CAPABILITIES_TOOL_NAME = \"system_get_capabilities\";\nconst SYSTEM_CAPABILITIES_TOOL: Tool = {\n name: SYSTEM_CAPABILITIES_TOOL_NAME,\n description:\n \"Return machine-readable server capabilities and module availability for agent planning.\",\n inputSchema: {\n type: \"object\",\n additionalProperties: false,\n },\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n};\n\ntype ModuleCapabilityStatus =\n | \"enabled\"\n | \"disabled\"\n | \"unsupported\"\n | \"requires_auth\"\n | \"unknown\";\n\ninterface CapabilitySnapshot {\n readOnly: boolean;\n hasAuth: boolean;\n moduleAvailability: Record<\n ModuleId,\n {\n status: ModuleCapabilityStatus;\n reasonCode?: string;\n }\n >;\n}\n\nfunction buildCapabilitySnapshot(config: BitgetConfig): CapabilitySnapshot {\n const enabledModules = new Set(config.modules);\n const earnCapability = getEarnCapabilityStatus();\n const moduleAvailability = {} as CapabilitySnapshot[\"moduleAvailability\"];\n\n for (const moduleId of MODULES) {\n if (!enabledModules.has(moduleId)) {\n moduleAvailability[moduleId] = {\n status: \"disabled\",\n reasonCode: \"MODULE_FILTERED\",\n };\n continue;\n }\n\n if (moduleId !== \"earn\") {\n moduleAvailability[moduleId] = { status: \"enabled\" };\n continue;\n }\n\n if (!config.hasAuth) {\n moduleAvailability[moduleId] = {\n status: \"requires_auth\",\n reasonCode: \"AUTH_MISSING\",\n };\n continue;\n }\n\n if (earnCapability === \"unsupported\") {\n moduleAvailability[moduleId] = {\n status: \"unsupported\",\n reasonCode: \"EARN_UNAVAILABLE\",\n };\n continue;\n }\n\n if (earnCapability === \"supported\") {\n moduleAvailability[moduleId] = { status: \"enabled\" };\n continue;\n }\n\n moduleAvailability[moduleId] = {\n status: \"unknown\",\n reasonCode: \"CAPABILITY_PROBING\",\n };\n }\n\n return {\n readOnly: config.readOnly,\n hasAuth: config.hasAuth,\n moduleAvailability,\n };\n}\n\nfunction successResult(\n toolName: string,\n data: unknown,\n capabilitySnapshot: CapabilitySnapshot,\n): CallToolResult {\n const payload: Record<string, unknown> = {\n tool: toolName,\n ok: true,\n data,\n capabilities: capabilitySnapshot,\n timestamp: new Date().toISOString(),\n };\n return {\n content: [{ type: \"text\", text: JSON.stringify(payload, null, 2) }],\n structuredContent: payload,\n };\n}\n\nfunction errorResult(\n toolName: string,\n error: unknown,\n capabilitySnapshot: CapabilitySnapshot,\n): CallToolResult {\n const payload = toToolErrorPayload(error);\n const structured: Record<string, unknown> = {\n tool: toolName,\n ...payload,\n capabilities: capabilitySnapshot,\n };\n return {\n isError: true,\n content: [{ type: \"text\", text: JSON.stringify(structured, null, 2) }],\n structuredContent: structured,\n };\n}\n\nfunction unknownToolResult(\n toolName: string,\n capabilitySnapshot: CapabilitySnapshot,\n): CallToolResult {\n return errorResult(\n toolName,\n new BitgetApiError(`Tool \"${toolName}\" is not available in this server session.`, {\n code: \"TOOL_NOT_AVAILABLE\",\n suggestion: \"Call list_tools again and choose from currently available tools.\",\n }),\n capabilitySnapshot,\n );\n}\n\nexport function createServer(config: BitgetConfig): Server {\n const client = new BitgetRestClient(config);\n const tools = buildTools(config);\n const toolMap = new Map<string, ToolSpec>(tools.map((tool) => [tool.name, tool]));\n const hasEarnTools = tools.some((tool) => tool.module === \"earn\");\n let earnWarmupDone = false;\n const ensureEarnWarmupIfNeeded = async (): Promise<void> => {\n if (!hasEarnTools || !config.hasAuth || earnWarmupDone) {\n return;\n }\n earnWarmupDone = true;\n await warmupEarnCapability({ config, client });\n };\n const listVisibleTools = (): ToolSpec[] => {\n if (getEarnCapabilityStatus() !== \"unsupported\") {\n return tools;\n }\n return tools.filter((tool) => tool.module !== \"earn\");\n };\n\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n {\n capabilities: {\n tools: {},\n },\n },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n await ensureEarnWarmupIfNeeded();\n return {\n tools: [...listVisibleTools().map(toMcpTool), SYSTEM_CAPABILITIES_TOOL],\n };\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const toolName = request.params.name;\n await ensureEarnWarmupIfNeeded();\n if (toolName === SYSTEM_CAPABILITIES_TOOL_NAME) {\n const snapshot = buildCapabilitySnapshot(config);\n return successResult(\n toolName,\n {\n server: {\n name: SERVER_NAME,\n version: SERVER_VERSION,\n },\n capabilities: snapshot,\n },\n snapshot,\n );\n }\n const tool = toolMap.get(toolName);\n\n if (!tool) {\n return unknownToolResult(toolName, buildCapabilitySnapshot(config));\n }\n\n try {\n const response = await tool.handler(request.params.arguments ?? {}, {\n config,\n client,\n });\n return successResult(toolName, response, buildCapabilitySnapshot(config));\n } catch (error) {\n return errorResult(toolName, error, buildCapabilitySnapshot(config));\n }\n });\n\n return server;\n}\n","import { createHmac } from \"node:crypto\";\n\nexport function signBitgetPayload(payload: string, secretKey: string): string {\n return createHmac(\"sha256\", secretKey).update(payload).digest(\"base64\");\n}\n","import { RateLimitError } from \"./errors.js\";\n\ntype Bucket = {\n tokens: number;\n lastRefillMs: number;\n capacity: number;\n refillPerSecond: number;\n};\n\nexport type RateLimitConfig = {\n key: string;\n capacity: number;\n refillPerSecond: number;\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport class RateLimiter {\n private readonly buckets = new Map<string, Bucket>();\n private readonly maxWaitMs: number;\n\n public constructor(maxWaitMs = 30_000) {\n this.maxWaitMs = maxWaitMs;\n }\n\n public async consume(config: RateLimitConfig, amount = 1): Promise<void> {\n const bucket = this.getBucket(config);\n this.refill(bucket);\n\n if (bucket.tokens >= amount) {\n bucket.tokens -= amount;\n return;\n }\n\n const missing = amount - bucket.tokens;\n const secondsToWait = missing / bucket.refillPerSecond;\n const waitMs = Math.ceil(secondsToWait * 1000);\n\n if (waitMs > this.maxWaitMs) {\n throw new RateLimitError(\n `Client-side rate limit reached for ${config.key}. Required wait ${waitMs}ms exceeds allowed max ${this.maxWaitMs}ms.`,\n \"Reduce tool call frequency or retry later.\",\n );\n }\n\n await sleep(waitMs);\n this.refill(bucket);\n\n if (bucket.tokens < amount) {\n throw new RateLimitError(\n `Rate limiter failed to acquire enough tokens for ${config.key}.`,\n );\n }\n\n bucket.tokens -= amount;\n }\n\n private getBucket(config: RateLimitConfig): Bucket {\n const existing = this.buckets.get(config.key);\n if (existing) {\n if (\n existing.capacity !== config.capacity ||\n existing.refillPerSecond !== config.refillPerSecond\n ) {\n existing.capacity = config.capacity;\n existing.refillPerSecond = config.refillPerSecond;\n existing.tokens = Math.min(existing.tokens, config.capacity);\n }\n return existing;\n }\n\n const now = Date.now();\n const created: Bucket = {\n tokens: config.capacity,\n lastRefillMs: now,\n capacity: config.capacity,\n refillPerSecond: config.refillPerSecond,\n };\n this.buckets.set(config.key, created);\n return created;\n }\n\n private refill(bucket: Bucket): void {\n const now = Date.now();\n const elapsedMs = now - bucket.lastRefillMs;\n if (elapsedMs <= 0) {\n return;\n }\n\n const refillTokens = (elapsedMs / 1000) * bucket.refillPerSecond;\n bucket.tokens = Math.min(bucket.capacity, bucket.tokens + refillTokens);\n bucket.lastRefillMs = now;\n }\n}\n","import { signBitgetPayload } from \"../utils/signature.js\";\nimport {\n AuthenticationError,\n BitgetApiError,\n ConfigError,\n NetworkError,\n} from \"../utils/errors.js\";\nimport { RateLimiter } from \"../utils/rate-limiter.js\";\nimport type { BitgetConfig } from \"../config.js\";\nimport type {\n BitgetApiResponse,\n QueryParams,\n QueryValue,\n RequestConfig,\n RequestResult,\n} from \"./types.js\";\n\nfunction isDefined(value: unknown): boolean {\n return value !== undefined && value !== null;\n}\n\nfunction stringifyQueryValue(value: QueryValue): string {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(\",\");\n }\n return String(value);\n}\n\nfunction buildQueryString(query?: QueryParams): string {\n if (!query) {\n return \"\";\n }\n\n const entries = Object.entries(query).filter(([, value]) => isDefined(value));\n if (entries.length === 0) {\n return \"\";\n }\n\n const params = new URLSearchParams();\n for (const [key, value] of entries) {\n params.set(key, stringifyQueryValue(value));\n }\n return params.toString();\n}\n\nexport class BitgetRestClient {\n private readonly config: BitgetConfig;\n private readonly rateLimiter = new RateLimiter();\n\n public constructor(config: BitgetConfig) {\n this.config = config;\n }\n\n public async publicGet<TData = unknown>(\n path: string,\n query?: QueryParams,\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"GET\",\n path,\n auth: \"public\",\n query,\n rateLimit,\n });\n }\n\n public async privateGet<TData = unknown>(\n path: string,\n query?: QueryParams,\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"GET\",\n path,\n auth: \"private\",\n query,\n rateLimit,\n });\n }\n\n public async privatePost<TData = unknown>(\n path: string,\n body?: RequestConfig[\"body\"],\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"POST\",\n path,\n auth: \"private\",\n body,\n rateLimit,\n });\n }\n\n private async request<TData = unknown>(\n config: RequestConfig,\n ): Promise<RequestResult<TData>> {\n const queryString = buildQueryString(config.query);\n const endpoint = queryString.length > 0 ? `${config.path}?${queryString}` : config.path;\n const url = `${this.config.baseUrl}${endpoint}`;\n const bodyJson = config.body ? JSON.stringify(config.body) : \"\";\n const timestamp = Date.now().toString();\n\n if (config.rateLimit) {\n await this.rateLimiter.consume(config.rateLimit);\n }\n\n const headers = new Headers({\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n locale: \"en-US\",\n });\n\n if (config.auth === \"private\") {\n if (!this.config.hasAuth) {\n throw new ConfigError(\n \"Private endpoint requires API credentials.\",\n \"Configure BITGET_API_KEY, BITGET_SECRET_KEY and BITGET_PASSPHRASE.\",\n );\n }\n\n if (!this.config.apiKey || !this.config.secretKey || !this.config.passphrase) {\n throw new ConfigError(\n \"Invalid private API credentials state.\",\n \"Ensure all BITGET credentials are set.\",\n );\n }\n\n const payload = `${timestamp}${config.method.toUpperCase()}${endpoint}${bodyJson}`;\n const signature = signBitgetPayload(payload, this.config.secretKey);\n headers.set(\"ACCESS-KEY\", this.config.apiKey);\n headers.set(\"ACCESS-SIGN\", signature);\n headers.set(\"ACCESS-PASSPHRASE\", this.config.passphrase);\n headers.set(\"ACCESS-TIMESTAMP\", timestamp);\n }\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: config.method,\n headers,\n body: config.method === \"POST\" ? bodyJson : undefined,\n signal: AbortSignal.timeout(this.config.timeoutMs),\n });\n } catch (error) {\n throw new NetworkError(\n `Failed to call Bitget endpoint ${config.method} ${endpoint}.`,\n `${config.method} ${endpoint}`,\n error,\n );\n }\n\n const rawText = await response.text();\n let parsed: BitgetApiResponse<TData>;\n try {\n parsed = (rawText ? JSON.parse(rawText) : {}) as BitgetApiResponse<TData>;\n } catch (error) {\n if (!response.ok) {\n const messagePreview = rawText.slice(0, 160).replace(/\\s+/g, \" \").trim();\n throw new BitgetApiError(\n `HTTP ${response.status} from Bitget: ${messagePreview || \"Non-JSON response body\"}`,\n {\n code: String(response.status),\n endpoint: `${config.method} ${config.path}`,\n suggestion: \"Verify endpoint path and request parameters.\",\n },\n );\n }\n throw new NetworkError(\n `Bitget returned non-JSON response for ${config.method} ${endpoint}.`,\n `${config.method} ${endpoint}`,\n error,\n );\n }\n\n if (!response.ok) {\n throw new BitgetApiError(\n `HTTP ${response.status} from Bitget: ${parsed.msg ?? \"Unknown error\"}`,\n {\n code: String(response.status),\n endpoint: `${config.method} ${config.path}`,\n suggestion: \"Retry later or verify endpoint parameters.\",\n },\n );\n }\n\n const responseCode = parsed.code;\n if (responseCode && responseCode !== \"00000\") {\n const message = parsed.msg ?? \"Bitget API request failed.\";\n if (\n responseCode === \"40017\" ||\n responseCode === \"40018\" ||\n responseCode === \"40036\"\n ) {\n throw new AuthenticationError(message, \"Check API key, secret, passphrase and permissions.\", `${config.method} ${config.path}`);\n }\n\n throw new BitgetApiError(message, {\n code: responseCode,\n endpoint: `${config.method} ${config.path}`,\n });\n }\n\n return {\n endpoint: `${config.method} ${config.path}`,\n requestTime: new Date().toISOString(),\n data: (parsed.data ?? null) as TData,\n raw: parsed,\n };\n }\n}\n","import { ValidationError } from \"../utils/errors.js\";\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n return value as Record<string, unknown>;\n}\n\nexport function readString(\n args: Record<string, unknown>,\n key: string,\n): string | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new ValidationError(`Parameter \"${key}\" must be a string.`);\n }\n return value;\n}\n\nexport function readNumber(\n args: Record<string, unknown>,\n key: string,\n): number | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n throw new ValidationError(`Parameter \"${key}\" must be a number.`);\n }\n return value;\n}\n\nexport function readBoolean(\n args: Record<string, unknown>,\n key: string,\n): boolean | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"boolean\") {\n throw new ValidationError(`Parameter \"${key}\" must be a boolean.`);\n }\n return value;\n}\n\nexport function readStringArray(\n args: Record<string, unknown>,\n key: string,\n): string[] | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new ValidationError(`Parameter \"${key}\" must be an array of strings.`);\n }\n return value;\n}\n\nexport function readObjectArray(\n args: Record<string, unknown>,\n key: string,\n): Record<string, unknown>[] | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (\n !Array.isArray(value) ||\n value.some((item) => !item || typeof item !== \"object\" || Array.isArray(item))\n ) {\n throw new ValidationError(`Parameter \"${key}\" must be an array of objects.`);\n }\n return value as Record<string, unknown>[];\n}\n\nexport function requireString(\n args: Record<string, unknown>,\n key: string,\n): string {\n const value = readString(args, key);\n if (!value || value.length === 0) {\n throw new ValidationError(`Missing required parameter \"${key}\".`);\n }\n return value;\n}\n\nexport function requireObjectArray(\n args: Record<string, unknown>,\n key: string,\n): Record<string, unknown>[] {\n const value = readObjectArray(args, key);\n if (!value || value.length === 0) {\n throw new ValidationError(`Missing required non-empty array \"${key}\".`);\n }\n return value;\n}\n\nexport function ensureOneOf(\n args: Record<string, unknown>,\n keys: string[],\n message: string,\n): void {\n const hasAny = keys.some((key) => args[key] !== undefined && args[key] !== null);\n if (!hasAny) {\n throw new ValidationError(message);\n }\n}\n\nexport function assertEnum(\n value: string | undefined,\n key: string,\n values: readonly string[],\n): void {\n if (value === undefined) {\n return;\n }\n if (!values.includes(value)) {\n throw new ValidationError(\n `Parameter \"${key}\" must be one of: ${values.join(\", \")}.`,\n );\n }\n}\n\nexport function compactObject(\n object: Record<string, unknown>,\n): Record<string, unknown> {\n const next: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(object)) {\n if (value !== undefined && value !== null) {\n next[key] = value;\n }\n }\n return next;\n}\n","import type { RateLimitConfig } from \"../utils/rate-limiter.js\";\n\nexport const PRODUCT_TYPES = [\n \"USDT-FUTURES\",\n \"USDC-FUTURES\",\n \"COIN-FUTURES\",\n] as const;\n\nexport const GRANULARITIES = [\n \"1min\",\n \"5min\",\n \"15min\",\n \"30min\",\n \"1h\",\n \"4h\",\n \"6h\",\n \"12h\",\n \"1day\",\n \"3day\",\n \"1week\",\n \"1M\",\n] as const;\n\nexport function publicRateLimit(key: string, rps = 20): RateLimitConfig {\n return {\n key: `public:${key}`,\n capacity: rps,\n refillPerSecond: rps,\n };\n}\n\nexport function privateRateLimit(key: string, rps = 10): RateLimitConfig {\n return {\n key: `private:${key}`,\n capacity: rps,\n refillPerSecond: rps,\n };\n}\n","import type { ToolContext, ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport type { RequestResult } from \"../client/types.js\";\nimport { BitgetApiError } from \"../utils/errors.js\";\n\ntype EarnOperation = \"products\" | \"holdings\" | \"subscribe\" | \"redeem\";\nexport type EarnCapabilityStatus = \"unknown\" | \"supported\" | \"unsupported\";\n\nconst EARN_ENDPOINTS: Record<EarnOperation, string[]> = {\n products: [\"/api/v2/earn/product/list\", \"/api/v2/earn/saving/product/list\"],\n holdings: [\"/api/v2/earn/holding/list\", \"/api/v2/earn/saving/holding/list\"],\n subscribe: [\"/api/v2/earn/subscribe\"],\n redeem: [\"/api/v2/earn/redeem\"],\n};\n\nconst earnEndpointCache: Partial<Record<EarnOperation, string>> = {};\nlet earnCapability: EarnCapabilityStatus = \"unknown\";\n\nexport function getEarnCapabilityStatus(): EarnCapabilityStatus {\n return earnCapability;\n}\n\nexport async function warmupEarnCapability(context: ToolContext): Promise<EarnCapabilityStatus> {\n if (earnCapability !== \"unknown\") {\n return earnCapability;\n }\n try {\n await ensureEarnSupported(context);\n } catch {\n // warmup is best-effort; status transition is handled in ensureEarnSupported.\n }\n return earnCapability;\n}\n\nfunction is404Error(error: unknown): boolean {\n return error instanceof BitgetApiError && error.code === \"404\";\n}\n\nfunction earnUnavailableError(operation: EarnOperation): BitgetApiError {\n return new BitgetApiError(\n `Earn API operation \"${operation}\" is unavailable in current account/region or API environment.`,\n {\n code: \"EARN_UNAVAILABLE\",\n suggestion:\n \"Current Bitget environment does not expose earn endpoints for this account. Consider disabling earn module for this deployment.\",\n },\n );\n}\n\nfunction endpointCandidates(operation: EarnOperation): string[] {\n const cached = earnEndpointCache[operation];\n if (!cached) {\n return [...EARN_ENDPOINTS[operation]];\n }\n return [cached, ...EARN_ENDPOINTS[operation].filter((item) => item !== cached)];\n}\n\nasync function callEarnGet(\n context: ToolContext,\n operation: EarnOperation,\n query: Record<string, unknown>,\n rateLimitKey: string,\n): Promise<RequestResult> {\n for (const path of endpointCandidates(operation)) {\n try {\n const response = await context.client.privateGet(\n path,\n query,\n privateRateLimit(rateLimitKey, 10),\n );\n earnEndpointCache[operation] = path;\n return response;\n } catch (error) {\n if (is404Error(error)) {\n continue;\n }\n throw error;\n }\n }\n throw earnUnavailableError(operation);\n}\n\nasync function callEarnPost(\n context: ToolContext,\n operation: EarnOperation,\n body: Record<string, unknown>,\n rateLimitKey: string,\n): Promise<RequestResult> {\n for (const path of endpointCandidates(operation)) {\n try {\n const response = await context.client.privatePost(\n path,\n body,\n privateRateLimit(rateLimitKey, 5),\n );\n earnEndpointCache[operation] = path;\n return response;\n } catch (error) {\n if (is404Error(error)) {\n continue;\n }\n throw error;\n }\n }\n throw earnUnavailableError(operation);\n}\n\nasync function ensureEarnSupported(context: ToolContext): Promise<void> {\n if (earnCapability === \"supported\") {\n return;\n }\n if (earnCapability === \"unsupported\") {\n throw earnUnavailableError(\"products\");\n }\n try {\n await callEarnGet(\n context,\n \"products\",\n compactObject({\n coin: \"USDT\",\n }),\n \"earn_probe\",\n );\n earnCapability = \"supported\";\n } catch (error) {\n if (error instanceof BitgetApiError && error.code === \"EARN_UNAVAILABLE\") {\n earnCapability = \"unsupported\";\n }\n throw error;\n }\n}\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerEarnTools(): ToolSpec[] {\n return [\n {\n name: \"earn_get_products\",\n module: \"earn\",\n description:\n \"Query available earn products such as savings and staking. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n coin: { type: \"string\" },\n productType: { type: \"string\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n await ensureEarnSupported(context);\n const response = await callEarnGet(\n context,\n \"products\",\n compactObject({\n coin: readString(args, \"coin\"),\n productType: readString(args, \"productType\"),\n }),\n \"earn_get_products\",\n );\n return normalize(response);\n },\n },\n {\n name: \"earn_subscribe_redeem\",\n module: \"earn\",\n description:\n \"Subscribe or redeem earn products. [CAUTION] Locks/releases funds. Private endpoint. Rate limit: 5 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n action: { type: \"string\", enum: [\"subscribe\", \"redeem\"] },\n productId: { type: \"string\" },\n amount: { type: \"string\" },\n coin: { type: \"string\" },\n },\n required: [\"action\", \"productId\", \"amount\", \"coin\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const action = requireString(args, \"action\");\n assertEnum(action, \"action\", [\"subscribe\", \"redeem\"]);\n await ensureEarnSupported(context);\n const operation = action === \"subscribe\" ? \"subscribe\" : \"redeem\";\n const response = await callEarnPost(\n context,\n operation,\n {\n productId: requireString(args, \"productId\"),\n amount: requireString(args, \"amount\"),\n coin: requireString(args, \"coin\"),\n },\n \"earn_subscribe_redeem\",\n );\n return normalize(response);\n },\n },\n {\n name: \"earn_get_holdings\",\n module: \"earn\",\n description:\n \"Get current earn holdings and earnings records. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n coin: { type: \"string\" },\n productId: { type: \"string\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n await ensureEarnSupported(context);\n const response = await callEarnGet(\n context,\n \"holdings\",\n compactObject({\n coin: readString(args, \"coin\"),\n productId: readString(args, \"productId\"),\n }),\n \"earn_get_holdings\",\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit, PRODUCT_TYPES } from \"./common.js\";\n\nfunction toApiTransferType(accountType: string): string {\n // Bitget transfer API uses p2p naming for funding wallet.\n return accountType === \"funding\" ? \"p2p\" : accountType;\n}\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerAccountTools(): ToolSpec[] {\n return [\n {\n name: \"get_account_assets\",\n module: \"account\",\n description:\n \"Get spot/futures/funding/all account balances. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n accountType: {\n type: \"string\",\n enum: [\"spot\", \"futures\", \"funding\", \"all\"],\n description: \"Target account type. Default all.\",\n },\n coin: { type: \"string\", description: \"Optional coin filter.\" },\n productType: {\n type: \"string\",\n enum: [...PRODUCT_TYPES],\n description: \"Required when accountType=futures.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const accountType = readString(args, \"accountType\") ?? \"all\";\n assertEnum(accountType, \"accountType\", [\"spot\", \"futures\", \"funding\", \"all\"]);\n const coin = readString(args, \"coin\");\n const productType = readString(args, \"productType\");\n if (productType) {\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n }\n const route =\n accountType === \"spot\"\n ? \"/api/v2/spot/account/assets\"\n : accountType === \"futures\"\n ? \"/api/v2/mix/account/accounts\"\n : accountType === \"funding\"\n ? \"/api/v2/account/funding-assets\"\n : \"/api/v2/account/all-account-balance\";\n const response = await context.client.privateGet(\n route,\n compactObject({ coin, productType }),\n privateRateLimit(\"get_account_assets\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"get_account_bills\",\n module: \"account\",\n description:\n \"Get account bill records for spot or futures account. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n accountType: { type: \"string\", enum: [\"spot\", \"futures\"] },\n coin: { type: \"string\" },\n productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n businessType: { type: \"string\" },\n startTime: { type: \"string\" },\n endTime: { type: \"string\" },\n limit: { type: \"number\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const accountType = readString(args, \"accountType\") ?? \"spot\";\n assertEnum(accountType, \"accountType\", [\"spot\", \"futures\"]);\n const productType = readString(args, \"productType\");\n if (productType) {\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n }\n const route =\n accountType === \"futures\"\n ? \"/api/v2/mix/account/bill\"\n : \"/api/v2/spot/account/bills\";\n const response = await context.client.privateGet(\n route,\n compactObject({\n coin: readString(args, \"coin\"),\n productType,\n businessType: readString(args, \"businessType\"),\n startTime: readString(args, \"startTime\"),\n endTime: readString(args, \"endTime\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"get_account_bills\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"transfer\",\n module: \"account\",\n description:\n \"Transfer funds between accounts or sub-account. [CAUTION] Moves funds. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n fromAccountType: { type: \"string\" },\n toAccountType: { type: \"string\" },\n coin: { type: \"string\" },\n amount: { type: \"string\" },\n subAccountUid: { type: \"string\" },\n symbol: { type: \"string\" },\n clientOid: { type: \"string\" },\n },\n required: [\"fromAccountType\", \"toAccountType\", \"coin\", \"amount\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const subAccountUid = readString(args, \"subAccountUid\");\n const path = subAccountUid\n ? \"/api/v2/spot/wallet/subaccount-transfer\"\n : \"/api/v2/spot/wallet/transfer\";\n const response = await context.client.privatePost(\n path,\n compactObject({\n fromType: toApiTransferType(requireString(args, \"fromAccountType\")),\n toType: toApiTransferType(requireString(args, \"toAccountType\")),\n coin: requireString(args, \"coin\"),\n amount: requireString(args, \"amount\"),\n symbol: readString(args, \"symbol\"),\n clientOid: readString(args, \"clientOid\"),\n subAccountUid,\n }),\n privateRateLimit(\"transfer\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"withdraw\",\n module: \"account\",\n description:\n \"Withdraw funds to external address. [DANGER] Irreversible fund movement. Private endpoint. Rate limit: 1 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n coin: { type: \"string\" },\n transferType: { type: \"string\", enum: [\"on_chain\", \"internal_transfer\"] },\n address: { type: \"string\" },\n chain: { type: \"string\" },\n amount: { type: \"string\" },\n tag: { type: \"string\" },\n clientOid: { type: \"string\" },\n },\n required: [\"coin\", \"transferType\", \"address\", \"amount\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const transferType = requireString(args, \"transferType\");\n assertEnum(transferType, \"transferType\", [\"on_chain\", \"internal_transfer\"]);\n const response = await context.client.privatePost(\n \"/api/v2/spot/wallet/withdrawal\",\n compactObject({\n coin: requireString(args, \"coin\"),\n transferType,\n address: requireString(args, \"address\"),\n chain: readString(args, \"chain\"),\n amount: requireString(args, \"amount\"),\n tag: readString(args, \"tag\"),\n clientOid: readString(args, \"clientOid\"),\n }),\n privateRateLimit(\"withdraw\", 1),\n );\n return normalize(response);\n },\n },\n {\n name: \"cancel_withdrawal\",\n module: \"account\",\n description:\n \"Cancel pending withdrawal request by order id. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orderId: { type: \"string\", description: \"Withdrawal order id.\" },\n },\n required: [\"orderId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v2/spot/wallet/cancel-withdrawal\",\n { orderId: requireString(args, \"orderId\") },\n privateRateLimit(\"cancel_withdrawal\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"get_deposit_address\",\n module: \"account\",\n description:\n \"Get deposit address for coin and optional chain. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n coin: { type: \"string\" },\n chain: { type: \"string\" },\n },\n required: [\"coin\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v2/spot/wallet/deposit-address\",\n compactObject({\n coin: requireString(args, \"coin\"),\n chain: readString(args, \"chain\"),\n }),\n privateRateLimit(\"get_deposit_address\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"get_transaction_records\",\n module: \"account\",\n description:\n \"Get deposit, withdrawal, or transfer records. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n recordType: {\n type: \"string\",\n enum: [\"deposit\", \"withdrawal\", \"transfer\"],\n },\n coin: { type: \"string\" },\n startTime: { type: \"string\" },\n endTime: { type: \"string\" },\n limit: { type: \"number\" },\n orderId: { type: \"string\" },\n },\n required: [\"recordType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const recordType = requireString(args, \"recordType\");\n assertEnum(recordType, \"recordType\", [\"deposit\", \"withdrawal\", \"transfer\"]);\n const now = Date.now();\n const defaultStartTime = String(now - 30 * 24 * 60 * 60 * 1000);\n const defaultEndTime = String(now);\n const path =\n recordType === \"deposit\"\n ? \"/api/v2/spot/wallet/deposit-records\"\n : recordType === \"withdrawal\"\n ? \"/api/v2/spot/wallet/withdrawal-records\"\n : \"/api/v2/spot/account/sub-main-trans-record\";\n const startTime = readString(args, \"startTime\");\n const endTime = readString(args, \"endTime\");\n const response = await context.client.privateGet(\n path,\n compactObject({\n coin: readString(args, \"coin\"),\n startTime:\n recordType === \"deposit\" || recordType === \"transfer\"\n ? (startTime ?? defaultStartTime)\n : startTime,\n endTime:\n recordType === \"deposit\" || recordType === \"transfer\"\n ? (endTime ?? defaultEndTime)\n : endTime,\n limit: readNumber(args, \"limit\"),\n orderId: readString(args, \"orderId\"),\n }),\n privateRateLimit(\"get_transaction_records\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"manage_subaccounts\",\n module: \"account\",\n description:\n \"Create, modify, list subaccounts and manage subaccount API keys. [CAUTION] Account management operation. Private endpoint. Rate limit: 5 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\n \"create\",\n \"modify\",\n \"list\",\n \"createApiKey\",\n \"modifyApiKey\",\n \"listApiKeys\",\n ],\n },\n subAccountName: { type: \"string\" },\n subAccountUid: { type: \"string\" },\n remark: { type: \"string\" },\n apiKeyPermissions: { type: \"string\" },\n apiKeyIp: { type: \"string\" },\n apiKeyPassphrase: { type: \"string\" },\n },\n required: [\"action\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const action = requireString(args, \"action\");\n assertEnum(action, \"action\", [\n \"create\",\n \"modify\",\n \"list\",\n \"createApiKey\",\n \"modifyApiKey\",\n \"listApiKeys\",\n ]);\n const common = compactObject({\n subAccountName: readString(args, \"subAccountName\"),\n subAccountUid: readString(args, \"subAccountUid\"),\n remark: readString(args, \"remark\"),\n apiKeyPermissions: readString(args, \"apiKeyPermissions\"),\n apiKeyIp: readString(args, \"apiKeyIp\"),\n apiKeyPassphrase: readString(args, \"apiKeyPassphrase\"),\n });\n\n if (action === \"list\") {\n const response = await context.client.privateGet(\n \"/api/v2/user/virtual-subaccount-list\",\n common,\n privateRateLimit(\"manage_subaccounts\", 5),\n );\n return normalize(response);\n }\n\n if (action === \"listApiKeys\") {\n const response = await context.client.privateGet(\n \"/api/v2/user/virtual-subaccount-apikey-list\",\n common,\n privateRateLimit(\"manage_subaccounts\", 5),\n );\n return normalize(response);\n }\n\n const endpoint =\n action === \"create\"\n ? \"/api/v2/user/create-virtual-subaccount\"\n : action === \"modify\"\n ? \"/api/v2/user/modify-virtual-subaccount\"\n : action === \"createApiKey\"\n ? \"/api/v2/user/create-virtual-subaccount-apikey\"\n : \"/api/v2/user/modify-virtual-subaccount-apikey\";\n const response = await context.client.privatePost(\n endpoint,\n common,\n privateRateLimit(\"manage_subaccounts\", 5),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerBrokerTools(): ToolSpec[] {\n return [\n {\n name: \"broker_get_info\",\n module: \"broker\",\n description:\n \"Get broker account information and commission data. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n handler: async (_rawArgs, context) => {\n const response = await context.client.privateGet(\n \"/api/v2/broker/account/info\",\n undefined,\n privateRateLimit(\"broker_get_info\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"broker_manage_subaccounts\",\n module: \"broker\",\n description:\n \"Create, modify, or list broker subaccounts. Private endpoint. Rate limit: 5 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n action: { type: \"string\", enum: [\"create\", \"modify\", \"list\"] },\n subAccountUid: { type: \"string\" },\n subAccountName: { type: \"string\" },\n remark: { type: \"string\" },\n limit: { type: \"number\" },\n },\n required: [\"action\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const action = requireString(args, \"action\");\n assertEnum(action, \"action\", [\"create\", \"modify\", \"list\"]);\n const payload = compactObject({\n subAccountUid: readString(args, \"subAccountUid\"),\n subAccountName: readString(args, \"subAccountName\"),\n remark: readString(args, \"remark\"),\n limit: readNumber(args, \"limit\"),\n });\n if (action === \"list\") {\n const response = await context.client.privateGet(\n \"/api/v2/broker/account/subaccount-list\",\n payload,\n privateRateLimit(\"broker_manage_subaccounts\", 5),\n );\n return normalize(response);\n }\n const endpoint =\n action === \"create\"\n ? \"/api/v2/broker/account/create-subaccount\"\n : \"/api/v2/broker/account/modify-subaccount\";\n const response = await context.client.privatePost(\n endpoint,\n payload,\n privateRateLimit(\"broker_manage_subaccounts\", 5),\n );\n return normalize(response);\n },\n },\n {\n name: \"broker_manage_apikeys\",\n module: \"broker\",\n description:\n \"Create, modify, or list API keys for broker subaccounts. Private endpoint. Rate limit: 5 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n action: { type: \"string\", enum: [\"create\", \"modify\", \"list\"] },\n subAccountUid: { type: \"string\" },\n apiKeyPermissions: { type: \"string\" },\n apiKeyIp: { type: \"string\" },\n apiKeyPassphrase: { type: \"string\" },\n },\n required: [\"action\", \"subAccountUid\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const action = requireString(args, \"action\");\n const subAccountUid = requireString(args, \"subAccountUid\");\n assertEnum(action, \"action\", [\"create\", \"modify\", \"list\"]);\n const payload = compactObject({\n subAccountUid,\n apiKeyPermissions: readString(args, \"apiKeyPermissions\"),\n apiKeyIp: readString(args, \"apiKeyIp\"),\n apiKeyPassphrase: readString(args, \"apiKeyPassphrase\"),\n });\n if (action === \"list\") {\n const response = await context.client.privateGet(\n \"/api/v2/broker/account/subaccount-apikey-list\",\n payload,\n privateRateLimit(\"broker_manage_apikeys\", 5),\n );\n return normalize(response);\n }\n const endpoint =\n action === \"create\"\n ? \"/api/v2/broker/account/create-subaccount-apikey\"\n : \"/api/v2/broker/account/modify-subaccount-apikey\";\n const response = await context.client.privatePost(\n endpoint,\n payload,\n privateRateLimit(\"broker_manage_apikeys\", 5),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n ensureOneOf,\n readNumber,\n readString,\n readStringArray,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerConvertTools(): ToolSpec[] {\n return [\n {\n name: \"convert_get_quote\",\n module: \"convert\",\n description:\n \"Get supported convert currencies or quoted conversion price. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n fromCoin: { type: \"string\" },\n toCoin: { type: \"string\" },\n fromCoinAmount: { type: \"string\" },\n toCoinAmount: { type: \"string\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const fromCoin = readString(args, \"fromCoin\");\n const path = fromCoin\n ? \"/api/v2/convert/quoted-price\"\n : \"/api/v2/convert/currencies\";\n const fromCoinSize = readString(args, \"fromCoinAmount\");\n const toCoinSize = readString(args, \"toCoinAmount\");\n if (fromCoin && toCoinSize && fromCoinSize) {\n throw new ValidationError(\n 'Provide only one of \"fromCoinAmount\" or \"toCoinAmount\".',\n );\n }\n const response = await context.client.privateGet(\n path,\n compactObject({\n fromCoin,\n toCoin: readString(args, \"toCoin\"),\n fromCoinSize,\n toCoinSize,\n }),\n privateRateLimit(\"convert_get_quote\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"convert_execute\",\n module: \"convert\",\n description:\n \"Execute normal conversion or BGB small balance sweep. [CAUTION] Converts funds. Private endpoint. Rate limit: 5 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n type: { type: \"string\", enum: [\"normal\", \"bgb\"] },\n fromCoin: { type: \"string\" },\n toCoin: { type: \"string\" },\n fromCoinAmount: { type: \"string\" },\n toCoinAmount: { type: \"string\" },\n traceId: { type: \"string\" },\n coinList: { type: \"array\", items: { type: \"string\" } },\n },\n required: [\"fromCoin\", \"toCoin\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const type = readString(args, \"type\") ?? \"normal\";\n assertEnum(type, \"type\", [\"normal\", \"bgb\"]);\n const path =\n type === \"bgb\"\n ? \"/api/v2/convert/bgb-convert\"\n : \"/api/v2/convert/trade\";\n\n if (type === \"bgb\") {\n const response = await context.client.privatePost(\n path,\n compactObject({\n coinList: readStringArray(args, \"coinList\"),\n traceId: readString(args, \"traceId\") ?? `mcp-${Date.now()}`,\n }),\n privateRateLimit(\"convert_execute\", 5),\n );\n return normalize(response);\n }\n\n ensureOneOf(\n args,\n [\"fromCoinAmount\", \"toCoinAmount\"],\n 'Provide one of \"fromCoinAmount\" or \"toCoinAmount\" for normal conversion.',\n );\n const fromCoin = requireString(args, \"fromCoin\");\n const toCoin = requireString(args, \"toCoin\");\n const fromCoinSize = readString(args, \"fromCoinAmount\");\n const toCoinSize = readString(args, \"toCoinAmount\");\n if (fromCoinSize && toCoinSize) {\n throw new ValidationError(\n 'Provide only one of \"fromCoinAmount\" or \"toCoinAmount\".',\n );\n }\n\n const quoted = await context.client.privateGet<{\n fromCoin: string;\n fromCoinSize: string;\n toCoin: string;\n toCoinSize: string;\n cnvtPrice: string;\n traceId: string;\n }>(\n \"/api/v2/convert/quoted-price\",\n compactObject({ fromCoin, toCoin, fromCoinSize, toCoinSize }),\n privateRateLimit(\"convert_execute_quote\", 10),\n );\n const quoteData = quoted.data;\n const response = await context.client.privatePost(\n path,\n compactObject({\n fromCoin: quoteData.fromCoin,\n toCoin: quoteData.toCoin,\n fromCoinSize: quoteData.fromCoinSize,\n toCoinSize: quoteData.toCoinSize,\n cnvtPrice: quoteData.cnvtPrice,\n traceId: quoteData.traceId,\n }),\n privateRateLimit(\"convert_execute\", 5),\n );\n return normalize(response);\n },\n },\n {\n name: \"convert_get_history\",\n module: \"convert\",\n description:\n \"Get conversion or BGB sweep history. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n type: { type: \"string\", enum: [\"normal\", \"bgb\"] },\n startTime: { type: \"string\" },\n endTime: { type: \"string\" },\n limit: { type: \"number\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const type = readString(args, \"type\") ?? \"normal\";\n assertEnum(type, \"type\", [\"normal\", \"bgb\"]);\n const now = Date.now();\n const defaultStartTime = String(now - 7 * 24 * 60 * 60 * 1000);\n const defaultEndTime = String(now);\n const path =\n type === \"bgb\"\n ? \"/api/v2/convert/bgb-convert-records\"\n : \"/api/v2/convert/convert-record\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n startTime:\n type === \"normal\"\n ? (readString(args, \"startTime\") ?? defaultStartTime)\n : readString(args, \"startTime\"),\n endTime:\n type === \"normal\"\n ? (readString(args, \"endTime\") ?? defaultEndTime)\n : readString(args, \"endTime\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"convert_get_history\", 10),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit, PRODUCT_TYPES } from \"./common.js\";\nimport { BitgetApiError, ValidationError } from \"../utils/errors.js\";\n\nconst COPY_PRODUCT_TYPES = [...PRODUCT_TYPES, \"SPOT\"] as const;\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nfunction isSpot(productType: string): boolean {\n return productType === \"SPOT\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction extractTraderRows(data: unknown): Record<string, unknown>[] {\n if (Array.isArray(data)) {\n return data.filter(isRecord);\n }\n if (!isRecord(data)) {\n return [];\n }\n const keys = [\"list\", \"rows\", \"resultList\", \"traderList\", \"data\"];\n for (const key of keys) {\n const value = data[key];\n if (Array.isArray(value)) {\n return value.filter(isRecord);\n }\n if (isRecord(value)) {\n const nested = extractTraderRows(value);\n if (nested.length > 0) {\n return nested;\n }\n }\n }\n return [];\n}\n\nfunction toNumber(value: unknown): number {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return 0;\n}\n\nfunction traderScore(row: Record<string, unknown>): number {\n const keys = [\n \"followerNum\",\n \"followerCount\",\n \"copyCount\",\n \"winRate\",\n \"profitRate\",\n \"aum\",\n ];\n return keys.reduce((acc, key) => acc + toNumber(row[key]), 0);\n}\n\nfunction traderIdFromRow(\n row: Record<string, unknown>,\n productType: string,\n): string | undefined {\n const idKeys = isSpot(productType)\n ? [\"traderUserId\", \"traderId\", \"uid\", \"userId\"]\n : [\"traderId\", \"traderUserId\", \"uid\", \"userId\"];\n for (const key of idKeys) {\n const value = row[key];\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n if (typeof value === \"number\") {\n return String(value);\n }\n }\n return undefined;\n}\n\nfunction selectTrader(\n rows: Record<string, unknown>[],\n productType: string,\n selectionPolicy: string,\n): { traderId: string; row: Record<string, unknown> } | null {\n const candidates = rows\n .map((row) => ({\n traderId: traderIdFromRow(row, productType),\n row,\n score: traderScore(row),\n }))\n .filter(\n (\n item,\n ): item is {\n traderId: string;\n row: Record<string, unknown>;\n score: number;\n } => Boolean(item.traderId),\n );\n if (candidates.length === 0) {\n return null;\n }\n if (selectionPolicy === \"stable\") {\n candidates.sort((a, b) => b.score - a.score || a.traderId.localeCompare(b.traderId));\n }\n const best = candidates[0];\n if (!best) {\n return null;\n }\n return {\n traderId: best.traderId,\n row: best.row,\n };\n}\n\nexport function registerCopyTradingTools(): ToolSpec[] {\n return [\n {\n name: \"copy_get_traders\",\n module: \"copytrading\",\n description:\n \"Get copy-trading trader list and configuration candidates. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: {\n type: \"string\",\n enum: [...COPY_PRODUCT_TYPES],\n description: \"Copy trading market type.\",\n },\n symbol: { type: \"string\", description: \"Optional symbol filter for spot copy.\" },\n limit: { type: \"number\", description: \"Page size, default 20.\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = readString(args, \"productType\") ?? \"USDT-FUTURES\";\n assertEnum(productType, \"productType\", COPY_PRODUCT_TYPES);\n const symbol = readString(args, \"symbol\");\n const limit = readNumber(args, \"limit\");\n const path = isSpot(productType)\n ? \"/api/v2/copy/spot-follower/query-traders\"\n : \"/api/v2/copy/mix-follower/query-traders\";\n const query = isSpot(productType)\n ? compactObject({ symbol, limit })\n : compactObject({ productType, symbol, limit });\n const response = await context.client.privateGet(\n path,\n query,\n privateRateLimit(\"copy_get_traders\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"copy_place_order\",\n module: \"copytrading\",\n description:\n \"Create or update copy-trading follow settings. [CAUTION] Changes copy-trading behavior. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...COPY_PRODUCT_TYPES] },\n traderId: {\n type: \"string\",\n description:\n \"Required trader id. For spot copy this is traderUserId. For futures copy this is traderId.\",\n },\n symbol: { type: \"string\", description: \"Optional symbol for spot copy settings.\" },\n leverageType: {\n type: \"string\",\n enum: [\"position\", \"contract\"],\n description: \"Futures copy leverage type. Default position.\",\n },\n traceType: {\n type: \"string\",\n enum: [\"amount\", \"ratio\"],\n description: \"Futures copy size mode. Default amount.\",\n },\n marginType: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"Futures margin type. Default cross.\",\n },\n amount: {\n type: \"string\",\n description: \"Trace amount (for amount mode).\",\n },\n ratio: {\n type: \"string\",\n description: \"Trace ratio (for ratio mode).\",\n },\n autoSelectTrader: {\n type: \"boolean\",\n description:\n \"When true (or traderId omitted), auto-select trader from query-traders list.\",\n },\n selectionPolicy: {\n type: \"string\",\n enum: [\"recommended\", \"stable\"],\n description: \"Trader auto-selection policy. Default recommended.\",\n },\n dryRun: {\n type: \"boolean\",\n description:\n \"When true, resolve trader and return payload preview without sending write request.\",\n },\n },\n required: [\"productType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = readString(args, \"productType\") ?? \"USDT-FUTURES\";\n assertEnum(productType, \"productType\", COPY_PRODUCT_TYPES);\n const requestedTraderId = readString(args, \"traderId\");\n const autoSelectTrader =\n readBoolean(args, \"autoSelectTrader\") ?? !requestedTraderId;\n const selectionPolicy = readString(args, \"selectionPolicy\") ?? \"recommended\";\n assertEnum(selectionPolicy, \"selectionPolicy\", [\"recommended\", \"stable\"]);\n const dryRun = readBoolean(args, \"dryRun\") ?? false;\n\n let resolvedTraderId = requestedTraderId;\n let selectedTrader: Record<string, unknown> | null = null;\n let candidateCount = 0;\n\n if (!resolvedTraderId && autoSelectTrader) {\n const tradersPath = isSpot(productType)\n ? \"/api/v2/copy/spot-follower/query-traders\"\n : \"/api/v2/copy/mix-follower/query-traders\";\n const tradersResponse = await context.client.privateGet(\n tradersPath,\n isSpot(productType)\n ? compactObject({\n symbol: readString(args, \"symbol\"),\n limit: 20,\n })\n : compactObject({\n productType,\n symbol: readString(args, \"symbol\"),\n limit: 20,\n }),\n privateRateLimit(\"copy_place_order_select\", 10),\n );\n const rows = extractTraderRows(tradersResponse.data);\n candidateCount = rows.length;\n const picked = selectTrader(rows, productType, selectionPolicy);\n if (!picked) {\n throw new BitgetApiError(\n \"No available copy traders found for auto selection.\",\n {\n code: \"COPY_TRADER_NOT_FOUND\",\n suggestion:\n \"Call copy_get_traders and pass traderId explicitly, or switch productType.\",\n },\n );\n }\n resolvedTraderId = picked.traderId;\n selectedTrader = picked.row;\n }\n\n if (!resolvedTraderId) {\n throw new ValidationError(\n 'Missing \"traderId\". Provide traderId or set autoSelectTrader=true.',\n );\n }\n\n if (isSpot(productType)) {\n const payload = compactObject({\n traderUserId: resolvedTraderId,\n symbol: readString(args, \"symbol\"),\n });\n if (dryRun) {\n return {\n endpoint: \"DRY_RUN POST /api/v2/copy/spot-follower/settings\",\n requestTime: new Date().toISOString(),\n data: {\n dryRun: true,\n payload,\n requestedTraderId: requestedTraderId ?? null,\n resolvedTraderId,\n autoSelected: !requestedTraderId,\n selectionPolicy,\n candidateCount,\n selectedTrader,\n },\n };\n }\n const response = await context.client.privatePost(\n \"/api/v2/copy/spot-follower/settings\",\n payload,\n privateRateLimit(\"copy_place_order\", 10),\n );\n return {\n ...normalize(response),\n selection: {\n requestedTraderId: requestedTraderId ?? null,\n resolvedTraderId,\n autoSelected: !requestedTraderId,\n selectionPolicy,\n candidateCount,\n selectedTrader,\n },\n };\n }\n\n const symbol = readString(args, \"symbol\");\n if (!symbol) {\n throw new ValidationError(\n 'Parameter \"symbol\" is required for futures copy settings.',\n );\n }\n\n const payload = {\n traderId: resolvedTraderId,\n productType,\n settings: [\n compactObject({\n traderId: resolvedTraderId,\n symbol,\n leverType: readString(args, \"leverageType\") ?? \"position\",\n traceType: readString(args, \"traceType\") ?? \"amount\",\n marginType: readString(args, \"marginType\") ?? \"cross\",\n amount: readString(args, \"amount\") ?? \"10\",\n ratio: readString(args, \"ratio\"),\n }),\n ],\n };\n if (dryRun) {\n return {\n endpoint: \"DRY_RUN POST /api/v2/copy/mix-follower/settings\",\n requestTime: new Date().toISOString(),\n data: {\n dryRun: true,\n payload,\n requestedTraderId: requestedTraderId ?? null,\n resolvedTraderId,\n autoSelected: !requestedTraderId,\n selectionPolicy,\n candidateCount,\n selectedTrader,\n },\n };\n }\n\n const response = await context.client.privatePost(\n \"/api/v2/copy/mix-follower/settings\",\n payload,\n privateRateLimit(\"copy_place_order\", 10),\n );\n return {\n ...normalize(response),\n selection: {\n requestedTraderId: requestedTraderId ?? null,\n resolvedTraderId,\n autoSelected: !requestedTraderId,\n selectionPolicy,\n candidateCount,\n selectedTrader,\n },\n };\n },\n },\n {\n name: \"copy_close_position\",\n module: \"copytrading\",\n description:\n \"Close copy-trading follower position (futures). [CAUTION] Closes positions. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n symbol: { type: \"string\" },\n subPosId: {\n type: \"string\",\n description: \"Tracking number (maps to trackingNo).\",\n },\n marginCoin: { type: \"string\" },\n marginMode: { type: \"string\", enum: [\"cross\", \"isolated\"] },\n holdSide: { type: \"string\", enum: [\"long\", \"short\"] },\n },\n required: [\"productType\", \"symbol\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n const response = await context.client.privatePost(\n \"/api/v2/copy/mix-follower/close-positions\",\n compactObject({\n productType,\n symbol: requireString(args, \"symbol\"),\n trackingNo: readString(args, \"subPosId\"),\n marginCoin: readString(args, \"marginCoin\"),\n marginMode: readString(args, \"marginMode\"),\n holdSide: readString(args, \"holdSide\"),\n }),\n privateRateLimit(\"copy_close_position\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"copy_get_orders\",\n module: \"copytrading\",\n description:\n \"Query copy-trading historical orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...COPY_PRODUCT_TYPES] },\n symbol: { type: \"string\" },\n startTime: { type: \"string\" },\n endTime: { type: \"string\" },\n limit: { type: \"number\" },\n traderId: { type: \"string\", description: \"Optional trader id filter.\" },\n },\n required: [\"productType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n assertEnum(productType, \"productType\", COPY_PRODUCT_TYPES);\n const path = isSpot(productType)\n ? \"/api/v2/copy/spot-follower/query-history-orders\"\n : \"/api/v2/copy/mix-follower/query-history-orders\";\n const query = isSpot(productType)\n ? compactObject({\n symbol: readString(args, \"symbol\"),\n startTime: readString(args, \"startTime\"),\n endTime: readString(args, \"endTime\"),\n limit: readNumber(args, \"limit\"),\n })\n : compactObject({\n productType,\n symbol: readString(args, \"symbol\"),\n startTime: readString(args, \"startTime\"),\n endTime: readString(args, \"endTime\"),\n limit: readNumber(args, \"limit\"),\n traderId: readString(args, \"traderId\"),\n });\n const response = await context.client.privateGet(\n path,\n query,\n privateRateLimit(\"copy_get_orders\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"copy_get_positions\",\n module: \"copytrading\",\n description:\n \"Get current or historical copy-trading positions/orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...COPY_PRODUCT_TYPES] },\n symbol: { type: \"string\" },\n history: { type: \"boolean\" },\n startTime: { type: \"string\" },\n endTime: { type: \"string\" },\n limit: { type: \"number\" },\n traderId: { type: \"string\" },\n },\n required: [\"productType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n const history = readBoolean(args, \"history\") ?? false;\n assertEnum(productType, \"productType\", COPY_PRODUCT_TYPES);\n const path = isSpot(productType)\n ? history\n ? \"/api/v2/copy/spot-follower/query-history-orders\"\n : \"/api/v2/copy/spot-follower/query-current-orders\"\n : history\n ? \"/api/v2/copy/mix-follower/query-history-orders\"\n : \"/api/v2/copy/mix-follower/query-current-orders\";\n const query = isSpot(productType)\n ? compactObject({\n symbol: readString(args, \"symbol\"),\n startTime: readString(args, \"startTime\"),\n endTime: readString(args, \"endTime\"),\n limit: readNumber(args, \"limit\"),\n })\n : compactObject({\n productType,\n symbol: readString(args, \"symbol\"),\n startTime: readString(args, \"startTime\"),\n endTime: readString(args, \"endTime\"),\n limit: readNumber(args, \"limit\"),\n traderId: readString(args, \"traderId\"),\n });\n const response = await context.client.privateGet(\n path,\n query,\n privateRateLimit(\"copy_get_positions\", 10),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { GRANULARITIES, PRODUCT_TYPES, publicRateLimit } from \"./common.js\";\n\nconst FUTURES_GRANULARITY_MAP: Record<string, string> = {\n \"1min\": \"1m\",\n \"5min\": \"5m\",\n \"15min\": \"15m\",\n \"30min\": \"30m\",\n \"1h\": \"1H\",\n \"4h\": \"4H\",\n \"6h\": \"6H\",\n \"12h\": \"12H\",\n \"1day\": \"1D\",\n \"3day\": \"3D\",\n \"1week\": \"1W\",\n \"1M\": \"1M\",\n};\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerFuturesMarketTools(): ToolSpec[] {\n return [\n {\n name: \"futures_get_ticker\",\n module: \"futures\",\n description:\n \"Get futures ticker for one symbol or all symbols in product type. Public endpoint. Rate limit: 20 req/s per IP.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: {\n type: \"string\",\n enum: [...PRODUCT_TYPES],\n description: \"Futures product type.\",\n },\n symbol: { type: \"string\", description: \"Contract symbol, e.g. BTCUSDT.\" },\n },\n required: [\"productType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n const symbol = readString(args, \"symbol\");\n const path = symbol\n ? \"/api/v2/mix/market/ticker\"\n : \"/api/v2/mix/market/tickers\";\n const response = await context.client.publicGet(\n path,\n compactObject({ productType, symbol }),\n publicRateLimit(\"futures_get_ticker\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_depth\",\n module: \"futures\",\n description:\n \"Get futures orderbook depth with precision levels. Public endpoint. Rate limit: 20 req/s per IP.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n symbol: { type: \"string\", description: \"Contract symbol.\" },\n limit: { type: \"number\", description: \"Depth levels, default 100.\" },\n precision: { type: \"string\", description: \"Merge precision value.\" },\n },\n required: [\"productType\", \"symbol\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n const symbol = requireString(args, \"symbol\");\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n const response = await context.client.publicGet(\n \"/api/v2/mix/market/merge-depth\",\n compactObject({\n productType,\n symbol,\n limit: readNumber(args, \"limit\"),\n precision: readString(args, \"precision\"),\n }),\n publicRateLimit(\"futures_get_depth\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_candles\",\n module: \"futures\",\n description:\n \"Get futures candles from trade/index/mark price sources. Public endpoint. Rate limit: 20 req/s per IP.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n symbol: { type: \"string\" },\n granularity: { type: \"string\", enum: [...GRANULARITIES] },\n priceType: {\n type: \"string\",\n enum: [\"trade\", \"index\", \"mark\"],\n description: \"trade(default), index, or mark.\",\n },\n startTime: { type: \"string\" },\n endTime: { type: \"string\" },\n limit: { type: \"number\" },\n },\n required: [\"productType\", \"symbol\", \"granularity\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n const symbol = requireString(args, \"symbol\");\n const granularity = requireString(args, \"granularity\");\n const priceType = readString(args, \"priceType\") ?? \"trade\";\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n assertEnum(granularity, \"granularity\", GRANULARITIES);\n assertEnum(priceType, \"priceType\", [\"trade\", \"index\", \"mark\"]);\n const apiGranularity = FUTURES_GRANULARITY_MAP[granularity] ?? granularity;\n const startTime = readString(args, \"startTime\");\n const endTime = readString(args, \"endTime\");\n const limit = readNumber(args, \"limit\");\n const path =\n priceType === \"index\"\n ? \"/api/v2/mix/market/history-index-candles\"\n : priceType === \"mark\"\n ? \"/api/v2/mix/market/history-mark-candles\"\n : startTime\n ? \"/api/v2/mix/market/history-candles\"\n : \"/api/v2/mix/market/candles\";\n const response = await context.client.publicGet(\n path,\n compactObject({\n productType,\n symbol,\n granularity: apiGranularity,\n startTime,\n endTime,\n limit,\n }),\n publicRateLimit(\"futures_get_candles\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_trades\",\n module: \"futures\",\n description:\n \"Get recent or historical futures trade records. Public endpoint. Rate limit: 10 req/s per IP.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n symbol: { type: \"string\" },\n limit: { type: \"number\" },\n startTime: { type: \"string\" },\n endTime: { type: \"string\" },\n },\n required: [\"productType\", \"symbol\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n const symbol = requireString(args, \"symbol\");\n const startTime = readString(args, \"startTime\");\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n const path = startTime\n ? \"/api/v2/mix/market/fills-history\"\n : \"/api/v2/mix/market/fills\";\n const response = await context.client.publicGet(\n path,\n compactObject({\n productType,\n symbol,\n limit: readNumber(args, \"limit\"),\n startTime,\n endTime: readString(args, \"endTime\"),\n }),\n publicRateLimit(\"futures_get_trades\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_contracts\",\n module: \"futures\",\n description:\n \"Get futures contract configuration details. Public endpoint. Rate limit: 20 req/s per IP.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n symbol: { type: \"string\", description: \"Optional symbol filter.\" },\n },\n required: [\"productType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n const response = await context.client.publicGet(\n \"/api/v2/mix/market/contracts\",\n compactObject({\n productType,\n symbol: readString(args, \"symbol\"),\n }),\n publicRateLimit(\"futures_get_contracts\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_funding_rate\",\n module: \"futures\",\n description:\n \"Get current or historical funding rates for a futures symbol. Public endpoint. Rate limit: 20 req/s per IP.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n symbol: { type: \"string\" },\n history: { type: \"boolean\", description: \"true for historical funding rates.\" },\n pageSize: { type: \"number\", description: \"Page size for history mode.\" },\n pageNo: { type: \"number\", description: \"Page number for history mode.\" },\n },\n required: [\"productType\", \"symbol\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n const symbol = requireString(args, \"symbol\");\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n const history = readBoolean(args, \"history\") ?? false;\n if (history) {\n const historyResponse = await context.client.publicGet(\n \"/api/v2/mix/market/history-fund-rate\",\n compactObject({\n productType,\n symbol,\n pageSize: readNumber(args, \"pageSize\"),\n pageNo: readNumber(args, \"pageNo\"),\n }),\n publicRateLimit(\"futures_get_funding_rate\", 20),\n );\n return normalize(historyResponse);\n }\n\n const [currentRate, fundingTime] = await Promise.all([\n context.client.publicGet(\n \"/api/v2/mix/market/current-fund-rate\",\n compactObject({ productType, symbol }),\n publicRateLimit(\"futures_get_funding_rate_current\", 20),\n ),\n context.client.publicGet(\n \"/api/v2/mix/market/funding-time\",\n compactObject({ productType, symbol }),\n publicRateLimit(\"futures_get_funding_rate_time\", 20),\n ),\n ]);\n\n return {\n endpoint: `${currentRate.endpoint} + ${fundingTime.endpoint}`,\n requestTime: new Date().toISOString(),\n data: {\n currentFundRate: currentRate.data,\n fundingTime: fundingTime.data,\n },\n };\n },\n },\n {\n name: \"futures_get_open_interest\",\n module: \"futures\",\n description:\n \"Get open interest for a futures contract. Public endpoint. Rate limit: 20 req/s per IP.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n symbol: { type: \"string\" },\n },\n required: [\"productType\", \"symbol\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n const symbol = requireString(args, \"symbol\");\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n const response = await context.client.publicGet(\n \"/api/v2/mix/market/open-interest\",\n compactObject({ productType, symbol }),\n publicRateLimit(\"futures_get_open_interest\", 20),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n ensureOneOf,\n readBoolean,\n readNumber,\n readObjectArray,\n readString,\n readStringArray,\n requireObjectArray,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit, PRODUCT_TYPES } from \"./common.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerFuturesTradeTools(): ToolSpec[] {\n return [\n {\n name: \"futures_place_order\",\n module: \"futures\",\n description:\n \"Place one or more futures orders with optional TP/SL. [CAUTION] Executes real trades. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array of futures order objects.\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = requireObjectArray(args, \"orders\");\n if (orders.length > 50) {\n throw new ValidationError(\"orders supports at most 50 items.\");\n }\n const normalizedOrders = orders.map((order) => {\n const orderType = readString(order, \"orderType\");\n return compactObject({\n ...order,\n marginMode: readString(order, \"marginMode\") ?? \"crossed\",\n force:\n readString(order, \"force\") ??\n (orderType === \"limit\" ? \"gtc\" : undefined),\n });\n });\n const isSingle = orders.length === 1;\n const path = isSingle\n ? \"/api/v2/mix/order/place-order\"\n : \"/api/v2/mix/order/batch-place-order\";\n const first = normalizedOrders.at(0);\n if (!first) {\n throw new ValidationError(\"orders cannot be empty.\");\n }\n let body: Record<string, unknown>;\n if (isSingle) {\n body = first;\n } else {\n const shared = {\n symbol: readString(first, \"symbol\"),\n productType: readString(first, \"productType\"),\n marginCoin: readString(first, \"marginCoin\"),\n marginMode: readString(first, \"marginMode\") ?? \"crossed\",\n };\n const isSameKey = normalizedOrders.every(\n (order) =>\n readString(order, \"symbol\") === shared.symbol &&\n readString(order, \"productType\") === shared.productType &&\n readString(order, \"marginCoin\") === shared.marginCoin &&\n (readString(order, \"marginMode\") ?? \"crossed\") ===\n shared.marginMode,\n );\n if (!isSameKey) {\n throw new ValidationError(\n \"Batch futures orders must share symbol, productType, marginCoin, and marginMode.\",\n );\n }\n body = {\n symbol: shared.symbol,\n productType: shared.productType,\n marginCoin: shared.marginCoin,\n marginMode: shared.marginMode,\n orderList: normalizedOrders.map((order) => {\n const { symbol, productType, marginCoin, marginMode, ...rest } = order;\n void symbol;\n void productType;\n void marginCoin;\n void marginMode;\n return rest;\n }),\n };\n }\n const response = await context.client.privatePost(\n path,\n body,\n privateRateLimit(\"futures_place_order\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_cancel_orders\",\n module: \"futures\",\n description:\n \"Cancel futures orders by order id, batch ids, or cancel-all mode. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n symbol: { type: \"string\" },\n orderId: { type: \"string\" },\n orderIds: { type: \"array\", items: { type: \"string\" } },\n cancelAll: { type: \"boolean\" },\n marginCoin: { type: \"string\" },\n },\n required: [\"productType\", \"symbol\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n const symbol = requireString(args, \"symbol\");\n const orderId = readString(args, \"orderId\");\n const orderIds = readStringArray(args, \"orderIds\");\n const cancelAll = readBoolean(args, \"cancelAll\");\n const marginCoin = readString(args, \"marginCoin\");\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n ensureOneOf(\n args,\n [\"orderId\", \"orderIds\", \"cancelAll\"],\n 'Provide one of \"orderId\", \"orderIds\", or \"cancelAll=true\".',\n );\n if (orderIds && orderIds.length > 50) {\n throw new ValidationError(\"orderIds supports at most 50 items.\");\n }\n const { path, body } = orderId\n ? {\n path: \"/api/v2/mix/order/cancel-order\",\n body: { productType, symbol, orderId },\n }\n : orderIds\n ? {\n path: \"/api/v2/mix/order/batch-cancel-orders\",\n body: { productType, symbol, orderIds },\n }\n : {\n path: \"/api/v2/mix/order/cancel-all-orders\",\n body: compactObject({ productType, symbol, marginCoin }),\n };\n const response = await context.client.privatePost(\n path,\n body,\n privateRateLimit(\"futures_cancel_orders\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_orders\",\n module: \"futures\",\n description:\n \"Query futures orders by id, open status, or history. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n orderId: { type: \"string\" },\n symbol: { type: \"string\" },\n status: { type: \"string\", enum: [\"open\", \"history\"] },\n startTime: { type: \"string\" },\n endTime: { type: \"string\" },\n limit: { type: \"number\" },\n },\n required: [\"productType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n const orderId = readString(args, \"orderId\");\n const symbol = readString(args, \"symbol\");\n const status = readString(args, \"status\") ?? \"open\";\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n const path = orderId\n ? \"/api/v2/mix/order/detail\"\n : status === \"history\"\n ? \"/api/v2/mix/order/orders-history\"\n : \"/api/v2/mix/order/orders-pending\";\n const query = compactObject({\n productType,\n orderId,\n symbol,\n startTime: readString(args, \"startTime\"),\n endTime: readString(args, \"endTime\"),\n limit: readNumber(args, \"limit\"),\n });\n const response = await context.client.privateGet(\n path,\n query,\n privateRateLimit(\"futures_get_orders\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_fills\",\n module: \"futures\",\n description:\n \"Get futures fills and fill history records. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n symbol: { type: \"string\" },\n orderId: { type: \"string\" },\n startTime: { type: \"string\" },\n endTime: { type: \"string\" },\n limit: { type: \"number\" },\n },\n required: [\"productType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n const startTime = readString(args, \"startTime\");\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n const path = startTime\n ? \"/api/v2/mix/order/fill-history\"\n : \"/api/v2/mix/order/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n productType,\n symbol: readString(args, \"symbol\"),\n orderId: readString(args, \"orderId\"),\n startTime,\n endTime: readString(args, \"endTime\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"futures_get_fills\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_positions\",\n module: \"futures\",\n description:\n \"Get current or historical futures positions. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n symbol: { type: \"string\" },\n marginCoin: { type: \"string\" },\n history: { type: \"boolean\" },\n },\n required: [\"productType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n const symbol = readString(args, \"symbol\");\n const history = readBoolean(args, \"history\") ?? false;\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n const path = history\n ? \"/api/v2/mix/position/history-position\"\n : symbol\n ? \"/api/v2/mix/position/single-position\"\n : \"/api/v2/mix/position/all-position\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n productType,\n symbol,\n marginCoin:\n readString(args, \"marginCoin\") ?? (symbol ? \"USDT\" : undefined),\n }),\n privateRateLimit(\"futures_get_positions\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_set_leverage\",\n module: \"futures\",\n description:\n \"Set futures leverage for symbol and margin coin. [CAUTION] Affects risk exposure. Private endpoint. Rate limit: 5 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n symbol: { type: \"string\" },\n marginCoin: { type: \"string\" },\n leverage: { type: \"string\" },\n holdSide: { type: \"string\", enum: [\"long\", \"short\"] },\n },\n required: [\"productType\", \"symbol\", \"marginCoin\", \"leverage\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n const response = await context.client.privatePost(\n \"/api/v2/mix/account/set-leverage\",\n compactObject({\n productType,\n symbol: requireString(args, \"symbol\"),\n marginCoin: requireString(args, \"marginCoin\"),\n leverage: requireString(args, \"leverage\"),\n holdSide: readString(args, \"holdSide\"),\n }),\n privateRateLimit(\"futures_set_leverage\", 5),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_update_config\",\n module: \"futures\",\n description:\n \"Update futures margin mode, position mode, or auto-margin setting. [CAUTION] Affects trading behavior. Private endpoint. Rate limit: 5 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n symbol: { type: \"string\" },\n marginCoin: { type: \"string\" },\n setting: {\n type: \"string\",\n enum: [\"marginMode\", \"positionMode\", \"autoMargin\"],\n },\n value: { type: \"string\" },\n holdSide: { type: \"string\", enum: [\"long\", \"short\"] },\n },\n required: [\"productType\", \"symbol\", \"marginCoin\", \"setting\", \"value\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const productType = requireString(args, \"productType\");\n const setting = requireString(args, \"setting\");\n assertEnum(productType, \"productType\", PRODUCT_TYPES);\n assertEnum(setting, \"setting\", [\"marginMode\", \"positionMode\", \"autoMargin\"]);\n const endpoint =\n setting === \"marginMode\"\n ? \"/api/v2/mix/account/set-margin-mode\"\n : setting === \"positionMode\"\n ? \"/api/v2/mix/account/set-position-mode\"\n : \"/api/v2/mix/account/set-auto-margin\";\n const response = await context.client.privatePost(\n endpoint,\n setting === \"marginMode\"\n ? compactObject({\n productType,\n symbol: requireString(args, \"symbol\"),\n marginCoin: requireString(args, \"marginCoin\"),\n marginMode: requireString(args, \"value\"),\n })\n : setting === \"positionMode\"\n ? compactObject({\n productType,\n symbol: requireString(args, \"symbol\"),\n marginCoin: requireString(args, \"marginCoin\"),\n posMode: requireString(args, \"value\"),\n })\n : compactObject({\n productType,\n symbol: requireString(args, \"symbol\"),\n marginCoin: requireString(args, \"marginCoin\"),\n autoMargin: requireString(args, \"value\"),\n holdSide: readString(args, \"holdSide\"),\n }),\n privateRateLimit(\"futures_update_config\", 5),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n ensureOneOf,\n readBoolean,\n readNumber,\n readString,\n readStringArray,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nconst MARGIN_TYPES = [\"crossed\", \"isolated\"] as const;\n\nfunction marginPath(marginType: string, suffix: string): string {\n const scope = marginType === \"crossed\" ? \"crossed\" : \"isolated\";\n return `/api/v2/margin/${scope}/${suffix}`;\n}\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerMarginTools(): ToolSpec[] {\n return [\n {\n name: \"margin_get_assets\",\n module: \"margin\",\n description:\n \"Get crossed or isolated margin assets and risk metrics. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n symbol: { type: \"string\" },\n coin: { type: \"string\" },\n },\n required: [\"marginType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const marginType = requireString(args, \"marginType\");\n assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n const response = await context.client.privateGet(\n marginPath(marginType, \"account/assets\"),\n compactObject({\n symbol: readString(args, \"symbol\"),\n coin: readString(args, \"coin\"),\n }),\n privateRateLimit(\"margin_get_assets\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"margin_borrow\",\n module: \"margin\",\n description:\n \"Borrow margin funds. [CAUTION] Creates debt. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n coin: { type: \"string\" },\n amount: { type: \"string\" },\n symbol: { type: \"string\" },\n },\n required: [\"marginType\", \"coin\", \"amount\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const marginType = requireString(args, \"marginType\");\n assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n const response = await context.client.privatePost(\n marginPath(marginType, \"account/borrow\"),\n compactObject({\n coin: requireString(args, \"coin\"),\n borrowAmount: requireString(args, \"amount\"),\n symbol: readString(args, \"symbol\"),\n }),\n privateRateLimit(\"margin_borrow\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"margin_repay\",\n module: \"margin\",\n description:\n \"Repay margin debt with optional flash repay. [CAUTION] Uses account funds. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n coin: { type: \"string\" },\n amount: { type: \"string\" },\n symbol: { type: \"string\" },\n flashRepay: { type: \"boolean\" },\n },\n required: [\"marginType\", \"coin\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const marginType = requireString(args, \"marginType\");\n const flashRepay = readBoolean(args, \"flashRepay\") ?? false;\n assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n const path = flashRepay\n ? marginPath(marginType, \"account/flash-repay\")\n : marginPath(marginType, \"account/repay\");\n const response = await context.client.privatePost(\n path,\n compactObject({\n coin: requireString(args, \"coin\"),\n repayAmount: readString(args, \"amount\"),\n symbol: readString(args, \"symbol\"),\n }),\n privateRateLimit(\"margin_repay\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"margin_place_order\",\n module: \"margin\",\n description:\n \"Place margin order in crossed or isolated mode. [CAUTION] Executes real trade. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n symbol: { type: \"string\" },\n side: { type: \"string\", enum: [\"buy\", \"sell\"] },\n orderType: { type: \"string\", enum: [\"limit\", \"market\"] },\n price: { type: \"string\" },\n size: { type: \"string\" },\n loanType: {\n type: \"string\",\n enum: [\"normal\", \"autoLoan\", \"autoRepay\", \"autoLoanAndRepay\"],\n },\n },\n required: [\"marginType\", \"symbol\", \"side\", \"orderType\", \"size\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const marginType = requireString(args, \"marginType\");\n assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n const response = await context.client.privatePost(\n marginPath(marginType, \"place-order\"),\n compactObject({\n symbol: requireString(args, \"symbol\"),\n side: requireString(args, \"side\"),\n orderType: requireString(args, \"orderType\"),\n price: readString(args, \"price\"),\n baseSize: requireString(args, \"size\"),\n loanType: readString(args, \"loanType\") ?? \"normal\",\n force: \"gtc\",\n }),\n privateRateLimit(\"margin_place_order\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"margin_cancel_orders\",\n module: \"margin\",\n description:\n \"Cancel one or more margin orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n symbol: { type: \"string\" },\n orderId: { type: \"string\" },\n orderIds: { type: \"array\", items: { type: \"string\" } },\n },\n required: [\"marginType\", \"symbol\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const marginType = requireString(args, \"marginType\");\n const symbol = requireString(args, \"symbol\");\n assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n ensureOneOf(\n args,\n [\"orderId\", \"orderIds\"],\n 'Provide one of \"orderId\" or \"orderIds\".',\n );\n const orderId = readString(args, \"orderId\");\n const orderIds = readStringArray(args, \"orderIds\");\n if (orderIds && orderIds.length > 50) {\n throw new ValidationError(\"orderIds supports at most 50 items.\");\n }\n const path = orderId\n ? marginPath(marginType, \"cancel-order\")\n : marginPath(marginType, \"batch-cancel-order\");\n const response = await context.client.privatePost(\n path,\n orderId\n ? compactObject({ symbol, orderId })\n : {\n symbol,\n orderIdList: (orderIds ?? []).map((id) => ({ orderId: id })),\n },\n privateRateLimit(\"margin_cancel_orders\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"margin_get_orders\",\n module: \"margin\",\n description:\n \"Query margin orders (open/history/order detail). Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n symbol: { type: \"string\" },\n orderId: { type: \"string\" },\n status: { type: \"string\", enum: [\"open\", \"history\"] },\n startTime: { type: \"string\" },\n endTime: { type: \"string\" },\n limit: { type: \"number\" },\n },\n required: [\"marginType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const marginType = requireString(args, \"marginType\");\n assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n const orderId = readString(args, \"orderId\");\n const status = readString(args, \"status\") ?? \"open\";\n const path =\n status === \"history\" || orderId\n ? marginPath(marginType, \"history-orders\")\n : marginPath(marginType, \"open-orders\");\n const response = await context.client.privateGet(\n path,\n compactObject({\n symbol: readString(args, \"symbol\"),\n orderId,\n startTime: readString(args, \"startTime\"),\n endTime: readString(args, \"endTime\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"margin_get_orders\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"margin_get_records\",\n module: \"margin\",\n description:\n \"Get borrow/repay/interest/liquidation records for margin accounts. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n recordType: {\n type: \"string\",\n enum: [\"borrow\", \"repay\", \"interest\", \"liquidation\"],\n },\n coin: { type: \"string\" },\n symbol: { type: \"string\" },\n startTime: { type: \"string\" },\n endTime: { type: \"string\" },\n limit: { type: \"number\" },\n },\n required: [\"marginType\", \"recordType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const marginType = requireString(args, \"marginType\");\n const recordType = requireString(args, \"recordType\");\n assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n assertEnum(recordType, \"recordType\", [\n \"borrow\",\n \"repay\",\n \"interest\",\n \"liquidation\",\n ]);\n const apiMarginType =\n recordType === \"borrow\"\n ? \"borrow\"\n : recordType === \"repay\"\n ? \"repay\"\n : recordType === \"interest\"\n ? \"interest\"\n : \"liquidation_fee\";\n const now = Date.now();\n const defaultStartTime = String(now - 30 * 24 * 60 * 60 * 1000);\n const response = await context.client.privateGet(\n marginPath(marginType, \"financial-records\"),\n compactObject({\n marginType: apiMarginType,\n coin: readString(args, \"coin\"),\n startTime: readString(args, \"startTime\") ?? defaultStartTime,\n endTime: readString(args, \"endTime\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"margin_get_records\", 10),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerP2pTools(): ToolSpec[] {\n return [\n {\n name: \"p2p_get_merchants\",\n module: \"p2p\",\n description:\n \"Get P2P merchant list or specific merchant details. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n merchantId: { type: \"string\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const merchantId = readString(args, \"merchantId\");\n const path = merchantId\n ? \"/api/v2/p2p/merchantInfo\"\n : \"/api/v2/p2p/merchantList\";\n const response = await context.client.privateGet(\n path,\n compactObject({ merchantId }),\n privateRateLimit(\"p2p_get_merchants\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"p2p_get_orders\",\n module: \"p2p\",\n description:\n \"Get P2P order list or advertisement list. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n type: {\n type: \"string\",\n enum: [\"orders\", \"advertisements\"],\n description: \"orders(default) or advertisements.\",\n },\n status: { type: \"string\" },\n startTime: { type: \"string\" },\n endTime: { type: \"string\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const type = readString(args, \"type\") ?? \"orders\";\n assertEnum(type, \"type\", [\"orders\", \"advertisements\"]);\n const path =\n type === \"advertisements\"\n ? \"/api/v2/p2p/advList\"\n : \"/api/v2/p2p/orderList\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n status: readString(args, \"status\"),\n startTime: readString(args, \"startTime\"),\n endTime: readString(args, \"endTime\"),\n }),\n privateRateLimit(\"p2p_get_orders\", 10),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n assertEnum,\n compactObject,\n readNumber,\n readString,\n asRecord,\n} from \"./helpers.js\";\nimport { GRANULARITIES, publicRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerSpotMarketTools(): ToolSpec[] {\n return [\n {\n name: \"spot_get_ticker\",\n module: \"spot\",\n description:\n \"Get real-time ticker data for spot trading pair(s). Public endpoint. Rate limit: 20 req/s per IP.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: {\n type: \"string\",\n description: \"Trading pair symbol, e.g. BTCUSDT. Omit for all tickers.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const symbol = readString(args, \"symbol\");\n const response = await context.client.publicGet(\n \"/api/v2/spot/market/tickers\",\n compactObject({ symbol }),\n publicRateLimit(\"spot_get_ticker\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_get_depth\",\n module: \"spot\",\n description:\n \"Get orderbook depth for a spot trading pair. Public endpoint. Rate limit: 20 req/s per IP.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Trading pair symbol, e.g. BTCUSDT\" },\n type: {\n type: \"string\",\n enum: [\"step0\", \"step1\", \"step2\", \"step3\", \"step4\", \"step5\"],\n description: \"Depth merge level. step0 means raw orderbook.\",\n },\n limit: {\n type: \"number\",\n description: \"Depth levels, default 150, max 150.\",\n },\n },\n required: [\"symbol\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const symbol = readString(args, \"symbol\");\n const type = readString(args, \"type\") ?? \"step0\";\n const limit = readNumber(args, \"limit\");\n assertEnum(type, \"type\", [\"step0\", \"step1\", \"step2\", \"step3\", \"step4\", \"step5\"]);\n const path =\n type === \"step0\"\n ? \"/api/v2/spot/market/orderbook\"\n : \"/api/v2/spot/market/merge-depth\";\n const response = await context.client.publicGet(\n path,\n compactObject({ symbol, type, limit }),\n publicRateLimit(\"spot_get_depth\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_get_candles\",\n module: \"spot\",\n description:\n \"Get K-line data for spot trading pair. Public endpoint. Rate limit: 20 req/s per IP.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Trading pair symbol, e.g. BTCUSDT\" },\n granularity: {\n type: \"string\",\n enum: [...GRANULARITIES],\n description: \"Candlestick period.\",\n },\n startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n limit: { type: \"number\", description: \"Result size, default 100, max 1000.\" },\n },\n required: [\"symbol\", \"granularity\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const symbol = readString(args, \"symbol\");\n const granularity = readString(args, \"granularity\");\n assertEnum(granularity, \"granularity\", GRANULARITIES);\n const startTime = readString(args, \"startTime\");\n const endTime = readString(args, \"endTime\");\n const limit = readNumber(args, \"limit\");\n const path = startTime\n ? \"/api/v2/spot/market/history-candles\"\n : \"/api/v2/spot/market/candles\";\n const response = await context.client.publicGet(\n path,\n compactObject({ symbol, granularity, startTime, endTime, limit }),\n publicRateLimit(\"spot_get_candles\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_get_trades\",\n module: \"spot\",\n description:\n \"Get recent or historical trade records for spot symbol. Public endpoint. Rate limit: 10 req/s per IP.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n limit: { type: \"number\", description: \"Result size, default 100, max 500.\" },\n startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n },\n required: [\"symbol\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const symbol = readString(args, \"symbol\");\n const limit = readNumber(args, \"limit\");\n const startTime = readString(args, \"startTime\");\n const endTime = readString(args, \"endTime\");\n const path = startTime\n ? \"/api/v2/spot/market/fills-history\"\n : \"/api/v2/spot/market/fills\";\n const response = await context.client.publicGet(\n path,\n compactObject({ symbol, limit, startTime, endTime }),\n publicRateLimit(\"spot_get_trades\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_get_symbols\",\n module: \"spot\",\n description:\n \"Get spot symbol info or coin chain info. Public endpoint. Rate limit: 20 req/s per IP.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n type: {\n type: \"string\",\n enum: [\"symbols\", \"coins\"],\n description: \"symbols(default) or coins.\",\n },\n symbol: { type: \"string\", description: \"Specific symbol filter.\" },\n coin: { type: \"string\", description: \"Specific coin filter.\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const type = readString(args, \"type\") ?? \"symbols\";\n assertEnum(type, \"type\", [\"symbols\", \"coins\"]);\n const symbol = readString(args, \"symbol\");\n const coin = readString(args, \"coin\");\n const path =\n type === \"coins\"\n ? \"/api/v2/spot/public/coins\"\n : \"/api/v2/spot/public/symbols\";\n const response = await context.client.publicGet(\n path,\n compactObject({ symbol, coin }),\n publicRateLimit(\"spot_get_symbols\", 20),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n ensureOneOf,\n readBoolean,\n readNumber,\n readObjectArray,\n readString,\n readStringArray,\n requireObjectArray,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerSpotTradeTools(): ToolSpec[] {\n return [\n {\n name: \"spot_place_order\",\n module: \"spot\",\n description:\n \"Place one or more spot orders. [CAUTION] Executes real trades. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description:\n \"Array of order objects. Single order should still be passed as an array with one item.\",\n items: {\n type: \"object\",\n },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = requireObjectArray(args, \"orders\");\n if (orders.length > 50) {\n throw new ValidationError(\"orders supports at most 50 items.\");\n }\n const normalizedOrders = orders.map((order) => {\n const orderType = readString(order, \"orderType\");\n return compactObject({\n ...order,\n force:\n readString(order, \"force\") ??\n (orderType === \"limit\" ? \"gtc\" : undefined),\n });\n });\n const isSingle = orders.length === 1;\n const path = isSingle\n ? \"/api/v2/spot/trade/place-order\"\n : \"/api/v2/spot/trade/batch-orders\";\n const body = isSingle ? normalizedOrders[0] : { orderList: normalizedOrders };\n const response = await context.client.privatePost(\n path,\n body,\n privateRateLimit(\"spot_place_order\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_cancel_orders\",\n module: \"spot\",\n description:\n \"Cancel one or more spot orders by id, batch ids, or symbol-wide cancel. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n orderId: { type: \"string\", description: \"Single order id.\" },\n orderIds: {\n type: \"array\",\n description: \"Multiple order ids. Max 50.\",\n items: { type: \"string\" },\n },\n cancelAll: {\n type: \"boolean\",\n description: \"If true, cancel all open orders for symbol.\",\n },\n },\n required: [\"symbol\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const symbol = requireString(args, \"symbol\");\n const orderId = readString(args, \"orderId\");\n const orderIds = readStringArray(args, \"orderIds\");\n const cancelAll = readBoolean(args, \"cancelAll\");\n ensureOneOf(\n args,\n [\"orderId\", \"orderIds\", \"cancelAll\"],\n 'Provide one of \"orderId\", \"orderIds\", or \"cancelAll=true\".',\n );\n if (orderIds && orderIds.length > 50) {\n throw new ValidationError(\"orderIds supports at most 50 items.\");\n }\n const { path, body } = orderId\n ? {\n path: \"/api/v2/spot/trade/cancel-order\",\n body: { symbol, orderId },\n }\n : orderIds\n ? {\n path: \"/api/v2/spot/trade/batch-cancel-order\",\n body: { symbol, orderIds },\n }\n : cancelAll\n ? {\n path: \"/api/v2/spot/trade/cancel-symbol-order\",\n body: { symbol },\n }\n : {\n path: \"/api/v2/spot/trade/cancel-order\",\n body: { symbol },\n };\n const response = await context.client.privatePost(\n path,\n body,\n privateRateLimit(\"spot_cancel_orders\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_modify_order\",\n module: \"spot\",\n description:\n \"Cancel and replace a spot order atomically. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n orderId: { type: \"string\", description: \"Original order id.\" },\n newPrice: { type: \"string\", description: \"New price for limit order.\" },\n newSize: { type: \"string\", description: \"New order size.\" },\n newClientOid: { type: \"string\", description: \"New client order id.\" },\n },\n required: [\"symbol\", \"orderId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const newPrice = readString(args, \"newPrice\");\n const newSize = readString(args, \"newSize\");\n const newClientOid = readString(args, \"newClientOid\");\n if (!newPrice && !newSize && !newClientOid) {\n throw new ValidationError(\n 'Provide at least one of \"newPrice\", \"newSize\", or \"newClientOid\".',\n );\n }\n const response = await context.client.privatePost(\n \"/api/v2/spot/trade/cancel-replace-order\",\n compactObject({\n symbol: requireString(args, \"symbol\"),\n orderId: requireString(args, \"orderId\"),\n price: newPrice,\n size: newSize,\n clientOid: newClientOid,\n force: \"gtc\",\n }),\n privateRateLimit(\"spot_modify_order\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_get_orders\",\n module: \"spot\",\n description:\n \"Query spot order detail, open orders, or history orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n orderId: { type: \"string\", description: \"Specific order id.\" },\n symbol: { type: \"string\", description: \"Trading pair filter.\" },\n status: {\n type: \"string\",\n enum: [\"open\", \"history\"],\n description: \"open(default) or history.\",\n },\n startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n limit: { type: \"number\", description: \"Result size, default 100.\" },\n idLessThan: { type: \"string\", description: \"Pagination cursor.\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orderId = readString(args, \"orderId\");\n const symbol = readString(args, \"symbol\");\n const status = readString(args, \"status\") ?? \"open\";\n const startTime = readString(args, \"startTime\");\n const endTime = readString(args, \"endTime\");\n const limit = readNumber(args, \"limit\");\n const idLessThan = readString(args, \"idLessThan\");\n const route = orderId\n ? \"/api/v2/spot/trade/orderInfo\"\n : status === \"history\"\n ? \"/api/v2/spot/trade/history-orders\"\n : \"/api/v2/spot/trade/unfilled-orders\";\n const query = compactObject({\n orderId,\n symbol,\n startTime,\n endTime,\n limit,\n idLessThan,\n });\n const response = await context.client.privateGet(\n route,\n query,\n privateRateLimit(\"spot_get_orders\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_get_fills\",\n module: \"spot\",\n description:\n \"Get spot fills for order execution details. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n orderId: { type: \"string\", description: \"Specific order id.\" },\n startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n limit: { type: \"number\", description: \"Result size, default 100.\" },\n },\n required: [\"symbol\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v2/spot/trade/fills\",\n compactObject({\n symbol: requireString(args, \"symbol\"),\n orderId: readString(args, \"orderId\"),\n startTime: readString(args, \"startTime\"),\n endTime: readString(args, \"endTime\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"spot_get_fills\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_place_plan_order\",\n module: \"spot\",\n description:\n \"Create or modify spot plan order (trigger order). Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orderId: { type: \"string\", description: \"When provided, modify existing plan order.\" },\n symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n side: { type: \"string\", enum: [\"buy\", \"sell\"], description: \"Order side.\" },\n triggerPrice: { type: \"string\", description: \"Trigger price.\" },\n triggerType: {\n type: \"string\",\n enum: [\"mark_price\", \"fill_price\", \"last_price\"],\n description: \"Trigger source.\",\n },\n orderType: {\n type: \"string\",\n enum: [\"limit\", \"market\"],\n description: \"Execution order type.\",\n },\n price: { type: \"string\", description: \"Execution price for limit orders.\" },\n size: { type: \"string\", description: \"Order quantity.\" },\n },\n required: [\"triggerPrice\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orderId = readString(args, \"orderId\");\n const path = orderId\n ? \"/api/v2/spot/trade/modify-plan-order\"\n : \"/api/v2/spot/trade/place-plan-order\";\n const response = await context.client.privatePost(\n path,\n compactObject({\n orderId,\n symbol: readString(args, \"symbol\"),\n side: readString(args, \"side\"),\n triggerPrice: requireString(args, \"triggerPrice\"),\n triggerType:\n readString(args, \"triggerType\") === \"last_price\"\n ? \"fill_price\"\n : (readString(args, \"triggerType\") ?? \"fill_price\"),\n orderType: readString(args, \"orderType\"),\n executePrice: readString(args, \"price\"),\n planType: \"amount\",\n size: readString(args, \"size\"),\n }),\n privateRateLimit(\"spot_place_plan_order\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_get_plan_orders\",\n module: \"spot\",\n description:\n \"Get current or historical spot plan orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n status: {\n type: \"string\",\n enum: [\"current\", \"history\"],\n description: \"current(default) or history.\",\n },\n startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n limit: { type: \"number\", description: \"Result size, default 100.\" },\n },\n required: [\"symbol\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"current\";\n const path =\n status === \"history\"\n ? \"/api/v2/spot/trade/history-plan-order\"\n : \"/api/v2/spot/trade/current-plan-order\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n symbol: requireString(args, \"symbol\"),\n startTime: readString(args, \"startTime\"),\n endTime: readString(args, \"endTime\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"spot_get_plan_orders\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_cancel_plan_orders\",\n module: \"spot\",\n description:\n \"Cancel one or multiple spot plan orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orderId: { type: \"string\", description: \"Single plan order id.\" },\n orderIds: {\n type: \"array\",\n description: \"Multiple plan order ids.\",\n items: { type: \"string\" },\n },\n symbol: { type: \"string\", description: \"Cancel all plan orders for symbol.\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orderId = readString(args, \"orderId\");\n const orderIds = readStringArray(args, \"orderIds\");\n const symbol = readString(args, \"symbol\");\n ensureOneOf(\n args,\n [\"orderId\", \"orderIds\", \"symbol\"],\n 'Provide one of \"orderId\", \"orderIds\", or \"symbol\".',\n );\n if (orderIds && orderIds.length > 50) {\n throw new ValidationError(\"orderIds supports at most 50 items.\");\n }\n const path = orderId\n ? \"/api/v2/spot/trade/cancel-plan-order\"\n : \"/api/v2/spot/trade/batch-cancel-plan-order\";\n const body = compactObject({ orderId, orderIds, symbol });\n const response = await context.client.privatePost(\n path,\n body,\n privateRateLimit(\"spot_cancel_plan_orders\", 10),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { BitgetConfig } from \"../config.js\";\nimport { registerAccountTools } from \"./account.js\";\nimport { registerBrokerTools } from \"./broker.js\";\nimport { registerConvertTools } from \"./convert.js\";\nimport { registerCopyTradingTools } from \"./copy-trading.js\";\nimport { registerEarnTools } from \"./earn.js\";\nimport { registerFuturesMarketTools } from \"./futures-market.js\";\nimport { registerFuturesTradeTools } from \"./futures-trade.js\";\nimport { registerMarginTools } from \"./margin.js\";\nimport { registerP2pTools } from \"./p2p.js\";\nimport { registerSpotMarketTools } from \"./spot-market.js\";\nimport { registerSpotTradeTools } from \"./spot-trade.js\";\nimport type { ToolSpec } from \"./types.js\";\n\nfunction allToolSpecs(): ToolSpec[] {\n return [\n ...registerSpotMarketTools(),\n ...registerSpotTradeTools(),\n ...registerFuturesMarketTools(),\n ...registerFuturesTradeTools(),\n ...registerAccountTools(),\n ...registerMarginTools(),\n ...registerCopyTradingTools(),\n ...registerConvertTools(),\n ...registerEarnTools(),\n ...registerP2pTools(),\n ...registerBrokerTools(),\n ];\n}\n\nexport function buildTools(config: BitgetConfig): ToolSpec[] {\n const enabledModules = new Set(config.modules);\n const tools = allToolSpecs().filter((tool) => enabledModules.has(tool.module));\n if (!config.readOnly) {\n return tools;\n }\n return tools.filter((tool) => !tool.isWrite);\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { BitgetRestClient } from \"../client/rest-client.js\";\nimport type { BitgetConfig } from \"../config.js\";\nimport type { ModuleId } from \"../constants.js\";\n\nexport type ToolArgs = Record<string, unknown>;\n\nexport type JsonSchema = Tool[\"inputSchema\"];\n\nexport interface ToolContext {\n config: BitgetConfig;\n client: BitgetRestClient;\n}\n\nexport interface ToolSpec {\n name: string;\n module: ModuleId;\n description: string;\n inputSchema: JsonSchema;\n isWrite: boolean;\n handler: (args: ToolArgs, context: ToolContext) => Promise<unknown>;\n}\n\nexport function toMcpTool(tool: ToolSpec): Tool {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {\n readOnlyHint: !tool.isWrite,\n destructiveHint: tool.isWrite,\n idempotentHint: !tool.isWrite,\n openWorldHint: true,\n },\n };\n}\n"],"mappings":"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","names":["normalize","response","normalize","response","normalize","response","normalize","payload","response","normalize","normalize","normalize","normalize","normalize","normalize","earnCapability"]}
|