@llmindset/hf-mcp-server 0.2.46 → 0.2.47

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.
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"AAgEA,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,+BAA+B,CAAC;AACxF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAS9E,eAAO,MAAM,gBAAgB,EAAE,WAG9B,CAAC;AAGF,eAAO,MAAM,oBAAoB,EAAE,WAGlC,CAAC;AAQF,eAAO,MAAM,mBAAmB,GAAI,oBAAoB,SAAS,EAAE,iBAAiB,YAAY,KAAG,aAgyBlG,CAAC"}
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"AAiEA,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,+BAA+B,CAAC;AACxF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQjD,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAS9E,eAAO,MAAM,gBAAgB,EAAE,WAG9B,CAAC;AAGF,eAAO,MAAM,oBAAoB,EAAE,WAGlC,CAAC;AAQF,eAAO,MAAM,mBAAmB,GAAI,oBAAoB,SAAS,EAAE,iBAAiB,YAAY,KAAG,aAi7BlG,CAAC"}
@@ -1,9 +1,10 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { createRequire } from 'module';
3
+ import { performance } from 'node:perf_hooks';
3
4
  import { whoAmI } from '@huggingface/hub';
4
5
  import { SpaceSearchTool, formatSearchResults, SEMANTIC_SEARCH_TOOL_CONFIG, ModelSearchTool, MODEL_SEARCH_TOOL_CONFIG, ModelDetailTool, MODEL_DETAIL_TOOL_CONFIG, MODEL_DETAIL_PROMPT_CONFIG, PaperSearchTool, PAPER_SEARCH_TOOL_CONFIG, DatasetSearchTool, DATASET_SEARCH_TOOL_CONFIG, DatasetDetailTool, DATASET_DETAIL_TOOL_CONFIG, DATASET_DETAIL_PROMPT_CONFIG, HUB_INSPECT_TOOL_CONFIG, HubInspectTool, DuplicateSpaceTool, formatDuplicateResult, SpaceInfoTool, formatSpaceInfoResult, SpaceFilesTool, UseSpaceTool, USE_SPACE_TOOL_CONFIG, formatUseSpaceResult, UserSummaryPrompt, USER_SUMMARY_PROMPT_CONFIG, PaperSummaryPrompt, PAPER_SUMMARY_PROMPT_CONFIG, CONFIG_GUIDANCE, TOOL_ID_GROUPS, DOCS_SEMANTIC_SEARCH_CONFIG, DocSearchTool, DOC_FETCH_CONFIG, DocFetchTool, HF_JOBS_TOOL_CONFIG, HfJobsTool, DYNAMIC_SPACE_TOOL_CONFIG, SpaceTool, } from '@llmindset/hf-mcp';
5
6
  import { logger } from './utils/logger.js';
6
- import { logSearchQuery, logPromptQuery, logGradioEvent } from './utils/query-logger.js';
7
+ import { logSearchQuery, logPromptQuery, logGradioEvent, } from './utils/query-logger.js';
7
8
  import { DEFAULT_SPACE_TOOLS } from '../shared/settings.js';
8
9
  import { extractAuthBouquetAndMix } from './utils/auth-utils.js';
9
10
  import { ToolSelectionStrategy } from './utils/tool-selection-strategy.js';
@@ -51,6 +52,31 @@ export const createServerFactory = (_webServerInstance, sharedApiClient) => {
51
52
  logger.debug({ sessionInfo, options }, 'Query logging options:');
52
53
  return options;
53
54
  };
55
+ const runWithQueryLogging = async (logFn, config, work) => {
56
+ const start = performance.now();
57
+ try {
58
+ const result = await work();
59
+ const durationMs = performance.now() - start;
60
+ const successOptions = config.successOptions?.(result) ?? {};
61
+ logFn(config.methodName, config.query, config.parameters, {
62
+ ...config.baseOptions,
63
+ ...successOptions,
64
+ durationMs,
65
+ success: true,
66
+ });
67
+ return result;
68
+ }
69
+ catch (error) {
70
+ const durationMs = performance.now() - start;
71
+ logFn(config.methodName, config.query, config.parameters, {
72
+ ...config.baseOptions,
73
+ durationMs,
74
+ success: false,
75
+ error,
76
+ });
77
+ throw error;
78
+ }
79
+ };
54
80
  const server = new McpServer({
55
81
  name: '@huggingface/mcp-services',
56
82
  version: version,
@@ -91,13 +117,19 @@ export const createServerFactory = (_webServerInstance, sharedApiClient) => {
91
117
  });
92
118
  }
