cucumberstudio-mcp 1.1.3 → 1.1.4

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.
Files changed (76) hide show
  1. package/README.md +53 -7
  2. package/build/api/client.js +0 -1
  3. package/build/api/types.js +0 -1
  4. package/build/config/settings.js +8 -6
  5. package/build/constants.js +0 -1
  6. package/build/generated/version.js +1 -2
  7. package/build/index.dxt.js +39 -0
  8. package/build/index.js +0 -1
  9. package/build/mcp-server.js +0 -1
  10. package/build/tools/action-words.js +0 -1
  11. package/build/tools/projects.js +0 -1
  12. package/build/tools/scenarios.js +0 -1
  13. package/build/tools/test-runs.js +0 -1
  14. package/build/transports/http.js +0 -1
  15. package/build/transports/index.js +0 -1
  16. package/build/transports/stdio.js +0 -1
  17. package/build/utils/errors.js +10 -2
  18. package/build/utils/logger-constants.js +0 -1
  19. package/build/utils/logger.js +0 -1
  20. package/build/utils/validation.js +0 -1
  21. package/manifest.json +127 -0
  22. package/package.json +11 -3
  23. package/build/api/client.d.ts +0 -49
  24. package/build/api/client.d.ts.map +0 -1
  25. package/build/api/client.js.map +0 -1
  26. package/build/api/types.d.ts +0 -113
  27. package/build/api/types.d.ts.map +0 -1
  28. package/build/api/types.js.map +0 -1
  29. package/build/config/settings.d.ts +0 -123
  30. package/build/config/settings.d.ts.map +0 -1
  31. package/build/config/settings.js.map +0 -1
  32. package/build/constants.d.ts +0 -16
  33. package/build/constants.d.ts.map +0 -1
  34. package/build/constants.js.map +0 -1
  35. package/build/generated/version.d.ts +0 -3
  36. package/build/generated/version.d.ts.map +0 -1
  37. package/build/generated/version.js.map +0 -1
  38. package/build/index.d.ts +0 -3
  39. package/build/index.d.ts.map +0 -1
  40. package/build/index.js.map +0 -1
  41. package/build/mcp-server.d.ts +0 -6
  42. package/build/mcp-server.d.ts.map +0 -1
  43. package/build/mcp-server.js.map +0 -1
  44. package/build/tools/action-words.d.ts +0 -18
  45. package/build/tools/action-words.d.ts.map +0 -1
  46. package/build/tools/action-words.js.map +0 -1
  47. package/build/tools/projects.d.ts +0 -19
  48. package/build/tools/projects.d.ts.map +0 -1
  49. package/build/tools/projects.js.map +0 -1
  50. package/build/tools/scenarios.d.ts +0 -18
  51. package/build/tools/scenarios.d.ts.map +0 -1
  52. package/build/tools/scenarios.js.map +0 -1
  53. package/build/tools/test-runs.d.ts +0 -21
  54. package/build/tools/test-runs.d.ts.map +0 -1
  55. package/build/tools/test-runs.js.map +0 -1
  56. package/build/transports/http.d.ts +0 -38
  57. package/build/transports/http.d.ts.map +0 -1
  58. package/build/transports/http.js.map +0 -1
  59. package/build/transports/index.d.ts +0 -22
  60. package/build/transports/index.d.ts.map +0 -1
  61. package/build/transports/index.js.map +0 -1
  62. package/build/transports/stdio.d.ts +0 -13
  63. package/build/transports/stdio.d.ts.map +0 -1
  64. package/build/transports/stdio.js.map +0 -1
  65. package/build/utils/errors.d.ts +0 -10
  66. package/build/utils/errors.d.ts.map +0 -1
  67. package/build/utils/errors.js.map +0 -1
  68. package/build/utils/logger-constants.d.ts +0 -15
  69. package/build/utils/logger-constants.d.ts.map +0 -1
  70. package/build/utils/logger-constants.js.map +0 -1
  71. package/build/utils/logger.d.ts +0 -55
  72. package/build/utils/logger.d.ts.map +0 -1
  73. package/build/utils/logger.js.map +0 -1
  74. package/build/utils/validation.d.ts +0 -89
  75. package/build/utils/validation.d.ts.map +0 -1
  76. package/build/utils/validation.js.map +0 -1
