@llmindset/hf-mcp 0.1.17 → 0.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/docs-search/doc-fetch.d.ts +24 -0
  2. package/dist/docs-search/doc-fetch.d.ts.map +1 -0
  3. package/dist/docs-search/doc-fetch.js +53 -0
  4. package/dist/docs-search/doc-fetch.js.map +1 -0
  5. package/dist/docs-search/doc-fetch.test.d.ts +2 -0
  6. package/dist/docs-search/doc-fetch.test.d.ts.map +1 -0
  7. package/dist/docs-search/doc-fetch.test.js +52 -0
  8. package/dist/docs-search/doc-fetch.test.js.map +1 -0
  9. package/dist/docs-search/doc-mappings.d.ts +7 -0
  10. package/dist/docs-search/doc-mappings.d.ts.map +1 -0
  11. package/dist/docs-search/doc-mappings.js +75 -0
  12. package/dist/docs-search/doc-mappings.js.map +1 -0
  13. package/dist/docs-search/docs-semantic-search.d.ts +41 -0
  14. package/dist/docs-search/docs-semantic-search.d.ts.map +1 -0
  15. package/dist/docs-search/docs-semantic-search.js +162 -0
  16. package/dist/docs-search/docs-semantic-search.js.map +1 -0
  17. package/dist/docs-search/docs-semantic-search.test.d.ts +2 -0
  18. package/dist/docs-search/docs-semantic-search.test.d.ts.map +1 -0
  19. package/dist/docs-search/docs-semantic-search.test.js +283 -0
  20. package/dist/docs-search/docs-semantic-search.test.js.map +1 -0
  21. package/dist/index.d.ts +2 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +2 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/tool-ids.d.ts +6 -4
  26. package/dist/tool-ids.d.ts.map +1 -1
  27. package/dist/tool-ids.js +7 -16
  28. package/dist/tool-ids.js.map +1 -1
  29. package/package.json +2 -2
  30. package/src/docs-search/doc-fetch.test.ts +74 -0
  31. package/src/docs-search/doc-fetch.ts +92 -0
  32. package/src/docs-search/doc-mappings.ts +79 -0
  33. package/src/docs-search/docs-semantic-search.test.ts +365 -0
  34. package/src/docs-search/docs-semantic-search.ts +244 -0
  35. package/src/index.ts +2 -0
  36. package/src/tool-ids.ts +9 -18
