@elliotding/ai-agent-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/cached-client.d.ts +48 -0
- package/dist/api/cached-client.d.ts.map +1 -0
- package/dist/api/cached-client.js +126 -0
- package/dist/api/cached-client.js.map +1 -0
- package/dist/api/client.d.ts +213 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +326 -0
- package/dist/api/client.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +26 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +36 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +194 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/permissions.d.ts +60 -0
- package/dist/auth/permissions.d.ts.map +1 -0
- package/dist/auth/permissions.js +256 -0
- package/dist/auth/permissions.js.map +1 -0
- package/dist/auth/token-validator.d.ts +52 -0
- package/dist/auth/token-validator.d.ts.map +1 -0
- package/dist/auth/token-validator.js +217 -0
- package/dist/auth/token-validator.js.map +1 -0
- package/dist/cache/cache-manager.d.ts +49 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +191 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/cache/index.d.ts +6 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +12 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/redis-client.d.ts +45 -0
- package/dist/cache/redis-client.d.ts.map +1 -0
- package/dist/cache/redis-client.js +210 -0
- package/dist/cache/redis-client.js.map +1 -0
- package/dist/config/constants.d.ts +28 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +31 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/index.d.ts +54 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +168 -0
- package/dist/config/index.js.map +1 -0
- package/dist/filesystem/manager.d.ts +45 -0
- package/dist/filesystem/manager.d.ts.map +1 -0
- package/dist/filesystem/manager.js +246 -0
- package/dist/filesystem/manager.js.map +1 -0
- package/dist/git/multi-source-manager.d.ts +62 -0
- package/dist/git/multi-source-manager.d.ts.map +1 -0
- package/dist/git/multi-source-manager.js +293 -0
- package/dist/git/multi-source-manager.js.map +1 -0
- package/dist/git/operations.d.ts +27 -0
- package/dist/git/operations.d.ts.map +1 -0
- package/dist/git/operations.js +83 -0
- package/dist/git/operations.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/monitoring/health.d.ts +35 -0
- package/dist/monitoring/health.d.ts.map +1 -0
- package/dist/monitoring/health.js +105 -0
- package/dist/monitoring/health.js.map +1 -0
- package/dist/resources/index.d.ts +6 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +10 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/loader.d.ts +87 -0
- package/dist/resources/loader.d.ts.map +1 -0
- package/dist/resources/loader.js +452 -0
- package/dist/resources/loader.js.map +1 -0
- package/dist/server/http.d.ts +57 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +336 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +157 -0
- package/dist/server.js.map +1 -0
- package/dist/session/manager.d.ts +91 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +251 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/manage-subscription.d.ts +43 -0
- package/dist/tools/manage-subscription.d.ts.map +1 -0
- package/dist/tools/manage-subscription.js +268 -0
- package/dist/tools/manage-subscription.js.map +1 -0
- package/dist/tools/registry.d.ts +40 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +85 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search-resources.d.ts +31 -0
- package/dist/tools/search-resources.d.ts.map +1 -0
- package/dist/tools/search-resources.js +154 -0
- package/dist/tools/search-resources.js.map +1 -0
- package/dist/tools/sync-resources.d.ts +41 -0
- package/dist/tools/sync-resources.d.ts.map +1 -0
- package/dist/tools/sync-resources.js +606 -0
- package/dist/tools/sync-resources.js.map +1 -0
- package/dist/tools/uninstall-resource.d.ts +30 -0
- package/dist/tools/uninstall-resource.d.ts.map +1 -0
- package/dist/tools/uninstall-resource.js +259 -0
- package/dist/tools/uninstall-resource.js.map +1 -0
- package/dist/tools/upload-resource.d.ts +77 -0
- package/dist/tools/upload-resource.d.ts.map +1 -0
- package/dist/tools/upload-resource.js +252 -0
- package/dist/tools/upload-resource.js.map +1 -0
- package/dist/transport/sse.d.ts +29 -0
- package/dist/transport/sse.d.ts.map +1 -0
- package/dist/transport/sse.js +271 -0
- package/dist/transport/sse.js.map +1 -0
- package/dist/types/errors.d.ts +60 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +112 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mcp.d.ts +50 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +6 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/resources.d.ts +109 -0
- package/dist/types/resources.d.ts.map +1 -0
- package/dist/types/resources.js +7 -0
- package/dist/types/resources.js.map +1 -0
- package/dist/types/tools.d.ts +147 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +6 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/cursor-paths.d.ts +49 -0
- package/dist/utils/cursor-paths.d.ts.map +1 -0
- package/dist/utils/cursor-paths.js +116 -0
- package/dist/utils/cursor-paths.js.map +1 -0
- package/dist/utils/log-cleaner.d.ts +18 -0
- package/dist/utils/log-cleaner.d.ts.map +1 -0
- package/dist/utils/log-cleaner.js +112 -0
- package/dist/utils/log-cleaner.js.map +1 -0
- package/dist/utils/logger.d.ts +59 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +292 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +58 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +214 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +58 -0
- package/src/api/cached-client.ts +144 -0
- package/src/api/client.ts +578 -0
- package/src/auth/index.ts +11 -0
- package/src/auth/middleware.ts +244 -0
- package/src/auth/permissions.ts +317 -0
- package/src/auth/token-validator.ts +294 -0
- package/src/cache/cache-manager.ts +243 -0
- package/src/cache/index.ts +6 -0
- package/src/cache/redis-client.ts +249 -0
- package/src/config/constants.ts +33 -0
- package/src/config/index.ts +228 -0
- package/src/filesystem/manager.ts +235 -0
- package/src/git/multi-source-manager.ts +333 -0
- package/src/git/operations.ts +93 -0
- package/src/index.ts +139 -0
- package/src/monitoring/health.ts +132 -0
- package/src/resources/index.ts +13 -0
- package/src/resources/loader.ts +530 -0
- package/src/server/http.ts +427 -0
- package/src/server.ts +191 -0
- package/src/session/manager.ts +296 -0
- package/src/tools/index.ts +11 -0
- package/src/tools/manage-subscription.ts +332 -0
- package/src/tools/registry.ts +97 -0
- package/src/tools/search-resources.ts +177 -0
- package/src/tools/sync-resources.ts +662 -0
- package/src/tools/uninstall-resource.ts +248 -0
- package/src/tools/upload-resource.ts +258 -0
- package/src/transport/sse.ts +308 -0
- package/src/types/errors.ts +146 -0
- package/src/types/index.ts +7 -0
- package/src/types/mcp.ts +61 -0
- package/src/types/resources.ts +141 -0
- package/src/types/tools.ts +175 -0
- package/src/utils/cursor-paths.ts +83 -0
- package/src/utils/log-cleaner.ts +92 -0
- package/src/utils/logger.ts +333 -0
- package/src/utils/validation.ts +262 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request Validation Utilities
|
|
3
|
+
* Enhanced validation with clear error messages
|
|
4
|
+
*/
|
|
5
|
+
export interface ValidationError {
|
|
6
|
+
field: string;
|
|
7
|
+
message: string;
|
|
8
|
+
expected?: string;
|
|
9
|
+
received?: any;
|
|
10
|
+
suggestion?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class RequestValidationError extends Error {
|
|
13
|
+
errors: ValidationError[];
|
|
14
|
+
statusCode: number;
|
|
15
|
+
constructor(errors: ValidationError[], statusCode?: number);
|
|
16
|
+
toJSON(): {
|
|
17
|
+
error: string;
|
|
18
|
+
message: string;
|
|
19
|
+
details: ValidationError[];
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validate required field
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateRequired(value: any, fieldName: string): ValidationError | null;
|
|
26
|
+
/**
|
|
27
|
+
* Validate string type
|
|
28
|
+
*/
|
|
29
|
+
export declare function validateString(value: any, fieldName: string): ValidationError | null;
|
|
30
|
+
/**
|
|
31
|
+
* Validate enum value
|
|
32
|
+
*/
|
|
33
|
+
export declare function validateEnum(value: any, fieldName: string, allowedValues: readonly string[]): ValidationError | null;
|
|
34
|
+
/**
|
|
35
|
+
* Validate array type
|
|
36
|
+
*/
|
|
37
|
+
export declare function validateArray(value: any, fieldName: string): ValidationError | null;
|
|
38
|
+
/**
|
|
39
|
+
* Validate object type
|
|
40
|
+
*/
|
|
41
|
+
export declare function validateObject(value: any, fieldName: string): ValidationError | null;
|
|
42
|
+
/**
|
|
43
|
+
* Validate boolean type
|
|
44
|
+
*/
|
|
45
|
+
export declare function validateBoolean(value: any, fieldName: string): ValidationError | null;
|
|
46
|
+
/**
|
|
47
|
+
* Validate number type
|
|
48
|
+
*/
|
|
49
|
+
export declare function validateNumber(value: any, fieldName: string): ValidationError | null;
|
|
50
|
+
/**
|
|
51
|
+
* Validate SSE connection parameters
|
|
52
|
+
*/
|
|
53
|
+
export declare function validateSSEConnectionParams(_body: any): ValidationError[];
|
|
54
|
+
/**
|
|
55
|
+
* Validate message parameters
|
|
56
|
+
*/
|
|
57
|
+
export declare function validateMessageParams(body: any): ValidationError[];
|
|
58
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IACxC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;gBAEd,MAAM,EAAE,eAAe,EAAE,EAAE,UAAU,SAAM;IAQvD,MAAM;;;;;CAOP;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,GAAG,EACV,SAAS,EAAE,MAAM,GAChB,eAAe,GAAG,IAAI,CAUxB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,GAAG,EACV,SAAS,EAAE,MAAM,GAChB,eAAe,GAAG,IAAI,CAUxB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,GAAG,EACV,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,eAAe,GAAG,IAAI,CAcxB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,GAAG,EACV,SAAS,EAAE,MAAM,GAChB,eAAe,GAAG,IAAI,CAUxB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,GAAG,EACV,SAAS,EAAE,MAAM,GAChB,eAAe,GAAG,IAAI,CAUxB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,GAAG,EACV,SAAS,EAAE,MAAM,GAChB,eAAe,GAAG,IAAI,CAUxB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,GAAG,EACV,SAAS,EAAE,MAAM,GAChB,eAAe,GAAG,IAAI,CAUxB;AA8DD;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,GAAG,GAAG,eAAe,EAAE,CAOzE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,GAAG,GAAG,eAAe,EAAE,CAqBlE"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Request Validation Utilities
|
|
4
|
+
* Enhanced validation with clear error messages
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RequestValidationError = void 0;
|
|
8
|
+
exports.validateRequired = validateRequired;
|
|
9
|
+
exports.validateString = validateString;
|
|
10
|
+
exports.validateEnum = validateEnum;
|
|
11
|
+
exports.validateArray = validateArray;
|
|
12
|
+
exports.validateObject = validateObject;
|
|
13
|
+
exports.validateBoolean = validateBoolean;
|
|
14
|
+
exports.validateNumber = validateNumber;
|
|
15
|
+
exports.validateSSEConnectionParams = validateSSEConnectionParams;
|
|
16
|
+
exports.validateMessageParams = validateMessageParams;
|
|
17
|
+
class RequestValidationError extends Error {
|
|
18
|
+
errors;
|
|
19
|
+
statusCode;
|
|
20
|
+
constructor(errors, statusCode = 400) {
|
|
21
|
+
const message = errors.map(e => `${e.field}: ${e.message}`).join('; ');
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = 'RequestValidationError';
|
|
24
|
+
this.errors = errors;
|
|
25
|
+
this.statusCode = statusCode;
|
|
26
|
+
}
|
|
27
|
+
toJSON() {
|
|
28
|
+
return {
|
|
29
|
+
error: 'Validation Error',
|
|
30
|
+
message: this.message,
|
|
31
|
+
details: this.errors,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.RequestValidationError = RequestValidationError;
|
|
36
|
+
/**
|
|
37
|
+
* Validate required field
|
|
38
|
+
*/
|
|
39
|
+
function validateRequired(value, fieldName) {
|
|
40
|
+
if (value === undefined || value === null || value === '') {
|
|
41
|
+
return {
|
|
42
|
+
field: fieldName,
|
|
43
|
+
message: `Missing required field: '${fieldName}'`,
|
|
44
|
+
expected: 'non-empty value',
|
|
45
|
+
received: typeof value,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Validate string type
|
|
52
|
+
*/
|
|
53
|
+
function validateString(value, fieldName) {
|
|
54
|
+
if (typeof value !== 'string') {
|
|
55
|
+
return {
|
|
56
|
+
field: fieldName,
|
|
57
|
+
message: `Field '${fieldName}' must be a string`,
|
|
58
|
+
expected: 'string',
|
|
59
|
+
received: typeof value,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Validate enum value
|
|
66
|
+
*/
|
|
67
|
+
function validateEnum(value, fieldName, allowedValues) {
|
|
68
|
+
if (!allowedValues.includes(value)) {
|
|
69
|
+
// Find closest match for suggestion
|
|
70
|
+
const suggestion = findClosestMatch(value, allowedValues);
|
|
71
|
+
return {
|
|
72
|
+
field: fieldName,
|
|
73
|
+
message: `Field '${fieldName}' has invalid value`,
|
|
74
|
+
expected: `one of: ${allowedValues.map(v => `'${v}'`).join(', ')}`,
|
|
75
|
+
received: value,
|
|
76
|
+
suggestion: suggestion ? `Did you mean '${suggestion}'?` : undefined,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Validate array type
|
|
83
|
+
*/
|
|
84
|
+
function validateArray(value, fieldName) {
|
|
85
|
+
if (!Array.isArray(value)) {
|
|
86
|
+
return {
|
|
87
|
+
field: fieldName,
|
|
88
|
+
message: `Field '${fieldName}' must be an array`,
|
|
89
|
+
expected: 'array',
|
|
90
|
+
received: typeof value,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Validate object type
|
|
97
|
+
*/
|
|
98
|
+
function validateObject(value, fieldName) {
|
|
99
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
100
|
+
return {
|
|
101
|
+
field: fieldName,
|
|
102
|
+
message: `Field '${fieldName}' must be an object`,
|
|
103
|
+
expected: 'object',
|
|
104
|
+
received: Array.isArray(value) ? 'array' : typeof value,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Validate boolean type
|
|
111
|
+
*/
|
|
112
|
+
function validateBoolean(value, fieldName) {
|
|
113
|
+
if (typeof value !== 'boolean') {
|
|
114
|
+
return {
|
|
115
|
+
field: fieldName,
|
|
116
|
+
message: `Field '${fieldName}' must be a boolean`,
|
|
117
|
+
expected: 'boolean (true or false)',
|
|
118
|
+
received: typeof value,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Validate number type
|
|
125
|
+
*/
|
|
126
|
+
function validateNumber(value, fieldName) {
|
|
127
|
+
if (typeof value !== 'number' || isNaN(value)) {
|
|
128
|
+
return {
|
|
129
|
+
field: fieldName,
|
|
130
|
+
message: `Field '${fieldName}' must be a number`,
|
|
131
|
+
expected: 'number',
|
|
132
|
+
received: typeof value,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Find closest string match (simple Levenshtein distance)
|
|
139
|
+
*/
|
|
140
|
+
function findClosestMatch(value, candidates) {
|
|
141
|
+
if (!value || typeof value !== 'string') {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
let minDistance = Infinity;
|
|
145
|
+
let closest = null;
|
|
146
|
+
for (const candidate of candidates) {
|
|
147
|
+
const distance = levenshteinDistance(value.toLowerCase(), candidate.toLowerCase());
|
|
148
|
+
if (distance < minDistance && distance <= 2) {
|
|
149
|
+
// Only suggest if distance is small
|
|
150
|
+
minDistance = distance;
|
|
151
|
+
closest = candidate;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return closest;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Calculate Levenshtein distance between two strings
|
|
158
|
+
*/
|
|
159
|
+
function levenshteinDistance(a, b) {
|
|
160
|
+
const matrix = [];
|
|
161
|
+
for (let i = 0; i <= b.length; i++) {
|
|
162
|
+
matrix[i] = [i];
|
|
163
|
+
}
|
|
164
|
+
for (let j = 0; j <= a.length; j++) {
|
|
165
|
+
matrix[0][j] = j;
|
|
166
|
+
}
|
|
167
|
+
for (let i = 1; i <= b.length; i++) {
|
|
168
|
+
for (let j = 1; j <= a.length; j++) {
|
|
169
|
+
if (b.charAt(i - 1) === a.charAt(j - 1)) {
|
|
170
|
+
matrix[i][j] = matrix[i - 1][j - 1];
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
|
|
174
|
+
matrix[i][j - 1] + 1, // insertion
|
|
175
|
+
matrix[i - 1][j] + 1 // deletion
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return matrix[b.length][a.length];
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Validate SSE connection parameters
|
|
184
|
+
*/
|
|
185
|
+
function validateSSEConnectionParams(_body) {
|
|
186
|
+
const errors = [];
|
|
187
|
+
// Validate Authorization header (will be checked in middleware)
|
|
188
|
+
// No body parameters required for SSE connection
|
|
189
|
+
return errors;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Validate message parameters
|
|
193
|
+
*/
|
|
194
|
+
function validateMessageParams(body) {
|
|
195
|
+
const errors = [];
|
|
196
|
+
// sessionId is required
|
|
197
|
+
const sessionIdError = validateRequired(body.sessionId, 'sessionId');
|
|
198
|
+
if (sessionIdError) {
|
|
199
|
+
errors.push(sessionIdError);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
const sessionIdTypeError = validateString(body.sessionId, 'sessionId');
|
|
203
|
+
if (sessionIdTypeError) {
|
|
204
|
+
errors.push(sessionIdTypeError);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// message is required
|
|
208
|
+
const messageError = validateRequired(body.message, 'message');
|
|
209
|
+
if (messageError) {
|
|
210
|
+
errors.push(messageError);
|
|
211
|
+
}
|
|
212
|
+
return errors;
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@elliotding/ai-agent-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CSP AI Agent MCP Server - Centralized AI tools distribution and management",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"csp-ai-agent-mcp": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"dev": "tsx watch src/index.ts",
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"start": "NODE_PATH=. node dist/index.js",
|
|
14
|
+
"lint": "eslint src --ext .ts",
|
|
15
|
+
"lint:fix": "eslint src --ext .ts --fix",
|
|
16
|
+
"type-check": "tsc --noEmit",
|
|
17
|
+
"test": "echo \"Error: no test runner configured yet\" && exit 1",
|
|
18
|
+
"clean": "rm -rf dist",
|
|
19
|
+
"prebuild": "npm run clean"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"mcp",
|
|
23
|
+
"mcp-server",
|
|
24
|
+
"model-context-protocol",
|
|
25
|
+
"ai-agent",
|
|
26
|
+
"cursor",
|
|
27
|
+
"tools-management"
|
|
28
|
+
],
|
|
29
|
+
"author": "CSP Team",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18.0.0",
|
|
33
|
+
"npm": ">=9.0.0"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@fastify/cors": "^11.2.0",
|
|
37
|
+
"@fastify/helmet": "^13.0.2",
|
|
38
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
39
|
+
"axios": "^1.6.0",
|
|
40
|
+
"dotenv": "^16.4.0",
|
|
41
|
+
"fastify": "^5.8.2",
|
|
42
|
+
"ioredis": "^5.10.0",
|
|
43
|
+
"lru-cache": "^11.2.6",
|
|
44
|
+
"pino": "^8.19.0",
|
|
45
|
+
"pino-pretty": "^11.0.0",
|
|
46
|
+
"pino-roll": "^4.0.0",
|
|
47
|
+
"simple-git": "^3.22.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^20.11.0",
|
|
51
|
+
"@typescript-eslint/eslint-plugin": "^8.57.0",
|
|
52
|
+
"@typescript-eslint/parser": "^8.57.0",
|
|
53
|
+
"eslint": "^8.56.0",
|
|
54
|
+
"prettier": "^3.2.0",
|
|
55
|
+
"tsx": "^4.7.0",
|
|
56
|
+
"typescript": "^5.3.0"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cached API Client
|
|
3
|
+
* Wraps API Client with caching layer
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { CacheManager } from '../cache';
|
|
7
|
+
import { apiClient } from './client';
|
|
8
|
+
import { config } from '../config';
|
|
9
|
+
import { logger } from '../utils/logger';
|
|
10
|
+
import { AxiosRequestConfig } from 'axios';
|
|
11
|
+
|
|
12
|
+
class CachedAPIClient {
|
|
13
|
+
private cache: CacheManager | null = null;
|
|
14
|
+
private readonly cacheNamespace = 'api';
|
|
15
|
+
|
|
16
|
+
constructor() {
|
|
17
|
+
if (config.cache.enabled) {
|
|
18
|
+
this.cache = CacheManager.getInstance({ namespace: this.cacheNamespace });
|
|
19
|
+
logger.info('Cached API client initialized with caching enabled');
|
|
20
|
+
} else {
|
|
21
|
+
logger.info('Cached API client initialized without caching');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Initialize cache connection
|
|
27
|
+
*/
|
|
28
|
+
async connect(): Promise<void> {
|
|
29
|
+
if (this.cache) {
|
|
30
|
+
await this.cache.connect();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Generate cache key from URL and config
|
|
36
|
+
*/
|
|
37
|
+
private generateCacheKey(method: string, url: string, data?: unknown): string {
|
|
38
|
+
const parts = [method.toUpperCase(), url];
|
|
39
|
+
if (data) {
|
|
40
|
+
parts.push(JSON.stringify(data));
|
|
41
|
+
}
|
|
42
|
+
return parts.join(':');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* GET request with caching
|
|
47
|
+
*/
|
|
48
|
+
async get<T>(url: string, options?: { config?: AxiosRequestConfig; skipCache?: boolean }): Promise<T> {
|
|
49
|
+
const cacheKey = this.generateCacheKey('GET', url);
|
|
50
|
+
|
|
51
|
+
// Try cache first (if enabled and not skipped)
|
|
52
|
+
if (this.cache && !options?.skipCache) {
|
|
53
|
+
const cached = await this.cache.get(cacheKey);
|
|
54
|
+
if (cached !== null) {
|
|
55
|
+
logger.debug({ url, cacheKey }, 'API cache hit');
|
|
56
|
+
return cached as T;
|
|
57
|
+
}
|
|
58
|
+
logger.debug({ url, cacheKey }, 'API cache miss');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Fetch from API
|
|
62
|
+
const result = await apiClient.get<T>(url, options?.config);
|
|
63
|
+
|
|
64
|
+
// Store in cache (if enabled)
|
|
65
|
+
if (this.cache && !options?.skipCache) {
|
|
66
|
+
await this.cache.set(cacheKey, result);
|
|
67
|
+
logger.debug({ url, cacheKey }, 'API response cached');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* POST request (no caching for mutations)
|
|
75
|
+
*/
|
|
76
|
+
async post<T>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {
|
|
77
|
+
const result = await apiClient.post<T>(url, data, config);
|
|
78
|
+
|
|
79
|
+
// Invalidate related cache entries
|
|
80
|
+
if (this.cache) {
|
|
81
|
+
// Clear GET cache for the same URL
|
|
82
|
+
const getCacheKey = this.generateCacheKey('GET', url);
|
|
83
|
+
await this.cache.del(getCacheKey);
|
|
84
|
+
logger.debug({ url }, 'Cache invalidated after POST');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* PUT request (no caching for mutations)
|
|
92
|
+
*/
|
|
93
|
+
async put<T>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {
|
|
94
|
+
const result = await apiClient.put<T>(url, data, config);
|
|
95
|
+
|
|
96
|
+
// Invalidate related cache entries
|
|
97
|
+
if (this.cache) {
|
|
98
|
+
const getCacheKey = this.generateCacheKey('GET', url);
|
|
99
|
+
await this.cache.del(getCacheKey);
|
|
100
|
+
logger.debug({ url }, 'Cache invalidated after PUT');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* DELETE request (no caching for mutations)
|
|
108
|
+
*/
|
|
109
|
+
async delete<T>(url: string, config?: AxiosRequestConfig): Promise<T> {
|
|
110
|
+
const result = await apiClient.delete<T>(url, config);
|
|
111
|
+
|
|
112
|
+
// Invalidate related cache entries
|
|
113
|
+
if (this.cache) {
|
|
114
|
+
const getCacheKey = this.generateCacheKey('GET', url);
|
|
115
|
+
await this.cache.del(getCacheKey);
|
|
116
|
+
logger.debug({ url }, 'Cache invalidated after DELETE');
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Clear all API cache
|
|
124
|
+
*/
|
|
125
|
+
async clearCache(): Promise<void> {
|
|
126
|
+
if (this.cache) {
|
|
127
|
+
await this.cache.clear();
|
|
128
|
+
logger.info('API cache cleared');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Get cache statistics
|
|
134
|
+
*/
|
|
135
|
+
getCacheStats() {
|
|
136
|
+
if (this.cache) {
|
|
137
|
+
return this.cache.getStats();
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Singleton instance
|
|
144
|
+
export const cachedAPIClient = new CachedAPIClient();
|