@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.
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/space/commands/discover.d.ts.map +1 -1
- package/dist/space/commands/discover.js +2 -1
- package/dist/space/commands/discover.js.map +1 -1
- package/dist/space/commands/dynamic-find.d.ts.map +1 -1
- package/dist/space/commands/dynamic-find.js +2 -1
- package/dist/space/commands/dynamic-find.js.map +1 -1
- package/dist/space/commands/invoke.d.ts.map +1 -1
- package/dist/space/commands/invoke.js +14 -110
- package/dist/space/commands/invoke.js.map +1 -1
- package/dist/space/{space-tool.d.ts → dynamic-space-tool.d.ts} +2 -2
- package/dist/space/dynamic-space-tool.d.ts.map +1 -0
- package/dist/space/{space-tool.js → dynamic-space-tool.js} +29 -45
- package/dist/space/dynamic-space-tool.js.map +1 -0
- package/dist/space/types.d.ts +3 -1
- package/dist/space/types.d.ts.map +1 -1
- package/dist/space/types.js +14 -9
- package/dist/space/types.js.map +1 -1
- package/dist/space/utils/gradio-caller.d.ts +14 -0
- package/dist/space/utils/gradio-caller.d.ts.map +1 -0
- package/dist/space/utils/gradio-caller.js +138 -0
- package/dist/space/utils/gradio-caller.js.map +1 -0
- package/dist/space/utils/gradio-schema.d.ts +13 -0
- package/dist/space/utils/gradio-schema.d.ts.map +1 -0
- package/dist/space/utils/gradio-schema.js +44 -0
- package/dist/space/utils/gradio-schema.js.map +1 -0
- package/dist/space/utils/parameter-formatter.js +2 -2
- package/dist/space/utils/parameter-formatter.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +3 -1
- package/src/space/commands/discover.ts +2 -1
- package/src/space/commands/dynamic-find.ts +2 -1
- package/src/space/commands/invoke.ts +13 -147
- package/src/space/{space-tool.ts → dynamic-space-tool.ts} +29 -44
- package/src/space/types.ts +24 -18
- package/src/space/utils/gradio-caller.ts +204 -0
- package/src/space/utils/gradio-schema.ts +74 -0
- package/src/space/utils/parameter-formatter.ts +2 -2
- package/test/gradio-caller.test.ts +77 -0
- package/dist/space/space-tool.d.ts.map +0 -1
- 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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAkC,MAAM,yCAAyC,CAAC;AAC7G,OAAO,EAAE,oBAAoB,EAA+C,MAAM,oCAAoC,CAAC;AAmBvH,MAAM,UAAU,gBAAgB,CAAC,WAA+B;IAC/D,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,SAAS,CAAC;AAClB,CAAC;AAOD,MAAM,UAAU,0BAA0B,CACzC,MAAyC,EACzC,oBAAwC;IAExC,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAAE,OAAO,MAAM,CAAC;IAClD,MAAM,SAAS,GAAG,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IACzD,IAAI,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC;IAE9B,MAAM,UAAU,GAAG,yCAAyC,CAAC;IAE7D,MAAM,WAAW,GAAG,CAAC,IAAY,EAAU,EAAE,CAC5C,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;QACpD,OAAO,WAAW,IAAI,eAAe,SAAS,cAAc,IAAI,EAAE,CAAC;IACpE,CAAC,CAAC,CAAC;IAEJ,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC9C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACxB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAqC,CAAC;YAC7E,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAqC,CAAC;QACxE,CAAC;QAED,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzF,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,SAAS,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC7B,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACrC,CAAC;QACF,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IAC5B,OAAO;QACN,GAAG,MAAM;QACT,OAAO,EAAE,UAAU;KACnB,CAAC;AACH,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,MAAc,EACd,QAAgB,EAChB,UAAmC,EACnC,OAA2B,EAC3B,KAAyE,EACzE,UAA6B,EAAE;IAE/B,MAAM,eAAe,GAA2B,EAAE,CAAC;IACnD,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAQ,EAAE;QAChD,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;QAC9D,IAAI,cAAc,EAAE,CAAC;YACpB,eAAe,CAAC,mBAAmB,CAAC,GAAG,cAAc,CAAC;QACvD,CAAC;QACD,IAAI,OAAO,CAAC,iBAAiB,IAAI,CAAC,YAAY,EAAE,CAAC;YAChD,YAAY,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,OAAO,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAuC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACnF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACxC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,QAAQ,CAAC;IACjB,CAAC,CAAC;IAGF,MAAM,qBAAqB,GAC1B,CAAC,YAAqC,EAAoB,EAAE,CAC5D,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,YAAY,EAAE,CAAC;YAClB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,WAAW,GAAgB,EAAE,GAAI,IAAoB,EAAE,OAAO,EAAE,CAAC;QACvE,OAAO,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC,CAAC;IAGH,MAAM,YAAY,GAAG,IAAI,MAAM,CAC9B;QACC,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,OAAO;KAChB,EACD;QACC,YAAY,EAAE,EAAE;KAChB,CACD,CAAC;IAGF,MAAM,gBAAgB,GAA8B;QACnD,KAAK,EAAE,mBAAmB;KAC1B,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,oBAAoB,CAAC;QACxC,MAAM,aAAa,GAAG;YACrB,CAAC,UAAU,CAAC,EAAE,UAAU,OAAO,EAAE;SACjC,CAAC;QAGF,gBAAgB,CAAC,WAAW,GAAG;YAC9B,OAAO,EAAE,aAAa;SACtB,CAAC;QAGF,gBAAgB,CAAC,eAAe,GAAG;YAClC,KAAK,EAAE,qBAAqB,CAAC,aAAa,CAAC;SAC3C,CAAC;IACH,CAAC;SAAM,CAAC;QACP,gBAAgB,CAAC,eAAe,GAAG;YAClC,KAAK,EAAE,qBAAqB,EAAE;SAC9B,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC5E,MAAM,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEtC,IAAI,CAAC;QAEJ,MAAM,aAAa,GAAG,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC;QAClD,MAAM,cAAc,GAAmB,EAAE,CAAC;QAE1C,IAAI,aAAa,KAAK,SAAS,IAAI,KAAK,EAAE,CAAC;YAE1C,cAAc,CAAC,UAAU,GAAG,CAAC,QAAQ,EAAE,EAAE;gBACxC,KAAK,KAAK,CAAC,gBAAgB,CAAC;oBAC3B,MAAM,EAAE,wBAAwB;oBAChC,MAAM,EAAE;wBACP,aAAa;wBACb,QAAQ,EAAE,QAAQ,CAAC,QAAQ;wBAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;wBACrB,OAAO,EAAE,QAAQ,CAAC,OAAO;qBACzB;iBACD,CAAC,CAAC;YACJ,CAAC,CAAC;YACF,cAAc,CAAC,sBAAsB,GAAG,IAAI,CAAC;QAC9C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CACxC;YACC,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,UAAU;gBACrB,KAAK,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS;aAClE;SACD,EACD,oBAAoB,EACpB,cAAc,CACd,CAAC;QAEF,MAAM,cAAc,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAErE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;IAC/C,CAAC;YAAS,CAAC;QACV,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;AACF,CAAC"}
|
|
@@ -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
|
|
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":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"parameter-formatter.js","sourceRoot":"","sources":["../../../src/space/utils/parameter-formatter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
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": "
|
|
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": "
|
|
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
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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
|
-
}
|