@mcp-consultant-tools/rest-api 27.0.0 → 28.0.0-beta.5
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/build/index.d.ts +6 -18
- package/build/index.d.ts.map +1 -1
- package/build/index.js +21 -376
- package/build/index.js.map +1 -1
- package/build/models/api-types.d.ts +133 -0
- package/build/models/api-types.d.ts.map +1 -0
- package/build/models/api-types.js +5 -0
- package/build/models/api-types.js.map +1 -0
- package/build/models/index.d.ts +5 -0
- package/build/models/index.d.ts.map +1 -0
- package/build/models/index.js +2 -0
- package/build/models/index.js.map +1 -0
- package/build/prompts/index.d.ts +2 -0
- package/build/prompts/index.d.ts.map +1 -0
- package/build/prompts/index.js +24 -0
- package/build/prompts/index.js.map +1 -0
- package/build/prompts/templates.d.ts +6 -0
- package/build/prompts/templates.d.ts.map +1 -0
- package/build/prompts/templates.js +169 -0
- package/build/prompts/templates.js.map +1 -0
- package/build/services/index.d.ts +5 -0
- package/build/services/index.d.ts.map +1 -0
- package/build/services/index.js +5 -0
- package/build/services/index.js.map +1 -0
- package/build/services/openapi-parser.d.ts +69 -0
- package/build/services/openapi-parser.d.ts.map +1 -0
- package/build/services/openapi-parser.js +151 -0
- package/build/services/openapi-parser.js.map +1 -0
- package/build/services/rest-api-service.d.ts +90 -0
- package/build/services/rest-api-service.d.ts.map +1 -0
- package/build/services/rest-api-service.js +403 -0
- package/build/services/rest-api-service.js.map +1 -0
- package/build/tools/index.d.ts +7 -0
- package/build/tools/index.d.ts.map +1 -0
- package/build/tools/index.js +6 -0
- package/build/tools/index.js.map +1 -0
- package/build/tools/rest-tools.d.ts +3 -0
- package/build/tools/rest-tools.d.ts.map +1 -0
- package/build/tools/rest-tools.js +165 -0
- package/build/tools/rest-tools.js.map +1 -0
- package/build/types.d.ts +9 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* REST API Service
|
|
3
|
+
*
|
|
4
|
+
* Provides HTTP request functionality with multiple authentication methods:
|
|
5
|
+
* - Static Bearer Token
|
|
6
|
+
* - Basic Authentication
|
|
7
|
+
* - API Key (custom header)
|
|
8
|
+
* - OAuth2 Client Credentials Flow (JWT generation)
|
|
9
|
+
*/
|
|
10
|
+
import https from "https";
|
|
11
|
+
import { parseOpenApiSpec } from './openapi-parser.js';
|
|
12
|
+
export class RestApiService {
|
|
13
|
+
config;
|
|
14
|
+
cachedToken = null;
|
|
15
|
+
httpsAgent;
|
|
16
|
+
cachedOpenApi = null;
|
|
17
|
+
openApiFetchPromise = null;
|
|
18
|
+
/** OpenAPI cache TTL in milliseconds (default: 5 minutes) */
|
|
19
|
+
static OPENAPI_CACHE_TTL = 5 * 60 * 1000;
|
|
20
|
+
constructor(config) {
|
|
21
|
+
this.config = {
|
|
22
|
+
responseSizeLimit: 10000,
|
|
23
|
+
enableSslVerify: true,
|
|
24
|
+
timeout: 30000,
|
|
25
|
+
...config,
|
|
26
|
+
};
|
|
27
|
+
// Normalize base URL (remove trailing slashes)
|
|
28
|
+
this.config.baseUrl = this.config.baseUrl.replace(/\/+$/, "");
|
|
29
|
+
// Create HTTPS agent if SSL verification is disabled
|
|
30
|
+
if (!this.config.enableSslVerify) {
|
|
31
|
+
this.httpsAgent = new https.Agent({ rejectUnauthorized: false });
|
|
32
|
+
}
|
|
33
|
+
// Validate mutually exclusive auth methods
|
|
34
|
+
const authMethods = [
|
|
35
|
+
this.config.bearerToken ? "bearer" : null,
|
|
36
|
+
this.config.basicAuth ? "basic" : null,
|
|
37
|
+
this.config.oauth2 ? "oauth2" : null,
|
|
38
|
+
this.config.apiKey ? "apikey" : null,
|
|
39
|
+
].filter(Boolean);
|
|
40
|
+
if (authMethods.length > 1) {
|
|
41
|
+
console.error(`Warning: Multiple auth methods configured (${authMethods.join(", ")}). Only one should be used.`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get the current authentication method name
|
|
46
|
+
*/
|
|
47
|
+
getAuthMethod() {
|
|
48
|
+
if (this.config.oauth2)
|
|
49
|
+
return "oauth2";
|
|
50
|
+
if (this.config.bearerToken)
|
|
51
|
+
return "bearer";
|
|
52
|
+
if (this.config.basicAuth)
|
|
53
|
+
return "basic";
|
|
54
|
+
if (this.config.apiKey)
|
|
55
|
+
return "apikey";
|
|
56
|
+
return "none";
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get OAuth2 access token using client credentials flow
|
|
60
|
+
* Caches token and refreshes when expired
|
|
61
|
+
*/
|
|
62
|
+
async getOAuth2Token() {
|
|
63
|
+
const oauth2 = this.config.oauth2;
|
|
64
|
+
if (!oauth2) {
|
|
65
|
+
throw new Error("OAuth2 configuration not provided");
|
|
66
|
+
}
|
|
67
|
+
// Check if we have a valid cached token (with 5 minute buffer)
|
|
68
|
+
const now = Date.now();
|
|
69
|
+
if (this.cachedToken && this.cachedToken.expiresAt > now + 5 * 60 * 1000) {
|
|
70
|
+
return this.cachedToken.accessToken;
|
|
71
|
+
}
|
|
72
|
+
console.error("Acquiring new OAuth2 token...");
|
|
73
|
+
const params = new URLSearchParams();
|
|
74
|
+
params.append("grant_type", oauth2.grantType || "client_credentials");
|
|
75
|
+
params.append("client_id", oauth2.clientId);
|
|
76
|
+
params.append("client_secret", oauth2.clientSecret);
|
|
77
|
+
params.append("scope", oauth2.scope);
|
|
78
|
+
if (oauth2.additionalParams) {
|
|
79
|
+
for (const [key, value] of Object.entries(oauth2.additionalParams)) {
|
|
80
|
+
params.append(key, value);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const response = await fetch(oauth2.tokenUrl, {
|
|
84
|
+
method: "POST",
|
|
85
|
+
headers: {
|
|
86
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
87
|
+
},
|
|
88
|
+
body: params.toString(),
|
|
89
|
+
});
|
|
90
|
+
if (!response.ok) {
|
|
91
|
+
const errorText = await response.text();
|
|
92
|
+
throw new Error(`OAuth2 token request failed: ${response.status} ${response.statusText} - ${errorText}`);
|
|
93
|
+
}
|
|
94
|
+
const tokenResponse = await response.json();
|
|
95
|
+
if (!tokenResponse.access_token) {
|
|
96
|
+
throw new Error("OAuth2 response missing access_token");
|
|
97
|
+
}
|
|
98
|
+
const expiresIn = tokenResponse.expires_in || 3600;
|
|
99
|
+
this.cachedToken = {
|
|
100
|
+
accessToken: tokenResponse.access_token,
|
|
101
|
+
expiresAt: now + expiresIn * 1000,
|
|
102
|
+
};
|
|
103
|
+
console.error(`OAuth2 token acquired, expires in ${Math.round(expiresIn / 60)} minutes`);
|
|
104
|
+
return this.cachedToken.accessToken;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get the Authorization header value based on configured auth method
|
|
108
|
+
*/
|
|
109
|
+
async getAuthHeader() {
|
|
110
|
+
if (this.config.oauth2) {
|
|
111
|
+
const token = await this.getOAuth2Token();
|
|
112
|
+
return { name: "Authorization", value: `Bearer ${token}` };
|
|
113
|
+
}
|
|
114
|
+
if (this.config.bearerToken) {
|
|
115
|
+
return { name: "Authorization", value: `Bearer ${this.config.bearerToken}` };
|
|
116
|
+
}
|
|
117
|
+
if (this.config.basicAuth) {
|
|
118
|
+
const { username, password } = this.config.basicAuth;
|
|
119
|
+
const base64Credentials = Buffer.from(`${username}:${password}`).toString("base64");
|
|
120
|
+
return { name: "Authorization", value: `Basic ${base64Credentials}` };
|
|
121
|
+
}
|
|
122
|
+
if (this.config.apiKey) {
|
|
123
|
+
return { name: this.config.apiKey.headerName, value: this.config.apiKey.value };
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Sanitize headers for display (redact sensitive values)
|
|
129
|
+
*/
|
|
130
|
+
sanitizeHeaders(headers, isFromRequest = false) {
|
|
131
|
+
const sanitized = {};
|
|
132
|
+
const safeHeaders = new Set([
|
|
133
|
+
"accept",
|
|
134
|
+
"accept-language",
|
|
135
|
+
"content-type",
|
|
136
|
+
"user-agent",
|
|
137
|
+
"cache-control",
|
|
138
|
+
"if-match",
|
|
139
|
+
"if-none-match",
|
|
140
|
+
"if-modified-since",
|
|
141
|
+
"if-unmodified-since",
|
|
142
|
+
]);
|
|
143
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
144
|
+
const lowerKey = key.toLowerCase();
|
|
145
|
+
if (isFromRequest) {
|
|
146
|
+
sanitized[key] = value;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (lowerKey === "authorization") {
|
|
150
|
+
sanitized[key] = "[REDACTED]";
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (this.config.apiKey &&
|
|
154
|
+
lowerKey === this.config.apiKey.headerName.toLowerCase()) {
|
|
155
|
+
sanitized[key] = "[REDACTED]";
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (safeHeaders.has(lowerKey)) {
|
|
159
|
+
sanitized[key] = value;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
sanitized[key] = "[REDACTED]";
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return sanitized;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Execute an HTTP request
|
|
169
|
+
*/
|
|
170
|
+
async request(options) {
|
|
171
|
+
const { method, endpoint, body, headers: requestHeaders, host } = options;
|
|
172
|
+
const normalizedEndpoint = `/${endpoint.replace(/^\/+|\/+$/g, "")}`;
|
|
173
|
+
const baseUrl = host ? host.replace(/\/+$/, "") : this.config.baseUrl;
|
|
174
|
+
const fullUrl = `${baseUrl}${normalizedEndpoint}`;
|
|
175
|
+
const headers = {
|
|
176
|
+
...this.config.customHeaders,
|
|
177
|
+
...requestHeaders,
|
|
178
|
+
};
|
|
179
|
+
if (body && !headers["Content-Type"] && !headers["content-type"]) {
|
|
180
|
+
headers["Content-Type"] = "application/json";
|
|
181
|
+
}
|
|
182
|
+
const authHeader = await this.getAuthHeader();
|
|
183
|
+
if (authHeader) {
|
|
184
|
+
headers[authHeader.name] = authHeader.value;
|
|
185
|
+
}
|
|
186
|
+
const fetchOptions = {
|
|
187
|
+
method,
|
|
188
|
+
headers,
|
|
189
|
+
};
|
|
190
|
+
if (["POST", "PUT", "PATCH"].includes(method) && body) {
|
|
191
|
+
fetchOptions.body =
|
|
192
|
+
typeof body === "string" ? body : JSON.stringify(body);
|
|
193
|
+
}
|
|
194
|
+
const controller = new AbortController();
|
|
195
|
+
const timeoutId = setTimeout(() => controller.abort(), this.config.timeout || 30000);
|
|
196
|
+
fetchOptions.signal = controller.signal;
|
|
197
|
+
const startTime = Date.now();
|
|
198
|
+
try {
|
|
199
|
+
const response = await fetch(fullUrl, fetchOptions);
|
|
200
|
+
clearTimeout(timeoutId);
|
|
201
|
+
const endTime = Date.now();
|
|
202
|
+
const responseText = await response.text();
|
|
203
|
+
let responseBody;
|
|
204
|
+
try {
|
|
205
|
+
responseBody = JSON.parse(responseText);
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
responseBody = responseText;
|
|
209
|
+
}
|
|
210
|
+
const responseHeaders = {};
|
|
211
|
+
response.headers.forEach((value, key) => {
|
|
212
|
+
responseHeaders[key] = value;
|
|
213
|
+
});
|
|
214
|
+
const bodySize = Buffer.from(responseText).length;
|
|
215
|
+
const sizeLimit = this.config.responseSizeLimit || 10000;
|
|
216
|
+
const validation = {
|
|
217
|
+
isError: response.status >= 400,
|
|
218
|
+
messages: response.status >= 400
|
|
219
|
+
? [`Request failed with status ${response.status}`]
|
|
220
|
+
: ["Request completed successfully"],
|
|
221
|
+
};
|
|
222
|
+
if (bodySize > sizeLimit) {
|
|
223
|
+
responseBody =
|
|
224
|
+
typeof responseBody === "string"
|
|
225
|
+
? responseBody.slice(0, sizeLimit)
|
|
226
|
+
: JSON.stringify(responseBody).slice(0, sizeLimit);
|
|
227
|
+
validation.messages.push(`Response truncated: ${sizeLimit} of ${bodySize} bytes returned due to size limit`);
|
|
228
|
+
validation.truncated = {
|
|
229
|
+
originalSize: bodySize,
|
|
230
|
+
returnedSize: sizeLimit,
|
|
231
|
+
truncationPoint: sizeLimit,
|
|
232
|
+
sizeLimit,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
request: {
|
|
237
|
+
url: fullUrl,
|
|
238
|
+
method,
|
|
239
|
+
headers: {
|
|
240
|
+
...this.sanitizeHeaders(headers, false),
|
|
241
|
+
...this.sanitizeHeaders(requestHeaders || {}, true),
|
|
242
|
+
},
|
|
243
|
+
body,
|
|
244
|
+
authMethod: this.getAuthMethod(),
|
|
245
|
+
},
|
|
246
|
+
response: {
|
|
247
|
+
statusCode: response.status,
|
|
248
|
+
statusText: response.statusText,
|
|
249
|
+
timing: `${endTime - startTime}ms`,
|
|
250
|
+
headers: this.sanitizeHeaders(responseHeaders, false),
|
|
251
|
+
body: responseBody,
|
|
252
|
+
},
|
|
253
|
+
validation,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
clearTimeout(timeoutId);
|
|
258
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
259
|
+
throw new Error(`Request timeout after ${this.config.timeout}ms`);
|
|
260
|
+
}
|
|
261
|
+
throw error;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Force refresh the OAuth2 token (clears cache)
|
|
266
|
+
*/
|
|
267
|
+
clearTokenCache() {
|
|
268
|
+
this.cachedToken = null;
|
|
269
|
+
console.error("OAuth2 token cache cleared");
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Get configuration summary (safe to display)
|
|
273
|
+
*/
|
|
274
|
+
getConfigSummary() {
|
|
275
|
+
return {
|
|
276
|
+
baseUrl: this.config.baseUrl,
|
|
277
|
+
authMethod: this.getAuthMethod(),
|
|
278
|
+
sslVerification: this.config.enableSslVerify !== false,
|
|
279
|
+
responseSizeLimit: this.config.responseSizeLimit || 10000,
|
|
280
|
+
customHeaderCount: Object.keys(this.config.customHeaders || {}).length,
|
|
281
|
+
...(this.config.oauth2 && { oauth2TokenUrl: this.config.oauth2.tokenUrl }),
|
|
282
|
+
...(this.config.openApiUrl && { openApiUrl: this.config.openApiUrl }),
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Check if OpenAPI URL is configured
|
|
287
|
+
*/
|
|
288
|
+
hasOpenApiConfig() {
|
|
289
|
+
return !!this.config.openApiUrl;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Fetch and parse OpenAPI spec from configured URL
|
|
293
|
+
* Results are cached for OPENAPI_CACHE_TTL
|
|
294
|
+
*/
|
|
295
|
+
async fetchOpenApiSpec() {
|
|
296
|
+
if (!this.config.openApiUrl) {
|
|
297
|
+
throw new Error("OpenAPI URL not configured");
|
|
298
|
+
}
|
|
299
|
+
const now = Date.now();
|
|
300
|
+
if (this.cachedOpenApi &&
|
|
301
|
+
now - this.cachedOpenApi.fetchedAt < RestApiService.OPENAPI_CACHE_TTL) {
|
|
302
|
+
return this.cachedOpenApi;
|
|
303
|
+
}
|
|
304
|
+
if (this.openApiFetchPromise) {
|
|
305
|
+
return this.openApiFetchPromise;
|
|
306
|
+
}
|
|
307
|
+
this.openApiFetchPromise = this.doFetchOpenApiSpec();
|
|
308
|
+
try {
|
|
309
|
+
const result = await this.openApiFetchPromise;
|
|
310
|
+
return result;
|
|
311
|
+
}
|
|
312
|
+
finally {
|
|
313
|
+
this.openApiFetchPromise = null;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Actually fetch and parse the OpenAPI spec
|
|
318
|
+
*/
|
|
319
|
+
async doFetchOpenApiSpec() {
|
|
320
|
+
const url = this.config.openApiUrl;
|
|
321
|
+
console.error(`Fetching OpenAPI spec from ${url}...`);
|
|
322
|
+
const fetchOptions = {};
|
|
323
|
+
const controller = new AbortController();
|
|
324
|
+
const timeoutId = setTimeout(() => controller.abort(), 30000);
|
|
325
|
+
fetchOptions.signal = controller.signal;
|
|
326
|
+
try {
|
|
327
|
+
const response = await fetch(url, fetchOptions);
|
|
328
|
+
clearTimeout(timeoutId);
|
|
329
|
+
if (!response.ok) {
|
|
330
|
+
throw new Error(`Failed to fetch OpenAPI spec: ${response.status} ${response.statusText}`);
|
|
331
|
+
}
|
|
332
|
+
const spec = (await response.json());
|
|
333
|
+
const parsed = parseOpenApiSpec(spec);
|
|
334
|
+
this.cachedOpenApi = {
|
|
335
|
+
...parsed,
|
|
336
|
+
fetchedAt: Date.now(),
|
|
337
|
+
source: `OpenAPI spec from ${url}`,
|
|
338
|
+
};
|
|
339
|
+
console.error(`OpenAPI spec loaded: ${parsed.endpoints.length} endpoints, ${Object.keys(parsed.schemas).length} schemas`);
|
|
340
|
+
return this.cachedOpenApi;
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
clearTimeout(timeoutId);
|
|
344
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
345
|
+
throw new Error("OpenAPI fetch timeout after 30 seconds");
|
|
346
|
+
}
|
|
347
|
+
throw error;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Clear OpenAPI cache (forces re-fetch on next call)
|
|
352
|
+
*/
|
|
353
|
+
clearOpenApiCache() {
|
|
354
|
+
this.cachedOpenApi = null;
|
|
355
|
+
console.error("OpenAPI cache cleared");
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* List all available API endpoints from OpenAPI spec
|
|
359
|
+
* @param filter Optional filter to match endpoint paths (case-insensitive contains match)
|
|
360
|
+
*/
|
|
361
|
+
async listEndpointsAsync(filter) {
|
|
362
|
+
if (!this.config.openApiUrl) {
|
|
363
|
+
return {
|
|
364
|
+
baseUrl: this.config.baseUrl,
|
|
365
|
+
endpointCount: 0,
|
|
366
|
+
endpoints: [],
|
|
367
|
+
source: "No OpenAPI URL configured. Set REST_OPENAPI_URL environment variable.",
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
const openApiData = await this.fetchOpenApiSpec();
|
|
371
|
+
const endpoints = filter
|
|
372
|
+
? openApiData.endpoints.filter((ep) => ep.path.toLowerCase().includes(filter.toLowerCase()) ||
|
|
373
|
+
ep.entityName?.toLowerCase().includes(filter.toLowerCase()) ||
|
|
374
|
+
ep.description?.toLowerCase().includes(filter.toLowerCase()))
|
|
375
|
+
: openApiData.endpoints;
|
|
376
|
+
return {
|
|
377
|
+
baseUrl: this.config.baseUrl,
|
|
378
|
+
endpointCount: endpoints.length,
|
|
379
|
+
endpoints,
|
|
380
|
+
source: openApiData.source,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Get schema for a specific entity from OpenAPI spec
|
|
385
|
+
* @param entity Entity name (singular or plural)
|
|
386
|
+
*/
|
|
387
|
+
async getSchemaAsync(entity) {
|
|
388
|
+
if (!this.config.openApiUrl) {
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
391
|
+
const openApiData = await this.fetchOpenApiSpec();
|
|
392
|
+
const normalizedEntity = entity.toLowerCase();
|
|
393
|
+
for (const [key, schema] of Object.entries(openApiData.schemas)) {
|
|
394
|
+
if (key.toLowerCase() === normalizedEntity ||
|
|
395
|
+
schema.entityName.toLowerCase() === normalizedEntity ||
|
|
396
|
+
schema.pluralName.toLowerCase() === normalizedEntity) {
|
|
397
|
+
return schema;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return null;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=rest-api-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest-api-service.js","sourceRoot":"","sources":["../../src/services/rest-api-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tools barrel export + combined registration
|
|
3
|
+
*/
|
|
4
|
+
import type { ServiceContext } from '../types.js';
|
|
5
|
+
export declare function registerAllTools(server: any, ctx: ServiceContext): void;
|
|
6
|
+
export { registerRestTools } from './rest-tools.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAEvE;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,UAAU,gBAAgB,CAAC,MAAW,EAAE,GAAmB;IAC/D,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest-tools.d.ts","sourceRoot":"","sources":["../../src/tools/rest-tools.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAgQxE"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* REST API tool registrations
|
|
3
|
+
*/
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { createErrorResponse, createSuccessResponse, } from "@mcp-consultant-tools/core";
|
|
6
|
+
export function registerRestTools(server, ctx) {
|
|
7
|
+
// Tool: rest-request
|
|
8
|
+
server.tool("rest-request", `Test a REST API endpoint with automatic authentication. Supports GET, POST, PUT, DELETE, PATCH methods. Authentication is handled automatically based on server configuration (OAuth2 client credentials, bearer token, basic auth, or API key). Returns detailed request/response information including timing, headers, and body.`, {
|
|
9
|
+
method: z
|
|
10
|
+
.enum(["GET", "POST", "PUT", "DELETE", "PATCH"])
|
|
11
|
+
.describe("HTTP method to use"),
|
|
12
|
+
endpoint: z
|
|
13
|
+
.string()
|
|
14
|
+
.describe('Endpoint path (e.g., "/users", "/api/v1/orders"). Do not include the full URL - only the path.'),
|
|
15
|
+
body: z
|
|
16
|
+
.any()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Request body for POST/PUT/PATCH requests (object or string)"),
|
|
19
|
+
headers: z
|
|
20
|
+
.record(z.string())
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Additional headers for this request. Do not use for auth - configure auth via environment variables."),
|
|
23
|
+
host: z
|
|
24
|
+
.string()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe("Override base URL for this request only (e.g., 'https://other-api.com')"),
|
|
27
|
+
}, async ({ method, endpoint, body, headers, host, }) => {
|
|
28
|
+
try {
|
|
29
|
+
// Validate endpoint doesn't contain full URL
|
|
30
|
+
const urlPattern = /^(https?:\/\/|www\.)/i;
|
|
31
|
+
if (urlPattern.test(endpoint)) {
|
|
32
|
+
return createErrorResponse(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.`), "rest-request");
|
|
33
|
+
}
|
|
34
|
+
const options = {
|
|
35
|
+
method,
|
|
36
|
+
endpoint,
|
|
37
|
+
body,
|
|
38
|
+
headers,
|
|
39
|
+
host,
|
|
40
|
+
};
|
|
41
|
+
const result = await ctx.restApi.request(options);
|
|
42
|
+
return createSuccessResponse(result);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
return createErrorResponse(error, "rest-request");
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
// Tool: rest-config
|
|
49
|
+
server.tool("rest-config", "Get the current REST API service configuration summary, including base URL, authentication method, SSL settings, and custom headers count.", {}, async () => {
|
|
50
|
+
try {
|
|
51
|
+
const summary = ctx.restApi.getConfigSummary();
|
|
52
|
+
return createSuccessResponse(summary);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
return createErrorResponse(error, "rest-config");
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
// Tool: rest-refresh-token
|
|
59
|
+
server.tool("rest-refresh-token", "Force refresh the OAuth2 access token. Clears the token cache and acquires a new token on the next request. Only relevant when using OAuth2 authentication.", {}, async () => {
|
|
60
|
+
try {
|
|
61
|
+
const authMethod = ctx.restApi.getAuthMethod();
|
|
62
|
+
if (authMethod !== "oauth2") {
|
|
63
|
+
return createErrorResponse(new Error(`Token refresh only available for OAuth2 authentication. Current auth method: ${authMethod}`), "rest-refresh-token");
|
|
64
|
+
}
|
|
65
|
+
ctx.restApi.clearTokenCache();
|
|
66
|
+
return createSuccessResponse({
|
|
67
|
+
message: "OAuth2 token cache cleared. A new token will be acquired on the next request.",
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
return createErrorResponse(error, "rest-refresh-token");
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
// Tool: rest-batch-request
|
|
75
|
+
server.tool("rest-batch-request", "Execute multiple REST API requests sequentially. Useful for testing a series of related endpoints or performing a workflow. Returns results for all requests.", {
|
|
76
|
+
requests: z.array(z.object({
|
|
77
|
+
method: z.enum(["GET", "POST", "PUT", "DELETE", "PATCH"]),
|
|
78
|
+
endpoint: z.string(),
|
|
79
|
+
body: z.any().optional(),
|
|
80
|
+
headers: z.record(z.string()).optional(),
|
|
81
|
+
host: z.string().optional(),
|
|
82
|
+
})).describe("Array of request configurations to execute sequentially"),
|
|
83
|
+
stopOnError: z
|
|
84
|
+
.boolean()
|
|
85
|
+
.optional()
|
|
86
|
+
.describe("Stop executing remaining requests if one fails (default: false)"),
|
|
87
|
+
}, async ({ requests, stopOnError = false, }) => {
|
|
88
|
+
try {
|
|
89
|
+
const results = [];
|
|
90
|
+
for (let i = 0; i < requests.length; i++) {
|
|
91
|
+
const req = requests[i];
|
|
92
|
+
try {
|
|
93
|
+
const result = await ctx.restApi.request(req);
|
|
94
|
+
results.push({
|
|
95
|
+
index: i,
|
|
96
|
+
endpoint: req.endpoint,
|
|
97
|
+
success: !result.validation.isError,
|
|
98
|
+
result,
|
|
99
|
+
});
|
|
100
|
+
if (stopOnError && result.validation.isError) {
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
106
|
+
results.push({
|
|
107
|
+
index: i,
|
|
108
|
+
endpoint: req.endpoint,
|
|
109
|
+
success: false,
|
|
110
|
+
error: errorMessage,
|
|
111
|
+
});
|
|
112
|
+
if (stopOnError) {
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return createSuccessResponse({
|
|
118
|
+
totalRequests: requests.length,
|
|
119
|
+
executedRequests: results.length,
|
|
120
|
+
successfulRequests: results.filter((r) => r.success).length,
|
|
121
|
+
results,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
return createErrorResponse(error, "rest-batch-request");
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
// Tool: rest-list-endpoints
|
|
129
|
+
server.tool("rest-list-endpoints", "List all available REST API endpoints with their supported HTTP methods. Use this to discover what entities/resources are available in the API. Requires REST_OPENAPI_URL configuration pointing to your API's OpenAPI/Swagger spec.", {
|
|
130
|
+
filter: z
|
|
131
|
+
.string()
|
|
132
|
+
.optional()
|
|
133
|
+
.describe("Optional filter to match endpoint paths (case-insensitive contains match). Example: 'exam' returns all exam-related endpoints."),
|
|
134
|
+
}, async ({ filter }) => {
|
|
135
|
+
try {
|
|
136
|
+
const result = await ctx.restApi.listEndpointsAsync(filter);
|
|
137
|
+
return createSuccessResponse(result);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
return createErrorResponse(error, "rest-list-endpoints");
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
// Tool: rest-get-schema
|
|
144
|
+
server.tool("rest-get-schema", "Get the schema/field definitions for a specific entity. Returns field names, types, whether they're required, and any validation rules. Use this before creating or updating records to understand the data structure. Requires REST_OPENAPI_URL configuration pointing to your API's OpenAPI/Swagger spec.", {
|
|
145
|
+
entity: z
|
|
146
|
+
.string()
|
|
147
|
+
.describe("Entity name (singular or plural). Examples: 'sic_exam', 'sic_exams', 'contact', 'contacts'"),
|
|
148
|
+
}, async ({ entity }) => {
|
|
149
|
+
try {
|
|
150
|
+
if (!ctx.restApi.hasOpenApiConfig()) {
|
|
151
|
+
return createErrorResponse(new Error("No schema configuration available. Configure REST_OPENAPI_URL pointing to your API's OpenAPI/Swagger spec."), "rest-get-schema");
|
|
152
|
+
}
|
|
153
|
+
const schema = await ctx.restApi.getSchemaAsync(entity);
|
|
154
|
+
if (!schema) {
|
|
155
|
+
return createErrorResponse(new Error(`Entity '${entity}' not found. Use rest-list-endpoints to see available entities.`), "rest-get-schema");
|
|
156
|
+
}
|
|
157
|
+
return createSuccessResponse(schema);
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
return createErrorResponse(error, "rest-get-schema");
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
console.error("rest-api tools registered: 6 tools");
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=rest-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest-tools.js","sourceRoot":"","sources":["../../src/tools/rest-tools.ts"],"names":[],"mappings":"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"}
|
package/build/types.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service context shared between MCP server entry points.
|
|
3
|
+
* Uses lazy getters to initialize services on-demand.
|
|
4
|
+
*/
|
|
5
|
+
import type { RestApiService } from './services/rest-api-service.js';
|
|
6
|
+
export interface ServiceContext {
|
|
7
|
+
readonly restApi: RestApiService;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CAClC"}
|
package/build/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|