@mcp-consultant-tools/rest-api 28.0.0-beta.7 → 28.0.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.
@@ -0,0 +1,8 @@
1
+ /**
2
+ * CLI Commands barrel export + combined registration
3
+ */
4
+ import type { Command } from 'commander';
5
+ import type { ServiceContext } from '../../types.js';
6
+ export declare function registerAllCommands(program: Command, ctx: ServiceContext): void;
7
+ export { registerRestCommands } from './rest-commands.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAE/E;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CLI Commands barrel export + combined registration
3
+ */
4
+ import { registerRestCommands } from './rest-commands.js';
5
+ export function registerAllCommands(program, ctx) {
6
+ registerRestCommands(program, ctx);
7
+ }
8
+ export { registerRestCommands } from './rest-commands.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,GAAmB;IACvE,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * REST API CLI Commands - 6 commands mapping to REST API MCP tools
3
+ */
4
+ import type { Command } from 'commander';
5
+ import type { ServiceContext } from '../../types.js';
6
+ export declare function registerRestCommands(program: Command, ctx: ServiceContext): void;
7
+ //# sourceMappingURL=rest-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/rest-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIrD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAoOhF"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * REST API CLI Commands - 6 commands mapping to REST API MCP tools
3
+ */
4
+ import { getGlobalFlags, handleCliError } from '@mcp-consultant-tools/core';
5
+ import { outputResult } from '../output.js';
6
+ export function registerRestCommands(program, ctx) {
7
+ // Command: request (maps to rest-request tool)
8
+ program
9
+ .command('request')
10
+ .description('Execute a REST API request with automatic authentication')
11
+ .argument('<method>', 'HTTP method (GET, POST, PUT, DELETE, PATCH)')
12
+ .argument('<endpoint>', 'Endpoint path (e.g., /api/users)')
13
+ .option('-b, --body <json>', 'Request body as JSON string')
14
+ .option('-H, --header <key=value...>', 'Additional headers (repeatable)', collectHeaders, {})
15
+ .option('--host <url>', 'Override base URL for this request')
16
+ .action(async (method, endpoint, opts) => {
17
+ try {
18
+ const upperMethod = method.toUpperCase();
19
+ if (!['GET', 'POST', 'PUT', 'DELETE', 'PATCH'].includes(upperMethod)) {
20
+ throw new Error(`Invalid HTTP method: ${method}. Use GET, POST, PUT, DELETE, or PATCH.`);
21
+ }
22
+ // Validate endpoint doesn't contain full URL
23
+ const urlPattern = /^(https?:\/\/|www\.)/i;
24
+ if (urlPattern.test(endpoint)) {
25
+ throw new Error('Invalid endpoint format. Do not include full URLs. Use just the path (e.g., "/api/users") and optionally specify --host to override the base URL.');
26
+ }
27
+ let body;
28
+ if (opts.body) {
29
+ try {
30
+ body = JSON.parse(opts.body);
31
+ }
32
+ catch {
33
+ body = opts.body;
34
+ }
35
+ }
36
+ const options = {
37
+ method: upperMethod,
38
+ endpoint,
39
+ body,
40
+ headers: Object.keys(opts.header).length > 0 ? opts.header : undefined,
41
+ host: opts.host,
42
+ };
43
+ const result = await ctx.restApi.request(options);
44
+ outputResult({
45
+ fileName: `request-${upperMethod}-${endpoint.replace(/\//g, '-').replace(/^-/, '')}`,
46
+ data: result,
47
+ summary: `${upperMethod} ${endpoint} => ${result.response.statusCode} ${result.response.statusText} (${result.response.timing})`,
48
+ }, getGlobalFlags(program));
49
+ }
50
+ catch (error) {
51
+ handleCliError(error, 'REST request');
52
+ }
53
+ });
54
+ // Command: config (maps to rest-config tool)
55
+ program
56
+ .command('config')
57
+ .description('Get the current REST API service configuration summary')
58
+ .action(async () => {
59
+ try {
60
+ const summary = ctx.restApi.getConfigSummary();
61
+ outputResult({
62
+ fileName: 'rest-config',
63
+ data: summary,
64
+ summary: `Base URL: ${summary.baseUrl}\nAuth method: ${summary.authMethod}\nSSL verification: ${summary.sslVerification}\nResponse size limit: ${summary.responseSizeLimit}`,
65
+ }, getGlobalFlags(program));
66
+ }
67
+ catch (error) {
68
+ handleCliError(error, 'get config');
69
+ }
70
+ });
71
+ // Command: refresh-token (maps to rest-refresh-token tool)
72
+ program
73
+ .command('refresh-token')
74
+ .description('Force refresh the OAuth2 access token')
75
+ .action(async () => {
76
+ try {
77
+ const authMethod = ctx.restApi.getAuthMethod();
78
+ if (authMethod !== 'oauth2') {
79
+ throw new Error(`Token refresh only available for OAuth2 authentication. Current auth method: ${authMethod}`);
80
+ }
81
+ ctx.restApi.clearTokenCache();
82
+ outputResult({
83
+ fileName: 'refresh-token',
84
+ data: { message: 'OAuth2 token cache cleared. A new token will be acquired on the next request.' },
85
+ summary: 'OAuth2 token cache cleared successfully.',
86
+ }, getGlobalFlags(program));
87
+ }
88
+ catch (error) {
89
+ handleCliError(error, 'refresh token');
90
+ }
91
+ });
92
+ // Command: batch (maps to rest-batch-request tool)
93
+ program
94
+ .command('batch')
95
+ .description('Execute multiple REST API requests sequentially from a JSON file or string')
96
+ .argument('<requests-json>', 'JSON array of request objects, or path to JSON file')
97
+ .option('--stop-on-error', 'Stop executing remaining requests if one fails', false)
98
+ .action(async (requestsJson, opts) => {
99
+ try {
100
+ let requests;
101
+ // Try parsing as JSON string first
102
+ try {
103
+ requests = JSON.parse(requestsJson);
104
+ }
105
+ catch {
106
+ // Try reading as file
107
+ const { readFileSync } = await import('node:fs');
108
+ const content = readFileSync(requestsJson, 'utf-8');
109
+ requests = JSON.parse(content);
110
+ }
111
+ if (!Array.isArray(requests)) {
112
+ throw new Error('Requests must be a JSON array of request objects');
113
+ }
114
+ const results = [];
115
+ for (let i = 0; i < requests.length; i++) {
116
+ const req = requests[i];
117
+ try {
118
+ const result = await ctx.restApi.request(req);
119
+ results.push({
120
+ index: i,
121
+ endpoint: req.endpoint,
122
+ success: !result.validation.isError,
123
+ result,
124
+ });
125
+ if (opts.stopOnError && result.validation.isError) {
126
+ break;
127
+ }
128
+ }
129
+ catch (error) {
130
+ const errorMessage = error instanceof Error ? error.message : String(error);
131
+ results.push({
132
+ index: i,
133
+ endpoint: req.endpoint,
134
+ success: false,
135
+ error: errorMessage,
136
+ });
137
+ if (opts.stopOnError) {
138
+ break;
139
+ }
140
+ }
141
+ }
142
+ const data = {
143
+ totalRequests: requests.length,
144
+ executedRequests: results.length,
145
+ successfulRequests: results.filter((r) => r.success).length,
146
+ results,
147
+ };
148
+ outputResult({
149
+ fileName: 'batch-request',
150
+ data,
151
+ summary: `Batch: ${data.successfulRequests}/${data.executedRequests} successful (${data.totalRequests} total)`,
152
+ }, getGlobalFlags(program));
153
+ }
154
+ catch (error) {
155
+ handleCliError(error, 'batch request');
156
+ }
157
+ });
158
+ // Command: list-endpoints (maps to rest-list-endpoints tool)
159
+ program
160
+ .command('list-endpoints')
161
+ .description('List available REST API endpoints from OpenAPI spec')
162
+ .option('-f, --filter <text>', 'Filter endpoint paths (case-insensitive contains match)')
163
+ .action(async (opts) => {
164
+ try {
165
+ const result = await ctx.restApi.listEndpointsAsync(opts.filter);
166
+ outputResult({
167
+ fileName: `endpoints${opts.filter ? `-${opts.filter}` : ''}`,
168
+ data: result,
169
+ summary: `Found ${result.endpointCount} endpoint(s) at ${result.baseUrl}${opts.filter ? ` (filter: '${opts.filter}')` : ''}`,
170
+ }, getGlobalFlags(program));
171
+ }
172
+ catch (error) {
173
+ handleCliError(error, 'list endpoints');
174
+ }
175
+ });
176
+ // Command: get-schema (maps to rest-get-schema tool)
177
+ program
178
+ .command('get-schema')
179
+ .description('Get schema/field definitions for a specific entity from OpenAPI spec')
180
+ .argument('<entity>', 'Entity name (singular or plural)')
181
+ .action(async (entity) => {
182
+ try {
183
+ if (!ctx.restApi.hasOpenApiConfig()) {
184
+ throw new Error("No schema configuration available. Configure REST_OPENAPI_URL pointing to your API's OpenAPI/Swagger spec.");
185
+ }
186
+ const schema = await ctx.restApi.getSchemaAsync(entity);
187
+ if (!schema) {
188
+ throw new Error(`Entity '${entity}' not found. Use 'list-endpoints' to see available entities.`);
189
+ }
190
+ outputResult({
191
+ fileName: `schema-${entity}`,
192
+ data: schema,
193
+ summary: `Entity: ${schema.entityName} (${schema.pluralName})\nEndpoint: ${schema.endpoint}\nPrimary key: ${schema.primaryKey}\nFields: ${schema.fields.length}`,
194
+ }, getGlobalFlags(program));
195
+ }
196
+ catch (error) {
197
+ handleCliError(error, 'get schema');
198
+ }
199
+ });
200
+ }
201
+ /**
202
+ * Commander option collector for repeatable --header key=value options
203
+ */
204
+ function collectHeaders(value, previous) {
205
+ const [key, ...valueParts] = value.split('=');
206
+ if (!key || valueParts.length === 0) {
207
+ throw new Error(`Invalid header format: '${value}'. Use key=value format.`);
208
+ }
209
+ previous[key.trim()] = valueParts.join('=').trim();
210
+ return previous;
211
+ }
212
+ //# sourceMappingURL=rest-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-commands.js","sourceRoot":"","sources":["../../../src/cli/commands/rest-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * CLI output helper for rest-api package.
3
+ * Thin wrapper setting the package-specific cache directory.
4
+ */
5
+ import { type GlobalFlags } from '@mcp-consultant-tools/core';
6
+ export declare function outputResult(opts: {
7
+ fileName: string;
8
+ data: unknown;
9
+ summary: string;
10
+ }, flags: GlobalFlags): void;
11
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAIhG,wBAAgB,YAAY,CAC1B,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAC1D,KAAK,EAAE,WAAW,GACjB,IAAI,CAEN"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * CLI output helper for rest-api package.
3
+ * Thin wrapper setting the package-specific cache directory.
4
+ */
5
+ import { outputResult as coreOutputResult } from '@mcp-consultant-tools/core';
6
+ const CACHE_DIR = '.mcp-rest-api-cache';
7
+ export function outputResult(opts, flags) {
8
+ coreOutputResult({ ...opts, cacheDir: CACHE_DIR }, flags);
9
+ }
10
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAoB,MAAM,4BAA4B,CAAC;AAEhG,MAAM,SAAS,GAAG,qBAAqB,CAAC;AAExC,MAAM,UAAU,YAAY,CAC1B,IAA0D,EAC1D,KAAkB;IAElB,gBAAgB,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;AAC5D,CAAC"}
package/build/cli.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @mcp-consultant-tools/rest-api CLI
4
+ *
5
+ * Command-line interface for REST API operations.
6
+ * Reuses the same ServiceContext and services as the MCP server.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/build/cli.js ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @mcp-consultant-tools/rest-api CLI
4
+ *
5
+ * Command-line interface for REST API operations.
6
+ * Reuses the same ServiceContext and services as the MCP server.
7
+ */
8
+ import { createCliProgram, loadEnvForCli } from '@mcp-consultant-tools/core';
9
+ import { createServiceContext } from './context-factory.js';
10
+ import { registerAllCommands } from './cli/commands/index.js';
11
+ const program = createCliProgram({
12
+ name: 'mcp-rest-api-cli',
13
+ description: 'REST API CLI - HTTP requests, config, schema, endpoints',
14
+ version: '28.0.0-beta.8',
15
+ });
16
+ // Load env before parsing (--env-file handled by commander hook)
17
+ program.hook('preAction', (thisCommand) => {
18
+ const opts = thisCommand.opts();
19
+ loadEnvForCli(opts.envFile);
20
+ });
21
+ const ctx = createServiceContext();
22
+ registerAllCommands(program, ctx);
23
+ program.parseAsync(process.argv).catch((error) => {
24
+ console.error('CLI error:', error.message);
25
+ process.exit(1);
26
+ });
27
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,OAAO,GAAG,gBAAgB,CAAC;IAC/B,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,yDAAyD;IACtE,OAAO,EAAE,eAAe;CACzB,CAAC,CAAC;AAEH,iEAAiE;AACjE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,WAAgB,EAAE,EAAE;IAC7C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAChC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,MAAM,GAAG,GAAG,oBAAoB,EAAE,CAAC;AACnC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAElC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAU,EAAE,EAAE;IACpD,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Shared ServiceContext factory for REST API.
3
+ * Used by both MCP server (index.ts) and CLI (cli.ts).
4
+ */
5
+ import type { ServiceContext } from './types.js';
6
+ /**
7
+ * Build a ServiceContext from environment variables (lazy service initialization).
8
+ */
9
+ export declare function createServiceContext(): ServiceContext;
10
+ //# sourceMappingURL=context-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-factory.d.ts","sourceRoot":"","sources":["../src/context-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgGjD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAoBrD"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Shared ServiceContext factory for REST API.
3
+ * Used by both MCP server (index.ts) and CLI (cli.ts).
4
+ */
5
+ import { RestApiService } from './services/rest-api-service.js';
6
+ /**
7
+ * Parse environment variables for custom headers (HEADER_* pattern)
8
+ */
9
+ function getCustomHeadersFromEnv() {
10
+ const headers = {};
11
+ const headerPrefix = /^HEADER_/i;
12
+ for (const [key, value] of Object.entries(process.env)) {
13
+ if (headerPrefix.test(key) && value !== undefined) {
14
+ const headerName = key.replace(headerPrefix, "");
15
+ headers[headerName] = value;
16
+ }
17
+ }
18
+ return headers;
19
+ }
20
+ /**
21
+ * Build RestApiConfig from environment variables
22
+ */
23
+ function buildConfigFromEnv() {
24
+ const baseUrl = process.env.REST_BASE_URL;
25
+ if (!baseUrl) {
26
+ throw new Error("REST_BASE_URL environment variable is required");
27
+ }
28
+ const config = {
29
+ baseUrl,
30
+ responseSizeLimit: process.env.REST_RESPONSE_SIZE_LIMIT
31
+ ? parseInt(process.env.REST_RESPONSE_SIZE_LIMIT, 10)
32
+ : 10000,
33
+ enableSslVerify: process.env.REST_ENABLE_SSL_VERIFY !== "false",
34
+ timeout: process.env.REST_TIMEOUT
35
+ ? parseInt(process.env.REST_TIMEOUT, 10)
36
+ : 30000,
37
+ customHeaders: getCustomHeadersFromEnv(),
38
+ };
39
+ // OAuth2 client credentials (highest priority)
40
+ if (process.env.OAUTH2_TOKEN_URL &&
41
+ process.env.OAUTH2_CLIENT_ID &&
42
+ process.env.OAUTH2_CLIENT_SECRET &&
43
+ process.env.OAUTH2_SCOPE) {
44
+ config.oauth2 = {
45
+ tokenUrl: process.env.OAUTH2_TOKEN_URL,
46
+ clientId: process.env.OAUTH2_CLIENT_ID,
47
+ clientSecret: process.env.OAUTH2_CLIENT_SECRET,
48
+ scope: process.env.OAUTH2_SCOPE,
49
+ grantType: process.env.OAUTH2_GRANT_TYPE || "client_credentials",
50
+ };
51
+ if (process.env.OAUTH2_ADDITIONAL_PARAMS) {
52
+ try {
53
+ config.oauth2.additionalParams = JSON.parse(process.env.OAUTH2_ADDITIONAL_PARAMS);
54
+ }
55
+ catch (e) {
56
+ console.error("Warning: OAUTH2_ADDITIONAL_PARAMS is not valid JSON");
57
+ }
58
+ }
59
+ }
60
+ // Static bearer token
61
+ else if (process.env.AUTH_BEARER) {
62
+ config.bearerToken = process.env.AUTH_BEARER;
63
+ }
64
+ // Basic auth
65
+ else if (process.env.AUTH_BASIC_USERNAME && process.env.AUTH_BASIC_PASSWORD) {
66
+ config.basicAuth = {
67
+ username: process.env.AUTH_BASIC_USERNAME,
68
+ password: process.env.AUTH_BASIC_PASSWORD,
69
+ };
70
+ }
71
+ // API key
72
+ else if (process.env.AUTH_APIKEY_HEADER_NAME &&
73
+ process.env.AUTH_APIKEY_VALUE) {
74
+ config.apiKey = {
75
+ headerName: process.env.AUTH_APIKEY_HEADER_NAME,
76
+ value: process.env.AUTH_APIKEY_VALUE,
77
+ };
78
+ }
79
+ // OpenAPI URL for dynamic discovery
80
+ if (process.env.REST_OPENAPI_URL) {
81
+ config.openApiUrl = process.env.REST_OPENAPI_URL;
82
+ console.error(`OpenAPI URL configured: ${config.openApiUrl}`);
83
+ }
84
+ return config;
85
+ }
86
+ /**
87
+ * Build a ServiceContext from environment variables (lazy service initialization).
88
+ */
89
+ export function createServiceContext() {
90
+ let service = null;
91
+ function getService() {
92
+ if (!service) {
93
+ const config = buildConfigFromEnv();
94
+ service = new RestApiService(config);
95
+ console.error("REST API service initialized");
96
+ console.error(` Base URL: ${config.baseUrl}`);
97
+ console.error(` Auth method: ${service.getAuthMethod()}`);
98
+ if (config.oauth2) {
99
+ console.error(` OAuth2 Token URL: ${config.oauth2.tokenUrl}`);
100
+ }
101
+ }
102
+ return service;
103
+ }
104
+ return {
105
+ get restApi() { return getService(); },
106
+ };
107
+ }
108
+ //# sourceMappingURL=context-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-factory.js","sourceRoot":"","sources":["../src/context-factory.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-consultant-tools/rest-api",
3
- "version": "28.0.0-beta.7",
3
+ "version": "28.0.0",
4
4
  "description": "MCP server for REST API testing with OAuth2 client credentials support - test HTTP endpoints with automatic JWT token generation",
5
5
  "type": "module",
6
6
  "main": "./build/index.js",
@@ -45,8 +45,9 @@
45
45
  "node": ">=18.0.0"
46
46
  },
47
47
  "dependencies": {
48
- "@mcp-consultant-tools/core": "28.0.0-beta.7",
48
+ "@mcp-consultant-tools/core": "28.0.0",
49
49
  "@modelcontextprotocol/sdk": "^1.0.4",
50
+ "commander": "^14.0.3",
50
51
  "zod": "^3.24.1"
51
52
  },
52
53
  "devDependencies": {
@@ -54,6 +55,7 @@
54
55
  "typescript": "^5.8.2"
55
56
  },
56
57
  "bin": {
57
- "mcp-rest-api": "build/index.js"
58
+ "mcp-rest-api": "build/index.js",
59
+ "mcp-rest-api-cli": "build/cli.js"
58
60
  }
59
61
  }