@llmindset/hf-mcp-server 0.1.16

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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/components.json +21 -0
  3. package/dist/server/application.d.ts +30 -0
  4. package/dist/server/application.d.ts.map +1 -0
  5. package/dist/server/application.js +131 -0
  6. package/dist/server/application.js.map +1 -0
  7. package/dist/server/gradio-endpoint-connector.d.ts +46 -0
  8. package/dist/server/gradio-endpoint-connector.d.ts.map +1 -0
  9. package/dist/server/gradio-endpoint-connector.js +348 -0
  10. package/dist/server/gradio-endpoint-connector.js.map +1 -0
  11. package/dist/server/gradio-endpoint-connector.test.d.ts +2 -0
  12. package/dist/server/gradio-endpoint-connector.test.d.ts.map +1 -0
  13. package/dist/server/gradio-endpoint-connector.test.js +313 -0
  14. package/dist/server/gradio-endpoint-connector.test.js.map +1 -0
  15. package/dist/server/lib/logger.d.ts +5 -0
  16. package/dist/server/lib/logger.d.ts.map +1 -0
  17. package/dist/server/lib/logger.js +45 -0
  18. package/dist/server/lib/logger.js.map +1 -0
  19. package/dist/server/lib/mcp-api-client.d.ts +42 -0
  20. package/dist/server/lib/mcp-api-client.d.ts.map +1 -0
  21. package/dist/server/lib/mcp-api-client.js +188 -0
  22. package/dist/server/lib/mcp-api-client.js.map +1 -0
  23. package/dist/server/lib/tool-selection-strategy.d.ts +29 -0
  24. package/dist/server/lib/tool-selection-strategy.d.ts.map +1 -0
  25. package/dist/server/lib/tool-selection-strategy.js +113 -0
  26. package/dist/server/lib/tool-selection-strategy.js.map +1 -0
  27. package/dist/server/lib/tool-selection-strategy.test.d.ts +2 -0
  28. package/dist/server/lib/tool-selection-strategy.test.d.ts.map +1 -0
  29. package/dist/server/lib/tool-selection-strategy.test.js +407 -0
  30. package/dist/server/lib/tool-selection-strategy.test.js.map +1 -0
  31. package/dist/server/mcp-proxy.d.ts +5 -0
  32. package/dist/server/mcp-proxy.d.ts.map +1 -0
  33. package/dist/server/mcp-proxy.js +66 -0
  34. package/dist/server/mcp-proxy.js.map +1 -0
  35. package/dist/server/mcp-server.d.ts +8 -0
  36. package/dist/server/mcp-server.d.ts.map +1 -0
  37. package/dist/server/mcp-server.js +219 -0
  38. package/dist/server/mcp-server.js.map +1 -0
  39. package/dist/server/sse.d.ts +3 -0
  40. package/dist/server/sse.d.ts.map +1 -0
  41. package/dist/server/sse.js +47 -0
  42. package/dist/server/sse.js.map +1 -0
  43. package/dist/server/stdio.d.ts +3 -0
  44. package/dist/server/stdio.d.ts.map +1 -0
  45. package/dist/server/stdio.js +49 -0
  46. package/dist/server/stdio.js.map +1 -0
  47. package/dist/server/streamableHttp.d.ts +3 -0
  48. package/dist/server/streamableHttp.d.ts.map +1 -0
  49. package/dist/server/streamableHttp.js +53 -0
  50. package/dist/server/streamableHttp.js.map +1 -0
  51. package/dist/server/transport/base-transport.d.ts +132 -0
  52. package/dist/server/transport/base-transport.d.ts.map +1 -0
  53. package/dist/server/transport/base-transport.js +390 -0
  54. package/dist/server/transport/base-transport.js.map +1 -0
  55. package/dist/server/transport/json-rpc-errors.d.ts +36 -0
  56. package/dist/server/transport/json-rpc-errors.d.ts.map +1 -0
  57. package/dist/server/transport/json-rpc-errors.js +53 -0
  58. package/dist/server/transport/json-rpc-errors.js.map +1 -0
  59. package/dist/server/transport/sse-transport.d.ts +17 -0
  60. package/dist/server/transport/sse-transport.d.ts.map +1 -0
  61. package/dist/server/transport/sse-transport.js +170 -0
  62. package/dist/server/transport/sse-transport.js.map +1 -0
  63. package/dist/server/transport/stateless-http-transport.d.ts +11 -0
  64. package/dist/server/transport/stateless-http-transport.d.ts.map +1 -0
  65. package/dist/server/transport/stateless-http-transport.js +172 -0
  66. package/dist/server/transport/stateless-http-transport.js.map +1 -0
  67. package/dist/server/transport/stateless-http-transport.test.d.ts +2 -0
  68. package/dist/server/transport/stateless-http-transport.test.d.ts.map +1 -0
  69. package/dist/server/transport/stateless-http-transport.test.js +58 -0
  70. package/dist/server/transport/stateless-http-transport.test.js.map +1 -0
  71. package/dist/server/transport/stdio-transport.d.ts +12 -0
  72. package/dist/server/transport/stdio-transport.d.ts.map +1 -0
  73. package/dist/server/transport/stdio-transport.js +78 -0
  74. package/dist/server/transport/stdio-transport.js.map +1 -0
  75. package/dist/server/transport/streamable-http-transport.d.ts +21 -0
  76. package/dist/server/transport/streamable-http-transport.d.ts.map +1 -0
  77. package/dist/server/transport/streamable-http-transport.js +220 -0
  78. package/dist/server/transport/streamable-http-transport.js.map +1 -0
  79. package/dist/server/transport/transport-factory.d.ts +5 -0
  80. package/dist/server/transport/transport-factory.d.ts.map +1 -0
  81. package/dist/server/transport/transport-factory.js +21 -0
  82. package/dist/server/transport/transport-factory.js.map +1 -0
  83. package/dist/server/utils/api-metrics.d.ts +15 -0
  84. package/dist/server/utils/api-metrics.d.ts.map +1 -0
  85. package/dist/server/utils/api-metrics.js +39 -0
  86. package/dist/server/utils/api-metrics.js.map +1 -0
  87. package/dist/server/utils/auth-utils.d.ts +6 -0
  88. package/dist/server/utils/auth-utils.d.ts.map +1 -0
  89. package/dist/server/utils/auth-utils.js +25 -0
  90. package/dist/server/utils/auth-utils.js.map +1 -0
  91. package/dist/server/utils/browser-detection.d.ts +2 -0
  92. package/dist/server/utils/browser-detection.d.ts.map +1 -0
  93. package/dist/server/utils/browser-detection.js +15 -0
  94. package/dist/server/utils/browser-detection.js.map +1 -0
  95. package/dist/server/utils/browser-detection.test.d.ts +2 -0
  96. package/dist/server/utils/browser-detection.test.d.ts.map +1 -0
  97. package/dist/server/utils/browser-detection.test.js +50 -0
  98. package/dist/server/utils/browser-detection.test.js.map +1 -0
  99. package/dist/server/utils/gradio-metrics.d.ts +22 -0
  100. package/dist/server/utils/gradio-metrics.d.ts.map +1 -0
  101. package/dist/server/utils/gradio-metrics.js +60 -0
  102. package/dist/server/utils/gradio-metrics.js.map +1 -0
  103. package/dist/server/utils/query-params.d.ts +3 -0
  104. package/dist/server/utils/query-params.d.ts.map +1 -0
  105. package/dist/server/utils/query-params.js +17 -0
  106. package/dist/server/utils/query-params.js.map +1 -0
  107. package/dist/server/utils/query-params.test.d.ts +2 -0
  108. package/dist/server/utils/query-params.test.d.ts.map +1 -0
  109. package/dist/server/utils/query-params.test.js +75 -0
  110. package/dist/server/utils/query-params.test.js.map +1 -0
  111. package/dist/server/web-server.d.ts +29 -0
  112. package/dist/server/web-server.d.ts.map +1 -0
  113. package/dist/server/web-server.js +273 -0
  114. package/dist/server/web-server.js.map +1 -0
  115. package/dist/shared/constants.d.ts +5 -0
  116. package/dist/shared/constants.d.ts.map +1 -0
  117. package/dist/shared/constants.js +4 -0
  118. package/dist/shared/constants.js.map +1 -0
  119. package/dist/shared/settings.d.ts +19 -0
  120. package/dist/shared/settings.d.ts.map +1 -0
  121. package/dist/shared/settings.js +47 -0
  122. package/dist/shared/settings.js.map +1 -0
  123. package/dist/shared/transport-info.d.ts +18 -0
  124. package/dist/shared/transport-info.d.ts.map +1 -0
  125. package/dist/shared/transport-info.js +22 -0
  126. package/dist/shared/transport-info.js.map +1 -0
  127. package/dist/shared/transport-info.test.d.ts +2 -0
  128. package/dist/shared/transport-info.test.d.ts.map +1 -0
  129. package/dist/shared/transport-info.test.js +90 -0
  130. package/dist/shared/transport-info.test.js.map +1 -0
  131. package/dist/shared/transport-metrics.d.ts +180 -0
  132. package/dist/shared/transport-metrics.d.ts.map +1 -0
  133. package/dist/shared/transport-metrics.js +247 -0
  134. package/dist/shared/transport-metrics.js.map +1 -0
  135. package/dist/shared/transport-metrics.test.d.ts +2 -0
  136. package/dist/shared/transport-metrics.test.d.ts.map +1 -0
  137. package/dist/shared/transport-metrics.test.js +10 -0
  138. package/dist/shared/transport-metrics.test.js.map +1 -0
  139. package/dist/web/assets/button-C4Q2P8Ns.css +1 -0
  140. package/dist/web/assets/button-DOWMQOme.js +79 -0
  141. package/dist/web/assets/hf-logo-DbjPOSLw.svg +21 -0
  142. package/dist/web/assets/main-CB77vUha.js +115 -0
  143. package/dist/web/assets/mcpWelcome-Cpw1-KJi.js +1 -0
  144. package/dist/web/hf-logo-DbjPOSLw.svg +21 -0
  145. package/dist/web/index.html +15 -0
  146. package/dist/web/mcp-welcome.html +92 -0
  147. package/package.json +100 -0
