cucumberstudio-mcp 1.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/.env.example +36 -0
- package/.github/workflows/pr-checks.yml +41 -0
- package/.github/workflows/release.yml +194 -0
- package/.prettierignore +26 -0
- package/.prettierrc +14 -0
- package/CLAUDE.md +140 -0
- package/Dockerfile +50 -0
- package/Dockerfile.dev +31 -0
- package/LICENSE +21 -0
- package/README.md +395 -0
- package/build/api/client.d.ts +49 -0
- package/build/api/client.d.ts.map +1 -0
- package/build/api/client.js +204 -0
- package/build/api/client.js.map +1 -0
- package/build/api/types.d.ts +113 -0
- package/build/api/types.d.ts.map +1 -0
- package/build/api/types.js +2 -0
- package/build/api/types.js.map +1 -0
- package/build/config/settings.d.ts +123 -0
- package/build/config/settings.d.ts.map +1 -0
- package/build/config/settings.js +97 -0
- package/build/config/settings.js.map +1 -0
- package/build/constants.d.ts +16 -0
- package/build/constants.d.ts.map +1 -0
- package/build/constants.js +24 -0
- package/build/constants.js.map +1 -0
- package/build/generated/version.d.ts +3 -0
- package/build/generated/version.d.ts.map +1 -0
- package/build/generated/version.js +5 -0
- package/build/generated/version.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +81 -0
- package/build/index.js.map +1 -0
- package/build/mcp-server.d.ts +6 -0
- package/build/mcp-server.d.ts.map +1 -0
- package/build/mcp-server.js +263 -0
- package/build/mcp-server.js.map +1 -0
- package/build/tools/action-words.d.ts +18 -0
- package/build/tools/action-words.d.ts.map +1 -0
- package/build/tools/action-words.js +191 -0
- package/build/tools/action-words.js.map +1 -0
- package/build/tools/projects.d.ts +19 -0
- package/build/tools/projects.d.ts.map +1 -0
- package/build/tools/projects.js +123 -0
- package/build/tools/projects.js.map +1 -0
- package/build/tools/scenarios.d.ts +18 -0
- package/build/tools/scenarios.d.ts.map +1 -0
- package/build/tools/scenarios.js +194 -0
- package/build/tools/scenarios.js.map +1 -0
- package/build/tools/test-runs.d.ts +21 -0
- package/build/tools/test-runs.d.ts.map +1 -0
- package/build/tools/test-runs.js +324 -0
- package/build/tools/test-runs.js.map +1 -0
- package/build/transports/http.d.ts +38 -0
- package/build/transports/http.d.ts.map +1 -0
- package/build/transports/http.js +381 -0
- package/build/transports/http.js.map +1 -0
- package/build/transports/index.d.ts +22 -0
- package/build/transports/index.d.ts.map +1 -0
- package/build/transports/index.js +10 -0
- package/build/transports/index.js.map +1 -0
- package/build/transports/stdio.d.ts +13 -0
- package/build/transports/stdio.d.ts.map +1 -0
- package/build/transports/stdio.js +24 -0
- package/build/transports/stdio.js.map +1 -0
- package/build/utils/errors.d.ts +10 -0
- package/build/utils/errors.d.ts.map +1 -0
- package/build/utils/errors.js +35 -0
- package/build/utils/errors.js.map +1 -0
- package/build/utils/logger-constants.d.ts +15 -0
- package/build/utils/logger-constants.d.ts.map +1 -0
- package/build/utils/logger-constants.js +16 -0
- package/build/utils/logger-constants.js.map +1 -0
- package/build/utils/logger.d.ts +55 -0
- package/build/utils/logger.d.ts.map +1 -0
- package/build/utils/logger.js +113 -0
- package/build/utils/logger.js.map +1 -0
- package/build/utils/validation.d.ts +89 -0
- package/build/utils/validation.d.ts.map +1 -0
- package/build/utils/validation.js +78 -0
- package/build/utils/validation.js.map +1 -0
- package/docker-compose.yml +20 -0
- package/eslint.config.js +97 -0
- package/package.json +92 -0
- package/scripts/generate-version.js +31 -0
- package/src/api/client.ts +286 -0
- package/src/api/types.ts +137 -0
- package/src/config/settings.ts +113 -0
- package/src/constants.ts +29 -0
- package/src/index.ts +99 -0
- package/src/mcp-server.ts +342 -0
- package/src/tools/action-words.ts +240 -0
- package/src/tools/projects.ts +144 -0
- package/src/tools/scenarios.ts +231 -0
- package/src/tools/test-runs.ts +400 -0
- package/src/transports/http.ts +467 -0
- package/src/transports/index.ts +26 -0
- package/src/transports/stdio.ts +28 -0
- package/src/utils/errors.ts +45 -0
- package/src/utils/logger-constants.ts +18 -0
- package/src/utils/logger.ts +150 -0
- package/src/utils/validation.ts +94 -0
- package/test/api/client-with-msw.test.ts +122 -0
- package/test/api/client.test.ts +326 -0
- package/test/api/types.test.ts +88 -0
- package/test/config/settings.test.ts +204 -0
- package/test/mocks/data/action-words.ts +40 -0
- package/test/mocks/data/index.ts +13 -0
- package/test/mocks/data/projects.ts +38 -0
- package/test/mocks/data/scenarios.ts +53 -0
- package/test/mocks/data/test-runs.ts +101 -0
- package/test/mocks/handlers/action-words.ts +52 -0
- package/test/mocks/handlers/index.ts +10 -0
- package/test/mocks/handlers/projects.ts +45 -0
- package/test/mocks/handlers/scenarios.ts +72 -0
- package/test/mocks/handlers/test-runs.ts +106 -0
- package/test/mocks/server.ts +26 -0
- package/test/setup/vitest.setup.ts +18 -0
- package/test/tools/coverage-boost.test.ts +252 -0
- package/test/tools/projects.test.ts +290 -0
- package/test/tools/tools-basic.test.ts +146 -0
- package/test/transports/http-basic.test.ts +87 -0
- package/test/transports/http-simple.test.ts +33 -0
- package/test/transports/stdio.test.ts +73 -0
- package/test/utils/errors.test.ts +117 -0
- package/test/utils/validation.test.ts +261 -0
- package/tsconfig.build.json +8 -0
- package/tsconfig.json +27 -0
- package/vitest.config.ts +43 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
export interface CucumberStudioResponse<T = unknown> {
|
|
2
|
+
data: T;
|
|
3
|
+
included?: Record<string, unknown>[];
|
|
4
|
+
meta?: {
|
|
5
|
+
count?: number;
|
|
6
|
+
total_count?: number;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export interface BaseAttributes {
|
|
10
|
+
id: string;
|
|
11
|
+
type: string;
|
|
12
|
+
attributes: Record<string, unknown>;
|
|
13
|
+
relationships?: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
export interface Project extends BaseAttributes {
|
|
16
|
+
type: 'projects';
|
|
17
|
+
attributes: {
|
|
18
|
+
name: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
created_at: string;
|
|
21
|
+
updated_at: string;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export interface Scenario extends BaseAttributes {
|
|
25
|
+
type: 'scenarios';
|
|
26
|
+
attributes: {
|
|
27
|
+
name: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
definition?: string;
|
|
30
|
+
created_at: string;
|
|
31
|
+
updated_at: string;
|
|
32
|
+
folder_id?: string;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export interface ActionWord extends BaseAttributes {
|
|
36
|
+
type: 'actionwords';
|
|
37
|
+
attributes: {
|
|
38
|
+
name: string;
|
|
39
|
+
description?: string;
|
|
40
|
+
definition?: string;
|
|
41
|
+
created_at: string;
|
|
42
|
+
updated_at: string;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export interface Folder extends BaseAttributes {
|
|
46
|
+
type: 'folders';
|
|
47
|
+
attributes: {
|
|
48
|
+
name: string;
|
|
49
|
+
description?: string;
|
|
50
|
+
created_at: string;
|
|
51
|
+
updated_at: string;
|
|
52
|
+
parent_id?: string;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export interface TestRun extends BaseAttributes {
|
|
56
|
+
type: 'test_runs';
|
|
57
|
+
attributes: {
|
|
58
|
+
name: string;
|
|
59
|
+
description?: string;
|
|
60
|
+
created_at: string;
|
|
61
|
+
updated_at: string;
|
|
62
|
+
execution_environment?: string;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export interface TestExecution extends BaseAttributes {
|
|
66
|
+
type: 'test_executions';
|
|
67
|
+
attributes: {
|
|
68
|
+
status: 'passed' | 'failed' | 'wip' | 'retest' | 'blocked' | 'skipped' | 'undefined';
|
|
69
|
+
created_at: string;
|
|
70
|
+
updated_at: string;
|
|
71
|
+
scenario_id: string;
|
|
72
|
+
test_run_id: string;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export interface Build extends BaseAttributes {
|
|
76
|
+
type: 'builds';
|
|
77
|
+
attributes: {
|
|
78
|
+
name: string;
|
|
79
|
+
description?: string;
|
|
80
|
+
created_at: string;
|
|
81
|
+
updated_at: string;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export interface ExecutionEnvironment extends BaseAttributes {
|
|
85
|
+
type: 'execution_environments';
|
|
86
|
+
attributes: {
|
|
87
|
+
name: string;
|
|
88
|
+
description?: string;
|
|
89
|
+
created_at: string;
|
|
90
|
+
updated_at: string;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export interface Tag extends BaseAttributes {
|
|
94
|
+
type: 'tags';
|
|
95
|
+
attributes: {
|
|
96
|
+
key: string;
|
|
97
|
+
value?: string;
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export interface CucumberStudioError {
|
|
101
|
+
errors: Array<{
|
|
102
|
+
detail: string;
|
|
103
|
+
status: string;
|
|
104
|
+
title: string;
|
|
105
|
+
}>;
|
|
106
|
+
}
|
|
107
|
+
export interface ListParams extends Record<string, unknown> {
|
|
108
|
+
'page[number]'?: number;
|
|
109
|
+
'page[size]'?: number;
|
|
110
|
+
'filter[name]'?: string;
|
|
111
|
+
'filter[tags]'?: string;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
declare const ConfigSchema: z.ZodObject<{
|
|
3
|
+
cucumberStudio: z.ZodObject<{
|
|
4
|
+
baseUrl: z.ZodDefault<z.ZodString>;
|
|
5
|
+
accessToken: z.ZodString;
|
|
6
|
+
clientId: z.ZodString;
|
|
7
|
+
uid: z.ZodString;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
baseUrl: string;
|
|
10
|
+
accessToken: string;
|
|
11
|
+
clientId: string;
|
|
12
|
+
uid: string;
|
|
13
|
+
}, {
|
|
14
|
+
accessToken: string;
|
|
15
|
+
clientId: string;
|
|
16
|
+
uid: string;
|
|
17
|
+
baseUrl?: string | undefined;
|
|
18
|
+
}>;
|
|
19
|
+
server: z.ZodObject<{
|
|
20
|
+
name: z.ZodDefault<z.ZodString>;
|
|
21
|
+
version: z.ZodDefault<z.ZodString>;
|
|
22
|
+
transport: z.ZodDefault<z.ZodEnum<["stdio", "http", "streamable-http"]>>;
|
|
23
|
+
port: z.ZodDefault<z.ZodNumber>;
|
|
24
|
+
host: z.ZodDefault<z.ZodString>;
|
|
25
|
+
}, "strip", z.ZodTypeAny, {
|
|
26
|
+
name: string;
|
|
27
|
+
version: string;
|
|
28
|
+
transport: "stdio" | "http" | "streamable-http";
|
|
29
|
+
port: number;
|
|
30
|
+
host: string;
|
|
31
|
+
}, {
|
|
32
|
+
name?: string | undefined;
|
|
33
|
+
version?: string | undefined;
|
|
34
|
+
transport?: "stdio" | "http" | "streamable-http" | undefined;
|
|
35
|
+
port?: number | undefined;
|
|
36
|
+
host?: string | undefined;
|
|
37
|
+
}>;
|
|
38
|
+
logging: z.ZodObject<{
|
|
39
|
+
level: z.ZodDefault<z.ZodEnum<["error", "warn", "info", "debug", "trace"]>>;
|
|
40
|
+
logApiResponses: z.ZodDefault<z.ZodBoolean>;
|
|
41
|
+
logRequestBodies: z.ZodDefault<z.ZodBoolean>;
|
|
42
|
+
logResponseBodies: z.ZodDefault<z.ZodBoolean>;
|
|
43
|
+
transport: z.ZodDefault<z.ZodEnum<["console", "file", "stderr", "none"]>>;
|
|
44
|
+
filePath: z.ZodOptional<z.ZodString>;
|
|
45
|
+
}, "strip", z.ZodTypeAny, {
|
|
46
|
+
transport: "console" | "file" | "stderr" | "none";
|
|
47
|
+
level: "info" | "error" | "warn" | "debug" | "trace";
|
|
48
|
+
logApiResponses: boolean;
|
|
49
|
+
logRequestBodies: boolean;
|
|
50
|
+
logResponseBodies: boolean;
|
|
51
|
+
filePath?: string | undefined;
|
|
52
|
+
}, {
|
|
53
|
+
transport?: "console" | "file" | "stderr" | "none" | undefined;
|
|
54
|
+
level?: "info" | "error" | "warn" | "debug" | "trace" | undefined;
|
|
55
|
+
logApiResponses?: boolean | undefined;
|
|
56
|
+
logRequestBodies?: boolean | undefined;
|
|
57
|
+
logResponseBodies?: boolean | undefined;
|
|
58
|
+
filePath?: string | undefined;
|
|
59
|
+
}>;
|
|
60
|
+
}, "strip", z.ZodTypeAny, {
|
|
61
|
+
cucumberStudio: {
|
|
62
|
+
baseUrl: string;
|
|
63
|
+
accessToken: string;
|
|
64
|
+
clientId: string;
|
|
65
|
+
uid: string;
|
|
66
|
+
};
|
|
67
|
+
server: {
|
|
68
|
+
name: string;
|
|
69
|
+
version: string;
|
|
70
|
+
transport: "stdio" | "http" | "streamable-http";
|
|
71
|
+
port: number;
|
|
72
|
+
host: string;
|
|
73
|
+
};
|
|
74
|
+
logging: {
|
|
75
|
+
transport: "console" | "file" | "stderr" | "none";
|
|
76
|
+
level: "info" | "error" | "warn" | "debug" | "trace";
|
|
77
|
+
logApiResponses: boolean;
|
|
78
|
+
logRequestBodies: boolean;
|
|
79
|
+
logResponseBodies: boolean;
|
|
80
|
+
filePath?: string | undefined;
|
|
81
|
+
};
|
|
82
|
+
}, {
|
|
83
|
+
cucumberStudio: {
|
|
84
|
+
accessToken: string;
|
|
85
|
+
clientId: string;
|
|
86
|
+
uid: string;
|
|
87
|
+
baseUrl?: string | undefined;
|
|
88
|
+
};
|
|
89
|
+
server: {
|
|
90
|
+
name?: string | undefined;
|
|
91
|
+
version?: string | undefined;
|
|
92
|
+
transport?: "stdio" | "http" | "streamable-http" | undefined;
|
|
93
|
+
port?: number | undefined;
|
|
94
|
+
host?: string | undefined;
|
|
95
|
+
};
|
|
96
|
+
logging: {
|
|
97
|
+
transport?: "console" | "file" | "stderr" | "none" | undefined;
|
|
98
|
+
level?: "info" | "error" | "warn" | "debug" | "trace" | undefined;
|
|
99
|
+
logApiResponses?: boolean | undefined;
|
|
100
|
+
logRequestBodies?: boolean | undefined;
|
|
101
|
+
logResponseBodies?: boolean | undefined;
|
|
102
|
+
filePath?: string | undefined;
|
|
103
|
+
};
|
|
104
|
+
}>;
|
|
105
|
+
export type Config = z.infer<typeof ConfigSchema>;
|
|
106
|
+
export declare class ConfigManager {
|
|
107
|
+
private config;
|
|
108
|
+
/**
|
|
109
|
+
* Load configuration from environment variables
|
|
110
|
+
*/
|
|
111
|
+
loadFromEnvironment(): Config;
|
|
112
|
+
/**
|
|
113
|
+
* Get current configuration
|
|
114
|
+
*/
|
|
115
|
+
getConfig(): Config;
|
|
116
|
+
/**
|
|
117
|
+
* Validate that all required configuration is present
|
|
118
|
+
*/
|
|
119
|
+
validate(): boolean;
|
|
120
|
+
}
|
|
121
|
+
export declare const configManager: ConfigManager;
|
|
122
|
+
export {};
|
|
123
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAYvB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBhB,CAAA;AAEF,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEjD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAsB;IAEpC;;OAEG;IACI,mBAAmB,IAAI,MAAM;IA2CpC;;OAEG;IACI,SAAS,IAAI,MAAM;IAO1B;;OAEG;IACI,QAAQ,IAAI,OAAO;CAQ3B;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAA"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { config as loadDotenv } from 'dotenv';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { SERVER_NAME, SERVER_VERSION, DEFAULT_API_BASE_URL, DEFAULT_PORT, DEFAULT_HOST, DEFAULT_LOG_LEVEL, } from '../constants.js';
|
|
4
|
+
// Configuration schema for type safety and validation
|
|
5
|
+
const ConfigSchema = z.object({
|
|
6
|
+
cucumberStudio: z.object({
|
|
7
|
+
baseUrl: z.string().url().default(DEFAULT_API_BASE_URL),
|
|
8
|
+
accessToken: z.string().min(1),
|
|
9
|
+
clientId: z.string().min(1),
|
|
10
|
+
uid: z.string().min(1),
|
|
11
|
+
}),
|
|
12
|
+
server: z.object({
|
|
13
|
+
name: z.string().default(SERVER_NAME),
|
|
14
|
+
version: z.string().default(SERVER_VERSION),
|
|
15
|
+
transport: z.enum(['stdio', 'http', 'streamable-http']).default('stdio'),
|
|
16
|
+
port: z.number().int().min(1).max(65535).default(DEFAULT_PORT),
|
|
17
|
+
host: z.string().default(DEFAULT_HOST),
|
|
18
|
+
}),
|
|
19
|
+
logging: z.object({
|
|
20
|
+
level: z.enum(['error', 'warn', 'info', 'debug', 'trace']).default(DEFAULT_LOG_LEVEL),
|
|
21
|
+
logApiResponses: z.boolean().default(false),
|
|
22
|
+
logRequestBodies: z.boolean().default(false),
|
|
23
|
+
logResponseBodies: z.boolean().default(false),
|
|
24
|
+
transport: z.enum(['console', 'file', 'stderr', 'none']).default('stderr'),
|
|
25
|
+
filePath: z.string().optional(),
|
|
26
|
+
}),
|
|
27
|
+
});
|
|
28
|
+
export class ConfigManager {
|
|
29
|
+
config = null;
|
|
30
|
+
/**
|
|
31
|
+
* Load configuration from environment variables
|
|
32
|
+
*/
|
|
33
|
+
loadFromEnvironment() {
|
|
34
|
+
// Auto-load .env file if it exists
|
|
35
|
+
loadDotenv({ path: '.env' });
|
|
36
|
+
const rawConfig = {
|
|
37
|
+
cucumberStudio: {
|
|
38
|
+
baseUrl: process.env.CUCUMBERSTUDIO_BASE_URL,
|
|
39
|
+
accessToken: process.env.CUCUMBERSTUDIO_ACCESS_TOKEN,
|
|
40
|
+
clientId: process.env.CUCUMBERSTUDIO_CLIENT_ID,
|
|
41
|
+
uid: process.env.CUCUMBERSTUDIO_UID,
|
|
42
|
+
},
|
|
43
|
+
server: {
|
|
44
|
+
name: process.env.MCP_SERVER_NAME,
|
|
45
|
+
version: process.env.MCP_SERVER_VERSION,
|
|
46
|
+
transport: process.env.MCP_TRANSPORT,
|
|
47
|
+
port: process.env.MCP_PORT ? parseInt(process.env.MCP_PORT, 10) : undefined,
|
|
48
|
+
host: process.env.MCP_HOST,
|
|
49
|
+
},
|
|
50
|
+
logging: {
|
|
51
|
+
level: process.env.LOG_LEVEL,
|
|
52
|
+
logApiResponses: process.env.LOG_API_RESPONSES === 'true',
|
|
53
|
+
logRequestBodies: process.env.LOG_REQUEST_BODIES === 'true',
|
|
54
|
+
logResponseBodies: process.env.LOG_RESPONSE_BODIES === 'true',
|
|
55
|
+
transport: process.env.LOG_TRANSPORT,
|
|
56
|
+
filePath: process.env.LOG_FILE,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
try {
|
|
60
|
+
this.config = ConfigSchema.parse(rawConfig);
|
|
61
|
+
return this.config;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (error instanceof z.ZodError) {
|
|
65
|
+
const missingFields = error.errors.map((e) => e.path.join('.')).join(', ');
|
|
66
|
+
throw new Error(`Configuration validation failed. Missing or invalid fields: ${missingFields}. ` +
|
|
67
|
+
'Please ensure all required environment variables are set: ' +
|
|
68
|
+
'CUCUMBERSTUDIO_ACCESS_TOKEN, CUCUMBERSTUDIO_CLIENT_ID, CUCUMBERSTUDIO_UID');
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get current configuration
|
|
75
|
+
*/
|
|
76
|
+
getConfig() {
|
|
77
|
+
if (!this.config) {
|
|
78
|
+
throw new Error('Configuration not loaded. Call loadFromEnvironment() first.');
|
|
79
|
+
}
|
|
80
|
+
return this.config;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Validate that all required configuration is present
|
|
84
|
+
*/
|
|
85
|
+
validate() {
|
|
86
|
+
try {
|
|
87
|
+
this.getConfig();
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Singleton instance
|
|
96
|
+
export const configManager = new ConfigManager();
|
|
97
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const SERVER_NAME = "cucumberstudio-mcp";
|
|
2
|
+
export declare const SERVER_VERSION = "1.1.0";
|
|
3
|
+
export declare const PROTOCOL_VERSION = "2025-03-26";
|
|
4
|
+
export declare const API_VERSION_HEADER = "application/vnd.api+json; version=1";
|
|
5
|
+
export declare const API_TIMEOUT = 30000;
|
|
6
|
+
export declare const DEFAULT_API_BASE_URL = "https://studio.cucumberstudio.com/api";
|
|
7
|
+
export declare const DEFAULT_PORT = 3000;
|
|
8
|
+
export declare const DEFAULT_HOST = "0.0.0.0";
|
|
9
|
+
export declare const JSON_BODY_LIMIT = "10mb";
|
|
10
|
+
export declare const DEFAULT_CORS_ORIGINS: string[];
|
|
11
|
+
export declare const MAX_PAGE_SIZE = 100;
|
|
12
|
+
export declare const DEFAULT_PAGE_SIZE = 20;
|
|
13
|
+
export declare const REDACTED_STRING = "***REDACTED***";
|
|
14
|
+
export declare const LOG_PREFIX = "\uD83E\uDD52 API";
|
|
15
|
+
export declare const DEFAULT_LOG_LEVEL = "info";
|
|
16
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,uBAAe,CAAA;AACvC,eAAO,MAAM,cAAc,UAAkB,CAAA;AAC7C,eAAO,MAAM,gBAAgB,eAAe,CAAA;AAG5C,eAAO,MAAM,kBAAkB,wCAAwC,CAAA;AACvE,eAAO,MAAM,WAAW,QAAQ,CAAA;AAChC,eAAO,MAAM,oBAAoB,0CAA0C,CAAA;AAG3E,eAAO,MAAM,YAAY,OAAO,CAAA;AAChC,eAAO,MAAM,YAAY,YAAY,CAAA;AACrC,eAAO,MAAM,eAAe,SAAS,CAAA;AACrC,eAAO,MAAM,oBAAoB,UAAwC,CAAA;AAGzE,eAAO,MAAM,aAAa,MAAM,CAAA;AAChC,eAAO,MAAM,iBAAiB,KAAK,CAAA;AAGnC,eAAO,MAAM,eAAe,mBAAmB,CAAA;AAG/C,eAAO,MAAM,UAAU,qBAAW,CAAA;AAClC,eAAO,MAAM,iBAAiB,SAAS,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Import build-time generated version
|
|
2
|
+
import { PACKAGE_VERSION, PACKAGE_NAME } from './generated/version.js';
|
|
3
|
+
// Server Configuration
|
|
4
|
+
export const SERVER_NAME = PACKAGE_NAME;
|
|
5
|
+
export const SERVER_VERSION = PACKAGE_VERSION; // Build-time constant from package.json
|
|
6
|
+
export const PROTOCOL_VERSION = '2025-03-26'; // MCP protocol version
|
|
7
|
+
// API Configuration
|
|
8
|
+
export const API_VERSION_HEADER = 'application/vnd.api+json; version=1';
|
|
9
|
+
export const API_TIMEOUT = 30000; // 30 seconds
|
|
10
|
+
export const DEFAULT_API_BASE_URL = 'https://studio.cucumberstudio.com/api';
|
|
11
|
+
// Network Configuration
|
|
12
|
+
export const DEFAULT_PORT = 3000;
|
|
13
|
+
export const DEFAULT_HOST = '0.0.0.0';
|
|
14
|
+
export const JSON_BODY_LIMIT = '10mb';
|
|
15
|
+
export const DEFAULT_CORS_ORIGINS = ['localhost', '127.0.0.1', '0.0.0.0'];
|
|
16
|
+
// Pagination
|
|
17
|
+
export const MAX_PAGE_SIZE = 100;
|
|
18
|
+
export const DEFAULT_PAGE_SIZE = 20;
|
|
19
|
+
// Security
|
|
20
|
+
export const REDACTED_STRING = '***REDACTED***';
|
|
21
|
+
// Logger
|
|
22
|
+
export const LOG_PREFIX = '🥒 API';
|
|
23
|
+
export const DEFAULT_LOG_LEVEL = 'info';
|
|
24
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAEtE,uBAAuB;AACvB,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAA;AACvC,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAA,CAAC,wCAAwC;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAA,CAAC,uBAAuB;AAEpE,oBAAoB;AACpB,MAAM,CAAC,MAAM,kBAAkB,GAAG,qCAAqC,CAAA;AACvE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAA,CAAC,aAAa;AAC9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,uCAAuC,CAAA;AAE3E,wBAAwB;AACxB,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAA;AAChC,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAA;AACrC,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAA;AACrC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAA;AAEzE,aAAa;AACb,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;AAChC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAEnC,WAAW;AACX,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAA;AAE/C,SAAS;AACT,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAA;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/generated/version.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,UAAU,CAAA;AACtC,eAAO,MAAM,YAAY,uBAAuB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/generated/version.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,4CAA4C;AAE5C,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAA;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAAA"}
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { config as loadDotenv } from 'dotenv';
|
|
4
|
+
import { createCucumberStudioMcpServer } from './mcp-server.js';
|
|
5
|
+
import { StreamableHttpTransport, TransportType } from './transports/index.js';
|
|
6
|
+
import { StderrLogger, getLogLevel } from './utils/logger.js';
|
|
7
|
+
/**
|
|
8
|
+
* Main entry point for the Cucumber Studio MCP Server
|
|
9
|
+
* Supports both STDIO and HTTP transports based on environment variables
|
|
10
|
+
*/
|
|
11
|
+
async function main() {
|
|
12
|
+
// Load .env file first to ensure environment variables are available
|
|
13
|
+
loadDotenv({ path: '.env' });
|
|
14
|
+
// Determine transport based on environment variable
|
|
15
|
+
const transportString = process.env.MCP_TRANSPORT?.toLowerCase() || 'stdio';
|
|
16
|
+
const transport = Object.values(TransportType).includes(transportString)
|
|
17
|
+
? transportString
|
|
18
|
+
: TransportType.STDIO;
|
|
19
|
+
const port = parseInt(process.env.MCP_PORT || '3000', 10);
|
|
20
|
+
const host = process.env.MCP_HOST || '127.0.0.1';
|
|
21
|
+
console.error(`🎯 Starting Cucumber Studio MCP Server with ${transport} transport...`);
|
|
22
|
+
try {
|
|
23
|
+
switch (transport) {
|
|
24
|
+
case TransportType.HTTP:
|
|
25
|
+
case TransportType.STREAMABLE_HTTP: {
|
|
26
|
+
// HTTP/Streamable HTTP transport
|
|
27
|
+
const httpLogger = new StderrLogger({ level: getLogLevel(), prefix: '🌐 HTTP' });
|
|
28
|
+
const httpTransport = new StreamableHttpTransport(createCucumberStudioMcpServer, {
|
|
29
|
+
port,
|
|
30
|
+
host,
|
|
31
|
+
cors: {
|
|
32
|
+
origin: process.env.MCP_CORS_ORIGIN === 'false' ? false : true,
|
|
33
|
+
credentials: true,
|
|
34
|
+
},
|
|
35
|
+
}, httpLogger);
|
|
36
|
+
await httpTransport.start();
|
|
37
|
+
// Handle graceful shutdown for HTTP transport
|
|
38
|
+
const shutdown = async () => {
|
|
39
|
+
console.error('🛑 Shutting down HTTP transport...');
|
|
40
|
+
await httpTransport.close();
|
|
41
|
+
process.exit(0);
|
|
42
|
+
};
|
|
43
|
+
process.on('SIGINT', shutdown);
|
|
44
|
+
process.on('SIGTERM', shutdown);
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
case TransportType.STDIO:
|
|
48
|
+
default: {
|
|
49
|
+
// STDIO transport (default)
|
|
50
|
+
const server = createCucumberStudioMcpServer();
|
|
51
|
+
const stdioTransport = new StdioServerTransport();
|
|
52
|
+
console.error('🚀 CucumberStudio MCP Server running on stdio');
|
|
53
|
+
console.error('📡 Transport: STDIO (standard input/output)');
|
|
54
|
+
console.error('🔄 Protocol: MCP');
|
|
55
|
+
await server.connect(stdioTransport);
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error(`❌ ${transport} transport failed to start:`, error);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Handle graceful shutdown for STDIO transport
|
|
66
|
+
process.on('SIGINT', () => {
|
|
67
|
+
console.error('🛑 Received SIGINT, shutting down gracefully...');
|
|
68
|
+
process.exit(0);
|
|
69
|
+
});
|
|
70
|
+
process.on('SIGTERM', () => {
|
|
71
|
+
console.error('🛑 Received SIGTERM, shutting down gracefully...');
|
|
72
|
+
process.exit(0);
|
|
73
|
+
});
|
|
74
|
+
// Run if this file is executed directly
|
|
75
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
76
|
+
main().catch((error) => {
|
|
77
|
+
console.error('❌ Unhandled error:', error);
|
|
78
|
+
process.exit(1);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAanE;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,SAAS,CAYzD"}
|