@vantagestack/mcp-server 0.1.59 → 0.1.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +25 -0
- package/dist/client.js +172 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1379 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/account-deletion.d.ts +6 -0
- package/dist/tools/account-deletion.js +92 -0
- package/dist/tools/account-deletion.js.map +1 -0
- package/dist/tools/account-health.d.ts +21 -0
- package/dist/tools/account-health.js +84 -0
- package/dist/tools/account-health.js.map +1 -0
- package/dist/tools/account.d.ts +19 -0
- package/dist/tools/account.js +291 -0
- package/dist/tools/account.js.map +1 -0
- package/dist/tools/account.test.d.ts +1 -0
- package/dist/tools/account.test.js +213 -0
- package/dist/tools/account.test.js.map +1 -0
- package/dist/tools/admin-test.d.ts +15 -0
- package/dist/tools/admin-test.js +76 -0
- package/dist/tools/admin-test.js.map +1 -0
- package/dist/tools/calendar.d.ts +4 -0
- package/dist/tools/calendar.js +85 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/calendar.test.d.ts +1 -0
- package/dist/tools/calendar.test.js +62 -0
- package/dist/tools/calendar.test.js.map +1 -0
- package/dist/tools/canary.d.ts +4 -0
- package/dist/tools/canary.js +25 -0
- package/dist/tools/canary.js.map +1 -0
- package/dist/tools/canary.test.d.ts +1 -0
- package/dist/tools/canary.test.js +46 -0
- package/dist/tools/canary.test.js.map +1 -0
- package/dist/tools/contract-configs.d.ts +9 -0
- package/dist/tools/contract-configs.js +187 -0
- package/dist/tools/contract-configs.js.map +1 -0
- package/dist/tools/contract-configs.test.d.ts +1 -0
- package/dist/tools/contract-configs.test.js +245 -0
- package/dist/tools/contract-configs.test.js.map +1 -0
- package/dist/tools/copier.d.ts +11 -0
- package/dist/tools/copier.js +52 -0
- package/dist/tools/copier.js.map +1 -0
- package/dist/tools/copier.test.d.ts +1 -0
- package/dist/tools/copier.test.js +75 -0
- package/dist/tools/copier.test.js.map +1 -0
- package/dist/tools/groups.d.ts +14 -0
- package/dist/tools/groups.js +44 -0
- package/dist/tools/groups.js.map +1 -0
- package/dist/tools/groups.test.d.ts +1 -0
- package/dist/tools/groups.test.js +72 -0
- package/dist/tools/groups.test.js.map +1 -0
- package/dist/tools/ip-allowlist.d.ts +6 -0
- package/dist/tools/ip-allowlist.js +69 -0
- package/dist/tools/ip-allowlist.js.map +1 -0
- package/dist/tools/journal.d.ts +6 -0
- package/dist/tools/journal.js +110 -0
- package/dist/tools/journal.js.map +1 -0
- package/dist/tools/journal.test.d.ts +1 -0
- package/dist/tools/journal.test.js +100 -0
- package/dist/tools/journal.test.js.map +1 -0
- package/dist/tools/latency.d.ts +3 -0
- package/dist/tools/latency.js +54 -0
- package/dist/tools/latency.js.map +1 -0
- package/dist/tools/market-history.d.ts +4 -0
- package/dist/tools/market-history.js +50 -0
- package/dist/tools/market-history.js.map +1 -0
- package/dist/tools/market-hours.d.ts +3 -0
- package/dist/tools/market-hours.js +19 -0
- package/dist/tools/market-hours.js.map +1 -0
- package/dist/tools/paper-trading.d.ts +11 -0
- package/dist/tools/paper-trading.js +235 -0
- package/dist/tools/paper-trading.js.map +1 -0
- package/dist/tools/paper-trading.test.d.ts +1 -0
- package/dist/tools/paper-trading.test.js +108 -0
- package/dist/tools/paper-trading.test.js.map +1 -0
- package/dist/tools/ping.d.ts +8 -0
- package/dist/tools/ping.js +22 -0
- package/dist/tools/ping.js.map +1 -0
- package/dist/tools/ping.test.d.ts +1 -0
- package/dist/tools/ping.test.js +25 -0
- package/dist/tools/ping.test.js.map +1 -0
- package/dist/tools/qc.d.ts +18 -0
- package/dist/tools/qc.js +422 -0
- package/dist/tools/qc.js.map +1 -0
- package/dist/tools/qc.test.d.ts +1 -0
- package/dist/tools/qc.test.js +218 -0
- package/dist/tools/qc.test.js.map +1 -0
- package/dist/tools/read.d.ts +7 -0
- package/dist/tools/read.js +154 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/read.test.d.ts +1 -0
- package/dist/tools/read.test.js +102 -0
- package/dist/tools/read.test.js.map +1 -0
- package/dist/tools/risk.d.ts +7 -0
- package/dist/tools/risk.js +108 -0
- package/dist/tools/risk.js.map +1 -0
- package/dist/tools/signal-templates.d.ts +6 -0
- package/dist/tools/signal-templates.js +90 -0
- package/dist/tools/signal-templates.js.map +1 -0
- package/dist/tools/signals.d.ts +8 -0
- package/dist/tools/signals.js +318 -0
- package/dist/tools/signals.js.map +1 -0
- package/dist/tools/signals.test.d.ts +1 -0
- package/dist/tools/signals.test.js +92 -0
- package/dist/tools/signals.test.js.map +1 -0
- package/dist/tools/sync-accounts.d.ts +18 -0
- package/dist/tools/sync-accounts.js +68 -0
- package/dist/tools/sync-accounts.js.map +1 -0
- package/dist/tools/trade.d.ts +3 -0
- package/dist/tools/trade.js +49 -0
- package/dist/tools/trade.js.map +1 -0
- package/dist/user.d.ts +19 -0
- package/dist/user.js +21 -0
- package/dist/user.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"latency.js","sourceRoot":"","sources":["../../src/tools/latency.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { VantageClient } from "../client.js";
|
|
2
|
+
import { UserResolver, ToolResult } from "../user.js";
|
|
3
|
+
export declare function getMarketDataFeeds(client: VantageClient, _resolver: UserResolver, _input: Record<string, unknown>): Promise<ToolResult>;
|
|
4
|
+
export declare function getMarketDataHistory(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { makeErrorResult } from "../user.js";
|
|
2
|
+
export async function getMarketDataFeeds(client, _resolver, _input) {
|
|
3
|
+
try {
|
|
4
|
+
const r = await client.get("/api/marketdata/feeds");
|
|
5
|
+
const lines = r.feeds.map(f => `- ${f.kind} [${f.capabilities}]`);
|
|
6
|
+
return {
|
|
7
|
+
content: [
|
|
8
|
+
{ type: "text", text: `Registered market-data feeds:\n${lines.join("\n")}` },
|
|
9
|
+
{ type: "text", text: JSON.stringify(r, null, 2) },
|
|
10
|
+
],
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
return makeErrorResult(err);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export async function getMarketDataHistory(client, _resolver, input) {
|
|
18
|
+
const feed = String(input.feed ?? "");
|
|
19
|
+
const symbol = String(input.symbol ?? "");
|
|
20
|
+
const assetClass = String(input.assetClass ?? "Future");
|
|
21
|
+
const fromUtc = String(input.fromUtc ?? "");
|
|
22
|
+
const toUtc = String(input.toUtc ?? "");
|
|
23
|
+
const bar = input.bar ? String(input.bar) : "1min";
|
|
24
|
+
if (!feed || !symbol || !fromUtc || !toUtc) {
|
|
25
|
+
return makeErrorResult(new Error("feed, symbol, fromUtc, toUtc are required (assetClass defaults to Future, bar to 1min)"));
|
|
26
|
+
}
|
|
27
|
+
const qs = new URLSearchParams({
|
|
28
|
+
feed, symbol, assetClass, fromUtc, toUtc, bar,
|
|
29
|
+
}).toString();
|
|
30
|
+
try {
|
|
31
|
+
const bars = await client.get(`/api/marketdata/history?${qs}`);
|
|
32
|
+
const head = bars.slice(0, 5).map(b => ` ${b.t} O=${b.o} H=${b.h} L=${b.l} C=${b.c} V=${b.v}`).join("\n");
|
|
33
|
+
const tail = bars.length > 10
|
|
34
|
+
? "\n …\n" + bars.slice(-5).map(b => ` ${b.t} O=${b.o} H=${b.h} L=${b.l} C=${b.c} V=${b.v}`).join("\n")
|
|
35
|
+
: "";
|
|
36
|
+
const summary = `Feed ${feed}: ${bars.length} ${bar} bar(s) for ${symbol} ` +
|
|
37
|
+
`(${fromUtc} → ${toUtc})` +
|
|
38
|
+
(bars.length ? `\n${head}${tail}` : "");
|
|
39
|
+
return {
|
|
40
|
+
content: [
|
|
41
|
+
{ type: "text", text: summary },
|
|
42
|
+
{ type: "text", text: JSON.stringify(bars, null, 2) },
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
return makeErrorResult(err);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=market-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market-history.js","sourceRoot":"","sources":["../../src/tools/market-history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { makeErrorResult } from "../user.js";
|
|
2
|
+
export async function getMarketHours(client, _resolver, _input) {
|
|
3
|
+
try {
|
|
4
|
+
const mh = await client.get("/api/market-hours");
|
|
5
|
+
const summary = mh.isOpen
|
|
6
|
+
? `${mh.asset} market is OPEN`
|
|
7
|
+
: `${mh.asset} market is CLOSED${mh.nextOpenAt ? ` — reopens at ${mh.nextOpenAt}` : ""}`;
|
|
8
|
+
return {
|
|
9
|
+
content: [
|
|
10
|
+
{ type: "text", text: summary },
|
|
11
|
+
{ type: "text", text: JSON.stringify(mh, null, 2) },
|
|
12
|
+
],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
return makeErrorResult(err);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=market-hours.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market-hours.js","sourceRoot":"","sources":["../../src/tools/market-hours.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,eAAe,EAAc,MAAM,YAAY,CAAC;AAQvE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAqB,EACrB,SAAuB,EACvB,MAA+B;IAE/B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAsB,mBAAmB,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM;YACvB,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,iBAAiB;YAC9B,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,oBAAoB,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3F,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;gBAC/B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACpD;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { VantageClient } from "../client.js";
|
|
2
|
+
import { UserResolver, ToolResult } from "../user.js";
|
|
3
|
+
export declare function listPaperAccounts(client: VantageClient, resolver: UserResolver, _input: Record<string, unknown>): Promise<ToolResult>;
|
|
4
|
+
export declare function getPaperAccount(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
5
|
+
export declare function createPaperAccount(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
6
|
+
export declare function updatePaperAccount(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
7
|
+
export declare function deletePaperAccount(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
8
|
+
export declare function addPaperCashAdjustment(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
9
|
+
export declare function getPaperBalanceHistory(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
10
|
+
export declare function getPaperPerformanceMetrics(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
11
|
+
export declare function getPaperPortfolio(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { makeErrorResult } from "../user.js";
|
|
2
|
+
function formatAccount(a) {
|
|
3
|
+
const pnl = a.currentBalance - a.initialBalance;
|
|
4
|
+
const pnlStr = pnl >= 0 ? `+${pnl.toFixed(2)}` : pnl.toFixed(2);
|
|
5
|
+
const flag = a.isEnabled ? "" : " (disabled)";
|
|
6
|
+
return `• #${a.id} "${a.name}" balance=${a.currentBalance.toFixed(2)} init=${a.initialBalance.toFixed(2)} pnl=${pnlStr}${flag}`;
|
|
7
|
+
}
|
|
8
|
+
export async function listPaperAccounts(client, resolver, _input) {
|
|
9
|
+
try {
|
|
10
|
+
const userId = await resolver.resolve(client);
|
|
11
|
+
const rows = await client.get(`/api/account/${userId}/paper-accounts`);
|
|
12
|
+
if (!rows.length) {
|
|
13
|
+
return {
|
|
14
|
+
content: [
|
|
15
|
+
{ type: "text", text: "No paper accounts. Use create_paper_account to make one." },
|
|
16
|
+
{ type: "text", text: "[]" },
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
content: [
|
|
22
|
+
{ type: "text", text: `${rows.length} paper account(s):\n${rows.map(formatAccount).join("\n")}` },
|
|
23
|
+
{ type: "text", text: JSON.stringify(rows, null, 2) },
|
|
24
|
+
],
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
return makeErrorResult(err);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export async function getPaperAccount(client, resolver, input) {
|
|
32
|
+
const id = Number(input.paperAccountId ?? 0);
|
|
33
|
+
if (!id)
|
|
34
|
+
return makeErrorResult(new Error("paperAccountId is required"));
|
|
35
|
+
try {
|
|
36
|
+
const userId = await resolver.resolve(client);
|
|
37
|
+
const a = await client.get(`/api/account/${userId}/paper-accounts/${id}`);
|
|
38
|
+
return {
|
|
39
|
+
content: [
|
|
40
|
+
{ type: "text", text: formatAccount(a) },
|
|
41
|
+
{ type: "text", text: JSON.stringify(a, null, 2) },
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
return makeErrorResult(err);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export async function createPaperAccount(client, resolver, input) {
|
|
50
|
+
const name = input.name !== undefined ? String(input.name) : undefined;
|
|
51
|
+
const initialBalance = input.initialBalance !== undefined ? Number(input.initialBalance) : undefined;
|
|
52
|
+
try {
|
|
53
|
+
const userId = await resolver.resolve(client);
|
|
54
|
+
const a = await client.post(`/api/account/${userId}/paper-accounts`, { name, initialBalance });
|
|
55
|
+
return {
|
|
56
|
+
content: [
|
|
57
|
+
{ type: "text", text: `Created paper account #${a.id}: ${formatAccount(a)}` },
|
|
58
|
+
{ type: "text", text: JSON.stringify(a, null, 2) },
|
|
59
|
+
],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
return makeErrorResult(err);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export async function updatePaperAccount(client, resolver, input) {
|
|
67
|
+
const id = Number(input.paperAccountId ?? 0);
|
|
68
|
+
if (!id)
|
|
69
|
+
return makeErrorResult(new Error("paperAccountId is required"));
|
|
70
|
+
const body = {};
|
|
71
|
+
if (input.name !== undefined)
|
|
72
|
+
body.name = String(input.name);
|
|
73
|
+
if (input.isEnabled !== undefined)
|
|
74
|
+
body.isEnabled = Boolean(input.isEnabled);
|
|
75
|
+
if (Object.keys(body).length === 0)
|
|
76
|
+
return makeErrorResult(new Error("at least one of name / isEnabled is required"));
|
|
77
|
+
try {
|
|
78
|
+
const userId = await resolver.resolve(client);
|
|
79
|
+
const a = await client.patch(`/api/account/${userId}/paper-accounts/${id}`, body);
|
|
80
|
+
return {
|
|
81
|
+
content: [
|
|
82
|
+
{ type: "text", text: `Updated paper account: ${formatAccount(a)}` },
|
|
83
|
+
{ type: "text", text: JSON.stringify(a, null, 2) },
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
return makeErrorResult(err);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export async function deletePaperAccount(client, resolver, input) {
|
|
92
|
+
const id = Number(input.paperAccountId ?? 0);
|
|
93
|
+
if (!id)
|
|
94
|
+
return makeErrorResult(new Error("paperAccountId is required"));
|
|
95
|
+
try {
|
|
96
|
+
const userId = await resolver.resolve(client);
|
|
97
|
+
await client.delete(`/api/account/${userId}/paper-accounts/${id}`);
|
|
98
|
+
return {
|
|
99
|
+
content: [
|
|
100
|
+
{ type: "text", text: `Deleted paper account #${id} (balance history, cash adjustments, and cached metrics cascaded).` },
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
return makeErrorResult(err);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export async function addPaperCashAdjustment(client, resolver, input) {
|
|
109
|
+
const id = Number(input.paperAccountId ?? 0);
|
|
110
|
+
if (!id)
|
|
111
|
+
return makeErrorResult(new Error("paperAccountId is required"));
|
|
112
|
+
if (input.amount === undefined)
|
|
113
|
+
return makeErrorResult(new Error("amount is required"));
|
|
114
|
+
if (input.reason === undefined)
|
|
115
|
+
return makeErrorResult(new Error("reason is required"));
|
|
116
|
+
const amount = Number(input.amount);
|
|
117
|
+
const reason = String(input.reason);
|
|
118
|
+
try {
|
|
119
|
+
const userId = await resolver.resolve(client);
|
|
120
|
+
const adj = await client.post(`/api/account/${userId}/paper-accounts/${id}/cash-adjustments`, { amount, reason });
|
|
121
|
+
const sign = adj.amount >= 0 ? "+" : "";
|
|
122
|
+
return {
|
|
123
|
+
content: [
|
|
124
|
+
{ type: "text", text: `Recorded adjustment ${sign}${adj.amount} (${adj.reason}); new balance=${adj.newBalance}` },
|
|
125
|
+
{ type: "text", text: JSON.stringify(adj, null, 2) },
|
|
126
|
+
],
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
return makeErrorResult(err);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export async function getPaperBalanceHistory(client, resolver, input) {
|
|
134
|
+
const id = Number(input.paperAccountId ?? 0);
|
|
135
|
+
if (!id)
|
|
136
|
+
return makeErrorResult(new Error("paperAccountId is required"));
|
|
137
|
+
const params = new URLSearchParams();
|
|
138
|
+
if (input.from)
|
|
139
|
+
params.set("from", String(input.from));
|
|
140
|
+
if (input.to)
|
|
141
|
+
params.set("to", String(input.to));
|
|
142
|
+
const qs = params.toString() ? `?${params}` : "";
|
|
143
|
+
try {
|
|
144
|
+
const userId = await resolver.resolve(client);
|
|
145
|
+
const rows = await client.get(`/api/account/${userId}/paper-accounts/${id}/balance-history${qs}`);
|
|
146
|
+
if (!rows.length) {
|
|
147
|
+
return {
|
|
148
|
+
content: [
|
|
149
|
+
{ type: "text", text: "No balance history rows in range." },
|
|
150
|
+
{ type: "text", text: "[]" },
|
|
151
|
+
],
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const lines = rows.map((r) => `• ${r.date} balance=${r.balance.toFixed(2)} dailyPnl=${(r.dailyPnl >= 0 ? "+" : "") + r.dailyPnl.toFixed(2)} trades=${r.tradeCount} commission=${r.commissionPaid.toFixed(2)}`);
|
|
155
|
+
return {
|
|
156
|
+
content: [
|
|
157
|
+
{ type: "text", text: `${rows.length} day(s):\n${lines.join("\n")}` },
|
|
158
|
+
{ type: "text", text: JSON.stringify(rows, null, 2) },
|
|
159
|
+
],
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
return makeErrorResult(err);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
export async function getPaperPerformanceMetrics(client, resolver, input) {
|
|
167
|
+
const id = Number(input.paperAccountId ?? 0);
|
|
168
|
+
if (!id)
|
|
169
|
+
return makeErrorResult(new Error("paperAccountId is required"));
|
|
170
|
+
const params = new URLSearchParams();
|
|
171
|
+
if (input.from)
|
|
172
|
+
params.set("from", String(input.from));
|
|
173
|
+
if (input.to)
|
|
174
|
+
params.set("to", String(input.to));
|
|
175
|
+
if (input.recompute === true)
|
|
176
|
+
params.set("recompute", "true");
|
|
177
|
+
const qs = params.toString() ? `?${params}` : "";
|
|
178
|
+
try {
|
|
179
|
+
const userId = await resolver.resolve(client);
|
|
180
|
+
const map = await client.get(`/api/account/${userId}/paper-accounts/${id}/performance-metrics${qs}`);
|
|
181
|
+
const entries = Object.entries(map);
|
|
182
|
+
if (entries.length === 0) {
|
|
183
|
+
return {
|
|
184
|
+
content: [
|
|
185
|
+
{ type: "text", text: "No cached metrics in range. Pass recompute=true to force computation (the controller caches the result)." },
|
|
186
|
+
{ type: "text", text: "{}" },
|
|
187
|
+
],
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
const lines = entries.map(([k, v]) => `• ${k} = ${v}`);
|
|
191
|
+
return {
|
|
192
|
+
content: [
|
|
193
|
+
{ type: "text", text: `${entries.length} metric(s):\n${lines.join("\n")}` },
|
|
194
|
+
{ type: "text", text: JSON.stringify(map, null, 2) },
|
|
195
|
+
],
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
return makeErrorResult(err);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
export async function getPaperPortfolio(client, resolver, input) {
|
|
203
|
+
const id = Number(input.paperAccountId ?? 0);
|
|
204
|
+
if (!id)
|
|
205
|
+
return makeErrorResult(new Error("paperAccountId is required"));
|
|
206
|
+
try {
|
|
207
|
+
const userId = await resolver.resolve(client);
|
|
208
|
+
const p = await client.get(`/api/account/${userId}/paper-accounts/${id}/portfolio`);
|
|
209
|
+
const realizedStr = (p.realizedPnL >= 0 ? "+" : "") + p.realizedPnL.toFixed(2);
|
|
210
|
+
const header = `"${p.name}" (paper #${p.paperAccountId}) balance=${p.currentBalance.toFixed(2)} ` +
|
|
211
|
+
`init=${p.initialBalance.toFixed(2)} realizedPnL=${realizedStr}`;
|
|
212
|
+
if (p.openPositions.length === 0) {
|
|
213
|
+
return {
|
|
214
|
+
content: [
|
|
215
|
+
{ type: "text", text: `${header}\n• no open positions` },
|
|
216
|
+
{ type: "text", text: JSON.stringify(p, null, 2) },
|
|
217
|
+
],
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
const lines = p.openPositions.map((pos) => {
|
|
221
|
+
const upnl = (pos.unrealizedPnL >= 0 ? "+" : "") + pos.unrealizedPnL.toFixed(2);
|
|
222
|
+
return `• ${pos.symbol} qty=${pos.netQty} avg=${pos.avgPrice} unrealizedPnL=${upnl}`;
|
|
223
|
+
});
|
|
224
|
+
return {
|
|
225
|
+
content: [
|
|
226
|
+
{ type: "text", text: `${header}\n${lines.join("\n")}` },
|
|
227
|
+
{ type: "text", text: JSON.stringify(p, null, 2) },
|
|
228
|
+
],
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
return makeErrorResult(err);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=paper-trading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paper-trading.js","sourceRoot":"","sources":["../../src/tools/paper-trading.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { getPaperPortfolio, getPaperPerformanceMetrics, } from "./paper-trading.js";
|
|
3
|
+
const makeClient = (overrides = {}) => ({
|
|
4
|
+
get: overrides.get ?? (() => Promise.resolve({})),
|
|
5
|
+
post: () => Promise.resolve({}),
|
|
6
|
+
patch: () => Promise.resolve({}),
|
|
7
|
+
delete: () => Promise.resolve({}),
|
|
8
|
+
});
|
|
9
|
+
const makeResolver = (userId = 42) => ({ resolve: async () => userId });
|
|
10
|
+
// ─── getPaperPortfolio (Phase 3: new endpoint) ──────────────────────────────
|
|
11
|
+
describe("getPaperPortfolio", () => {
|
|
12
|
+
const PORTFOLIO = {
|
|
13
|
+
paperAccountId: 7,
|
|
14
|
+
name: "Demo Paper",
|
|
15
|
+
currentBalance: 101250,
|
|
16
|
+
initialBalance: 100000,
|
|
17
|
+
realizedPnL: 1250,
|
|
18
|
+
openPositions: [
|
|
19
|
+
{ symbol: "MYMM6", netQty: 2, avgPrice: 49500, unrealizedPnL: 30 },
|
|
20
|
+
{ symbol: "MESM6", netQty: -1, avgPrice: 5320.25, unrealizedPnL: -15.5 },
|
|
21
|
+
],
|
|
22
|
+
};
|
|
23
|
+
it("returns formatted summary with current balance, realized P&L, and open positions", async () => {
|
|
24
|
+
const result = await getPaperPortfolio(makeClient({ get: () => Promise.resolve(PORTFOLIO) }), makeResolver(), { paperAccountId: 7 });
|
|
25
|
+
expect(result.isError).toBeUndefined();
|
|
26
|
+
expect(result.content[0].text).toContain("Demo Paper");
|
|
27
|
+
expect(result.content[0].text).toContain("MYMM6");
|
|
28
|
+
expect(result.content[0].text).toContain("MESM6");
|
|
29
|
+
expect(result.content[0].text).toContain("+1250");
|
|
30
|
+
});
|
|
31
|
+
it("hits the /portfolio endpoint with the user id and account id", async () => {
|
|
32
|
+
let calledPath = "";
|
|
33
|
+
const client = makeClient({
|
|
34
|
+
get: (path) => {
|
|
35
|
+
calledPath = path;
|
|
36
|
+
return Promise.resolve(PORTFOLIO);
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
await getPaperPortfolio(client, makeResolver(42), { paperAccountId: 7 });
|
|
40
|
+
expect(calledPath).toBe("/api/account/42/paper-accounts/7/portfolio");
|
|
41
|
+
});
|
|
42
|
+
it("returns a flat-position message when openPositions is empty", async () => {
|
|
43
|
+
const flat = { ...PORTFOLIO, openPositions: [], realizedPnL: 0 };
|
|
44
|
+
const result = await getPaperPortfolio(makeClient({ get: () => Promise.resolve(flat) }), makeResolver(), { paperAccountId: 7 });
|
|
45
|
+
expect(result.isError).toBeUndefined();
|
|
46
|
+
expect(result.content[0].text).toMatch(/no open positions/i);
|
|
47
|
+
});
|
|
48
|
+
it("returns isError when paperAccountId is missing", async () => {
|
|
49
|
+
const result = await getPaperPortfolio(makeClient(), makeResolver(), {});
|
|
50
|
+
expect(result.isError).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
it("returns isError on API failure", async () => {
|
|
53
|
+
const result = await getPaperPortfolio(makeClient({ get: () => Promise.reject(new Error("500")) }), makeResolver(), { paperAccountId: 7 });
|
|
54
|
+
expect(result.isError).toBe(true);
|
|
55
|
+
});
|
|
56
|
+
it("includes JSON in second content block", async () => {
|
|
57
|
+
const result = await getPaperPortfolio(makeClient({ get: () => Promise.resolve(PORTFOLIO) }), makeResolver(), { paperAccountId: 7 });
|
|
58
|
+
expect(JSON.parse(result.content[1].text)).toMatchObject({ paperAccountId: 7 });
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
// ─── getPaperPerformanceMetrics — recompute arg (Phase 3) ───────────────────
|
|
62
|
+
describe("getPaperPerformanceMetrics with recompute", () => {
|
|
63
|
+
it("passes recompute=true as a query string when input.recompute is true", async () => {
|
|
64
|
+
let calledPath = "";
|
|
65
|
+
const client = makeClient({
|
|
66
|
+
get: (path) => {
|
|
67
|
+
calledPath = path;
|
|
68
|
+
return Promise.resolve({ totalReturn: 0.05 });
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
await getPaperPerformanceMetrics(client, makeResolver(42), {
|
|
72
|
+
paperAccountId: 7,
|
|
73
|
+
recompute: true,
|
|
74
|
+
});
|
|
75
|
+
expect(calledPath).toContain("recompute=true");
|
|
76
|
+
expect(calledPath).toBe("/api/account/42/paper-accounts/7/performance-metrics?recompute=true");
|
|
77
|
+
});
|
|
78
|
+
it("omits recompute from the query string when input.recompute is false or absent", async () => {
|
|
79
|
+
let calledPath = "";
|
|
80
|
+
const client = makeClient({
|
|
81
|
+
get: (path) => {
|
|
82
|
+
calledPath = path;
|
|
83
|
+
return Promise.resolve({});
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
await getPaperPerformanceMetrics(client, makeResolver(42), { paperAccountId: 7 });
|
|
87
|
+
expect(calledPath).not.toContain("recompute");
|
|
88
|
+
});
|
|
89
|
+
it("combines recompute with from/to query params", async () => {
|
|
90
|
+
let calledPath = "";
|
|
91
|
+
const client = makeClient({
|
|
92
|
+
get: (path) => {
|
|
93
|
+
calledPath = path;
|
|
94
|
+
return Promise.resolve({});
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
await getPaperPerformanceMetrics(client, makeResolver(42), {
|
|
98
|
+
paperAccountId: 7,
|
|
99
|
+
recompute: true,
|
|
100
|
+
from: "2026-01-01",
|
|
101
|
+
to: "2026-06-01",
|
|
102
|
+
});
|
|
103
|
+
expect(calledPath).toContain("recompute=true");
|
|
104
|
+
expect(calledPath).toContain("from=2026-01-01");
|
|
105
|
+
expect(calledPath).toContain("to=2026-06-01");
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=paper-trading.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paper-trading.test.js","sourceRoot":"","sources":["../../src/tools/paper-trading.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { apiErrorText } from "../client.js";
|
|
2
|
+
export async function pingVantage(client) {
|
|
3
|
+
try {
|
|
4
|
+
const health = await client.get("/health");
|
|
5
|
+
const version = health.version ? ` Version: ${health.version}.` : "";
|
|
6
|
+
const env = health.environment ? ` Environment: ${health.environment}.` : "";
|
|
7
|
+
const text = `VantagePipe is reachable.${version}${env}`;
|
|
8
|
+
return { content: [{ type: "text", text }] };
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
return {
|
|
12
|
+
content: [
|
|
13
|
+
{
|
|
14
|
+
type: "text",
|
|
15
|
+
text: `Could not reach VantagePipe: ${apiErrorText(err)}`,
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
isError: true,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=ping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ping.js","sourceRoot":"","sources":["../../src/tools/ping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,cAAc,CAAC;AAU3D,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAqB;IAErB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAiB,SAAS,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,GAAG,4BAA4B,OAAO,GAAG,GAAG,EAAE,CAAC;QACzD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,gCAAgC,YAAY,CAAC,GAAG,CAAC,EAAE;iBAC1D;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { pingVantage } from "./ping.js";
|
|
3
|
+
const makeClient = (getImpl) => ({ get: getImpl });
|
|
4
|
+
describe("ping_vantage", () => {
|
|
5
|
+
it("returns ok message with version when health responds", async () => {
|
|
6
|
+
const client = makeClient(() => Promise.resolve({ ok: true, version: "1.2.3", environment: "prod" }));
|
|
7
|
+
const result = await pingVantage(client);
|
|
8
|
+
expect(result.isError).toBeUndefined();
|
|
9
|
+
expect(result.content[0].text).toContain("1.2.3");
|
|
10
|
+
expect(result.content[0].text).toContain("prod");
|
|
11
|
+
});
|
|
12
|
+
it("returns ok message without version when health has no version field", async () => {
|
|
13
|
+
const client = makeClient(() => Promise.resolve({ ok: true }));
|
|
14
|
+
const result = await pingVantage(client);
|
|
15
|
+
expect(result.isError).toBeUndefined();
|
|
16
|
+
expect(result.content[0].text).toBe("VantagePipe is reachable.");
|
|
17
|
+
});
|
|
18
|
+
it("returns isError true when API call throws", async () => {
|
|
19
|
+
const client = makeClient(() => Promise.reject(new Error("network error")));
|
|
20
|
+
const result = await pingVantage(client);
|
|
21
|
+
expect(result.isError).toBe(true);
|
|
22
|
+
expect(result.content[0].text).toContain("network error");
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=ping.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ping.test.js","sourceRoot":"","sources":["../../src/tools/ping.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAkB,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,MAAM,UAAU,GAAG,CAAC,OAA+B,EAAE,EAAE,CACrD,CAAC,EAAE,GAAG,EAAE,OAAO,EAA+B,CAAA,CAAC;AAEjD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAC7B,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CACrE,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { VantageClient } from "../client.js";
|
|
2
|
+
import { UserResolver, ToolResult } from "../user.js";
|
|
3
|
+
export declare function listQcAlgorithms(client: VantageClient, _resolver: UserResolver, _input: Record<string, unknown>): Promise<ToolResult>;
|
|
4
|
+
export declare function getQcAlgorithm(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
5
|
+
export declare function getAlgorithmFile(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
6
|
+
export declare function createQcAlgorithm(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
7
|
+
export declare function updateQcAlgorithm(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
8
|
+
export declare function listStrategyInstances(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
9
|
+
export declare function getStrategyInstance(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
10
|
+
export declare function launchStrategy(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
11
|
+
export declare function stopStrategy(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
12
|
+
export declare function launchGroup(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
13
|
+
export declare function stopGroup(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
14
|
+
export declare function getStrategyLogs(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
15
|
+
export declare function getStrategyStats(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
16
|
+
export declare function getStrategyOrders(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
17
|
+
export declare function getStrategyTrades(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
18
|
+
export declare function getStrategySessions(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|