@invect/mcp 0.0.1
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/LICENSE +21 -0
- package/dist/backend/audit.d.ts +29 -0
- package/dist/backend/audit.d.ts.map +1 -0
- package/dist/backend/auth.d.ts +32 -0
- package/dist/backend/auth.d.ts.map +1 -0
- package/dist/backend/client/direct-client.d.ts +223 -0
- package/dist/backend/client/direct-client.d.ts.map +1 -0
- package/dist/backend/client/http-client.d.ts +74 -0
- package/dist/backend/client/http-client.d.ts.map +1 -0
- package/dist/backend/client/types.d.ts +83 -0
- package/dist/backend/client/types.d.ts.map +1 -0
- package/dist/backend/index.cjs +357 -0
- package/dist/backend/index.cjs.map +1 -0
- package/dist/backend/index.d.cts +29 -0
- package/dist/backend/index.d.cts.map +1 -0
- package/dist/backend/index.d.mts +29 -0
- package/dist/backend/index.d.mts.map +1 -0
- package/dist/backend/index.d.ts +32 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.mjs +356 -0
- package/dist/backend/index.mjs.map +1 -0
- package/dist/backend/mcp-server.d.ts +8 -0
- package/dist/backend/mcp-server.d.ts.map +1 -0
- package/dist/backend/prompts/index.d.ts +7 -0
- package/dist/backend/prompts/index.d.ts.map +1 -0
- package/dist/backend/resources/index.d.ts +7 -0
- package/dist/backend/resources/index.d.ts.map +1 -0
- package/dist/backend/response-mappers.d.ts +26 -0
- package/dist/backend/response-mappers.d.ts.map +1 -0
- package/dist/backend/session-manager.d.ts +30 -0
- package/dist/backend/session-manager.d.ts.map +1 -0
- package/dist/backend/tools/credential-tools.d.ts +8 -0
- package/dist/backend/tools/credential-tools.d.ts.map +1 -0
- package/dist/backend/tools/debug-tools.d.ts +7 -0
- package/dist/backend/tools/debug-tools.d.ts.map +1 -0
- package/dist/backend/tools/flow-tools.d.ts +7 -0
- package/dist/backend/tools/flow-tools.d.ts.map +1 -0
- package/dist/backend/tools/node-tools.d.ts +7 -0
- package/dist/backend/tools/node-tools.d.ts.map +1 -0
- package/dist/backend/tools/run-tools.d.ts +7 -0
- package/dist/backend/tools/run-tools.d.ts.map +1 -0
- package/dist/backend/tools/trigger-tools.d.ts +7 -0
- package/dist/backend/tools/trigger-tools.d.ts.map +1 -0
- package/dist/backend/tools/version-tools.d.ts +7 -0
- package/dist/backend/tools/version-tools.d.ts.map +1 -0
- package/dist/cli/index.cjs +213 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +151 -0
- package/dist/cli/index.d.cts.map +1 -0
- package/dist/cli/index.d.mts +151 -0
- package/dist/cli/index.d.mts.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.mjs +211 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/mcp-server-Brb4wc6I.mjs +671 -0
- package/dist/mcp-server-Brb4wc6I.mjs.map +1 -0
- package/dist/mcp-server-DzO5MpFJ.cjs +676 -0
- package/dist/mcp-server-DzO5MpFJ.cjs.map +1 -0
- package/dist/shared/types.cjs +39 -0
- package/dist/shared/types.cjs.map +1 -0
- package/dist/shared/types.d.cts +64 -0
- package/dist/shared/types.d.cts.map +1 -0
- package/dist/shared/types.d.mts +64 -0
- package/dist/shared/types.d.mts.map +1 -0
- package/dist/shared/types.d.ts +64 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.mjs +38 -0
- package/dist/shared/types.mjs.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const require_mcp_server = require("../mcp-server-DzO5MpFJ.cjs");
|
|
4
|
+
let _modelcontextprotocol_sdk_server_stdio_js = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
5
|
+
//#region src/backend/client/http-client.ts
|
|
6
|
+
var HttpClient = class {
|
|
7
|
+
baseUrl;
|
|
8
|
+
apiKey;
|
|
9
|
+
constructor(baseUrl, apiKey) {
|
|
10
|
+
this.baseUrl = baseUrl.replace(/\/+$/, "");
|
|
11
|
+
this.apiKey = apiKey;
|
|
12
|
+
}
|
|
13
|
+
async request(method, path, body) {
|
|
14
|
+
const url = `${this.baseUrl}${path}`;
|
|
15
|
+
const init = {
|
|
16
|
+
method,
|
|
17
|
+
headers: {
|
|
18
|
+
"x-api-key": this.apiKey,
|
|
19
|
+
"Content-Type": "application/json"
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
if (body !== void 0 && method !== "GET" && method !== "DELETE") init.body = JSON.stringify(body);
|
|
23
|
+
const res = await fetch(url, init);
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
const text = await res.text().catch(() => "");
|
|
26
|
+
throw new Error(`HTTP ${res.status} ${method} ${path}: ${text}`);
|
|
27
|
+
}
|
|
28
|
+
if ((res.headers.get("content-type") ?? "").includes("application/json")) return await res.json();
|
|
29
|
+
return await res.text();
|
|
30
|
+
}
|
|
31
|
+
/** Health check — throws if API is unreachable */
|
|
32
|
+
async healthCheck() {
|
|
33
|
+
await this.request("GET", "/health");
|
|
34
|
+
}
|
|
35
|
+
async listFlows(_identity) {
|
|
36
|
+
return await this.request("GET", "/flows/list");
|
|
37
|
+
}
|
|
38
|
+
async getFlow(_identity, flowId) {
|
|
39
|
+
return await this.request("GET", `/flows/${encodeURIComponent(flowId)}`);
|
|
40
|
+
}
|
|
41
|
+
async getFlowDefinition(_identity, flowId) {
|
|
42
|
+
return await this.request("GET", `/flows/${encodeURIComponent(flowId)}/versions/latest`);
|
|
43
|
+
}
|
|
44
|
+
async createFlow(_identity, data) {
|
|
45
|
+
return await this.request("POST", "/flows", data);
|
|
46
|
+
}
|
|
47
|
+
async updateFlow(_identity, flowId, data) {
|
|
48
|
+
return await this.request("PUT", `/flows/${encodeURIComponent(flowId)}`, data);
|
|
49
|
+
}
|
|
50
|
+
async deleteFlow(_identity, flowId) {
|
|
51
|
+
await this.request("DELETE", `/flows/${encodeURIComponent(flowId)}`);
|
|
52
|
+
}
|
|
53
|
+
async validateFlow(_identity, flowId, definition) {
|
|
54
|
+
return await this.request("POST", "/validate-flow", {
|
|
55
|
+
flowId,
|
|
56
|
+
flowDefinition: definition
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async listVersions(_identity, flowId) {
|
|
60
|
+
return await this.request("POST", `/flows/${encodeURIComponent(flowId)}/versions/list`, {});
|
|
61
|
+
}
|
|
62
|
+
async getVersion(_identity, flowId, version) {
|
|
63
|
+
return await this.request("GET", `/flows/${encodeURIComponent(flowId)}/versions/${encodeURIComponent(String(version))}`);
|
|
64
|
+
}
|
|
65
|
+
async publishVersion(_identity, flowId, data) {
|
|
66
|
+
return await this.request("POST", `/flows/${encodeURIComponent(flowId)}/versions`, data);
|
|
67
|
+
}
|
|
68
|
+
async startRun(_identity, flowId, inputs) {
|
|
69
|
+
return await this.request("POST", `/flows/${encodeURIComponent(flowId)}/run`, inputs ? { inputs } : {});
|
|
70
|
+
}
|
|
71
|
+
async runToNode(_identity, flowId, nodeId, inputs) {
|
|
72
|
+
return await this.request("POST", `/flows/${encodeURIComponent(flowId)}/run-to-node/${encodeURIComponent(nodeId)}`, inputs ? { inputs } : {});
|
|
73
|
+
}
|
|
74
|
+
async listRuns(_identity, flowId) {
|
|
75
|
+
return await this.request("GET", `/flows/${encodeURIComponent(flowId)}/flow-runs`);
|
|
76
|
+
}
|
|
77
|
+
async getRun(_identity, flowRunId) {
|
|
78
|
+
return await this.request("GET", `/flow-runs/${encodeURIComponent(flowRunId)}`);
|
|
79
|
+
}
|
|
80
|
+
async cancelRun(_identity, flowRunId) {
|
|
81
|
+
return await this.request("POST", `/flow-runs/${encodeURIComponent(flowRunId)}/cancel`);
|
|
82
|
+
}
|
|
83
|
+
async pauseRun(_identity, flowRunId) {
|
|
84
|
+
return await this.request("POST", `/flow-runs/${encodeURIComponent(flowRunId)}/pause`);
|
|
85
|
+
}
|
|
86
|
+
async resumeRun(_identity, flowRunId) {
|
|
87
|
+
return await this.request("POST", `/flow-runs/${encodeURIComponent(flowRunId)}/resume`);
|
|
88
|
+
}
|
|
89
|
+
async getNodeExecutions(_identity, flowRunId) {
|
|
90
|
+
return (await this.request("GET", `/flow-runs/${encodeURIComponent(flowRunId)}/node-executions?limit=100`)).data;
|
|
91
|
+
}
|
|
92
|
+
async testNode(_identity, nodeType, params, inputData) {
|
|
93
|
+
return await this.request("POST", "/nodes/test", {
|
|
94
|
+
nodeType,
|
|
95
|
+
params,
|
|
96
|
+
inputData
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
async testJsExpression(_identity, expression, context) {
|
|
100
|
+
return await this.request("POST", "/node-data/test-expression", {
|
|
101
|
+
expression,
|
|
102
|
+
context
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
async testMapper(_identity, expression, incomingData) {
|
|
106
|
+
return await this.request("POST", "/node-data/test-mapper", {
|
|
107
|
+
expression,
|
|
108
|
+
incomingData
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
async listCredentials(_identity) {
|
|
112
|
+
const result = await this.request("GET", "/credentials");
|
|
113
|
+
return (Array.isArray(result) ? result : result.data ?? []).map((c) => ({
|
|
114
|
+
id: String(c.id),
|
|
115
|
+
name: String(c.name),
|
|
116
|
+
type: String(c.type),
|
|
117
|
+
provider: c.provider ? String(c.provider) : void 0,
|
|
118
|
+
lastUsedAt: c.lastUsedAt ? String(c.lastUsedAt) : void 0,
|
|
119
|
+
createdAt: c.createdAt ? String(c.createdAt) : void 0
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
async testCredential(_identity, credentialId) {
|
|
123
|
+
return await this.request("POST", `/credentials/${encodeURIComponent(credentialId)}/test`);
|
|
124
|
+
}
|
|
125
|
+
async listTriggers(_identity, flowId) {
|
|
126
|
+
return await this.request("GET", `/flows/${encodeURIComponent(flowId)}/triggers`);
|
|
127
|
+
}
|
|
128
|
+
async getTrigger(_identity, triggerId) {
|
|
129
|
+
return await this.request("GET", `/triggers/${encodeURIComponent(triggerId)}`);
|
|
130
|
+
}
|
|
131
|
+
async createTrigger(_identity, input) {
|
|
132
|
+
const data = input;
|
|
133
|
+
const flowId = data.flowId;
|
|
134
|
+
return await this.request("POST", `/flows/${encodeURIComponent(flowId)}/triggers`, data);
|
|
135
|
+
}
|
|
136
|
+
async updateTrigger(_identity, triggerId, input) {
|
|
137
|
+
return await this.request("PUT", `/triggers/${encodeURIComponent(triggerId)}`, input);
|
|
138
|
+
}
|
|
139
|
+
async deleteTrigger(_identity, triggerId) {
|
|
140
|
+
await this.request("DELETE", `/triggers/${encodeURIComponent(triggerId)}`);
|
|
141
|
+
}
|
|
142
|
+
async listProviders(_identity) {
|
|
143
|
+
const nodes = await this.request("GET", "/nodes");
|
|
144
|
+
const providerSet = /* @__PURE__ */ new Map();
|
|
145
|
+
for (const node of nodes) {
|
|
146
|
+
const p = node.provider;
|
|
147
|
+
if (p && typeof p.id === "string" && !providerSet.has(p.id)) providerSet.set(p.id, p);
|
|
148
|
+
}
|
|
149
|
+
return Array.from(providerSet.values());
|
|
150
|
+
}
|
|
151
|
+
async listAvailableNodes(_identity) {
|
|
152
|
+
return await this.request("GET", "/nodes");
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
//#endregion
|
|
156
|
+
//#region src/cli/index.ts
|
|
157
|
+
/**
|
|
158
|
+
* invect-mcp CLI — Standalone MCP server over stdio transport.
|
|
159
|
+
*
|
|
160
|
+
* Connects to a running Invect instance via HTTP API.
|
|
161
|
+
* Designed for Claude Desktop, VS Code Copilot, and other MCP clients.
|
|
162
|
+
*
|
|
163
|
+
* Usage:
|
|
164
|
+
* npx invect-mcp --url http://localhost:3000/invect --api-key YOUR_KEY
|
|
165
|
+
*
|
|
166
|
+
* Environment variables:
|
|
167
|
+
* INVECT_URL — Base URL of the Invect API
|
|
168
|
+
* INVECT_API_KEY — API key for authentication
|
|
169
|
+
*/
|
|
170
|
+
async function main() {
|
|
171
|
+
const args = parseArgs(process.argv.slice(2));
|
|
172
|
+
const url = args.url || process.env.INVECT_URL;
|
|
173
|
+
const apiKey = args["api-key"] || process.env.INVECT_API_KEY;
|
|
174
|
+
if (!url) {
|
|
175
|
+
process.stderr.write("Error: --url or INVECT_URL is required.\n");
|
|
176
|
+
process.stderr.write("Usage: invect-mcp --url http://localhost:3000/invect --api-key YOUR_KEY\n");
|
|
177
|
+
process.exit(1);
|
|
178
|
+
}
|
|
179
|
+
if (!apiKey) {
|
|
180
|
+
process.stderr.write("Error: --api-key or INVECT_API_KEY is required.\n");
|
|
181
|
+
process.stderr.write("Usage: invect-mcp --url http://localhost:3000/invect --api-key YOUR_KEY\n");
|
|
182
|
+
process.exit(1);
|
|
183
|
+
}
|
|
184
|
+
const server = require_mcp_server.createMcpServer(new HttpClient(url, apiKey));
|
|
185
|
+
const transport = new _modelcontextprotocol_sdk_server_stdio_js.StdioServerTransport();
|
|
186
|
+
await server.connect(transport);
|
|
187
|
+
process.stderr.write(`invect-mcp: Connected to ${url} via stdio transport\n`);
|
|
188
|
+
}
|
|
189
|
+
function parseArgs(argv) {
|
|
190
|
+
const result = {};
|
|
191
|
+
for (let i = 0; i < argv.length; i++) {
|
|
192
|
+
const arg = argv[i];
|
|
193
|
+
if (!arg) continue;
|
|
194
|
+
if (arg.startsWith("--")) {
|
|
195
|
+
const key = arg.slice(2);
|
|
196
|
+
const next = argv[i + 1];
|
|
197
|
+
if (next && !next.startsWith("--")) {
|
|
198
|
+
result[key] = next;
|
|
199
|
+
i++;
|
|
200
|
+
} else result[key] = "true";
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return result;
|
|
204
|
+
}
|
|
205
|
+
main().catch((err) => {
|
|
206
|
+
process.stderr.write(`invect-mcp: Fatal error: ${err}\n`);
|
|
207
|
+
process.exit(1);
|
|
208
|
+
});
|
|
209
|
+
//#endregion
|
|
210
|
+
exports.HttpClient = HttpClient;
|
|
211
|
+
exports.createMcpServer = require_mcp_server.createMcpServer;
|
|
212
|
+
|
|
213
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["createMcpServer","StdioServerTransport"],"sources":["../../src/backend/client/http-client.ts","../../src/cli/index.ts"],"sourcesContent":["/**\n * HttpClient — wraps Invect HTTP API for CLI/stdio mode.\n */\n\nimport type { InvectIdentity } from '@invect/core';\nimport type { InvectClient, CredentialSummary } from './types';\n\nexport class HttpClient implements InvectClient {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(baseUrl: string, apiKey: string) {\n // Strip trailing slash\n this.baseUrl = baseUrl.replace(/\\/+$/, '');\n this.apiKey = apiKey;\n }\n\n private async request<T = unknown>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n };\n\n const init: RequestInit = { method, headers };\n if (body !== undefined && method !== 'GET' && method !== 'DELETE') {\n init.body = JSON.stringify(body);\n }\n\n const res = await fetch(url, init);\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`HTTP ${res.status} ${method} ${path}: ${text}`);\n }\n\n const contentType = res.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n return (await res.json()) as T;\n }\n return (await res.text()) as unknown as T;\n }\n\n /** Health check — throws if API is unreachable */\n async healthCheck(): Promise<void> {\n await this.request('GET', '/health');\n }\n\n // ===== Flows =====\n\n async listFlows(_identity: InvectIdentity | null) {\n return await this.request('GET', '/flows/list');\n }\n\n async getFlow(_identity: InvectIdentity | null, flowId: string) {\n return await this.request('GET', `/flows/${encodeURIComponent(flowId)}`);\n }\n\n async getFlowDefinition(_identity: InvectIdentity | null, flowId: string) {\n return await this.request('GET', `/flows/${encodeURIComponent(flowId)}/versions/latest`);\n }\n\n async createFlow(_identity: InvectIdentity | null, data: { name: string; description?: string }) {\n return await this.request('POST', '/flows', data);\n }\n\n async updateFlow(\n _identity: InvectIdentity | null,\n flowId: string,\n data: { name?: string; description?: string },\n ) {\n return await this.request('PUT', `/flows/${encodeURIComponent(flowId)}`, data);\n }\n\n async deleteFlow(_identity: InvectIdentity | null, flowId: string) {\n await this.request('DELETE', `/flows/${encodeURIComponent(flowId)}`);\n }\n\n async validateFlow(_identity: InvectIdentity | null, flowId: string, definition: unknown) {\n return await this.request<{ valid: boolean; errors?: string[] }>('POST', '/validate-flow', {\n flowId,\n flowDefinition: definition,\n });\n }\n\n // ===== Versions =====\n\n async listVersions(_identity: InvectIdentity | null, flowId: string) {\n return await this.request('POST', `/flows/${encodeURIComponent(flowId)}/versions/list`, {});\n }\n\n async getVersion(\n _identity: InvectIdentity | null,\n flowId: string,\n version: string | number | 'latest',\n ) {\n return await this.request(\n 'GET',\n `/flows/${encodeURIComponent(flowId)}/versions/${encodeURIComponent(String(version))}`,\n );\n }\n\n async publishVersion(_identity: InvectIdentity | null, flowId: string, data: unknown) {\n return await this.request('POST', `/flows/${encodeURIComponent(flowId)}/versions`, data);\n }\n\n // ===== Runs =====\n\n async startRun(\n _identity: InvectIdentity | null,\n flowId: string,\n inputs?: Record<string, unknown>,\n ) {\n return await this.request(\n 'POST',\n `/flows/${encodeURIComponent(flowId)}/run`,\n inputs ? { inputs } : {},\n );\n }\n\n async runToNode(\n _identity: InvectIdentity | null,\n flowId: string,\n nodeId: string,\n inputs?: Record<string, unknown>,\n ) {\n return await this.request(\n 'POST',\n `/flows/${encodeURIComponent(flowId)}/run-to-node/${encodeURIComponent(nodeId)}`,\n inputs ? { inputs } : {},\n );\n }\n\n async listRuns(_identity: InvectIdentity | null, flowId: string) {\n return await this.request('GET', `/flows/${encodeURIComponent(flowId)}/flow-runs`);\n }\n\n async getRun(_identity: InvectIdentity | null, flowRunId: string) {\n return await this.request('GET', `/flow-runs/${encodeURIComponent(flowRunId)}`);\n }\n\n async cancelRun(_identity: InvectIdentity | null, flowRunId: string) {\n return await this.request<{ message: string }>(\n 'POST',\n `/flow-runs/${encodeURIComponent(flowRunId)}/cancel`,\n );\n }\n\n async pauseRun(_identity: InvectIdentity | null, flowRunId: string) {\n return await this.request<{ message: string }>(\n 'POST',\n `/flow-runs/${encodeURIComponent(flowRunId)}/pause`,\n );\n }\n\n async resumeRun(_identity: InvectIdentity | null, flowRunId: string) {\n return await this.request<{ message: string }>(\n 'POST',\n `/flow-runs/${encodeURIComponent(flowRunId)}/resume`,\n );\n }\n\n // ===== Debug =====\n\n async getNodeExecutions(_identity: InvectIdentity | null, flowRunId: string) {\n const result = await this.request<{ data: unknown[]; pagination: unknown }>(\n 'GET',\n `/flow-runs/${encodeURIComponent(flowRunId)}/node-executions?limit=100`,\n );\n return result.data;\n }\n\n async testNode(\n _identity: InvectIdentity | null,\n nodeType: string,\n params: Record<string, unknown>,\n inputData?: Record<string, unknown>,\n ) {\n return await this.request<{ success: boolean; output?: unknown; error?: string }>(\n 'POST',\n '/nodes/test',\n { nodeType, params, inputData },\n );\n }\n\n async testJsExpression(\n _identity: InvectIdentity | null,\n expression: string,\n context: Record<string, unknown>,\n ) {\n return await this.request<{ success: boolean; result?: unknown; error?: string }>(\n 'POST',\n '/node-data/test-expression',\n { expression, context },\n );\n }\n\n async testMapper(\n _identity: InvectIdentity | null,\n expression: string,\n incomingData: Record<string, unknown>,\n ) {\n return await this.request<{ success: boolean; result?: unknown; error?: string }>(\n 'POST',\n '/node-data/test-mapper',\n { expression, incomingData },\n );\n }\n\n // ===== Credentials =====\n\n async listCredentials(_identity: InvectIdentity | null): Promise<CredentialSummary[]> {\n const result = await this.request<{ data: unknown[] }>('GET', '/credentials');\n const items = Array.isArray(result) ? result : ((result as { data: unknown[] }).data ?? []);\n return (items as Array<Record<string, unknown>>).map((c) => ({\n id: String(c.id),\n name: String(c.name),\n type: String(c.type),\n provider: c.provider ? String(c.provider) : undefined,\n lastUsedAt: c.lastUsedAt ? String(c.lastUsedAt) : undefined,\n createdAt: c.createdAt ? String(c.createdAt) : undefined,\n }));\n }\n\n async testCredential(_identity: InvectIdentity | null, credentialId: string) {\n return await this.request<{ success: boolean; error?: string }>(\n 'POST',\n `/credentials/${encodeURIComponent(credentialId)}/test`,\n );\n }\n\n // ===== Triggers =====\n\n async listTriggers(_identity: InvectIdentity | null, flowId: string) {\n return await this.request<unknown[]>('GET', `/flows/${encodeURIComponent(flowId)}/triggers`);\n }\n\n async getTrigger(_identity: InvectIdentity | null, triggerId: string) {\n return await this.request('GET', `/triggers/${encodeURIComponent(triggerId)}`);\n }\n\n async createTrigger(_identity: InvectIdentity | null, input: unknown) {\n const data = input as Record<string, unknown>;\n const flowId = data.flowId as string;\n return await this.request('POST', `/flows/${encodeURIComponent(flowId)}/triggers`, data);\n }\n\n async updateTrigger(_identity: InvectIdentity | null, triggerId: string, input: unknown) {\n return await this.request('PUT', `/triggers/${encodeURIComponent(triggerId)}`, input);\n }\n\n async deleteTrigger(_identity: InvectIdentity | null, triggerId: string) {\n await this.request('DELETE', `/triggers/${encodeURIComponent(triggerId)}`);\n }\n\n // ===== Node Reference =====\n\n async listProviders(_identity: InvectIdentity | null) {\n // The /nodes endpoint returns node definitions grouped by provider.\n // Extract unique providers from the response.\n const nodes = await this.request<unknown[]>('GET', '/nodes');\n const providerSet = new Map<string, Record<string, unknown>>();\n for (const node of nodes as Array<Record<string, unknown>>) {\n const p = node.provider as Record<string, unknown> | undefined;\n if (p && typeof p.id === 'string' && !providerSet.has(p.id)) {\n providerSet.set(p.id, p);\n }\n }\n return Array.from(providerSet.values());\n }\n\n async listAvailableNodes(_identity: InvectIdentity | null) {\n return await this.request<unknown[]>('GET', '/nodes');\n }\n}\n","#!/usr/bin/env node\n/**\n * invect-mcp CLI — Standalone MCP server over stdio transport.\n *\n * Connects to a running Invect instance via HTTP API.\n * Designed for Claude Desktop, VS Code Copilot, and other MCP clients.\n *\n * Usage:\n * npx invect-mcp --url http://localhost:3000/invect --api-key YOUR_KEY\n *\n * Environment variables:\n * INVECT_URL — Base URL of the Invect API\n * INVECT_API_KEY — API key for authentication\n */\n\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { HttpClient } from '../backend/client/http-client';\nimport { createMcpServer } from '../backend/mcp-server';\n\n// Re-export building blocks so @invect/cli can import them\nexport { HttpClient } from '../backend/client/http-client';\nexport { createMcpServer } from '../backend/mcp-server';\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv.slice(2));\n\n const url = args.url || process.env.INVECT_URL;\n const apiKey = args['api-key'] || process.env.INVECT_API_KEY;\n\n if (!url) {\n process.stderr.write('Error: --url or INVECT_URL is required.\\n');\n process.stderr.write(\n 'Usage: invect-mcp --url http://localhost:3000/invect --api-key YOUR_KEY\\n',\n );\n process.exit(1);\n }\n\n if (!apiKey) {\n process.stderr.write('Error: --api-key or INVECT_API_KEY is required.\\n');\n process.stderr.write(\n 'Usage: invect-mcp --url http://localhost:3000/invect --api-key YOUR_KEY\\n',\n );\n process.exit(1);\n }\n\n // Create HTTP client pointing at the remote Invect API\n const client = new HttpClient(url, apiKey);\n\n // Create MCP server with all tools\n const server = createMcpServer(client);\n\n // Connect via stdio transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n // Log to stderr (stdout is used by the MCP protocol)\n process.stderr.write(`invect-mcp: Connected to ${url} via stdio transport\\n`);\n}\n\nfunction parseArgs(argv: string[]): Record<string, string> {\n const result: Record<string, string> = {};\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (!arg) {\n continue;\n }\n if (arg.startsWith('--')) {\n const key = arg.slice(2);\n const next = argv[i + 1];\n if (next && !next.startsWith('--')) {\n result[key] = next;\n i++;\n } else {\n result[key] = 'true';\n }\n }\n }\n return result;\n}\n\nmain().catch((err) => {\n process.stderr.write(`invect-mcp: Fatal error: ${err}\\n`);\n process.exit(1);\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { InvectIdentity } from "@invect/core";
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
|
|
4
|
+
//#region src/backend/client/types.d.ts
|
|
5
|
+
/** Sanitized credential (no secrets) */
|
|
6
|
+
interface CredentialSummary {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
type: string;
|
|
10
|
+
provider?: string;
|
|
11
|
+
lastUsedAt?: string;
|
|
12
|
+
createdAt?: string;
|
|
13
|
+
}
|
|
14
|
+
interface InvectClient {
|
|
15
|
+
listFlows(identity: InvectIdentity | null): Promise<unknown>;
|
|
16
|
+
getFlow(identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
17
|
+
getFlowDefinition(identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
18
|
+
createFlow(identity: InvectIdentity | null, data: {
|
|
19
|
+
name: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
}): Promise<unknown>;
|
|
22
|
+
updateFlow(identity: InvectIdentity | null, flowId: string, data: {
|
|
23
|
+
name?: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
}): Promise<unknown>;
|
|
26
|
+
deleteFlow(identity: InvectIdentity | null, flowId: string): Promise<void>;
|
|
27
|
+
validateFlow(identity: InvectIdentity | null, flowId: string, definition: unknown): Promise<{
|
|
28
|
+
valid: boolean;
|
|
29
|
+
errors?: string[];
|
|
30
|
+
}>;
|
|
31
|
+
listVersions(identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
32
|
+
getVersion(identity: InvectIdentity | null, flowId: string, version: string | number | 'latest'): Promise<unknown>;
|
|
33
|
+
publishVersion(identity: InvectIdentity | null, flowId: string, data: unknown): Promise<unknown>;
|
|
34
|
+
startRun(identity: InvectIdentity | null, flowId: string, inputs?: Record<string, unknown>): Promise<unknown>;
|
|
35
|
+
runToNode(identity: InvectIdentity | null, flowId: string, nodeId: string, inputs?: Record<string, unknown>): Promise<unknown>;
|
|
36
|
+
listRuns(identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
37
|
+
getRun(identity: InvectIdentity | null, flowRunId: string): Promise<unknown>;
|
|
38
|
+
cancelRun(identity: InvectIdentity | null, flowRunId: string): Promise<{
|
|
39
|
+
message: string;
|
|
40
|
+
}>;
|
|
41
|
+
pauseRun(identity: InvectIdentity | null, flowRunId: string): Promise<{
|
|
42
|
+
message: string;
|
|
43
|
+
}>;
|
|
44
|
+
resumeRun(identity: InvectIdentity | null, flowRunId: string): Promise<{
|
|
45
|
+
message: string;
|
|
46
|
+
}>;
|
|
47
|
+
getNodeExecutions(identity: InvectIdentity | null, flowRunId: string): Promise<unknown[]>;
|
|
48
|
+
testNode(identity: InvectIdentity | null, nodeType: string, params: Record<string, unknown>, inputData?: Record<string, unknown>): Promise<{
|
|
49
|
+
success: boolean;
|
|
50
|
+
output?: unknown;
|
|
51
|
+
error?: string;
|
|
52
|
+
}>;
|
|
53
|
+
testJsExpression(identity: InvectIdentity | null, expression: string, context: Record<string, unknown>): Promise<{
|
|
54
|
+
success: boolean;
|
|
55
|
+
result?: unknown;
|
|
56
|
+
error?: string;
|
|
57
|
+
}>;
|
|
58
|
+
testMapper(identity: InvectIdentity | null, expression: string, incomingData: Record<string, unknown>): Promise<{
|
|
59
|
+
success: boolean;
|
|
60
|
+
result?: unknown;
|
|
61
|
+
error?: string;
|
|
62
|
+
}>;
|
|
63
|
+
listCredentials(identity: InvectIdentity | null): Promise<CredentialSummary[]>;
|
|
64
|
+
testCredential(identity: InvectIdentity | null, credentialId: string): Promise<{
|
|
65
|
+
success: boolean;
|
|
66
|
+
error?: string;
|
|
67
|
+
}>;
|
|
68
|
+
listTriggers(identity: InvectIdentity | null, flowId: string): Promise<unknown[]>;
|
|
69
|
+
getTrigger(identity: InvectIdentity | null, triggerId: string): Promise<unknown>;
|
|
70
|
+
createTrigger(identity: InvectIdentity | null, input: unknown): Promise<unknown>;
|
|
71
|
+
updateTrigger(identity: InvectIdentity | null, triggerId: string, input: unknown): Promise<unknown>;
|
|
72
|
+
deleteTrigger(identity: InvectIdentity | null, triggerId: string): Promise<void>;
|
|
73
|
+
listProviders(identity: InvectIdentity | null): Promise<unknown[]>;
|
|
74
|
+
listAvailableNodes(identity: InvectIdentity | null): Promise<unknown[]>;
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
//#region src/backend/client/http-client.d.ts
|
|
78
|
+
declare class HttpClient implements InvectClient {
|
|
79
|
+
private baseUrl;
|
|
80
|
+
private apiKey;
|
|
81
|
+
constructor(baseUrl: string, apiKey: string);
|
|
82
|
+
private request;
|
|
83
|
+
/** Health check — throws if API is unreachable */
|
|
84
|
+
healthCheck(): Promise<void>;
|
|
85
|
+
listFlows(_identity: InvectIdentity | null): Promise<unknown>;
|
|
86
|
+
getFlow(_identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
87
|
+
getFlowDefinition(_identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
88
|
+
createFlow(_identity: InvectIdentity | null, data: {
|
|
89
|
+
name: string;
|
|
90
|
+
description?: string;
|
|
91
|
+
}): Promise<unknown>;
|
|
92
|
+
updateFlow(_identity: InvectIdentity | null, flowId: string, data: {
|
|
93
|
+
name?: string;
|
|
94
|
+
description?: string;
|
|
95
|
+
}): Promise<unknown>;
|
|
96
|
+
deleteFlow(_identity: InvectIdentity | null, flowId: string): Promise<void>;
|
|
97
|
+
validateFlow(_identity: InvectIdentity | null, flowId: string, definition: unknown): Promise<{
|
|
98
|
+
valid: boolean;
|
|
99
|
+
errors?: string[];
|
|
100
|
+
}>;
|
|
101
|
+
listVersions(_identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
102
|
+
getVersion(_identity: InvectIdentity | null, flowId: string, version: string | number | 'latest'): Promise<unknown>;
|
|
103
|
+
publishVersion(_identity: InvectIdentity | null, flowId: string, data: unknown): Promise<unknown>;
|
|
104
|
+
startRun(_identity: InvectIdentity | null, flowId: string, inputs?: Record<string, unknown>): Promise<unknown>;
|
|
105
|
+
runToNode(_identity: InvectIdentity | null, flowId: string, nodeId: string, inputs?: Record<string, unknown>): Promise<unknown>;
|
|
106
|
+
listRuns(_identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
107
|
+
getRun(_identity: InvectIdentity | null, flowRunId: string): Promise<unknown>;
|
|
108
|
+
cancelRun(_identity: InvectIdentity | null, flowRunId: string): Promise<{
|
|
109
|
+
message: string;
|
|
110
|
+
}>;
|
|
111
|
+
pauseRun(_identity: InvectIdentity | null, flowRunId: string): Promise<{
|
|
112
|
+
message: string;
|
|
113
|
+
}>;
|
|
114
|
+
resumeRun(_identity: InvectIdentity | null, flowRunId: string): Promise<{
|
|
115
|
+
message: string;
|
|
116
|
+
}>;
|
|
117
|
+
getNodeExecutions(_identity: InvectIdentity | null, flowRunId: string): Promise<unknown[]>;
|
|
118
|
+
testNode(_identity: InvectIdentity | null, nodeType: string, params: Record<string, unknown>, inputData?: Record<string, unknown>): Promise<{
|
|
119
|
+
success: boolean;
|
|
120
|
+
output?: unknown;
|
|
121
|
+
error?: string;
|
|
122
|
+
}>;
|
|
123
|
+
testJsExpression(_identity: InvectIdentity | null, expression: string, context: Record<string, unknown>): Promise<{
|
|
124
|
+
success: boolean;
|
|
125
|
+
result?: unknown;
|
|
126
|
+
error?: string;
|
|
127
|
+
}>;
|
|
128
|
+
testMapper(_identity: InvectIdentity | null, expression: string, incomingData: Record<string, unknown>): Promise<{
|
|
129
|
+
success: boolean;
|
|
130
|
+
result?: unknown;
|
|
131
|
+
error?: string;
|
|
132
|
+
}>;
|
|
133
|
+
listCredentials(_identity: InvectIdentity | null): Promise<CredentialSummary[]>;
|
|
134
|
+
testCredential(_identity: InvectIdentity | null, credentialId: string): Promise<{
|
|
135
|
+
success: boolean;
|
|
136
|
+
error?: string;
|
|
137
|
+
}>;
|
|
138
|
+
listTriggers(_identity: InvectIdentity | null, flowId: string): Promise<unknown[]>;
|
|
139
|
+
getTrigger(_identity: InvectIdentity | null, triggerId: string): Promise<unknown>;
|
|
140
|
+
createTrigger(_identity: InvectIdentity | null, input: unknown): Promise<unknown>;
|
|
141
|
+
updateTrigger(_identity: InvectIdentity | null, triggerId: string, input: unknown): Promise<unknown>;
|
|
142
|
+
deleteTrigger(_identity: InvectIdentity | null, triggerId: string): Promise<void>;
|
|
143
|
+
listProviders(_identity: InvectIdentity | null): Promise<Record<string, unknown>[]>;
|
|
144
|
+
listAvailableNodes(_identity: InvectIdentity | null): Promise<unknown[]>;
|
|
145
|
+
}
|
|
146
|
+
//#endregion
|
|
147
|
+
//#region src/backend/mcp-server.d.ts
|
|
148
|
+
declare function createMcpServer(client: InvectClient): McpServer;
|
|
149
|
+
//#endregion
|
|
150
|
+
export { HttpClient, createMcpServer };
|
|
151
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/backend/client/types.ts","../../src/backend/client/http-client.ts","../../src/backend/mcp-server.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { InvectIdentity } from "@invect/core";
|
|
3
|
+
|
|
4
|
+
//#region src/backend/client/types.d.ts
|
|
5
|
+
/** Sanitized credential (no secrets) */
|
|
6
|
+
interface CredentialSummary {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
type: string;
|
|
10
|
+
provider?: string;
|
|
11
|
+
lastUsedAt?: string;
|
|
12
|
+
createdAt?: string;
|
|
13
|
+
}
|
|
14
|
+
interface InvectClient {
|
|
15
|
+
listFlows(identity: InvectIdentity | null): Promise<unknown>;
|
|
16
|
+
getFlow(identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
17
|
+
getFlowDefinition(identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
18
|
+
createFlow(identity: InvectIdentity | null, data: {
|
|
19
|
+
name: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
}): Promise<unknown>;
|
|
22
|
+
updateFlow(identity: InvectIdentity | null, flowId: string, data: {
|
|
23
|
+
name?: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
}): Promise<unknown>;
|
|
26
|
+
deleteFlow(identity: InvectIdentity | null, flowId: string): Promise<void>;
|
|
27
|
+
validateFlow(identity: InvectIdentity | null, flowId: string, definition: unknown): Promise<{
|
|
28
|
+
valid: boolean;
|
|
29
|
+
errors?: string[];
|
|
30
|
+
}>;
|
|
31
|
+
listVersions(identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
32
|
+
getVersion(identity: InvectIdentity | null, flowId: string, version: string | number | 'latest'): Promise<unknown>;
|
|
33
|
+
publishVersion(identity: InvectIdentity | null, flowId: string, data: unknown): Promise<unknown>;
|
|
34
|
+
startRun(identity: InvectIdentity | null, flowId: string, inputs?: Record<string, unknown>): Promise<unknown>;
|
|
35
|
+
runToNode(identity: InvectIdentity | null, flowId: string, nodeId: string, inputs?: Record<string, unknown>): Promise<unknown>;
|
|
36
|
+
listRuns(identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
37
|
+
getRun(identity: InvectIdentity | null, flowRunId: string): Promise<unknown>;
|
|
38
|
+
cancelRun(identity: InvectIdentity | null, flowRunId: string): Promise<{
|
|
39
|
+
message: string;
|
|
40
|
+
}>;
|
|
41
|
+
pauseRun(identity: InvectIdentity | null, flowRunId: string): Promise<{
|
|
42
|
+
message: string;
|
|
43
|
+
}>;
|
|
44
|
+
resumeRun(identity: InvectIdentity | null, flowRunId: string): Promise<{
|
|
45
|
+
message: string;
|
|
46
|
+
}>;
|
|
47
|
+
getNodeExecutions(identity: InvectIdentity | null, flowRunId: string): Promise<unknown[]>;
|
|
48
|
+
testNode(identity: InvectIdentity | null, nodeType: string, params: Record<string, unknown>, inputData?: Record<string, unknown>): Promise<{
|
|
49
|
+
success: boolean;
|
|
50
|
+
output?: unknown;
|
|
51
|
+
error?: string;
|
|
52
|
+
}>;
|
|
53
|
+
testJsExpression(identity: InvectIdentity | null, expression: string, context: Record<string, unknown>): Promise<{
|
|
54
|
+
success: boolean;
|
|
55
|
+
result?: unknown;
|
|
56
|
+
error?: string;
|
|
57
|
+
}>;
|
|
58
|
+
testMapper(identity: InvectIdentity | null, expression: string, incomingData: Record<string, unknown>): Promise<{
|
|
59
|
+
success: boolean;
|
|
60
|
+
result?: unknown;
|
|
61
|
+
error?: string;
|
|
62
|
+
}>;
|
|
63
|
+
listCredentials(identity: InvectIdentity | null): Promise<CredentialSummary[]>;
|
|
64
|
+
testCredential(identity: InvectIdentity | null, credentialId: string): Promise<{
|
|
65
|
+
success: boolean;
|
|
66
|
+
error?: string;
|
|
67
|
+
}>;
|
|
68
|
+
listTriggers(identity: InvectIdentity | null, flowId: string): Promise<unknown[]>;
|
|
69
|
+
getTrigger(identity: InvectIdentity | null, triggerId: string): Promise<unknown>;
|
|
70
|
+
createTrigger(identity: InvectIdentity | null, input: unknown): Promise<unknown>;
|
|
71
|
+
updateTrigger(identity: InvectIdentity | null, triggerId: string, input: unknown): Promise<unknown>;
|
|
72
|
+
deleteTrigger(identity: InvectIdentity | null, triggerId: string): Promise<void>;
|
|
73
|
+
listProviders(identity: InvectIdentity | null): Promise<unknown[]>;
|
|
74
|
+
listAvailableNodes(identity: InvectIdentity | null): Promise<unknown[]>;
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
//#region src/backend/client/http-client.d.ts
|
|
78
|
+
declare class HttpClient implements InvectClient {
|
|
79
|
+
private baseUrl;
|
|
80
|
+
private apiKey;
|
|
81
|
+
constructor(baseUrl: string, apiKey: string);
|
|
82
|
+
private request;
|
|
83
|
+
/** Health check — throws if API is unreachable */
|
|
84
|
+
healthCheck(): Promise<void>;
|
|
85
|
+
listFlows(_identity: InvectIdentity | null): Promise<unknown>;
|
|
86
|
+
getFlow(_identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
87
|
+
getFlowDefinition(_identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
88
|
+
createFlow(_identity: InvectIdentity | null, data: {
|
|
89
|
+
name: string;
|
|
90
|
+
description?: string;
|
|
91
|
+
}): Promise<unknown>;
|
|
92
|
+
updateFlow(_identity: InvectIdentity | null, flowId: string, data: {
|
|
93
|
+
name?: string;
|
|
94
|
+
description?: string;
|
|
95
|
+
}): Promise<unknown>;
|
|
96
|
+
deleteFlow(_identity: InvectIdentity | null, flowId: string): Promise<void>;
|
|
97
|
+
validateFlow(_identity: InvectIdentity | null, flowId: string, definition: unknown): Promise<{
|
|
98
|
+
valid: boolean;
|
|
99
|
+
errors?: string[];
|
|
100
|
+
}>;
|
|
101
|
+
listVersions(_identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
102
|
+
getVersion(_identity: InvectIdentity | null, flowId: string, version: string | number | 'latest'): Promise<unknown>;
|
|
103
|
+
publishVersion(_identity: InvectIdentity | null, flowId: string, data: unknown): Promise<unknown>;
|
|
104
|
+
startRun(_identity: InvectIdentity | null, flowId: string, inputs?: Record<string, unknown>): Promise<unknown>;
|
|
105
|
+
runToNode(_identity: InvectIdentity | null, flowId: string, nodeId: string, inputs?: Record<string, unknown>): Promise<unknown>;
|
|
106
|
+
listRuns(_identity: InvectIdentity | null, flowId: string): Promise<unknown>;
|
|
107
|
+
getRun(_identity: InvectIdentity | null, flowRunId: string): Promise<unknown>;
|
|
108
|
+
cancelRun(_identity: InvectIdentity | null, flowRunId: string): Promise<{
|
|
109
|
+
message: string;
|
|
110
|
+
}>;
|
|
111
|
+
pauseRun(_identity: InvectIdentity | null, flowRunId: string): Promise<{
|
|
112
|
+
message: string;
|
|
113
|
+
}>;
|
|
114
|
+
resumeRun(_identity: InvectIdentity | null, flowRunId: string): Promise<{
|
|
115
|
+
message: string;
|
|
116
|
+
}>;
|
|
117
|
+
getNodeExecutions(_identity: InvectIdentity | null, flowRunId: string): Promise<unknown[]>;
|
|
118
|
+
testNode(_identity: InvectIdentity | null, nodeType: string, params: Record<string, unknown>, inputData?: Record<string, unknown>): Promise<{
|
|
119
|
+
success: boolean;
|
|
120
|
+
output?: unknown;
|
|
121
|
+
error?: string;
|
|
122
|
+
}>;
|
|
123
|
+
testJsExpression(_identity: InvectIdentity | null, expression: string, context: Record<string, unknown>): Promise<{
|
|
124
|
+
success: boolean;
|
|
125
|
+
result?: unknown;
|
|
126
|
+
error?: string;
|
|
127
|
+
}>;
|
|
128
|
+
testMapper(_identity: InvectIdentity | null, expression: string, incomingData: Record<string, unknown>): Promise<{
|
|
129
|
+
success: boolean;
|
|
130
|
+
result?: unknown;
|
|
131
|
+
error?: string;
|
|
132
|
+
}>;
|
|
133
|
+
listCredentials(_identity: InvectIdentity | null): Promise<CredentialSummary[]>;
|
|
134
|
+
testCredential(_identity: InvectIdentity | null, credentialId: string): Promise<{
|
|
135
|
+
success: boolean;
|
|
136
|
+
error?: string;
|
|
137
|
+
}>;
|
|
138
|
+
listTriggers(_identity: InvectIdentity | null, flowId: string): Promise<unknown[]>;
|
|
139
|
+
getTrigger(_identity: InvectIdentity | null, triggerId: string): Promise<unknown>;
|
|
140
|
+
createTrigger(_identity: InvectIdentity | null, input: unknown): Promise<unknown>;
|
|
141
|
+
updateTrigger(_identity: InvectIdentity | null, triggerId: string, input: unknown): Promise<unknown>;
|
|
142
|
+
deleteTrigger(_identity: InvectIdentity | null, triggerId: string): Promise<void>;
|
|
143
|
+
listProviders(_identity: InvectIdentity | null): Promise<Record<string, unknown>[]>;
|
|
144
|
+
listAvailableNodes(_identity: InvectIdentity | null): Promise<unknown[]>;
|
|
145
|
+
}
|
|
146
|
+
//#endregion
|
|
147
|
+
//#region src/backend/mcp-server.d.ts
|
|
148
|
+
declare function createMcpServer(client: InvectClient): McpServer;
|
|
149
|
+
//#endregion
|
|
150
|
+
export { HttpClient, createMcpServer };
|
|
151
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/backend/client/types.ts","../../src/backend/client/http-client.ts","../../src/backend/mcp-server.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* invect-mcp CLI — Standalone MCP server over stdio transport.
|
|
4
|
+
*
|
|
5
|
+
* Connects to a running Invect instance via HTTP API.
|
|
6
|
+
* Designed for Claude Desktop, VS Code Copilot, and other MCP clients.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* npx invect-mcp --url http://localhost:3000/invect --api-key YOUR_KEY
|
|
10
|
+
*
|
|
11
|
+
* Environment variables:
|
|
12
|
+
* INVECT_URL — Base URL of the Invect API
|
|
13
|
+
* INVECT_API_KEY — API key for authentication
|
|
14
|
+
*/
|
|
15
|
+
export { HttpClient } from '../backend/client/http-client';
|
|
16
|
+
export { createMcpServer } from '../backend/mcp-server';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|