@minicor/mcp-server 3.0.0 → 3.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/dist/__tests__/state.test.js +27 -1
- package/dist/__tests__/state.test.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +102 -48
- package/dist/index.js.map +1 -1
- package/dist/lib.d.ts +8 -2
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +48 -7
- package/dist/lib.js.map +1 -1
- package/dist/prompts/debug-execution.d.ts.map +1 -1
- package/dist/prompts/debug-execution.js +5 -3
- package/dist/prompts/debug-execution.js.map +1 -1
- package/dist/setup.js +86 -32
- package/dist/setup.js.map +1 -1
- package/dist/state.d.ts +4 -0
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +11 -0
- package/dist/state.js.map +1 -1
- package/dist/tools/agents.d.ts.map +1 -1
- package/dist/tools/agents.js +34 -20
- package/dist/tools/agents.js.map +1 -1
- package/dist/tools/config-stores.d.ts.map +1 -1
- package/dist/tools/config-stores.js +59 -11
- package/dist/tools/config-stores.js.map +1 -1
- package/dist/tools/core.d.ts.map +1 -1
- package/dist/tools/core.js +141 -33
- package/dist/tools/core.js.map +1 -1
- package/dist/tools/issues.d.ts.map +1 -1
- package/dist/tools/issues.js +41 -9
- package/dist/tools/issues.js.map +1 -1
- package/dist/tools/sync-tools.d.ts.map +1 -1
- package/dist/tools/sync-tools.js +29 -12
- package/dist/tools/sync-tools.js.map +1 -1
- package/dist/tools/tfa.d.ts.map +1 -1
- package/dist/tools/tfa.js +42 -22
- package/dist/tools/tfa.js.map +1 -1
- package/dist/tools/vm-rpa.d.ts.map +1 -1
- package/dist/tools/vm-rpa.js +15 -7
- package/dist/tools/vm-rpa.js.map +1 -1
- package/dist/tools/vm.d.ts.map +1 -1
- package/dist/tools/vm.js +302 -3
- package/dist/tools/vm.js.map +1 -1
- package/dist/tools/workflow-ops.d.ts.map +1 -1
- package/dist/tools/workflow-ops.js +46 -30
- package/dist/tools/workflow-ops.js.map +1 -1
- package/dist/types.d.ts +6 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach } from "vitest";
|
|
2
|
-
import { ldsConnection, setLdsConnection, ldsAuth, vmCache, setVmCache, getCachedVm, } from "../state.js";
|
|
2
|
+
import { ldsConnection, setLdsConnection, ldsAuth, vmCache, setVmCache, getCachedVm, setWorkspaceRegion, getWorkspaceRegion, clearWorkspaceRegionMap, } from "../state.js";
|
|
3
3
|
describe("LdsConnection", () => {
|
|
4
4
|
beforeEach(() => {
|
|
5
5
|
setLdsConnection(null);
|
|
@@ -87,4 +87,30 @@ describe("VM cache", () => {
|
|
|
87
87
|
expect(getCachedVm(1)).toBeUndefined();
|
|
88
88
|
});
|
|
89
89
|
});
|
|
90
|
+
describe("Workspace-region map", () => {
|
|
91
|
+
beforeEach(() => {
|
|
92
|
+
clearWorkspaceRegionMap();
|
|
93
|
+
});
|
|
94
|
+
it("returns undefined for unknown workspace", () => {
|
|
95
|
+
expect(getWorkspaceRegion(999)).toBeUndefined();
|
|
96
|
+
});
|
|
97
|
+
it("stores and retrieves a workspace region", () => {
|
|
98
|
+
setWorkspaceRegion(1, "us");
|
|
99
|
+
setWorkspaceRegion(2, "ca");
|
|
100
|
+
expect(getWorkspaceRegion(1)).toBe("us");
|
|
101
|
+
expect(getWorkspaceRegion(2)).toBe("ca");
|
|
102
|
+
});
|
|
103
|
+
it("overwrites region for the same workspace", () => {
|
|
104
|
+
setWorkspaceRegion(1, "us");
|
|
105
|
+
setWorkspaceRegion(1, "ca");
|
|
106
|
+
expect(getWorkspaceRegion(1)).toBe("ca");
|
|
107
|
+
});
|
|
108
|
+
it("clears all mappings", () => {
|
|
109
|
+
setWorkspaceRegion(1, "us");
|
|
110
|
+
setWorkspaceRegion(2, "ca");
|
|
111
|
+
clearWorkspaceRegionMap();
|
|
112
|
+
expect(getWorkspaceRegion(1)).toBeUndefined();
|
|
113
|
+
expect(getWorkspaceRegion(2)).toBeUndefined();
|
|
114
|
+
});
|
|
115
|
+
});
|
|
90
116
|
//# sourceMappingURL=state.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.test.js","sourceRoot":"","sources":["../../src/__tests__/state.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,OAAO,EACP,UAAU,EACV,WAAW,
|
|
1
|
+
{"version":3,"file":"state.test.js","sourceRoot":"","sources":["../../src/__tests__/state.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Brings your Minicor workspace into Cursor / Claude Code.
|
|
6
6
|
* Build, deploy, and debug VM-based automations from your IDE.
|
|
7
|
+
*
|
|
8
|
+
* Supports simultaneous US and CA region connections — each region
|
|
9
|
+
* gets its own stored credentials and LaminarClient instance.
|
|
7
10
|
*/
|
|
8
|
-
|
|
11
|
+
import { type Region } from "./paths.js";
|
|
12
|
+
export declare function getApiBase(region?: Region): string;
|
|
9
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAOH,OAAO,EAKL,KAAK,MAAM,EACZ,MAAM,YAAY,CAAC;AA2EpB,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAOlD"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Brings your Minicor workspace into Cursor / Claude Code.
|
|
6
6
|
* Build, deploy, and debug VM-based automations from your IDE.
|
|
7
|
+
*
|
|
8
|
+
* Supports simultaneous US and CA region connections — each region
|
|
9
|
+
* gets its own stored credentials and LaminarClient instance.
|
|
7
10
|
*/
|
|
8
11
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
12
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
@@ -26,36 +29,56 @@ import { register as registerBuildRpa } from "./prompts/build-rpa.js";
|
|
|
26
29
|
import { register as registerTfaGuide } from "./prompts/tfa-guide.js";
|
|
27
30
|
// ─── Token management ────────────────────────────────────────
|
|
28
31
|
const REFRESH_BUFFER_MS = 5 * 60 * 1000;
|
|
32
|
+
/**
|
|
33
|
+
* Read and normalize stored tokens into multi-region format.
|
|
34
|
+
* Handles backward-compat with old flat single-region format.
|
|
35
|
+
*/
|
|
29
36
|
function readStoredTokens() {
|
|
30
37
|
try {
|
|
31
38
|
const tokenPath = getTokenPath();
|
|
32
39
|
if (!fs.existsSync(tokenPath))
|
|
33
|
-
return
|
|
34
|
-
|
|
40
|
+
return {};
|
|
41
|
+
const raw = JSON.parse(fs.readFileSync(tokenPath, "utf-8"));
|
|
42
|
+
if (raw.us || raw.ca) {
|
|
43
|
+
return raw;
|
|
44
|
+
}
|
|
45
|
+
if (raw.access_token) {
|
|
46
|
+
const region = raw.region || apiBaseToRegion(raw.api_base || "");
|
|
47
|
+
return { [region]: raw };
|
|
48
|
+
}
|
|
49
|
+
return {};
|
|
35
50
|
}
|
|
36
51
|
catch {
|
|
37
|
-
return
|
|
52
|
+
return {};
|
|
38
53
|
}
|
|
39
54
|
}
|
|
40
|
-
function
|
|
55
|
+
function readRegionTokens(region) {
|
|
56
|
+
return readStoredTokens()[region] ?? null;
|
|
57
|
+
}
|
|
58
|
+
function writeRegionTokens(region, tokens) {
|
|
41
59
|
const writePath = getWriteTokenPath();
|
|
42
60
|
const dir = path.dirname(writePath);
|
|
43
61
|
if (!fs.existsSync(dir))
|
|
44
62
|
fs.mkdirSync(dir, { recursive: true });
|
|
45
|
-
|
|
63
|
+
const existing = readStoredTokens();
|
|
64
|
+
existing[region] = tokens;
|
|
65
|
+
fs.writeFileSync(writePath, JSON.stringify(existing, null, 2) + "\n", {
|
|
46
66
|
mode: 0o600,
|
|
47
67
|
});
|
|
48
68
|
}
|
|
49
|
-
export function getApiBase() {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
69
|
+
export function getApiBase(region) {
|
|
70
|
+
if (region)
|
|
71
|
+
return regionToApiBase(region);
|
|
72
|
+
const all = readStoredTokens();
|
|
73
|
+
const first = all.us ?? all.ca;
|
|
74
|
+
if (first?.region)
|
|
75
|
+
return regionToApiBase(first.region);
|
|
76
|
+
if (first?.api_base)
|
|
77
|
+
return first.api_base;
|
|
55
78
|
return regionToApiBase("us");
|
|
56
79
|
}
|
|
57
|
-
async function refreshAccessToken(refreshToken) {
|
|
58
|
-
const base =
|
|
80
|
+
async function refreshAccessToken(region, refreshToken) {
|
|
81
|
+
const base = regionToApiBase(region);
|
|
59
82
|
try {
|
|
60
83
|
const res = await fetch(`${base}/auth/refresh`, {
|
|
61
84
|
method: "POST",
|
|
@@ -70,67 +93,80 @@ async function refreshAccessToken(refreshToken) {
|
|
|
70
93
|
refresh_token: data.refresh_token || refreshToken,
|
|
71
94
|
expires_at: Date.now() + data.expires_in * 1000,
|
|
72
95
|
api_base: base,
|
|
73
|
-
region
|
|
96
|
+
region,
|
|
74
97
|
};
|
|
75
98
|
}
|
|
76
99
|
catch {
|
|
77
100
|
return null;
|
|
78
101
|
}
|
|
79
102
|
}
|
|
80
|
-
async function getValidToken() {
|
|
81
|
-
const tokens =
|
|
103
|
+
async function getValidToken(region) {
|
|
104
|
+
const tokens = readRegionTokens(region);
|
|
82
105
|
if (!tokens)
|
|
83
|
-
throw new Error(
|
|
106
|
+
throw new Error(`No stored tokens for region ${region}`);
|
|
84
107
|
if (Date.now() < tokens.expires_at - REFRESH_BUFFER_MS) {
|
|
85
108
|
return tokens.access_token;
|
|
86
109
|
}
|
|
87
110
|
if (tokens.refresh_token) {
|
|
88
|
-
console.error(
|
|
89
|
-
const refreshed = await refreshAccessToken(tokens.refresh_token);
|
|
111
|
+
console.error(`Refreshing ${region.toUpperCase()} access token...`);
|
|
112
|
+
const refreshed = await refreshAccessToken(region, tokens.refresh_token);
|
|
90
113
|
if (refreshed) {
|
|
91
|
-
|
|
92
|
-
console.error(
|
|
114
|
+
writeRegionTokens(region, refreshed);
|
|
115
|
+
console.error(`${region.toUpperCase()} token refreshed.`);
|
|
93
116
|
return refreshed.access_token;
|
|
94
117
|
}
|
|
95
118
|
}
|
|
96
|
-
console.error(
|
|
119
|
+
console.error(`Warning: ${region.toUpperCase()} token expired and refresh failed. Run \`minicor-mcp-setup\` to re-authenticate.`);
|
|
97
120
|
return tokens.access_token;
|
|
98
121
|
}
|
|
99
122
|
const DEFAULT_VM_SERVICE_URL = "https://lam-vm-service-ernfuwetfa-uc.a.run.app";
|
|
100
123
|
function getVmServiceBase() {
|
|
101
124
|
return process.env.VM_MANAGER_API_URL || DEFAULT_VM_SERVICE_URL;
|
|
102
125
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
const
|
|
108
|
-
|
|
126
|
+
async function resolveAllAuth() {
|
|
127
|
+
const allTokens = readStoredTokens();
|
|
128
|
+
const results = [];
|
|
129
|
+
for (const r of ["us", "ca"]) {
|
|
130
|
+
const t = allTokens[r];
|
|
131
|
+
if (!t)
|
|
132
|
+
continue;
|
|
133
|
+
try {
|
|
134
|
+
const token = await getValidToken(r);
|
|
135
|
+
results.push({
|
|
136
|
+
region: r,
|
|
137
|
+
auth: { type: "bearer", token },
|
|
138
|
+
baseUrl: regionToApiBase(r),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// skip region if tokens are invalid
|
|
143
|
+
}
|
|
109
144
|
}
|
|
110
|
-
return
|
|
145
|
+
return results;
|
|
111
146
|
}
|
|
112
147
|
// ─── Server state ────────────────────────────────────────────
|
|
113
|
-
|
|
148
|
+
const clients = new Map();
|
|
149
|
+
const currentTokens = new Map();
|
|
114
150
|
const server = new McpServer({
|
|
115
151
|
name: "minicor",
|
|
116
152
|
version: "3.0.0",
|
|
117
153
|
});
|
|
118
|
-
function scheduleTokenRefresh() {
|
|
119
|
-
const tokens =
|
|
154
|
+
function scheduleTokenRefresh(region) {
|
|
155
|
+
const tokens = readRegionTokens(region);
|
|
120
156
|
if (!tokens?.refresh_token)
|
|
121
157
|
return;
|
|
122
158
|
const msUntilRefresh = Math.max(tokens.expires_at - REFRESH_BUFFER_MS - Date.now(), 60_000);
|
|
123
159
|
setTimeout(async () => {
|
|
124
160
|
try {
|
|
125
|
-
const token = await getValidToken();
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
console.error(
|
|
161
|
+
const token = await getValidToken(region);
|
|
162
|
+
clients.set(region, new LaminarClient({ type: "bearer", token }, regionToApiBase(region)));
|
|
163
|
+
currentTokens.set(region, token);
|
|
164
|
+
console.error(`${region.toUpperCase()} token auto-refreshed, client updated.`);
|
|
129
165
|
}
|
|
130
166
|
catch (e) {
|
|
131
|
-
console.error(
|
|
167
|
+
console.error(`${region.toUpperCase()} auto-refresh failed:`, e.message);
|
|
132
168
|
}
|
|
133
|
-
scheduleTokenRefresh();
|
|
169
|
+
scheduleTokenRefresh(region);
|
|
134
170
|
}, msUntilRefresh);
|
|
135
171
|
}
|
|
136
172
|
// ─── Unauthenticated mode ────────────────────────────────────
|
|
@@ -149,14 +185,28 @@ function registerUnauthenticated() {
|
|
|
149
185
|
}));
|
|
150
186
|
}
|
|
151
187
|
// ─── Register all tools and prompts ──────────────────────────
|
|
152
|
-
|
|
188
|
+
function getDefaultRegion() {
|
|
189
|
+
if (clients.has("us"))
|
|
190
|
+
return "us";
|
|
191
|
+
if (clients.has("ca"))
|
|
192
|
+
return "ca";
|
|
193
|
+
return "us";
|
|
194
|
+
}
|
|
153
195
|
function registerAll() {
|
|
154
196
|
const deps = {
|
|
155
197
|
server,
|
|
156
|
-
client: () =>
|
|
157
|
-
|
|
198
|
+
client: (region) => {
|
|
199
|
+
const r = region ?? getDefaultRegion();
|
|
200
|
+
const c = clients.get(r);
|
|
201
|
+
if (!c) {
|
|
202
|
+
throw new Error(`Not authenticated for ${r.toUpperCase()} region. Run \`minicor-mcp-setup\` to add credentials for this region.`);
|
|
203
|
+
}
|
|
204
|
+
return c;
|
|
205
|
+
},
|
|
206
|
+
getApiBase: (region) => regionToApiBase(region ?? getDefaultRegion()),
|
|
158
207
|
getVmServiceBase,
|
|
159
|
-
getAuthToken: () =>
|
|
208
|
+
getAuthToken: (region) => currentTokens.get(region ?? getDefaultRegion()) ?? "",
|
|
209
|
+
availableRegions: () => [...clients.keys()],
|
|
160
210
|
};
|
|
161
211
|
registerCore(deps);
|
|
162
212
|
registerWorkflowOps(deps);
|
|
@@ -174,20 +224,24 @@ function registerAll() {
|
|
|
174
224
|
}
|
|
175
225
|
// ─── Main ────────────────────────────────────────────────────
|
|
176
226
|
async function main() {
|
|
177
|
-
const
|
|
178
|
-
if (
|
|
227
|
+
const authResults = await resolveAllAuth();
|
|
228
|
+
if (authResults.length === 0) {
|
|
179
229
|
console.error("No credentials found. Starting in limited mode.");
|
|
180
230
|
registerUnauthenticated();
|
|
181
231
|
}
|
|
182
232
|
else {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
233
|
+
for (const { region, auth, baseUrl } of authResults) {
|
|
234
|
+
clients.set(region, new LaminarClient(auth, baseUrl));
|
|
235
|
+
currentTokens.set(region, auth.token);
|
|
236
|
+
scheduleTokenRefresh(region);
|
|
237
|
+
}
|
|
238
|
+
const regions = authResults.map((a) => a.region.toUpperCase()).join(" + ");
|
|
239
|
+
console.error(`Authenticated regions: ${regions}`);
|
|
186
240
|
registerAll();
|
|
187
241
|
}
|
|
188
242
|
const transport = new StdioServerTransport();
|
|
189
243
|
await server.connect(transport);
|
|
190
|
-
console.error(
|
|
244
|
+
console.error(authResults.length > 0
|
|
191
245
|
? "Minicor MCP server running on stdio"
|
|
192
246
|
: "Minicor MCP server running (limited mode — run minicor-mcp-setup to authenticate)");
|
|
193
247
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib.d.ts
CHANGED
|
@@ -15,11 +15,17 @@
|
|
|
15
15
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
16
16
|
import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
17
17
|
import { type LaminarAuth } from "./laminar-client.js";
|
|
18
|
+
import { type Region } from "./paths.js";
|
|
18
19
|
export interface MinicorServerOptions {
|
|
19
|
-
/**
|
|
20
|
+
/** Single-region auth (backward compat). If provided, used for the default region. */
|
|
20
21
|
auth?: LaminarAuth;
|
|
21
|
-
/**
|
|
22
|
+
/** Single-region base URL (backward compat). */
|
|
22
23
|
baseUrl?: string;
|
|
24
|
+
/** Per-region auth for multi-region support. Takes precedence over auth/baseUrl. */
|
|
25
|
+
regionAuth?: Partial<Record<Region, {
|
|
26
|
+
auth: LaminarAuth;
|
|
27
|
+
baseUrl?: string;
|
|
28
|
+
}>>;
|
|
23
29
|
/** VM Manager service base URL. Defaults to the Cloud Run instance. */
|
|
24
30
|
vmServiceBaseUrl?: string;
|
|
25
31
|
}
|
package/dist/lib.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAmB,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAoB1D,MAAM,WAAW,oBAAoB;IACnC,sFAAsF;IACtF,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC9E,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAqBD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,SAAS,EACpB,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAyE5D;AAED,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/lib.js
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
16
16
|
import { LaminarClient } from "./laminar-client.js";
|
|
17
|
+
import { regionToApiBase } from "./paths.js";
|
|
17
18
|
import { register as registerCore } from "./tools/core.js";
|
|
18
19
|
import { register as registerWorkflowOps } from "./tools/workflow-ops.js";
|
|
19
20
|
import { register as registerConfigStores } from "./tools/config-stores.js";
|
|
@@ -50,17 +51,57 @@ const DEFAULT_BASE_URL = "https://api.laminar.run";
|
|
|
50
51
|
*/
|
|
51
52
|
export async function createMinicorServer(transport, opts = {}) {
|
|
52
53
|
const server = new McpServer({ name: "minicor", version: "3.0.0" });
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
const clients = new Map();
|
|
55
|
+
const tokens = new Map();
|
|
56
|
+
const baseUrls = new Map();
|
|
57
|
+
if (opts.regionAuth) {
|
|
58
|
+
for (const [r, cfg] of Object.entries(opts.regionAuth)) {
|
|
59
|
+
if (!cfg)
|
|
60
|
+
continue;
|
|
61
|
+
const base = cfg.baseUrl || regionToApiBase(r);
|
|
62
|
+
clients.set(r, new LaminarClient(cfg.auth, base));
|
|
63
|
+
tokens.set(r, cfg.auth.token);
|
|
64
|
+
baseUrls.set(r, base);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (clients.size === 0 && opts.auth) {
|
|
68
|
+
const baseUrl = opts.baseUrl || DEFAULT_BASE_URL;
|
|
69
|
+
const region = baseUrl.includes("ca.api") ? "ca" : "us";
|
|
70
|
+
clients.set(region, new LaminarClient(opts.auth, baseUrl));
|
|
71
|
+
tokens.set(region, opts.auth.token);
|
|
72
|
+
baseUrls.set(region, baseUrl);
|
|
73
|
+
}
|
|
74
|
+
if (clients.size === 0) {
|
|
75
|
+
const baseUrl = opts.baseUrl || DEFAULT_BASE_URL;
|
|
76
|
+
clients.set("us", new LaminarClient({ type: "bearer", token: "" }, baseUrl));
|
|
77
|
+
tokens.set("us", "");
|
|
78
|
+
baseUrls.set("us", baseUrl);
|
|
79
|
+
}
|
|
57
80
|
const vmServiceBase = opts.vmServiceBaseUrl || process.env.VM_MANAGER_API_URL || DEFAULT_VM_SERVICE_URL;
|
|
81
|
+
function getDefaultRegion() {
|
|
82
|
+
if (clients.has("us"))
|
|
83
|
+
return "us";
|
|
84
|
+
if (clients.has("ca"))
|
|
85
|
+
return "ca";
|
|
86
|
+
return "us";
|
|
87
|
+
}
|
|
58
88
|
const deps = {
|
|
59
89
|
server,
|
|
60
|
-
client: () =>
|
|
61
|
-
|
|
90
|
+
client: (region) => {
|
|
91
|
+
const r = region ?? getDefaultRegion();
|
|
92
|
+
const c = clients.get(r);
|
|
93
|
+
if (!c) {
|
|
94
|
+
throw new Error(`No client configured for ${r.toUpperCase()} region.`);
|
|
95
|
+
}
|
|
96
|
+
return c;
|
|
97
|
+
},
|
|
98
|
+
getApiBase: (region) => {
|
|
99
|
+
const r = region ?? getDefaultRegion();
|
|
100
|
+
return baseUrls.get(r) ?? regionToApiBase(r);
|
|
101
|
+
},
|
|
62
102
|
getVmServiceBase: () => vmServiceBase,
|
|
63
|
-
getAuthToken: () =>
|
|
103
|
+
getAuthToken: (region) => tokens.get(region ?? getDefaultRegion()) ?? "",
|
|
104
|
+
availableRegions: () => [...clients.keys()],
|
|
64
105
|
};
|
|
65
106
|
registerAllTools(deps);
|
|
66
107
|
await server.connect(transport);
|
package/dist/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAoB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-execution.d.ts","sourceRoot":"","sources":["../../src/prompts/debug-execution.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"debug-execution.d.ts","sourceRoot":"","sources":["../../src/prompts/debug-execution.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAI5C,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,QA2EpD"}
|
|
@@ -4,14 +4,16 @@ export function register({ server, client }) {
|
|
|
4
4
|
server.prompt("debug-workflow-execution", "Analyze a failed workflow execution and suggest fixes", {
|
|
5
5
|
workflowId: z.string().describe("Workflow ID to debug"),
|
|
6
6
|
executionId: z.string().describe("Failed execution ID"),
|
|
7
|
-
|
|
7
|
+
region: z.string().optional().describe("Region (us or ca)"),
|
|
8
|
+
}, async ({ workflowId, executionId, region }) => {
|
|
8
9
|
const wId = parseInt(workflowId);
|
|
9
10
|
const eId = parseInt(executionId);
|
|
11
|
+
const r = region;
|
|
10
12
|
let executionData;
|
|
11
13
|
let flowsData;
|
|
12
14
|
try {
|
|
13
|
-
executionData = await client().getExecution(wId, eId);
|
|
14
|
-
flowsData = await client().getWorkflowFlows(wId);
|
|
15
|
+
executionData = await client(r).getExecution(wId, eId);
|
|
16
|
+
flowsData = await client(r).getWorkflowFlows(wId);
|
|
15
17
|
}
|
|
16
18
|
catch (e) {
|
|
17
19
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-execution.js","sourceRoot":"","sources":["../../src/prompts/debug-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"debug-execution.js","sourceRoot":"","sources":["../../src/prompts/debug-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAY;IACnD,MAAM,CAAC,MAAM,CACX,0BAA0B,EAC1B,uDAAuD,EACvD;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACvD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACvD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KAC5D,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,MAA4B,CAAC;QACvC,IAAI,aAAkB,CAAC;QACvB,IAAI,SAAc,CAAC;QAEnB,IAAI,CAAC;YACH,aAAa,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvD,SAAS,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAe;wBACrB,OAAO,EAAE;4BACP,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,mCAAmC,CAAC,CAAC,OAAO,EAAE;yBACrD;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAe;oBACrB,OAAO,EAAE;wBACP,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;;;EAGlB,IAAI,CAAC,SAAS,CAAC;;;EAGf,IAAI,CAAC,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;wEAuBmD;qBAC3D;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|