@@ -0,0 +1,313 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { parseSchemaResponse, convertJsonSchemaToZod } from './gradio-endpoint-connector.js';
3
+ import { z } from 'zod';
4
+ describe('parseSchemaResponse', () => {
5
+ const endpointId = 'endpoint1';
6
+ const subdomain = 'test-subdomain';
7
+ describe('object format schema', () => {
8
+ it('should parse object format schema and select the only tool', () => {
9
+ const schemaOne = {
10
+ evalstate_shuttle_jaguarinfer: {
11
+ type: 'object',
12
+ properties: {
13
+ prompt: {
14
+ type: 'string',
15
+ },
16
+ seed: {
17
+ type: 'number',
18
+ description: 'numeric value between 0 and 2147483647',
19
+ },
20
+ randomize_seed: {
21
+ type: 'boolean',
22
+ },
23
+ width: {
24
+ type: 'number',
25
+ description: 'numeric value between 256 and 2048',
26
+ },
27
+ height: {
28
+ type: 'number',
29
+ description: 'numeric value between 256 and 2048',
30
+ },
31
+ num_inference_steps: {
32
+ type: 'number',
33
+ description: 'numeric value between 1 and 50',
34
+ },
35
+ },
36
+ description: '',
37
+ },
38
+ };
39
+ const result = parseSchemaResponse(schemaOne, endpointId, subdomain);
40
+ expect(result).toBeDefined();
41
+ expect(result.name).toBe('evalstate_shuttle_jaguarinfer');
42
+ expect(result.description).toBe('');
43
+ expect(result.inputSchema).toEqual({
44
+ type: 'object',
45
+ properties: {
46
+ prompt: {
47
+ type: 'string',
48
+ },
49
+ seed: {
50
+ type: 'number',
51
+ description: 'numeric value between 0 and 2147483647',
52
+ },
53
+ randomize_seed: {
54
+ type: 'boolean',
55
+ },
56
+ width: {
57
+ type: 'number',
58
+ description: 'numeric value between 256 and 2048',
59
+ },
60
+ height: {
61
+ type: 'number',
62
+ description: 'numeric value between 256 and 2048',
63
+ },
64
+ num_inference_steps: {
65
+ type: 'number',
66
+ description: 'numeric value between 1 and 50',
67
+ },
68
+ },
69
+ description: '',
70
+ });
71
+ });
72
+ it('should select tool with "infer" in the name when multiple tools exist', () => {
73
+ const schema = {
74
+ some_other_tool: {
75
+ type: 'object',
76
+ properties: { test: { type: 'string' } },
77
+ },
78
+ evalstate_shuttle_jaguarinfer: {
79
+ type: 'object',
80
+ properties: { prompt: { type: 'string' } },
81
+ },
82
+ another_tool: {
83
+ type: 'object',
84
+ properties: { data: { type: 'string' } },
85
+ },
86
+ };
87
+ const result = parseSchemaResponse(schema, endpointId, subdomain);
88
+ expect(result.name).toBe('evalstate_shuttle_jaguarinfer');
89
+ });
90
+ it('should select last tool when no "infer" tool exists', () => {
91
+ const schema = {
92
+ first_tool: {
93
+ type: 'object',
94
+ properties: { test: { type: 'string' } },
95
+ },
96
+ last_tool: {
97
+ type: 'object',
98
+ properties: { data: { type: 'string' } },
99
+ },
100
+ };
101
+ const result = parseSchemaResponse(schema, endpointId, subdomain);
102
+ expect(result.name).toBe('last_tool');
103
+ });
104
+ });
105
+ describe('array format schema', () => {
106
+ it('should parse array format schema and select the only tool', () => {
107
+ const schemaTwo = [
108
+ {
109
+ name: 'OmniParser_v2_process',
110
+ description: '',
111
+ inputSchema: {
112
+ type: 'object',
113
+ properties: {
114
+ image_input: {
115
+ title: 'ImageData',
116
+ type: 'string',
117
+ format: 'a http or https url to a file',
118
+ },
119
+ box_threshold: {
120
+ type: 'number',
121
+ description: 'numeric value between 0.01 and 1.0',
122
+ default: 0.05,
123
+ },
124
+ iou_threshold: {
125
+ type: 'number',
126
+ description: 'numeric value between 0.01 and 1.0',
127
+ default: 0.1,
128
+ },
129
+ use_paddleocr: {
130
+ type: 'boolean',
131
+ default: true,
132
+ },
133
+ imgsz: {
134
+ type: 'number',
135
+ description: 'numeric value between 640 and 1920',
136
+ default: 640,
137
+ },
138
+ },
139
+ },
140
+ },
141
+ ];
142
+ const result = parseSchemaResponse(schemaTwo, endpointId, subdomain);
143
+ expect(result).toBeDefined();
144
+ expect(result.name).toBe('OmniParser_v2_process');
145
+ expect(result.description).toBe('');
146
+ expect(result.inputSchema).toEqual({
147
+ type: 'object',
148
+ properties: {
149
+ image_input: {
150
+ title: 'ImageData',
151
+ type: 'string',
152
+ format: 'a http or https url to a file',
153
+ },
154
+ box_threshold: {
155
+ type: 'number',
156
+ description: 'numeric value between 0.01 and 1.0',
157
+ default: 0.05,
158
+ },
159
+ iou_threshold: {
160
+ type: 'number',
161
+ description: 'numeric value between 0.01 and 1.0',
162
+ default: 0.1,
163
+ },
164
+ use_paddleocr: {
165
+ type: 'boolean',
166
+ default: true,
167
+ },
168
+ imgsz: {
169
+ type: 'number',
170
+ description: 'numeric value between 640 and 1920',
171
+ default: 640,
172
+ },
173
+ },
174
+ });
175
+ });
176
+ it('should filter out invalid tools in array format', () => {
177
+ const schema = [
178
+ { name: 'valid_tool', inputSchema: { type: 'object' } },
179
+ { name: 'missing_schema' },
180
+ { inputSchema: { type: 'object' } },
181
+ { name: 123, inputSchema: { type: 'object' } },
182
+ null,
183
+ { name: 'another_valid_tool', inputSchema: { type: 'object' } },
184
+ ];
185
+ const result = parseSchemaResponse(schema, endpointId, subdomain);
186
+ expect(result.name).toBe('another_valid_tool');
187
+ });
188
+ it('should select tool with "infer" in array format', () => {
189
+ const schema = [
190
+ { name: 'first_tool', inputSchema: { type: 'object' } },
191
+ { name: 'infer_tool', inputSchema: { type: 'object' } },
192
+ { name: 'last_tool', inputSchema: { type: 'object' } },
193
+ ];
194
+ const result = parseSchemaResponse(schema, endpointId, subdomain);
195
+ expect(result.name).toBe('infer_tool');
196
+ });
197
+ });
198
+ describe('error handling', () => {
199
+ it('should throw error for invalid schema format', () => {
200
+ expect(() => parseSchemaResponse('string', endpointId, subdomain)).toThrow('Invalid schema format: expected array or object');
201
+ expect(() => parseSchemaResponse(123, endpointId, subdomain)).toThrow('Invalid schema format: expected array or object');
202
+ expect(() => parseSchemaResponse(null, endpointId, subdomain)).toThrow('Invalid schema format: expected array or object');
203
+ });
204
+ it('should throw error when no tools found in object format', () => {
205
+ expect(() => parseSchemaResponse({}, endpointId, subdomain)).toThrow('No tools found in schema');
206
+ });
207
+ it('should throw error when no valid tools found in array format', () => {
208
+ const invalidSchema = [{ name: 'missing_schema' }, { inputSchema: { type: 'object' } }, null];
209
+ expect(() => parseSchemaResponse(invalidSchema, endpointId, subdomain)).toThrow('No tools found in schema');
210
+ });
211
+ });
212
+ });
213
+ describe('convertJsonSchemaToZod', () => {
214
+ it('should convert string type with file format', () => {
215
+ const jsonSchema = {
216
+ title: 'ImageData',
217
+ type: 'string',
218
+ format: 'a http or https url to a file',
219
+ };
220
+ const zodSchema = convertJsonSchemaToZod(jsonSchema);
221
+ expect(zodSchema instanceof z.ZodString).toBe(true);
222
+ expect(zodSchema._def.description).toBe('File input: provide URL or file path');
223
+ expect(zodSchema.parse('https://example.com/image.jpg')).toBe('https://example.com/image.jpg');
224
+ expect(zodSchema.parse('/path/to/file.png')).toBe('/path/to/file.png');
225
+ });
226
+ it('should convert number type with default', () => {
227
+ const jsonSchema = {
228
+ type: 'number',
229
+ description: 'numeric value between 0.01 and 1.0',
230
+ default: 0.05,
231
+ };
232
+ const zodSchema = convertJsonSchemaToZod(jsonSchema);
233
+ expect(zodSchema instanceof z.ZodDefault).toBe(true);
234
+ expect(zodSchema._def.defaultValue()).toBe(0.05);
235
+ expect(zodSchema._def.innerType._def.description).toBe('numeric value between 0.01 and 1.0');
236
+ });
237
+ it('should convert boolean type with default', () => {
238
+ const jsonSchema = {
239
+ type: 'boolean',
240
+ default: true,
241
+ };
242
+ const zodSchema = convertJsonSchemaToZod(jsonSchema);
243
+ expect(zodSchema instanceof z.ZodDefault).toBe(true);
244
+ expect(zodSchema._def.defaultValue()).toBe(true);
245
+ });
246
+ it('should skip default when skipDefault is true', () => {
247
+ const jsonSchema = {
248
+ type: 'number',
249
+ default: 100,
250
+ };
251
+ const zodSchema = convertJsonSchemaToZod(jsonSchema, true);
252
+ expect(zodSchema instanceof z.ZodNumber).toBe(true);
253
+ expect(zodSchema instanceof z.ZodDefault).toBe(false);
254
+ });
255
+ it('should handle FileData objects', () => {
256
+ const jsonSchema = {
257
+ title: 'FileData',
258
+ type: 'string',
259
+ default: {
260
+ path: '/tmp/file.jpg',
261
+ url: 'https://example.com/file.jpg',
262
+ size: 1024,
263
+ orig_name: 'file.jpg',
264
+ mime_type: 'image/jpeg',
265
+ },
266
+ };
267
+ const zodSchema = convertJsonSchemaToZod(jsonSchema);
268
+ expect(zodSchema instanceof z.ZodDefault).toBe(true);
269
+ const innerSchema = zodSchema._def.innerType;
270
+ expect(innerSchema instanceof z.ZodObject).toBe(true);
271
+ const fileData = {
272
+ path: '/some/path.png',
273
+ url: 'https://example.com/path.png',
274
+ };
275
+ expect(zodSchema.parse(fileData)).toMatchObject(fileData);
276
+ expect(zodSchema.parse(undefined)).toMatchObject({
277
+ path: '/tmp/file.jpg',
278
+ url: 'https://example.com/file.jpg',
279
+ size: 1024,
280
+ orig_name: 'file.jpg',
281
+ mime_type: 'image/jpeg',
282
+ });
283
+ });
284
+ it('should extract URL from object default for non-FileData strings', () => {
285
+ const jsonSchema = {
286
+ type: 'string',
287
+ default: {
288
+ url: 'https://example.com/default.jpg',
289
+ other: 'data',
290
+ },
291
+ };
292
+ const zodSchema = convertJsonSchemaToZod(jsonSchema);
293
+ expect(zodSchema instanceof z.ZodDefault).toBe(true);
294
+ expect(zodSchema._def.defaultValue()).toBe('https://example.com/default.jpg');
295
+ });
296
+ it('should handle array and object types', () => {
297
+ const arraySchema = { type: 'array' };
298
+ const objectSchema = { type: 'object' };
299
+ const zodArray = convertJsonSchemaToZod(arraySchema);
300
+ const zodObject = convertJsonSchemaToZod(objectSchema);
301
+ expect(zodArray instanceof z.ZodArray).toBe(true);
302
+ expect(zodObject instanceof z.ZodObject).toBe(true);
303
+ });
304
+ it('should handle unknown types as any', () => {
305
+ const unknownSchema = { type: 'unknown' };
306
+ const noTypeSchema = {};
307
+ const zodUnknown = convertJsonSchemaToZod(unknownSchema);
308
+ const zodNoType = convertJsonSchemaToZod(noTypeSchema);
309
+ expect(zodUnknown instanceof z.ZodAny).toBe(true);
310
+ expect(zodNoType instanceof z.ZodAny).toBe(true);
311
+ });
312
+ });
313
+ //# sourceMappingURL=gradio-endpoint-connector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradio-endpoint-connector.test.js","sourceRoot":"","sources":["../../src/server/gradio-endpoint-connector.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type Logger } from 'pino';
2
+ declare let logger: Logger;
3
+ export declare function forceLoggerToStderr(): void;
4
+ export { logger };
5
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/server/lib/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AASzC,QAAA,IAAI,MAAM,EAAE,MAAM,CAAC;AA0BnB,wBAAgB,mBAAmB,IAAI,IAAI,CAqB1C;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { pino } from 'pino';
2
+ const isDev = process.env.NODE_ENV === 'development';
3
+ const activeTransport = process.env.TRANSPORT || '';
4
+ const destination = activeTransport.toUpperCase() === 'STDIO' ? 2 : 1;
5
+ let logger;
6
+ if (isDev) {
7
+ const options = {
8
+ level: process.env.LOG_LEVEL || 'info',
9
+ transport: {
10
+ target: 'pino-pretty',
11
+ options: {
12
+ colorize: true,
13
+ destination,
14
+ },
15
+ },
16
+ };
17
+ logger = pino(options);
18
+ }
19
+ else {
20
+ logger = pino({
21
+ level: process.env.LOG_LEVEL || 'info',
22
+ }, pino.destination(destination));
23
+ }
24
+ export function forceLoggerToStderr() {
25
+ const isDev = process.env.NODE_ENV === 'development';
26
+ const level = process.env.LOG_LEVEL || 'info';
27
+ if (isDev) {
28
+ const options = {
29
+ level,
30
+ transport: {
31
+ target: 'pino-pretty',
32
+ options: {
33
+ colorize: true,
34
+ destination: 2,
35
+ },
36
+ },
37
+ };
38
+ Object.assign(logger, pino(options));
39
+ }
40
+ else {
41
+ Object.assign(logger, pino({ level }, pino.destination(2)));
42
+ }
43
+ }
44
+ export { logger };
45
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/server/lib/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,MAAM,CAAC;AAGzC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC;AACrD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;AAGpD,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEtE,IAAI,MAAc,CAAC;AAEnB,IAAI,KAAK,EAAE,CAAC;IAEX,MAAM,OAAO,GAAkB;QAC9B,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;QACtC,SAAS,EAAE;YACV,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACR,QAAQ,EAAE,IAAI;gBACd,WAAW;aACX;SACD;KACD,CAAC;IACF,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC;KAAM,CAAC;IAEP,MAAM,GAAG,IAAI,CACZ;QACC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;KACtC,EACD,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAC7B,CAAC;AACH,CAAC;AAGD,MAAM,UAAU,mBAAmB;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;IAE9C,IAAI,KAAK,EAAE,CAAC;QAEX,MAAM,OAAO,GAAkB;YAC9B,KAAK;YACL,SAAS,EAAE;gBACV,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE;oBACR,QAAQ,EAAE,IAAI;oBACd,WAAW,EAAE,CAAC;iBACd;aACD;SACD,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QAEP,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;AACF,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { AppSettings } from '../../shared/settings.js';
3
+ import type { TransportInfo } from '../../shared/transport-info.js';
4
+ export interface ToolStateChangeCallback {
5
+ (toolId: string, enabled: boolean): void;
6
+ }
7
+ export interface GradioEndpoint {
8
+ name: string;
9
+ subdomain: string;
10
+ id?: string;
11
+ emoji?: string;
12
+ isPrivate?: boolean;
13
+ }
14
+ export interface ApiClientConfig {
15
+ type: 'polling' | 'external';
16
+ baseUrl?: string;
17
+ pollInterval?: number;
18
+ externalUrl?: string;
19
+ userConfigUrl?: string;
20
+ hfToken?: string;
21
+ staticGradioEndpoints?: GradioEndpoint[];
22
+ }
23
+ export declare class McpApiClient extends EventEmitter {
24
+ private config;
25
+ private pollTimer;
26
+ private cache;
27
+ private gradioEndpoints;
28
+ private gradioEndpointStates;
29
+ private isPolling;
30
+ private transportInfo;
31
+ constructor(config: ApiClientConfig, transportInfo?: TransportInfo);
32
+ getTransportInfo(): TransportInfo | null;
33
+ getSettings(overrideToken?: string): Promise<AppSettings>;
34
+ getToolStates(overrideToken?: string): Promise<Record<string, boolean> | null>;
35
+ getGradioEndpoints(): GradioEndpoint[];
36
+ updateGradioEndpointState(index: number, enabled: boolean): void;
37
+ updateGradioEndpoint(index: number, endpoint: GradioEndpoint): void;
38
+ startPolling(onUpdate: ToolStateChangeCallback): Promise<void>;
39
+ stopPolling(): void;
40
+ destroy(): void;
41
+ }
42
+ //# sourceMappingURL=mcp-api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-api-client.d.ts","sourceRoot":"","sources":["../../../src/server/lib/mcp-api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAIpE,MAAM,WAAW,uBAAuB;IACvC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB,CAAC,EAAE,cAAc,EAAE,CAAC;CACzC;AAED,qBAAa,YAAa,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,oBAAoB,CAAmC;IAC/D,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAA8B;gBAEvC,MAAM,EAAE,eAAe,EAAE,aAAa,CAAC,EAAE,aAAa;IAWlE,gBAAgB,IAAI,aAAa,GAAG,IAAI;IAIlC,WAAW,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAgFzD,aAAa,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IA0BpF,kBAAkB,IAAI,cAAc,EAAE;IAItC,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAUhE,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAO7D,YAAY,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+DpE,WAAW,IAAI,IAAI;IASnB,OAAO,IAAI,IAAI;CAIf"}
@@ -0,0 +1,188 @@
1
+ import { EventEmitter } from 'events';
2
+ import { logger } from './logger.js';
3
+ import { BOUQUET_FALLBACK } from '../mcp-server.js';
4
+ import { ALL_BUILTIN_TOOL_IDS } from '@llmindset/hf-mcp';
5
+ import { apiMetrics } from '../utils/api-metrics.js';
6
+ export class McpApiClient extends EventEmitter {
7
+ config;
8
+ pollTimer = null;
9
+ cache = new Map();
10
+ gradioEndpoints = [];
11
+ gradioEndpointStates = new Map();
12
+ isPolling = false;
13
+ transportInfo = null;
14
+ constructor(config, transportInfo) {
15
+ super();
16
+ this.config = config;
17
+ this.transportInfo = transportInfo || null;
18
+ if (config.staticGradioEndpoints) {
19
+ this.gradioEndpoints = [...config.staticGradioEndpoints];
20
+ }
21
+ }
22
+ getTransportInfo() {
23
+ return this.transportInfo;
24
+ }
25
+ async getSettings(overrideToken) {
26
+ switch (this.config.type) {
27
+ case 'polling':
28
+ if (!this.config.baseUrl) {
29
+ logger.error('baseUrl required for polling mode');
30
+ return BOUQUET_FALLBACK;
31
+ }
32
+ try {
33
+ const response = await fetch(`${this.config.baseUrl}/api/settings`);
34
+ if (!response.ok) {
35
+ logger.error(`Failed to fetch settings: ${response.status.toString()} ${response.statusText}`);
36
+ return BOUQUET_FALLBACK;
37
+ }
38
+ return (await response.json());
39
+ }
40
+ catch (error) {
41
+ logger.error({ error }, 'Error fetching settings from local API');
42
+ return BOUQUET_FALLBACK;
43
+ }
44
+ case 'external':
45
+ if (!this.config.externalUrl) {
46
+ logger.error('externalUrl required for external mode');
47
+ return BOUQUET_FALLBACK;
48
+ }
49
+ try {
50
+ const token = overrideToken || this.config.hfToken;
51
+ if (!token || token.trim() === '') {
52
+ apiMetrics.recordCall(false, 200);
53
+ logger.debug('No HF token available for external config API - using fallback');
54
+ return BOUQUET_FALLBACK;
55
+ }
56
+ const headers = {};
57
+ const hasToken = true;
58
+ headers['Authorization'] = `Bearer ${token}`;
59
+ headers['accept'] = 'application/json';
60
+ headers['cache-control'] = 'no-cache';
61
+ const controller = new AbortController();
62
+ const apiTimeout = process.env.HF_API_TIMEOUT ? parseInt(process.env.HF_API_TIMEOUT, 10) : 12500;
63
+ const timeoutId = setTimeout(() => controller.abort(), apiTimeout);
64
+ logger.debug(`Fetching external settings from ${this.config.externalUrl} with timeout ${apiTimeout}ms`);
65
+ const response = await fetch(this.config.externalUrl, {
66
+ headers,
67
+ signal: controller.signal,
68
+ });
69
+ clearTimeout(timeoutId);
70
+ if (!response.ok) {
71
+ apiMetrics.recordCall(hasToken, response.status);
72
+ if (response.status === 401 || response.status === 403) {
73
+ logger.debug(`External config API ${response.status} ${response.statusText}: ${this.config.externalUrl}`);
74
+ }
75
+ logger.debug(`Failed to fetch external settings: ${response.status.toString()} ${response.statusText} - using fallback bouquet`);
76
+ return BOUQUET_FALLBACK;
77
+ }
78
+ apiMetrics.recordCall(hasToken, response.status);
79
+ return (await response.json());
80
+ }
81
+ catch (error) {
82
+ logger.warn({ error }, 'Error fetching settings from external API - defaulting to fallback bouquet');
83
+ return BOUQUET_FALLBACK;
84
+ }
85
+ default:
86
+ logger.error(`Unknown API client type: ${String(this.config.type)}`);
87
+ return BOUQUET_FALLBACK;
88
+ }
89
+ }
90
+ async getToolStates(overrideToken) {
91
+ const settings = await this.getSettings(overrideToken);
92
+ if (!settings) {
93
+ return null;
94
+ }
95
+ logger.trace({ settings: settings }, 'Fetched tool settings from API');
96
+ if (settings.spaceTools && settings.spaceTools.length > 0) {
97
+ this.gradioEndpoints = settings.spaceTools.map((spaceTool) => ({
98
+ name: spaceTool.name,
99
+ subdomain: spaceTool.subdomain,
100
+ id: spaceTool._id,
101
+ emoji: spaceTool.emoji,
102
+ }));
103
+ logger.trace({ gradioEndpoints: this.gradioEndpoints }, 'Updated gradio endpoints from external API');
104
+ }
105
+ const toolStates = {};
106
+ for (const toolId of ALL_BUILTIN_TOOL_IDS) {
107
+ toolStates[toolId] = settings.builtInTools.includes(toolId);
108
+ }
109
+ return toolStates;
110
+ }
111
+ getGradioEndpoints() {
112
+ return this.gradioEndpoints;
113
+ }
114
+ updateGradioEndpointState(index, enabled) {
115
+ if (index >= 0 && index < this.gradioEndpoints.length) {
116
+ this.gradioEndpointStates.set(index, enabled);
117
+ const endpoint = this.gradioEndpoints[index];
118
+ if (endpoint) {
119
+ logger.info(`Gradio endpoint ${(index + 1).toString()} set to ${enabled ? 'enabled' : 'disabled'}`);
120
+ }
121
+ }
122
+ }
123
+ updateGradioEndpoint(index, endpoint) {
124
+ if (index >= 0 && index < this.gradioEndpoints.length) {
125
+ this.gradioEndpoints[index] = endpoint;
126
+ logger.info(`Gradio endpoint ${(index + 1).toString()} updated to ${endpoint.name}`);
127
+ }
128
+ }
129
+ async startPolling(onUpdate) {
130
+ if (this.isPolling) {
131
+ logger.warn('Polling already started');
132
+ return;
133
+ }
134
+ this.isPolling = true;
135
+ if (this.config.type === 'external') {
136
+ logger.debug('Using external user config API - no startup fetching, will fetch on first user request');
137
+ return;
138
+ }
139
+ const pollInterval = this.config.pollInterval || 5000;
140
+ logger.info(`Starting API polling with interval ${pollInterval.toString()}ms`);
141
+ const initialStates = await this.getToolStates();
142
+ if (initialStates) {
143
+ for (const [toolId, enabled] of Object.entries(initialStates)) {
144
+ this.cache.set(toolId, enabled);
145
+ onUpdate(toolId, enabled);
146
+ }
147
+ }
148
+ this.pollTimer = setInterval(() => {
149
+ void (async () => {
150
+ const states = await this.getToolStates();
151
+ if (!states) {
152
+ logger.warn('Failed to fetch tool states during polling');
153
+ return;
154
+ }
155
+ for (const [toolId, enabled] of Object.entries(states)) {
156
+ const cachedState = this.cache.get(toolId);
157
+ if (cachedState !== enabled) {
158
+ logger.info(`Tool ${toolId} state changed: ${String(cachedState)} -> ${String(enabled)}`);
159
+ this.cache.set(toolId, enabled);
160
+ onUpdate(toolId, enabled);
161
+ if (this.config.type === 'external') {
162
+ this.emit('toolStateChange', toolId, enabled);
163
+ }
164
+ }
165
+ }
166
+ for (const [toolId, _] of this.cache) {
167
+ if (!(toolId in states)) {
168
+ logger.info(`Tool ${toolId} removed from settings`);
169
+ this.cache.delete(toolId);
170
+ }
171
+ }
172
+ })();
173
+ }, pollInterval);
174
+ }
175
+ stopPolling() {
176
+ if (this.pollTimer) {
177
+ clearInterval(this.pollTimer);
178
+ this.pollTimer = null;
179
+ this.isPolling = false;
180
+ logger.info('Stopped API polling');
181
+ }
182
+ }
183
+ destroy() {
184
+ this.stopPolling();
185
+ this.cache.clear();
186
+ }
187
+ }
188
+ //# sourceMappingURL=mcp-api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-api-client.js","sourceRoot":"","sources":["../../../src/server/lib/mcp-api-client.ts"],"names":[],"mappings":"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"}