@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.
Files changed (191) hide show
  1. package/dist/api/cached-client.d.ts +48 -0
  2. package/dist/api/cached-client.d.ts.map +1 -0
  3. package/dist/api/cached-client.js +126 -0
  4. package/dist/api/cached-client.js.map +1 -0
  5. package/dist/api/client.d.ts +213 -0
  6. package/dist/api/client.d.ts.map +1 -0
  7. package/dist/api/client.js +326 -0
  8. package/dist/api/client.js.map +1 -0
  9. package/dist/auth/index.d.ts +8 -0
  10. package/dist/auth/index.d.ts.map +1 -0
  11. package/dist/auth/index.js +26 -0
  12. package/dist/auth/index.js.map +1 -0
  13. package/dist/auth/middleware.d.ts +36 -0
  14. package/dist/auth/middleware.d.ts.map +1 -0
  15. package/dist/auth/middleware.js +194 -0
  16. package/dist/auth/middleware.js.map +1 -0
  17. package/dist/auth/permissions.d.ts +60 -0
  18. package/dist/auth/permissions.d.ts.map +1 -0
  19. package/dist/auth/permissions.js +256 -0
  20. package/dist/auth/permissions.js.map +1 -0
  21. package/dist/auth/token-validator.d.ts +52 -0
  22. package/dist/auth/token-validator.d.ts.map +1 -0
  23. package/dist/auth/token-validator.js +217 -0
  24. package/dist/auth/token-validator.js.map +1 -0
  25. package/dist/cache/cache-manager.d.ts +49 -0
  26. package/dist/cache/cache-manager.d.ts.map +1 -0
  27. package/dist/cache/cache-manager.js +191 -0
  28. package/dist/cache/cache-manager.js.map +1 -0
  29. package/dist/cache/index.d.ts +6 -0
  30. package/dist/cache/index.d.ts.map +1 -0
  31. package/dist/cache/index.js +12 -0
  32. package/dist/cache/index.js.map +1 -0
  33. package/dist/cache/redis-client.d.ts +45 -0
  34. package/dist/cache/redis-client.d.ts.map +1 -0
  35. package/dist/cache/redis-client.js +210 -0
  36. package/dist/cache/redis-client.js.map +1 -0
  37. package/dist/config/constants.d.ts +28 -0
  38. package/dist/config/constants.d.ts.map +1 -0
  39. package/dist/config/constants.js +31 -0
  40. package/dist/config/constants.js.map +1 -0
  41. package/dist/config/index.d.ts +54 -0
  42. package/dist/config/index.d.ts.map +1 -0
  43. package/dist/config/index.js +168 -0
  44. package/dist/config/index.js.map +1 -0
  45. package/dist/filesystem/manager.d.ts +45 -0
  46. package/dist/filesystem/manager.d.ts.map +1 -0
  47. package/dist/filesystem/manager.js +246 -0
  48. package/dist/filesystem/manager.js.map +1 -0
  49. package/dist/git/multi-source-manager.d.ts +62 -0
  50. package/dist/git/multi-source-manager.d.ts.map +1 -0
  51. package/dist/git/multi-source-manager.js +293 -0
  52. package/dist/git/multi-source-manager.js.map +1 -0
  53. package/dist/git/operations.d.ts +27 -0
  54. package/dist/git/operations.d.ts.map +1 -0
  55. package/dist/git/operations.js +83 -0
  56. package/dist/git/operations.js.map +1 -0
  57. package/dist/index.d.ts +6 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +109 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/monitoring/health.d.ts +35 -0
  62. package/dist/monitoring/health.d.ts.map +1 -0
  63. package/dist/monitoring/health.js +105 -0
  64. package/dist/monitoring/health.js.map +1 -0
  65. package/dist/resources/index.d.ts +6 -0
  66. package/dist/resources/index.d.ts.map +1 -0
  67. package/dist/resources/index.js +10 -0
  68. package/dist/resources/index.js.map +1 -0
  69. package/dist/resources/loader.d.ts +87 -0
  70. package/dist/resources/loader.d.ts.map +1 -0
  71. package/dist/resources/loader.js +452 -0
  72. package/dist/resources/loader.js.map +1 -0
  73. package/dist/server/http.d.ts +57 -0
  74. package/dist/server/http.d.ts.map +1 -0
  75. package/dist/server/http.js +336 -0
  76. package/dist/server/http.js.map +1 -0
  77. package/dist/server.d.ts +13 -0
  78. package/dist/server.d.ts.map +1 -0
  79. package/dist/server.js +157 -0
  80. package/dist/server.js.map +1 -0
  81. package/dist/session/manager.d.ts +91 -0
  82. package/dist/session/manager.d.ts.map +1 -0
  83. package/dist/session/manager.js +251 -0
  84. package/dist/session/manager.js.map +1 -0
  85. package/dist/tools/index.d.ts +11 -0
  86. package/dist/tools/index.d.ts.map +1 -0
  87. package/dist/tools/index.js +27 -0
  88. package/dist/tools/index.js.map +1 -0
  89. package/dist/tools/manage-subscription.d.ts +43 -0
  90. package/dist/tools/manage-subscription.d.ts.map +1 -0
  91. package/dist/tools/manage-subscription.js +268 -0
  92. package/dist/tools/manage-subscription.js.map +1 -0
  93. package/dist/tools/registry.d.ts +40 -0
  94. package/dist/tools/registry.d.ts.map +1 -0
  95. package/dist/tools/registry.js +85 -0
  96. package/dist/tools/registry.js.map +1 -0
  97. package/dist/tools/search-resources.d.ts +31 -0
  98. package/dist/tools/search-resources.d.ts.map +1 -0
  99. package/dist/tools/search-resources.js +154 -0
  100. package/dist/tools/search-resources.js.map +1 -0
  101. package/dist/tools/sync-resources.d.ts +41 -0
  102. package/dist/tools/sync-resources.d.ts.map +1 -0
  103. package/dist/tools/sync-resources.js +606 -0
  104. package/dist/tools/sync-resources.js.map +1 -0
  105. package/dist/tools/uninstall-resource.d.ts +30 -0
  106. package/dist/tools/uninstall-resource.d.ts.map +1 -0
  107. package/dist/tools/uninstall-resource.js +259 -0
  108. package/dist/tools/uninstall-resource.js.map +1 -0
  109. package/dist/tools/upload-resource.d.ts +77 -0
  110. package/dist/tools/upload-resource.d.ts.map +1 -0
  111. package/dist/tools/upload-resource.js +252 -0
  112. package/dist/tools/upload-resource.js.map +1 -0
  113. package/dist/transport/sse.d.ts +29 -0
  114. package/dist/transport/sse.d.ts.map +1 -0
  115. package/dist/transport/sse.js +271 -0
  116. package/dist/transport/sse.js.map +1 -0
  117. package/dist/types/errors.d.ts +60 -0
  118. package/dist/types/errors.d.ts.map +1 -0
  119. package/dist/types/errors.js +112 -0
  120. package/dist/types/errors.js.map +1 -0
  121. package/dist/types/index.d.ts +7 -0
  122. package/dist/types/index.d.ts.map +1 -0
  123. package/dist/types/index.js +23 -0
  124. package/dist/types/index.js.map +1 -0
  125. package/dist/types/mcp.d.ts +50 -0
  126. package/dist/types/mcp.d.ts.map +1 -0
  127. package/dist/types/mcp.js +6 -0
  128. package/dist/types/mcp.js.map +1 -0
  129. package/dist/types/resources.d.ts +109 -0
  130. package/dist/types/resources.d.ts.map +1 -0
  131. package/dist/types/resources.js +7 -0
  132. package/dist/types/resources.js.map +1 -0
  133. package/dist/types/tools.d.ts +147 -0
  134. package/dist/types/tools.d.ts.map +1 -0
  135. package/dist/types/tools.js +6 -0
  136. package/dist/types/tools.js.map +1 -0
  137. package/dist/utils/cursor-paths.d.ts +49 -0
  138. package/dist/utils/cursor-paths.d.ts.map +1 -0
  139. package/dist/utils/cursor-paths.js +116 -0
  140. package/dist/utils/cursor-paths.js.map +1 -0
  141. package/dist/utils/log-cleaner.d.ts +18 -0
  142. package/dist/utils/log-cleaner.d.ts.map +1 -0
  143. package/dist/utils/log-cleaner.js +112 -0
  144. package/dist/utils/log-cleaner.js.map +1 -0
  145. package/dist/utils/logger.d.ts +59 -0
  146. package/dist/utils/logger.d.ts.map +1 -0
  147. package/dist/utils/logger.js +292 -0
  148. package/dist/utils/logger.js.map +1 -0
  149. package/dist/utils/validation.d.ts +58 -0
  150. package/dist/utils/validation.d.ts.map +1 -0
  151. package/dist/utils/validation.js +214 -0
  152. package/dist/utils/validation.js.map +1 -0
  153. package/package.json +58 -0
  154. package/src/api/cached-client.ts +144 -0
  155. package/src/api/client.ts +578 -0
  156. package/src/auth/index.ts +11 -0
  157. package/src/auth/middleware.ts +244 -0
  158. package/src/auth/permissions.ts +317 -0
  159. package/src/auth/token-validator.ts +294 -0
  160. package/src/cache/cache-manager.ts +243 -0
  161. package/src/cache/index.ts +6 -0
  162. package/src/cache/redis-client.ts +249 -0
  163. package/src/config/constants.ts +33 -0
  164. package/src/config/index.ts +228 -0
  165. package/src/filesystem/manager.ts +235 -0
  166. package/src/git/multi-source-manager.ts +333 -0
  167. package/src/git/operations.ts +93 -0
  168. package/src/index.ts +139 -0
  169. package/src/monitoring/health.ts +132 -0
  170. package/src/resources/index.ts +13 -0
  171. package/src/resources/loader.ts +530 -0
  172. package/src/server/http.ts +427 -0
  173. package/src/server.ts +191 -0
  174. package/src/session/manager.ts +296 -0
  175. package/src/tools/index.ts +11 -0
  176. package/src/tools/manage-subscription.ts +332 -0
  177. package/src/tools/registry.ts +97 -0
  178. package/src/tools/search-resources.ts +177 -0
  179. package/src/tools/sync-resources.ts +662 -0
  180. package/src/tools/uninstall-resource.ts +248 -0
  181. package/src/tools/upload-resource.ts +258 -0
  182. package/src/transport/sse.ts +308 -0
  183. package/src/types/errors.ts +146 -0
  184. package/src/types/index.ts +7 -0
  185. package/src/types/mcp.ts +61 -0
  186. package/src/types/resources.ts +141 -0
  187. package/src/types/tools.ts +175 -0
  188. package/src/utils/cursor-paths.ts +83 -0
  189. package/src/utils/log-cleaner.ts +92 -0
  190. package/src/utils/logger.ts +333 -0
  191. 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();