93
119
  server.prompt(USER_SUMMARY_PROMPT_CONFIG.name, USER_SUMMARY_PROMPT_CONFIG.description, USER_SUMMARY_PROMPT_CONFIG.schema.shape, async (params) => {
94
- const userSummary = new UserSummaryPrompt(hfToken);
95
- const summaryText = await userSummary.generateSummary(params);
96
- logPromptQuery(USER_SUMMARY_PROMPT_CONFIG.name, params.user_id, { user_id: params.user_id }, {
97
- ...getLoggingOptions(),
98
- totalResults: 1,
99
- resultsShared: 1,
100
- responseCharCount: summaryText.length,
120
+ const summaryText = await runWithQueryLogging(logPromptQuery, {
121
+ methodName: USER_SUMMARY_PROMPT_CONFIG.name,
122
+ query: params.user_id,
123
+ parameters: { user_id: params.user_id },
124
+ baseOptions: getLoggingOptions(),
125
+ successOptions: (text) => ({
126
+ totalResults: 1,
127
+ resultsShared: 1,
128
+ responseCharCount: text.length,
129
+ }),
130
+ }, async () => {
131
+ const userSummary = new UserSummaryPrompt(hfToken);
132
+ return userSummary.generateSummary(params);
101
133
  });
102
134
  return {
103
135
  description: `User summary for ${params.user_id}`,
@@ -113,13 +145,19 @@ export const createServerFactory = (_webServerInstance, sharedApiClient) => {
113
145
  };
114
146
  });
115
147
  server.prompt(PAPER_SUMMARY_PROMPT_CONFIG.name, PAPER_SUMMARY_PROMPT_CONFIG.description, PAPER_SUMMARY_PROMPT_CONFIG.schema.shape, async (params) => {
116
- const paperSummary = new PaperSummaryPrompt(hfToken);
117
- const summaryText = await paperSummary.generateSummary(params);
118
- logPromptQuery(PAPER_SUMMARY_PROMPT_CONFIG.name, params.paper_id, { paper_id: params.paper_id }, {
119
- ...getLoggingOptions(),
120
- totalResults: 1,
121
- resultsShared: 1,
122
- responseCharCount: summaryText.length,
148
+ const summaryText = await runWithQueryLogging(logPromptQuery, {
149
+ methodName: PAPER_SUMMARY_PROMPT_CONFIG.name,
150
+ query: params.paper_id,
151
+ parameters: { paper_id: params.paper_id },
152
+ baseOptions: getLoggingOptions(),
153
+ successOptions: (text) => ({
154
+ totalResults: 1,
155
+ resultsShared: 1,
156
+ responseCharCount: text.length,
157
+ }),
158
+ }, async () => {
159
+ const paperSummary = new PaperSummaryPrompt(hfToken);
160
+ return paperSummary.generateSummary(params);
123
161
  });
124
162
  return {
125
163
  description: `Paper summary for ${params.paper_id}`,
@@ -135,13 +173,19 @@ export const createServerFactory = (_webServerInstance, sharedApiClient) => {
135
173
  };
136
174
  });
137
175
  server.prompt(MODEL_DETAIL_PROMPT_CONFIG.name, MODEL_DETAIL_PROMPT_CONFIG.description, MODEL_DETAIL_PROMPT_CONFIG.schema.shape, async (params) => {
138
- const modelDetail = new ModelDetailTool(hfToken, undefined);
139
- const result = await modelDetail.getDetails(params.model_id, true);
140
- logPromptQuery(MODEL_DETAIL_PROMPT_CONFIG.name, params.model_id, { model_id: params.model_id }, {
141
- ...getLoggingOptions(),
142
- totalResults: result.totalResults,
143
- resultsShared: result.resultsShared,
144
- responseCharCount: result.formatted.length,
176
+ const result = await runWithQueryLogging(logPromptQuery, {
177
+ methodName: MODEL_DETAIL_PROMPT_CONFIG.name,
178
+ query: params.model_id,
179
+ parameters: { model_id: params.model_id },
180
+ baseOptions: getLoggingOptions(),
181
+ successOptions: (details) => ({
182
+ totalResults: details.totalResults,
183
+ resultsShared: details.resultsShared,
184
+ responseCharCount: details.formatted.length,
185
+ }),
186
+ }, async () => {
187
+ const modelDetail = new ModelDetailTool(hfToken, undefined);
188
+ return modelDetail.getDetails(params.model_id, true);
145
189
  });
146
190
  return {
147
191
  description: `Model details for ${params.model_id}`,
@@ -157,13 +201,19 @@ export const createServerFactory = (_webServerInstance, sharedApiClient) => {
157
201
  };
158
202
  });
159
203
  server.prompt(DATASET_DETAIL_PROMPT_CONFIG.name, DATASET_DETAIL_PROMPT_CONFIG.description, DATASET_DETAIL_PROMPT_CONFIG.schema.shape, async (params) => {
160
- const datasetDetail = new DatasetDetailTool(hfToken, undefined);
161
- const result = await datasetDetail.getDetails(params.dataset_id, true);
162
- logPromptQuery(DATASET_DETAIL_PROMPT_CONFIG.name, params.dataset_id, { dataset_id: params.dataset_id }, {
163
- ...getLoggingOptions(),
164
- totalResults: result.totalResults,
165
- resultsShared: result.resultsShared,
166
- responseCharCount: result.formatted.length,
204
+ const result = await runWithQueryLogging(logPromptQuery, {
205
+ methodName: DATASET_DETAIL_PROMPT_CONFIG.name,
206
+ query: params.dataset_id,
207
+ parameters: { dataset_id: params.dataset_id },
208
+ baseOptions: getLoggingOptions(),
209
+ successOptions: (details) => ({
210
+ totalResults: details.totalResults,
211
+ resultsShared: details.resultsShared,
212
+ responseCharCount: details.formatted.length,
213
+ }),
214
+ }, async () => {
215
+ const datasetDetail = new DatasetDetailTool(hfToken, undefined);
216
+ return datasetDetail.getDetails(params.dataset_id, true);
167
217
  });
168
218
  return {
169
219
  description: `Dataset details for ${params.dataset_id}`,
@@ -179,78 +229,115 @@ export const createServerFactory = (_webServerInstance, sharedApiClient) => {
179
229
  };
180
230
  });
181
231
  toolInstances[SEMANTIC_SEARCH_TOOL_CONFIG.name] = server.tool(SEMANTIC_SEARCH_TOOL_CONFIG.name, SEMANTIC_SEARCH_TOOL_CONFIG.description, SEMANTIC_SEARCH_TOOL_CONFIG.schema.shape, SEMANTIC_SEARCH_TOOL_CONFIG.annotations, async (params) => {
182
- const semanticSearch = new SpaceSearchTool(hfToken);
183
- const searchResult = await semanticSearch.search(params.query, params.limit, params.mcp);
184
- const result = formatSearchResults(params.query, searchResult.results, searchResult.totalCount);
185
- logSearchQuery(SEMANTIC_SEARCH_TOOL_CONFIG.name, params.query, { limit: params.limit, mcp: params.mcp }, {
186
- ...getLoggingOptions(),
187
- totalResults: result.totalResults,
188
- resultsShared: result.resultsShared,
189
- responseCharCount: result.formatted.length,
232
+ const result = await runWithQueryLogging(logSearchQuery, {
233
+ methodName: SEMANTIC_SEARCH_TOOL_CONFIG.name,
234
+ query: params.query,
235
+ parameters: { limit: params.limit, mcp: params.mcp },
236
+ baseOptions: getLoggingOptions(),
237
+ successOptions: (formatted) => ({
238
+ totalResults: formatted.totalResults,
239
+ resultsShared: formatted.resultsShared,
240
+ responseCharCount: formatted.formatted.length,
241
+ }),
242
+ }, async () => {
243
+ const semanticSearch = new SpaceSearchTool(hfToken);
244
+ const searchResult = await semanticSearch.search(params.query, params.limit, params.mcp);
245
+ return formatSearchResults(params.query, searchResult.results, searchResult.totalCount);
190
246
  });
191
247
  return {
192
248
  content: [{ type: 'text', text: result.formatted }],
193
249
  };
194
250
  });
195
251
  toolInstances[MODEL_SEARCH_TOOL_CONFIG.name] = server.tool(MODEL_SEARCH_TOOL_CONFIG.name, MODEL_SEARCH_TOOL_CONFIG.description, MODEL_SEARCH_TOOL_CONFIG.schema.shape, MODEL_SEARCH_TOOL_CONFIG.annotations, async (params) => {
196
- const modelSearch = new ModelSearchTool(hfToken);
197
- const result = await modelSearch.searchWithParams(params);
198
- logSearchQuery(MODEL_SEARCH_TOOL_CONFIG.name, params.query || `sort:${params.sort || 'trendingScore'}`, params, {
199
- ...getLoggingOptions(),
200
- totalResults: result.totalResults,
201
- resultsShared: result.resultsShared,
202
- responseCharCount: result.formatted.length,
252
+ const result = await runWithQueryLogging(logSearchQuery, {
253
+ methodName: MODEL_SEARCH_TOOL_CONFIG.name,
254
+ query: params.query || `sort:${params.sort || 'trendingScore'}`,
255
+ parameters: params,
256
+ baseOptions: getLoggingOptions(),
257
+ successOptions: (formatted) => ({
258
+ totalResults: formatted.totalResults,
259
+ resultsShared: formatted.resultsShared,
260
+ responseCharCount: formatted.formatted.length,
261
+ }),
262
+ }, async () => {
263
+ const modelSearch = new ModelSearchTool(hfToken);
264
+ return modelSearch.searchWithParams(params);
203
265
  });
204
266
  return {
205
267
  content: [{ type: 'text', text: result.formatted }],
206
268
  };
207
269
  });
208
270
  toolInstances[MODEL_DETAIL_TOOL_CONFIG.name] = server.tool(MODEL_DETAIL_TOOL_CONFIG.name, MODEL_DETAIL_TOOL_CONFIG.description, MODEL_DETAIL_TOOL_CONFIG.schema.shape, MODEL_DETAIL_TOOL_CONFIG.annotations, async (params) => {
209
- const modelDetail = new ModelDetailTool(hfToken, undefined);
210
- const result = await modelDetail.getDetails(params.model_id, false);
211
- logPromptQuery(MODEL_DETAIL_TOOL_CONFIG.name, params.model_id, { model_id: params.model_id }, {
212
- ...getLoggingOptions(),
213
- totalResults: result.totalResults,
214
- resultsShared: result.resultsShared,
215
- responseCharCount: result.formatted.length,
271
+ const result = await runWithQueryLogging(logPromptQuery, {
272
+ methodName: MODEL_DETAIL_TOOL_CONFIG.name,
273
+ query: params.model_id,
274
+ parameters: { model_id: params.model_id },
275
+ baseOptions: getLoggingOptions(),
276
+ successOptions: (details) => ({
277
+ totalResults: details.totalResults,
278
+ resultsShared: details.resultsShared,
279
+ responseCharCount: details.formatted.length,
280
+ }),
281
+ }, async () => {
282
+ const modelDetail = new ModelDetailTool(hfToken, undefined);
283
+ return modelDetail.getDetails(params.model_id, false);
216
284
  });
217
285
  return {
218
286
  content: [{ type: 'text', text: result.formatted }],
219
287
  };
220
288
  });
221
289
  toolInstances[PAPER_SEARCH_TOOL_CONFIG.name] = server.tool(PAPER_SEARCH_TOOL_CONFIG.name, PAPER_SEARCH_TOOL_CONFIG.description, PAPER_SEARCH_TOOL_CONFIG.schema.shape, PAPER_SEARCH_TOOL_CONFIG.annotations, async (params) => {
222
- const result = await new PaperSearchTool(hfToken).search(params.query, params.results_limit, params.concise_only);
223
- logSearchQuery(PAPER_SEARCH_TOOL_CONFIG.name, params.query, { results_limit: params.results_limit, concise_only: params.concise_only }, {
224
- ...getLoggingOptions(),
225
- totalResults: result.totalResults,
226
- resultsShared: result.resultsShared,
227
- responseCharCount: result.formatted.length,
290
+ const result = await runWithQueryLogging(logSearchQuery, {
291
+ methodName: PAPER_SEARCH_TOOL_CONFIG.name,
292
+ query: params.query,
293
+ parameters: { results_limit: params.results_limit, concise_only: params.concise_only },
294
+ baseOptions: getLoggingOptions(),
295
+ successOptions: (formatted) => ({
296
+ totalResults: formatted.totalResults,
297
+ resultsShared: formatted.resultsShared,
298
+ responseCharCount: formatted.formatted.length,
299
+ }),
300
+ }, async () => {
301
+ const paperSearchTool = new PaperSearchTool(hfToken);
302
+ return paperSearchTool.search(params.query, params.results_limit, params.concise_only);
228
303
  });
229
304
  return {
230
305
  content: [{ type: 'text', text: result.formatted }],
231
306
  };
232
307
  });
233
308
  toolInstances[DATASET_SEARCH_TOOL_CONFIG.name] = server.tool(DATASET_SEARCH_TOOL_CONFIG.name, DATASET_SEARCH_TOOL_CONFIG.description, DATASET_SEARCH_TOOL_CONFIG.schema.shape, DATASET_SEARCH_TOOL_CONFIG.annotations, async (params) => {
234
- const datasetSearch = new DatasetSearchTool(hfToken);
235
- const result = await datasetSearch.searchWithParams(params);
236
- logSearchQuery(DATASET_SEARCH_TOOL_CONFIG.name, params.query || `sort:${params.sort || 'trendingScore'}`, params, {
237
- ...getLoggingOptions(),
238
- totalResults: result.totalResults,
239
- resultsShared: result.resultsShared,
240
- responseCharCount: result.formatted.length,
309
+ const result = await runWithQueryLogging(logSearchQuery, {
310
+ methodName: DATASET_SEARCH_TOOL_CONFIG.name,
311
+ query: params.query || `sort:${params.sort || 'trendingScore'}`,
312
+ parameters: params,
313
+ baseOptions: getLoggingOptions(),
314
+ successOptions: (formatted) => ({
315
+ totalResults: formatted.totalResults,
316
+ resultsShared: formatted.resultsShared,
317
+ responseCharCount: formatted.formatted.length,
318
+ }),
319
+ }, async () => {
320
+ const datasetSearch = new DatasetSearchTool(hfToken);
321
+ return datasetSearch.searchWithParams(params);
241
322
  });
242
323
  return {
243
324
  content: [{ type: 'text', text: result.formatted }],
244
325
  };
245
326
  });
246
327
  toolInstances[DATASET_DETAIL_TOOL_CONFIG.name] = server.tool(DATASET_DETAIL_TOOL_CONFIG.name, DATASET_DETAIL_TOOL_CONFIG.description, DATASET_DETAIL_TOOL_CONFIG.schema.shape, DATASET_DETAIL_TOOL_CONFIG.annotations, async (params) => {
247
- const datasetDetail = new DatasetDetailTool(hfToken, undefined);
248
- const result = await datasetDetail.getDetails(params.dataset_id, false);
249
- logPromptQuery(DATASET_DETAIL_TOOL_CONFIG.name, params.dataset_id, { dataset_id: params.dataset_id }, {
250
- ...getLoggingOptions(),
251
- totalResults: result.totalResults,
252
- resultsShared: result.resultsShared,
253
- responseCharCount: result.formatted.length,
328
+ const result = await runWithQueryLogging(logPromptQuery, {
329
+ methodName: DATASET_DETAIL_TOOL_CONFIG.name,
330
+ query: params.dataset_id,
331
+ parameters: { dataset_id: params.dataset_id },
332
+ baseOptions: getLoggingOptions(),
333
+ successOptions: (details) => ({
334
+ totalResults: details.totalResults,
335
+ resultsShared: details.resultsShared,
336
+ responseCharCount: details.formatted.length,
337
+ }),
338
+ }, async () => {
339
+ const datasetDetail = new DatasetDetailTool(hfToken, undefined);
340
+ return datasetDetail.getDetails(params.dataset_id, false);
254
341
  });
255
342
  return {
256
343
  content: [{ type: 'text', text: result.formatted }],
@@ -272,31 +359,43 @@ export const createServerFactory = (_webServerInstance, sharedApiClient) => {
272
359
  const allowReadme = hasReadmeFlag(currentSelection.enabledToolIds);
273
360
  const wantReadme = params.include_readme === true;
274
361
  const includeReadme = allowReadme && wantReadme;
275
- const tool = new HubInspectTool(hfToken, undefined);
276
- const result = await tool.inspect(params, includeReadme);
277
362
  const repoIdsParam = params.repo_ids;
278
363
  const repoIds = Array.isArray(repoIdsParam) ? repoIdsParam : [];
279
364
  const firstRepoId = typeof repoIds[0] === 'string' ? repoIds[0] : '';
280
365
  const repoType = params.repo_type;
281
366
  const repoTypeSafe = repoType === 'model' || repoType === 'dataset' || repoType === 'space' ? repoType : undefined;
282
- logPromptQuery(HUB_INSPECT_TOOL_CONFIG.name, firstRepoId, { count: repoIds.length, repo_type: repoTypeSafe, include_readme: includeReadme }, {
283
- ...getLoggingOptions(),
284
- totalResults: result.totalResults,
285
- resultsShared: result.resultsShared,
286
- responseCharCount: result.formatted.length,
367
+ const result = await runWithQueryLogging(logPromptQuery, {
368
+ methodName: HUB_INSPECT_TOOL_CONFIG.name,
369
+ query: firstRepoId,
370
+ parameters: { count: repoIds.length, repo_type: repoTypeSafe, include_readme: includeReadme },
371
+ baseOptions: getLoggingOptions(),
372
+ successOptions: (details) => ({
373
+ totalResults: details.totalResults,
374
+ resultsShared: details.resultsShared,
375
+ responseCharCount: details.formatted.length,
376
+ }),
377
+ }, async () => {
378
+ const tool = new HubInspectTool(hfToken, undefined);
379
+ return tool.inspect(params, includeReadme);
287
380
  });
288
381
  return {
289
382
  content: [{ type: 'text', text: result.formatted }],
290
383
  };
291
384
  });
292
385
  toolInstances[DOCS_SEMANTIC_SEARCH_CONFIG.name] = server.tool(DOCS_SEMANTIC_SEARCH_CONFIG.name, DOCS_SEMANTIC_SEARCH_CONFIG.description, DOCS_SEMANTIC_SEARCH_CONFIG.schema.shape, DOCS_SEMANTIC_SEARCH_CONFIG.annotations, async (params) => {
293
- const docSearch = new DocSearchTool(hfToken);
294
- const result = await docSearch.search(params);
295
- logSearchQuery(DOCS_SEMANTIC_SEARCH_CONFIG.name, params.query, { product: params.product }, {
296
- ...getLoggingOptions(),
297
- totalResults: result.totalResults,
298
- resultsShared: result.resultsShared,
299
- responseCharCount: result.formatted.length,
386
+ const result = await runWithQueryLogging(logSearchQuery, {
387
+ methodName: DOCS_SEMANTIC_SEARCH_CONFIG.name,
388
+ query: params.query,
389
+ parameters: { product: params.product },
390
+ baseOptions: getLoggingOptions(),
391
+ successOptions: (formatted) => ({
392
+ totalResults: formatted.totalResults,
393
+ resultsShared: formatted.resultsShared,
394
+ responseCharCount: formatted.formatted.length,
395
+ }),
396
+ }, async () => {
397
+ const docSearch = new DocSearchTool(hfToken);
398
+ return docSearch.search(params);
300
399
  });
301
400
  return {
302
401
  content: [{ type: 'text', text: result.formatted }],
@@ -334,13 +433,19 @@ export const createServerFactory = (_webServerInstance, sharedApiClient) => {
334
433
  };
335
434
  });
336
435
  toolInstances[USE_SPACE_TOOL_CONFIG.name] = server.tool(USE_SPACE_TOOL_CONFIG.name, USE_SPACE_TOOL_CONFIG.description, USE_SPACE_TOOL_CONFIG.schema.shape, USE_SPACE_TOOL_CONFIG.annotations, async (params) => {
337
- const useSpaceTool = new UseSpaceTool(hfToken, undefined);
338
- const result = await formatUseSpaceResult(useSpaceTool, params);
339
- logPromptQuery(USE_SPACE_TOOL_CONFIG.name, params.space_id, { space_id: params.space_id }, {
340
- ...getLoggingOptions(),
341
- totalResults: result.metadata.totalResults,
342
- resultsShared: result.metadata.resultsShared,
343
- responseCharCount: result.metadata.formatted.length,
436
+ const result = await runWithQueryLogging(logPromptQuery, {
437
+ methodName: USE_SPACE_TOOL_CONFIG.name,
438
+ query: params.space_id,
439
+ parameters: { space_id: params.space_id },
440
+ baseOptions: getLoggingOptions(),
441
+ successOptions: (useSpaceResult) => ({
442
+ totalResults: useSpaceResult.metadata.totalResults,
443
+ resultsShared: useSpaceResult.metadata.resultsShared,
444
+ responseCharCount: useSpaceResult.metadata.formatted.length,
445
+ }),
446
+ }, async () => {
447
+ const useSpaceTool = new UseSpaceTool(hfToken, undefined);
448
+ return formatUseSpaceResult(useSpaceTool, params);
344
449
  });
345
450
  return {
346
451
  content: result.content,
@@ -348,14 +453,20 @@ export const createServerFactory = (_webServerInstance, sharedApiClient) => {
348
453
  });
349
454
  toolInstances[HF_JOBS_TOOL_CONFIG.name] = server.tool(HF_JOBS_TOOL_CONFIG.name, HF_JOBS_TOOL_CONFIG.description, HF_JOBS_TOOL_CONFIG.schema.shape, HF_JOBS_TOOL_CONFIG.annotations, async (params) => {
350
455
  const isAuthenticated = !!hfToken;
351
- const jobsTool = new HfJobsTool(hfToken, isAuthenticated, username);
352
- const result = await jobsTool.execute(params);
353
456
  const loggedOperation = params.operation ?? 'no-operation';
354
- logSearchQuery(HF_JOBS_TOOL_CONFIG.name, loggedOperation, params.args || {}, {
355
- ...getLoggingOptions(),
356
- totalResults: result.totalResults,
357
- resultsShared: result.resultsShared,
358
- responseCharCount: result.formatted.length,
457
+ const result = await runWithQueryLogging(logSearchQuery, {
458
+ methodName: HF_JOBS_TOOL_CONFIG.name,
459
+ query: loggedOperation,
460
+ parameters: params.args || {},
461
+ baseOptions: getLoggingOptions(),
462
+ successOptions: (jobResult) => ({
463
+ totalResults: jobResult.totalResults,
464
+ resultsShared: jobResult.resultsShared,
465
+ responseCharCount: jobResult.formatted.length,
466
+ }),
467
+ }, async () => {
468
+ const jobsTool = new HfJobsTool(hfToken, isAuthenticated, username);
469
+ return jobsTool.execute(params);
359
470
  });
360
471
  return {
361
472
  content: [{ type: 'text', text: result.formatted }],
@@ -373,69 +484,72 @@ export const createServerFactory = (_webServerInstance, sharedApiClient) => {
373
484
  isError: true,
374
485
  };
375
486
  }
376
- const startTime = Date.now();
377
- let success = false;
378
- try {
379
- const spaceTool = new SpaceTool(hfToken);
380
- const result = await spaceTool.execute(params, extra);
381
- if ('result' in result && result.result) {
382
- const invokeResult = result;
383
- success = !invokeResult.isError;
384
- const stripImageContent = noImageContentHeaderEnabled || toolSelection.enabledToolIds.includes('NO_GRADIO_IMAGE_CONTENT');
385
- const postProcessOptions = {
386
- stripImageContent,
387
- toolName: DYNAMIC_SPACE_TOOL_CONFIG.name,
388
- outwardFacingName: DYNAMIC_SPACE_TOOL_CONFIG.name,
389
- sessionInfo,
390
- spaceName: params.space_name,
391
- };
392
- const processedResult = applyResultPostProcessing(invokeResult.result, postProcessOptions);
393
- const warningsContent = invokeResult.warnings.length > 0
394
- ? [
395
- {
396
- type: 'text',
397
- text: (invokeResult.warnings.length === 1 ? 'Warning:\n' : 'Warnings:\n') +
398
- invokeResult.warnings.map((w) => `- ${w}`).join('\n') +
399
- '\n',
400
- },
401
- ]
402
- : [];
403
- const endTime = Date.now();
404
- const responseContent = [...warningsContent, ...processedResult.content];
405
- logGradioEvent(params.space_name || 'unknown-space', sessionInfo?.clientSessionId || 'unknown', {
406
- durationMs: endTime - startTime,
407
- isAuthenticated: !!hfToken,
408
- clientName: sessionInfo?.clientInfo?.name,
409
- clientVersion: sessionInfo?.clientInfo?.version,
487
+ const loggedOperation = params.operation ?? 'no-operation';
488
+ if (params.operation === 'invoke') {
489
+ const startTime = Date.now();
490
+ let success = false;
491
+ try {
492
+ const spaceTool = new SpaceTool(hfToken);
493
+ const result = await spaceTool.execute(params, extra);
494
+ if ('result' in result && result.result) {
495
+ const invokeResult = result;
496
+ success = !invokeResult.isError;
497
+ const stripImageContent = noImageContentHeaderEnabled || toolSelection.enabledToolIds.includes('NO_GRADIO_IMAGE_CONTENT');
498
+ const postProcessOptions = {
499
+ stripImageContent,
500
+ toolName: DYNAMIC_SPACE_TOOL_CONFIG.name,
501
+ outwardFacingName: DYNAMIC_SPACE_TOOL_CONFIG.name,
502
+ sessionInfo,
503
+ spaceName: params.space_name,
504
+ };
505
+ const processedResult = applyResultPostProcessing(invokeResult.result, postProcessOptions);
506
+ const warningsContent = invokeResult.warnings.length > 0
507
+ ? [
508
+ {
509
+ type: 'text',
510
+ text: (invokeResult.warnings.length === 1 ? 'Warning:\n' : 'Warnings:\n') +
511
+ invokeResult.warnings.map((w) => `- ${w}`).join('\n') +
512
+ '\n',
513
+ },
514
+ ]
515
+ : [];
516
+ const durationMs = Date.now() - startTime;
517
+ const responseContent = [...warningsContent, ...processedResult.content];
518
+ logGradioEvent(params.space_name || 'unknown-space', sessionInfo?.clientSessionId || 'unknown', {
519
+ durationMs,
520
+ isAuthenticated: !!hfToken,
521
+ clientName: sessionInfo?.clientInfo?.name,
522
+ clientVersion: sessionInfo?.clientInfo?.version,
523
+ success,
524
+ error: invokeResult.isError ? 'Tool returned isError=true' : undefined,
525
+ responseSizeBytes: JSON.stringify(responseContent).length,
526
+ isDynamic: true,
527
+ });
528
+ return {
529
+ content: responseContent,
530
+ ...(invokeResult.isError && { isError: true }),
531
+ };
532
+ }
533
+ const toolResult = result;
534
+ success = !toolResult.isError;
535
+ const durationMs = Date.now() - startTime;
536
+ logSearchQuery(DYNAMIC_SPACE_TOOL_CONFIG.name, loggedOperation, params, {
537
+ ...getLoggingOptions(),
538
+ totalResults: toolResult.totalResults,
539
+ resultsShared: toolResult.resultsShared,
540
+ responseCharCount: toolResult.formatted.length,
541
+ durationMs,
410
542
  success,
411
- error: invokeResult.isError ? 'Tool returned isError=true' : undefined,
412
- responseSizeBytes: JSON.stringify(responseContent).length,
413
- isDynamic: true,
414
543
  });
415
544
  return {
416
- content: responseContent,
417
- ...(invokeResult.isError && { isError: true }),
545
+ content: [{ type: 'text', text: toolResult.formatted }],
546
+ ...(toolResult.isError && { isError: true }),
418
547
  };
419
548
  }
420
- const toolResult = result;
421
- success = !toolResult.isError;
422
- const loggedOperation = params.operation ?? 'no-operation';
423
- logSearchQuery(DYNAMIC_SPACE_TOOL_CONFIG.name, loggedOperation, params, {
424
- ...getLoggingOptions(),
425
- totalResults: toolResult.totalResults,
426
- resultsShared: toolResult.resultsShared,
427
- responseCharCount: toolResult.formatted.length,
428
- });
429
- return {
430
- content: [{ type: 'text', text: toolResult.formatted }],
431
- ...(toolResult.isError && { isError: true }),
432
- };
433
- }
434
- catch (err) {
435
- if (params.operation === 'invoke') {
436
- const endTime = Date.now();
549
+ catch (err) {
550
+ const durationMs = Date.now() - startTime;
437
551
  logGradioEvent(params.space_name || 'unknown-space', sessionInfo?.clientSessionId || 'unknown', {
438
- durationMs: endTime - startTime,
552
+ durationMs,
439
553
  isAuthenticated: !!hfToken,
440
554
  clientName: sessionInfo?.clientInfo?.name,
441
555
  clientVersion: sessionInfo?.clientInfo?.version,
@@ -443,9 +557,28 @@ export const createServerFactory = (_webServerInstance, sharedApiClient) => {
443
557
  error: err,
444
558
  isDynamic: true,
445
559
  });
560
+ throw err;
446
561
  }
447
- throw err;
448
562
  }
563
+ const toolResult = await runWithQueryLogging(logSearchQuery, {
564
+ methodName: DYNAMIC_SPACE_TOOL_CONFIG.name,
565
+ query: loggedOperation,
566
+ parameters: params,
567
+ baseOptions: getLoggingOptions(),
568
+ successOptions: (result) => ({
569
+ totalResults: result.totalResults,
570
+ resultsShared: result.resultsShared,
571
+ responseCharCount: result.formatted.length,
572
+ }),
573
+ }, async () => {
574
+ const spaceTool = new SpaceTool(hfToken);
575
+ const result = await spaceTool.execute(params, extra);
576
+ return result;
577
+ });
578
+ return {
579
+ content: [{ type: 'text', text: toolResult.formatted }],
580
+ ...(toolResult.isError && { isError: true }),
581
+ };
449
582
  });
450
583
  if (sessionInfo?.clientInfo?.name === 'openai-mcp') {
451
584
  logger.debug('Registering Gradio widget resource for skybridge client');