datafye-mcp-api 2.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ /**
2
+ * HTTP client for the Datafye REST API.
3
+ *
4
+ * Thin wrapper around fetch — all responses are passed through as-is.
5
+ * No authentication required (the Datafye API is unauthenticated).
6
+ */
7
+ export declare class DatafyeClient {
8
+ private baseUrl;
9
+ constructor(baseUrl: string);
10
+ getBaseUrl(): string;
11
+ get(path: string, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
12
+ post(path: string, body?: Record<string, unknown>, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
13
+ del(path: string, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
14
+ startBacktestHistoryFetch(assetClass: string, dataType: string, body: Record<string, unknown>): Promise<unknown>;
15
+ checkBacktestHistoryFetch(assetClass: string, dataType: string, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
16
+ cancelBacktestHistoryFetch(assetClass: string, dataType: string, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
17
+ startBacktestReplay(assetClass: string, dataType: string, body: Record<string, unknown>): Promise<unknown>;
18
+ checkBacktestReplay(assetClass: string, dataType: string, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
19
+ cancelBacktestReplay(assetClass: string, dataType: string, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
20
+ private request;
21
+ }
package/dist/client.js ADDED
@@ -0,0 +1,78 @@
1
+ /**
2
+ * HTTP client for the Datafye REST API.
3
+ *
4
+ * Thin wrapper around fetch — all responses are passed through as-is.
5
+ * No authentication required (the Datafye API is unauthenticated).
6
+ */
7
+ export class DatafyeClient {
8
+ baseUrl;
9
+ constructor(baseUrl) {
10
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
11
+ }
12
+ getBaseUrl() {
13
+ return this.baseUrl;
14
+ }
15
+ // ---------------------------------------------------------------------------
16
+ // Generic HTTP methods
17
+ // ---------------------------------------------------------------------------
18
+ async get(path, query) {
19
+ return this.request("GET", path, { query });
20
+ }
21
+ async post(path, body, query) {
22
+ return this.request("POST", path, { body, query });
23
+ }
24
+ async del(path, query) {
25
+ return this.request("DELETE", path, { query });
26
+ }
27
+ // ---------------------------------------------------------------------------
28
+ // Backtest helpers (generic across stocks/crypto and data types)
29
+ // ---------------------------------------------------------------------------
30
+ async startBacktestHistoryFetch(assetClass, dataType, body) {
31
+ return this.post(`/${assetClass}/backtest/history/${dataType}`, body);
32
+ }
33
+ async checkBacktestHistoryFetch(assetClass, dataType, query) {
34
+ return this.get(`/${assetClass}/backtest/history/${dataType}`, query);
35
+ }
36
+ async cancelBacktestHistoryFetch(assetClass, dataType, query) {
37
+ return this.del(`/${assetClass}/backtest/history/${dataType}`, query);
38
+ }
39
+ async startBacktestReplay(assetClass, dataType, body) {
40
+ return this.post(`/${assetClass}/backtest/replay/${dataType}`, body);
41
+ }
42
+ async checkBacktestReplay(assetClass, dataType, query) {
43
+ return this.get(`/${assetClass}/backtest/replay/${dataType}`, query);
44
+ }
45
+ async cancelBacktestReplay(assetClass, dataType, query) {
46
+ return this.del(`/${assetClass}/backtest/replay/${dataType}`, query);
47
+ }
48
+ // ---------------------------------------------------------------------------
49
+ // Internal
50
+ // ---------------------------------------------------------------------------
51
+ async request(method, path, options) {
52
+ const url = new URL(this.baseUrl + "/datafye-api/v1" + path);
53
+ if (options?.query) {
54
+ for (const [key, value] of Object.entries(options.query)) {
55
+ if (value !== undefined) {
56
+ url.searchParams.set(key, String(value));
57
+ }
58
+ }
59
+ }
60
+ const headers = {
61
+ "Content-Type": "application/json",
62
+ Accept: "application/json",
63
+ };
64
+ const init = { method, headers };
65
+ if (options?.body) {
66
+ init.body = JSON.stringify(options.body);
67
+ }
68
+ const response = await fetch(url.toString(), init);
69
+ const text = await response.text();
70
+ try {
71
+ return JSON.parse(text);
72
+ }
73
+ catch {
74
+ return { status: response.status, body: text };
75
+ }
76
+ }
77
+ }
78
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { DatafyeClient } from "./client.js";
2
+ /**
3
+ * Manages the active Datafye environment URL and client instance.
4
+ *
5
+ * By default the MCP server assumes it is running inside a Datafye private
6
+ * cloud (docker network or VPC) and uses the internal hostname. Override with
7
+ * DATAFYE_BASE_URL or at runtime via the connect tool.
8
+ */
9
+ export declare class EnvironmentManager {
10
+ private clients;
11
+ private activeUrl;
12
+ constructor();
13
+ getClient(): DatafyeClient;
14
+ connect(url: string): {
15
+ url: string;
16
+ };
17
+ getStatus(): {
18
+ connected: boolean;
19
+ url: string;
20
+ };
21
+ }
@@ -0,0 +1,36 @@
1
+ import { DatafyeClient } from "./client.js";
2
+ const DEFAULT_BASE_URL = "http://api.rest.rumi.local";
3
+ /**
4
+ * Manages the active Datafye environment URL and client instance.
5
+ *
6
+ * By default the MCP server assumes it is running inside a Datafye private
7
+ * cloud (docker network or VPC) and uses the internal hostname. Override with
8
+ * DATAFYE_BASE_URL or at runtime via the connect tool.
9
+ */
10
+ export class EnvironmentManager {
11
+ clients = new Map();
12
+ activeUrl;
13
+ constructor() {
14
+ const envUrl = process.env.DATAFYE_BASE_URL;
15
+ this.activeUrl = envUrl ? envUrl.replace(/\/+$/, "") : DEFAULT_BASE_URL;
16
+ }
17
+ getClient() {
18
+ let client = this.clients.get(this.activeUrl);
19
+ if (!client) {
20
+ client = new DatafyeClient(this.activeUrl);
21
+ this.clients.set(this.activeUrl, client);
22
+ }
23
+ return client;
24
+ }
25
+ connect(url) {
26
+ this.activeUrl = url.replace(/\/+$/, "");
27
+ return { url: this.activeUrl };
28
+ }
29
+ getStatus() {
30
+ return {
31
+ connected: true,
32
+ url: this.activeUrl,
33
+ };
34
+ }
35
+ }
36
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,OAAO,kBAAkB;IACrB,OAAO,GAA+B,IAAI,GAAG,EAAE,CAAC;IAChD,SAAS,CAAS;IAE1B;QACE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAC1E,CAAC;IAED,SAAS;QACP,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACzC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IACjC,CAAC;IAED,SAAS;QACP,OAAO;YACL,SAAS,EAAE,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,SAAS;SACpB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { EnvironmentManager } from "./environment.js";
4
+ import { registerEnvironmentTools } from "./tools/environment.js";
5
+ import { registerDeploymentTools } from "./tools/deployment.js";
6
+ import { registerStocksTools } from "./tools/stocks.js";
7
+ import { registerStocksBacktestTools } from "./tools/stocks-backtest.js";
8
+ import { registerCryptoTools } from "./tools/crypto.js";
9
+ import { registerCryptoBacktestTools } from "./tools/crypto-backtest.js";
10
+ import { registerAltDataTools } from "./tools/altdata.js";
11
+ import { registerBrokerTools } from "./tools/broker.js";
12
+ // ---------------------------------------------------------------------------
13
+ // CLI argument parsing
14
+ // ---------------------------------------------------------------------------
15
+ const args = process.argv.slice(2);
16
+ const httpMode = args.includes("--http");
17
+ const portIndex = args.indexOf("--port");
18
+ const port = portIndex !== -1 ? parseInt(args[portIndex + 1], 10) : 3200;
19
+ // ---------------------------------------------------------------------------
20
+ // Server factory
21
+ // ---------------------------------------------------------------------------
22
+ function createServer(envManager) {
23
+ const server = new McpServer({
24
+ name: "Datafye API",
25
+ version: "1.0.0",
26
+ });
27
+ registerEnvironmentTools(server, envManager);
28
+ registerDeploymentTools(server, envManager);
29
+ registerStocksTools(server, envManager);
30
+ registerStocksBacktestTools(server, envManager);
31
+ registerCryptoTools(server, envManager);
32
+ registerCryptoBacktestTools(server, envManager);
33
+ registerAltDataTools(server, envManager);
34
+ registerBrokerTools(server, envManager);
35
+ return server;
36
+ }
37
+ // ---------------------------------------------------------------------------
38
+ // Transport setup
39
+ // ---------------------------------------------------------------------------
40
+ async function main() {
41
+ if (httpMode) {
42
+ const { StreamableHTTPServerTransport } = await import("@modelcontextprotocol/sdk/server/streamableHttp.js");
43
+ const express = (await import("express")).default;
44
+ const app = express();
45
+ app.use(express.json());
46
+ const envManager = new EnvironmentManager();
47
+ app.post("/mcp", async (req, res) => {
48
+ const server = createServer(envManager);
49
+ const transport = new StreamableHTTPServerTransport({
50
+ sessionIdGenerator: undefined,
51
+ });
52
+ await server.connect(transport);
53
+ await transport.handleRequest(req, res, req.body);
54
+ res.on("close", () => {
55
+ transport.close();
56
+ server.close();
57
+ });
58
+ });
59
+ app.listen(port, () => {
60
+ console.log(`Datafye API MCP server listening on http://localhost:${port}/mcp`);
61
+ });
62
+ process.on("SIGINT", () => {
63
+ console.log("Shutting down...");
64
+ process.exit(0);
65
+ });
66
+ }
67
+ else {
68
+ const { StdioServerTransport } = await import("@modelcontextprotocol/sdk/server/stdio.js");
69
+ const envManager = new EnvironmentManager();
70
+ const server = createServer(envManager);
71
+ const transport = new StdioServerTransport();
72
+ await server.connect(transport);
73
+ }
74
+ }
75
+ main().catch((error) => {
76
+ console.error("Fatal error:", error);
77
+ process.exit(1);
78
+ });
79
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EnvironmentManager } from "../environment.js";
3
+ export declare function registerAltDataTools(server: McpServer, envManager: EnvironmentManager): void;
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../util.js";
3
+ export function registerAltDataTools(server, envManager) {
4
+ const client = () => envManager.getClient();
5
+ server.tool("get_palpha_metrics", "Get Precision Alpha security aggregate value metrics — alternative data signals for a given symbol and time range.", {
6
+ assetClass: z
7
+ .enum(["Stocks", "Crypto"])
8
+ .optional()
9
+ .describe("Asset class (default: Stocks)"),
10
+ aggValueType: z.string().describe("Aggregate value type for metrics"),
11
+ frequency: z
12
+ .enum(["Second", "Minute", "Hour", "Day"])
13
+ .describe("Data frequency"),
14
+ sampleSize: z
15
+ .number()
16
+ .int()
17
+ .optional()
18
+ .describe("Sample size for metrics calculation"),
19
+ symbol: z.string().describe("Symbol to fetch metrics for"),
20
+ from: z
21
+ .string()
22
+ .describe("Start timestamp inclusive (yyyy-MM-DDThh:mm:ss)"),
23
+ to: z
24
+ .string()
25
+ .describe("End timestamp inclusive (yyyy-MM-DDThh:mm:ss)"),
26
+ }, async ({ assetClass, aggValueType, frequency, sampleSize, symbol, from, to }) => {
27
+ return toolResult(await client().get("/palpha/history/metrics/security/agg-value", {
28
+ assetClass,
29
+ aggValueType,
30
+ frequency,
31
+ sampleSize,
32
+ symbol,
33
+ from,
34
+ to,
35
+ }));
36
+ });
37
+ server.tool("get_hwai_alerts", "Get HWAI alerts and signals for a given date and asset class.", {
38
+ assetClass: z
39
+ .enum(["Stocks", "Crypto"])
40
+ .optional()
41
+ .describe("Asset class (default: Stocks)"),
42
+ date: z.string().describe("Date (yyyy-MM-dd)"),
43
+ }, async ({ assetClass, date }) => {
44
+ return toolResult(await client().get("/hwai/history/alerts", { assetClass, date }));
45
+ });
46
+ }
47
+ //# sourceMappingURL=altdata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"altdata.js","sourceRoot":"","sources":["../../src/tools/altdata.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,UAA8B;IAE9B,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;IAE5C,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,oHAAoH,EACpH;QACE,UAAU,EAAE,CAAC;aACV,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;aAC1B,QAAQ,EAAE;aACV,QAAQ,CAAC,+BAA+B,CAAC;QAC5C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QACrE,SAAS,EAAE,CAAC;aACT,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;aACzC,QAAQ,CAAC,gBAAgB,CAAC;QAC7B,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,GAAG,EAAE;aACL,QAAQ,EAAE;aACV,QAAQ,CAAC,qCAAqC,CAAC;QAClD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC1D,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,CAAC,iDAAiD,CAAC;QAC9D,EAAE,EAAE,CAAC;aACF,MAAM,EAAE;aACR,QAAQ,CAAC,+CAA+C,CAAC;KAC7D,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;QAC9E,OAAO,UAAU,CACf,MAAM,MAAM,EAAE,CAAC,GAAG,CAAC,4CAA4C,EAAE;YAC/D,UAAU;YACV,YAAY;YACZ,SAAS;YACT,UAAU;YACV,MAAM;YACN,IAAI;YACJ,EAAE;SACH,CAAC,CACH,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,+DAA+D,EAC/D;QACE,UAAU,EAAE,CAAC;aACV,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;aAC1B,QAAQ,EAAE;aACV,QAAQ,CAAC,+BAA+B,CAAC;QAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KAC/C,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE;QAC7B,OAAO,UAAU,CACf,MAAM,MAAM,EAAE,CAAC,GAAG,CAAC,sBAAsB,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CACjE,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EnvironmentManager } from "../environment.js";
3
+ export declare function registerBrokerTools(server: McpServer, envManager: EnvironmentManager): void;
@@ -0,0 +1,64 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../util.js";
3
+ const brokerParam = z
4
+ .enum(["ALPACA", "LIGHTSPEED", "TASTYTRADE", "TRADESTATION", "TRADEZERO", "WEBULL"])
5
+ .describe("Broker name");
6
+ export function registerBrokerTools(server, envManager) {
7
+ const client = () => envManager.getClient();
8
+ server.tool("place_stocks_order", "Place a new stocks broker order (buy or sell).", {
9
+ broker: brokerParam,
10
+ side: z.enum(["BUY", "SELL"]).describe("Order side"),
11
+ orderType: z
12
+ .enum(["MARKET", "LIMIT", "STOP", "STOP_LIMIT"])
13
+ .describe("Order type"),
14
+ orderTif: z
15
+ .enum(["GTC", "DAY", "IOC", "FOK"])
16
+ .describe("Time in force"),
17
+ instrument: z
18
+ .enum(["STOCK", "OPTION"])
19
+ .describe("Instrument type"),
20
+ symbol: z.string().describe("Security symbol (e.g. AAPL)"),
21
+ accountNumber: z.string().describe("Broker account number"),
22
+ clOrderId: z.string().describe("Client order ID (your unique ID)"),
23
+ orderQty: z.string().describe("Order quantity"),
24
+ orderLimitPrice: z
25
+ .string()
26
+ .optional()
27
+ .describe("Limit price (required for LIMIT and STOP_LIMIT)"),
28
+ stopPrice: z
29
+ .string()
30
+ .optional()
31
+ .describe("Stop price (required for STOP and STOP_LIMIT)"),
32
+ }, async (params) => {
33
+ return toolResult(await client().post("/stocks/broker/orders", params));
34
+ });
35
+ server.tool("get_stocks_orders", "List stocks broker orders for an account.", {
36
+ broker: brokerParam,
37
+ accountNumber: z.string().describe("Broker account number"),
38
+ status: z
39
+ .string()
40
+ .optional()
41
+ .describe("Filter by order status"),
42
+ }, async ({ broker, accountNumber, status }) => {
43
+ return toolResult(await client().get("/stocks/broker/orders", {
44
+ broker,
45
+ accountNumber,
46
+ status,
47
+ }));
48
+ });
49
+ server.tool("get_stocks_order", "Get a specific stocks broker order by ID.", {
50
+ orderId: z.string().describe("Order ID"),
51
+ broker: brokerParam,
52
+ accountNumber: z.string().describe("Broker account number"),
53
+ }, async ({ orderId, broker, accountNumber }) => {
54
+ return toolResult(await client().get(`/stocks/broker/orders/${encodeURIComponent(orderId)}`, { broker, accountNumber }));
55
+ });
56
+ server.tool("cancel_stocks_order", "Cancel a stocks broker order by ID.", {
57
+ orderId: z.string().describe("Order ID to cancel"),
58
+ broker: brokerParam,
59
+ accountNumber: z.string().describe("Broker account number"),
60
+ }, async ({ orderId, broker, accountNumber }) => {
61
+ return toolResult(await client().del(`/stocks/broker/orders/${encodeURIComponent(orderId)}`, { broker, accountNumber }));
62
+ });
63
+ }
64
+ //# sourceMappingURL=broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../src/tools/broker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EnvironmentManager } from "../environment.js";
3
+ export declare function registerCryptoBacktestTools(server: McpServer, envManager: EnvironmentManager): void;
@@ -0,0 +1,180 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../util.js";
3
+ export function registerCryptoBacktestTools(server, envManager) {
4
+ const client = () => envManager.getClient();
5
+ // ---------------------------------------------------------------------------
6
+ // Tick History Fetch
7
+ // ---------------------------------------------------------------------------
8
+ server.tool("start_crypto_tick_fetch", "Start fetching crypto tick history (trades and/or quotes) from the data provider for backtest. Foundry only.", {
9
+ date: z.string().describe("Start date (yyyy-MM-dd)"),
10
+ symbols: z
11
+ .string()
12
+ .optional()
13
+ .describe("Comma-separated symbols. Omit for all."),
14
+ noTrades: z
15
+ .boolean()
16
+ .optional()
17
+ .describe("Exclude trade data (default: false)"),
18
+ noQuotes: z
19
+ .boolean()
20
+ .optional()
21
+ .describe("Exclude quote data (default: false)"),
22
+ numDays: z
23
+ .number()
24
+ .int()
25
+ .optional()
26
+ .describe("Number of days (default: 1)"),
27
+ sortByExchangeTs: z
28
+ .boolean()
29
+ .optional()
30
+ .describe("Sort by exchange timestamp (default: true)"),
31
+ }, async ({ date, symbols, noTrades, noQuotes, numDays, sortByExchangeTs }) => {
32
+ return toolResult(await client().startBacktestHistoryFetch("crypto", "ticks", {
33
+ date,
34
+ symbols,
35
+ noTrades,
36
+ noQuotes,
37
+ numDays,
38
+ sortByExchangeTs,
39
+ }));
40
+ });
41
+ server.tool("check_crypto_tick_fetch", "Check whether a crypto tick history fetch is currently running.", {}, async () => {
42
+ return toolResult(await client().checkBacktestHistoryFetch("crypto", "ticks"));
43
+ });
44
+ server.tool("cancel_crypto_tick_fetch", "Cancel a running crypto tick history fetch.", {}, async () => {
45
+ return toolResult(await client().cancelBacktestHistoryFetch("crypto", "ticks"));
46
+ });
47
+ // ---------------------------------------------------------------------------
48
+ // Quote History Fetch
49
+ // ---------------------------------------------------------------------------
50
+ server.tool("start_crypto_quote_fetch", "Start fetching crypto quote history from the data provider. Foundry only.", {
51
+ date: z.string().describe("Start date (yyyy-MM-dd)"),
52
+ symbols: z
53
+ .string()
54
+ .optional()
55
+ .describe("Comma-separated symbols. Omit for all."),
56
+ numDays: z
57
+ .number()
58
+ .int()
59
+ .optional()
60
+ .describe("Number of days (default: 1)"),
61
+ format: z
62
+ .enum(["Binary", "Json", "Csv"])
63
+ .optional()
64
+ .describe("Output format (default: Binary)"),
65
+ sortByExchangeTs: z
66
+ .boolean()
67
+ .optional()
68
+ .describe("Sort by exchange timestamp (default: true)"),
69
+ groupBySymbol: z
70
+ .boolean()
71
+ .optional()
72
+ .describe("Group output files by symbol (default: false)"),
73
+ }, async ({ date, symbols, numDays, format, sortByExchangeTs, groupBySymbol }) => {
74
+ return toolResult(await client().startBacktestHistoryFetch("crypto", "quotes", {
75
+ date,
76
+ symbols,
77
+ numDays,
78
+ format,
79
+ sortByExchangeTs,
80
+ groupBySymbol,
81
+ }));
82
+ });
83
+ server.tool("check_crypto_quote_fetch", "Check whether a crypto quote history fetch is currently running.", {}, async () => {
84
+ return toolResult(await client().checkBacktestHistoryFetch("crypto", "quotes"));
85
+ });
86
+ server.tool("cancel_crypto_quote_fetch", "Cancel a running crypto quote history fetch.", {}, async () => {
87
+ return toolResult(await client().cancelBacktestHistoryFetch("crypto", "quotes"));
88
+ });
89
+ // ---------------------------------------------------------------------------
90
+ // Trade History Fetch
91
+ // ---------------------------------------------------------------------------
92
+ server.tool("start_crypto_trade_fetch", "Start fetching crypto trade history from the data provider. Foundry only.", {
93
+ date: z.string().describe("Start date (yyyy-MM-dd)"),
94
+ symbols: z
95
+ .string()
96
+ .optional()
97
+ .describe("Comma-separated symbols. Omit for all."),
98
+ numDays: z
99
+ .number()
100
+ .int()
101
+ .optional()
102
+ .describe("Number of days (default: 1)"),
103
+ format: z
104
+ .enum(["Binary", "Json", "Csv"])
105
+ .optional()
106
+ .describe("Output format (default: Binary)"),
107
+ sortByExchangeTs: z
108
+ .boolean()
109
+ .optional()
110
+ .describe("Sort by exchange timestamp (default: true)"),
111
+ groupBySymbol: z
112
+ .boolean()
113
+ .optional()
114
+ .describe("Group output files by symbol (default: false)"),
115
+ }, async ({ date, symbols, numDays, format, sortByExchangeTs, groupBySymbol }) => {
116
+ return toolResult(await client().startBacktestHistoryFetch("crypto", "trades", {
117
+ date,
118
+ symbols,
119
+ numDays,
120
+ format,
121
+ sortByExchangeTs,
122
+ groupBySymbol,
123
+ }));
124
+ });
125
+ server.tool("check_crypto_trade_fetch", "Check whether a crypto trade history fetch is currently running.", {}, async () => {
126
+ return toolResult(await client().checkBacktestHistoryFetch("crypto", "trades"));
127
+ });
128
+ server.tool("cancel_crypto_trade_fetch", "Cancel a running crypto trade history fetch.", {}, async () => {
129
+ return toolResult(await client().cancelBacktestHistoryFetch("crypto", "trades"));
130
+ });
131
+ // ---------------------------------------------------------------------------
132
+ // OHLC History Fetch
133
+ // ---------------------------------------------------------------------------
134
+ server.tool("start_crypto_ohlc_fetch", "Start fetching crypto OHLC history at a given frequency from the data provider. Foundry only.", {
135
+ date: z.string().describe("Start date (yyyy-MM-dd)"),
136
+ symbols: z
137
+ .string()
138
+ .optional()
139
+ .describe("Comma-separated symbols. Omit for all."),
140
+ numDays: z
141
+ .number()
142
+ .int()
143
+ .optional()
144
+ .describe("Number of days (default: 1)"),
145
+ frequency: z
146
+ .enum(["Second", "Minute", "Hour", "Day"])
147
+ .describe("OHLC frequency"),
148
+ adjusted: z
149
+ .boolean()
150
+ .optional()
151
+ .describe("Fetch adjusted data (default: false)"),
152
+ }, async ({ date, symbols, numDays, frequency, adjusted }) => {
153
+ return toolResult(await client().startBacktestHistoryFetch("crypto", "ohlcs", {
154
+ date,
155
+ symbols,
156
+ numDays,
157
+ frequency,
158
+ adjusted,
159
+ }));
160
+ });
161
+ server.tool("check_crypto_ohlc_fetch", "Check whether a crypto OHLC history fetch is currently running.", {
162
+ frequency: z
163
+ .enum(["Second", "Minute", "Hour", "Day"])
164
+ .describe("OHLC frequency to check"),
165
+ }, async ({ frequency }) => {
166
+ return toolResult(await client().checkBacktestHistoryFetch("crypto", "ohlcs", {
167
+ frequency,
168
+ }));
169
+ });
170
+ server.tool("cancel_crypto_ohlc_fetch", "Cancel a running crypto OHLC history fetch.", {
171
+ frequency: z
172
+ .enum(["Second", "Minute", "Hour", "Day"])
173
+ .describe("OHLC frequency to cancel"),
174
+ }, async ({ frequency }) => {
175
+ return toolResult(await client().cancelBacktestHistoryFetch("crypto", "ohlcs", {
176
+ frequency,
177
+ }));
178
+ });
179
+ }
180
+ //# sourceMappingURL=crypto-backtest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto-backtest.js","sourceRoot":"","sources":["../../src/tools/crypto-backtest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EnvironmentManager } from "../environment.js";
3
+ export declare function registerCryptoTools(server: McpServer, envManager: EnvironmentManager): void;