@llmindset/hf-mcp 0.2.52 → 0.2.54

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 (44) hide show
  1. package/dist/index.d.ts +3 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +3 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/space/commands/discover.d.ts.map +1 -1
  6. package/dist/space/commands/discover.js +2 -1
  7. package/dist/space/commands/discover.js.map +1 -1
  8. package/dist/space/commands/dynamic-find.d.ts.map +1 -1
  9. package/dist/space/commands/dynamic-find.js +2 -1
  10. package/dist/space/commands/dynamic-find.js.map +1 -1
  11. package/dist/space/commands/invoke.d.ts.map +1 -1
  12. package/dist/space/commands/invoke.js +14 -110
  13. package/dist/space/commands/invoke.js.map +1 -1
  14. package/dist/space/{space-tool.d.ts → dynamic-space-tool.d.ts} +2 -2
  15. package/dist/space/dynamic-space-tool.d.ts.map +1 -0
  16. package/dist/space/{space-tool.js → dynamic-space-tool.js} +29 -45
  17. package/dist/space/dynamic-space-tool.js.map +1 -0
  18. package/dist/space/types.d.ts +3 -1
  19. package/dist/space/types.d.ts.map +1 -1
  20. package/dist/space/types.js +14 -9
  21. package/dist/space/types.js.map +1 -1
  22. package/dist/space/utils/gradio-caller.d.ts +14 -0
  23. package/dist/space/utils/gradio-caller.d.ts.map +1 -0
  24. package/dist/space/utils/gradio-caller.js +138 -0
  25. package/dist/space/utils/gradio-caller.js.map +1 -0
  26. package/dist/space/utils/gradio-schema.d.ts +13 -0
  27. package/dist/space/utils/gradio-schema.d.ts.map +1 -0
  28. package/dist/space/utils/gradio-schema.js +44 -0
  29. package/dist/space/utils/gradio-schema.js.map +1 -0
  30. package/dist/space/utils/parameter-formatter.js +2 -2
  31. package/dist/space/utils/parameter-formatter.js.map +1 -1
  32. package/package.json +1 -1
  33. package/src/index.ts +3 -1
  34. package/src/space/commands/discover.ts +2 -1
  35. package/src/space/commands/dynamic-find.ts +2 -1
  36. package/src/space/commands/invoke.ts +13 -147
  37. package/src/space/{space-tool.ts → dynamic-space-tool.ts} +29 -44
  38. package/src/space/types.ts +24 -18
  39. package/src/space/utils/gradio-caller.ts +204 -0
  40. package/src/space/utils/gradio-schema.ts +74 -0
  41. package/src/space/utils/parameter-formatter.ts +2 -2
  42. package/test/gradio-caller.test.ts +77 -0
  43. package/dist/space/space-tool.d.ts.map +0 -1
  44. package/dist/space/space-tool.js.map +0 -1
