@llmindset/hf-mcp 0.2.41 → 0.2.43
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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/space/commands/invoke.d.ts +6 -0
- package/dist/space/commands/invoke.d.ts.map +1 -0
- package/dist/space/commands/invoke.js +236 -0
- package/dist/space/commands/invoke.js.map +1 -0
- package/dist/space/commands/view-parameters.d.ts +3 -0
- package/dist/space/commands/view-parameters.d.ts.map +1 -0
- package/dist/space/commands/view-parameters.js +144 -0
- package/dist/space/commands/view-parameters.js.map +1 -0
- package/dist/space/space-tool.d.ts +35 -0
- package/dist/space/space-tool.d.ts.map +1 -0
- package/dist/space/space-tool.js +198 -0
- package/dist/space/space-tool.js.map +1 -0
- package/dist/space/types.d.ts +74 -0
- package/dist/space/types.d.ts.map +1 -0
- package/dist/space/types.js +24 -0
- package/dist/space/types.js.map +1 -0
- package/dist/space/utils/parameter-formatter.d.ts +5 -0
- package/dist/space/utils/parameter-formatter.d.ts.map +1 -0
- package/dist/space/utils/parameter-formatter.js +132 -0
- package/dist/space/utils/parameter-formatter.js.map +1 -0
- package/dist/space/utils/result-formatter.d.ts +4 -0
- package/dist/space/utils/result-formatter.d.ts.map +1 -0
- package/dist/space/utils/result-formatter.js +146 -0
- package/dist/space/utils/result-formatter.js.map +1 -0
- package/dist/space/utils/schema-validator.d.ts +9 -0
- package/dist/space/utils/schema-validator.d.ts.map +1 -0
- package/dist/space/utils/schema-validator.js +145 -0
- package/dist/space/utils/schema-validator.js.map +1 -0
- package/dist/space-search.d.ts.map +1 -1
- package/dist/space-search.js +5 -4
- package/dist/space-search.js.map +1 -1
- package/dist/tool-ids.d.ts +4 -2
- package/dist/tool-ids.d.ts.map +1 -1
- package/dist/tool-ids.js +4 -1
- package/dist/tool-ids.js.map +1 -1
- package/package.json +2 -1
- package/src/index.ts +1 -0
- package/src/space/commands/invoke.ts +335 -0
- package/src/space/commands/view-parameters.ts +204 -0
- package/src/space/space-tool.ts +252 -0
- package/src/space/types.ts +127 -0
- package/src/space/utils/parameter-formatter.ts +200 -0
- package/src/space/utils/result-formatter.ts +226 -0
- package/src/space/utils/schema-validator.ts +232 -0
- package/src/space-search.ts +5 -4
- package/src/tool-ids.ts +4 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { isFileDataProperty } from '../types.js';
|
|
2
|
+
export function analyzeSchemaComplexity(tool) {
|
|
3
|
+
const result = {
|
|
4
|
+
isSimple: true,
|
|
5
|
+
parameters: [],
|
|
6
|
+
toolName: tool.name,
|
|
7
|
+
toolDescription: tool.description,
|
|
8
|
+
};
|
|
9
|
+
const inputSchema = tool.inputSchema;
|
|
10
|
+
if (!inputSchema || !inputSchema.properties) {
|
|
11
|
+
return result;
|
|
12
|
+
}
|
|
13
|
+
const properties = inputSchema.properties;
|
|
14
|
+
const required = inputSchema.required || [];
|
|
15
|
+
for (const [paramName, prop] of Object.entries(properties)) {
|
|
16
|
+
const paramInfo = analyzeProperty(paramName, prop, required.includes(paramName));
|
|
17
|
+
if (paramInfo.complexType) {
|
|
18
|
+
result.isSimple = false;
|
|
19
|
+
result.reason = `Parameter "${paramName}" has complex type: ${paramInfo.complexType}`;
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
result.parameters.push(paramInfo);
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
function analyzeProperty(name, prop, isRequired) {
|
|
27
|
+
const paramInfo = {
|
|
28
|
+
name,
|
|
29
|
+
type: prop.type || 'unknown',
|
|
30
|
+
description: prop.description,
|
|
31
|
+
required: isRequired,
|
|
32
|
+
default: prop.default,
|
|
33
|
+
enum: prop.enum,
|
|
34
|
+
};
|
|
35
|
+
if (isFileDataProperty(prop)) {
|
|
36
|
+
paramInfo.type = 'string (file URL)';
|
|
37
|
+
paramInfo.isFileData = true;
|
|
38
|
+
return paramInfo;
|
|
39
|
+
}
|
|
40
|
+
if (prop.enum && Array.isArray(prop.enum) && prop.enum.length > 0) {
|
|
41
|
+
paramInfo.type = `enum (${prop.enum.length} values)`;
|
|
42
|
+
return paramInfo;
|
|
43
|
+
}
|
|
44
|
+
if (prop.type === 'object') {
|
|
45
|
+
if (prop.properties) {
|
|
46
|
+
const nestedProps = Object.values(prop.properties);
|
|
47
|
+
const hasComplexNested = nestedProps.some((nested) => nested.type === 'object' || nested.type === 'array');
|
|
48
|
+
if (hasComplexNested) {
|
|
49
|
+
paramInfo.complexType = 'deeply nested object (2+ levels)';
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
paramInfo.type = 'object (shallow)';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
paramInfo.complexType = 'object without defined properties';
|
|
57
|
+
}
|
|
58
|
+
return paramInfo;
|
|
59
|
+
}
|
|
60
|
+
if (prop.type === 'array') {
|
|
61
|
+
if (prop.items) {
|
|
62
|
+
const itemType = prop.items.type;
|
|
63
|
+
if (itemType === 'object') {
|
|
64
|
+
paramInfo.complexType = 'array of objects';
|
|
65
|
+
}
|
|
66
|
+
else if (itemType === 'array') {
|
|
67
|
+
paramInfo.complexType = 'nested arrays';
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
paramInfo.type = `array<${itemType || 'unknown'}>`;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
paramInfo.type = 'array<any>';
|
|
75
|
+
}
|
|
76
|
+
return paramInfo;
|
|
77
|
+
}
|
|
78
|
+
if (['string', 'number', 'integer', 'boolean'].includes(prop.type || '')) {
|
|
79
|
+
return paramInfo;
|
|
80
|
+
}
|
|
81
|
+
if (!prop.type) {
|
|
82
|
+
paramInfo.complexType = 'unknown type';
|
|
83
|
+
}
|
|
84
|
+
return paramInfo;
|
|
85
|
+
}
|
|
86
|
+
export function validateParameters(parameters, schemaResult) {
|
|
87
|
+
const errors = [];
|
|
88
|
+
const requiredParams = schemaResult.parameters.filter((p) => p.required);
|
|
89
|
+
for (const param of requiredParams) {
|
|
90
|
+
if (!(param.name in parameters) || parameters[param.name] === undefined) {
|
|
91
|
+
errors.push(`Missing required parameter: "${param.name}"`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
for (const [key, value] of Object.entries(parameters)) {
|
|
95
|
+
const paramInfo = schemaResult.parameters.find((p) => p.name === key);
|
|
96
|
+
if (!paramInfo) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (value !== null && value !== undefined) {
|
|
100
|
+
if (!validateType(value, paramInfo)) {
|
|
101
|
+
errors.push(`Parameter "${key}" should be type ${paramInfo.type}, got ${typeof value}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
valid: errors.length === 0,
|
|
107
|
+
errors,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function validateType(value, paramInfo) {
|
|
111
|
+
if (paramInfo.isFileData) {
|
|
112
|
+
return typeof value === 'string';
|
|
113
|
+
}
|
|
114
|
+
if (paramInfo.enum && Array.isArray(paramInfo.enum)) {
|
|
115
|
+
return paramInfo.enum.includes(value);
|
|
116
|
+
}
|
|
117
|
+
const baseType = paramInfo.type.split(' ')[0]?.split('<')[0];
|
|
118
|
+
switch (baseType) {
|
|
119
|
+
case 'string':
|
|
120
|
+
return typeof value === 'string';
|
|
121
|
+
case 'number':
|
|
122
|
+
case 'integer':
|
|
123
|
+
return typeof value === 'number';
|
|
124
|
+
case 'boolean':
|
|
125
|
+
return typeof value === 'boolean';
|
|
126
|
+
case 'array':
|
|
127
|
+
return Array.isArray(value);
|
|
128
|
+
case 'object':
|
|
129
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
130
|
+
case 'enum':
|
|
131
|
+
return true;
|
|
132
|
+
default:
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
export function applyDefaults(parameters, schemaResult) {
|
|
137
|
+
const result = { ...parameters };
|
|
138
|
+
for (const param of schemaResult.parameters) {
|
|
139
|
+
if (!param.required && !(param.name in result) && param.default !== undefined) {
|
|
140
|
+
result[param.name] = param.default;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=schema-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../../../src/space/utils/schema-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"space-search.d.ts","sourceRoot":"","sources":["../src/space-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGzD,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,IAAI,CAAC;CACpB;AAGD,UAAU,iBAAiB;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"space-search.d.ts","sourceRoot":"","sources":["../src/space-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGzD,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,IAAI,CAAC;CACpB;AAGD,UAAU,iBAAiB;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;CAgB9B,CAAC;AAKX,qBAAa,eAAgB,SAAQ,SAAS,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;gBAMzE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,SAAsD;IAUpF,MAAM,CACX,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAA0B,EACjC,GAAG,GAAE,OAAe,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA6B1D,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,WAAW,GAAE,MAAU,GAAG,OAAO,CAAC,UAAU,CAAC;CA4BxG;AAGD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAAqC,CAAC;AAErE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,MAAM,CAAC,CAAC;AAO9E,eAAO,MAAM,mBAAmB,GAC/B,OAAO,MAAM,EACb,SAAS,iBAAiB,EAAE,EAC5B,YAAY,MAAM,EAClB,cAAa,MAAU,KACrB,UA0CF,CAAC"}
|
package/dist/space-search.js
CHANGED
|
@@ -4,7 +4,8 @@ import { escapeMarkdown } from './utilities.js';
|
|
|
4
4
|
const RESULTS_TO_RETURN = 10;
|
|
5
5
|
export const SEMANTIC_SEARCH_TOOL_CONFIG = {
|
|
6
6
|
name: 'space_search',
|
|
7
|
-
description: 'Find Hugging Face Spaces using semantic search.
|
|
7
|
+
description: 'Find Hugging Face Spaces using semantic search. IMPORTANT Only MCP Servers can be used with the dynamic_space tool' +
|
|
8
|
+
'Include links to the Space when presenting the results.',
|
|
8
9
|
schema: z.object({
|
|
9
10
|
query: z.string().min(1, 'Query is required').max(100, 'Query too long').describe('Semantic Search Query'),
|
|
10
11
|
limit: z.number().optional().default(RESULTS_TO_RETURN).describe('Number of results to return'),
|
|
@@ -52,7 +53,7 @@ export class SpaceSearchTool extends HfApiCall {
|
|
|
52
53
|
return {
|
|
53
54
|
formatted: `No matching Hugging Face Spaces found referencing ${filter}.`,
|
|
54
55
|
totalResults: 0,
|
|
55
|
-
resultsShared: 0
|
|
56
|
+
resultsShared: 0,
|
|
56
57
|
};
|
|
57
58
|
}
|
|
58
59
|
return formatSearchResults(filter, results, results.length, headerLevel);
|
|
@@ -71,7 +72,7 @@ export const formatSearchResults = (query, results, totalCount, headerLevel = 1)
|
|
|
71
72
|
return {
|
|
72
73
|
formatted: `No matching Hugging Face Spaces found for the query '${query}'. Try a different query.`,
|
|
73
74
|
totalResults: 0,
|
|
74
|
-
resultsShared: 0
|
|
75
|
+
resultsShared: 0,
|
|
75
76
|
};
|
|
76
77
|
}
|
|
77
78
|
const showingText = results.length < totalCount
|
|
@@ -101,7 +102,7 @@ export const formatSearchResults = (query, results, totalCount, headerLevel = 1)
|
|
|
101
102
|
return {
|
|
102
103
|
formatted: markdown,
|
|
103
104
|
totalResults: totalCount,
|
|
104
|
-
resultsShared: results.length
|
|
105
|
+
resultsShared: results.length,
|
|
105
106
|
};
|
|
106
107
|
};
|
|
107
108
|
//# sourceMappingURL=space-search.js.map
|
package/dist/space-search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"space-search.js","sourceRoot":"","sources":["../src/space-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AA6BhD,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,2BAA2B,GAAG;IAC1C,IAAI,EAAE,cAAc;IACpB,WAAW,EACV,
|
|
1
|
+
{"version":3,"file":"space-search.js","sourceRoot":"","sources":["../src/space-search.ts"],"names":[],"mappings":"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"}
|
package/dist/tool-ids.d.ts
CHANGED
|
@@ -16,14 +16,16 @@ export declare const PAPER_SUMMARY_PROMPT_ID: "Paper Summary";
|
|
|
16
16
|
export declare const MODEL_DETAIL_PROMPT_ID: string;
|
|
17
17
|
export declare const DATASET_DETAIL_PROMPT_ID: string;
|
|
18
18
|
export declare const HF_JOBS_TOOL_ID: "hf_jobs";
|
|
19
|
-
export declare const
|
|
19
|
+
export declare const DYNAMIC_SPACE_TOOL_ID: "dynamic_space";
|
|
20
|
+
export declare const ALL_BUILTIN_TOOL_IDS: readonly ["space_search", "model_search", "model_details", "paper_search", "dataset_search", "dataset_details", "hub_repo_details", "duplicate_space", "space_info", "space_files", "hf_doc_search", "hf_doc_fetch", "use_space", "hf_jobs", "dynamic_space"];
|
|
20
21
|
export declare const TOOL_ID_GROUPS: {
|
|
21
22
|
readonly search: readonly ["space_search", "model_search", "dataset_search", "paper_search", "hf_doc_search"];
|
|
22
23
|
readonly spaces: readonly ["space_search", "duplicate_space", "space_info", "space_files", "use_space"];
|
|
23
24
|
readonly detail: readonly ["model_details", "dataset_details", "hub_repo_details"];
|
|
24
25
|
readonly docs: readonly ["hf_doc_search", "hf_doc_fetch"];
|
|
25
26
|
readonly hf_api: readonly ["space_search", "model_search", "dataset_search", "paper_search", "hub_repo_details", "hf_doc_search"];
|
|
26
|
-
readonly
|
|
27
|
+
readonly dynamic_space: readonly ["dynamic_space"];
|
|
28
|
+
readonly all: readonly ["space_search", "model_search", "model_details", "paper_search", "dataset_search", "dataset_details", "hub_repo_details", "duplicate_space", "space_info", "space_files", "hf_doc_search", "hf_doc_fetch", "use_space", "hf_jobs", "dynamic_space"];
|
|
27
29
|
};
|
|
28
30
|
export type BuiltinToolId = (typeof ALL_BUILTIN_TOOL_IDS)[number];
|
|
29
31
|
export declare function isValidBuiltinToolId(toolId: string): toolId is BuiltinToolId;
|
package/dist/tool-ids.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-ids.d.ts","sourceRoot":"","sources":["../src/tool-ids.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool-ids.d.ts","sourceRoot":"","sources":["../src/tool-ids.ts"],"names":[],"mappings":"AA4BA,eAAO,MAAM,oBAAoB,gBAAmC,CAAC;AACrE,eAAO,MAAM,oBAAoB,gBAAgC,CAAC;AAClE,eAAO,MAAM,oBAAoB,iBAAgC,CAAC;AAClE,eAAO,MAAM,oBAAoB,gBAAgC,CAAC;AAClE,eAAO,MAAM,sBAAsB,kBAAkC,CAAC;AACtE,eAAO,MAAM,sBAAsB,mBAAkC,CAAC;AACtE,eAAO,MAAM,mBAAmB,oBAA+B,CAAC;AAChE,eAAO,MAAM,uBAAuB,mBAAmC,CAAC;AACxE,eAAO,MAAM,kBAAkB,cAA8B,CAAC;AAC9D,eAAO,MAAM,mBAAmB,eAA+B,CAAC;AAChE,eAAO,MAAM,iBAAiB,aAA6B,CAAC;AAC5D,eAAO,MAAM,4BAA4B,iBAAmC,CAAC;AAC7E,eAAO,MAAM,iBAAiB,gBAAwB,CAAC;AACvD,eAAO,MAAM,sBAAsB,gBAAkC,CAAC;AACtE,eAAO,MAAM,uBAAuB,iBAAmC,CAAC;AACxE,eAAO,MAAM,sBAAsB,QAAkC,CAAC;AACtE,eAAO,MAAM,wBAAwB,QAAoC,CAAC;AAC1E,eAAO,MAAM,eAAe,WAA2B,CAAC;AACxD,eAAO,MAAM,qBAAqB,iBAAiC,CAAC;AAGpE,eAAO,MAAM,oBAAoB,+PAgBvB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;;;;CA4BjB,CAAC;AAGX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAGlE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,aAAa,CAE5E"}
|
package/dist/tool-ids.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SEMANTIC_SEARCH_TOOL_CONFIG, MODEL_SEARCH_TOOL_CONFIG, MODEL_DETAIL_TOOL_CONFIG, MODEL_DETAIL_PROMPT_CONFIG, PAPER_SEARCH_TOOL_CONFIG, DATASET_SEARCH_TOOL_CONFIG, DATASET_DETAIL_TOOL_CONFIG, DATASET_DETAIL_PROMPT_CONFIG, HUB_INSPECT_TOOL_CONFIG, DUPLICATE_SPACE_TOOL_CONFIG, SPACE_INFO_TOOL_CONFIG, SPACE_FILES_TOOL_CONFIG, USER_SUMMARY_PROMPT_CONFIG, PAPER_SUMMARY_PROMPT_CONFIG, DOCS_SEMANTIC_SEARCH_CONFIG, DOC_FETCH_CONFIG, USE_SPACE_TOOL_CONFIG, HF_JOBS_TOOL_CONFIG, } from './index.js';
|
|
1
|
+
import { SEMANTIC_SEARCH_TOOL_CONFIG, MODEL_SEARCH_TOOL_CONFIG, MODEL_DETAIL_TOOL_CONFIG, MODEL_DETAIL_PROMPT_CONFIG, PAPER_SEARCH_TOOL_CONFIG, DATASET_SEARCH_TOOL_CONFIG, DATASET_DETAIL_TOOL_CONFIG, DATASET_DETAIL_PROMPT_CONFIG, HUB_INSPECT_TOOL_CONFIG, DUPLICATE_SPACE_TOOL_CONFIG, SPACE_INFO_TOOL_CONFIG, SPACE_FILES_TOOL_CONFIG, USER_SUMMARY_PROMPT_CONFIG, PAPER_SUMMARY_PROMPT_CONFIG, DOCS_SEMANTIC_SEARCH_CONFIG, DOC_FETCH_CONFIG, USE_SPACE_TOOL_CONFIG, HF_JOBS_TOOL_CONFIG, DYNAMIC_SPACE_TOOL_CONFIG, } from './index.js';
|
|
2
2
|
export const SPACE_SEARCH_TOOL_ID = SEMANTIC_SEARCH_TOOL_CONFIG.name;
|
|
3
3
|
export const MODEL_SEARCH_TOOL_ID = MODEL_SEARCH_TOOL_CONFIG.name;
|
|
4
4
|
export const MODEL_DETAIL_TOOL_ID = MODEL_DETAIL_TOOL_CONFIG.name;
|
|
@@ -17,6 +17,7 @@ export const PAPER_SUMMARY_PROMPT_ID = PAPER_SUMMARY_PROMPT_CONFIG.name;
|
|
|
17
17
|
export const MODEL_DETAIL_PROMPT_ID = MODEL_DETAIL_PROMPT_CONFIG.name;
|
|
18
18
|
export const DATASET_DETAIL_PROMPT_ID = DATASET_DETAIL_PROMPT_CONFIG.name;
|
|
19
19
|
export const HF_JOBS_TOOL_ID = HF_JOBS_TOOL_CONFIG.name;
|
|
20
|
+
export const DYNAMIC_SPACE_TOOL_ID = DYNAMIC_SPACE_TOOL_CONFIG.name;
|
|
20
21
|
export const ALL_BUILTIN_TOOL_IDS = [
|
|
21
22
|
SPACE_SEARCH_TOOL_ID,
|
|
22
23
|
MODEL_SEARCH_TOOL_ID,
|
|
@@ -32,6 +33,7 @@ export const ALL_BUILTIN_TOOL_IDS = [
|
|
|
32
33
|
DOC_FETCH_TOOL_ID,
|
|
33
34
|
USE_SPACE_TOOL_ID,
|
|
34
35
|
HF_JOBS_TOOL_ID,
|
|
36
|
+
DYNAMIC_SPACE_TOOL_ID,
|
|
35
37
|
];
|
|
36
38
|
export const TOOL_ID_GROUPS = {
|
|
37
39
|
search: [
|
|
@@ -58,6 +60,7 @@ export const TOOL_ID_GROUPS = {
|
|
|
58
60
|
HUB_INSPECT_TOOL_ID,
|
|
59
61
|
DOCS_SEMANTIC_SEARCH_TOOL_ID,
|
|
60
62
|
],
|
|
63
|
+
dynamic_space: [DYNAMIC_SPACE_TOOL_ID],
|
|
61
64
|
all: [...ALL_BUILTIN_TOOL_IDS],
|
|
62
65
|
};
|
|
63
66
|
export function isValidBuiltinToolId(toolId) {
|
package/dist/tool-ids.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-ids.js","sourceRoot":"","sources":["../src/tool-ids.ts"],"names":[],"mappings":"AAKA,OAAO,EACN,2BAA2B,EAC3B,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,EAC1B,4BAA4B,EAC5B,uBAAuB,EACvB,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,2BAA2B,EAC3B,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"tool-ids.js","sourceRoot":"","sources":["../src/tool-ids.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.2.
|
|
3
|
+
"version": "0.2.43",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@huggingface/hub": "^2.6.12",
|
|
27
27
|
"@mcp-ui/server": "^5.12.0",
|
|
28
|
+
"@modelcontextprotocol/sdk": "^1.20.0",
|
|
28
29
|
"shell-quote": "^1.8.3",
|
|
29
30
|
"turndown": "^7.2.0",
|
|
30
31
|
"zod": "^3.24.4"
|
package/src/index.ts
CHANGED
|
@@ -20,6 +20,7 @@ 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
24
|
|
|
24
25
|
// Export shared types
|
|
25
26
|
export * from './types/tool-result.js';
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import type { ToolResult } from '../../types/tool-result.js';
|
|
2
|
+
import type { InvokeResult } from '../types.js';
|
|
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';
|
|
8
|
+
import { analyzeSchemaComplexity, validateParameters, applyDefaults } from '../utils/schema-validator.js';
|
|
9
|
+
import { formatComplexSchemaError, formatValidationError } from '../utils/parameter-formatter.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Invokes a Gradio space with provided parameters
|
|
13
|
+
* Returns raw MCP content blocks for compatibility with proxied gr_* tools
|
|
14
|
+
*/
|
|
15
|
+
export async function invokeSpace(
|
|
16
|
+
spaceName: string,
|
|
17
|
+
parametersJson: string,
|
|
18
|
+
hfToken?: string,
|
|
19
|
+
extra?: RequestHandlerExtra<ServerRequest, ServerNotification>
|
|
20
|
+
): Promise<InvokeResult | ToolResult> {
|
|
21
|
+
try {
|
|
22
|
+
// Step 1: Parse parameters JSON
|
|
23
|
+
let inputParameters: Record<string, unknown>;
|
|
24
|
+
try {
|
|
25
|
+
const parsed: unknown = JSON.parse(parametersJson);
|
|
26
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
27
|
+
throw new Error('Parameters must be a JSON object');
|
|
28
|
+
}
|
|
29
|
+
inputParameters = parsed as Record<string, unknown>;
|
|
30
|
+
} catch (error) {
|
|
31
|
+
return {
|
|
32
|
+
formatted: `Error: Invalid JSON in parameters.\n\nExpected format: {"param1": "value", "param2": 123}\nNote: Use double quotes, no trailing commas.\n\n${error instanceof Error ? error.message : String(error)}`,
|
|
33
|
+
totalResults: 0,
|
|
34
|
+
resultsShared: 0,
|
|
35
|
+
isError: true,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Step 2: Fetch space metadata to get subdomain
|
|
40
|
+
const metadata = await fetchSpaceMetadata(spaceName, hfToken);
|
|
41
|
+
|
|
42
|
+
// Step 3: Fetch schema from Gradio endpoint
|
|
43
|
+
const tools = await fetchGradioSchema(metadata.subdomain, metadata.private, hfToken);
|
|
44
|
+
|
|
45
|
+
if (tools.length === 0) {
|
|
46
|
+
return {
|
|
47
|
+
formatted: `Error: No tools found for space '${spaceName}'.`,
|
|
48
|
+
totalResults: 0,
|
|
49
|
+
resultsShared: 0,
|
|
50
|
+
isError: true,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const tool = tools[0] as Tool;
|
|
55
|
+
|
|
56
|
+
// Step 4: Analyze schema complexity
|
|
57
|
+
const schemaResult = analyzeSchemaComplexity(tool);
|
|
58
|
+
|
|
59
|
+
if (!schemaResult.isSimple) {
|
|
60
|
+
return {
|
|
61
|
+
formatted: formatComplexSchemaError(spaceName, schemaResult.reason || 'Unknown reason'),
|
|
62
|
+
totalResults: 0,
|
|
63
|
+
resultsShared: 0,
|
|
64
|
+
isError: true,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Step 5: Validate parameters
|
|
69
|
+
const validation = validateParameters(inputParameters, schemaResult);
|
|
70
|
+
if (!validation.valid) {
|
|
71
|
+
return {
|
|
72
|
+
formatted: formatValidationError(validation.errors, spaceName),
|
|
73
|
+
totalResults: 0,
|
|
74
|
+
resultsShared: 0,
|
|
75
|
+
isError: true,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Step 6: Check for unknown parameters (warnings)
|
|
80
|
+
const warnings: string[] = [];
|
|
81
|
+
const knownParamNames = new Set(schemaResult.parameters.map((p) => p.name));
|
|
82
|
+
for (const key of Object.keys(inputParameters)) {
|
|
83
|
+
if (!knownParamNames.has(key)) {
|
|
84
|
+
warnings.push(`Unknown parameter: "${key}" (will be passed through)`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Step 7: Apply default values for missing optional parameters
|
|
89
|
+
const finalParameters = applyDefaults(inputParameters, schemaResult);
|
|
90
|
+
|
|
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
|
+
);
|
|
129
|
+
|
|
130
|
+
// Return raw MCP result with warnings if any
|
|
131
|
+
// This ensures the space tool behaves identically to proxied gr_* tools
|
|
132
|
+
return {
|
|
133
|
+
result,
|
|
134
|
+
warnings,
|
|
135
|
+
totalResults: 1,
|
|
136
|
+
resultsShared: 1,
|
|
137
|
+
isError: result.isError,
|
|
138
|
+
};
|
|
139
|
+
} finally {
|
|
140
|
+
// Clean up connection
|
|
141
|
+
await client.close();
|
|
142
|
+
}
|
|
143
|
+
} catch (error) {
|
|
144
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
145
|
+
return {
|
|
146
|
+
formatted: `Error invoking space '${spaceName}': ${errorMessage}`,
|
|
147
|
+
totalResults: 0,
|
|
148
|
+
resultsShared: 0,
|
|
149
|
+
isError: true,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Fetches space metadata from HuggingFace API
|
|
156
|
+
*/
|
|
157
|
+
async function fetchSpaceMetadata(
|
|
158
|
+
spaceName: string,
|
|
159
|
+
hfToken?: string
|
|
160
|
+
): Promise<{ subdomain: string; private: boolean }> {
|
|
161
|
+
const url = `https://huggingface.co/api/spaces/${spaceName}`;
|
|
162
|
+
const headers: Record<string, string> = {};
|
|
163
|
+
|
|
164
|
+
if (hfToken) {
|
|
165
|
+
headers['Authorization'] = `Bearer ${hfToken}`;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const controller = new AbortController();
|
|
169
|
+
const timeoutId = setTimeout(() => controller.abort(), 10000);
|
|
170
|
+
|
|
171
|
+
try {
|
|
172
|
+
const response = await fetch(url, {
|
|
173
|
+
headers,
|
|
174
|
+
signal: controller.signal,
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
clearTimeout(timeoutId);
|
|
178
|
+
|
|
179
|
+
if (!response.ok) {
|
|
180
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const info = (await response.json()) as {
|
|
184
|
+
subdomain?: string;
|
|
185
|
+
private?: boolean;
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
if (!info.subdomain) {
|
|
189
|
+
throw new Error('Space does not have a subdomain');
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return {
|
|
193
|
+
subdomain: info.subdomain,
|
|
194
|
+
private: info.private || false,
|
|
195
|
+
};
|
|
196
|
+
} finally {
|
|
197
|
+
clearTimeout(timeoutId);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Fetches schema from Gradio endpoint
|
|
203
|
+
*/
|
|
204
|
+
async function fetchGradioSchema(subdomain: string, isPrivate: boolean, hfToken?: string): Promise<Tool[]> {
|
|
205
|
+
const schemaUrl = `https://${subdomain}.hf.space/gradio_api/mcp/schema`;
|
|
206
|
+
|
|
207
|
+
const headers: Record<string, string> = {
|
|
208
|
+
'Content-Type': 'application/json',
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
if (isPrivate && hfToken) {
|
|
212
|
+
headers['X-HF-Authorization'] = `Bearer ${hfToken}`;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const controller = new AbortController();
|
|
216
|
+
const timeoutId = setTimeout(() => controller.abort(), 10000);
|
|
217
|
+
|
|
218
|
+
try {
|
|
219
|
+
const response = await fetch(schemaUrl, {
|
|
220
|
+
method: 'GET',
|
|
221
|
+
headers,
|
|
222
|
+
signal: controller.signal,
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
clearTimeout(timeoutId);
|
|
226
|
+
|
|
227
|
+
if (!response.ok) {
|
|
228
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const schemaResponse = (await response.json()) as unknown;
|
|
232
|
+
|
|
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: {},
|
|
301
|
+
}
|
|
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
|
+
}
|
|
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
|
+
}
|