143
Total
6
Critical
103
High
34
Medium
Findings
unknownEnvironment file access
Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.
>>> 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.6\";\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"]}Report false positiveEnvironment file access
Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.
145: const apiKey = process.env.BITGET_API_KEY?.trim();
146: const secretKey = process.env.BITGET_SECRET_KEY?.trim();
>>> 147: const passphrase = process.env.BITGET_PASSPHRASE?.trim();
148: const hasAuth = Boolean(apiKey && secretKey && passphrase);
149: const partialAuth = Boolean(apiKey) || Boolean(secretKey) || Boolean(passphrase);Report false positiveEnvironment file access
Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.
144: function loadConfig(cli) {
145: const apiKey = process.env.BITGET_API_KEY?.trim();
>>> 146: const secretKey = process.env.BITGET_SECRET_KEY?.trim();
147: const passphrase = process.env.BITGET_PASSPHRASE?.trim();
148: const hasAuth = Boolean(apiKey && secretKey && passphrase);Report false positiveEnvironment file access
Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.
143: }
144: function loadConfig(cli) {
>>> 145: const apiKey = process.env.BITGET_API_KEY?.trim();
146: const secretKey = process.env.BITGET_SECRET_KEY?.trim();
147: const passphrase = process.env.BITGET_PASSPHRASE?.trim();Report false positiveEnvironment file access
Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.
133: }
134: function loadBaseUrl() {
>>> 135: const baseUrl = process.env.BITGET_API_BASE_URL?.trim() || "https://api.bitget.com";
136: if (!baseUrl.startsWith("http://") && !baseUrl.startsWith("https://")) {
137: throw new ConfigError(Report false positiveEnvironment file access
Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.
119: }
120: function loadTimeoutMs() {
>>> 121: const raw = process.env.BITGET_TIMEOUT_MS;
122: if (!raw) {
123: return 15e3;Report false positiveDecoded base64 content: ��"� ��z�S��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: J�b�'���ӭ�즊�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b���y���Ư�x?�����+-
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b���y���Ư�x?��]�x?�+-
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��溑�p����+r
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: y��Rv�j)ZnW���+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: y��Rv�j)ZnW���+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: y��Rv�j)ZnW���+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: y��Rv�j)ZnW���+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��"��(�{S��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��-���������v)���e
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,i�(�{i�(�{l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,i�(�{n)e
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-���u��j�!
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-����������
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-������˛
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����ǫ�����
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����ǫ�����
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��"� ��z�S��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��"� �rN���x��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,���z��z�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,���z�ߊYl
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,���z�ߊYl
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,���z�ܢ{ki�l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,��^���ǥ
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,��^���ǥ
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,��^��^���
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,��^��+u��
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,��^��+u��
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,��"�*'�����
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,��"�*'��e
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����j��܅��"w�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����j��܅��.+-
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-���u�镧
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-���u��j�!
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-���u��j�!
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-���u��"w�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-���u�ߊYl
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-���u�镧
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��"��(�{S��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��"� �rN���x��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��"� ��z�S��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: i�b�*'jS뢗��'�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: z{.���u��k�!�^yם
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��溑�p����+r
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: z{.���u��k�!�^yם
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: z{.���u��k�!�^yם
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: J�b�'���ӭ�즊�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �����b��� ڶ��
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: J�b�'���ӭ�즊�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: J�b�'���ӭ�즊�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��溑�p����+r
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: i�b�*'jS뢗��'�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: z{.���u��k�!�^yם
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��溑�p����+r
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: z{.���u��k�!�^yם
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: z{.���u��k�!�^yם
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �� �Zn)b�$�j۬
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b���y���Ư�x?�����+-
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b���y���Ư�x?��]�x?�+-
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �� �Zn)b�$�j۬
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �� �Zn)b�$�j۬
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��溑�p����+r
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �� �Zn)b�$�j۬
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: y��Rv�j)ZnW���+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: y��Rv�j)ZnW���+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: y��Rv�j)ZnW���+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: y��Rv�j)ZnW���+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��"��(�{S��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��-���������v)���e
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,i�(�{i�(�{l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,i�(�{n)e
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-����������
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-������˛
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����ǫ�����
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����ǫ�����
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��"� ��z�S��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��"� �rN���x��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,���z��z�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,���z�ߊYl
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,���z�ߊYl
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,���z�ܢ{ki�l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,��^���ǥ
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,��^���ǥ
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,��^��^���
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,��^��+u��
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,��^��+u��
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,��"�*'�����
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����,��"�*'��e
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����j��܅��"w�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b����j��܅��.+-
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-���u�镧
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-���u��j�!
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-���u��j�!
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-���u��"w�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-���u�ߊYl
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-���u�镧
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��b�����-���u��j�!
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��"��(�{S��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��"� ��z�S��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��"� �rN���x��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��"��(�{S��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��"� �rN���x��l
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.9 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.8 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.7 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.9 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.8 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (5.0 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.6 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.6 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.8 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.7 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveJavaScript fetch() call
Detected by automated pattern matching (rule NS-003) with medium confidence. May be a false positive.
>>> 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.6\";\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"]}Report false positiveHigh-entropy string (4.8 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.9 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.7 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.7 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveJavaScript fetch() call
Detected by automated pattern matching (rule NS-003) with medium confidence. May be a false positive.
341: let response;
342: try {
>>> 343: response = await fetch(url, {
344: method: config.method,
345: headers,Report false positiveHigh-entropy string (4.7 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.5 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.7 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.6 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.7 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.5 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.7 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.8 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.7 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.7 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.7 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.6 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.7 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.7 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.5 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.5 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (4.5 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveHigh-entropy string (5.2 bits/char) — possible encoded payload
Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.
Report false positiveScan History
| Date | Risk | Findings | Files | Duration |
|---|---|---|---|---|
| Feb 27, 2026 | critical | 143 | 6 | 0.00s |
| Feb 25, 2026 | critical | 143 | 6 | 0.00s |
| Feb 23, 2026 | critical | 143 | 6 | 0.00s |
| Feb 22, 2026 | critical | 143 | 6 | 0.00s |