@llmindset/hf-mcp 0.2.57 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/logger.d.ts +10 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +49 -0
- package/dist/logger.js.map +1 -0
- package/dist/space/commands/invoke.js +2 -2
- package/dist/space/commands/invoke.js.map +1 -1
- package/dist/space/utils/gradio-caller.d.ts +2 -2
- package/dist/space/utils/gradio-caller.d.ts.map +1 -1
- package/dist/space/utils/gradio-caller.js +123 -24
- package/dist/space/utils/gradio-caller.js.map +1 -1
- package/package.json +2 -2
- package/src/logger.ts +61 -0
- package/src/space/commands/invoke.ts +15 -15
- package/src/space/utils/gradio-caller.ts +142 -41
- package/test/gradio-progress-relay.test.ts +5 -5
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent';
|
|
2
|
+
export interface Logger {
|
|
3
|
+
trace: (...args: unknown[]) => void;
|
|
4
|
+
debug: (...args: unknown[]) => void;
|
|
5
|
+
info: (...args: unknown[]) => void;
|
|
6
|
+
warn: (...args: unknown[]) => void;
|
|
7
|
+
error: (...args: unknown[]) => void;
|
|
8
|
+
}
|
|
9
|
+
export declare const logger: Logger;
|
|
10
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhF,MAAM,WAAW,MAAM;IACtB,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACpC;AA0BD,eAAO,MAAM,MAAM,EAAE,MA0BpB,CAAC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const LOG_LEVELS = {
|
|
2
|
+
trace: 0,
|
|
3
|
+
debug: 1,
|
|
4
|
+
info: 2,
|
|
5
|
+
warn: 3,
|
|
6
|
+
error: 4,
|
|
7
|
+
silent: 5,
|
|
8
|
+
};
|
|
9
|
+
function normalizeLogLevel(value) {
|
|
10
|
+
if (!value)
|
|
11
|
+
return 'info';
|
|
12
|
+
const normalized = value.toLowerCase();
|
|
13
|
+
if (normalized in LOG_LEVELS) {
|
|
14
|
+
return normalized;
|
|
15
|
+
}
|
|
16
|
+
return 'info';
|
|
17
|
+
}
|
|
18
|
+
const ACTIVE_LEVEL = normalizeLogLevel(process.env.LOG_LEVEL);
|
|
19
|
+
function shouldLog(level) {
|
|
20
|
+
return LOG_LEVELS[level] >= LOG_LEVELS[ACTIVE_LEVEL];
|
|
21
|
+
}
|
|
22
|
+
export const logger = {
|
|
23
|
+
trace: (...args) => {
|
|
24
|
+
if (shouldLog('trace')) {
|
|
25
|
+
console.debug(...args);
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
debug: (...args) => {
|
|
29
|
+
if (shouldLog('debug')) {
|
|
30
|
+
console.debug(...args);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
info: (...args) => {
|
|
34
|
+
if (shouldLog('info')) {
|
|
35
|
+
console.info(...args);
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
warn: (...args) => {
|
|
39
|
+
if (shouldLog('warn')) {
|
|
40
|
+
console.warn(...args);
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
error: (...args) => {
|
|
44
|
+
if (shouldLog('error')) {
|
|
45
|
+
console.error(...args);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,GAA6B;IAC5C,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;CACT,CAAC;AAEF,SAAS,iBAAiB,CAAC,KAAyB;IACnD,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;QAC9B,OAAO,UAAsB,CAAC;IAC/B,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAE9D,SAAS,SAAS,CAAC,KAAe;IACjC,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAW;IAC7B,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;QAClB,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QACxB,CAAC;IACF,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;QAClB,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QACxB,CAAC;IACF,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;QACjB,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;QACjB,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;QAClB,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QACxB,CAAC;IACF,CAAC;CACD,CAAC"}
|
|
@@ -57,8 +57,8 @@ export async function invokeSpace(spaceName, parametersJson, hfToken, extra) {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
const finalParameters = applyDefaults(inputParameters, schemaResult);
|
|
60
|
-
const
|
|
61
|
-
const { result } = await callGradioToolWithHeaders(
|
|
60
|
+
const mcpUrl = `https://${metadata.subdomain}.hf.space/gradio_api/mcp/`;
|
|
61
|
+
const { result } = await callGradioToolWithHeaders(mcpUrl, tool.name, finalParameters, hfToken, extra, {
|
|
62
62
|
logProxiedReplica: true,
|
|
63
63
|
});
|
|
64
64
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../../src/space/commands/invoke.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../../src/space/commands/invoke.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type CallToolResult, type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
import type
|
|
2
|
+
import { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
3
3
|
export interface GradioCallResult {
|
|
4
4
|
result: CallToolResult;
|
|
5
5
|
capturedHeaders: Record<string, string>;
|
|
@@ -11,5 +11,5 @@ export interface GradioCallOptions {
|
|
|
11
11
|
}
|
|
12
12
|
export declare function extractReplicaId(headerValue: string | undefined): string | null;
|
|
13
13
|
export declare function rewriteReplicaUrlsInResult(result: CallToolResult, proxiedReplicaHeader: string | undefined): CallToolResult;
|
|
14
|
-
export declare function callGradioToolWithHeaders(
|
|
14
|
+
export declare function callGradioToolWithHeaders(mcpUrl: string, toolName: string, parameters: Record<string, unknown>, hfToken: string | undefined, extra: RequestHandlerExtra<ServerRequest, ServerNotification> | undefined, options?: GradioCallOptions): Promise<GradioCallResult>;
|
|
15
15
|
//# sourceMappingURL=gradio-caller.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gradio-caller.d.ts","sourceRoot":"","sources":["../../../src/space/utils/gradio-caller.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gradio-caller.d.ts","sourceRoot":"","sources":["../../../src/space/utils/gradio-caller.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwB,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAC5I,OAAO,EAAY,KAAK,mBAAmB,EAAuB,MAAM,8CAA8C,CAAC;AAUvH,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,iBAAiB;IAEjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAEvC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;CACpC;AAMD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAO/E;AAOD,wBAAgB,0BAA0B,CACzC,MAAM,EAAE,cAAc,EACtB,oBAAoB,EAAE,MAAM,GAAG,SAAS,GACtC,cAAc,CAuChB;AAMD,wBAAsB,yBAAyB,CAC9C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,GAAG,SAAS,EACzE,OAAO,GAAE,iBAAsB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAwO3B"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
-
import {
|
|
2
|
+
import { StreamableHTTPClientTransport, } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
3
3
|
import { CallToolResultSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { Protocol } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
5
|
+
import { logger } from '../../logger.js';
|
|
6
|
+
class GradioClient extends Client {
|
|
7
|
+
async connect(transport, _options) {
|
|
8
|
+
await Protocol.prototype.connect.call(this, transport);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
4
11
|
export function extractReplicaId(headerValue) {
|
|
5
12
|
if (!headerValue)
|
|
6
13
|
return null;
|
|
@@ -48,7 +55,7 @@ export function rewriteReplicaUrlsInResult(result, proxiedReplicaHeader) {
|
|
|
48
55
|
content: newContent,
|
|
49
56
|
};
|
|
50
57
|
}
|
|
51
|
-
export async function callGradioToolWithHeaders(
|
|
58
|
+
export async function callGradioToolWithHeaders(mcpUrl, toolName, parameters, hfToken, extra, options = {}) {
|
|
52
59
|
const capturedHeaders = {};
|
|
53
60
|
let loggedHeader = false;
|
|
54
61
|
const handleHeaders = (headers) => {
|
|
@@ -62,57 +69,133 @@ export async function callGradioToolWithHeaders(sseUrl, toolName, parameters, hf
|
|
|
62
69
|
options.onHeaders?.(headers);
|
|
63
70
|
};
|
|
64
71
|
const captureHeadersFetch = async (url, init) => {
|
|
72
|
+
const method = init?.method ?? 'GET';
|
|
73
|
+
let requestSummary = null;
|
|
74
|
+
if (typeof init?.body === 'string') {
|
|
75
|
+
try {
|
|
76
|
+
const parsed = JSON.parse(init.body);
|
|
77
|
+
if (Array.isArray(parsed)) {
|
|
78
|
+
requestSummary = {
|
|
79
|
+
isBatch: true,
|
|
80
|
+
method: parsed[0]?.method,
|
|
81
|
+
id: parsed[0]?.id,
|
|
82
|
+
progressToken: parsed[0]?.params?._meta?.progressToken,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
else if (parsed && typeof parsed === 'object') {
|
|
86
|
+
requestSummary = {
|
|
87
|
+
isBatch: false,
|
|
88
|
+
method: parsed.method,
|
|
89
|
+
id: parsed.id,
|
|
90
|
+
progressToken: parsed.params?._meta?.progressToken,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
requestSummary = null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
logger.trace('[gradio] upstream fetch', {
|
|
99
|
+
method,
|
|
100
|
+
url: url.toString(),
|
|
101
|
+
hasBody: Boolean(init?.body),
|
|
102
|
+
requestSummary,
|
|
103
|
+
});
|
|
65
104
|
const response = await fetch(url, init);
|
|
105
|
+
logger.trace('[gradio] upstream response', {
|
|
106
|
+
method,
|
|
107
|
+
url: url.toString(),
|
|
108
|
+
status: response.status,
|
|
109
|
+
contentType: response.headers.get('content-type') ?? null,
|
|
110
|
+
mcpSessionId: response.headers.get('mcp-session-id') ?? null,
|
|
111
|
+
});
|
|
66
112
|
handleHeaders(response.headers);
|
|
67
113
|
return response;
|
|
68
114
|
};
|
|
69
|
-
const
|
|
70
|
-
|
|
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({
|
|
115
|
+
const skipInitialize = process.env.GRADIO_SKIP_INITIALIZE === 'true';
|
|
116
|
+
const clientInfo = {
|
|
78
117
|
name: 'hf-mcp-gradio-client',
|
|
79
118
|
version: '1.0.0',
|
|
80
|
-
}
|
|
119
|
+
};
|
|
120
|
+
const clientOptions = {
|
|
81
121
|
capabilities: {},
|
|
82
|
-
}
|
|
122
|
+
};
|
|
123
|
+
const remoteClient = skipInitialize
|
|
124
|
+
? new GradioClient(clientInfo, clientOptions)
|
|
125
|
+
: new Client(clientInfo, clientOptions);
|
|
83
126
|
const transportOptions = {
|
|
84
127
|
fetch: captureHeadersFetch,
|
|
85
128
|
};
|
|
86
129
|
if (hfToken) {
|
|
87
|
-
const headerName = 'X-HF-Authorization';
|
|
88
130
|
const customHeaders = {
|
|
89
|
-
|
|
131
|
+
'X-HF-Authorization': `Bearer ${hfToken}`,
|
|
90
132
|
};
|
|
91
133
|
transportOptions.requestInit = {
|
|
92
134
|
headers: customHeaders,
|
|
93
135
|
};
|
|
94
|
-
transportOptions.eventSourceInit = {
|
|
95
|
-
fetch: buildEventSourceFetch(customHeaders),
|
|
96
|
-
};
|
|
97
136
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
const transport = new
|
|
137
|
+
logger.trace('[gradio] connecting streamable client', {
|
|
138
|
+
mcpUrl,
|
|
139
|
+
hasToken: Boolean(hfToken),
|
|
140
|
+
skipInitialize,
|
|
141
|
+
});
|
|
142
|
+
const transport = new StreamableHTTPClientTransport(new URL(mcpUrl), transportOptions);
|
|
143
|
+
let isClosing = false;
|
|
144
|
+
transport.onmessage = (message) => {
|
|
145
|
+
const messageInfo = message && typeof message === 'object'
|
|
146
|
+
? {
|
|
147
|
+
hasId: 'id' in message,
|
|
148
|
+
id: message.id ?? null,
|
|
149
|
+
method: 'method' in message ? message.method : null,
|
|
150
|
+
isResult: 'result' in message,
|
|
151
|
+
isError: 'error' in message,
|
|
152
|
+
}
|
|
153
|
+
: { messageType: typeof message };
|
|
154
|
+
logger.trace('[gradio] transport message', messageInfo);
|
|
155
|
+
};
|
|
156
|
+
transport.onerror = (error) => {
|
|
157
|
+
if (isClosing && error instanceof Error && error.message.includes('AbortError')) {
|
|
158
|
+
logger.trace('[gradio] transport aborted after close', { message: error.message });
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
logger.trace('[gradio] transport error', { error });
|
|
162
|
+
};
|
|
163
|
+
transport.onclose = () => {
|
|
164
|
+
logger.trace('[gradio] transport closed');
|
|
165
|
+
};
|
|
166
|
+
let connectCompleted = false;
|
|
167
|
+
const connectWatchdog = setTimeout(() => {
|
|
168
|
+
if (!connectCompleted) {
|
|
169
|
+
logger.trace('[gradio] connect still pending', { mcpUrl });
|
|
170
|
+
}
|
|
171
|
+
}, 15000);
|
|
104
172
|
await remoteClient.connect(transport);
|
|
173
|
+
connectCompleted = true;
|
|
174
|
+
clearTimeout(connectWatchdog);
|
|
175
|
+
logger.trace('[gradio] connected streamable client', { mcpUrl });
|
|
105
176
|
try {
|
|
106
177
|
const progressToken = extra?._meta?.progressToken;
|
|
178
|
+
logger.trace('[gradio] progress setup', {
|
|
179
|
+
hasExtra: Boolean(extra),
|
|
180
|
+
progressToken: progressToken ?? null,
|
|
181
|
+
hasSignal: Boolean(extra?.signal),
|
|
182
|
+
});
|
|
107
183
|
let progressRelayDisabled = false;
|
|
108
184
|
const sendProgressNotification = async (progress) => {
|
|
109
185
|
if (!extra || progressRelayDisabled)
|
|
110
186
|
return;
|
|
111
187
|
if (extra.signal?.aborted) {
|
|
112
188
|
progressRelayDisabled = true;
|
|
189
|
+
logger.trace('[gradio] progress relay aborted', {
|
|
190
|
+
progressToken: progressToken ?? null,
|
|
191
|
+
});
|
|
113
192
|
return;
|
|
114
193
|
}
|
|
115
194
|
try {
|
|
195
|
+
logger.trace('[gradio] relaying progress', {
|
|
196
|
+
progressToken: progressToken ?? null,
|
|
197
|
+
progress,
|
|
198
|
+
});
|
|
116
199
|
const params = {
|
|
117
200
|
progressToken: progressToken,
|
|
118
201
|
progress: progress.progress ?? 0,
|
|
@@ -130,16 +213,30 @@ export async function callGradioToolWithHeaders(sseUrl, toolName, parameters, hf
|
|
|
130
213
|
}
|
|
131
214
|
catch {
|
|
132
215
|
progressRelayDisabled = true;
|
|
216
|
+
logger.trace('[gradio] progress relay failed', {
|
|
217
|
+
progressToken: progressToken ?? null,
|
|
218
|
+
});
|
|
133
219
|
options.onProgressRelayFailure?.();
|
|
134
220
|
}
|
|
135
221
|
};
|
|
136
222
|
const requestOptions = {};
|
|
137
223
|
if (progressToken !== undefined && extra) {
|
|
138
224
|
requestOptions.onprogress = (progress) => {
|
|
225
|
+
logger.trace('[gradio] upstream progress event', {
|
|
226
|
+
progressToken: progressToken ?? null,
|
|
227
|
+
progress,
|
|
228
|
+
});
|
|
139
229
|
void sendProgressNotification(progress);
|
|
140
230
|
};
|
|
141
231
|
requestOptions.resetTimeoutOnProgress = true;
|
|
142
232
|
}
|
|
233
|
+
else {
|
|
234
|
+
logger.trace('[gradio] progress relay disabled', {
|
|
235
|
+
progressToken: progressToken ?? null,
|
|
236
|
+
hasExtra: Boolean(extra),
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
logger.trace('[gradio] sending tool request', { toolName, hasProgressToken: progressToken !== undefined });
|
|
143
240
|
const result = await remoteClient.request({
|
|
144
241
|
method: 'tools/call',
|
|
145
242
|
params: {
|
|
@@ -148,11 +245,13 @@ export async function callGradioToolWithHeaders(sseUrl, toolName, parameters, hf
|
|
|
148
245
|
_meta: progressToken !== undefined ? { progressToken } : undefined,
|
|
149
246
|
},
|
|
150
247
|
}, CallToolResultSchema, requestOptions);
|
|
248
|
+
logger.trace('[gradio] tool request completed', { toolName, isError: result.isError });
|
|
151
249
|
const proxiedReplica = capturedHeaders['x-proxied-replica'];
|
|
152
250
|
const rewritten = rewriteReplicaUrlsInResult(result, proxiedReplica);
|
|
153
251
|
return { result: rewritten, capturedHeaders };
|
|
154
252
|
}
|
|
155
253
|
finally {
|
|
254
|
+
isClosing = true;
|
|
156
255
|
await remoteClient.close();
|
|
157
256
|
}
|
|
158
257
|
}
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"gradio-caller.js","sourceRoot":"","sources":["../../../src/space/utils/gradio-caller.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@llmindset/hf-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@huggingface/hub": "^2.6.12",
|
|
27
27
|
"@mcp-ui/server": "^5.12.0",
|
|
28
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
28
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
29
29
|
"shell-quote": "^1.8.3",
|
|
30
30
|
"turndown": "^7.2.0",
|
|
31
31
|
"zod": "^3.24.4"
|
package/src/logger.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent';
|
|
2
|
+
|
|
3
|
+
export interface Logger {
|
|
4
|
+
trace: (...args: unknown[]) => void;
|
|
5
|
+
debug: (...args: unknown[]) => void;
|
|
6
|
+
info: (...args: unknown[]) => void;
|
|
7
|
+
warn: (...args: unknown[]) => void;
|
|
8
|
+
error: (...args: unknown[]) => void;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const LOG_LEVELS: Record<LogLevel, number> = {
|
|
12
|
+
trace: 0,
|
|
13
|
+
debug: 1,
|
|
14
|
+
info: 2,
|
|
15
|
+
warn: 3,
|
|
16
|
+
error: 4,
|
|
17
|
+
silent: 5,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
function normalizeLogLevel(value: string | undefined): LogLevel {
|
|
21
|
+
if (!value) return 'info';
|
|
22
|
+
const normalized = value.toLowerCase();
|
|
23
|
+
if (normalized in LOG_LEVELS) {
|
|
24
|
+
return normalized as LogLevel;
|
|
25
|
+
}
|
|
26
|
+
return 'info';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const ACTIVE_LEVEL = normalizeLogLevel(process.env.LOG_LEVEL);
|
|
30
|
+
|
|
31
|
+
function shouldLog(level: LogLevel): boolean {
|
|
32
|
+
return LOG_LEVELS[level] >= LOG_LEVELS[ACTIVE_LEVEL];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const logger: Logger = {
|
|
36
|
+
trace: (...args) => {
|
|
37
|
+
if (shouldLog('trace')) {
|
|
38
|
+
console.debug(...args);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
debug: (...args) => {
|
|
42
|
+
if (shouldLog('debug')) {
|
|
43
|
+
console.debug(...args);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
info: (...args) => {
|
|
47
|
+
if (shouldLog('info')) {
|
|
48
|
+
console.info(...args);
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
warn: (...args) => {
|
|
52
|
+
if (shouldLog('warn')) {
|
|
53
|
+
console.warn(...args);
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
error: (...args) => {
|
|
57
|
+
if (shouldLog('error')) {
|
|
58
|
+
console.error(...args);
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
};
|
|
@@ -87,21 +87,21 @@ export async function invokeSpace(
|
|
|
87
87
|
// Step 7: Apply default values for missing optional parameters
|
|
88
88
|
const finalParameters = applyDefaults(inputParameters, schemaResult);
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
90
|
+
// Step 8: Create Streamable HTTP connection and invoke tool (shared helper)
|
|
91
|
+
const mcpUrl = `https://${metadata.subdomain}.hf.space/gradio_api/mcp/`;
|
|
92
|
+
const { result } = await callGradioToolWithHeaders(mcpUrl, tool.name, finalParameters, hfToken, extra, {
|
|
93
|
+
logProxiedReplica: true,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
// Return raw MCP result with warnings if any
|
|
97
|
+
// This ensures the space tool behaves identically to proxied gr_* tools
|
|
98
|
+
return {
|
|
99
|
+
result,
|
|
100
|
+
warnings,
|
|
101
|
+
totalResults: 1,
|
|
102
|
+
resultsShared: 1,
|
|
103
|
+
isError: result.isError,
|
|
104
|
+
};
|
|
105
105
|
} catch (error) {
|
|
106
106
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
107
107
|
return {
|
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
StreamableHTTPClientTransport,
|
|
4
|
+
type StreamableHTTPClientTransportOptions,
|
|
5
|
+
} from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
3
6
|
import { CallToolResultSchema, type CallToolResult, type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
-
import type
|
|
7
|
+
import { Protocol, type RequestHandlerExtra, type RequestOptions } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
8
|
+
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
9
|
+
import { logger } from '../../logger.js';
|
|
10
|
+
|
|
11
|
+
class GradioClient extends Client {
|
|
12
|
+
override async connect(transport: Transport, _options?: RequestOptions): Promise<void> {
|
|
13
|
+
await Protocol.prototype.connect.call(this, transport);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
5
16
|
|
|
6
17
|
export interface GradioCallResult {
|
|
7
18
|
result: CallToolResult;
|
|
@@ -80,11 +91,11 @@ export function rewriteReplicaUrlsInResult(
|
|
|
80
91
|
}
|
|
81
92
|
|
|
82
93
|
/**
|
|
83
|
-
* Shared helper to call a Gradio MCP tool over
|
|
84
|
-
* This handles
|
|
94
|
+
* Shared helper to call a Gradio MCP tool over Streamable HTTP, capturing response headers (including X-Proxied-Replica).
|
|
95
|
+
* This handles Streamable HTTP setup, optional progress relay, and cleans up the client connection.
|
|
85
96
|
*/
|
|
86
97
|
export async function callGradioToolWithHeaders(
|
|
87
|
-
|
|
98
|
+
mcpUrl: string,
|
|
88
99
|
toolName: string,
|
|
89
100
|
parameters: Record<string, unknown>,
|
|
90
101
|
hfToken: string | undefined,
|
|
@@ -105,66 +116,134 @@ export async function callGradioToolWithHeaders(
|
|
|
105
116
|
options.onHeaders?.(headers);
|
|
106
117
|
};
|
|
107
118
|
|
|
108
|
-
const captureHeadersFetch:
|
|
119
|
+
const captureHeadersFetch: StreamableHTTPClientTransportOptions['fetch'] = async (url, init) => {
|
|
120
|
+
const method = init?.method ?? 'GET';
|
|
121
|
+
let requestSummary: {
|
|
122
|
+
method?: unknown;
|
|
123
|
+
id?: unknown;
|
|
124
|
+
progressToken?: unknown;
|
|
125
|
+
isBatch?: boolean;
|
|
126
|
+
} | null = null;
|
|
127
|
+
if (typeof init?.body === 'string') {
|
|
128
|
+
try {
|
|
129
|
+
const parsed = JSON.parse(init.body) as
|
|
130
|
+
| { method?: unknown; id?: unknown; params?: { _meta?: { progressToken?: unknown } } }
|
|
131
|
+
| Array<{ method?: unknown; id?: unknown; params?: { _meta?: { progressToken?: unknown } } }>;
|
|
132
|
+
if (Array.isArray(parsed)) {
|
|
133
|
+
requestSummary = {
|
|
134
|
+
isBatch: true,
|
|
135
|
+
method: parsed[0]?.method,
|
|
136
|
+
id: parsed[0]?.id,
|
|
137
|
+
progressToken: parsed[0]?.params?._meta?.progressToken,
|
|
138
|
+
};
|
|
139
|
+
} else if (parsed && typeof parsed === 'object') {
|
|
140
|
+
requestSummary = {
|
|
141
|
+
isBatch: false,
|
|
142
|
+
method: parsed.method,
|
|
143
|
+
id: parsed.id,
|
|
144
|
+
progressToken: parsed.params?._meta?.progressToken,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
} catch {
|
|
148
|
+
requestSummary = null;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
logger.trace('[gradio] upstream fetch', {
|
|
152
|
+
method,
|
|
153
|
+
url: url.toString(),
|
|
154
|
+
hasBody: Boolean(init?.body),
|
|
155
|
+
requestSummary,
|
|
156
|
+
});
|
|
109
157
|
const response = await fetch(url, init);
|
|
158
|
+
logger.trace('[gradio] upstream response', {
|
|
159
|
+
method,
|
|
160
|
+
url: url.toString(),
|
|
161
|
+
status: response.status,
|
|
162
|
+
contentType: response.headers.get('content-type') ?? null,
|
|
163
|
+
mcpSessionId: response.headers.get('mcp-session-id') ?? null,
|
|
164
|
+
});
|
|
110
165
|
handleHeaders(response.headers);
|
|
111
166
|
return response;
|
|
112
167
|
};
|
|
113
168
|
|
|
114
|
-
|
|
115
|
-
const buildEventSourceFetch =
|
|
116
|
-
(extraHeaders?: Record<string, string>): EventSourceFetch =>
|
|
117
|
-
(url, init) => {
|
|
118
|
-
const headers = new Headers(init?.headers);
|
|
119
|
-
if (extraHeaders) {
|
|
120
|
-
Object.entries(extraHeaders).forEach(([key, value]) => headers.set(key, value));
|
|
121
|
-
}
|
|
122
|
-
const requestInit: RequestInit = { ...(init as RequestInit), headers };
|
|
123
|
-
return captureHeadersFetch(url.toString(), requestInit);
|
|
124
|
-
};
|
|
169
|
+
const skipInitialize = process.env.GRADIO_SKIP_INITIALIZE === 'true';
|
|
125
170
|
|
|
126
171
|
// Create MCP client
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
{
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
172
|
+
const clientInfo = {
|
|
173
|
+
name: 'hf-mcp-gradio-client',
|
|
174
|
+
version: '1.0.0',
|
|
175
|
+
};
|
|
176
|
+
const clientOptions = {
|
|
177
|
+
capabilities: {},
|
|
178
|
+
};
|
|
179
|
+
const remoteClient = skipInitialize
|
|
180
|
+
? new GradioClient(clientInfo, clientOptions)
|
|
181
|
+
: new Client(clientInfo, clientOptions);
|
|
136
182
|
|
|
137
|
-
// Create
|
|
138
|
-
const transportOptions:
|
|
183
|
+
// Create Streamable HTTP transport with HF token if available
|
|
184
|
+
const transportOptions: StreamableHTTPClientTransportOptions = {
|
|
139
185
|
fetch: captureHeadersFetch,
|
|
140
186
|
};
|
|
141
187
|
if (hfToken) {
|
|
142
|
-
const headerName = 'X-HF-Authorization';
|
|
143
188
|
const customHeaders = {
|
|
144
|
-
|
|
189
|
+
'X-HF-Authorization': `Bearer ${hfToken}`,
|
|
145
190
|
};
|
|
146
191
|
|
|
147
|
-
// Headers for
|
|
192
|
+
// Headers for Streamable HTTP requests
|
|
148
193
|
transportOptions.requestInit = {
|
|
149
194
|
headers: customHeaders,
|
|
150
195
|
};
|
|
151
|
-
|
|
152
|
-
// Headers for SSE connection
|
|
153
|
-
transportOptions.eventSourceInit = {
|
|
154
|
-
fetch: buildEventSourceFetch(customHeaders),
|
|
155
|
-
};
|
|
156
|
-
} else {
|
|
157
|
-
transportOptions.eventSourceInit = {
|
|
158
|
-
fetch: buildEventSourceFetch(),
|
|
159
|
-
};
|
|
160
196
|
}
|
|
161
197
|
|
|
162
|
-
|
|
198
|
+
logger.trace('[gradio] connecting streamable client', {
|
|
199
|
+
mcpUrl,
|
|
200
|
+
hasToken: Boolean(hfToken),
|
|
201
|
+
skipInitialize,
|
|
202
|
+
});
|
|
203
|
+
const transport = new StreamableHTTPClientTransport(new URL(mcpUrl), transportOptions);
|
|
204
|
+
let isClosing = false;
|
|
205
|
+
transport.onmessage = (message) => {
|
|
206
|
+
const messageInfo =
|
|
207
|
+
message && typeof message === 'object'
|
|
208
|
+
? {
|
|
209
|
+
hasId: 'id' in message,
|
|
210
|
+
id: (message as { id?: unknown }).id ?? null,
|
|
211
|
+
method: 'method' in message ? (message as { method?: unknown }).method : null,
|
|
212
|
+
isResult: 'result' in message,
|
|
213
|
+
isError: 'error' in message,
|
|
214
|
+
}
|
|
215
|
+
: { messageType: typeof message };
|
|
216
|
+
logger.trace('[gradio] transport message', messageInfo);
|
|
217
|
+
};
|
|
218
|
+
transport.onerror = (error) => {
|
|
219
|
+
if (isClosing && error instanceof Error && error.message.includes('AbortError')) {
|
|
220
|
+
logger.trace('[gradio] transport aborted after close', { message: error.message });
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
logger.trace('[gradio] transport error', { error });
|
|
224
|
+
};
|
|
225
|
+
transport.onclose = () => {
|
|
226
|
+
logger.trace('[gradio] transport closed');
|
|
227
|
+
};
|
|
228
|
+
let connectCompleted = false;
|
|
229
|
+
const connectWatchdog = setTimeout(() => {
|
|
230
|
+
if (!connectCompleted) {
|
|
231
|
+
logger.trace('[gradio] connect still pending', { mcpUrl });
|
|
232
|
+
}
|
|
233
|
+
}, 15000);
|
|
163
234
|
await remoteClient.connect(transport);
|
|
235
|
+
connectCompleted = true;
|
|
236
|
+
clearTimeout(connectWatchdog);
|
|
237
|
+
logger.trace('[gradio] connected streamable client', { mcpUrl });
|
|
164
238
|
|
|
165
239
|
try {
|
|
166
240
|
// Check if the client is requesting progress notifications
|
|
167
241
|
const progressToken = extra?._meta?.progressToken;
|
|
242
|
+
logger.trace('[gradio] progress setup', {
|
|
243
|
+
hasExtra: Boolean(extra),
|
|
244
|
+
progressToken: progressToken ?? null,
|
|
245
|
+
hasSignal: Boolean(extra?.signal),
|
|
246
|
+
});
|
|
168
247
|
|
|
169
248
|
// Track whether we've seen a transport closure to avoid noisy retries
|
|
170
249
|
let progressRelayDisabled = false;
|
|
@@ -173,9 +252,16 @@ export async function callGradioToolWithHeaders(
|
|
|
173
252
|
if (!extra || progressRelayDisabled) return;
|
|
174
253
|
if (extra.signal?.aborted) {
|
|
175
254
|
progressRelayDisabled = true;
|
|
255
|
+
logger.trace('[gradio] progress relay aborted', {
|
|
256
|
+
progressToken: progressToken ?? null,
|
|
257
|
+
});
|
|
176
258
|
return;
|
|
177
259
|
}
|
|
178
260
|
try {
|
|
261
|
+
logger.trace('[gradio] relaying progress', {
|
|
262
|
+
progressToken: progressToken ?? null,
|
|
263
|
+
progress,
|
|
264
|
+
});
|
|
179
265
|
const params: {
|
|
180
266
|
progressToken: number;
|
|
181
267
|
progress: number;
|
|
@@ -198,6 +284,9 @@ export async function callGradioToolWithHeaders(
|
|
|
198
284
|
} catch {
|
|
199
285
|
// The underlying transport has likely closed (e.g., client disconnected); disable further relays.
|
|
200
286
|
progressRelayDisabled = true;
|
|
287
|
+
logger.trace('[gradio] progress relay failed', {
|
|
288
|
+
progressToken: progressToken ?? null,
|
|
289
|
+
});
|
|
201
290
|
options.onProgressRelayFailure?.();
|
|
202
291
|
}
|
|
203
292
|
};
|
|
@@ -207,11 +296,21 @@ export async function callGradioToolWithHeaders(
|
|
|
207
296
|
if (progressToken !== undefined && extra) {
|
|
208
297
|
// Fire-and-forget; best-effort relay
|
|
209
298
|
requestOptions.onprogress = (progress) => {
|
|
299
|
+
logger.trace('[gradio] upstream progress event', {
|
|
300
|
+
progressToken: progressToken ?? null,
|
|
301
|
+
progress,
|
|
302
|
+
});
|
|
210
303
|
void sendProgressNotification(progress);
|
|
211
304
|
};
|
|
212
305
|
requestOptions.resetTimeoutOnProgress = true;
|
|
306
|
+
} else {
|
|
307
|
+
logger.trace('[gradio] progress relay disabled', {
|
|
308
|
+
progressToken: progressToken ?? null,
|
|
309
|
+
hasExtra: Boolean(extra),
|
|
310
|
+
});
|
|
213
311
|
}
|
|
214
312
|
|
|
313
|
+
logger.trace('[gradio] sending tool request', { toolName, hasProgressToken: progressToken !== undefined });
|
|
215
314
|
const result = await remoteClient.request(
|
|
216
315
|
{
|
|
217
316
|
method: 'tools/call',
|
|
@@ -224,12 +323,14 @@ export async function callGradioToolWithHeaders(
|
|
|
224
323
|
CallToolResultSchema,
|
|
225
324
|
requestOptions
|
|
226
325
|
);
|
|
326
|
+
logger.trace('[gradio] tool request completed', { toolName, isError: result.isError });
|
|
227
327
|
|
|
228
328
|
const proxiedReplica = capturedHeaders['x-proxied-replica'];
|
|
229
329
|
const rewritten = rewriteReplicaUrlsInResult(result, proxiedReplica);
|
|
230
330
|
|
|
231
331
|
return { result: rewritten, capturedHeaders };
|
|
232
332
|
} finally {
|
|
333
|
+
isClosing = true;
|
|
233
334
|
await remoteClient.close();
|
|
234
335
|
}
|
|
235
336
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeAll } from 'vitest';
|
|
2
2
|
|
|
3
|
-
// Stub out the
|
|
4
|
-
vi.mock('@modelcontextprotocol/sdk/client/
|
|
5
|
-
class
|
|
3
|
+
// Stub out the Streamable HTTP transport to simulate progress + response without network.
|
|
4
|
+
vi.mock('@modelcontextprotocol/sdk/client/streamableHttp.js', () => {
|
|
5
|
+
class FakeStreamableHTTPClientTransport {
|
|
6
6
|
onmessage?: (msg: unknown) => void;
|
|
7
7
|
onclose?: () => void;
|
|
8
8
|
onerror?: (err: unknown) => void;
|
|
@@ -41,7 +41,7 @@ vi.mock('@modelcontextprotocol/sdk/client/sse.js', () => {
|
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
return {
|
|
44
|
+
return { StreamableHTTPClientTransport: FakeStreamableHTTPClientTransport };
|
|
45
45
|
});
|
|
46
46
|
|
|
47
47
|
let callGradioToolWithHeaders: typeof import('../src/space/utils/gradio-caller.js').callGradioToolWithHeaders;
|
|
@@ -63,7 +63,7 @@ describe('callGradioToolWithHeaders progress relay', () => {
|
|
|
63
63
|
};
|
|
64
64
|
|
|
65
65
|
const { result } = await callGradioToolWithHeaders(
|
|
66
|
-
'http://fake-
|
|
66
|
+
'http://fake-mcp.local/gradio_api/mcp/',
|
|
67
67
|
'tools/call',
|
|
68
68
|
{},
|
|
69
69
|
undefined,
|