ebay-api-mcp-server-node-local 1.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.
- package/README.md +214 -0
- package/dist/constant/constants.js +48 -0
- package/dist/constant/constants.js.map +1 -0
- package/dist/helper/http-helper.js +140 -0
- package/dist/helper/http-helper.js.map +1 -0
- package/dist/helper/openapi-helper.js +114 -0
- package/dist/helper/openapi-helper.js.map +1 -0
- package/dist/helper/validation-helper.js +214 -0
- package/dist/helper/validation-helper.js.map +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/service/openapi-service.js +196 -0
- package/dist/service/openapi-service.js.map +1 -0
- package/eslint.config.js +58 -0
- package/package.json +50 -0
- package/src/constant/constants.ts +51 -0
- package/src/helper/http-helper.ts +154 -0
- package/src/helper/openapi-helper.ts +116 -0
- package/src/helper/validation-helper.ts +289 -0
- package/src/index.ts +75 -0
- package/src/integration.test.ts +140 -0
- package/src/service/openapi-service.ts +243 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.json +115 -0
- package/tsconfig.node.json +7 -0
- package/vitest.config.ts +20 -0
- package/vitest.setup.ts +6 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import AjvLib from "ajv";
|
|
2
|
+
const Ajv = AjvLib.default || AjvLib;
|
|
3
|
+
/**
|
|
4
|
+
* Validate request parameters against OpenAPI specification
|
|
5
|
+
*/
|
|
6
|
+
export function validateRequestParameters(url, openApiDoc, method, input) {
|
|
7
|
+
const errors = [];
|
|
8
|
+
// validate path
|
|
9
|
+
const { pathValidateRes, apiPath, specPath, specPathItem } = validatePath(openApiDoc, url);
|
|
10
|
+
if (!pathValidateRes || !specPathItem) {
|
|
11
|
+
errors.push(`API path ${apiPath} is not valid or not found in OpenAPI specification`);
|
|
12
|
+
return { isValid: false, errors };
|
|
13
|
+
}
|
|
14
|
+
// Check if the method exists for the path
|
|
15
|
+
const operation = specPathItem[method.toLowerCase()];
|
|
16
|
+
if (!operation) {
|
|
17
|
+
errors.push(`Method ${method} not found for path ${specPath} in OpenAPI specification`);
|
|
18
|
+
return { isValid: false, errors };
|
|
19
|
+
}
|
|
20
|
+
// Initialize AJV for schema validation
|
|
21
|
+
const _ajv = new Ajv({ allErrors: true });
|
|
22
|
+
validateUrlPathParam(input.urlVariables, operation.parameters, errors);
|
|
23
|
+
validateUrlQueryParam(input.urlQueryParams, operation.parameters, errors);
|
|
24
|
+
validateUrlHeaders(input.headers, operation.parameters, errors);
|
|
25
|
+
validateUrlRequestBody(input.requestBody, operation.requestBody, errors);
|
|
26
|
+
return { isValid: errors.length === 0, errors };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate the API path against the OpenAPI document
|
|
30
|
+
*/
|
|
31
|
+
export function validatePath(openApiDoc, inputUrl) {
|
|
32
|
+
// Extract the path from the URL (remove base URL part)
|
|
33
|
+
const apiPath = parseApiPathFromUrl(inputUrl);
|
|
34
|
+
if (!apiPath) {
|
|
35
|
+
console.error(`input url ${inputUrl} is not valid, please check it.`);
|
|
36
|
+
return { pathValidateRes: false, apiPath: "", specPath: "", specPathItem: undefined };
|
|
37
|
+
}
|
|
38
|
+
// bathPath validation
|
|
39
|
+
const serverObj = openApiDoc.servers?.[0] || { url: "" };
|
|
40
|
+
let basePath = "";
|
|
41
|
+
if (serverObj?.variables) {
|
|
42
|
+
for (const [key, value] of Object.entries(serverObj.variables)) {
|
|
43
|
+
if (key === "basePath") {
|
|
44
|
+
basePath = value.default;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const basePathRegex = new RegExp(`${basePath.replace(/\{[^}]+\}/g, "[^/]+")}$`);
|
|
49
|
+
if (basePath && !basePathRegex.test(apiPath)) {
|
|
50
|
+
console.error(`API path ${apiPath} does not match the base path ${basePath} in OpenAPI specification.`);
|
|
51
|
+
return { pathValidateRes: false, apiPath, specPath: "", specPathItem: undefined };
|
|
52
|
+
}
|
|
53
|
+
// specPath validation
|
|
54
|
+
for (const specPath of Object.keys(openApiDoc.paths || {})) {
|
|
55
|
+
const specPathRegex = new RegExp(`${specPath.replace(/\{[^}]+\}/g, "[^/]+")}$`);
|
|
56
|
+
if (specPathRegex.test(apiPath) && openApiDoc.paths?.[specPath]) {
|
|
57
|
+
const specPathItem = openApiDoc.paths[specPath];
|
|
58
|
+
return { pathValidateRes: true, apiPath, specPath, specPathItem };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { pathValidateRes: false, apiPath, specPath: "", specPathItem: undefined };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* parse path from the given url by llm
|
|
65
|
+
*/
|
|
66
|
+
export function parseApiPathFromUrl(inputUrl) {
|
|
67
|
+
try {
|
|
68
|
+
const urlObj = new URL(inputUrl);
|
|
69
|
+
return decodeURIComponent(urlObj.pathname); // Decode URL path
|
|
70
|
+
}
|
|
71
|
+
catch (urlError) {
|
|
72
|
+
// If URL parsing fails, try to extract path manually
|
|
73
|
+
const pathMatch = inputUrl.match(/https?:\/\/[^/]+(.*)$/);
|
|
74
|
+
if (pathMatch) {
|
|
75
|
+
return pathMatch[1];
|
|
76
|
+
}
|
|
77
|
+
console.error(`Failed to parse API path from URL: ${inputUrl}`);
|
|
78
|
+
return "";
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Validate URL path parameters against OpenAPI specification
|
|
83
|
+
*/
|
|
84
|
+
export function validateUrlPathParam(urlVariables, parameters, errors) {
|
|
85
|
+
// Initialize AJV for schema validation
|
|
86
|
+
const ajv = new Ajv({ allErrors: true });
|
|
87
|
+
if (urlVariables) {
|
|
88
|
+
const pathParams = (parameters || []).filter((param) => !("$ref" in param) && param.in === "path");
|
|
89
|
+
for (const param of pathParams) {
|
|
90
|
+
const value = urlVariables[param.name];
|
|
91
|
+
if (param.required && (value === undefined || value === null)) {
|
|
92
|
+
errors.push(`Missing required path parameter: ${param.name}`);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (value !== undefined && param.schema) {
|
|
96
|
+
const validate = ajv.compile(param.schema);
|
|
97
|
+
if (!validate(value)) {
|
|
98
|
+
errors.push(`Invalid path parameter ${param.name}: ${ajv.errorsText(validate.errors)}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Check for extra path parameters not defined in spec
|
|
103
|
+
const definedPathParams = pathParams.map(p => p.name);
|
|
104
|
+
const extraParams = Object.keys(urlVariables).filter(key => !definedPathParams.includes(key));
|
|
105
|
+
if (extraParams.length > 0) {
|
|
106
|
+
errors.push(`Unknown path parameters: ${extraParams.join(", ")}`);
|
|
107
|
+
}
|
|
108
|
+
// Check for required path parameters that might be missing from urlVariables
|
|
109
|
+
const requiredPathParams = (parameters || [])
|
|
110
|
+
.filter((param) => !("$ref" in param) && param.in === "path" && (param.required === true))
|
|
111
|
+
.map(param => param.name);
|
|
112
|
+
const providedPathParams = Object.keys(urlVariables || {});
|
|
113
|
+
const missingPathParams = requiredPathParams.filter(param => !providedPathParams.includes(param));
|
|
114
|
+
if (missingPathParams.length > 0) {
|
|
115
|
+
errors.push(`Missing required path parameters: ${missingPathParams.join(", ")}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Validate URL query parameters against OpenAPI specification
|
|
121
|
+
*/
|
|
122
|
+
export function validateUrlQueryParam(urlQueryParams, parameters, errors) {
|
|
123
|
+
const ajv = new Ajv({ allErrors: true });
|
|
124
|
+
if (urlQueryParams) {
|
|
125
|
+
const queryParams = (parameters || []).filter((param) => !("$ref" in param) && param.in === "query");
|
|
126
|
+
for (const param of queryParams) {
|
|
127
|
+
const value = urlQueryParams[param.name];
|
|
128
|
+
if (param.required && (value === undefined || value === null || value === "")) {
|
|
129
|
+
errors.push(`Missing required query parameter: ${param.name}`);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (value !== undefined && param.schema) {
|
|
133
|
+
const validate = ajv.compile(param.schema);
|
|
134
|
+
// Convert string values to appropriate types for validation
|
|
135
|
+
let validationValue = value;
|
|
136
|
+
if (typeof value === "string" && param.schema && !("$ref" in param.schema) && (param.schema).type) {
|
|
137
|
+
const schemaObj = param.schema;
|
|
138
|
+
switch (schemaObj.type) {
|
|
139
|
+
case "integer":
|
|
140
|
+
case "number":
|
|
141
|
+
validationValue = Number(value);
|
|
142
|
+
break;
|
|
143
|
+
case "boolean":
|
|
144
|
+
validationValue = value.toLowerCase() === "true";
|
|
145
|
+
break;
|
|
146
|
+
case "array":
|
|
147
|
+
// Handle comma-separated values for arrays
|
|
148
|
+
if (param.style === "form" && !param.explode) {
|
|
149
|
+
validationValue = value.split(",");
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (!validate(validationValue)) {
|
|
155
|
+
errors.push(`Invalid query parameter ${param.name}: ${ajv.errorsText(validate.errors)}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Validate URL headers against OpenAPI specification
|
|
163
|
+
*/
|
|
164
|
+
export function validateUrlHeaders(headers, parameters, errors) {
|
|
165
|
+
const ajv = new Ajv({ allErrors: true });
|
|
166
|
+
if (headers) {
|
|
167
|
+
const headerParams = (parameters || []).filter((param) => !("$ref" in param) && param.in === "header");
|
|
168
|
+
for (const param of headerParams) {
|
|
169
|
+
const headerName = param.name.toLowerCase();
|
|
170
|
+
const value = headers[headerName] || headers[param.name];
|
|
171
|
+
if (param.required && (value === undefined || value === null || value === "")) {
|
|
172
|
+
errors.push(`Missing required header parameter: ${param.name}`);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
if (value !== undefined && param.schema) {
|
|
176
|
+
const validate = ajv.compile(param.schema);
|
|
177
|
+
if (!validate(value)) {
|
|
178
|
+
errors.push(`Invalid header parameter ${param.name}: ${ajv.errorsText(validate.errors)}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Validate URL request body against OpenAPI specification
|
|
186
|
+
*/
|
|
187
|
+
export function validateUrlRequestBody(inputBody, operationBody, errors) {
|
|
188
|
+
const ajv = new Ajv({ allErrors: true, strict: false });
|
|
189
|
+
if (operationBody && !("$ref" in operationBody)) {
|
|
190
|
+
const requestBody = operationBody;
|
|
191
|
+
const isRequired = requestBody.required || false;
|
|
192
|
+
if (isRequired && (!inputBody || Object.keys(inputBody).length === 0)) {
|
|
193
|
+
errors.push("Missing required request body");
|
|
194
|
+
}
|
|
195
|
+
else if (inputBody && Object.keys(inputBody).length > 0) {
|
|
196
|
+
// Find the appropriate content type schema
|
|
197
|
+
const contentTypes = ["application/json", "application/x-www-form-urlencoded", "multipart/form-data"];
|
|
198
|
+
let schema;
|
|
199
|
+
for (const contentType of contentTypes) {
|
|
200
|
+
if (requestBody.content?.[contentType]?.schema) {
|
|
201
|
+
schema = requestBody.content[contentType].schema;
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (schema) {
|
|
206
|
+
const validate = ajv.compile(schema);
|
|
207
|
+
if (!validate(inputBody)) {
|
|
208
|
+
errors.push(`Invalid request body: ${ajv.errorsText(validate.errors)}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=validation-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-helper.js","sourceRoot":"","sources":["../../src/helper/validation-helper.ts"],"names":[],"mappings":"AAIA,OAAO,MAAM,MAAM,KAAK,CAAC;AACzB,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC;AAErC;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,GAAW,EACX,UAA8B,EAC9B,MAAc,EACd,KAKC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,gBAAgB;IAChB,MAAM,EAAC,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAC,GAAG,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACzF,IAAI,CAAC,eAAe,IAAI,CAAC,YAAY,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,YAAY,OAAO,qDAAqD,CAAC,CAAC;QACtF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACpC,CAAC;IAED,0CAA0C;IAC1C,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,WAAW,EAA+B,CAA8B,CAAC;IAC/G,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,UAAU,MAAM,uBAAuB,QAAQ,2BAA2B,CAAC,CAAC;QACxF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACpC,CAAC;IAED,uCAAuC;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,oBAAoB,CAAC,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEvE,qBAAqB,CAAC,KAAK,CAAC,cAAc,EAAE,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAE1E,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEhE,sBAAsB,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEzE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAA8B,EAAE,QAAgB;IAM3E,uDAAuD;IACvD,MAAM,OAAO,GAAY,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,aAAa,QAAQ,iCAAiC,CAAC,CAAC;QACtE,OAAO,EAAC,eAAe,EAAG,KAAK,EAAE,OAAO,EAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,SAAS,EAAC,CAAC;IACtF,CAAC;IACD,sBAAsB;IACtB,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IACzD,IAAI,QAAQ,GAAY,EAAE,CAAC;IAC3B,IAAI,SAAS,EAAE,SAAS,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/D,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBACvB,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAG,GAAG,CAAC,CAAC;IAClF,IAAI,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,YAAY,OAAO,iCAAiC,QAAQ,4BAA4B,CAAC,CAAC;QACxG,OAAO,EAAC,eAAe,EAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,SAAS,EAAC,CAAC;IACnF,CAAC;IAED,sBAAsB;IACtB,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3D,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAG,GAAG,CAAC,CAAC;QAClF,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChE,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAChD,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,OAAO,EAAC,eAAe,EAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,SAAS,EAAC,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjC,OAAO,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB;IAChE,CAAC;IAAC,OAAO,QAAQ,EAAE,CAAC;QAClB,qDAAqD;QACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC1D,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;QAChE,OAAQ,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAAiD,EACjD,UAAiF,EACjF,MAAgB;IAEhB,uCAAuC;IACvC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CAC1C,CAAC,KAAK,EAAsC,EAAE,CAC5C,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,MAAM,CAC5C,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEvC,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC9D,MAAM,CAAC,IAAI,CAAC,oCAAoC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9D,SAAS;YACX,CAAC;YAED,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrB,MAAM,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC1F,CAAC;YACH,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,MAAM,iBAAiB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9F,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,4BAA4B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,6EAA6E;QAC7E,MAAM,kBAAkB,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;aAC1C,MAAM,CAAC,CAAC,KAAK,EAAsC,EAAE,CACpD,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,CACvE;aACA,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAClG,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,qCAAqC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,cAAmD,EACnD,UAAiF,EACjF,MAAgB;IAEhB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,WAAW,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CAC3C,CAAC,KAAK,EAAsC,EAAE,CAC5C,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,CAC7C,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEzC,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,EAAE,CAAC;gBAC9E,MAAM,CAAC,IAAI,CAAC,qCAAqC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC/D,SAAS;YACX,CAAC;YAED,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC3C,4DAA4D;gBAC5D,IAAI,eAAe,GAAG,KAAK,CAAC;gBAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;oBAClG,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;oBAC/B,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;wBACvB,KAAK,SAAS,CAAC;wBACf,KAAK,QAAQ;4BACX,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;4BAChC,MAAM;wBACR,KAAK,SAAS;4BACZ,eAAe,GAAG,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;4BACjD,MAAM;wBACR,KAAK,OAAO;4BACV,2CAA2C;4BAC3C,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gCAC7C,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;4BACrC,CAAC;4BACD,MAAM;oBACV,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;oBAC/B,MAAM,CAAC,IAAI,CAAC,2BAA2B,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC3F,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA2C,EAC3C,UAAiF,EACjF,MAAgB;IAEhB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,YAAY,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CAC5C,CAAC,KAAK,EAAsC,EAAE,CAC5C,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,QAAQ,CAC9C,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEzD,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,EAAE,CAAC;gBAC9E,MAAM,CAAC,IAAI,CAAC,sCAAsC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChE,SAAS;YACX,CAAC;YAED,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrB,MAAM,CAAC,IAAI,CAAC,4BAA4B,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC5F,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAA8C,EAC9C,aAAkF,EAClF,MAAgB;IAEhB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,IAAI,aAAa,IAAI,CAAC,CAAC,MAAM,IAAI,aAAa,CAAC,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,aAAa,CAAC;QAClC,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,IAAI,KAAK,CAAC;QAEjD,IAAI,UAAU,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,2CAA2C;YAC3C,MAAM,YAAY,GAAG,CAAC,kBAAkB,EAAE,mCAAmC,EAAE,qBAAqB,CAAC,CAAC;YACtG,IAAI,MAA0C,CAAC;YAE/C,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;gBACvC,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;oBAC/C,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAgC,CAAC;oBAC3E,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACrC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBACzB,MAAM,CAAC,IAAI,CAAC,yBAAyB,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Load environment variables from .env file
|
|
2
|
+
import * as dotenv from "dotenv";
|
|
3
|
+
dotenv.config();
|
|
4
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
|
+
import { registerOpenApiTools } from "./service/openapi-service.js";
|
|
7
|
+
import * as constants from "./constant/constants.js";
|
|
8
|
+
/**
|
|
9
|
+
* Check if required environment variables are set for eBay API authentication
|
|
10
|
+
*/
|
|
11
|
+
function checkEnvironmentVariables() {
|
|
12
|
+
// environment vals check
|
|
13
|
+
const missingVars = constants.REQUIRED_ENV_VARS.filter(varName => !process.env[varName]);
|
|
14
|
+
if (missingVars.length > 0) {
|
|
15
|
+
console.error(`Missing required environment variables: ${missingVars.join(", ")}`);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
if (process.env.EBAY_ENVIRONMENT &&
|
|
19
|
+
!["sandbox", "production"].includes(process.env.EBAY_ENVIRONMENT.toLowerCase())) {
|
|
20
|
+
console.warn("Warning: EBAY_ENVIRONMENT must be either \"sandbox\" or \"production\"");
|
|
21
|
+
console.warn(`Current value "${process.env.EBAY_ENVIRONMENT}" is invalid, defaulting to "production"`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Main function to initialize and run the eBay API MCP Server
|
|
26
|
+
* This server exposes eBay API endpoints as MCP tools for access via AI models
|
|
27
|
+
*/
|
|
28
|
+
async function main() {
|
|
29
|
+
console.error("Starting eBay API MCP Server...");
|
|
30
|
+
// Check for required environment variables
|
|
31
|
+
checkEnvironmentVariables();
|
|
32
|
+
const server = initServer();
|
|
33
|
+
try {
|
|
34
|
+
// Register the OpenAPI tools with the server
|
|
35
|
+
await registerOpenApiTools(server);
|
|
36
|
+
console.error("Successfully registered OpenAPI tools");
|
|
37
|
+
// Create and connect server transport
|
|
38
|
+
const transport = new StdioServerTransport();
|
|
39
|
+
await server.connect(transport);
|
|
40
|
+
console.error("eBay API MCP Server running on stdio transport");
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.error("Error starting MCP server:", error instanceof Error ? error.message : String(error));
|
|
44
|
+
console.error("Stack trace:", error instanceof Error ? error.stack : "No stack trace available");
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Run the server
|
|
49
|
+
main().catch((error) => {
|
|
50
|
+
console.error("Fatal error:", error instanceof Error ? error.message : String(error));
|
|
51
|
+
console.error("Stack trace:", error instanceof Error ? error.stack : "No stack trace available");
|
|
52
|
+
process.exit(1);
|
|
53
|
+
});
|
|
54
|
+
// Create MCP server instance
|
|
55
|
+
function initServer() {
|
|
56
|
+
return new McpServer({
|
|
57
|
+
name: "ebay-api-mcp-server",
|
|
58
|
+
version: "1.0.0",
|
|
59
|
+
capabilities: {
|
|
60
|
+
resources: {},
|
|
61
|
+
tools: {},
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
//# 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,196 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import axios from "axios";
|
|
3
|
+
import util from "util";
|
|
4
|
+
import { RECALL_SPEC_BY_PROMPT_URL, RECALL_SPEC_WITH_FIELD_URL, SUPPORTED_CALLING_METHODS, findApiEnvironmentByValue } from "../constant/constants.js";
|
|
5
|
+
import { getOpenApiDocumentsFromConfigFile, parseOpenApiDoc, buildOperationSchema, buildZodSchema } from "../helper/openapi-helper.js";
|
|
6
|
+
import { validateRequestParameters as validateRequestParametersFromHelper } from "../helper/validation-helper.js";
|
|
7
|
+
import { buildHeadersFromInput, buildFinalUrl, replaceDomainNameByEnvironment, formatAxiosError, buildBaseUrlFromOpenApi, prepareRequestData } from "../helper/http-helper.js";
|
|
8
|
+
const USER_ENVIRONMENT = findApiEnvironmentByValue(process.env.EBAY_API_ENV || "");
|
|
9
|
+
const QUERY_API_TOOL_DISCRIPTION = "Send user prompt to remote service and return recommended API spec info (GET, query param, path...). " +
|
|
10
|
+
"Only output the tool response. Don't add any unnecessary text to it.";
|
|
11
|
+
const INVOKE_API_TOOL_DISCRIPTION = "this tool requires the prior invocation of tool queryAPI to ensure proper context, please ensure tool queryAPI has been successfully executed before using this tool." +
|
|
12
|
+
"the output of tool queryAPI will be used to generate input parameter of this tool. please ensure each field type of input parameter complies with the specifications required by the api spec." +
|
|
13
|
+
"after validation , this tool will invoke eBay OpenAPI and return the result." +
|
|
14
|
+
"if the tool return error, please check the error info and give advice or fix it.";
|
|
15
|
+
/**
|
|
16
|
+
* Register OpenAPI tools with MCP server
|
|
17
|
+
*/
|
|
18
|
+
export async function registerOpenApiTools(server) {
|
|
19
|
+
// Load OpenAPI document
|
|
20
|
+
const openapis = await getOpenApiDocumentsFromConfigFile();
|
|
21
|
+
for (const doc of openapis) {
|
|
22
|
+
registerOpenApiDynamicTools(server, doc);
|
|
23
|
+
}
|
|
24
|
+
registerCustomTools(server);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* register OpenAPI tools dynamically based on the OpenAPI document
|
|
28
|
+
*/
|
|
29
|
+
function registerOpenApiDynamicTools(server, openapi) {
|
|
30
|
+
const baseUrl = buildBaseUrlFromOpenApi(openapi);
|
|
31
|
+
Object.entries(openapi.paths || {})
|
|
32
|
+
.filter(([_, pathItem]) => pathItem !== undefined)
|
|
33
|
+
.forEach(([path, pathItem]) => registerPathOperations(server, baseUrl, path, pathItem));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Register tools for operations in a specific path
|
|
37
|
+
*/
|
|
38
|
+
function registerPathOperations(server, baseUrl, path, pathItem) {
|
|
39
|
+
const supportedMethods = Object.keys(pathItem)
|
|
40
|
+
.filter(method => SUPPORTED_CALLING_METHODS[USER_ENVIRONMENT].includes(method));
|
|
41
|
+
supportedMethods.forEach(method => {
|
|
42
|
+
const operation = pathItem[method];
|
|
43
|
+
if (operation && operation.operationId) {
|
|
44
|
+
registerOperation(server, baseUrl, path, method, operation);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Register tool for a single API operation
|
|
50
|
+
*/
|
|
51
|
+
function registerOperation(server, baseUrl, path, method, operation) {
|
|
52
|
+
const properties = buildOperationSchema(operation);
|
|
53
|
+
const zodProperties = buildZodSchema(properties);
|
|
54
|
+
server.tool(operation.operationId || "unknownOperation", operation.description || "No description", zodProperties, async (input, _extra) => {
|
|
55
|
+
try {
|
|
56
|
+
const { resolvedPath, headers, params, data } = prepareRequestData(input, operation, path);
|
|
57
|
+
const url = baseUrl + resolvedPath;
|
|
58
|
+
const resp = await axios.request({
|
|
59
|
+
url,
|
|
60
|
+
method,
|
|
61
|
+
headers,
|
|
62
|
+
params,
|
|
63
|
+
data,
|
|
64
|
+
httpsAgent: new (await import("https")).Agent({
|
|
65
|
+
rejectUnauthorized: false,
|
|
66
|
+
})
|
|
67
|
+
});
|
|
68
|
+
return {
|
|
69
|
+
content: [
|
|
70
|
+
{ type: "text", text: typeof resp.data === "string" ? resp.data : JSON.stringify(resp.data, null, 2) },
|
|
71
|
+
],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
return {
|
|
76
|
+
content: [
|
|
77
|
+
{ type: "text", text: `Error in invokeOpenAPI tool: ${formatAxiosError(error)}` },
|
|
78
|
+
],
|
|
79
|
+
isError: true,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Register custom API tools to enable interaction with eBay OpenAPI services
|
|
86
|
+
* This function registers two primary tools:
|
|
87
|
+
* 1. queryAPI - For discovering API specifications
|
|
88
|
+
* 2. invokeAPI - For executing API calls with validation
|
|
89
|
+
*/
|
|
90
|
+
function registerCustomTools(server) {
|
|
91
|
+
registerQueryApiTool(server);
|
|
92
|
+
registerInvokeApiTool(server);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Register a tool for querying API specifications based on natural language prompts
|
|
96
|
+
* Only registered when no custom API doc URL file is provided
|
|
97
|
+
*/
|
|
98
|
+
function registerQueryApiTool(server) {
|
|
99
|
+
const hasCustomDoc = process.env.EBAY_API_DOC_URL_FILE;
|
|
100
|
+
if (hasCustomDoc) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
server.tool("queryAPI", QUERY_API_TOOL_DISCRIPTION, { prompt: z.string() }, async (input) => {
|
|
104
|
+
try {
|
|
105
|
+
const url = util.format(RECALL_SPEC_BY_PROMPT_URL, encodeURIComponent(input.prompt));
|
|
106
|
+
const resp = await axios.get(url, {
|
|
107
|
+
httpsAgent: new (await import("https")).Agent({
|
|
108
|
+
rejectUnauthorized: false,
|
|
109
|
+
}),
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
content: [
|
|
113
|
+
{ type: "text", text: resp.data ? (typeof resp.data === "string" ? resp.data : JSON.stringify(resp.data, null, 2)) : "No response body" }
|
|
114
|
+
],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
return {
|
|
119
|
+
content: [
|
|
120
|
+
{ type: "text", text: `Error: ${error instanceof Error ? error.message : String(error)}` },
|
|
121
|
+
],
|
|
122
|
+
isError: true,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Register a tool for executing API calls with proper validation and error handling
|
|
129
|
+
*/
|
|
130
|
+
function registerInvokeApiTool(server) {
|
|
131
|
+
server.tool("invokeAPI", INVOKE_API_TOOL_DISCRIPTION, getInvokeApiSchema(), async (input, _extra) => {
|
|
132
|
+
try {
|
|
133
|
+
// Build headers
|
|
134
|
+
const headers = buildHeadersFromInput(input.headers);
|
|
135
|
+
// query and parse apiSpec by specTitle and operationId
|
|
136
|
+
const openApiDoc = await parseOpenApiDoc(input.specTitle, input.operationId, RECALL_SPEC_WITH_FIELD_URL);
|
|
137
|
+
const replacedDomainUrl = replaceDomainNameByEnvironment(input.url);
|
|
138
|
+
// Validate req parameters against OpenAPI spec
|
|
139
|
+
const reqParamValidation = validateRequestParametersFromHelper(replacedDomainUrl, openApiDoc, input.method, {
|
|
140
|
+
urlVariables: input.urlVariables,
|
|
141
|
+
urlQueryParams: input.urlQueryParams,
|
|
142
|
+
headers,
|
|
143
|
+
requestBody: input.requestBody,
|
|
144
|
+
});
|
|
145
|
+
if (!reqParamValidation.isValid) {
|
|
146
|
+
return {
|
|
147
|
+
content: [
|
|
148
|
+
{ type: "text", text: "Request validation failed:" },
|
|
149
|
+
{ type: "text", text: reqParamValidation.errors.join("\n") },
|
|
150
|
+
],
|
|
151
|
+
isError: true,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
// Make the API request
|
|
155
|
+
const resp = await axios.request({
|
|
156
|
+
url: buildFinalUrl(replacedDomainUrl, input.urlVariables),
|
|
157
|
+
method: input.method,
|
|
158
|
+
headers,
|
|
159
|
+
params: input.urlQueryParams,
|
|
160
|
+
data: input.requestBody,
|
|
161
|
+
httpsAgent: new (await import("https")).Agent({
|
|
162
|
+
rejectUnauthorized: false,
|
|
163
|
+
}),
|
|
164
|
+
});
|
|
165
|
+
return {
|
|
166
|
+
content: [
|
|
167
|
+
{ type: "text", text: resp.data ? (typeof resp.data === "string" ? resp.data : JSON.stringify(resp.data, null, 2)) : "No response body" },
|
|
168
|
+
],
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
return {
|
|
173
|
+
content: [
|
|
174
|
+
{ type: "text", text: `Error in invokeOpenAPI tool: ${formatAxiosError(error)}` },
|
|
175
|
+
],
|
|
176
|
+
isError: true,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Define the schema for invokeAPI tool parameters
|
|
183
|
+
*/
|
|
184
|
+
function getInvokeApiSchema() {
|
|
185
|
+
return {
|
|
186
|
+
url: z.string().describe("The complete request API URL, url and basePath need to be put in together. don't replace path variables, maintain variables such as {item_id}, the variable will be replaced by urlVariables input in tool."),
|
|
187
|
+
method: z.string().describe("The request API method (GET, POST, PUT, DELETE, ...)"),
|
|
188
|
+
headers: z.record(z.string(), z.array(z.string())).optional().describe("The API header params"),
|
|
189
|
+
urlVariables: z.record(z.string(), z.any()).optional().describe("The API path variables"),
|
|
190
|
+
urlQueryParams: z.record(z.string(), z.string()).optional().describe("The API query parameters"),
|
|
191
|
+
requestBody: z.record(z.string(), z.any()).optional().describe("The API request body"),
|
|
192
|
+
specTitle: z.string().describe("The OpenAPI spec title from info.title"),
|
|
193
|
+
operationId: z.string().describe("The OpenAPI operationId"),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=openapi-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-service.js","sourceRoot":"","sources":["../../src/service/openapi-service.ts"],"names":[],"mappings":"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"}
|
package/eslint.config.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import js from '@eslint/js';
|
|
2
|
+
import typescript from '@typescript-eslint/eslint-plugin';
|
|
3
|
+
import typescriptParser from '@typescript-eslint/parser';
|
|
4
|
+
import globals from 'globals';
|
|
5
|
+
|
|
6
|
+
export default [
|
|
7
|
+
// Base JavaScript recommended rules
|
|
8
|
+
js.configs.recommended,
|
|
9
|
+
|
|
10
|
+
// Global ignores
|
|
11
|
+
{
|
|
12
|
+
ignores: ['dist/**', 'node_modules/**', 'coverage/**', '*.config.js', '*.config.ts', 'vitest.setup.ts'],
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
// TypeScript configuration
|
|
16
|
+
{
|
|
17
|
+
files: ['**/*.ts', '**/*.tsx'],
|
|
18
|
+
languageOptions: {
|
|
19
|
+
parser: typescriptParser,
|
|
20
|
+
ecmaVersion: 'latest',
|
|
21
|
+
sourceType: 'module',
|
|
22
|
+
globals: {
|
|
23
|
+
...globals.node,
|
|
24
|
+
...globals.es2022,
|
|
25
|
+
},
|
|
26
|
+
parserOptions: {
|
|
27
|
+
project: ['./tsconfig.json', './tsconfig.node.json'],
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
plugins: {
|
|
31
|
+
'@typescript-eslint': typescript,
|
|
32
|
+
},
|
|
33
|
+
rules: {
|
|
34
|
+
// TypeScript rules
|
|
35
|
+
...typescript.configs.recommended.rules,
|
|
36
|
+
'@typescript-eslint/explicit-function-return-type': 'off',
|
|
37
|
+
'@typescript-eslint/no-explicit-any': 'warn',
|
|
38
|
+
'@typescript-eslint/no-unused-vars': ['warn', {
|
|
39
|
+
'argsIgnorePattern': '^_',
|
|
40
|
+
'varsIgnorePattern': '^_',
|
|
41
|
+
'caughtErrorsIgnorePattern': '^_',
|
|
42
|
+
}],
|
|
43
|
+
|
|
44
|
+
// General rules
|
|
45
|
+
'semi': ['error', 'always'],
|
|
46
|
+
'quotes': ['warn', 'double'],
|
|
47
|
+
'no-console': 'off', // Since console.error is used for logging
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
// Test files configuration
|
|
52
|
+
{
|
|
53
|
+
files: ['**/*.test.ts', '**/*.spec.ts'],
|
|
54
|
+
rules: {
|
|
55
|
+
'no-console': 'off',
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
];
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ebay-api-mcp-server-node-local",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for eBay API with OpenAPI support",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc --project tsconfig.build.json",
|
|
9
|
+
"start": "node dist/index.js",
|
|
10
|
+
"dev": "tsx src/index.ts",
|
|
11
|
+
"lint": "eslint .",
|
|
12
|
+
"lint:fix": "eslint . --fix",
|
|
13
|
+
"test": "vitest run",
|
|
14
|
+
"test:watch": "vitest",
|
|
15
|
+
"test:ui": "vitest --ui",
|
|
16
|
+
"test:coverage": "vitest run --coverage"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"mcp",
|
|
20
|
+
"model-context-protocol",
|
|
21
|
+
"openapi",
|
|
22
|
+
"ebay"
|
|
23
|
+
],
|
|
24
|
+
"author": "",
|
|
25
|
+
"license": "ISC",
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@apidevtools/swagger-parser": "^10.1.1",
|
|
28
|
+
"@modelcontextprotocol/sdk": "^1.11.1",
|
|
29
|
+
"axios": "^1.9.0",
|
|
30
|
+
"dotenv": "^16.5.0",
|
|
31
|
+
"js-yaml": "^4.1.0",
|
|
32
|
+
"openapi-types": "^12.1.3",
|
|
33
|
+
"tsx": "^4.20.3",
|
|
34
|
+
"zod": "^3.22.4"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@eslint/js": "^9.30.1",
|
|
38
|
+
"@types/js-yaml": "^4.0.9",
|
|
39
|
+
"@types/node": "^22.15.17",
|
|
40
|
+
"@typescript-eslint/eslint-plugin": "^7.3.1",
|
|
41
|
+
"@typescript-eslint/parser": "^7.3.1",
|
|
42
|
+
"@vitest/coverage-v8": "^3.1.3",
|
|
43
|
+
"@vitest/ui": "^3.1.3",
|
|
44
|
+
"eslint": "^8.57.0",
|
|
45
|
+
"globals": "^16.3.0",
|
|
46
|
+
"typescript": "^5.3.3",
|
|
47
|
+
"vitest": "^3.1.3"
|
|
48
|
+
},
|
|
49
|
+
"packageManager": "yarn@3.6.1+sha512.de524adec81a6c3d7a26d936d439d2832e351cdfc5728f9d91f3fc85dd20b04391c038e9b4ecab11cae2b0dd9f0d55fd355af766bc5c1a7f8d25d96bb2a0b2ca"
|
|
50
|
+
}
|