evalstate/sandbox-testing-2 / hf-mcp-server /packages /app /dist /server /utils /streamable-http-tool-caller.js
evalstate's picture
download
raw
5.79 kB
import { CallToolResultSchema, ReadResourceResultSchema } from '@modelcontextprotocol/sdk/types.js';
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
import { fetchWithProfile, NETWORK_FETCH_PROFILES, parseAndValidateUrl } from '@llmindset/hf-mcp/network';
import { logger } from './logger.js';
const PROXY_STREAMABLE_PROFILE = NETWORK_FETCH_PROFILES.streamableProxy();
function buildAuthHeaders(hfToken) {
if (!hfToken) {
return undefined;
}
return {
Authorization: `Bearer ${hfToken}`,
'X-HF-Authorization': `Bearer ${hfToken}`,
};
}
export async function callStreamableHttpTool(serverUrl, toolName, parameters, hfToken, extra) {
logger.trace({
serverUrl,
toolName,
hasToken: Boolean(hfToken),
paramKeys: Object.keys(parameters ?? {}),
}, 'Streamable proxy calling upstream tool');
logger.info({ serverUrl, toolName, params: parameters }, 'Calling Streamable HTTP tool');
const validatedServerUrl = parseAndValidateUrl(serverUrl, PROXY_STREAMABLE_PROFILE.urlPolicy);
const client = new Client({
name: 'hf-mcp-streamable-client',
version: '1.0.0',
}, {
capabilities: {},
});
const headers = buildAuthHeaders(hfToken);
const transport = new StreamableHTTPClientTransport(validatedServerUrl, {
requestInit: headers ? { headers } : undefined,
fetch: async (url, init) => {
const { response } = await fetchWithProfile(url.toString(), PROXY_STREAMABLE_PROFILE, {
requestInit: init,
});
return response;
},
});
await client.connect(transport);
logger.trace({ serverUrl }, 'Streamable proxy connected upstream');
try {
const progressToken = extra?._meta?.progressToken;
logger.trace({ progressToken: progressToken ?? null }, 'Streamable proxy progress token from client');
let progressRelayDisabled = false;
const sendProgressNotification = async (progress) => {
if (!extra || progressRelayDisabled) {
return;
}
if (extra.signal?.aborted) {
progressRelayDisabled = true;
return;
}
if (progressToken === undefined) {
return;
}
logger.trace({
progressToken,
progress,
}, 'Streamable proxy upstream progress event');
try {
const params = {
progressToken,
progress: progress.progress ?? 0,
};
if (progress.total !== undefined) {
params.total = progress.total;
}
if (progress.message !== undefined) {
params.message = progress.message;
}
await extra.sendNotification({
method: 'notifications/progress',
params,
});
}
catch (error) {
progressRelayDisabled = true;
logger.trace({ error }, 'Streamable proxy progress relay failed');
logger.debug({ error }, 'Failed to relay Streamable HTTP progress notification');
}
};
const requestOptions = {};
if (progressToken !== undefined && extra) {
requestOptions.onprogress = (progress) => {
void sendProgressNotification(progress);
};
requestOptions.resetTimeoutOnProgress = true;
}
else {
logger.trace({
hasExtra: Boolean(extra),
progressToken: progressToken ?? null,
}, 'Streamable proxy progress relay disabled');
}
const result = await client.request({
method: 'tools/call',
params: {
name: toolName,
arguments: parameters,
_meta: progressToken !== undefined ? { progressToken } : undefined,
},
}, CallToolResultSchema, requestOptions);
logger.trace({
serverUrl,
toolName,
}, 'Streamable proxy upstream tool result received');
return result;
}
finally {
await client.close();
}
}
export async function readStreamableHttpResource(serverUrl, resourceUri, hfToken) {
logger.trace({
serverUrl,
resourceUri,
hasToken: Boolean(hfToken),
}, 'Streamable proxy reading upstream resource');
const validatedServerUrl = parseAndValidateUrl(serverUrl, PROXY_STREAMABLE_PROFILE.urlPolicy);
const client = new Client({
name: 'hf-mcp-streamable-client',
version: '1.0.0',
}, {
capabilities: {},
});
const headers = buildAuthHeaders(hfToken);
const transport = new StreamableHTTPClientTransport(validatedServerUrl, {
requestInit: headers ? { headers } : undefined,
fetch: async (url, init) => {
const { response } = await fetchWithProfile(url.toString(), PROXY_STREAMABLE_PROFILE, {
requestInit: init,
});
return response;
},
});
await client.connect(transport);
logger.trace({ serverUrl, resourceUri }, 'Streamable proxy connected upstream for resource read');
try {
return await client.request({
method: 'resources/read',
params: {
uri: resourceUri,
},
}, ReadResourceResultSchema);
}
finally {
await client.close();
}
}
//# sourceMappingURL=streamable-http-tool-caller.js.map

Xet Storage Details

Size:
5.79 kB
·
Xet hash:
5cabd2e65ec0d68a1518f090cb4b295d06865eb45f8c01a56d746c23ac12a561

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.