@@ -0,0 +1,283 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { DocSearchTool } from './docs-semantic-search.js';
3
+ import { DOC_FETCH_CONFIG } from './doc-fetch.js';
4
+ const mockFetch = vi.fn();
5
+ global.fetch = mockFetch;
6
+ describe('DocSearchTool', () => {
7
+ let docSearchTool;
8
+ beforeEach(() => {
9
+ docSearchTool = new DocSearchTool();
10
+ vi.clearAllMocks();
11
+ });
12
+ describe('search', () => {
13
+ it('should return error when query is too short', async () => {
14
+ await expect(docSearchTool.search({ query: 'ab' })).rejects.toThrow();
15
+ });
16
+ it('should return no results message when API returns empty array', async () => {
17
+ mockFetch.mockResolvedValueOnce({
18
+ ok: true,
19
+ json: () => Promise.resolve([]),
20
+ });
21
+ const result = await docSearchTool.search({ query: 'nonexistent' });
22
+ expect(result).toBe(`No documentation found for query 'nonexistent'`);
23
+ });
24
+ it('should return no results message with product filter', async () => {
25
+ mockFetch.mockResolvedValueOnce({
26
+ ok: true,
27
+ json: () => Promise.resolve([]),
28
+ });
29
+ const result = await docSearchTool.search({ query: 'nonexistent', product: 'hub' });
30
+ expect(result).toBe(`No documentation found for query 'nonexistent' in product 'hub'`);
31
+ });
32
+ it('should format results grouped by product and page', async () => {
33
+ const sampleResults = [
34
+ {
35
+ text: 'Download a comprehensive CSV file containing analytics',
36
+ product: 'hub',
37
+ heading1: 'Analytics',
38
+ source_page_url: 'https://huggingface.co/docs/hub/enterprise-hub-analytics#export-analytics-as-csv',
39
+ source_page_title: 'Enterprise-hub-analytics',
40
+ heading2: 'Export Analytics as CSV',
41
+ },
42
+ {
43
+ text: 'View analytics for your repositories',
44
+ product: 'hub',
45
+ heading1: 'Analytics',
46
+ source_page_url: 'https://huggingface.co/docs/hub/enterprise-hub-analytics#export-analytics-as-csv',
47
+ source_page_title: 'Enterprise-hub-analytics',
48
+ heading2: 'View Analytics',
49
+ },
50
+ {
51
+ text: 'In this quickstart, you will learn how to use the dataset viewer REST API',
52
+ product: 'dataset-viewer',
53
+ heading1: 'Quickstart',
54
+ source_page_url: 'https://huggingface.co/docs/dataset-viewer/quick_start#quickstart',
55
+ source_page_title: 'Quick start',
56
+ },
57
+ ];
58
+ mockFetch.mockResolvedValueOnce({
59
+ ok: true,
60
+ json: () => Promise.resolve(sampleResults),
61
+ });
62
+ const result = await docSearchTool.search({ query: 'analytics' });
63
+ expect(result).toContain('# Documentation Library Search Results for "analytics"');
64
+ expect(result).toContain('Found 3 results');
65
+ const hubIndex = result.indexOf('## Results for Product: hub');
66
+ const datasetViewerIndex = result.indexOf('## Results for Product: dataset-viewer');
67
+ expect(hubIndex).toBeLessThan(datasetViewerIndex);
68
+ expect(hubIndex).toBeGreaterThan(-1);
69
+ expect(datasetViewerIndex).toBeGreaterThan(-1);
70
+ expect(result).toContain('## Results for Product: hub (2 results)');
71
+ expect(result).toContain('## Results for Product: dataset-viewer (1 results)');
72
+ expect(result).toContain('### Results from [Analytics](https://huggingface.co/docs/hub/enterprise-hub-analytics)');
73
+ expect(result).toContain('### Results from [Quickstart](https://huggingface.co/docs/dataset-viewer/quick_start)');
74
+ expect(result).toContain('#### Excerpt from the "Export Analytics as CSV" section');
75
+ expect(result).toContain('#### Excerpt from the "View Analytics" section');
76
+ expect(result).toContain('Download a comprehensive CSV file containing analytics');
77
+ expect(result).toContain('View analytics for your repositories');
78
+ expect(result).toContain('In this quickstart, you will learn how to use the dataset viewer REST API');
79
+ expect(result).toContain('Use the "' + DOC_FETCH_CONFIG.name + '" tool to fetch a document from the library.');
80
+ });
81
+ it('should handle results without heading2', async () => {
82
+ const sampleResults = [
83
+ {
84
+ text: 'This is a simple text without heading2',
85
+ product: 'transformers',
86
+ heading1: 'Introduction',
87
+ source_page_url: 'https://huggingface.co/docs/transformers/index',
88
+ source_page_title: 'Transformers',
89
+ },
90
+ ];
91
+ mockFetch.mockResolvedValueOnce({
92
+ ok: true,
93
+ json: () => Promise.resolve(sampleResults),
94
+ });
95
+ const result = await docSearchTool.search({ query: 'transformers' });
96
+ expect(result).not.toContain('#### Excerpt from');
97
+ expect(result).toContain('This is a simple text without heading2');
98
+ });
99
+ it('should properly escape markdown special characters', async () => {
100
+ const sampleResults = [
101
+ {
102
+ text: 'Text with [brackets] and *asterisks* and _underscores_',
103
+ product: 'hub',
104
+ heading1: 'Special * Characters',
105
+ source_page_url: 'https://huggingface.co/docs/hub/test',
106
+ source_page_title: 'Test',
107
+ heading2: 'Section with [brackets]',
108
+ },
109
+ ];
110
+ mockFetch.mockResolvedValueOnce({
111
+ ok: true,
112
+ json: () => Promise.resolve(sampleResults),
113
+ });
114
+ const result = await docSearchTool.search({ query: 'special' });
115
+ expect(result).toContain('Special \\* Characters');
116
+ expect(result).toContain('#### Excerpt from the "Section with [brackets]" section');
117
+ });
118
+ it('should clean HTML tags from text', async () => {
119
+ const sampleResults = [
120
+ {
121
+ text: 'Text with <div class="test">HTML tags</div> and <img src="test.png" alt="image"/>',
122
+ product: 'hub',
123
+ heading1: 'HTML Test',
124
+ source_page_url: 'https://huggingface.co/docs/hub/html-test',
125
+ source_page_title: 'HTML Test',
126
+ },
127
+ ];
128
+ mockFetch.mockResolvedValueOnce({
129
+ ok: true,
130
+ json: () => Promise.resolve(sampleResults),
131
+ });
132
+ const result = await docSearchTool.search({ query: 'html' });
133
+ expect(result).toContain('Text with HTML tags and');
134
+ expect(result).not.toContain('<div');
135
+ expect(result).not.toContain('<img');
136
+ });
137
+ it('should sort multiple products and pages correctly by count', async () => {
138
+ const sampleResults = [
139
+ {
140
+ text: 'Result from hub page 1 - first',
141
+ product: 'hub',
142
+ heading1: 'Page 1',
143
+ source_page_url: 'https://huggingface.co/docs/hub/page1',
144
+ source_page_title: 'Page 1',
145
+ },
146
+ {
147
+ text: 'Result from hub page 1 - second',
148
+ product: 'hub',
149
+ heading1: 'Page 1',
150
+ source_page_url: 'https://huggingface.co/docs/hub/page1',
151
+ source_page_title: 'Page 1',
152
+ },
153
+ {
154
+ text: 'Result from hub page 2',
155
+ product: 'hub',
156
+ heading1: 'Page 2',
157
+ source_page_url: 'https://huggingface.co/docs/hub/page2',
158
+ source_page_title: 'Page 2',
159
+ },
160
+ {
161
+ text: 'Result from transformers',
162
+ product: 'transformers',
163
+ heading1: 'Transformers Page',
164
+ source_page_url: 'https://huggingface.co/docs/transformers/page1',
165
+ source_page_title: 'Transformers',
166
+ },
167
+ {
168
+ text: 'Result from datasets',
169
+ product: 'datasets',
170
+ heading1: 'Datasets Page',
171
+ source_page_url: 'https://huggingface.co/docs/datasets/page1',
172
+ source_page_title: 'Datasets',
173
+ },
174
+ ];
175
+ mockFetch.mockResolvedValueOnce({
176
+ ok: true,
177
+ json: () => Promise.resolve(sampleResults),
178
+ });
179
+ const result = await docSearchTool.search({ query: 'test' });
180
+ const hubIndex = result.indexOf('## Results for Product: hub');
181
+ const transformersIndex = result.indexOf('## Results for Product: transformers');
182
+ const datasetsIndex = result.indexOf('## Results for Product: datasets');
183
+ expect(hubIndex).toBeLessThan(transformersIndex);
184
+ expect(hubIndex).toBeLessThan(datasetsIndex);
185
+ expect(result).toContain('## Results for Product: hub (3 results)');
186
+ const page1Index = result.indexOf('https://huggingface.co/docs/hub/page1');
187
+ const page2Index = result.indexOf('https://huggingface.co/docs/hub/page2');
188
+ expect(page1Index).toBeLessThan(page2Index);
189
+ expect(result).toContain('### Results from [Page 1](https://huggingface.co/docs/hub/page1) (2 results)');
190
+ });
191
+ it('should include product filter in API call when provided', async () => {
192
+ mockFetch.mockResolvedValueOnce({
193
+ ok: true,
194
+ json: () => Promise.resolve([]),
195
+ });
196
+ await docSearchTool.search({ query: 'test', product: 'hub' });
197
+ expect(mockFetch).toHaveBeenCalledWith(expect.stringContaining('q=test&product=hub'), expect.any(Object));
198
+ });
199
+ it('should group results from the same page with different anchors together', async () => {
200
+ const sampleResults = [
201
+ {
202
+ text: 'First result from section 1',
203
+ product: 'hub',
204
+ heading1: 'Analytics',
205
+ source_page_url: 'https://huggingface.co/docs/hub/analytics#section1',
206
+ source_page_title: 'Analytics Page',
207
+ heading2: 'Section 1',
208
+ },
209
+ {
210
+ text: 'Second result from section 2',
211
+ product: 'hub',
212
+ heading1: 'Analytics',
213
+ source_page_url: 'https://huggingface.co/docs/hub/analytics#section2',
214
+ source_page_title: 'Analytics Page',
215
+ heading2: 'Section 2',
216
+ },
217
+ {
218
+ text: 'Third result from section 3',
219
+ product: 'hub',
220
+ heading1: 'Analytics',
221
+ source_page_url: 'https://huggingface.co/docs/hub/analytics#section3',
222
+ source_page_title: 'Analytics Page',
223
+ heading2: 'Section 3',
224
+ },
225
+ ];
226
+ mockFetch.mockResolvedValueOnce({
227
+ ok: true,
228
+ json: () => Promise.resolve(sampleResults),
229
+ });
230
+ const result = await docSearchTool.search({ query: 'analytics' });
231
+ expect(result).toContain('### Results from [Analytics](https://huggingface.co/docs/hub/analytics) (3 results)');
232
+ expect(result).toContain('First result from section 1');
233
+ expect(result).toContain('Second result from section 2');
234
+ expect(result).toContain('Third result from section 3');
235
+ const resultsFromCount = (result.match(/### Results from/g) || []).length;
236
+ expect(resultsFromCount).toBe(1);
237
+ });
238
+ it('should handle API errors gracefully', async () => {
239
+ mockFetch.mockRejectedValueOnce(new Error('Network error'));
240
+ await expect(docSearchTool.search({ query: 'test' })).rejects.toThrow('Failed to search documentation:');
241
+ });
242
+ });
243
+ describe('groupResults', () => {
244
+ it('should group results by product and page URL', async () => {
245
+ const sampleResults = [
246
+ {
247
+ text: 'Result 1',
248
+ product: 'hub',
249
+ heading1: 'Page 1',
250
+ source_page_url: 'https://example.com/page1',
251
+ source_page_title: 'Page 1',
252
+ },
253
+ {
254
+ text: 'Result 2',
255
+ product: 'hub',
256
+ heading1: 'Page 1',
257
+ source_page_url: 'https://example.com/page1',
258
+ source_page_title: 'Page 1',
259
+ },
260
+ {
261
+ text: 'Result 3',
262
+ product: 'transformers',
263
+ heading1: 'Page 2',
264
+ source_page_url: 'https://example.com/page2',
265
+ source_page_title: 'Page 2',
266
+ },
267
+ ];
268
+ mockFetch.mockResolvedValueOnce({
269
+ ok: true,
270
+ json: () => Promise.resolve(sampleResults),
271
+ });
272
+ const result = await docSearchTool.search({ query: 'test' });
273
+ expect(result).toContain('## Results for Product: hub');
274
+ expect(result).toContain('## Results for Product: transformers');
275
+ const result1Index = result.indexOf('Result 1');
276
+ const result2Index = result.indexOf('Result 2');
277
+ const result3Index = result.indexOf('Result 3');
278
+ expect(Math.abs(result2Index - result1Index)).toBeLessThan(100);
279
+ expect(Math.abs(result3Index - result1Index)).toBeGreaterThan(50);
280
+ });
281
+ });
282
+ });
283
+ //# sourceMappingURL=docs-semantic-search.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-semantic-search.test.js","sourceRoot":"","sources":["../../src/docs-search/docs-semantic-search.test.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -12,5 +12,7 @@ export * from './space-info.js';
12
12
  export * from './space-files.js';
13
13
  export * from './user-summary.js';
14
14
  export * from './paper-summary.js';
15
+ export * from './docs-search/docs-semantic-search.js';
16
+ export * from './docs-search/doc-fetch.js';
15
17
  export * from './tool-ids.js';
16
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAG3C,cAAc,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -12,5 +12,7 @@ export * from './space-info.js';
12
12
  export * from './space-files.js';
13
13
  export * from './user-summary.js';
14
14
  export * from './paper-summary.js';
15
+ export * from './docs-search/docs-semantic-search.js';
16
+ export * from './docs-search/doc-fetch.js';
15
17
  export * from './tool-ids.js';
16
18
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAG3C,cAAc,eAAe,CAAC"}
@@ -7,17 +7,19 @@ export declare const DATASET_DETAIL_TOOL_ID: "dataset_details";
7
7
  export declare const DUPLICATE_SPACE_TOOL_ID: "duplicate_space";
8
8
  export declare const SPACE_INFO_TOOL_ID: "space_info";
9
9
  export declare const SPACE_FILES_TOOL_ID: "space_files";
10
+ export declare const DOCS_SEMANTIC_SEARCH_TOOL_ID: "hf_doc_search";
11
+ export declare const DOC_FETCH_TOOL_ID: "hf_doc_fetch";
10
12
  export declare const USER_SUMMARY_PROMPT_ID: "User Summary";
11
13
  export declare const PAPER_SUMMARY_PROMPT_ID: "Paper Summary";
12
- export declare const ALL_BUILTIN_TOOL_IDS: readonly ["space_search", "model_search", "model_details", "paper_search", "dataset_search", "dataset_details", "duplicate_space", "space_info", "space_files"];
14
+ export declare const ALL_BUILTIN_TOOL_IDS: readonly ["space_search", "model_search", "model_details", "paper_search", "dataset_search", "dataset_details", "duplicate_space", "space_info", "space_files", "hf_doc_search", "hf_doc_fetch"];
13
15
  export declare const TOOL_ID_GROUPS: {
14
- readonly search: readonly ["space_search", "model_search", "dataset_search", "paper_search"];
16
+ readonly search: readonly ["space_search", "model_search", "dataset_search", "paper_search", "hf_doc_search"];
15
17
  readonly spaces: readonly ["space_search", "duplicate_space", "space_info", "space_files"];
16
18
  readonly detail: readonly ["model_details", "dataset_details"];
19
+ readonly docs: readonly ["hf_doc_search", "hf_doc_fetch"];
17
20
  readonly hf_api: readonly ["space_search", "model_search", "dataset_search", "paper_search", "model_details", "dataset_details"];
18
- readonly all: readonly ["space_search", "model_search", "model_details", "paper_search", "dataset_search", "dataset_details", "duplicate_space", "space_info", "space_files"];
21
+ readonly all: readonly ["space_search", "model_search", "model_details", "paper_search", "dataset_search", "dataset_details", "duplicate_space", "space_info", "space_files", "hf_doc_search", "hf_doc_fetch"];
19
22
  };
20
23
  export type BuiltinToolId = (typeof ALL_BUILTIN_TOOL_IDS)[number];
21
24
  export declare function isValidBuiltinToolId(toolId: string): toolId is BuiltinToolId;
22
- export declare function getToolDescription(toolId: BuiltinToolId): string;
23
25
  //# sourceMappingURL=tool-ids.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-ids.d.ts","sourceRoot":"","sources":["../src/tool-ids.ts"],"names":[],"mappings":"AAoBA,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,uBAAuB,mBAAmC,CAAC;AACxE,eAAO,MAAM,kBAAkB,cAA8B,CAAC;AAC9D,eAAO,MAAM,mBAAmB,eAA+B,CAAC;AAChE,eAAO,MAAM,sBAAsB,gBAAkC,CAAC;AACtE,eAAO,MAAM,uBAAuB,iBAAmC,CAAC;AAGxE,eAAO,MAAM,oBAAoB,iKAUvB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;;CAajB,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;AAGD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAchE"}
1
+ {"version":3,"file":"tool-ids.d.ts","sourceRoot":"","sources":["../src/tool-ids.ts"],"names":[],"mappings":"AAsBA,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,uBAAuB,mBAAmC,CAAC;AACxE,eAAO,MAAM,kBAAkB,cAA8B,CAAC;AAC9D,eAAO,MAAM,mBAAmB,eAA+B,CAAC;AAChE,eAAO,MAAM,4BAA4B,iBAAmC,CAAC;AAC7E,eAAO,MAAM,iBAAiB,gBAAwB,CAAC;AACvD,eAAO,MAAM,sBAAsB,gBAAkC,CAAC;AACtE,eAAO,MAAM,uBAAuB,iBAAmC,CAAC;AAIxE,eAAO,MAAM,oBAAoB,kMAYvB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;;;CAcjB,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, PAPER_SEARCH_TOOL_CONFIG, DATASET_SEARCH_TOOL_CONFIG, DATASET_DETAIL_TOOL_CONFIG, DUPLICATE_SPACE_TOOL_CONFIG, SPACE_INFO_TOOL_CONFIG, SPACE_FILES_TOOL_CONFIG, USER_SUMMARY_PROMPT_CONFIG, PAPER_SUMMARY_PROMPT_CONFIG, } from './index.js';
1
+ import { SEMANTIC_SEARCH_TOOL_CONFIG, MODEL_SEARCH_TOOL_CONFIG, MODEL_DETAIL_TOOL_CONFIG, PAPER_SEARCH_TOOL_CONFIG, DATASET_SEARCH_TOOL_CONFIG, DATASET_DETAIL_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, } 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;
@@ -8,6 +8,8 @@ export const DATASET_DETAIL_TOOL_ID = DATASET_DETAIL_TOOL_CONFIG.name;
8
8
  export const DUPLICATE_SPACE_TOOL_ID = DUPLICATE_SPACE_TOOL_CONFIG.name;
9
9
  export const SPACE_INFO_TOOL_ID = SPACE_INFO_TOOL_CONFIG.name;
10
10
  export const SPACE_FILES_TOOL_ID = SPACE_FILES_TOOL_CONFIG.name;
11
+ export const DOCS_SEMANTIC_SEARCH_TOOL_ID = DOCS_SEMANTIC_SEARCH_CONFIG.name;
12
+ export const DOC_FETCH_TOOL_ID = DOC_FETCH_CONFIG.name;
11
13
  export const USER_SUMMARY_PROMPT_ID = USER_SUMMARY_PROMPT_CONFIG.name;
12
14
  export const PAPER_SUMMARY_PROMPT_ID = PAPER_SUMMARY_PROMPT_CONFIG.name;
13
15
  export const ALL_BUILTIN_TOOL_IDS = [
@@ -20,11 +22,14 @@ export const ALL_BUILTIN_TOOL_IDS = [
20
22
  DUPLICATE_SPACE_TOOL_ID,
21
23
  SPACE_INFO_TOOL_ID,
22
24
  SPACE_FILES_TOOL_ID,
25
+ DOCS_SEMANTIC_SEARCH_TOOL_ID,
26
+ DOC_FETCH_TOOL_ID,
23
27
  ];
24
28
  export const TOOL_ID_GROUPS = {
25
- search: [SPACE_SEARCH_TOOL_ID, MODEL_SEARCH_TOOL_ID, DATASET_SEARCH_TOOL_ID, PAPER_SEARCH_TOOL_ID],
29
+ search: [SPACE_SEARCH_TOOL_ID, MODEL_SEARCH_TOOL_ID, DATASET_SEARCH_TOOL_ID, PAPER_SEARCH_TOOL_ID, DOCS_SEMANTIC_SEARCH_TOOL_ID],
26
30
  spaces: [SPACE_SEARCH_TOOL_ID, DUPLICATE_SPACE_TOOL_ID, SPACE_INFO_TOOL_ID, SPACE_FILES_TOOL_ID],
27
31
  detail: [MODEL_DETAIL_TOOL_ID, DATASET_DETAIL_TOOL_ID],
32
+ docs: [DOCS_SEMANTIC_SEARCH_TOOL_ID, DOC_FETCH_TOOL_ID],
28
33
  hf_api: [
29
34
  SPACE_SEARCH_TOOL_ID,
30
35
  MODEL_SEARCH_TOOL_ID,
@@ -38,18 +43,4 @@ export const TOOL_ID_GROUPS = {
38
43
  export function isValidBuiltinToolId(toolId) {
39
44
  return ALL_BUILTIN_TOOL_IDS.includes(toolId);
40
45
  }
41
- export function getToolDescription(toolId) {
42
- const configs = {
43
- [SPACE_SEARCH_TOOL_ID]: SEMANTIC_SEARCH_TOOL_CONFIG,
44
- [MODEL_SEARCH_TOOL_ID]: MODEL_SEARCH_TOOL_CONFIG,
45
- [MODEL_DETAIL_TOOL_ID]: MODEL_DETAIL_TOOL_CONFIG,
46
- [PAPER_SEARCH_TOOL_ID]: PAPER_SEARCH_TOOL_CONFIG,
47
- [DATASET_SEARCH_TOOL_ID]: DATASET_SEARCH_TOOL_CONFIG,
48
- [DATASET_DETAIL_TOOL_ID]: DATASET_DETAIL_TOOL_CONFIG,
49
- [DUPLICATE_SPACE_TOOL_ID]: DUPLICATE_SPACE_TOOL_CONFIG,
50
- [SPACE_INFO_TOOL_ID]: SPACE_INFO_TOOL_CONFIG,
51
- [SPACE_FILES_TOOL_ID]: SPACE_FILES_TOOL_CONFIG,
52
- };
53
- return configs[toolId]?.description || `Tool: ${toolId}`;
54
- }
55
46
  //# sourceMappingURL=tool-ids.js.map
@@ -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,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,EAC1B,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,GAC3B,MAAM,YAAY,CAAC;AAGpB,MAAM,CAAC,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,IAAI,CAAC;AACrE,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,IAAI,CAAC;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,IAAI,CAAC;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,IAAI,CAAC;AAClE,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,IAAI,CAAC;AACtE,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,IAAI,CAAC;AACtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,2BAA2B,CAAC,IAAI,CAAC;AACxE,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,IAAI,CAAC;AAC9D,MAAM,CAAC,MAAM,mBAAmB,GAAG,uBAAuB,CAAC,IAAI,CAAC;AAChE,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,IAAI,CAAC;AACtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,2BAA2B,CAAC,IAAI,CAAC;AAGxE,MAAM,CAAC,MAAM,oBAAoB,GAAG;IACnC,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,sBAAsB;IACtB,sBAAsB;IACtB,uBAAuB;IACvB,kBAAkB;IAClB,mBAAmB;CACV,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,MAAM,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,oBAAoB,CAAU;IAC3G,MAAM,EAAE,CAAC,oBAAoB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,mBAAmB,CAAU;IACzG,MAAM,EAAE,CAAC,oBAAoB,EAAE,sBAAsB,CAAU;IAC/D,MAAM,EAAE;QACP,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;KACb;IACV,GAAG,EAAE,CAAC,GAAG,oBAAoB,CAAU;CAC9B,CAAC;AAMX,MAAM,UAAU,oBAAoB,CAAC,MAAc;IAClD,OAAQ,oBAA0C,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACrE,CAAC;AAGD,MAAM,UAAU,kBAAkB,CAAC,MAAqB;IACvD,MAAM,OAAO,GAAG;QACf,CAAC,oBAAoB,CAAC,EAAE,2BAA2B;QACnD,CAAC,oBAAoB,CAAC,EAAE,wBAAwB;QAChD,CAAC,oBAAoB,CAAC,EAAE,wBAAwB;QAChD,CAAC,oBAAoB,CAAC,EAAE,wBAAwB;QAChD,CAAC,sBAAsB,CAAC,EAAE,0BAA0B;QACpD,CAAC,sBAAsB,CAAC,EAAE,0BAA0B;QACpD,CAAC,uBAAuB,CAAC,EAAE,2BAA2B;QACtD,CAAC,kBAAkB,CAAC,EAAE,sBAAsB;QAC5C,CAAC,mBAAmB,CAAC,EAAE,uBAAuB;KACrC,CAAC;IAEX,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,IAAI,SAAS,MAAM,EAAE,CAAC;AAC1D,CAAC"}
1
+ {"version":3,"file":"tool-ids.js","sourceRoot":"","sources":["../src/tool-ids.ts"],"names":[],"mappings":"AAKA,OAAO,EACN,2BAA2B,EAC3B,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,EAC1B,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,2BAA2B,EAC3B,gBAAgB,GAChB,MAAM,YAAY,CAAC;AAGpB,MAAM,CAAC,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,IAAI,CAAC;AACrE,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,IAAI,CAAC;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,IAAI,CAAC;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,IAAI,CAAC;AAClE,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,IAAI,CAAC;AACtE,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,IAAI,CAAC;AACtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,2BAA2B,CAAC,IAAI,CAAC;AACxE,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,IAAI,CAAC;AAC9D,MAAM,CAAC,MAAM,mBAAmB,GAAG,uBAAuB,CAAC,IAAI,CAAC;AAChE,MAAM,CAAC,MAAM,4BAA4B,GAAG,2BAA2B,CAAC,IAAI,CAAC;AAC7E,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,IAAI,CAAC;AACtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,2BAA2B,CAAC,IAAI,CAAC;AAIxE,MAAM,CAAC,MAAM,oBAAoB,GAAG;IACnC,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,sBAAsB;IACtB,sBAAsB;IACtB,uBAAuB;IACvB,kBAAkB;IAClB,mBAAmB;IACnB,4BAA4B;IAC5B,iBAAiB;CACR,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,MAAM,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,4BAA4B,CAAU;IACzI,MAAM,EAAE,CAAC,oBAAoB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,mBAAmB,CAAU;IACzG,MAAM,EAAE,CAAC,oBAAoB,EAAE,sBAAsB,CAAU;IAC/D,IAAI,EAAE,CAAC,4BAA4B,EAAE,iBAAiB,CAAU;IAChE,MAAM,EAAE;QACP,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;KACb;IACV,GAAG,EAAE,CAAC,GAAG,oBAAoB,CAAU;CAC9B,CAAC;AAMX,MAAM,UAAU,oBAAoB,CAAC,MAAc;IAClD,OAAQ,oBAA0C,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACrE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llmindset/hf-mcp",
3
- "version": "0.1.17",
3
+ "version": "0.1.19",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -31,7 +31,7 @@
31
31
  "@types/node": "^22.15.18",
32
32
  "eslint": "^9.25.0",
33
33
  "globals": "^16.0.0",
34
- "rimraf": "^5.0.10",
34
+ "rimraf": "^6.0.1",
35
35
  "typescript-eslint": "^8.32.1",
36
36
  "vitest": "^3.1.3"
37
37
  },
@@ -0,0 +1,74 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { DocFetchTool } from './doc-fetch.js';
3
+
4
+ describe('DocFetchTool', () => {
5
+ const tool = new DocFetchTool();
6
+
7
+ describe('URL conversion', () => {
8
+ it('should convert basic HF docs URL to GitHub URL', () => {
9
+ const hfUrl = 'https://huggingface.co/docs/dataset-viewer/index';
10
+ const expectedUrl =
11
+ 'https://raw.githubusercontent.com/huggingface/dataset-viewer/refs/heads/main/docs/source/index.md';
12
+
13
+ const result = tool.processUrl(hfUrl);
14
+ expect(result).toBe(expectedUrl);
15
+ });
16
+
17
+ it('should handle URLs with fragments by removing them', () => {
18
+ const hfUrl = 'https://huggingface.co/docs/huggingface_hub/guides/upload#faster-uploads';
19
+ const expectedUrl =
20
+ 'https://raw.githubusercontent.com/huggingface/huggingface_hub/refs/heads/main/docs/source/en/guides/upload.md';
21
+
22
+ const result = tool.processUrl(hfUrl);
23
+ expect(result).toBe(expectedUrl);
24
+ });
25
+
26
+ it('should handle transformers documentation', () => {
27
+ const hfUrl = 'https://huggingface.co/docs/transformers/model_doc/bert';
28
+ const expectedUrl =
29
+ 'https://raw.githubusercontent.com/huggingface/transformers/refs/heads/main/docs/source/en/model_doc/bert.md';
30
+
31
+ const result = tool.processUrl(hfUrl);
32
+ expect(result).toBe(expectedUrl);
33
+ });
34
+
35
+ it('should handle diffusers documentation', () => {
36
+ const hfUrl = 'https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion';
37
+ const expectedUrl =
38
+ 'https://raw.githubusercontent.com/huggingface/diffusers/refs/heads/main/docs/source/en/api/pipelines/stable_diffusion.md';
39
+
40
+ const result = tool.processUrl(hfUrl);
41
+ expect(result).toBe(expectedUrl);
42
+ });
43
+
44
+ it('should handle timm documentation with custom package name', () => {
45
+ const hfUrl = 'https://huggingface.co/docs/timm/models';
46
+ const expectedUrl =
47
+ 'https://raw.githubusercontent.com/huggingface/pytorch-image-models/refs/heads/main/hfdocs/source/models.md';
48
+
49
+ const result = tool.processUrl(hfUrl);
50
+ expect(result).toBe(expectedUrl);
51
+ });
52
+
53
+ it('should default to index.md when no path is provided', () => {
54
+ const hfUrl = 'https://huggingface.co/docs/transformers';
55
+ const expectedUrl =
56
+ 'https://raw.githubusercontent.com/huggingface/transformers/refs/heads/main/docs/source/en/index.md';
57
+
58
+ const result = tool.processUrl(hfUrl);
59
+ expect(result).toBe(expectedUrl);
60
+ });
61
+
62
+ it('should throw error for URLs not starting with correct prefix', () => {
63
+ const invalidUrl = 'https://example.com/docs/something';
64
+
65
+ expect(() => tool.processUrl(invalidUrl)).toThrow('That was not a valid Hugging Face document URL');
66
+ });
67
+
68
+ it('should throw error for unknown package names', () => {
69
+ const unknownPackageUrl = 'https://huggingface.co/docs/unknown-package/guide';
70
+
71
+ expect(tool.processUrl(unknownPackageUrl)).toBe('https://huggingface.co/docs/unknown-package/guide');
72
+ });
73
+ });
74
+ });
@@ -0,0 +1,92 @@
1
+ import { z } from 'zod';
2
+ import { DOC_MAPPINGS } from './doc-mappings.js';
3
+
4
+ export const DOC_FETCH_CONFIG = {
5
+ name: 'hf_doc_fetch',
6
+ description: 'Fetch a document from the Hugging Face documentation library.',
7
+ schema: z.object({
8
+ doc_url: z
9
+ .string()
10
+ .min(28, 'Url should start with https://huggingface.co/docs/')
11
+ .max(200, 'Query too long')
12
+ .describe('Hugging Face documentation URL'),
13
+ }),
14
+ annotations: {
15
+ title: 'Fetch a document from the Hugging Face library',
16
+ destructiveHint: false,
17
+ readOnlyHint: true,
18
+ openWorldHint: true,
19
+ },
20
+ } as const;
21
+
22
+ export type DocFetchParams = z.infer<typeof DOC_FETCH_CONFIG.schema>;
23
+
24
+ /**
25
+ * Return a (usually) markdown document for a Doc URL
26
+ *
27
+ * There were a few different options for this...
28
+ * 1) Return the HTML directly. Good option would include any post-processing (but prefer markdown)
29
+ * 2) Get the HTML and convert to markdown
30
+ * 3) Get the HTML and follow the GitHub link to get the raw markdown file
31
+ * 4) Use a mapping.
32
+ *
33
+ * There is also the risk that the GitHub HEAD is newer than the indexed version. Will leave as is for now
34
+ * but might want to reconsider this. Mappings were built from:
35
+ * https://github.com/huggingface/doc-builder/blob/main/.github/workflows/build_embeddings.yml
36
+ *
37
+ * Falls back to HTML if no mapping is found...
38
+ *
39
+ */
40
+ export class DocFetchTool {
41
+ /**
42
+ * Convert HF docs URL to GitHub raw content URL
43
+ */
44
+ processUrl(hfUrl: string): string {
45
+ // Validate URL format
46
+ if (!hfUrl.startsWith('https://huggingface.co/docs/')) {
47
+ throw new Error('That was not a valid Hugging Face document URL');
48
+ }
49
+
50
+ // Remove the base URL and any fragment identifier
51
+ const urlPath = hfUrl.replace('https://huggingface.co/docs/', '').split('#')[0] || '';
52
+
53
+ // Extract package name and path
54
+ const parts = urlPath.split('/');
55
+ const packageName = parts[0] || '';
56
+
57
+ // Check if package exists in mapping
58
+ let fetchUrl = hfUrl;
59
+ const mapping = DOC_MAPPINGS[packageName];
60
+ if (mapping) {
61
+ const remainingPath = parts.slice(1).join('/');
62
+ const filePath = remainingPath ? `${remainingPath}.md` : 'index.md';
63
+
64
+ // Construct GitHub raw URL
65
+ const githubUrl = `https://raw.githubusercontent.com/${mapping.repo_id}/refs/heads/main/${mapping.doc_folder}/${filePath}`;
66
+ fetchUrl = githubUrl;
67
+ }
68
+
69
+ // Build the file path
70
+ return fetchUrl;
71
+ }
72
+
73
+ /**
74
+ * Fetch markdown content from GitHub
75
+ */
76
+ async fetch(url: string): Promise<string> {
77
+ try {
78
+ const githubUrl = this.processUrl(url);
79
+
80
+ const response = await fetch(githubUrl);
81
+
82
+ if (!response.ok) {
83
+ throw new Error(`Failed to fetch document: ${response.status} ${response.statusText}`);
84
+ }
85
+
86
+ const content = await response.text();
87
+ return content;
88
+ } catch (error) {
89
+ throw new Error(`Failed to fetch document: ${error instanceof Error ? error.message : 'Unknown error'}`);
90
+ }
91
+ }
92
+ }