package/README.md CHANGED
@@ -9,6 +9,8 @@
9
9
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.8-blue)](https://www.typescriptlang.org/)
10
10
  [![License](https://img.shields.io/github/license/HeroSizy/cucumberstudio-mcp)](https://github.com/HeroSizy/cucumberstudio-mcp/blob/master/LICENSE)
11
11
 
12
+ > *Vibe Coded with Claude Code and Pu-Er 🍵*
13
+
12
14
  A Model Context Protocol (MCP) server that provides LLM access to Cucumber Studio's testing platform. This server enables AI assistants to retrieve test scenarios, action words, test runs, and project information from Cucumber Studio.
13
15
 
14
16
  ## Features
@@ -26,7 +28,20 @@ A Model Context Protocol (MCP) server that provides LLM access to Cucumber Studi
26
28
 
27
29
  ## Installation
28
30
 
29
- ### Quick Start (Recommended)
31
+ ### Desktop Extension (DXT) Installation
32
+
33
+ The easiest way to use this MCP server is as a Desktop Extension:
34
+
35
+ 1. **Download Extension**: Get the latest `.dxt` file from the [releases page](https://github.com/HeroSizy/cucumberstudio-mcp/releases) (automatically built from each release)
36
+ 2. **Install Extension**: Import the extension in your compatible AI desktop application
37
+ 3. **Configure Credentials**: Set up your Cucumber Studio API credentials through the extension settings:
38
+ - **Access Token**: Your Cucumber Studio API access token
39
+ - **Client ID**: Your Cucumber Studio client ID
40
+ - **User ID**: Your Cucumber Studio user ID
41
+
42
+ The extension will automatically handle the MCP server setup and communication.
43
+
44
+ ### Quick Start (Command Line)
30
45
 
31
46
  Run directly with npx (no installation required):
32
47
  ```bash
@@ -118,7 +133,7 @@ npm run docker:build
118
133
  npm run docker:run
119
134
  ```
120
135
 
121
- The Docker setup includes health checks and automatic restarts for production use.
136
+ The Docker setup includes health checks and automatic restarts for production use. The multi-stage build process creates optimized production images with only runtime dependencies (~150MB).
122
137
 
123
138
  ## Configuration
124
139
 
@@ -169,9 +184,16 @@ npm run start:http
169
184
  ```
170
185
 
171
186
 
172
- ### Using with Claude Desktop
187
+ ### Using with MCP Clients
173
188
 
174
- #### Option 1: NPX (Recommended)
189
+ #### Desktop Extension (Recommended)
190
+ Import the `.dxt` extension file directly into your compatible AI desktop application. The extension handles all configuration through its settings interface.
191
+
192
+ #### Manual MCP Configuration
193
+
194
+ For manual MCP client configuration:
195
+
196
+ ##### Option 1: NPX (Recommended)
175
197
  ```json
176
198
  {
177
199
  "mcpServers": {
@@ -188,7 +210,7 @@ npm run start:http
188
210
  }
189
211
  ```
190
212
 
191
- #### Option 2: Local Installation
213
+ ##### Option 2: Local Installation
192
214
  ```json
193
215
  {
194
216
  "mcpServers": {
@@ -205,7 +227,7 @@ npm run start:http
205
227
  }
206
228
  ```
207
229
 
208
- #### Option 3: Docker Hub Image
230
+ ##### Option 3: Docker Hub Image
209
231
  ```json
210
232
  {
211
233
  "mcpServers": {
@@ -217,7 +239,7 @@ npm run start:http
217
239
  }
218
240
  ```
219
241
 
220
- #### Option 4: Local Docker Build
242
+ ##### Option 4: Local Docker Build
221
243
  ```json
222
244
  {
223
245
  "mcpServers": {
@@ -295,6 +317,30 @@ npm run test:coverage
295
317
  npm run test:ui
296
318
  ```
297
319
 
320
+ ### Build Options
321
+ ```bash
322
+ # Production build (default) - optimized for size, no .d.ts/.js.map files
323
+ npm run build
324
+
325
+ # Development build - includes source maps and type declarations for debugging
326
+ npm run build:dev
327
+ ```
328
+
329
+ ### DXT Extension Development
330
+ ```bash
331
+ # Validate manifest.json
332
+ npm run dxt:validate
333
+
334
+ # Build complete DXT extension for local testing (optimized production build)
335
+ npm run dxt:build
336
+
337
+ # Check info about built extension
338
+ npm run dxt:info
339
+
340
+ # Clean up build artifacts
341
+ npm run dxt:clean
342
+ ```
343
+
298
344
  ## Architecture
299
345
 
300
346
  The server is built with a modular, production-ready architecture:
@@ -201,4 +201,3 @@ export class CucumberStudioApiClient {
201
201
  }
202
202
  }
203
203
  }
204
- //# sourceMappingURL=client.js.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=types.js.map
@@ -1,4 +1,3 @@
1
- import { config as loadDotenv } from 'dotenv';
2
1
  import { z } from 'zod';
3
2
  import { SERVER_NAME, SERVER_VERSION, DEFAULT_API_BASE_URL, DEFAULT_PORT, DEFAULT_HOST, DEFAULT_LOG_LEVEL, } from '../constants.js';
4
3
  // Configuration schema for type safety and validation
@@ -29,10 +28,12 @@ export class ConfigManager {
29
28
  config = null;
30
29
  /**
31
30
  * Load configuration from environment variables
31
+ * Supports both traditional environment variables and DXT user configuration
32
+ * Note: .env file loading is handled by entry points (index.ts), not here
32
33
  */
33
34
  loadFromEnvironment() {
34
- // Auto-load .env file if it exists
35
- loadDotenv({ path: '.env' });
35
+ // Environment variables are read from process.env
36
+ // .env loading is handled at application startup in entry points
36
37
  const rawConfig = {
37
38
  cucumberStudio: {
38
39
  baseUrl: process.env.CUCUMBERSTUDIO_BASE_URL,
@@ -64,8 +65,10 @@ export class ConfigManager {
64
65
  if (error instanceof z.ZodError) {
65
66
  const missingFields = error.errors.map((e) => e.path.join('.')).join(', ');
66
67
  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');
68
+ 'Please ensure all required credentials are configured: ' +
69
+ 'Access Token, Client ID, and User ID. ' +
70
+ 'In DXT environments, these should be configured through the extension settings. ' +
71
+ 'For development, set environment variables: CUCUMBERSTUDIO_ACCESS_TOKEN, CUCUMBERSTUDIO_CLIENT_ID, CUCUMBERSTUDIO_UID');
69
72
  }
70
73
  throw error;
71
74
  }
@@ -94,4 +97,3 @@ export class ConfigManager {
94
97
  }
95
98
  // Singleton instance
96
99
  export const configManager = new ConfigManager();
97
- //# sourceMappingURL=settings.js.map
@@ -21,4 +21,3 @@ export const REDACTED_STRING = '***REDACTED***';
21
21
  // Logger
22
22
  export const LOG_PREFIX = '🥒 API';
23
23
  export const DEFAULT_LOG_LEVEL = 'info';
24
- //# sourceMappingURL=constants.js.map
@@ -1,5 +1,4 @@
1
1
  // Auto-generated version info - DO NOT EDIT
2
2
  // Generated at build time from package.json
3
- export const PACKAGE_VERSION = '1.1.3';
3
+ export const PACKAGE_VERSION = '1.1.4';
4
4
  export const PACKAGE_NAME = 'cucumberstudio-mcp';
5
- //# sourceMappingURL=version.js.map
@@ -0,0 +1,39 @@
1
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
+ import { createCucumberStudioMcpServer } from './mcp-server.js';
3
+ /**
4
+ * DXT-optimized entry point for the Cucumber Studio MCP Server
5
+ * STDIO transport only - HTTP transport code excluded from bundle
6
+ * Environment variables provided by DXT runtime (no .env files needed)
7
+ */
8
+ async function main() {
9
+ // DXT provides environment variables through manifest configuration
10
+ // No need for dotenv in DXT runtime
11
+ console.error(`🎯 Starting Cucumber Studio MCP Server with stdio transport...`);
12
+ try {
13
+ // STDIO transport only (DXT optimization)
14
+ const server = createCucumberStudioMcpServer();
15
+ const stdioTransport = new StdioServerTransport();
16
+ console.error('🚀 CucumberStudio MCP Server running on stdio');
17
+ console.error('📡 Transport: STDIO (standard input/output)');
18
+ console.error('🔄 Protocol: MCP');
19
+ await server.connect(stdioTransport);
20
+ }
21
+ catch (error) {
22
+ console.error(`❌ stdio transport failed to start:`, error);
23
+ process.exit(1);
24
+ }
25
+ }
26
+ // Handle graceful shutdown for STDIO transport
27
+ process.on('SIGINT', () => {
28
+ console.error('🛑 Received SIGINT, shutting down gracefully...');
29
+ process.exit(0);
30
+ });
31
+ process.on('SIGTERM', () => {
32
+ console.error('🛑 Received SIGTERM, shutting down gracefully...');
33
+ process.exit(0);
34
+ });
35
+ // Run main function
36
+ main().catch((error) => {
37
+ console.error('❌ Unhandled error:', error);
38
+ process.exit(1);
39
+ });
package/build/index.js CHANGED
@@ -77,4 +77,3 @@ main().catch((error) => {
77
77
  console.error('❌ Unhandled error:', error);
78
78
  process.exit(1);
79
79
  });
80
- //# sourceMappingURL=index.js.map
@@ -302,4 +302,3 @@ function registerTestRunTools(server, testRunTools) {
302
302
  return await testRunTools.listExecutionEnvironments(args);
303
303
  });
304
304
  }
305
- //# sourceMappingURL=mcp-server.js.map
@@ -188,4 +188,3 @@ export class ActionWordTools {
188
188
  }, 'finding action words by tags');
189
189
  }
190
190
  }
191
- //# sourceMappingURL=action-words.js.map
@@ -120,4 +120,3 @@ export class ProjectTools {
120
120
  }, 'getting project details');
121
121
  }
122
122
  }
123
- //# sourceMappingURL=projects.js.map
@@ -191,4 +191,3 @@ export class ScenarioTools {
191
191
  }, 'finding scenarios by tags');
192
192
  }
193
193
  }
194
- //# sourceMappingURL=scenarios.js.map
@@ -321,4 +321,3 @@ export class TestRunTools {
321
321
  }, 'listing execution environments');
322
322
  }
323
323
  }
324
- //# sourceMappingURL=test-runs.js.map
@@ -378,4 +378,3 @@ export class StreamableHttpTransport {
378
378
  });
379
379
  }
380
380
  }
381
- //# sourceMappingURL=http.js.map
@@ -7,4 +7,3 @@ export var TransportType;
7
7
  TransportType["HTTP"] = "http";
8
8
  TransportType["STREAMABLE_HTTP"] = "streamable-http";
9
9
  })(TransportType || (TransportType = {}));
10
- //# sourceMappingURL=index.js.map
@@ -21,4 +21,3 @@ export class StdioTransport {
21
21
  console.error('🛑 STDIO transport closed');
22
22
  }
23
23
  }
24
- //# sourceMappingURL=stdio.js.map
@@ -1,6 +1,7 @@
1
1
  import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
2
2
  /**
3
3
  * Convert various error types into MCP-compatible errors
4
+ * Enhanced for DXT extension compatibility with detailed error context
4
5
  */
5
6
  export function createMcpError(error, context) {
6
7
  if (error instanceof McpError) {
@@ -11,10 +12,18 @@ export function createMcpError(error, context) {
11
12
  if (error.name === 'CucumberStudioApiError') {
12
13
  return new McpError(ErrorCode.InternalError, `Cucumber Studio API error${context ? ` (${context})` : ''}: ${error.message}`);
13
14
  }
14
- // Handle validation errors
15
+ // Handle validation errors (including configuration)
15
16
  if (error.name === 'ZodError') {
16
17
  return new McpError(ErrorCode.InvalidParams, `Validation error${context ? ` (${context})` : ''}: ${error.message}`);
17
18
  }
19
+ // Handle configuration errors specifically for DXT
20
+ if (error.message.includes('Configuration validation failed')) {
21
+ return new McpError(ErrorCode.InvalidRequest, `Configuration error: ${error.message}. Please check your DXT extension settings.`);
22
+ }
23
+ // Handle network/timeout errors
24
+ if (error.name === 'AxiosError' || error.message.includes('timeout')) {
25
+ return new McpError(ErrorCode.InternalError, `Network error${context ? ` (${context})` : ''}: ${error.message}. Please check your connection and API credentials.`);
26
+ }
18
27
  // Handle general errors
19
28
  return new McpError(ErrorCode.InternalError, `${context ? `${context}: ` : ''}${error.message}`);
20
29
  }
@@ -32,4 +41,3 @@ export async function safeExecute(operation, context) {
32
41
  throw createMcpError(error, context);
33
42
  }
34
43
  }
35
- //# sourceMappingURL=errors.js.map
@@ -13,4 +13,3 @@ export const LOG_LEVELS = {
13
13
  WARN: 2,
14
14
  ERROR: 3,
15
15
  };
16
- //# sourceMappingURL=logger-constants.js.map
@@ -110,4 +110,3 @@ export class NoopLogger {
110
110
  export function getLogLevel() {
111
111
  return process.env.LOG_LEVEL || DEFAULT_LOG_LEVEL;
112
112
  }
113
- //# sourceMappingURL=logger.js.map
@@ -86,4 +86,3 @@ export function validateEnvironment() {
86
86
  throw new McpError(ErrorCode.InvalidRequest, `Missing required environment variables: ${missing.join(', ')}`);
87
87
  }
88
88
  }
89
- //# sourceMappingURL=validation.js.map
package/manifest.json ADDED
@@ -0,0 +1,127 @@
1
+ {
2
+ "dxt_version": "0.1",
3
+ "name": "cucumberstudio-mcp",
4
+ "display_name": "Cucumber Studio MCP",
5
+ "version": "1.1.3",
6
+ "description": "MCP server for Cucumber Studio API integration - access test scenarios, action words, and execution data",
7
+ "long_description": "A Model Context Protocol (MCP) server that provides LLM access to Cucumber Studio's testing platform. This server enables AI assistants to retrieve test scenarios, action words, test runs, and project information from Cucumber Studio. Features include project management, scenario browsing, reusable test steps access, and test execution monitoring with comprehensive error handling and type safety.",
8
+ "author": {
9
+ "name": "HeroSizy",
10
+ "url": "https://github.com/HeroSizy/cucumberstudio-mcp"
11
+ },
12
+ "license": "MIT",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/HeroSizy/cucumberstudio-mcp.git"
16
+ },
17
+ "homepage": "https://github.com/HeroSizy/cucumberstudio-mcp#readme",
18
+ "documentation": "https://github.com/HeroSizy/cucumberstudio-mcp/blob/master/README.md",
19
+ "support": "https://github.com/HeroSizy/cucumberstudio-mcp/issues",
20
+ "keywords": [
21
+ "cucumber",
22
+ "testing",
23
+ "api",
24
+ "automation",
25
+ "bdd",
26
+ "cucumber-studio",
27
+ "test-management",
28
+ "scenarios",
29
+ "action-words"
30
+ ],
31
+ "server": {
32
+ "type": "node",
33
+ "entry_point": "bundle.js",
34
+ "mcp_config": {
35
+ "command": "node",
36
+ "args": ["${__dirname}/bundle.js"],
37
+ "env": {
38
+ "CUCUMBERSTUDIO_ACCESS_TOKEN": "${user_config.access_token}",
39
+ "CUCUMBERSTUDIO_CLIENT_ID": "${user_config.client_id}",
40
+ "CUCUMBERSTUDIO_UID": "${user_config.uid}",
41
+ "MCP_TRANSPORT": "stdio"
42
+ }
43
+ }
44
+ },
45
+ "user_config": {
46
+ "access_token": {
47
+ "type": "string",
48
+ "title": "Access Token",
49
+ "description": "Your Cucumber Studio API access token. Get this from your Cucumber Studio account settings under API tokens.",
50
+ "required": true,
51
+ "sensitive": true
52
+ },
53
+ "client_id": {
54
+ "type": "string",
55
+ "title": "Client ID",
56
+ "description": "Your Cucumber Studio client ID. This is provided when you create an API application in Cucumber Studio.",
57
+ "required": true
58
+ },
59
+ "uid": {
60
+ "type": "string",
61
+ "title": "User ID",
62
+ "description": "Your Cucumber Studio user ID. This can be found in your account settings or profile information.",
63
+ "required": true
64
+ }
65
+ },
66
+ "tools": [
67
+ {
68
+ "name": "cucumberstudio_list_projects",
69
+ "description": "List all projects accessible to the authenticated user with optional pagination and filtering"
70
+ },
71
+ {
72
+ "name": "cucumberstudio_get_project",
73
+ "description": "Get detailed information about a specific project including settings and metadata"
74
+ },
75
+ {
76
+ "name": "cucumberstudio_list_scenarios",
77
+ "description": "List test scenarios in a project with support for folder filtering and pagination"
78
+ },
79
+ {
80
+ "name": "cucumberstudio_get_scenario",
81
+ "description": "Get detailed scenario information including steps, tags, and execution history"
82
+ },
83
+ {
84
+ "name": "cucumberstudio_find_scenarios_by_tags",
85
+ "description": "Search and filter scenarios by tags across projects for targeted test execution"
86
+ },
87
+ {
88
+ "name": "cucumberstudio_list_action_words",
89
+ "description": "List reusable action words (test steps) with pagination and filtering capabilities"
90
+ },
91
+ {
92
+ "name": "cucumberstudio_get_action_word",
93
+ "description": "Get detailed action word information including parameters and usage examples"
94
+ },
95
+ {
96
+ "name": "cucumberstudio_find_action_words_by_tags",
97
+ "description": "Search action words by tags to find reusable test components"
98
+ },
99
+ {
100
+ "name": "cucumberstudio_list_test_runs",
101
+ "description": "List test execution runs with filtering by status, dates, and execution environments"
102
+ },
103
+ {
104
+ "name": "cucumberstudio_get_test_run",
105
+ "description": "Get detailed test run information including execution status and results summary"
106
+ },
107
+ {
108
+ "name": "cucumberstudio_get_test_executions",
109
+ "description": "Get individual test execution results and detailed failure information"
110
+ },
111
+ {
112
+ "name": "cucumberstudio_list_builds",
113
+ "description": "List builds associated with test executions for CI/CD integration tracking"
114
+ },
115
+ {
116
+ "name": "cucumberstudio_get_build",
117
+ "description": "Get detailed build information including test results and execution metadata"
118
+ },
119
+ {
120
+ "name": "cucumberstudio_list_execution_environments",
121
+ "description": "List available execution environments for test runs and build configurations"
122
+ }
123
+ ],
124
+ "compatibility": {
125
+ "node": ">=20.0.0"
126
+ }
127
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cucumberstudio-mcp",
3
- "version": "1.1.3",
3
+ "version": "1.1.4",
4
4
  "description": "MCP server for Cucumber Studio API integration",
5
5
  "main": "build/index.js",
6
6
  "type": "module",
@@ -10,6 +10,7 @@
10
10
  "files": [
11
11
  "build/**/*",
12
12
  "scripts/**/*",
13
+ "manifest.json",
13
14
  "README.md",
14
15
  "LICENSE",
15
16
  "CHANGELOG.md"
@@ -18,7 +19,8 @@
18
19
  "prepare": "npm run build",
19
20
  "prepublishOnly": "node scripts/prepublish.js",
20
21
  "prebuild": "node scripts/generate-version.js",
21
- "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node scripts/prepare-package.js",
22
+ "build": "tsc -p tsconfig.prod.json && tsc-alias -p tsconfig.prod.json && node scripts/prepare-package.js",
23
+ "build:dev": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node scripts/prepare-package.js",
22
24
  "start": "node build/index.js",
23
25
  "start:http": "MCP_TRANSPORT=http node build/index.js",
24
26
  "dev": "tsx --watch -r tsconfig-paths/register src/index.ts",
@@ -40,7 +42,12 @@
40
42
  "docker:compose:up": "docker-compose up",
41
43
  "docker:compose:up:dev": "docker-compose --profile dev up cucumberstudio-mcp-dev",
42
44
  "docker:compose:down": "docker-compose down",
43
- "docker:compose:build": "docker-compose build"
45
+ "docker:compose:build": "docker-compose build",
46
+ "bundle": "node esbuild.config.js",
47
+ "dxt:validate": "dxt validate manifest.json",
48
+ "dxt:build": "npm run bundle && dxt pack . cucumberstudio-mcp-local.dxt",
49
+ "dxt:info": "dxt info cucumberstudio-mcp-local.dxt",
50
+ "dxt:clean": "rm -f cucumberstudio-mcp-local.dxt bundle.js"
44
51
  },
45
52
  "keywords": [
46
53
  "mcp",
@@ -80,6 +87,7 @@
80
87
  "@typescript-eslint/parser": "^8.34.0",
81
88
  "@vitest/coverage-v8": "^3.2.2",
82
89
  "@vitest/ui": "^3.2.2",
90
+ "esbuild": "^0.25.5",
83
91
  "eslint": "^9.28.0",
84
92
  "eslint-config-prettier": "^9.0.0",
85
93
  "eslint-import-resolver-typescript": "^4.4.3",
@@ -1,49 +0,0 @@
1
- import { Config } from '../config/settings.js';
2
- import { Logger } from '../utils/logger.js';
3
- import { CucumberStudioResponse, CucumberStudioError, ListParams, Project, Scenario, ActionWord, Folder, TestRun, TestExecution, Build, ExecutionEnvironment } from './types.js';
4
- export declare class CucumberStudioApiError extends Error {
5
- status?: number | undefined;
6
- details?: CucumberStudioError | undefined;
7
- constructor(message: string, status?: number | undefined, details?: CucumberStudioError | undefined);
8
- }
9
- export declare class CucumberStudioApiClient {
10
- private config;
11
- private logger;
12
- private client;
13
- constructor(config: Config, logger: Logger);
14
- /**
15
- * Get logging configuration with safe defaults
16
- */
17
- private getLoggingConfig;
18
- /**
19
- * Sanitize headers to avoid logging sensitive information
20
- */
21
- private sanitizeHeaders;
22
- /**
23
- * Generic GET request handler
24
- */
25
- private get;
26
- getProjects(params?: ListParams): Promise<CucumberStudioResponse<Project[]>>;
27
- getProject(projectId: string): Promise<CucumberStudioResponse<Project>>;
28
- getScenarios(projectId: string, params?: ListParams): Promise<CucumberStudioResponse<Scenario[]>>;
29
- getScenario(projectId: string, scenarioId: string): Promise<CucumberStudioResponse<Scenario>>;
30
- findScenariosByTag(projectId: string, tags: string, params?: ListParams): Promise<CucumberStudioResponse<Scenario[]>>;
31
- getActionWords(projectId: string, params?: ListParams): Promise<CucumberStudioResponse<ActionWord[]>>;
32
- getActionWord(projectId: string, actionWordId: string): Promise<CucumberStudioResponse<ActionWord>>;
33
- findActionWordsByTag(projectId: string, tags: string, params?: ListParams): Promise<CucumberStudioResponse<ActionWord[]>>;
34
- getFolders(projectId: string, params?: ListParams): Promise<CucumberStudioResponse<Folder[]>>;
35
- getFolder(projectId: string, folderId: string): Promise<CucumberStudioResponse<Folder>>;
36
- getFolderChildren(projectId: string, folderId: string, params?: ListParams): Promise<CucumberStudioResponse<Folder[]>>;
37
- getFolderScenarios(projectId: string, folderId: string, params?: ListParams): Promise<CucumberStudioResponse<Scenario[]>>;
38
- getTestRuns(projectId: string, params?: ListParams): Promise<CucumberStudioResponse<TestRun[]>>;
39
- getTestRun(projectId: string, testRunId: string): Promise<CucumberStudioResponse<TestRun>>;
40
- getTestExecutions(projectId: string, testRunId: string, params?: ListParams): Promise<CucumberStudioResponse<TestExecution[]>>;
41
- getBuilds(projectId: string, params?: ListParams): Promise<CucumberStudioResponse<Build[]>>;
42
- getBuild(projectId: string, buildId: string): Promise<CucumberStudioResponse<Build>>;
43
- getExecutionEnvironments(projectId: string, params?: ListParams): Promise<CucumberStudioResponse<ExecutionEnvironment[]>>;
44
- /**
45
- * Test the connection to Cucumber Studio API
46
- */
47
- testConnection(): Promise<boolean>;
48
- }
49
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}