@@ -0,0 +1,138 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
3
+ import { CallToolResultSchema } from '@modelcontextprotocol/sdk/types.js';
4
+ export function extractReplicaId(headerValue) {
5
+ if (!headerValue)
6
+ return null;
7
+ const parts = headerValue.split('-');
8
+ if (parts.length < 2)
9
+ return null;
10
+ const replicaId = parts[parts.length - 1];
11
+ if (!replicaId || replicaId.trim() === '')
12
+ return null;
13
+ return replicaId;
14
+ }
15
+ export function rewriteReplicaUrlsInResult(result, proxiedReplicaHeader) {
16
+ if (process.env.NO_REPLICA_REWRITE)
17
+ return result;
18
+ const replicaId = extractReplicaId(proxiedReplicaHeader);
19
+ if (!replicaId)
20
+ return result;
21
+ const urlPattern = /https:\/\/([^\s"']+)\/gradio_api(\S*)?/g;
22
+ const rewriteText = (text) => text.replace(urlPattern, (_match, host, rest = '') => {
23
+ return `https://${host}/--replicas/${replicaId}/gradio_api${rest}`;
24
+ });
25
+ let changed = false;
26
+ const newContent = result.content.map((item) => {
27
+ if (typeof item === 'string') {
28
+ const rewritten = rewriteText(item);
29
+ if (rewritten !== item) {
30
+ changed = true;
31
+ return { type: 'text', text: rewritten };
32
+ }
33
+ return { type: 'text', text: item };
34
+ }
35
+ if (item && typeof item === 'object' && 'text' in item && typeof item.text === 'string') {
36
+ const rewritten = rewriteText(item.text);
37
+ if (rewritten !== item.text) {
38
+ changed = true;
39
+ return { ...item, text: rewritten };
40
+ }
41
+ }
42
+ return item;
43
+ });
44
+ if (!changed)
45
+ return result;
46
+ return {
47
+ ...result,
48
+ content: newContent,
49
+ };
50
+ }
51
+ export async function callGradioToolWithHeaders(sseUrl, toolName, parameters, hfToken, extra, options = {}) {
52
+ const capturedHeaders = {};
53
+ let loggedHeader = false;
54
+ const handleHeaders = (headers) => {
55
+ const proxiedReplica = headers.get('x-proxied-replica') ?? '';
56
+ if (proxiedReplica) {
57
+ capturedHeaders['x-proxied-replica'] = proxiedReplica;
58
+ }
59
+ if (options.logProxiedReplica && !loggedHeader) {
60
+ loggedHeader = true;
61
+ }
62
+ options.onHeaders?.(headers);
63
+ };
64
+ const captureHeadersFetch = async (url, init) => {
65
+ const response = await fetch(url, init);
66
+ handleHeaders(response.headers);
67
+ return response;
68
+ };
69
+ const buildEventSourceFetch = (extraHeaders) => (url, init) => {
70
+ const headers = new Headers(init?.headers);
71
+ if (extraHeaders) {
72
+ Object.entries(extraHeaders).forEach(([key, value]) => headers.set(key, value));
73
+ }
74
+ const requestInit = { ...init, headers };
75
+ return captureHeadersFetch(url.toString(), requestInit);
76
+ };
77
+ const remoteClient = new Client({
78
+ name: 'hf-mcp-gradio-client',
79
+ version: '1.0.0',
80
+ }, {
81
+ capabilities: {},
82
+ });
83
+ const transportOptions = {
84
+ fetch: captureHeadersFetch,
85
+ };
86
+ if (hfToken) {
87
+ const headerName = 'X-HF-Authorization';
88
+ const customHeaders = {
89
+ [headerName]: `Bearer ${hfToken}`,
90
+ };
91
+ transportOptions.requestInit = {
92
+ headers: customHeaders,
93
+ };
94
+ transportOptions.eventSourceInit = {
95
+ fetch: buildEventSourceFetch(customHeaders),
96
+ };
97
+ }
98
+ else {
99
+ transportOptions.eventSourceInit = {
100
+ fetch: buildEventSourceFetch(),
101
+ };
102
+ }
103
+ const transport = new SSEClientTransport(new URL(sseUrl), transportOptions);
104
+ await remoteClient.connect(transport);
105
+ try {
106
+ const progressToken = extra?._meta?.progressToken;
107
+ const requestOptions = {};
108
+ if (progressToken !== undefined && extra) {
109
+ requestOptions.onprogress = (progress) => {
110
+ void extra.sendNotification({
111
+ method: 'notifications/progress',
112
+ params: {
113
+ progressToken,
114
+ progress: progress.progress,
115
+ total: progress.total,
116
+ message: progress.message,
117
+ },
118
+ });
119
+ };
120
+ requestOptions.resetTimeoutOnProgress = true;
121
+ }
122
+ const result = await remoteClient.request({
123
+ method: 'tools/call',
124
+ params: {
125
+ name: toolName,
126
+ arguments: parameters,
127
+ _meta: progressToken !== undefined ? { progressToken } : undefined,
128
+ },
129
+ }, CallToolResultSchema, requestOptions);
130
+ const proxiedReplica = capturedHeaders['x-proxied-replica'];
131
+ const rewritten = rewriteReplicaUrlsInResult(result, proxiedReplica);
132
+ return { result: rewritten, capturedHeaders };
133
+ }
134
+ finally {
135
+ await remoteClient.close();
136
+ }
137
+ }
138
+ //# sourceMappingURL=gradio-caller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradio-caller.js","sourceRoot":"","sources":["../../../src/space/utils/gradio-caller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ export type ParsedSchemaFormat = 'array' | 'object';
3
+ export interface ParsedGradioSchema {
4
+ format: ParsedSchemaFormat;
5
+ tools: Array<{
6
+ name: string;
7
+ description?: string;
8
+ inputSchema: unknown;
9
+ }>;
10
+ }
11
+ export declare function parseGradioSchemaResponse(schemaResponse: unknown): ParsedGradioSchema;
12
+ export declare function normalizeParsedTools(parsed: ParsedGradioSchema): Tool[];
13
+ //# sourceMappingURL=gradio-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradio-schema.d.ts","sourceRoot":"","sources":["../../../src/space/utils/gradio-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE/D,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC3E;AAUD,wBAAgB,yBAAyB,CAAC,cAAc,EAAE,OAAO,GAAG,kBAAkB,CA2CrF;AAKD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,EAAE,CAQvE"}
@@ -0,0 +1,44 @@
1
+ export function parseGradioSchemaResponse(schemaResponse) {
2
+ if (Array.isArray(schemaResponse)) {
3
+ const tools = schemaResponse.filter((tool) => {
4
+ return (typeof tool === 'object' &&
5
+ tool !== null &&
6
+ 'name' in tool &&
7
+ typeof tool.name === 'string' &&
8
+ 'inputSchema' in tool);
9
+ });
10
+ if (tools.length === 0) {
11
+ throw new Error('Invalid schema: no tools found in array schema');
12
+ }
13
+ return {
14
+ format: 'array',
15
+ tools,
16
+ };
17
+ }
18
+ if (typeof schemaResponse === 'object' && schemaResponse !== null) {
19
+ const entries = Object.entries(schemaResponse);
20
+ const tools = entries.map(([name, toolSchema]) => ({
21
+ name,
22
+ description: typeof toolSchema.description === 'string' ? toolSchema.description : undefined,
23
+ inputSchema: toolSchema,
24
+ }));
25
+ if (tools.length === 0) {
26
+ throw new Error('Invalid schema: no tools found in object schema');
27
+ }
28
+ return {
29
+ format: 'object',
30
+ tools,
31
+ };
32
+ }
33
+ throw new Error('Invalid schema format: expected array or object');
34
+ }
35
+ export function normalizeParsedTools(parsed) {
36
+ return parsed.tools
37
+ .filter((t) => !t.name.toLowerCase().includes('<lambda'))
38
+ .map((parsedTool) => ({
39
+ name: parsedTool.name,
40
+ description: parsedTool.description || `${parsedTool.name} tool`,
41
+ inputSchema: parsedTool.inputSchema,
42
+ }));
43
+ }
44
+ //# sourceMappingURL=gradio-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradio-schema.js","sourceRoot":"","sources":["../../../src/space/utils/gradio-schema.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,yBAAyB,CAAC,cAAuB;IAEhE,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,MAAM,KAAK,GAAI,cAAiC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAwE,EAAE;YACtI,OAAO,CACN,OAAO,IAAI,KAAK,QAAQ;gBACxB,IAAI,KAAK,IAAI;gBACb,MAAM,IAAI,IAAI;gBACd,OAAQ,IAA2B,CAAC,IAAI,KAAK,QAAQ;gBACrD,aAAa,IAAI,IAAI,CACrB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACnE,CAAC;QAED,OAAO;YACN,MAAM,EAAE,OAAO;YACf,KAAK;SACL,CAAC;IACH,CAAC;IAGD,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,cAAyC,CAAC,CAAC;QAC1E,MAAM,KAAK,GAAgC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/E,IAAI;YACJ,WAAW,EAAE,OAAQ,UAAwC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAE,UAAuC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;YACzJ,WAAW,EAAE,UAAU;SACvB,CAAC,CAAC,CAAC;QAEJ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACpE,CAAC;QAED,OAAO;YACN,MAAM,EAAE,QAAQ;YAChB,KAAK;SACL,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;AACpE,CAAC;AAKD,MAAM,UAAU,oBAAoB,CAAC,MAA0B;IAC9D,OAAO,MAAM,CAAC,KAAK;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;SACxD,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACrB,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,GAAG,UAAU,CAAC,IAAI,OAAO;QAChE,WAAW,EAAE,UAAU,CAAC,WAAkC;KAC1D,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -1,4 +1,4 @@
1
- import { FILE_INPUT_HELP_MESSAGE } from '../types.js';
1
+ import { FILE_INPUT_HELP_MESSAGE, VIEW_PARAMETERS } from '../types.js';
2
2
  export function formatParameters(schemaResult, spaceName) {
3
3
  const { toolName, toolDescription, parameters } = schemaResult;
4
4
  let output = `# Parameters for: ${toolName}\n\n`;
@@ -126,7 +126,7 @@ export function formatValidationError(errors, spaceName) {
126
126
  for (const error of errors) {
127
127
  output += `- ${error}\n`;
128
128
  }
129
- output += `\nUse the view_parameters operation to see all required parameters and their types.`;
129
+ output += `\nUse the ${VIEW_PARAMETERS} operation to see all required parameters and their types.`;
130
130
  return output;
131
131
  }
132
132
  //# sourceMappingURL=parameter-formatter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parameter-formatter.js","sourceRoot":"","sources":["../../../src/space/utils/parameter-formatter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parameter-formatter.js","sourceRoot":"","sources":["../../../src/space/utils/parameter-formatter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAWvE,MAAM,UAAU,gBAAgB,CAAC,YAAoC,EAAE,SAAiB;IACvF,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,YAAY,CAAC;IAE/D,IAAI,MAAM,GAAG,qBAAqB,QAAQ,MAAM,CAAC;IAEjD,IAAI,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,oBAAoB,eAAe,MAAM,CAAC;IACrD,CAAC;IAGD,MAAM,YAAY,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClD,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,oBAAoB,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAGD,MAAM,IAAI,yBAAyB,CAAC;IACpC,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAEpD,OAAO,MAAM,CAAC;AACf,CAAC;AAKD,SAAS,eAAe,CAAC,KAAoB;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;IAC3D,IAAI,MAAM,GAAG,OAAO,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC;IAG5C,MAAM,IAAI,eAAe,KAAK,CAAC,IAAI,IAAI,CAAC;IAGxC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,IAAI,sBAAsB,KAAK,CAAC,WAAW,IAAI,CAAC;IACvD,CAAC;IAGD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,IAAI,kBAAkB,UAAU,IAAI,CAAC;IAC5C,CAAC;IAGD,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,IAAI,yBAAyB,OAAO,IAAI,CAAC;IAChD,CAAC;IAGD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,IAAI,eAAe,uBAAuB,IAAI,CAAC;IACtD,CAAC;IAED,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,MAAM,CAAC;AACf,CAAC;AAKD,SAAS,WAAW,CAAC,KAAc;IAClC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,KAAK,GAAG,CAAC;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACJ,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,UAAU,CAAC;QACnB,CAAC;IACF,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAKD,SAAS,kBAAkB,CAAC,SAAiB,EAAE,UAA2B;IAEzE,MAAM,aAAa,GAA2B,EAAE,CAAC;IAGjD,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1D,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAGD,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,KAAK,EAAE,CAAC;YACX,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;SACvD,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;IAET,OAAO;;;mBAGW,SAAS;mBACT,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;;OAE3C,CAAC;AACR,CAAC;AAKD,SAAS,eAAe,CAAC,KAAoB;IAE5C,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAGD,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAGD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,gCAAgC,CAAC;IACzC,CAAC;IAGD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzD,QAAQ,QAAQ,EAAE,CAAC;QAClB,KAAK,QAAQ;YACZ,OAAO,iBAAiB,CAAC;QAC1B,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS;YACb,OAAO,IAAI,CAAC;QACb,KAAK,SAAS;YACb,OAAO,MAAM,CAAC;QACf,KAAK,OAAO;YACX,OAAO,oBAAoB,CAAC;QAC7B,KAAK,QAAQ;YACZ,OAAO,kBAAkB,CAAC;QAC3B;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAKD,MAAM,UAAU,wBAAwB,CAAC,SAAiB,EAAE,MAAc;IACzE,OAAO,wCAAwC,SAAS;;EAEvD,MAAM;;;;+DAIuD,CAAC;AAChE,CAAC;AAKD,MAAM,UAAU,qBAAqB,CAAC,MAAgB,EAAE,SAAiB;IACxE,IAAI,MAAM,GAAG,wCAAwC,SAAS,QAAQ,CAAC;IAEvE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,KAAK,IAAI,CAAC;IAC1B,CAAC;IAED,MAAM,IAAI,aAAa,eAAe,4DAA4D,CAAC;IAEnG,OAAO,MAAM,CAAC;AACf,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llmindset/hf-mcp",
3
- "version": "0.2.52",
3
+ "version": "0.2.54",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/index.ts CHANGED
@@ -20,7 +20,9 @@ export * from './docs-search/doc-fetch.js';
20
20
  export * from './readme-utils.js';
21
21
  export * from './use-space.js';
22
22
  export * from './jobs/jobs-tool.js';
23
- export * from './space/space-tool.js';
23
+ export * from './space/dynamic-space-tool.js';
24
+ export * from './space/utils/gradio-caller.js';
25
+ export * from './space/utils/gradio-schema.js';
24
26
 
25
27
  // Export shared types
26
28
  export * from './types/tool-result.js';
@@ -1,5 +1,6 @@
1
1
  import type { ToolResult } from '../../types/tool-result.js';
2
2
  import { escapeMarkdown } from '../../utilities.js';
3
+ import { VIEW_PARAMETERS } from '../types.js';
3
4
 
4
5
  /**
5
6
  * Prompt configuration for discover operation (from DYNAMIC_SPACE_DATA)
@@ -10,7 +11,7 @@ export const DISCOVER_PROMPTS = {
10
11
  RESULTS_HEADER: `**Available Spaces:**
11
12
 
12
13
  These spaces can be invoked using the \`dynamic_space\` tool.
13
- Use \`"operation": "view_parameters"\` to inspect a space's parameters before invoking.
14
+ Use \`"operation": "${VIEW_PARAMETERS}"\` to inspect a space's parameters before invoking.
14
15
 
15
16
  `,
16
17
 
@@ -1,6 +1,7 @@
1
1
  import type { ToolResult } from '../../types/tool-result.js';
2
2
  import { SpaceSearchTool, type SpaceSearchResult } from '../../space-search.js';
3
3
  import { escapeMarkdown } from '../../utilities.js';
4
+ import { VIEW_PARAMETERS } from '../dynamic-space-tool.js';
4
5
 
5
6
  // Default number of results to return
6
7
  const DEFAULT_RESULTS_LIMIT = 10;
@@ -51,7 +52,7 @@ To find MCP-enabled Spaces for a specific task, call this operation with a searc
51
52
  return `# MCP Space Find Results for "${query}" (${showingText})
52
53
 
53
54
  These MCP-enabled Spaces can be invoked using the \`dynamic_space\` tool.
54
- Use \`"operation": "view_parameters"\` to inspect a space's parameters before invoking.
55
+ Use \`"operation": "${VIEW_PARAMETERS}"\` to inspect a space's parameters before invoking.
55
56
 
56
57
  `;
57
58
  },
@@ -1,12 +1,11 @@
1
1
  import type { ToolResult } from '../../types/tool-result.js';
2
2
  import type { InvokeResult } from '../types.js';
3
3
  import type { Tool, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
4
- import type { RequestHandlerExtra, RequestOptions } from '@modelcontextprotocol/sdk/shared/protocol.js';
5
- import { CallToolResultSchema } from '@modelcontextprotocol/sdk/types.js';
6
- import { Client } from '@modelcontextprotocol/sdk/client/index.js';
7
- import { SSEClientTransport, type SSEClientTransportOptions } from '@modelcontextprotocol/sdk/client/sse.js';
4
+ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
8
5
  import { analyzeSchemaComplexity, validateParameters, applyDefaults } from '../utils/schema-validator.js';
9
6
  import { formatComplexSchemaError, formatValidationError } from '../utils/parameter-formatter.js';
7
+ import { callGradioToolWithHeaders } from '../utils/gradio-caller.js';
8
+ import { parseGradioSchemaResponse, normalizeParsedTools } from '../utils/gradio-schema.js';
10
9
 
11
10
  /**
12
11
  * Invokes a Gradio space with provided parameters
@@ -88,44 +87,11 @@ export async function invokeSpace(
88
87
  // Step 7: Apply default values for missing optional parameters
89
88
  const finalParameters = applyDefaults(inputParameters, schemaResult);
90
89
 
91
- // Step 8: Create SSE connection and invoke tool
92
- const sseUrl = `https://${metadata.subdomain}.hf.space/gradio_api/mcp/sse`;
93
- const client = await createLazyConnection(sseUrl, hfToken);
94
-
95
- try {
96
- // Check if the client is requesting progress notifications
97
- const progressToken = extra?._meta?.progressToken;
98
- const requestOptions: RequestOptions = {};
99
-
100
- if (progressToken !== undefined && extra) {
101
- // Set up progress relay from remote tool to our client
102
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
103
- requestOptions.onprogress = async (progress) => {
104
- // Relay the progress notification to our client
105
- await extra.sendNotification({
106
- method: 'notifications/progress',
107
- params: {
108
- progressToken,
109
- progress: progress.progress,
110
- total: progress.total,
111
- message: progress.message,
112
- },
113
- });
114
- };
115
- }
116
-
117
- const result = await client.request(
118
- {
119
- method: 'tools/call',
120
- params: {
121
- name: tool.name,
122
- arguments: finalParameters,
123
- _meta: progressToken !== undefined ? { progressToken } : undefined,
124
- },
125
- },
126
- CallToolResultSchema,
127
- requestOptions
128
- );
90
+ // Step 8: Create SSE connection and invoke tool (shared helper)
91
+ const sseUrl = `https://${metadata.subdomain}.hf.space/gradio_api/mcp/sse`;
92
+ const { result } = await callGradioToolWithHeaders(sseUrl, tool.name, finalParameters, hfToken, extra, {
93
+ logProxiedReplica: true,
94
+ });
129
95
 
130
96
  // Return raw MCP result with warnings if any
131
97
  // This ensures the space tool behaves identically to proxied gr_* tools
@@ -136,10 +102,6 @@ export async function invokeSpace(
136
102
  resultsShared: 1,
137
103
  isError: result.isError,
138
104
  };
139
- } finally {
140
- // Clean up connection
141
- await client.close();
142
- }
143
105
  } catch (error) {
144
106
  const errorMessage = error instanceof Error ? error.message : String(error);
145
107
  return {
@@ -230,106 +192,10 @@ async function fetchGradioSchema(subdomain: string, isPrivate: boolean, hfToken?
230
192
 
231
193
  const schemaResponse = (await response.json()) as unknown;
232
194
 
233
- // Parse schema response (handle both array and object formats)
234
- return parseSchemaResponse(schemaResponse);
235
- } finally {
236
- clearTimeout(timeoutId);
237
- }
238
- }
239
-
240
- /**
241
- * Parses schema response and extracts tools
242
- */
243
- function parseSchemaResponse(schemaResponse: unknown): Tool[] {
244
- const tools: Tool[] = [];
245
-
246
- if (Array.isArray(schemaResponse)) {
247
- // Array format: [{ name: "toolName", description: "...", inputSchema: {...} }, ...]
248
- for (const item of schemaResponse) {
249
- if (
250
- typeof item === 'object' &&
251
- item !== null &&
252
- 'name' in item &&
253
- 'inputSchema' in item
254
- ) {
255
- const itemRecord = item as Record<string, unknown>;
256
- if (typeof itemRecord.name === 'string') {
257
- const tool = itemRecord as { name: string; description?: string; inputSchema: unknown };
258
- tools.push({
259
- name: tool.name,
260
- description: tool.description || `${tool.name} tool`,
261
- inputSchema: {
262
- type: 'object',
263
- ...(tool.inputSchema as Record<string, unknown>),
264
- },
265
- });
266
- }
267
- }
268
- }
269
- } else if (typeof schemaResponse === 'object' && schemaResponse !== null) {
270
- // Object format: { "toolName": { properties: {...}, required: [...] }, ... }
271
- for (const [name, toolSchema] of Object.entries(schemaResponse)) {
272
- if (typeof toolSchema === 'object' && toolSchema !== null) {
273
- const schema = toolSchema as { description?: string };
274
- tools.push({
275
- name,
276
- description: schema.description || `${name} tool`,
277
- inputSchema: {
278
- type: 'object',
279
- ...(toolSchema as Record<string, unknown>),
280
- },
281
- });
282
- }
283
- }
284
- }
285
-
286
- return tools.filter((tool) => !tool.name.toLowerCase().includes('<lambda'));
287
- }
288
-
289
- /**
290
- * Creates SSE connection to endpoint for tool execution
291
- */
292
- async function createLazyConnection(sseUrl: string, hfToken?: string): Promise<Client> {
293
- // Create MCP client
294
- const remoteClient = new Client(
295
- {
296
- name: 'hf-mcp-space-client',
297
- version: '1.0.0',
298
- },
299
- {
300
- capabilities: {},
195
+ // Parse schema response (handle both array and object formats)
196
+ const parsed = parseGradioSchemaResponse(schemaResponse);
197
+ return normalizeParsedTools(parsed);
198
+ } finally {
199
+ clearTimeout(timeoutId);
301
200
  }
302
- );
303
-
304
- // Create SSE transport with HF token if available
305
- const transportOptions: SSEClientTransportOptions = {};
306
- if (hfToken) {
307
- const headerName = 'X-HF-Authorization';
308
- const customHeaders = {
309
- [headerName]: `Bearer ${hfToken}`,
310
- };
311
-
312
- // Headers for POST requests
313
- transportOptions.requestInit = {
314
- headers: customHeaders,
315
- };
316
-
317
- // Headers for SSE connection
318
- transportOptions.eventSourceInit = {
319
- fetch: (url, init) => {
320
- const headers = new Headers(init.headers);
321
- Object.entries(customHeaders).forEach(([key, value]) => {
322
- headers.set(key, value);
323
- });
324
- return fetch(url.toString(), { ...init, headers });
325
- },
326
- };
327
201
  }
328
-
329
- const transport = new SSEClientTransport(new URL(sseUrl), transportOptions);
330
-
331
- // Connect the client to the transport
332
- await remoteClient.connect(transport);
333
-
334
- return remoteClient;
335
- }