@vantagestack/mcp-server 0.1.59 → 0.1.63

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.
Files changed (115) hide show
  1. package/dist/client.d.ts +25 -0
  2. package/dist/client.js +172 -0
  3. package/dist/client.js.map +1 -0
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.js +1424 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/tools/account-deletion.d.ts +6 -0
  8. package/dist/tools/account-deletion.js +92 -0
  9. package/dist/tools/account-deletion.js.map +1 -0
  10. package/dist/tools/account-health.d.ts +21 -0
  11. package/dist/tools/account-health.js +84 -0
  12. package/dist/tools/account-health.js.map +1 -0
  13. package/dist/tools/account.d.ts +19 -0
  14. package/dist/tools/account.js +291 -0
  15. package/dist/tools/account.js.map +1 -0
  16. package/dist/tools/account.test.d.ts +1 -0
  17. package/dist/tools/account.test.js +213 -0
  18. package/dist/tools/account.test.js.map +1 -0
  19. package/dist/tools/admin-test.d.ts +18 -0
  20. package/dist/tools/admin-test.js +108 -0
  21. package/dist/tools/admin-test.js.map +1 -0
  22. package/dist/tools/calendar.d.ts +4 -0
  23. package/dist/tools/calendar.js +85 -0
  24. package/dist/tools/calendar.js.map +1 -0
  25. package/dist/tools/calendar.test.d.ts +1 -0
  26. package/dist/tools/calendar.test.js +62 -0
  27. package/dist/tools/calendar.test.js.map +1 -0
  28. package/dist/tools/canary.d.ts +4 -0
  29. package/dist/tools/canary.js +25 -0
  30. package/dist/tools/canary.js.map +1 -0
  31. package/dist/tools/canary.test.d.ts +1 -0
  32. package/dist/tools/canary.test.js +46 -0
  33. package/dist/tools/canary.test.js.map +1 -0
  34. package/dist/tools/contract-configs.d.ts +9 -0
  35. package/dist/tools/contract-configs.js +187 -0
  36. package/dist/tools/contract-configs.js.map +1 -0
  37. package/dist/tools/contract-configs.test.d.ts +1 -0
  38. package/dist/tools/contract-configs.test.js +245 -0
  39. package/dist/tools/contract-configs.test.js.map +1 -0
  40. package/dist/tools/copier.d.ts +11 -0
  41. package/dist/tools/copier.js +52 -0
  42. package/dist/tools/copier.js.map +1 -0
  43. package/dist/tools/copier.test.d.ts +1 -0
  44. package/dist/tools/copier.test.js +75 -0
  45. package/dist/tools/copier.test.js.map +1 -0
  46. package/dist/tools/groups.d.ts +14 -0
  47. package/dist/tools/groups.js +44 -0
  48. package/dist/tools/groups.js.map +1 -0
  49. package/dist/tools/groups.test.d.ts +1 -0
  50. package/dist/tools/groups.test.js +72 -0
  51. package/dist/tools/groups.test.js.map +1 -0
  52. package/dist/tools/ip-allowlist.d.ts +6 -0
  53. package/dist/tools/ip-allowlist.js +69 -0
  54. package/dist/tools/ip-allowlist.js.map +1 -0
  55. package/dist/tools/journal.d.ts +6 -0
  56. package/dist/tools/journal.js +110 -0
  57. package/dist/tools/journal.js.map +1 -0
  58. package/dist/tools/journal.test.d.ts +1 -0
  59. package/dist/tools/journal.test.js +100 -0
  60. package/dist/tools/journal.test.js.map +1 -0
  61. package/dist/tools/latency.d.ts +3 -0
  62. package/dist/tools/latency.js +54 -0
  63. package/dist/tools/latency.js.map +1 -0
  64. package/dist/tools/market-history.d.ts +4 -0
  65. package/dist/tools/market-history.js +50 -0
  66. package/dist/tools/market-history.js.map +1 -0
  67. package/dist/tools/market-hours.d.ts +3 -0
  68. package/dist/tools/market-hours.js +19 -0
  69. package/dist/tools/market-hours.js.map +1 -0
  70. package/dist/tools/paper-trading.d.ts +12 -0
  71. package/dist/tools/paper-trading.js +284 -0
  72. package/dist/tools/paper-trading.js.map +1 -0
  73. package/dist/tools/paper-trading.test.d.ts +1 -0
  74. package/dist/tools/paper-trading.test.js +153 -0
  75. package/dist/tools/paper-trading.test.js.map +1 -0
  76. package/dist/tools/ping.d.ts +8 -0
  77. package/dist/tools/ping.js +22 -0
  78. package/dist/tools/ping.js.map +1 -0
  79. package/dist/tools/ping.test.d.ts +1 -0
  80. package/dist/tools/ping.test.js +25 -0
  81. package/dist/tools/ping.test.js.map +1 -0
  82. package/dist/tools/qc.d.ts +18 -0
  83. package/dist/tools/qc.js +418 -0
  84. package/dist/tools/qc.js.map +1 -0
  85. package/dist/tools/qc.test.d.ts +1 -0
  86. package/dist/tools/qc.test.js +218 -0
  87. package/dist/tools/qc.test.js.map +1 -0
  88. package/dist/tools/read.d.ts +7 -0
  89. package/dist/tools/read.js +154 -0
  90. package/dist/tools/read.js.map +1 -0
  91. package/dist/tools/read.test.d.ts +1 -0
  92. package/dist/tools/read.test.js +102 -0
  93. package/dist/tools/read.test.js.map +1 -0
  94. package/dist/tools/risk.d.ts +7 -0
  95. package/dist/tools/risk.js +108 -0
  96. package/dist/tools/risk.js.map +1 -0
  97. package/dist/tools/signal-templates.d.ts +6 -0
  98. package/dist/tools/signal-templates.js +90 -0
  99. package/dist/tools/signal-templates.js.map +1 -0
  100. package/dist/tools/signals.d.ts +8 -0
  101. package/dist/tools/signals.js +318 -0
  102. package/dist/tools/signals.js.map +1 -0
  103. package/dist/tools/signals.test.d.ts +1 -0
  104. package/dist/tools/signals.test.js +92 -0
  105. package/dist/tools/signals.test.js.map +1 -0
  106. package/dist/tools/sync-accounts.d.ts +18 -0
  107. package/dist/tools/sync-accounts.js +68 -0
  108. package/dist/tools/sync-accounts.js.map +1 -0
  109. package/dist/tools/trade.d.ts +3 -0
  110. package/dist/tools/trade.js +49 -0
  111. package/dist/tools/trade.js.map +1 -0
  112. package/dist/user.d.ts +19 -0
  113. package/dist/user.js +21 -0
  114. package/dist/user.js.map +1 -0
  115. 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,3 @@
