@vantagestack/mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,74 @@
1
+ # VantagePipe MCP Server
2
+
3
+ MCP server for [VantagePipe](https://app.vantage-stack.com) — lets AI coding agents send trading signals, read position state, and monitor broker connections through natural language.
4
+
5
+ ## Quick start
6
+
7
+ ```bash
8
+ VANTAGE_API_KEY=vp_live_... npx @vantagestack/mcp-server
9
+ ```
10
+
11
+ ## Setup
12
+
13
+ ### 1. Get an API key
14
+
15
+ Log in to VantagePipe → Settings → API Keys → Create key. Copy the full `vp_live_...` key.
16
+
17
+ ### 2. Add to Claude Code
18
+
19
+ In your project, add to `.claude/settings.local.json`:
20
+
21
+ ```json
22
+ {
23
+ "mcpServers": {
24
+ "vantage": {
25
+ "command": "npx",
26
+ "args": ["-y", "@vantagestack/mcp-server"],
27
+ "env": {
28
+ "VANTAGE_API_KEY": "vp_live_your_key_here"
29
+ }
30
+ }
31
+ }
32
+ }
33
+ ```
34
+
35
+ ### 3. Add to Claude Desktop
36
+
37
+ In `~/Library/Application Support/Claude/claude_desktop_config.json`:
38
+
39
+ ```json
40
+ {
41
+ "mcpServers": {
42
+ "vantage": {
43
+ "command": "npx",
44
+ "args": ["-y", "@vantagestack/mcp-server"],
45
+ "env": {
46
+ "VANTAGE_API_KEY": "vp_live_your_key_here"
47
+ }
48
+ }
49
+ }
50
+ }
51
+ ```
52
+
53
+ ## Environment variables
54
+
55
+ | Variable | Required | Default | Description |
56
+ |---|---|---|---|
57
+ | `VANTAGE_API_KEY` | Yes | — | Your VantagePipe API key (`vp_{env}_{id}_{secret}`) |
58
+ | `VANTAGE_API_ORIGIN` | No | `https://app.vantage-stack.com` | Override for local development |
59
+
60
+ ## Available tools
61
+
62
+ | Tool | Description |
63
+ |---|---|
64
+ | `ping_vantage` | Check connectivity and API key validity |
65
+
66
+ More tools arriving in AGNT-02 (signal actions) and AGNT-03 (read + inspection).
67
+
68
+ ## Development
69
+
70
+ ```bash
71
+ npm install
72
+ npm run build
73
+ npm test
74
+ ```
@@ -0,0 +1,20 @@
1
+ export interface VantageConfig {
2
+ apiKey: string;
3
+ origin: string;
4
+ }
5
+ export declare function loadConfig(): VantageConfig;
6
+ export declare function validateStartup(config: VantageConfig): Promise<void>;
7
+ export declare class VantageClient {
8
+ private readonly config;
9
+ constructor(config: VantageConfig);
10
+ get<T>(path: string): Promise<T>;
11
+ post<T>(path: string, body: unknown): Promise<T>;
12
+ postWebhook<T>(groupId: string, secret: string, body: unknown): Promise<T>;
13
+ }
14
+ export declare class VantageApiError extends Error {
15
+ readonly status: number;
16
+ readonly path: string;
17
+ readonly body: string;
18
+ constructor(status: number, path: string, body: string);
19
+ }
20
+ export declare function apiErrorText(err: unknown): string;
package/dist/client.js ADDED
@@ -0,0 +1,104 @@
1
+ const DEFAULT_ORIGIN = "https://app.vantage-stack.com";
2
+ export function loadConfig() {
3
+ const apiKey = process.env.VANTAGE_API_KEY;
4
+ if (!apiKey) {
5
+ console.error("Error: VANTAGE_API_KEY environment variable is required.");
6
+ console.error("Get your API key from VantagePipe → Settings → API Keys.");
7
+ process.exit(1);
8
+ }
9
+ const parts = apiKey.split("_");
10
+ if (parts[0] !== "vp" || parts.length < 4) {
11
+ console.error("Error: VANTAGE_API_KEY format invalid. Expected vp_{env}_{publicId}_{secret} (4 underscore-separated segments).");
12
+ process.exit(1);
13
+ }
14
+ const origin = (process.env.VANTAGE_API_ORIGIN ?? DEFAULT_ORIGIN).replace(/\/$/, "");
15
+ return { apiKey, origin };
16
+ }
17
+ export async function validateStartup(config) {
18
+ const url = `${config.origin}/health`;
19
+ let res;
20
+ try {
21
+ res = await fetch(url, { signal: AbortSignal.timeout(8000) });
22
+ }
23
+ catch (err) {
24
+ console.error(`Error: Cannot reach VantagePipe at ${config.origin}/health`);
25
+ console.error(" Check VANTAGE_API_ORIGIN or your network connection.");
26
+ console.error(` Cause: ${err instanceof Error ? err.message : String(err)}`);
27
+ process.exit(1);
28
+ }
29
+ if (!res.ok) {
30
+ console.error(`Error: VantagePipe health check returned HTTP ${res.status} at ${url}`);
31
+ process.exit(1);
32
+ }
33
+ }
34
+ export class VantageClient {
35
+ config;
36
+ constructor(config) {
37
+ this.config = config;
38
+ }
39
+ async get(path) {
40
+ const res = await fetch(`${this.config.origin}${path}`, {
41
+ headers: {
42
+ Authorization: `Bearer ${this.config.apiKey}`,
43
+ "Content-Type": "application/json",
44
+ },
45
+ });
46
+ if (!res.ok) {
47
+ const body = await res.text().catch(() => "");
48
+ throw new VantageApiError(res.status, path, body);
49
+ }
50
+ return res.json();
51
+ }
52
+ async post(path, body) {
53
+ const res = await fetch(`${this.config.origin}${path}`, {
54
+ method: "POST",
55
+ headers: {
56
+ Authorization: `Bearer ${this.config.apiKey}`,
57
+ "Content-Type": "application/json",
58
+ },
59
+ body: JSON.stringify(body),
60
+ });
61
+ if (!res.ok) {
62
+ const text = await res.text().catch(() => "");
63
+ throw new VantageApiError(res.status, path, text);
64
+ }
65
+ return res.json();
66
+ }
67
+ async postWebhook(groupId, secret, body) {
68
+ const path = `/webhook/group/${groupId}/${secret}`;
69
+ const res = await fetch(`${this.config.origin}${path}`, {
70
+ method: "POST",
71
+ headers: { "Content-Type": "application/json" },
72
+ body: JSON.stringify(body),
73
+ });
74
+ if (!res.ok) {
75
+ const text = await res.text().catch(() => "");
76
+ throw new VantageApiError(res.status, path, text);
77
+ }
78
+ return res.json();
79
+ }
80
+ }
81
+ export class VantageApiError extends Error {
82
+ status;
83
+ path;
84
+ body;
85
+ constructor(status, path, body) {
86
+ super(`VantagePipe API error ${status} on ${path}: ${body}`);
87
+ this.status = status;
88
+ this.path = path;
89
+ this.body = body;
90
+ }
91
+ }
92
+ export function apiErrorText(err) {
93
+ if (err instanceof VantageApiError) {
94
+ try {
95
+ const parsed = JSON.parse(err.body);
96
+ return parsed.error ?? err.message;
97
+ }
98
+ catch {
99
+ return err.message;
100
+ }
101
+ }
102
+ return err instanceof Error ? err.message : String(err);
103
+ }
104
+ //# 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,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,152 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import { loadConfig, validateStartup, VantageClient } from "./client.js";
6
+ import { UserResolver } from "./user.js";
7
+ import { pingVantage } from "./tools/ping.js";
8
+ import { sendSignal, exitPositions, flattenGroup, } from "./tools/signals.js";
9
+ import { listGroups, getGroupState, checkConnections, getSignalHistory, inspectSignal, } from "./tools/read.js";
10
+ const config = loadConfig();
11
+ await validateStartup(config);
12
+ const client = new VantageClient(config);
13
+ const resolver = new UserResolver();
14
+ const server = new Server({ name: "vantage-pipe-mcp", version: "0.1.0" }, { capabilities: { tools: {} } });
15
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
16
+ tools: [
17
+ {
18
+ name: "ping_vantage",
19
+ description: "Check that VantagePipe is reachable and the API key is valid. " +
20
+ "Returns the service version and environment. Run this first when setting up or diagnosing connection issues.",
21
+ inputSchema: { type: "object", properties: {}, required: [] },
22
+ },
23
+ {
24
+ name: "list_groups",
25
+ description: "List all signal groups owned by this account. Returns group IDs, names, account counts, " +
26
+ "and webhook URLs. Use this to discover groupId and secret for send_signal and other tools.",
27
+ inputSchema: { type: "object", properties: {}, required: [] },
28
+ },
29
+ {
30
+ name: "get_group_state",
31
+ description: "Get live account state for a group: open positions, working orders, and stale signals per member. " +
32
+ "The primary 'am I flat?' check. Use before sending signals to understand current exposure.",
33
+ inputSchema: {
34
+ type: "object",
35
+ properties: {
36
+ groupId: { type: "string", description: "Group ID (from list_groups)" },
37
+ secret: { type: "string", description: "Group webhook secret (from list_groups webhookUrl)" },
38
+ },
39
+ required: ["groupId", "secret"],
40
+ },
41
+ },
42
+ {
43
+ name: "check_connections",
44
+ description: "Check broker connection health: connected/disconnected status, token expiry, broker type per connection. " +
45
+ "Run before sending signals if you suspect a connection issue.",
46
+ inputSchema: { type: "object", properties: {}, required: [] },
47
+ },
48
+ {
49
+ name: "get_signal_history",
50
+ description: "Get recent signals for a group with status (executed/partial/failed). " +
51
+ "Supports filtering by ticker, status, and quantity.",
52
+ inputSchema: {
53
+ type: "object",
54
+ properties: {
55
+ groupId: { type: "string", description: "Group ID" },
56
+ limit: { type: "number", description: "Max signals to return (default 50, max 200)" },
57
+ status: { type: "string", description: "Filter by status: executed, partial, failed" },
58
+ ticker: { type: "string", description: "Filter by ticker symbol (e.g. MYM1!)" },
59
+ },
60
+ required: ["groupId"],
61
+ },
62
+ },
63
+ {
64
+ name: "inspect_signal",
65
+ description: "Get full execution detail for a signal ID: broker call log, per-account results, audit trail. " +
66
+ "Use to diagnose why a signal failed or partially executed.",
67
+ inputSchema: {
68
+ type: "object",
69
+ properties: {
70
+ signalId: { type: "string", description: "Signal ID (from get_signal_history or send_signal response)" },
71
+ },
72
+ required: ["signalId"],
73
+ },
74
+ },
75
+ {
76
+ name: "send_signal",
77
+ description: "Send a trading signal to a VantagePipe group. Fans out to all active accounts. " +
78
+ "Actions: buy, sell, exit, add, reduce. Order types: market, limit, stop, stop_limit. " +
79
+ "Same signal within 60s returns the cached result (safe for agent retries). " +
80
+ "For bracket orders use limitPrice (take-profit) and stopLoss together with a market entry.",
81
+ inputSchema: {
82
+ type: "object",
83
+ properties: {
84
+ groupId: { type: "string", description: "Group ID" },
85
+ secret: { type: "string", description: "Group webhook secret" },
86
+ action: { type: "string", description: "buy | sell | exit | add | reduce" },
87
+ ticker: { type: "string", description: "Instrument symbol (e.g. MYM1!, ES1!)" },
88
+ quantity: { type: "number", description: "Number of contracts" },
89
+ orderType: { type: "string", description: "market | limit | stop | stop_limit (default: market)" },
90
+ limitPrice: { type: "number", description: "Limit or take-profit price" },
91
+ stopPrice: { type: "number", description: "Stop entry price" },
92
+ takeProfit: { type: "number", description: "Take-profit offset in points" },
93
+ stopLoss: { type: "number", description: "Stop-loss offset in points" },
94
+ comment: { type: "string", description: "Optional comment (T1_entry, Recoup_entry, etc.)" },
95
+ timeInForce: { type: "string", description: "DAY | GTC | IOC | FOK" },
96
+ },
97
+ required: ["groupId", "secret", "action", "ticker"],
98
+ },
99
+ },
100
+ {
101
+ name: "exit_positions",
102
+ description: "Send an exit signal to a group, closing all open positions for the specified ticker (or all tickers). " +
103
+ "Uses action=exit on the group webhook. Safe to call when already flat — returns success with 0 dispatched.",
104
+ inputSchema: {
105
+ type: "object",
106
+ properties: {
107
+ groupId: { type: "string", description: "Group ID" },
108
+ secret: { type: "string", description: "Group webhook secret" },
109
+ ticker: { type: "string", description: "Ticker to exit (omit to exit all tickers)" },
110
+ comment: { type: "string", description: "Optional comment" },
111
+ },
112
+ required: ["groupId", "secret"],
113
+ },
114
+ },
115
+ {
116
+ name: "flatten_group",
117
+ description: "SAFETY OPERATION: immediately closes ALL open positions and cancels ALL working orders " +
118
+ "across every account in the group via the VantagePipe flatten API. " +
119
+ "Requires confirm: true to prevent accidental execution.",
120
+ inputSchema: {
121
+ type: "object",
122
+ properties: {
123
+ groupId: { type: "string", description: "Group ID" },
124
+ confirm: { type: "boolean", description: "Must be true to execute — prevents accidental flatten" },
125
+ },
126
+ required: ["groupId", "confirm"],
127
+ },
128
+ },
129
+ ],
130
+ }));
131
+ server.setRequestHandler(CallToolRequestSchema, async (req) => {
132
+ const input = (req.params.arguments ?? {});
133
+ switch (req.params.name) {
134
+ case "ping_vantage": return pingVantage(client);
135
+ case "list_groups": return listGroups(client, resolver, input);
136
+ case "get_group_state": return getGroupState(client, resolver, input);
137
+ case "check_connections": return checkConnections(client, resolver, input);
138
+ case "get_signal_history": return getSignalHistory(client, resolver, input);
139
+ case "inspect_signal": return inspectSignal(client, resolver, input);
140
+ case "send_signal": return sendSignal(client, resolver, input);
141
+ case "exit_positions": return exitPositions(client, resolver, input);
142
+ case "flatten_group": return flattenGroup(client, resolver, input);
143
+ default:
144
+ return {
145
+ content: [{ type: "text", text: `Unknown tool: ${req.params.name}` }],
146
+ isError: true,
147
+ };
148
+ }
149
+ });
150
+ const transport = new StdioServerTransport();
151
+ await server.connect(transport);
152
+ //# 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,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 {};
@@ -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,7 @@
1
+ import { VantageClient } from "../client.js";
2
+ import { UserResolver, ToolResult } from "../user.js";
3
+ export declare function listGroups(client: VantageClient, resolver: UserResolver, _input: Record<string, unknown>): Promise<ToolResult>;
4
+ export declare function getGroupState(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
5
+ export declare function checkConnections(client: VantageClient, resolver: UserResolver, _input: Record<string, unknown>): Promise<ToolResult>;
6
+ export declare function getSignalHistory(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
7
+ export declare function inspectSignal(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
@@ -0,0 +1,149 @@
1
+ import { makeErrorResult } from "../user.js";
2
+ export async function listGroups(client, resolver, _input) {
3
+ try {
4
+ const userId = await resolver.resolve(client);
5
+ const groups = await client.get(`/api/account/${userId}/groups`);
6
+ const summary = groups
7
+ .map((g) => `• ${g.name} (id=${g.id}, accounts=${g.accounts?.length ?? 0})`)
8
+ .join("\n");
9
+ return {
10
+ content: [
11
+ { type: "text", text: `${groups.length} group(s):\n${summary}` },
12
+ {
13
+ type: "text",
14
+ text: JSON.stringify(groups.map((g) => ({
15
+ groupId: g.id,
16
+ name: g.name,
17
+ accountCount: g.accounts?.length ?? 0,
18
+ webhookUrl: g.webhookUrl,
19
+ })), null, 2),
20
+ },
21
+ ],
22
+ };
23
+ }
24
+ catch (err) {
25
+ return makeErrorResult(err);
26
+ }
27
+ }
28
+ export async function getGroupState(client, _resolver, input) {
29
+ const groupId = String(input.groupId ?? "");
30
+ const secret = String(input.secret ?? "");
31
+ if (!groupId || !secret)
32
+ return makeErrorResult(new Error("groupId and secret are required"));
33
+ try {
34
+ const state = await client.get(`/webhook/group/${groupId}/${secret}/account-state`);
35
+ const members = state.members ?? [];
36
+ const summaryLines = members.map((m) => {
37
+ const spec = m.accountSpec ?? m.userId ?? "?";
38
+ const positions = m.positions ?? [];
39
+ const orders = m.workingOrders ?? [];
40
+ const posStr = positions.length === 0 ? "FLAT" : `${positions.length} open position(s)`;
41
+ const ordStr = orders.length > 0 ? `, ${orders.length} working order(s)` : "";
42
+ const errStr = m.error ? ` [${m.error}]` : "";
43
+ return `• ${spec}: ${posStr}${ordStr}${errStr}`;
44
+ });
45
+ return {
46
+ content: [
47
+ {
48
+ type: "text",
49
+ text: summaryLines.length > 0 ? summaryLines.join("\n") : "No active accounts in group",
50
+ },
51
+ { type: "text", text: JSON.stringify(state, null, 2) },
52
+ ],
53
+ };
54
+ }
55
+ catch (err) {
56
+ return makeErrorResult(err);
57
+ }
58
+ }
59
+ export async function checkConnections(client, resolver, _input) {
60
+ try {
61
+ const userId = await resolver.resolve(client);
62
+ const connections = await client.get(`/api/account/${userId}/connections`);
63
+ const summaryLines = connections.map((c) => {
64
+ const status = c.isActive && c.isEnabled ? "connected" : "disconnected";
65
+ const expiry = c.accessTokenExpiry
66
+ ? ` (token expires ${new Date(c.accessTokenExpiry).toISOString()})`
67
+ : "";
68
+ return `• ${c.label ?? c.brokerType} [${c.brokerType}]: ${status}${expiry}`;
69
+ });
70
+ return {
71
+ content: [
72
+ {
73
+ type: "text",
74
+ text: connections.length > 0
75
+ ? summaryLines.join("\n")
76
+ : "No connections found",
77
+ },
78
+ { type: "text", text: JSON.stringify(connections, null, 2) },
79
+ ],
80
+ };
81
+ }
82
+ catch (err) {
83
+ return makeErrorResult(err);
84
+ }
85
+ }
86
+ export async function getSignalHistory(client, _resolver, input) {
87
+ const groupId = String(input.groupId ?? "");
88
+ if (!groupId)
89
+ return makeErrorResult(new Error("groupId is required"));
90
+ const params = new URLSearchParams();
91
+ if (input.limit)
92
+ params.set("limit", String(input.limit));
93
+ if (input.status)
94
+ params.set("status", String(input.status));
95
+ if (input.ticker)
96
+ params.set("ticker", String(input.ticker));
97
+ const qs = params.toString() ? `?${params.toString()}` : "";
98
+ try {
99
+ const res = await client.get(`/api/groups/${groupId}/signals${qs}`);
100
+ const signals = res.signals ?? [];
101
+ const lines = signals.map((s) => `• [${s.receivedAt}] ${s.action} ${s.ticker} ${s.status} (id=${s.id})`);
102
+ return {
103
+ content: [
104
+ {
105
+ type: "text",
106
+ text: `${res.total} total signal(s), showing ${signals.length}:\n${lines.join("\n")}`,
107
+ },
108
+ { type: "text", text: JSON.stringify(res, null, 2) },
109
+ ],
110
+ };
111
+ }
112
+ catch (err) {
113
+ return makeErrorResult(err);
114
+ }
115
+ }
116
+ export async function inspectSignal(client, _resolver, input) {
117
+ const signalId = String(input.signalId ?? "");
118
+ if (!signalId)
119
+ return makeErrorResult(new Error("signalId is required"));
120
+ try {
121
+ const [signal, audit] = await Promise.all([
122
+ client.get(`/api/signals/${signalId}`),
123
+ client
124
+ .get(`/api/signals/${signalId}/audit`)
125
+ .catch(() => null),
126
+ ]);
127
+ const summaryParts = [
128
+ `Signal ${signalId}: ${signal.action} ${signal.ticker}`,
129
+ `Status: ${signal.status}`,
130
+ ];
131
+ if (signal.errorMessage)
132
+ summaryParts.push(`Error: ${signal.errorMessage}`);
133
+ if (signal.executedAt)
134
+ summaryParts.push(`Executed: ${signal.executedAt}`);
135
+ return {
136
+ content: [
137
+ { type: "text", text: summaryParts.join(" | ") },
138
+ {
139
+ type: "text",
140
+ text: JSON.stringify({ signal, audit: audit ?? "unavailable" }, null, 2),
141
+ },
142
+ ],
143
+ };
144
+ }
145
+ catch (err) {
146
+ return makeErrorResult(err);
147
+ }
148
+ }
149
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,102 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { listGroups, getGroupState, checkConnections, getSignalHistory, inspectSignal, } from "./read.js";
3
+ const makeClient = (getImpl) => ({ get: getImpl });
4
+ const makeResolver = (userId = 42) => ({ resolve: async () => userId });
5
+ describe("list_groups", () => {
6
+ it("returns group summary and JSON", async () => {
7
+ const client = makeClient(() => Promise.resolve([
8
+ { id: 7, name: "Main Group", accounts: [{}, {}], webhookUrl: "https://x/webhook/group/7/secret" },
9
+ ]));
10
+ const result = await listGroups(client, makeResolver(), {});
11
+ expect(result.isError).toBeUndefined();
12
+ expect(result.content[0].text).toContain("Main Group");
13
+ expect(result.content[0].text).toContain("id=7");
14
+ });
15
+ it("returns isError when API fails", async () => {
16
+ const client = makeClient(() => Promise.reject(new Error("401")));
17
+ const result = await listGroups(client, makeResolver(), {});
18
+ expect(result.isError).toBe(true);
19
+ });
20
+ });
21
+ describe("get_group_state", () => {
22
+ it("shows FLAT when no positions", async () => {
23
+ const client = makeClient(() => Promise.resolve({ members: [{ accountSpec: "Demo123", positions: [], workingOrders: [] }] }));
24
+ const result = await getGroupState(client, makeResolver(), { groupId: "7", secret: "abc" });
25
+ expect(result.isError).toBeUndefined();
26
+ expect(result.content[0].text).toContain("FLAT");
27
+ });
28
+ it("shows open position count", async () => {
29
+ const client = makeClient(() => Promise.resolve({
30
+ members: [{ accountSpec: "Demo123", positions: [{ symbol: "MYM" }], workingOrders: [] }],
31
+ }));
32
+ const result = await getGroupState(client, makeResolver(), { groupId: "7", secret: "abc" });
33
+ expect(result.content[0].text).toContain("1 open position");
34
+ });
35
+ it("returns isError when groupId missing", async () => {
36
+ const client = makeClient(() => Promise.resolve({}));
37
+ const result = await getGroupState(client, makeResolver(), {});
38
+ expect(result.isError).toBe(true);
39
+ });
40
+ });
41
+ describe("check_connections", () => {
42
+ it("returns connection status", async () => {
43
+ const client = makeClient(() => Promise.resolve([
44
+ { id: 1, label: "Tradovate Demo", brokerType: "tradovate", isActive: true, isEnabled: true },
45
+ ]));
46
+ const result = await checkConnections(client, makeResolver(), {});
47
+ expect(result.isError).toBeUndefined();
48
+ expect(result.content[0].text).toContain("Tradovate Demo");
49
+ expect(result.content[0].text).toContain("connected");
50
+ });
51
+ });
52
+ describe("get_signal_history", () => {
53
+ it("returns signal list", async () => {
54
+ const client = makeClient(() => Promise.resolve({
55
+ total: 2,
56
+ offset: 0,
57
+ limit: 50,
58
+ signals: [
59
+ { id: 1, action: "buy", ticker: "MYM1!", status: "executed", receivedAt: "2026-04-29T10:00:00Z" },
60
+ { id: 2, action: "sell", ticker: "MYM1!", status: "failed", receivedAt: "2026-04-29T11:00:00Z" },
61
+ ],
62
+ }));
63
+ const result = await getSignalHistory(client, makeResolver(), { groupId: "7" });
64
+ expect(result.isError).toBeUndefined();
65
+ expect(result.content[0].text).toContain("2 total signal(s)");
66
+ expect(result.content[0].text).toContain("executed");
67
+ });
68
+ it("returns isError when groupId missing", async () => {
69
+ const client = makeClient(() => Promise.resolve({}));
70
+ const result = await getSignalHistory(client, makeResolver(), {});
71
+ expect(result.isError).toBe(true);
72
+ });
73
+ });
74
+ describe("inspect_signal", () => {
75
+ it("combines signal and audit", async () => {
76
+ const client = makeClient((path) => {
77
+ if (path.endsWith("/audit"))
78
+ return Promise.resolve({ events: [] });
79
+ return Promise.resolve({ id: 123, action: "buy", ticker: "MYM1!", status: "executed" });
80
+ });
81
+ const result = await inspectSignal(client, makeResolver(), { signalId: "123" });
82
+ expect(result.isError).toBeUndefined();
83
+ expect(result.content[0].text).toContain("Signal 123");
84
+ expect(result.content[0].text).toContain("executed");
85
+ });
86
+ it("returns isError when signalId missing", async () => {
87
+ const client = makeClient(() => Promise.resolve({}));
88
+ const result = await inspectSignal(client, makeResolver(), {});
89
+ expect(result.isError).toBe(true);
90
+ });
91
+ it("still returns signal if audit call fails", async () => {
92
+ const client = makeClient((path) => {
93
+ if (path.endsWith("/audit"))
94
+ return Promise.reject(new Error("404"));
95
+ return Promise.resolve({ id: 55, action: "sell", ticker: "ES1!", status: "partial" });
96
+ });
97
+ const result = await inspectSignal(client, makeResolver(), { signalId: "55" });
98
+ expect(result.isError).toBeUndefined();
99
+ expect(result.content[1].text).toContain('"audit": "unavailable"');
100
+ });
101
+ });
102
+ //# sourceMappingURL=read.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.test.js","sourceRoot":"","sources":["../../src/tools/read.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { VantageClient } from "../client.js";
2
+ import { UserResolver, ToolResult } from "../user.js";
3
+ export declare function sendSignal(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
4
+ export declare function exitPositions(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
5
+ export declare function flattenGroup(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
@@ -0,0 +1,142 @@
1
+ import { makeErrorResult } from "../user.js";
2
+ const VALID_ACTIONS = ["buy", "sell", "exit", "add", "reduce"];
3
+ const VALID_ORDER_TYPES = ["market", "limit", "stop", "stop_limit"];
4
+ export async function sendSignal(client, resolver, input) {
5
+ const groupId = String(input.groupId ?? "");
6
+ const secret = String(input.secret ?? "");
7
+ const action = String(input.action ?? "");
8
+ const ticker = String(input.ticker ?? "");
9
+ if (!groupId || !secret)
10
+ return makeErrorResult(new Error("groupId and secret are required"));
11
+ if (!VALID_ACTIONS.includes(action)) {
12
+ return {
13
+ content: [
14
+ {
15
+ type: "text",
16
+ text: `Invalid action "${action}". Valid values: ${VALID_ACTIONS.join(", ")}`,
17
+ },
18
+ ],
19
+ isError: true,
20
+ };
21
+ }
22
+ if (!ticker)
23
+ return makeErrorResult(new Error("ticker is required"));
24
+ const payload = { action, ticker };
25
+ if (input.quantity != null)
26
+ payload.quantity = Number(input.quantity);
27
+ if (input.orderType != null) {
28
+ const ot = String(input.orderType);
29
+ if (!VALID_ORDER_TYPES.includes(ot)) {
30
+ return {
31
+ content: [
32
+ {
33
+ type: "text",
34
+ text: `Invalid orderType "${ot}". Valid values: ${VALID_ORDER_TYPES.join(", ")}`,
35
+ },
36
+ ],
37
+ isError: true,
38
+ };
39
+ }
40
+ payload.orderType = ot;
41
+ }
42
+ if (input.limitPrice != null)
43
+ payload.limitPrice = Number(input.limitPrice);
44
+ if (input.stopPrice != null)
45
+ payload.stopPrice = Number(input.stopPrice);
46
+ if (input.takeProfit != null)
47
+ payload.takeProfit = Number(input.takeProfit);
48
+ if (input.stopLoss != null)
49
+ payload.stopLoss = Number(input.stopLoss);
50
+ if (input.comment != null)
51
+ payload.comment = String(input.comment);
52
+ if (input.timeInForce != null)
53
+ payload.timeInForce = String(input.timeInForce);
54
+ try {
55
+ const res = await client.postWebhook(groupId, secret, payload);
56
+ if (!res.success) {
57
+ return { content: [{ type: "text", text: res.error ?? "Signal dispatch failed" }], isError: true };
58
+ }
59
+ const summary = `${res.dispatched ?? 0} of ${res.total ?? 0} accounts executed`;
60
+ return {
61
+ content: [
62
+ {
63
+ type: "text",
64
+ text: `Signal dispatched: ${summary}. Envelope signal ID: ${res.envelopeSignalId ?? "unknown"}`,
65
+ },
66
+ {
67
+ type: "text",
68
+ text: JSON.stringify({ dispatched: res.dispatched, total: res.total, envelopeSignalId: res.envelopeSignalId, results: res.results }, null, 2),
69
+ },
70
+ ],
71
+ };
72
+ }
73
+ catch (err) {
74
+ return makeErrorResult(err);
75
+ }
76
+ }
77
+ export async function exitPositions(client, _resolver, input) {
78
+ const groupId = String(input.groupId ?? "");
79
+ const secret = String(input.secret ?? "");
80
+ if (!groupId || !secret)
81
+ return makeErrorResult(new Error("groupId and secret are required"));
82
+ const payload = {
83
+ action: "exit",
84
+ ticker: input.ticker ? String(input.ticker) : "ALL",
85
+ };
86
+ if (input.comment != null)
87
+ payload.comment = String(input.comment);
88
+ try {
89
+ const res = await client.postWebhook(groupId, secret, payload);
90
+ if (!res.success) {
91
+ return { content: [{ type: "text", text: res.error ?? "Exit failed" }], isError: true };
92
+ }
93
+ const summary = `${res.dispatched ?? 0} of ${res.total ?? 0} accounts received exit signal`;
94
+ return {
95
+ content: [
96
+ { type: "text", text: summary },
97
+ {
98
+ type: "text",
99
+ text: JSON.stringify({ dispatched: res.dispatched, total: res.total, results: res.results }, null, 2),
100
+ },
101
+ ],
102
+ };
103
+ }
104
+ catch (err) {
105
+ return makeErrorResult(err);
106
+ }
107
+ }
108
+ export async function flattenGroup(client, resolver, input) {
109
+ if (input.confirm !== true) {
110
+ return {
111
+ content: [
112
+ {
113
+ type: "text",
114
+ text: "flatten_group requires confirm: true — this closes ALL positions and cancels ALL working orders " +
115
+ "across every account in the group. Pass confirm: true to proceed.",
116
+ },
117
+ ],
118
+ isError: true,
119
+ };
120
+ }
121
+ const groupId = String(input.groupId ?? "");
122
+ if (!groupId)
123
+ return makeErrorResult(new Error("groupId is required"));
124
+ try {
125
+ const userId = await resolver.resolve(client);
126
+ const res = await client.post(`/api/account/${userId}/groups/${groupId}/flatten`, {});
127
+ if (!res.success) {
128
+ return { content: [{ type: "text", text: res.error ?? "Flatten failed" }], isError: true };
129
+ }
130
+ const summary = `Closed ${res.closed ?? 0} positions, cancelled ${res.cancelled ?? 0} orders`;
131
+ return {
132
+ content: [
133
+ { type: "text", text: summary },
134
+ { type: "text", text: JSON.stringify(res, null, 2) },
135
+ ],
136
+ };
137
+ }
138
+ catch (err) {
139
+ return makeErrorResult(err);
140
+ }
141
+ }
142
+ //# sourceMappingURL=signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/tools/signals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,92 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { sendSignal, exitPositions, flattenGroup } from "./signals.js";
3
+ const makeClient = (postWebhookImpl, postImpl) => ({
4
+ postWebhook: postWebhookImpl ?? (() => Promise.resolve({ success: true, dispatched: 2, total: 2, envelopeSignalId: 99, results: [] })),
5
+ post: postImpl ?? (() => Promise.resolve({ success: true, closed: 1, cancelled: 2 })),
6
+ });
7
+ const makeResolver = (userId = 42) => ({ resolve: async () => userId });
8
+ describe("send_signal", () => {
9
+ it("dispatches signal and returns summary", async () => {
10
+ const result = await sendSignal(makeClient(), makeResolver(), {
11
+ groupId: "7",
12
+ secret: "abc",
13
+ action: "buy",
14
+ ticker: "MYM1!",
15
+ quantity: 1,
16
+ });
17
+ expect(result.isError).toBeUndefined();
18
+ expect(result.content[0].text).toContain("2 of 2 accounts executed");
19
+ expect(result.content[0].text).toContain("99");
20
+ });
21
+ it("returns isError for invalid action", async () => {
22
+ const result = await sendSignal(makeClient(), makeResolver(), {
23
+ groupId: "7", secret: "abc", action: "short", ticker: "MYM1!",
24
+ });
25
+ expect(result.isError).toBe(true);
26
+ expect(result.content[0].text).toContain("buy, sell, exit");
27
+ });
28
+ it("returns isError for invalid orderType", async () => {
29
+ const result = await sendSignal(makeClient(), makeResolver(), {
30
+ groupId: "7", secret: "abc", action: "buy", ticker: "MYM1!", orderType: "twap",
31
+ });
32
+ expect(result.isError).toBe(true);
33
+ expect(result.content[0].text).toContain("market, limit, stop");
34
+ });
35
+ it("returns isError when API fails", async () => {
36
+ const client = makeClient(() => Promise.reject(new Error("503")));
37
+ const result = await sendSignal(client, makeResolver(), {
38
+ groupId: "7", secret: "abc", action: "buy", ticker: "MYM1!",
39
+ });
40
+ expect(result.isError).toBe(true);
41
+ });
42
+ it("returns isError when groupId missing", async () => {
43
+ const result = await sendSignal(makeClient(), makeResolver(), {
44
+ action: "buy", ticker: "MYM1!",
45
+ });
46
+ expect(result.isError).toBe(true);
47
+ });
48
+ });
49
+ describe("exit_positions", () => {
50
+ it("sends action=exit and returns summary", async () => {
51
+ const client = makeClient(() => Promise.resolve({ success: true, dispatched: 1, total: 1, results: [] }));
52
+ const result = await exitPositions(client, makeResolver(), {
53
+ groupId: "7", secret: "abc",
54
+ });
55
+ expect(result.isError).toBeUndefined();
56
+ expect(result.content[0].text).toContain("accounts received exit signal");
57
+ });
58
+ it("returns isError when groupId missing", async () => {
59
+ const result = await exitPositions(makeClient(), makeResolver(), {});
60
+ expect(result.isError).toBe(true);
61
+ });
62
+ });
63
+ describe("flatten_group", () => {
64
+ it("returns isError without confirm:true", async () => {
65
+ const result = await flattenGroup(makeClient(), makeResolver(), {
66
+ groupId: "7",
67
+ });
68
+ expect(result.isError).toBe(true);
69
+ expect(result.content[0].text).toContain("confirm: true");
70
+ });
71
+ it("returns isError when confirm is false", async () => {
72
+ const result = await flattenGroup(makeClient(), makeResolver(), {
73
+ groupId: "7", confirm: false,
74
+ });
75
+ expect(result.isError).toBe(true);
76
+ });
77
+ it("calls flatten endpoint and returns summary with confirm:true", async () => {
78
+ const result = await flattenGroup(makeClient(), makeResolver(), {
79
+ groupId: "7", confirm: true,
80
+ });
81
+ expect(result.isError).toBeUndefined();
82
+ expect(result.content[0].text).toContain("Closed 1 positions, cancelled 2 orders");
83
+ });
84
+ it("returns isError when API fails", async () => {
85
+ const client = makeClient(undefined, () => Promise.reject(new Error("500")));
86
+ const result = await flattenGroup(client, makeResolver(), {
87
+ groupId: "7", confirm: true,
88
+ });
89
+ expect(result.isError).toBe(true);
90
+ });
91
+ });
92
+ //# sourceMappingURL=signals.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.test.js","sourceRoot":"","sources":["../../src/tools/signals.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIvE,MAAM,UAAU,GAAG,CACjB,eAAwC,EACxC,QAAiC,EACjC,EAAE,CACF,CAAC;IACC,WAAW,EAAE,eAAe,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACtI,IAAI,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;CACzD,CAAA,CAAC;AAEjC,MAAM,YAAY,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE,EAAE,CACnC,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,EAA8B,CAAA,CAAC;AAE/D,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,EAAE;YAC5D,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;QACH,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,0BAA0B,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,EAAE;YAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;SAC9D,CAAC,CAAC;QACH,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,iBAAiB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,EAAE;YAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM;SAC/E,CAAC,CAAC;QACH,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,qBAAqB,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE;YACtD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO;SAC5D,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,EAAE;YAC5D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO;SAC/B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,MAAM,GAAG,UAAU,CACvB,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAC/E,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE;YACzD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK;SAC5B,CAAC,CAAC;QACH,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,+BAA+B,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,EAAE;YAC9D,OAAO,EAAE,GAAG;SACb,CAAC,CAAC;QACH,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;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,EAAE;YAC9D,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK;SAC7B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,EAAE;YAC9D,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI;SAC5B,CAAC,CAAC;QACH,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,wCAAwC,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE;YACxD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI;SAC5B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/user.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import { VantageClient } from "./client.js";
2
+ export declare class UserResolver {
3
+ private userId;
4
+ resolve(client: VantageClient): Promise<number>;
5
+ }
6
+ export declare function makeErrorResult(err: unknown): {
7
+ content: Array<{
8
+ type: "text";
9
+ text: string;
10
+ }>;
11
+ isError: true;
12
+ };
13
+ export type ToolResult = {
14
+ content: Array<{
15
+ type: "text";
16
+ text: string;
17
+ }>;
18
+ isError?: true;
19
+ };
package/dist/user.js ADDED
@@ -0,0 +1,21 @@
1
+ import { apiErrorText } from "./client.js";
2
+ export class UserResolver {
3
+ userId = null;
4
+ async resolve(client) {
5
+ if (this.userId !== null)
6
+ return this.userId;
7
+ const me = await client.get("/api/auth/me");
8
+ if (!me.authenticated || !me.userId) {
9
+ throw new Error("API key authenticated but /api/auth/me returned no userId. Check key validity.");
10
+ }
11
+ this.userId = me.userId;
12
+ return this.userId;
13
+ }
14
+ }
15
+ export function makeErrorResult(err) {
16
+ return {
17
+ content: [{ type: "text", text: apiErrorText(err) }],
18
+ isError: true,
19
+ };
20
+ }
21
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../src/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,aAAa,CAAC;AAO1D,MAAM,OAAO,YAAY;IACf,MAAM,GAAkB,IAAI,CAAC;IAErC,KAAK,CAAC,OAAO,CAAC,MAAqB;QACjC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAC7C,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAa,cAAc,CAAC,CAAC;QACxD,IAAI,CAAC,EAAE,CAAC,aAAa,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,GAAY;IAI1C,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@vantagestack/mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "VantagePipe MCP server — send signals, read positions, monitor connections via AI coding agents",
5
+ "type": "module",
6
+ "bin": {
7
+ "vantage-pipe-mcp": "dist/index.js"
8
+ },
9
+ "main": "dist/index.js",
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "start": "node dist/index.js",
13
+ "dev": "tsc --watch",
14
+ "test": "vitest run"
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
20
+ "engines": {
21
+ "node": ">=18"
22
+ },
23
+ "dependencies": {
24
+ "@modelcontextprotocol/sdk": "^1.12.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^22.0.0",
28
+ "typescript": "^5.7.0",
29
+ "vitest": "^2.0.0"
30
+ }
31
+ }