@glubean/mcp 0.1.2

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/bin/mcp.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/index.js";
@@ -0,0 +1,139 @@
1
+ import type { ExportMeta } from "@glubean/scanner";
2
+ type Vars = Record<string, string>;
3
+ export declare function findProjectRoot(startDir: string): Promise<string>;
4
+ export declare function loadEnvFile(envPath: string): Promise<Vars>;
5
+ /**
6
+ * Derive the secrets file path from an env file path.
7
+ * Convention: `.env` → `.env.secrets`, `.env.staging` → `.env.staging.secrets`.
8
+ */
9
+ export declare function deriveSecretsPath(envPath: string): string;
10
+ export declare function discoverTestsFromFile(filePath: string): Promise<{
11
+ fileUrl: string;
12
+ tests: ExportMeta[];
13
+ }>;
14
+ export interface LocalRunResult {
15
+ exportName: string;
16
+ id: string;
17
+ name?: string;
18
+ success: boolean;
19
+ durationMs: number;
20
+ assertions: Array<{
21
+ passed: boolean;
22
+ message: string;
23
+ actual?: unknown;
24
+ expected?: unknown;
25
+ }>;
26
+ logs: Array<{
27
+ message: string;
28
+ data?: unknown;
29
+ }>;
30
+ traces: Array<unknown>;
31
+ error?: {
32
+ message: string;
33
+ stack?: string;
34
+ };
35
+ }
36
+ export interface LocalDebugEvent {
37
+ type: "result" | "assertion" | "log" | "trace";
38
+ testId: string;
39
+ exportName: string;
40
+ testName?: string;
41
+ success?: boolean;
42
+ durationMs?: number;
43
+ message?: string;
44
+ passed?: boolean;
45
+ actual?: unknown;
46
+ expected?: unknown;
47
+ data?: unknown;
48
+ error?: {
49
+ message: string;
50
+ stack?: string;
51
+ };
52
+ }
53
+ export interface LocalRunSnapshot {
54
+ createdAt: string;
55
+ fileUrl: string;
56
+ projectRoot: string;
57
+ summary: {
58
+ total: number;
59
+ passed: number;
60
+ failed: number;
61
+ };
62
+ results: LocalRunResult[];
63
+ includeLogs: boolean;
64
+ includeTraces: boolean;
65
+ filter?: string;
66
+ }
67
+ export interface ConfigDiagnostics {
68
+ projectRoot: string;
69
+ packageJson: {
70
+ path: string;
71
+ exists: boolean;
72
+ };
73
+ envFile: {
74
+ path: string;
75
+ exists: boolean;
76
+ varCount: number;
77
+ hasBaseUrl: boolean;
78
+ };
79
+ secretsFile: {
80
+ path: string;
81
+ exists: boolean;
82
+ secretCount: number;
83
+ };
84
+ testsDir: {
85
+ path: string;
86
+ exists: boolean;
87
+ };
88
+ exploreDir: {
89
+ path: string;
90
+ exists: boolean;
91
+ };
92
+ recommendations: string[];
93
+ }
94
+ export declare function toLocalDebugEvents(snapshot: LocalRunSnapshot): LocalDebugEvent[];
95
+ export declare function filterLocalDebugEvents(events: LocalDebugEvent[], options: {
96
+ type?: LocalDebugEvent["type"];
97
+ testId?: string;
98
+ limit?: number;
99
+ }): LocalDebugEvent[];
100
+ export declare function buildLastRunSummary(snapshot: LocalRunSnapshot): Record<string, unknown>;
101
+ export declare function diagnoseProjectConfig(args: {
102
+ dir?: string;
103
+ envFile?: string;
104
+ }): Promise<ConfigDiagnostics>;
105
+ export declare function runLocalTestsFromFile(args: {
106
+ filePath: string;
107
+ filter?: string;
108
+ envFile?: string;
109
+ includeLogs?: boolean;
110
+ includeTraces?: boolean;
111
+ stopOnFailure?: boolean;
112
+ concurrency?: number;
113
+ }): Promise<{
114
+ fileUrl: string;
115
+ projectRoot: string;
116
+ vars: Vars;
117
+ secrets: Vars;
118
+ results: LocalRunResult[];
119
+ summary: {
120
+ total: number;
121
+ passed: number;
122
+ failed: number;
123
+ };
124
+ error?: string;
125
+ }>;
126
+ export declare const MCP_TOOL_NAMES: {
127
+ readonly discoverTests: "glubean_discover_tests";
128
+ readonly runLocalFile: "glubean_run_local_file";
129
+ readonly getLastRunSummary: "glubean_get_last_run_summary";
130
+ readonly getLocalEvents: "glubean_get_local_events";
131
+ readonly listTestFiles: "glubean_list_test_files";
132
+ readonly diagnoseConfig: "glubean_diagnose_config";
133
+ readonly getMetadata: "glubean_get_metadata";
134
+ readonly openTriggerRun: "glubean_open_trigger_run";
135
+ readonly openGetRun: "glubean_open_get_run";
136
+ readonly openGetRunEvents: "glubean_open_get_run_events";
137
+ };
138
+ export {};
139
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,795 @@
1
+ /**
2
+ * Glubean MCP server (stdio).
3
+ *
4
+ * Purpose:
5
+ * - Let AI agents (Cursor, etc.) run verification-as-code locally
6
+ * - Fetch structured failures (assertions/logs/traces) for automatic fixing
7
+ * - Optionally trigger/tail remote runs via Glubean Open Platform APIs
8
+ *
9
+ * IMPORTANT (stdio transport):
10
+ * - Never write to stdout. Use stderr for logs.
11
+ */
12
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
13
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
14
+ import { z } from "zod";
15
+ import { basename, dirname, resolve } from "node:path";
16
+ import { readFile, stat } from "node:fs/promises";
17
+ import { createHash } from "node:crypto";
18
+ import { pathToFileURL } from "node:url";
19
+ import { LOCAL_RUN_DEFAULTS, TestExecutor, toSingleExecutionOptions } from "@glubean/runner";
20
+ import { createScanner, extractFromSource, scan } from "@glubean/scanner";
21
+ import { MCP_PACKAGE_VERSION, DEFAULT_GENERATED_BY } from "./version.js";
22
+ const METADATA_SCHEMA_VERSION = "1";
23
+ export async function findProjectRoot(startDir) {
24
+ let dir = startDir;
25
+ while (true) {
26
+ try {
27
+ await stat(resolve(dir, "package.json"));
28
+ return dir;
29
+ }
30
+ catch {
31
+ const parent = dirname(dir);
32
+ if (parent === dir)
33
+ break; // filesystem root reached
34
+ dir = parent;
35
+ }
36
+ }
37
+ return startDir;
38
+ }
39
+ export async function loadEnvFile(envPath) {
40
+ try {
41
+ const content = await readFile(envPath, "utf-8");
42
+ return parseEnvContent(content);
43
+ }
44
+ catch {
45
+ return {};
46
+ }
47
+ }
48
+ /**
49
+ * Simple KEY=VALUE parser for .env files.
50
+ * Handles comments, empty lines, and quoted values.
51
+ */
52
+ function parseEnvContent(content) {
53
+ const vars = {};
54
+ for (const line of content.split("\n")) {
55
+ const trimmed = line.trim();
56
+ if (!trimmed || trimmed.startsWith("#"))
57
+ continue;
58
+ const eqIdx = trimmed.indexOf("=");
59
+ if (eqIdx === -1)
60
+ continue;
61
+ const key = trimmed.slice(0, eqIdx).trim();
62
+ let value = trimmed.slice(eqIdx + 1).trim();
63
+ // Strip surrounding quotes
64
+ if ((value.startsWith('"') && value.endsWith('"')) ||
65
+ (value.startsWith("'") && value.endsWith("'"))) {
66
+ value = value.slice(1, -1);
67
+ }
68
+ vars[key] = value;
69
+ }
70
+ return vars;
71
+ }
72
+ /**
73
+ * Derive the secrets file path from an env file path.
74
+ * Convention: `.env` → `.env.secrets`, `.env.staging` → `.env.staging.secrets`.
75
+ */
76
+ export function deriveSecretsPath(envPath) {
77
+ return resolve(dirname(envPath), `${basename(envPath)}.secrets`);
78
+ }
79
+ function normalizeFilePath(path) {
80
+ return path.replaceAll("\\", "/");
81
+ }
82
+ function normalizeFileMap(files) {
83
+ const normalized = {};
84
+ for (const [path, meta] of Object.entries(files)) {
85
+ const normalizedPath = normalizeFilePath(path);
86
+ if (normalized[normalizedPath]) {
87
+ throw new Error(`Duplicate file path after normalization: ${path}`);
88
+ }
89
+ normalized[normalizedPath] = meta;
90
+ }
91
+ return normalized;
92
+ }
93
+ function deriveMetadataStats(files) {
94
+ let testCount = 0;
95
+ const allTags = new Set();
96
+ for (const fileMeta of Object.values(files)) {
97
+ for (const exp of fileMeta.exports) {
98
+ if (exp.tags) {
99
+ exp.tags.forEach((tag) => allTags.add(tag));
100
+ }
101
+ testCount += 1;
102
+ }
103
+ }
104
+ return {
105
+ testCount,
106
+ fileCount: Object.keys(files).length,
107
+ tags: Array.from(allTags).sort(),
108
+ };
109
+ }
110
+ async function computeRootHash(files) {
111
+ const entries = Object.entries(files).sort(([a], [b]) => a.localeCompare(b));
112
+ const payload = entries
113
+ .map(([path, meta]) => `${path}:${meta.hash}`)
114
+ .join("\n");
115
+ const hash = createHash("sha256").update(payload).digest("hex");
116
+ return `sha256-${hash}`;
117
+ }
118
+ async function buildMetadata(scanResult, options) {
119
+ const normalizedFiles = normalizeFileMap(scanResult.files);
120
+ const stats = deriveMetadataStats(normalizedFiles);
121
+ const rootHash = await computeRootHash(normalizedFiles);
122
+ return {
123
+ schemaVersion: METADATA_SCHEMA_VERSION,
124
+ specVersion: scanResult.specVersion,
125
+ generatedBy: options.generatedBy,
126
+ generatedAt: options.generatedAt || new Date().toISOString(),
127
+ rootHash,
128
+ files: normalizedFiles,
129
+ testCount: stats.testCount,
130
+ fileCount: stats.fileCount,
131
+ tags: stats.tags,
132
+ warnings: scanResult.warnings,
133
+ };
134
+ }
135
+ export async function discoverTestsFromFile(filePath) {
136
+ const absolutePath = resolve(filePath);
137
+ const fileUrl = pathToFileURL(absolutePath).toString();
138
+ const content = await readFile(absolutePath, "utf-8");
139
+ const tests = extractFromSource(content);
140
+ return { fileUrl, tests };
141
+ }
142
+ function resolveRootDir(dir) {
143
+ return dir ? resolve(dir) : process.cwd();
144
+ }
145
+ async function scanProject(dir, mode) {
146
+ if (mode === "static") {
147
+ const scanner = createScanner();
148
+ return await scanner.scan(dir);
149
+ }
150
+ return await scan(dir);
151
+ }
152
+ let lastLocalRunSnapshot;
153
+ async function pathExists(path) {
154
+ try {
155
+ await stat(path);
156
+ return true;
157
+ }
158
+ catch {
159
+ return false;
160
+ }
161
+ }
162
+ export function toLocalDebugEvents(snapshot) {
163
+ const events = [];
164
+ for (const result of snapshot.results) {
165
+ events.push({
166
+ type: "result",
167
+ testId: result.id,
168
+ exportName: result.exportName,
169
+ testName: result.name,
170
+ success: result.success,
171
+ durationMs: result.durationMs,
172
+ error: result.error,
173
+ });
174
+ for (const assertion of result.assertions) {
175
+ events.push({
176
+ type: "assertion",
177
+ testId: result.id,
178
+ exportName: result.exportName,
179
+ testName: result.name,
180
+ passed: assertion.passed,
181
+ message: assertion.message,
182
+ actual: assertion.actual,
183
+ expected: assertion.expected,
184
+ });
185
+ }
186
+ for (const log of result.logs) {
187
+ events.push({
188
+ type: "log",
189
+ testId: result.id,
190
+ exportName: result.exportName,
191
+ testName: result.name,
192
+ message: log.message,
193
+ data: log.data,
194
+ });
195
+ }
196
+ for (const trace of result.traces) {
197
+ events.push({
198
+ type: "trace",
199
+ testId: result.id,
200
+ exportName: result.exportName,
201
+ testName: result.name,
202
+ data: trace,
203
+ });
204
+ }
205
+ }
206
+ return events;
207
+ }
208
+ export function filterLocalDebugEvents(events, options) {
209
+ let filtered = events;
210
+ if (options.type) {
211
+ filtered = filtered.filter((event) => event.type === options.type);
212
+ }
213
+ if (options.testId) {
214
+ filtered = filtered.filter((event) => event.testId === options.testId);
215
+ }
216
+ const limit = Math.max(1, Math.min(options.limit ?? 200, 2000));
217
+ return filtered.slice(0, limit);
218
+ }
219
+ export function buildLastRunSummary(snapshot) {
220
+ return {
221
+ createdAt: snapshot.createdAt,
222
+ fileUrl: snapshot.fileUrl,
223
+ projectRoot: snapshot.projectRoot,
224
+ summary: snapshot.summary,
225
+ includeLogs: snapshot.includeLogs,
226
+ includeTraces: snapshot.includeTraces,
227
+ filter: snapshot.filter,
228
+ testIds: snapshot.results.map((r) => r.id),
229
+ eventCounts: {
230
+ result: snapshot.results.length,
231
+ assertion: snapshot.results.reduce((acc, r) => acc + r.assertions.length, 0),
232
+ log: snapshot.results.reduce((acc, r) => acc + r.logs.length, 0),
233
+ trace: snapshot.results.reduce((acc, r) => acc + r.traces.length, 0),
234
+ },
235
+ };
236
+ }
237
+ export async function diagnoseProjectConfig(args) {
238
+ const rootDir = resolveRootDir(args.dir);
239
+ const projectRoot = await findProjectRoot(rootDir);
240
+ const packageJsonPath = resolve(projectRoot, "package.json");
241
+ const envPath = args.envFile ? resolve(args.envFile) : resolve(projectRoot, ".env");
242
+ const secretsPath = deriveSecretsPath(envPath);
243
+ const [packageJsonExists, envExists, secretsExists, testsDirExists, exploreDirExists] = await Promise.all([
244
+ pathExists(packageJsonPath),
245
+ pathExists(envPath),
246
+ pathExists(secretsPath),
247
+ pathExists(resolve(projectRoot, "tests")),
248
+ pathExists(resolve(projectRoot, "explore")),
249
+ ]);
250
+ const envVars = envExists ? await loadEnvFile(envPath) : {};
251
+ const secrets = secretsExists ? await loadEnvFile(secretsPath) : {};
252
+ const recommendations = [];
253
+ if (!packageJsonExists) {
254
+ recommendations.push('Missing "package.json" at project root.');
255
+ }
256
+ if (!envExists) {
257
+ recommendations.push('Missing ".env" file (expected BASE_URL).');
258
+ }
259
+ else if (!("BASE_URL" in envVars)) {
260
+ recommendations.push('Add BASE_URL to ".env" for HTTP tests.');
261
+ }
262
+ if (!secretsExists) {
263
+ recommendations.push('Missing ".env.secrets" file. Add it when tests require secrets.');
264
+ }
265
+ if (!testsDirExists && !exploreDirExists) {
266
+ recommendations.push('Create "tests/" or "explore/" to add runnable test files.');
267
+ }
268
+ return {
269
+ projectRoot,
270
+ packageJson: { path: packageJsonPath, exists: packageJsonExists },
271
+ envFile: {
272
+ path: envPath,
273
+ exists: envExists,
274
+ varCount: Object.keys(envVars).length,
275
+ hasBaseUrl: "BASE_URL" in envVars,
276
+ },
277
+ secretsFile: {
278
+ path: secretsPath,
279
+ exists: secretsExists,
280
+ secretCount: Object.keys(secrets).length,
281
+ },
282
+ testsDir: {
283
+ path: resolve(projectRoot, "tests"),
284
+ exists: testsDirExists,
285
+ },
286
+ exploreDir: {
287
+ path: resolve(projectRoot, "explore"),
288
+ exists: exploreDirExists,
289
+ },
290
+ recommendations,
291
+ };
292
+ }
293
+ export async function runLocalTestsFromFile(args) {
294
+ const absolutePath = resolve(args.filePath);
295
+ const testDir = dirname(absolutePath);
296
+ const projectRoot = await findProjectRoot(testDir);
297
+ const envPath = args.envFile ? resolve(args.envFile) : resolve(projectRoot, ".env");
298
+ const secretsPath = deriveSecretsPath(envPath);
299
+ const [vars, secrets] = await Promise.all([
300
+ loadEnvFile(envPath),
301
+ loadEnvFile(secretsPath),
302
+ ]);
303
+ const { fileUrl, tests } = await discoverTestsFromFile(absolutePath);
304
+ const hasOnly = tests.some((t) => t.only);
305
+ const normalizedFilter = args.filter?.toLowerCase().trim();
306
+ const selected = tests.filter((t) => {
307
+ if (t.skip)
308
+ return false;
309
+ if (hasOnly && !t.only)
310
+ return false;
311
+ if (!normalizedFilter)
312
+ return true;
313
+ const haystack = [t.id, t.name ?? "", ...(t.tags ?? [])]
314
+ .join(" ")
315
+ .toLowerCase();
316
+ return haystack.includes(normalizedFilter);
317
+ });
318
+ if (selected.length === 0) {
319
+ return {
320
+ fileUrl,
321
+ projectRoot,
322
+ vars,
323
+ secrets,
324
+ results: [],
325
+ summary: { total: 0, passed: 0, failed: 0 },
326
+ error: tests.length === 0
327
+ ? "No tests discovered in file. Check that exports use test() from @glubean/sdk."
328
+ : `No tests matched filter "${args.filter}". Available: ${tests.map((t) => t.id).join(", ")}`,
329
+ };
330
+ }
331
+ const shared = {
332
+ ...LOCAL_RUN_DEFAULTS,
333
+ failFast: Boolean(args.stopOnFailure),
334
+ concurrency: Math.max(1, args.concurrency ?? 1),
335
+ };
336
+ const executor = TestExecutor.fromSharedConfig(shared, {
337
+ cwd: projectRoot,
338
+ });
339
+ const concurrency = shared.concurrency;
340
+ const stopOnFailure = shared.failFast;
341
+ const includeLogs = args.includeLogs ?? true;
342
+ const includeTraces = args.includeTraces ?? false;
343
+ const results = [];
344
+ let nextIndex = 0;
345
+ let stop = false;
346
+ const runNext = async () => {
347
+ while (!stop) {
348
+ const index = nextIndex++;
349
+ if (index >= selected.length)
350
+ return;
351
+ const test = selected[index];
352
+ const start = Date.now();
353
+ const logs = [];
354
+ const assertions = [];
355
+ const traces = [];
356
+ let statusSuccess = false;
357
+ let errorMessage;
358
+ let errorStack;
359
+ for await (const event of executor.run(fileUrl, test.id, {
360
+ vars,
361
+ secrets,
362
+ }, { ...toSingleExecutionOptions(shared), exportName: test.exportName })) {
363
+ switch (event.type) {
364
+ case "log":
365
+ if (includeLogs) {
366
+ logs.push({ message: event.message, data: event.data });
367
+ }
368
+ break;
369
+ case "assertion":
370
+ assertions.push({
371
+ passed: event.passed,
372
+ message: event.message,
373
+ actual: event.actual,
374
+ expected: event.expected,
375
+ });
376
+ break;
377
+ case "trace":
378
+ if (includeTraces)
379
+ traces.push(event.data);
380
+ break;
381
+ case "status":
382
+ statusSuccess = event.status === "completed";
383
+ if (event.error)
384
+ errorMessage = event.error;
385
+ if (event.stack)
386
+ errorStack = event.stack;
387
+ break;
388
+ case "error":
389
+ errorMessage = event.message;
390
+ break;
391
+ }
392
+ }
393
+ const allAssertionsPassed = assertions.every((a) => a.passed);
394
+ const success = statusSuccess && allAssertionsPassed && !errorMessage;
395
+ const result = {
396
+ exportName: test.exportName,
397
+ id: test.id,
398
+ name: test.name,
399
+ success,
400
+ durationMs: Date.now() - start,
401
+ assertions,
402
+ logs,
403
+ traces,
404
+ error: errorMessage ? { message: errorMessage, stack: errorStack } : undefined,
405
+ };
406
+ results.push(result);
407
+ if (!success && stopOnFailure) {
408
+ stop = true;
409
+ return;
410
+ }
411
+ }
412
+ };
413
+ const workers = Array.from({ length: Math.min(concurrency, selected.length || 1) }, () => runNext());
414
+ await Promise.all(workers);
415
+ const passed = results.filter((r) => r.success).length;
416
+ const failed = results.filter((r) => !r.success).length;
417
+ return {
418
+ fileUrl,
419
+ projectRoot,
420
+ vars,
421
+ secrets,
422
+ results,
423
+ summary: { total: results.length, passed, failed },
424
+ };
425
+ }
426
+ function bearerHeaders(token) {
427
+ if (!token)
428
+ return {};
429
+ return { Authorization: `Bearer ${token}` };
430
+ }
431
+ async function fetchJson(url, init) {
432
+ const res = await fetch(url, init);
433
+ const text = await res.text();
434
+ if (!res.ok) {
435
+ throw new Error(`HTTP ${res.status} ${res.statusText}: ${text.slice(0, 2000)}`);
436
+ }
437
+ if (!text)
438
+ return null;
439
+ try {
440
+ return JSON.parse(text);
441
+ }
442
+ catch {
443
+ return text;
444
+ }
445
+ }
446
+ const server = new McpServer({
447
+ name: "glubean",
448
+ version: MCP_PACKAGE_VERSION,
449
+ });
450
+ export const MCP_TOOL_NAMES = {
451
+ discoverTests: "glubean_discover_tests",
452
+ runLocalFile: "glubean_run_local_file",
453
+ getLastRunSummary: "glubean_get_last_run_summary",
454
+ getLocalEvents: "glubean_get_local_events",
455
+ listTestFiles: "glubean_list_test_files",
456
+ diagnoseConfig: "glubean_diagnose_config",
457
+ getMetadata: "glubean_get_metadata",
458
+ openTriggerRun: "glubean_open_trigger_run",
459
+ openGetRun: "glubean_open_get_run",
460
+ openGetRunEvents: "glubean_open_get_run_events",
461
+ };
462
+ server.registerTool(MCP_TOOL_NAMES.discoverTests, {
463
+ description: "Discover Glubean test exports from a file path and return their metadata.",
464
+ inputSchema: {
465
+ filePath: z
466
+ .string()
467
+ .describe("Path to a test module file (e.g. tests/api.test.ts)"),
468
+ },
469
+ }, async (input) => {
470
+ const { filePath } = input;
471
+ const { tests } = await discoverTestsFromFile(filePath);
472
+ return {
473
+ content: [
474
+ {
475
+ type: "text",
476
+ text: JSON.stringify({ tests }, null, 2),
477
+ },
478
+ ],
479
+ };
480
+ });
481
+ server.registerTool(MCP_TOOL_NAMES.runLocalFile, {
482
+ description: "Run Glubean test exports from a file locally and return structured results for AI debugging/fixing.",
483
+ inputSchema: {
484
+ filePath: z.string().describe("Path to a test module file"),
485
+ filter: z
486
+ .string()
487
+ .optional()
488
+ .describe("Filter by id/name/tag (substring match)"),
489
+ envFile: z
490
+ .string()
491
+ .optional()
492
+ .describe("Path to .env file (default: <projectRoot>/.env)"),
493
+ includeLogs: z
494
+ .boolean()
495
+ .optional()
496
+ .describe("Include ctx.log events (default: true)"),
497
+ includeTraces: z
498
+ .boolean()
499
+ .optional()
500
+ .describe("Include ctx.trace events (default: false)"),
501
+ stopOnFailure: z
502
+ .boolean()
503
+ .optional()
504
+ .describe("Stop after first failed test (default: false)"),
505
+ concurrency: z
506
+ .number()
507
+ .int()
508
+ .min(1)
509
+ .max(16)
510
+ .optional()
511
+ .describe("Parallelism (default: 1)"),
512
+ },
513
+ }, async (input) => {
514
+ const result = await runLocalTestsFromFile({
515
+ filePath: input.filePath,
516
+ filter: input.filter,
517
+ envFile: input.envFile,
518
+ includeLogs: input.includeLogs,
519
+ includeTraces: input.includeTraces,
520
+ stopOnFailure: input.stopOnFailure,
521
+ concurrency: input.concurrency,
522
+ });
523
+ const safe = {
524
+ projectRoot: result.projectRoot,
525
+ fileUrl: result.fileUrl,
526
+ varsCount: Object.keys(result.vars).length,
527
+ secretsCount: Object.keys(result.secrets).length,
528
+ summary: result.summary,
529
+ results: result.results,
530
+ };
531
+ if (result.error) {
532
+ safe.error = result.error;
533
+ }
534
+ lastLocalRunSnapshot = {
535
+ createdAt: new Date().toISOString(),
536
+ fileUrl: result.fileUrl,
537
+ projectRoot: result.projectRoot,
538
+ summary: result.summary,
539
+ results: result.results,
540
+ includeLogs: input.includeLogs ?? true,
541
+ includeTraces: input.includeTraces ?? false,
542
+ filter: input.filter,
543
+ };
544
+ return {
545
+ content: [{ type: "text", text: JSON.stringify(safe, null, 2) }],
546
+ };
547
+ });
548
+ server.registerTool(MCP_TOOL_NAMES.getLastRunSummary, {
549
+ description: "Return summary of the most recent glubean_run_local_file execution.",
550
+ inputSchema: {},
551
+ }, () => {
552
+ if (!lastLocalRunSnapshot) {
553
+ return {
554
+ content: [{
555
+ type: "text",
556
+ text: JSON.stringify({ error: "No local run snapshot available. Run glubean_run_local_file first." }, null, 2),
557
+ }],
558
+ };
559
+ }
560
+ return {
561
+ content: [{
562
+ type: "text",
563
+ text: JSON.stringify(buildLastRunSummary(lastLocalRunSnapshot), null, 2),
564
+ }],
565
+ };
566
+ });
567
+ server.registerTool(MCP_TOOL_NAMES.getLocalEvents, {
568
+ description: "Return filtered local events from the most recent glubean_run_local_file execution.",
569
+ inputSchema: {
570
+ type: z
571
+ .enum(["result", "assertion", "log", "trace"])
572
+ .optional()
573
+ .describe("Filter by local event type"),
574
+ testId: z
575
+ .string()
576
+ .optional()
577
+ .describe("Filter by discovered test id"),
578
+ limit: z
579
+ .number()
580
+ .int()
581
+ .min(1)
582
+ .max(2000)
583
+ .optional()
584
+ .describe("Maximum events returned (default: 200)"),
585
+ },
586
+ }, (input) => {
587
+ if (!lastLocalRunSnapshot) {
588
+ return {
589
+ content: [{
590
+ type: "text",
591
+ text: JSON.stringify({ error: "No local run snapshot available. Run glubean_run_local_file first." }, null, 2),
592
+ }],
593
+ };
594
+ }
595
+ const events = toLocalDebugEvents(lastLocalRunSnapshot);
596
+ const filtered = filterLocalDebugEvents(events, {
597
+ type: input.type,
598
+ testId: input.testId,
599
+ limit: input.limit,
600
+ });
601
+ return {
602
+ content: [{
603
+ type: "text",
604
+ text: JSON.stringify({
605
+ availableTotal: events.length,
606
+ returned: filtered.length,
607
+ filters: {
608
+ type: input.type,
609
+ testId: input.testId,
610
+ limit: input.limit ?? 200,
611
+ },
612
+ events: filtered,
613
+ }, null, 2),
614
+ }],
615
+ };
616
+ });
617
+ server.registerTool(MCP_TOOL_NAMES.listTestFiles, {
618
+ description: "List Glubean test files in a directory (lightweight index, no file writes).",
619
+ inputSchema: {
620
+ dir: z
621
+ .string()
622
+ .optional()
623
+ .describe("Project root directory (default: current working directory)"),
624
+ mode: z
625
+ .enum(["static", "runtime"])
626
+ .optional()
627
+ .describe('Scan mode: "static" (no runtime imports, default) or "runtime" (most accurate)'),
628
+ },
629
+ }, async (input) => {
630
+ const rootDir = resolveRootDir(input.dir);
631
+ const mode = input.mode ?? "static";
632
+ const result = await scanProject(rootDir, mode);
633
+ return {
634
+ content: [
635
+ {
636
+ type: "text",
637
+ text: JSON.stringify({
638
+ rootDir,
639
+ mode,
640
+ fileCount: result.fileCount,
641
+ files: Object.keys(result.files).sort(),
642
+ warnings: result.warnings,
643
+ }, null, 2),
644
+ },
645
+ ],
646
+ };
647
+ });
648
+ server.registerTool(MCP_TOOL_NAMES.diagnoseConfig, {
649
+ description: "Diagnose local project config (.env, .env.secrets, package.json, tests/explore dirs).",
650
+ inputSchema: {
651
+ dir: z
652
+ .string()
653
+ .optional()
654
+ .describe("Project root directory (default: current working directory)"),
655
+ envFile: z
656
+ .string()
657
+ .optional()
658
+ .describe("Path to .env file (default: <projectRoot>/.env)"),
659
+ },
660
+ }, async (input) => {
661
+ const diagnostics = await diagnoseProjectConfig(input);
662
+ return {
663
+ content: [{
664
+ type: "text",
665
+ text: JSON.stringify(diagnostics, null, 2),
666
+ }],
667
+ };
668
+ });
669
+ server.registerTool(MCP_TOOL_NAMES.getMetadata, {
670
+ description: "Generate metadata (equivalent to metadata.json) in-memory for AI use, without writing to disk.",
671
+ inputSchema: {
672
+ dir: z
673
+ .string()
674
+ .optional()
675
+ .describe("Project root directory (default: current working directory)"),
676
+ mode: z
677
+ .enum(["runtime", "static"])
678
+ .optional()
679
+ .describe('Scan mode: "runtime" (most accurate, default) or "static" (no runtime imports)'),
680
+ generatedBy: z
681
+ .string()
682
+ .optional()
683
+ .describe(`Override generatedBy field (default: "${DEFAULT_GENERATED_BY}")`),
684
+ },
685
+ }, async (input) => {
686
+ const rootDir = resolveRootDir(input.dir);
687
+ const mode = input.mode ?? "runtime";
688
+ const result = await scanProject(rootDir, mode);
689
+ const metadata = await buildMetadata(result, {
690
+ generatedBy: input.generatedBy ?? DEFAULT_GENERATED_BY,
691
+ });
692
+ return {
693
+ content: [
694
+ {
695
+ type: "text",
696
+ text: JSON.stringify({
697
+ rootDir,
698
+ mode,
699
+ metadata,
700
+ }, null, 2),
701
+ },
702
+ ],
703
+ };
704
+ });
705
+ server.registerTool(MCP_TOOL_NAMES.openTriggerRun, {
706
+ description: "Trigger a remote run via Glubean Open Platform API (POST /open/v1/runs).",
707
+ inputSchema: {
708
+ apiUrl: z.string().describe("Base API URL, e.g. https://api.glubean.com"),
709
+ token: z.string().describe("Project token with runs:write scope"),
710
+ projectId: z.string().describe("Project ID (short id)"),
711
+ bundleId: z.string().describe("Bundle ID (short id)"),
712
+ jobId: z.string().optional().describe("Optional job ID"),
713
+ },
714
+ }, async (input) => {
715
+ const { apiUrl, token, projectId, bundleId, jobId } = input;
716
+ const url = `${apiUrl.replace(/\/$/, "")}/open/v1/runs`;
717
+ const body = { projectId, bundleId, jobId };
718
+ const json = await fetchJson(url, {
719
+ method: "POST",
720
+ headers: { "Content-Type": "application/json", ...bearerHeaders(token) },
721
+ body: JSON.stringify(body),
722
+ });
723
+ return { content: [{ type: "text", text: JSON.stringify(json, null, 2) }] };
724
+ });
725
+ server.registerTool(MCP_TOOL_NAMES.openGetRun, {
726
+ description: "Get run status via Glubean Open Platform API (GET /open/v1/runs/:runId).",
727
+ inputSchema: {
728
+ apiUrl: z.string().describe("Base API URL, e.g. https://api.glubean.com"),
729
+ token: z.string().describe("Project token with runs:read scope"),
730
+ runId: z.string().describe("Run ID"),
731
+ },
732
+ }, async (input) => {
733
+ const { apiUrl, token, runId } = input;
734
+ const url = `${apiUrl.replace(/\/$/, "")}/open/v1/runs/${encodeURIComponent(runId)}`;
735
+ const json = await fetchJson(url, {
736
+ method: "GET",
737
+ headers: bearerHeaders(token),
738
+ });
739
+ return { content: [{ type: "text", text: JSON.stringify(json, null, 2) }] };
740
+ });
741
+ server.registerTool(MCP_TOOL_NAMES.openGetRunEvents, {
742
+ description: "Fetch a page of run events via Glubean Open Platform API (GET /open/v1/runs/:runId/events).",
743
+ inputSchema: {
744
+ apiUrl: z.string().describe("Base API URL, e.g. https://api.glubean.com"),
745
+ token: z.string().describe("Project token with runs:read scope"),
746
+ runId: z.string().describe("Run ID"),
747
+ afterSeq: z
748
+ .number()
749
+ .int()
750
+ .min(0)
751
+ .optional()
752
+ .describe("Cursor: return events after this seq"),
753
+ limit: z
754
+ .number()
755
+ .int()
756
+ .min(1)
757
+ .max(1000)
758
+ .optional()
759
+ .describe("Max events (default server: 100)"),
760
+ type: z
761
+ .string()
762
+ .optional()
763
+ .describe("Filter by event type (log/assert/trace/result)"),
764
+ },
765
+ }, async (input) => {
766
+ const { apiUrl, token, runId, afterSeq, limit, type } = input;
767
+ const base = `${apiUrl.replace(/\/$/, "")}/open/v1/runs/${encodeURIComponent(runId)}/events`;
768
+ const params = new URLSearchParams();
769
+ if (afterSeq !== undefined)
770
+ params.set("afterSeq", String(afterSeq));
771
+ if (limit !== undefined)
772
+ params.set("limit", String(limit));
773
+ if (type)
774
+ params.set("type", type);
775
+ const qs = params.toString();
776
+ const url = qs ? `${base}?${qs}` : base;
777
+ const json = await fetchJson(url, {
778
+ method: "GET",
779
+ headers: bearerHeaders(token),
780
+ });
781
+ return { content: [{ type: "text", text: JSON.stringify(json, null, 2) }] };
782
+ });
783
+ async function main() {
784
+ const transport = new StdioServerTransport();
785
+ await server.connect(transport);
786
+ console.error("glubean MCP server running (stdio)");
787
+ }
788
+ // Auto-start when run directly
789
+ const isMain = process.argv[1] && (process.argv[1].endsWith("/mcp.js") ||
790
+ process.argv[1].endsWith("/index.js") ||
791
+ process.argv[1].includes("@glubean/mcp"));
792
+ if (isMain) {
793
+ main();
794
+ }
795
+ //# 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,3 @@
1
+ export declare const MCP_PACKAGE_VERSION: string;
2
+ export declare const DEFAULT_GENERATED_BY: string;
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAC/C,eAAO,MAAM,oBAAoB,QAAwC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { createRequire } from "node:module";
2
+ const require = createRequire(import.meta.url);
3
+ const pkg = require("../package.json");
4
+ export const MCP_PACKAGE_VERSION = pkg.version;
5
+ export const DEFAULT_GENERATED_BY = `@glubean/mcp@${MCP_PACKAGE_VERSION}`;
6
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC,OAAO,CAAC;AAC/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,mBAAmB,EAAE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@glubean/mcp",
3
+ "version": "0.1.2",
4
+ "type": "module",
5
+ "bin": {
6
+ "glubean-mcp": "./bin/mcp.js"
7
+ },
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "bin",
16
+ "dist"
17
+ ],
18
+ "dependencies": {
19
+ "@modelcontextprotocol/sdk": "^1.18.0",
20
+ "dotenv": "^16.4.0",
21
+ "zod": "^3.24.0",
22
+ "@glubean/scanner": "0.1.2",
23
+ "@glubean/runner": "0.1.2"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^22.0.0"
27
+ },
28
+ "scripts": {
29
+ "build": "tsc -p tsconfig.build.json",
30
+ "test": "vitest run"
31
+ }
32
+ }