1
+ import { VantageClient } from "../client.js";
2
+ import { UserResolver, ToolResult } from "../user.js";
3
+ export declare function getMarketHours(client: VantageClient, _resolver: UserResolver, _input: Record<string, unknown>): Promise<ToolResult>;
@@ -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,12 @@
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>;
12
+ export declare function exportPaperAccount(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
@@ -0,0 +1,284 @@
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
+ const fillInfo = ` fill=${a.marketPriceType} slip=${a.slippageTicks}tks comm=${a.commissionPerContract}/ct`;
7
+ return `• #${a.id} "${a.name}" balance=${a.currentBalance.toFixed(2)} init=${a.initialBalance.toFixed(2)} pnl=${pnlStr}${fillInfo}${flag}`;
8
+ }
9
+ export async function listPaperAccounts(client, resolver, _input) {
10
+ try {
11
+ const userId = await resolver.resolve(client);
12
+ const rows = await client.get(`/api/account/${userId}/paper-accounts`);
13
+ if (!rows.length) {
14
+ return {
15
+ content: [
16
+ { type: "text", text: "No paper accounts. Use create_paper_account to make one." },
17
+ { type: "text", text: "[]" },
18
+ ],
19
+ };
20
+ }
21
+ return {
22
+ content: [
23
+ { type: "text", text: `${rows.length} paper account(s):\n${rows.map(formatAccount).join("\n")}` },
24
+ { type: "text", text: JSON.stringify(rows, null, 2) },
25
+ ],
26
+ };
27
+ }
28
+ catch (err) {
29
+ return makeErrorResult(err);
30
+ }
31
+ }
32
+ export async function getPaperAccount(client, resolver, input) {
33
+ const id = Number(input.paperAccountId ?? 0);
34
+ if (!id)
35
+ return makeErrorResult(new Error("paperAccountId is required"));
36
+ try {
37
+ const userId = await resolver.resolve(client);
38
+ const a = await client.get(`/api/account/${userId}/paper-accounts/${id}`);
39
+ return {
40
+ content: [
41
+ { type: "text", text: formatAccount(a) },
42
+ { type: "text", text: JSON.stringify(a, null, 2) },
43
+ ],
44
+ };
45
+ }
46
+ catch (err) {
47
+ return makeErrorResult(err);
48
+ }
49
+ }
50
+ export async function createPaperAccount(client, resolver, input) {
51
+ const name = input.name !== undefined ? String(input.name) : undefined;
52
+ const initialBalance = input.initialBalance !== undefined ? Number(input.initialBalance) : undefined;
53
+ const marketPriceType = input.marketPriceType !== undefined ? String(input.marketPriceType) : undefined;
54
+ const slippageTicks = input.slippageTicks !== undefined ? Number(input.slippageTicks) : undefined;
55
+ const commissionPerContract = input.commissionPerContract !== undefined ? Number(input.commissionPerContract) : undefined;
56
+ try {
57
+ const userId = await resolver.resolve(client);
58
+ const a = await client.post(`/api/account/${userId}/paper-accounts`, { name, initialBalance, marketPriceType, slippageTicks, commissionPerContract });
59
+ return {
60
+ content: [
61
+ { type: "text", text: `Created paper account #${a.id}: ${formatAccount(a)}` },
62
+ { type: "text", text: JSON.stringify(a, null, 2) },
63
+ ],
64
+ };
65
+ }
66
+ catch (err) {
67
+ return makeErrorResult(err);
68
+ }
69
+ }
70
+ export async function updatePaperAccount(client, resolver, input) {
71
+ const id = Number(input.paperAccountId ?? 0);
72
+ if (!id)
73
+ return makeErrorResult(new Error("paperAccountId is required"));
74
+ const body = {};
75
+ if (input.name !== undefined)
76
+ body.name = String(input.name);
77
+ if (input.isEnabled !== undefined)
78
+ body.isEnabled = Boolean(input.isEnabled);
79
+ if (input.marketPriceType !== undefined)
80
+ body.marketPriceType = String(input.marketPriceType);
81
+ if (input.slippageTicks !== undefined)
82
+ body.slippageTicks = Number(input.slippageTicks);
83
+ if (input.commissionPerContract !== undefined)
84
+ body.commissionPerContract = Number(input.commissionPerContract);
85
+ if (Object.keys(body).length === 0)
86
+ return makeErrorResult(new Error("at least one of name / isEnabled / marketPriceType / slippageTicks / commissionPerContract is required"));
87
+ try {
88
+ const userId = await resolver.resolve(client);
89
+ const a = await client.patch(`/api/account/${userId}/paper-accounts/${id}`, body);
90
+ return {
91
+ content: [
92
+ { type: "text", text: `Updated paper account: ${formatAccount(a)}` },
93
+ { type: "text", text: JSON.stringify(a, null, 2) },
94
+ ],
95
+ };
96
+ }
97
+ catch (err) {
98
+ return makeErrorResult(err);
99
+ }
100
+ }
101
+ export async function deletePaperAccount(client, resolver, input) {
102
+ const id = Number(input.paperAccountId ?? 0);
103
+ if (!id)
104
+ return makeErrorResult(new Error("paperAccountId is required"));
105
+ try {
106
+ const userId = await resolver.resolve(client);
107
+ await client.delete(`/api/account/${userId}/paper-accounts/${id}`);
108
+ return {
109
+ content: [
110
+ { type: "text", text: `Deleted paper account #${id} (balance history, cash adjustments, and cached metrics cascaded).` },
111
+ ],
112
+ };
113
+ }
114
+ catch (err) {
115
+ return makeErrorResult(err);
116
+ }
117
+ }
118
+ export async function addPaperCashAdjustment(client, resolver, input) {
119
+ const id = Number(input.paperAccountId ?? 0);
120
+ if (!id)
121
+ return makeErrorResult(new Error("paperAccountId is required"));
122
+ if (input.amount === undefined)
123
+ return makeErrorResult(new Error("amount is required"));
124
+ if (input.reason === undefined)
125
+ return makeErrorResult(new Error("reason is required"));
126
+ const amount = Number(input.amount);
127
+ const reason = String(input.reason);
128
+ try {
129
+ const userId = await resolver.resolve(client);
130
+ const adj = await client.post(`/api/account/${userId}/paper-accounts/${id}/cash-adjustments`, { amount, reason });
131
+ const sign = adj.amount >= 0 ? "+" : "";
132
+ return {
133
+ content: [
134
+ { type: "text", text: `Recorded adjustment ${sign}${adj.amount} (${adj.reason}); new balance=${adj.newBalance}` },
135
+ { type: "text", text: JSON.stringify(adj, null, 2) },
136
+ ],
137
+ };
138
+ }
139
+ catch (err) {
140
+ return makeErrorResult(err);
141
+ }
142
+ }
143
+ export async function getPaperBalanceHistory(client, resolver, input) {
144
+ const id = Number(input.paperAccountId ?? 0);
145
+ if (!id)
146
+ return makeErrorResult(new Error("paperAccountId is required"));
147
+ const params = new URLSearchParams();
148
+ if (input.from)
149
+ params.set("from", String(input.from));
150
+ if (input.to)
151
+ params.set("to", String(input.to));
152
+ const qs = params.toString() ? `?${params}` : "";
153
+ try {
154
+ const userId = await resolver.resolve(client);
155
+ const rows = await client.get(`/api/account/${userId}/paper-accounts/${id}/balance-history${qs}`);
156
+ if (!rows.length) {
157
+ return {
158
+ content: [
159
+ { type: "text", text: "No balance history rows in range." },
160
+ { type: "text", text: "[]" },
161
+ ],
162
+ };
163
+ }
164
+ 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)}`);
165
+ return {
166
+ content: [
167
+ { type: "text", text: `${rows.length} day(s):\n${lines.join("\n")}` },
168
+ { type: "text", text: JSON.stringify(rows, null, 2) },
169
+ ],
170
+ };
171
+ }
172
+ catch (err) {
173
+ return makeErrorResult(err);
174
+ }
175
+ }
176
+ export async function getPaperPerformanceMetrics(client, resolver, input) {
177
+ const id = Number(input.paperAccountId ?? 0);
178
+ if (!id)
179
+ return makeErrorResult(new Error("paperAccountId is required"));
180
+ const params = new URLSearchParams();
181
+ if (input.from)
182
+ params.set("from", String(input.from));
183
+ if (input.to)
184
+ params.set("to", String(input.to));
185
+ if (input.recompute === true)
186
+ params.set("recompute", "true");
187
+ const qs = params.toString() ? `?${params}` : "";
188
+ try {
189
+ const userId = await resolver.resolve(client);
190
+ const map = await client.get(`/api/account/${userId}/paper-accounts/${id}/performance-metrics${qs}`);
191
+ const entries = Object.entries(map);
192
+ if (entries.length === 0) {
193
+ return {
194
+ content: [
195
+ { type: "text", text: "No cached metrics in range. Pass recompute=true to force computation (the controller caches the result)." },
196
+ { type: "text", text: "{}" },
197
+ ],
198
+ };
199
+ }
200
+ const lines = entries.map(([k, v]) => `• ${k} = ${v}`);
201
+ return {
202
+ content: [
203
+ { type: "text", text: `${entries.length} metric(s):\n${lines.join("\n")}` },
204
+ { type: "text", text: JSON.stringify(map, null, 2) },
205
+ ],
206
+ };
207
+ }
208
+ catch (err) {
209
+ return makeErrorResult(err);
210
+ }
211
+ }
212
+ export async function getPaperPortfolio(client, resolver, input) {
213
+ const id = Number(input.paperAccountId ?? 0);
214
+ if (!id)
215
+ return makeErrorResult(new Error("paperAccountId is required"));
216
+ try {
217
+ const userId = await resolver.resolve(client);
218
+ const p = await client.get(`/api/account/${userId}/paper-accounts/${id}/portfolio`);
219
+ const realizedStr = (p.realizedPnL >= 0 ? "+" : "") + p.realizedPnL.toFixed(2);
220
+ const header = `"${p.name}" (paper #${p.paperAccountId}) balance=${p.currentBalance.toFixed(2)} ` +
221
+ `init=${p.initialBalance.toFixed(2)} realizedPnL=${realizedStr}`;
222
+ if (p.openPositions.length === 0) {
223
+ return {
224
+ content: [
225
+ { type: "text", text: `${header}\n• no open positions` },
226
+ { type: "text", text: JSON.stringify(p, null, 2) },
227
+ ],
228
+ };
229
+ }
230
+ const lines = p.openPositions.map((pos) => {
231
+ const upnl = pos.unrealizedPnL == null ? "N/A"
232
+ : (pos.unrealizedPnL >= 0 ? "+" : "") + pos.unrealizedPnL.toFixed(2);
233
+ const avg = pos.avgPrice == null ? "N/A" : pos.avgPrice.toFixed(2);
234
+ return `• ${pos.symbol} qty=${pos.netQty} avg=${avg} unrealizedPnL=${upnl}`;
235
+ });
236
+ return {
237
+ content: [
238
+ { type: "text", text: `${header}\n${lines.join("\n")}` },
239
+ { type: "text", text: JSON.stringify(p, null, 2) },
240
+ ],
241
+ };
242
+ }
243
+ catch (err) {
244
+ return makeErrorResult(err);
245
+ }
246
+ }
247
+ export async function exportPaperAccount(client, resolver, input) {
248
+ const id = Number(input.paperAccountId ?? 0);
249
+ if (!id)
250
+ return makeErrorResult(new Error("paperAccountId is required"));
251
+ const format = String(input.format ?? "json").toLowerCase();
252
+ if (format !== "json" && format !== "csv")
253
+ return makeErrorResult(new Error("format must be 'csv' or 'json'"));
254
+ const qs = [`format=${format}`];
255
+ if (input.from)
256
+ qs.push(`from=${encodeURIComponent(String(input.from))}`);
257
+ if (input.to)
258
+ qs.push(`to=${encodeURIComponent(String(input.to))}`);
259
+ const path = `/api/account/{userId}/paper-accounts/${id}/export?${qs.join("&")}`;
260
+ try {
261
+ const userId = await resolver.resolve(client);
262
+ const resolved = path.replace("{userId}", String(userId));
263
+ if (format === "csv") {
264
+ const csv = await client.getText(resolved);
265
+ return { content: [{ type: "text", text: csv }] };
266
+ }
267
+ const bundle = await client.get(resolved);
268
+ const header = `"${bundle.account.name}" (paper #${bundle.account.id}) ` +
269
+ `range ${bundle.range.from}…${bundle.range.to}: ` +
270
+ `${bundle.balanceHistory.length} balance rows, ` +
271
+ `${bundle.cashAdjustments.length} cash adjustments, ` +
272
+ `${bundle.trades.length} closed trades`;
273
+ return {
274
+ content: [
275
+ { type: "text", text: header },
276
+ { type: "text", text: JSON.stringify(bundle, null, 2) },
277
+ ],
278
+ };
279
+ }
280
+ catch (err) {
281
+ return makeErrorResult(err);
282
+ }
283
+ }
284
+ //# 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,153 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { getPaperPortfolio, getPaperPerformanceMetrics, exportPaperAccount, } 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
+ // ─── exportPaperAccount (Phase 4: wi-b8pc2) ─────────────────────────────────
109
+ describe("exportPaperAccount", () => {
110
+ const BUNDLE = {
111
+ exportedAt: "2026-06-07T00:00:00Z",
112
+ account: { id: 7, name: "Demo Paper", initialBalance: 100000, currentBalance: 101250 },
113
+ range: { from: "2026-05-01", to: "2026-05-31" },
114
+ balanceHistory: [{ date: "2026-05-01" }],
115
+ cashAdjustments: [{ id: 1 }, { id: 2 }],
116
+ trades: [{ id: 10 }],
117
+ };
118
+ const makeExportClient = (overrides = {}) => ({
119
+ get: overrides.get ?? (() => Promise.resolve(BUNDLE)),
120
+ getText: overrides.getText ?? (() => Promise.resolve("# balance_history\n")),
121
+ post: () => Promise.resolve({}),
122
+ patch: () => Promise.resolve({}),
123
+ delete: () => Promise.resolve({}),
124
+ });
125
+ it("defaults to json and summarizes the three sections", async () => {
126
+ let calledPath = "";
127
+ const result = await exportPaperAccount(makeExportClient({ get: (p) => { calledPath = p; return Promise.resolve(BUNDLE); } }), makeResolver(42), { paperAccountId: 7 });
128
+ expect(calledPath).toBe("/api/account/42/paper-accounts/7/export?format=json");
129
+ const text = result.content[0].text;
130
+ expect(text).toContain("1 balance rows");
131
+ expect(text).toContain("2 cash adjustments");
132
+ expect(text).toContain("1 closed trades");
133
+ });
134
+ it("requests CSV via getText and returns it verbatim", async () => {
135
+ let calledPath = "";
136
+ const result = await exportPaperAccount(makeExportClient({ getText: (p) => { calledPath = p; return Promise.resolve("# balance_history\nfoo"); } }), makeResolver(42), { paperAccountId: 7, format: "csv", from: "2026-05-01", to: "2026-05-31" });
137
+ expect(calledPath).toContain("format=csv");
138
+ expect(calledPath).toContain("from=2026-05-01");
139
+ expect(calledPath).toContain("to=2026-05-31");
140
+ expect(result.content[0].text).toBe("# balance_history\nfoo");
141
+ });
142
+ it("rejects an unknown format", async () => {
143
+ const result = await exportPaperAccount(makeExportClient(), makeResolver(), {
144
+ paperAccountId: 7, format: "xml",
145
+ });
146
+ expect(result.isError).toBe(true);
147
+ });
148
+ it("requires paperAccountId", async () => {
149
+ const result = await exportPaperAccount(makeExportClient(), makeResolver(), {});
150
+ expect(result.isError).toBe(true);
151
+ });
152
+ });
153
+ //# 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,8 @@
1
+ import { VantageClient } from "../client.js";
2
+ export declare function pingVantage(client: VantageClient): Promise<{
3
+ content: Array<{
4
+ type: "text";
5
+ text: string;
6
+ }>;
7
+ isError?: true;
8
+ }>;
@@ -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 {};