@llmindset/hf-mcp 0.2.18 → 0.2.20

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.
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  export declare const DOC_FETCH_CONFIG: {
3
3
  readonly name: "hf_doc_fetch";
4
- readonly description: "Fetch a document from the Hugging Face documentation library. For large documents, use offset to get subsequent chunks.";
4
+ readonly description: "Fetch a document from the Hugging Face or Gradio documentation library. For large documents, use offset to get subsequent chunks.";
5
5
  readonly schema: z.ZodObject<{
6
6
  doc_url: z.ZodString;
7
7
  offset: z.ZodOptional<z.ZodNumber>;
@@ -13,7 +13,7 @@ export declare const DOC_FETCH_CONFIG: {
13
13
  offset?: number | undefined;
14
14
  }>;
15
15
  readonly annotations: {
16
- readonly title: "Fetch a document from the Hugging Face library";
16
+ readonly title: "Fetch a document from the Hugging Face documentation library";
17
17
  readonly destructiveHint: false;
18
18
  readonly readOnlyHint: true;
19
19
  readonly openWorldHint: true;
@@ -1 +1 @@
1
- {"version":3,"file":"doc-fetch.d.ts","sourceRoot":"","sources":["../../src/docs-search/doc-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;CAsBnB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAErE,qBAAa,YAAY;IACxB,OAAO,CAAC,eAAe,CAAkB;;IAoBzC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS1B,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBpD,OAAO,CAAC,aAAa;CAoCrB"}
1
+ {"version":3,"file":"doc-fetch.d.ts","sourceRoot":"","sources":["../../src/docs-search/doc-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;CAkBnB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAErE,qBAAa,YAAY;IACxB,OAAO,CAAC,eAAe,CAAkB;;IAmFzC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAuB1B,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAoCpD,OAAO,CAAC,aAAa;CAoCrB"}
@@ -3,13 +3,9 @@ import TurndownService from 'turndown';
3
3
  import { estimateTokens } from '../utilities.js';
4
4
  export const DOC_FETCH_CONFIG = {
5
5
  name: 'hf_doc_fetch',
6
- description: 'Fetch a document from the Hugging Face documentation library. For large documents, use offset to get subsequent chunks.',
6
+ description: 'Fetch a document from the Hugging Face or Gradio documentation library. For large documents, use offset to get subsequent chunks.',
7
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'),
8
+ doc_url: z.string().max(200, 'Query too long').describe('Documentation URL (Hugging Face or Gradio)'),
13
9
  offset: z
14
10
  .number()
15
11
  .min(0)
@@ -17,7 +13,7 @@ export const DOC_FETCH_CONFIG = {
17
13
  .describe('Token offset for large documents (use the offset from truncation message)'),
18
14
  }),
19
15
  annotations: {
20
- title: 'Fetch a document from the Hugging Face library',
16
+ title: 'Fetch a document from the Hugging Face documentation library',
21
17
  destructiveHint: false,
22
18
  readOnlyHint: true,
23
19
  openWorldHint: true,
@@ -33,15 +29,84 @@ export class DocFetchTool {
33
29
  this.turndownService.remove('head');
34
30
  this.turndownService.remove('script');
35
31
  this.turndownService.remove((node) => {
32
+ try {
33
+ const tag = (node.nodeName || '').toLowerCase();
34
+ if (['header', 'nav', 'footer', 'aside', 'form', 'button', 'style', 'noscript', 'iframe'].includes(tag)) {
35
+ return true;
36
+ }
37
+ }
38
+ catch {
39
+ }
40
+ return false;
41
+ });
42
+ this.turndownService.remove((node) => {
43
+ try {
44
+ if (typeof node.nodeName === 'string') {
45
+ const tag = (node.nodeName || '').toLowerCase();
46
+ if (tag === 'svg') {
47
+ return true;
48
+ }
49
+ }
50
+ }
51
+ catch {
52
+ }
36
53
  if (node.nodeName === 'a' && node.innerHTML.includes('<!-- HTML_TAG_START -->')) {
37
54
  return true;
38
55
  }
56
+ const nodeName = (node.nodeName || '').toLowerCase();
57
+ if (nodeName === 'img') {
58
+ try {
59
+ const src = node.getAttribute?.('src') ??
60
+ (node.src || '');
61
+ if (/\.svg(\?|$)/i.test(src) ||
62
+ /^data:image\/svg\+xml[,;]/i.test(src) ||
63
+ src.toLowerCase().includes('image/svg+xml')) {
64
+ return true;
65
+ }
66
+ }
67
+ catch {
68
+ }
69
+ }
39
70
  return false;
40
71
  });
72
+ this.turndownService.addRule('dropHeadingAnchors', {
73
+ filter: (node) => {
74
+ try {
75
+ const n = node;
76
+ if ((n.nodeName || '').toLowerCase() !== 'a')
77
+ return false;
78
+ const href = n.getAttribute?.('href') || '';
79
+ if (!href || !href.startsWith('#'))
80
+ return false;
81
+ const text = (n.textContent || '').trim();
82
+ const children = n.childNodes || [];
83
+ const onlyIcons = children.length > 0 && children.every((c) => ((c.nodeName || '').toLowerCase() === 'img' || (c.nodeName || '').toLowerCase() === 'svg'));
84
+ const looksLikeEncodedSvg = /data:image\/svg\+xml|%3csvg|svg%2bxml/i.test(text);
85
+ const noAlnumText = text.length <= 3 && !/[a-z0-9]/i.test(text);
86
+ return onlyIcons || looksLikeEncodedSvg || noAlnumText;
87
+ }
88
+ catch {
89
+ return false;
90
+ }
91
+ },
92
+ replacement: () => ''
93
+ });
41
94
  }
42
95
  validateUrl(hfUrl) {
43
- if (!hfUrl.startsWith('https://huggingface.co/docs/')) {
44
- throw new Error('That was not a valid Hugging Face document URL');
96
+ try {
97
+ const url = new URL(hfUrl);
98
+ if (url.protocol !== 'https:') {
99
+ throw new Error('That was not a valid documentation URL');
100
+ }
101
+ const hostname = url.hostname.toLowerCase();
102
+ const isHfDocs = (hostname === 'huggingface.co' || hostname === 'www.huggingface.co') && url.pathname.startsWith('/docs/');
103
+ const isGradio = hostname === 'gradio.app' || hostname === 'www.gradio.app';
104
+ if (!isHfDocs && !isGradio) {
105
+ throw new Error('That was not a valid documentation URL');
106
+ }
107
+ }
108
+ catch {
109
+ throw new Error('That was not a valid documentation URL');
45
110
  }
46
111
  }
47
112
  async fetch(params) {
@@ -52,7 +117,12 @@ export class DocFetchTool {
52
117
  throw new Error(`Failed to fetch document: ${response.status} ${response.statusText}`);
53
118
  }
54
119
  const htmlContent = await response.text();
55
- const fullMarkdownContent = this.turndownService.turndown(htmlContent);
120
+ let fullMarkdownContent = this.turndownService.turndown(htmlContent);
121
+ fullMarkdownContent = fullMarkdownContent
122
+ .replace(/!\[[^\]]*\]\(\s*(?:data:image\/svg\+xml[^)]*|[^)]*\.svg(?:\?[^)]*)?)\s*\)/gi, '')
123
+ .replace(/\[\s*\]\(\s*[^)]*\s*\)/g, '');
124
+ fullMarkdownContent = fullMarkdownContent
125
+ .replace(/\[[^\]]*(?:data:image\/svg\+xml|%3csvg|svg%2bxml)[^\]]*\]\([^)]*\)/gi, '');
56
126
  return this.applyChunking(fullMarkdownContent, params.offset || 0);
57
127
  }
58
128
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"doc-fetch.js","sourceRoot":"","sources":["../../src/docs-search/doc-fetch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doc-fetch.js","sourceRoot":"","sources":["../../src/docs-search/doc-fetch.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { DocFetchTool } from './doc-fetch.js';
3
3
  describe('DocFetchTool', () => {
4
4
  const tool = new DocFetchTool();
5
5
  describe('URL validation', () => {
6
- it('should accept valid HF docs URLs', () => {
6
+ it('should accept valid HF and Gradio docs URLs', () => {
7
7
  const validUrls = [
8
8
  'https://huggingface.co/docs/dataset-viewer/index',
9
9
  'https://huggingface.co/docs/huggingface_hub/guides/upload#faster-uploads',
@@ -11,6 +11,8 @@ describe('DocFetchTool', () => {
11
11
  'https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion',
12
12
  'https://huggingface.co/docs/timm/models',
13
13
  'https://huggingface.co/docs/transformers',
14
+ 'https://gradio.app',
15
+ 'https://www.gradio.app/guides',
14
16
  ];
15
17
  for (const url of validUrls) {
16
18
  expect(() => tool.validateUrl(url)).not.toThrow();
@@ -25,7 +27,7 @@ describe('DocFetchTool', () => {
25
27
  'https://huggingface.co/models/bert-base-uncased',
26
28
  ];
27
29
  for (const url of invalidUrls) {
28
- expect(() => tool.validateUrl(url)).toThrow('That was not a valid Hugging Face document URL');
30
+ expect(() => tool.validateUrl(url)).toThrow('That was not a valid documentation URL');
29
31
  }
30
32
  });
31
33
  });
@@ -1 +1 @@
1
- {"version":3,"file":"doc-fetch.test.js","sourceRoot":"","sources":["../../src/docs-search/doc-fetch.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;IAEhC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC3C,MAAM,SAAS,GAAG;gBACjB,kDAAkD;gBAClD,0EAA0E;gBAC1E,yDAAyD;gBACzD,sEAAsE;gBACtE,yCAAyC;gBACzC,0CAA0C;aAC1C,CAAC;YAEF,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACnD,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACvE,MAAM,WAAW,GAAG;gBACnB,oCAAoC;gBACpC,6CAA6C;gBAC7C,yCAAyC;gBACzC,kCAAkC;gBAClC,iDAAiD;aACjD,CAAC;YAEF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;gBAC/B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC;YAC/F,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAG/D,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACxC,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,yDAAyD,CAAC;aACtF,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;YAEjF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YAEzE,MAAM,QAAQ,GAAG,wBAAwB,GAAG,iKAAiK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE1N,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACxC,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;aACrC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;YAEjF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAE5D,MAAM,QAAQ,GAAG,wBAAwB,GAAG,iKAAiK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE1N,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACxC,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;aACrC,CAAC,CAAC;YAGH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;YAGrF,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACxD,MAAM,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;YAGrD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,MAAM,EAAE,CAAC,CAAC;YAE9F,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACxC,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,8CAA8C,CAAC;aAC3E,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAEhG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"doc-fetch.test.js","sourceRoot":"","sources":["../../src/docs-search/doc-fetch.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { z } from 'zod';
2
+ import type { ToolResult } from './types/tool-result.js';
3
+ export declare const HUB_INSPECT_TOOL_CONFIG: {
4
+ readonly name: "hub_repo_details";
5
+ readonly description: string;
6
+ readonly schema: z.ZodObject<{
7
+ repo_ids: z.ZodArray<z.ZodString, "many">;
8
+ repo_type: z.ZodOptional<z.ZodEnum<["model", "dataset", "space"]>>;
9
+ include_readme: z.ZodDefault<z.ZodBoolean>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ repo_ids: string[];
12
+ include_readme: boolean;
13
+ repo_type?: "space" | "dataset" | "model" | undefined;
14
+ }, {
15
+ repo_ids: string[];
16
+ repo_type?: "space" | "dataset" | "model" | undefined;
17
+ include_readme?: boolean | undefined;
18
+ }>;
19
+ readonly annotations: {
20
+ readonly title: "Hub Repo Details";
21
+ readonly destructiveHint: false;
22
+ readonly readOnlyHint: true;
23
+ readonly openWorldHint: false;
24
+ };
25
+ };
26
+ export type HubInspectParams = z.infer<typeof HUB_INSPECT_TOOL_CONFIG.schema>;
27
+ export declare class HubInspectTool {
28
+ private readonly modelDetail;
29
+ private readonly datasetDetail;
30
+ private readonly hubUrl?;
31
+ constructor(hfToken?: string, hubUrl?: string);
32
+ inspect(params: HubInspectParams, includeReadme?: boolean): Promise<ToolResult>;
33
+ private inspectSingle;
34
+ private getSpaceDetails;
35
+ }
36
+ //# sourceMappingURL=hub-inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub-inspect.d.ts","sourceRoot":"","sources":["../src/hub-inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAMzD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;CAoB1B,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAE9E,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;gBAErB,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAMvC,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,aAAa,GAAE,OAAe,GAAG,OAAO,CAAC,UAAU,CAAC;YAsB9E,aAAa;YA+Cb,eAAe;CA8B7B"}
@@ -0,0 +1,115 @@
1
+ import { z } from 'zod';
2
+ import { ModelDetailTool } from './model-detail.js';
3
+ import { DatasetDetailTool } from './dataset-detail.js';
4
+ import { spaceInfo } from '@huggingface/hub';
5
+ import { formatDate } from './utilities.js';
6
+ export const HUB_INSPECT_TOOL_CONFIG = {
7
+ name: 'hub_repo_details',
8
+ description: 'Get details for one or more Hugging Face repos (model, dataset, or space). ' +
9
+ 'Auto-detects type unless specified.',
10
+ schema: z.object({
11
+ repo_ids: z
12
+ .array(z.string().min(1))
13
+ .min(1, 'Provide at least one id')
14
+ .max(10, 'Provide at most 10 repo ids')
15
+ .describe('Repo IDs for (models|dataset/space) - usually in author/name format (e.g. openai/gpt-oss-120b)'),
16
+ repo_type: z.enum(['model', 'dataset', 'space']).optional().describe('Specify lookup type; otherwise auto-detects'),
17
+ include_readme: z.boolean().default(true).describe('Include README from the repo'),
18
+ }),
19
+ annotations: {
20
+ title: 'Hub Repo Details',
21
+ destructiveHint: false,
22
+ readOnlyHint: true,
23
+ openWorldHint: false,
24
+ },
25
+ };
26
+ export class HubInspectTool {
27
+ modelDetail;
28
+ datasetDetail;
29
+ hubUrl;
30
+ constructor(hfToken, hubUrl) {
31
+ this.modelDetail = new ModelDetailTool(hfToken, hubUrl);
32
+ this.datasetDetail = new DatasetDetailTool(hfToken, hubUrl);
33
+ this.hubUrl = hubUrl;
34
+ }
35
+ async inspect(params, includeReadme = false) {
36
+ const parts = [];
37
+ let successCount = 0;
38
+ for (const id of params.repo_ids) {
39
+ try {
40
+ const section = await this.inspectSingle(id, params.repo_type, includeReadme);
41
+ parts.push(section);
42
+ successCount += 1;
43
+ }
44
+ catch (err) {
45
+ const msg = err instanceof Error ? err.message : String(err);
46
+ parts.push(`# ${id}\n\n- Error: ${msg}`);
47
+ }
48
+ }
49
+ return {
50
+ formatted: parts.join('\n\n---\n\n'),
51
+ totalResults: params.repo_ids.length,
52
+ resultsShared: successCount,
53
+ };
54
+ }
55
+ async inspectSingle(repoId, type, includeReadme) {
56
+ if (type === 'model') {
57
+ return (await this.modelDetail.getDetails(repoId, includeReadme)).formatted;
58
+ }
59
+ if (type === 'dataset') {
60
+ return (await this.datasetDetail.getDetails(repoId, includeReadme)).formatted;
61
+ }
62
+ if (type === 'space') {
63
+ return await this.getSpaceDetails(repoId);
64
+ }
65
+ const matches = [];
66
+ try {
67
+ const r = await this.modelDetail.getDetails(repoId, includeReadme);
68
+ matches.push(`**Type: Model**\n\n${r.formatted}`);
69
+ }
70
+ catch {
71
+ }
72
+ try {
73
+ const r = await this.datasetDetail.getDetails(repoId, includeReadme);
74
+ matches.push(`**Type: Dataset**\n\n${r.formatted}`);
75
+ }
76
+ catch {
77
+ }
78
+ try {
79
+ const r = await this.getSpaceDetails(repoId);
80
+ matches.push(`**Type: Space**\n\n${r}`);
81
+ }
82
+ catch {
83
+ }
84
+ if (matches.length === 0) {
85
+ throw new Error(`Could not find repo '${repoId}' as model, dataset, or space.`);
86
+ }
87
+ return matches.join('\n\n---\n\n');
88
+ }
89
+ async getSpaceDetails(spaceId) {
90
+ const additionalFields = ['author', 'tags', 'runtime', 'subdomain', 'sha'];
91
+ const info = await spaceInfo({
92
+ name: spaceId,
93
+ additionalFields: Array.from(additionalFields),
94
+ ...(this.hubUrl && { hubUrl: this.hubUrl }),
95
+ });
96
+ const lines = [];
97
+ lines.push(`# ${info.name}`);
98
+ lines.push('');
99
+ lines.push('## Overview');
100
+ const extra = info;
101
+ if (extra.author)
102
+ lines.push(`- **Author:** ${extra.author}`);
103
+ if (info.sdk)
104
+ lines.push(`- **SDK:** ${info.sdk}`);
105
+ lines.push(`- **Likes:** ${info.likes}`);
106
+ lines.push(`- **Updated:** ${formatDate(info.updatedAt)}`);
107
+ const tags = Array.isArray(extra.tags) ? extra.tags : undefined;
108
+ if (tags && tags.length)
109
+ lines.push(`- **Tags:** ${tags.join(', ')}`);
110
+ lines.push('');
111
+ lines.push(`**Link:** [https://hf.co/spaces/${info.name}](https://hf.co/spaces/${info.name})`);
112
+ return lines.join('\n');
113
+ }
114
+ }
115
+ //# sourceMappingURL=hub-inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub-inspect.js","sourceRoot":"","sources":["../src/hub-inspect.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -7,6 +7,7 @@ export * from './utilities.js';
7
7
  export * from './paper-search.js';
8
8
  export * from './dataset-search.js';
9
9
  export * from './dataset-detail.js';
10
+ export * from './hub-inspect.js';
10
11
  export * from './duplicate-space.js';
11
12
  export * from './space-info.js';
12
13
  export * from './space-files.js';
@@ -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,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAGlC,cAAc,wBAAwB,CAAC;AAGvC,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,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAGlC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ export * from './utilities.js';
7
7
  export * from './paper-search.js';
8
8
  export * from './dataset-search.js';
9
9
  export * from './dataset-detail.js';
10
+ export * from './hub-inspect.js';
10
11
  export * from './duplicate-space.js';
11
12
  export * from './space-info.js';
12
13
  export * from './space-files.js';
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,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAGlC,cAAc,wBAAwB,CAAC;AAGvC,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,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAGlC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,eAAe,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"readme-utils.d.ts","sourceRoot":"","sources":["../src/readme-utils.ts"],"names":[],"mappings":"AAYA,wBAAsB,kBAAkB,CACvC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,GAAG,UAAU,EAC3B,WAAW,GAAE,OAAe,GAC1B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqCxB"}
1
+ {"version":3,"file":"readme-utils.d.ts","sourceRoot":"","sources":["../src/readme-utils.ts"],"names":[],"mappings":"AAeA,wBAAsB,kBAAkB,CACvC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,GAAG,UAAU,EAC3B,WAAW,GAAE,OAAe,GAC1B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2CxB"}
@@ -1,3 +1,4 @@
1
+ const DEFAULT_MAX_README_CHARS = 10_000;
1
2
  export async function fetchReadmeContent(repoName, type, includeYaml = false) {
2
3
  try {
3
4
  const baseUrl = type === 'datasets'
@@ -15,6 +16,10 @@ export async function fetchReadmeContent(repoName, type, includeYaml = false) {
15
16
  if (!includeYaml) {
16
17
  content = stripYamlFrontmatter(content);
17
18
  }
19
+ if (content.length > DEFAULT_MAX_README_CHARS) {
20
+ const truncated = content.slice(0, DEFAULT_MAX_README_CHARS);
21
+ content = `${truncated}\n\n[... truncated to ~${DEFAULT_MAX_README_CHARS.toString()} characters — full README: ${baseUrl}]`;
22
+ }
18
23
  if (!content.trim()) {
19
24
  return null;
20
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"readme-utils.js","sourceRoot":"","sources":["../src/readme-utils.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,QAAgB,EAChB,IAA2B,EAC3B,cAAuB,KAAK;IAE5B,IAAI,CAAC;QAEJ,MAAM,OAAO,GAAG,IAAI,KAAK,UAAU;YAClC,CAAC,CAAC,mCAAmC,QAAQ,EAAE;YAC/C,CAAC,CAAC,0BAA0B,QAAQ,EAAE,CAAC;QAExC,MAAM,GAAG,GAAG,GAAG,OAAO,yBAAyB,CAAC;QAEhD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAE7B,OAAO,IAAI,CAAC;YACb,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAGpC,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAGD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAEhB,OAAO,CAAC,KAAK,CAAC,8BAA8B,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAQD,SAAS,oBAAoB,CAAC,OAAe;IAE5C,MAAM,WAAW,GAAG,mDAAmD,CAAC;IACxE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAEzC,IAAI,KAAK,EAAE,CAAC;QAEX,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAGD,OAAO,OAAO,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"readme-utils.js","sourceRoot":"","sources":["../src/readme-utils.ts"],"names":[],"mappings":"AAKA,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAUxC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,QAAgB,EAChB,IAA2B,EAC3B,cAAuB,KAAK;IAE5B,IAAI,CAAC;QAEJ,MAAM,OAAO,GAAG,IAAI,KAAK,UAAU;YAClC,CAAC,CAAC,mCAAmC,QAAQ,EAAE;YAC/C,CAAC,CAAC,0BAA0B,QAAQ,EAAE,CAAC;QAExC,MAAM,GAAG,GAAG,GAAG,OAAO,yBAAyB,CAAC;QAEhD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAE7B,OAAO,IAAI,CAAC;YACb,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAGpC,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAGD,IAAI,OAAO,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;YAC7D,OAAO,GAAG,GAAG,SAAS,0BAA0B,wBAAwB,CAAC,QAAQ,EAAE,8BAA8B,OAAO,GAAG,CAAC;QAC7H,CAAC;QAGD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAEhB,OAAO,CAAC,KAAK,CAAC,8BAA8B,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAQD,SAAS,oBAAoB,CAAC,OAAe;IAE5C,MAAM,WAAW,GAAG,mDAAmD,CAAC;IACxE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAEzC,IAAI,KAAK,EAAE,CAAC;QAEX,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAGD,OAAO,OAAO,CAAC;AAChB,CAAC"}
@@ -4,6 +4,7 @@ export declare const MODEL_DETAIL_TOOL_ID: "model_details";
4
4
  export declare const PAPER_SEARCH_TOOL_ID: "paper_search";
5
5
  export declare const DATASET_SEARCH_TOOL_ID: "dataset_search";
6
6
  export declare const DATASET_DETAIL_TOOL_ID: "dataset_details";
7
+ export declare const HUB_INSPECT_TOOL_ID: "hub_repo_details";
7
8
  export declare const DUPLICATE_SPACE_TOOL_ID: "duplicate_space";
8
9
  export declare const SPACE_INFO_TOOL_ID: "space_info";
9
10
  export declare const SPACE_FILES_TOOL_ID: "space_files";
@@ -13,14 +14,14 @@ export declare const USER_SUMMARY_PROMPT_ID: "User Summary";
13
14
  export declare const PAPER_SUMMARY_PROMPT_ID: "Paper Summary";
14
15
  export declare const MODEL_DETAIL_PROMPT_ID: string;
15
16
  export declare const DATASET_DETAIL_PROMPT_ID: string;
16
- 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"];
17
+ 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"];
17
18
  export declare const TOOL_ID_GROUPS: {
18
19
  readonly search: readonly ["space_search", "model_search", "dataset_search", "paper_search", "hf_doc_search"];
19
20
  readonly spaces: readonly ["space_search", "duplicate_space", "space_info", "space_files"];
20
- readonly detail: readonly ["model_details", "dataset_details"];
21
+ readonly detail: readonly ["model_details", "dataset_details", "hub_repo_details"];
21
22
  readonly docs: readonly ["hf_doc_search", "hf_doc_fetch"];
22
23
  readonly hf_api: readonly ["space_search", "model_search", "dataset_search", "paper_search", "model_details", "dataset_details", "hf_doc_search"];
23
- 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"];
24
+ 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"];
24
25
  };
25
26
  export type BuiltinToolId = (typeof ALL_BUILTIN_TOOL_IDS)[number];
26
27
  export declare function isValidBuiltinToolId(toolId: string): toolId is BuiltinToolId;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-ids.d.ts","sourceRoot":"","sources":["../src/tool-ids.ts"],"names":[],"mappings":"AAwBA,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;AACxE,eAAO,MAAM,sBAAsB,QAAkC,CAAC;AACtE,eAAO,MAAM,wBAAwB,QAAoC,CAAC;AAG1E,eAAO,MAAM,oBAAoB,kMAYvB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;;;CAqBjB,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"}
1
+ {"version":3,"file":"tool-ids.d.ts","sourceRoot":"","sources":["../src/tool-ids.ts"],"names":[],"mappings":"AAyBA,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,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;AAG1E,eAAO,MAAM,oBAAoB,sNAavB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;;;CAqBjB,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,10 +1,11 @@
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, 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';
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, } 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;
5
5
  export const PAPER_SEARCH_TOOL_ID = PAPER_SEARCH_TOOL_CONFIG.name;
6
6
  export const DATASET_SEARCH_TOOL_ID = DATASET_SEARCH_TOOL_CONFIG.name;
7
7
  export const DATASET_DETAIL_TOOL_ID = DATASET_DETAIL_TOOL_CONFIG.name;
8
+ export const HUB_INSPECT_TOOL_ID = HUB_INSPECT_TOOL_CONFIG.name;
8
9
  export const DUPLICATE_SPACE_TOOL_ID = DUPLICATE_SPACE_TOOL_CONFIG.name;
9
10
  export const SPACE_INFO_TOOL_ID = SPACE_INFO_TOOL_CONFIG.name;
10
11
  export const SPACE_FILES_TOOL_ID = SPACE_FILES_TOOL_CONFIG.name;
@@ -21,6 +22,7 @@ export const ALL_BUILTIN_TOOL_IDS = [
21
22
  PAPER_SEARCH_TOOL_ID,
22
23
  DATASET_SEARCH_TOOL_ID,
23
24
  DATASET_DETAIL_TOOL_ID,
25
+ HUB_INSPECT_TOOL_ID,
24
26
  DUPLICATE_SPACE_TOOL_ID,
25
27
  SPACE_INFO_TOOL_ID,
26
28
  SPACE_FILES_TOOL_ID,
@@ -36,7 +38,7 @@ export const TOOL_ID_GROUPS = {
36
38
  DOCS_SEMANTIC_SEARCH_TOOL_ID,
37
39
  ],
38
40
  spaces: [SPACE_SEARCH_TOOL_ID, DUPLICATE_SPACE_TOOL_ID, SPACE_INFO_TOOL_ID, SPACE_FILES_TOOL_ID],
39
- detail: [MODEL_DETAIL_TOOL_ID, DATASET_DETAIL_TOOL_ID],
41
+ detail: [MODEL_DETAIL_TOOL_ID, DATASET_DETAIL_TOOL_ID, HUB_INSPECT_TOOL_ID],
40
42
  docs: [DOCS_SEMANTIC_SEARCH_TOOL_ID, DOC_FETCH_TOOL_ID],
41
43
  hf_api: [
42
44
  SPACE_SEARCH_TOOL_ID,
@@ -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,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;AACxE,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,IAAI,CAAC;AACtE,MAAM,CAAC,MAAM,wBAAwB,GAAG,4BAA4B,CAAC,IAAI,CAAC;AAG1E,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;QACP,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,oBAAoB;QACpB,4BAA4B;KACnB;IACV,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;QACtB,4BAA4B;KACnB;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"}
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,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,mBAAmB,GAAG,uBAAuB,CAAC,IAAI,CAAC;AAChE,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;AACxE,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,IAAI,CAAC;AACtE,MAAM,CAAC,MAAM,wBAAwB,GAAG,4BAA4B,CAAC,IAAI,CAAC;AAG1E,MAAM,CAAC,MAAM,oBAAoB,GAAG;IACnC,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,sBAAsB;IACtB,sBAAsB;IACtB,mBAAmB;IACnB,uBAAuB;IACvB,kBAAkB;IAClB,mBAAmB;IACnB,4BAA4B;IAC5B,iBAAiB;CACR,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,MAAM,EAAE;QACP,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,oBAAoB;QACpB,4BAA4B;KACnB;IACV,MAAM,EAAE,CAAC,oBAAoB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,mBAAmB,CAAU;IACzG,MAAM,EAAE,CAAC,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,CAAU;IACpF,IAAI,EAAE,CAAC,4BAA4B,EAAE,iBAAiB,CAAU;IAChE,MAAM,EAAE;QACP,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,4BAA4B;KACnB;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.2.18",
3
+ "version": "0.2.20",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -5,7 +5,7 @@ describe('DocFetchTool', () => {
5
5
  const tool = new DocFetchTool();
6
6
 
7
7
  describe('URL validation', () => {
8
- it('should accept valid HF docs URLs', () => {
8
+ it('should accept valid HF and Gradio docs URLs', () => {
9
9
  const validUrls = [
10
10
  'https://huggingface.co/docs/dataset-viewer/index',
11
11
  'https://huggingface.co/docs/huggingface_hub/guides/upload#faster-uploads',
@@ -13,6 +13,8 @@ describe('DocFetchTool', () => {
13
13
  'https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion',
14
14
  'https://huggingface.co/docs/timm/models',
15
15
  'https://huggingface.co/docs/transformers',
16
+ 'https://gradio.app',
17
+ 'https://www.gradio.app/guides',
16
18
  ];
17
19
 
18
20
  for (const url of validUrls) {
@@ -30,7 +32,7 @@ describe('DocFetchTool', () => {
30
32
  ];
31
33
 
32
34
  for (const url of invalidUrls) {
33
- expect(() => tool.validateUrl(url)).toThrow('That was not a valid Hugging Face document URL');
35
+ expect(() => tool.validateUrl(url)).toThrow('That was not a valid documentation URL');
34
36
  }
35
37
  });
36
38
  });
@@ -102,4 +104,4 @@ describe('DocFetchTool', () => {
102
104
  expect(result).toContain('Error: Offset 10000 is beyond');
103
105
  });
104
106
  });
105
- });
107
+ });
@@ -5,13 +5,9 @@ import { estimateTokens } from '../utilities.js';
5
5
  export const DOC_FETCH_CONFIG = {
6
6
  name: 'hf_doc_fetch',
7
7
  description:
8
- 'Fetch a document from the Hugging Face documentation library. For large documents, use offset to get subsequent chunks.',
8
+ 'Fetch a document from the Hugging Face or Gradio documentation library. For large documents, use offset to get subsequent chunks.',
9
9
  schema: z.object({
10
- doc_url: z
11
- .string()
12
- .min(28, 'Url should start with https://huggingface.co/docs/')
13
- .max(200, 'Query too long')
14
- .describe('Hugging Face documentation URL'),
10
+ doc_url: z.string().max(200, 'Query too long').describe('Documentation URL (Hugging Face or Gradio)'),
15
11
  offset: z
16
12
  .number()
17
13
  .min(0)
@@ -19,7 +15,7 @@ export const DOC_FETCH_CONFIG = {
19
15
  .describe('Token offset for large documents (use the offset from truncation message)'),
20
16
  }),
21
17
  annotations: {
22
- title: 'Fetch a document from the Hugging Face library',
18
+ title: 'Fetch a document from the Hugging Face documentation library',
23
19
  destructiveHint: false,
24
20
  readOnlyHint: true,
25
21
  openWorldHint: true,
@@ -38,20 +34,97 @@ export class DocFetchTool {
38
34
  });
39
35
  this.turndownService.remove('head');
40
36
  this.turndownService.remove('script');
37
+
38
+ // Drop common non-content containers to reduce noise
39
+ this.turndownService.remove((node) => {
40
+ try {
41
+ const tag = ((node as unknown as { nodeName?: string }).nodeName || '').toLowerCase();
42
+ if (['header', 'nav', 'footer', 'aside', 'form', 'button', 'style', 'noscript', 'iframe'].includes(tag)) {
43
+ return true;
44
+ }
45
+ } catch {
46
+ /* ignore */
47
+ }
48
+ return false;
49
+ });
41
50
  this.turndownService.remove((node) => {
51
+ // Strip inline SVGs as they are noisy and rarely useful in text docs
52
+ try {
53
+ if (typeof (node as unknown as { nodeName?: string }).nodeName === 'string') {
54
+ const tag = ((node as unknown as { nodeName: string }).nodeName || '').toLowerCase();
55
+ if (tag === 'svg') {
56
+ return true;
57
+ }
58
+ }
59
+ } catch {
60
+ /* ignore */
61
+ }
62
+
42
63
  if (node.nodeName === 'a' && node.innerHTML.includes('<!-- HTML_TAG_START -->')) {
43
64
  return true;
44
65
  }
66
+ // Remove <img ... src="...svg"> or data-uri SVGs to avoid markdown noise
67
+ const nodeName = ((node as unknown as { nodeName?: string }).nodeName || '').toLowerCase();
68
+ if (nodeName === 'img') {
69
+ try {
70
+ const src = (node as unknown as { getAttribute?: (name: string) => string | null }).getAttribute?.('src') ??
71
+ ((node as unknown as { src?: string }).src || '');
72
+ if (
73
+ /\.svg(\?|$)/i.test(src) ||
74
+ /^data:image\/svg\+xml[,;]/i.test(src) ||
75
+ src.toLowerCase().includes('image/svg+xml')
76
+ ) {
77
+ return true;
78
+ }
79
+ } catch {
80
+ /* ignore */
81
+ }
82
+ }
45
83
  return false;
46
84
  });
85
+
86
+ // Drop anchor-only heading icons or anchors containing encoded SVG payloads
87
+ this.turndownService.addRule('dropHeadingAnchors', {
88
+ filter: (node) => {
89
+ try {
90
+ const n = node as unknown as { nodeName?: string; getAttribute?: (k: string) => string | null; textContent?: string; childNodes?: Array<{ nodeName?: string }> };
91
+ if ((n.nodeName || '').toLowerCase() !== 'a') return false;
92
+ const href = n.getAttribute?.('href') || '';
93
+ if (!href || !href.startsWith('#')) return false;
94
+ const text = (n.textContent || '').trim();
95
+ const children = (n as unknown as { childNodes?: Array<{ nodeName?: string }> }).childNodes || [];
96
+ const onlyIcons = children.length > 0 && children.every((c) => ((c.nodeName || '').toLowerCase() === 'img' || (c.nodeName || '').toLowerCase() === 'svg'));
97
+ const looksLikeEncodedSvg = /data:image\/svg\+xml|%3csvg|svg%2bxml/i.test(text);
98
+ const noAlnumText = text.length <= 3 && !/[a-z0-9]/i.test(text);
99
+ return onlyIcons || looksLikeEncodedSvg || noAlnumText;
100
+ } catch {
101
+ return false;
102
+ }
103
+ },
104
+ replacement: () => ''
105
+ });
47
106
  }
48
107
 
49
108
  /**
50
109
  * Validate HF docs URL
51
110
  */
52
111
  validateUrl(hfUrl: string): void {
53
- if (!hfUrl.startsWith('https://huggingface.co/docs/')) {
54
- throw new Error('That was not a valid Hugging Face document URL');
112
+ try {
113
+ const url = new URL(hfUrl);
114
+ if (url.protocol !== 'https:') {
115
+ throw new Error('That was not a valid documentation URL');
116
+ }
117
+
118
+ const hostname = url.hostname.toLowerCase();
119
+ const isHfDocs =
120
+ (hostname === 'huggingface.co' || hostname === 'www.huggingface.co') && url.pathname.startsWith('/docs/');
121
+ const isGradio = hostname === 'gradio.app' || hostname === 'www.gradio.app';
122
+
123
+ if (!isHfDocs && !isGradio) {
124
+ throw new Error('That was not a valid documentation URL');
125
+ }
126
+ } catch {
127
+ throw new Error('That was not a valid documentation URL');
55
128
  }
56
129
  }
57
130
 
@@ -71,7 +144,18 @@ export class DocFetchTool {
71
144
  const htmlContent = await response.text();
72
145
 
73
146
  // Convert HTML to Markdown
74
- const fullMarkdownContent = this.turndownService.turndown(htmlContent);
147
+ let fullMarkdownContent = this.turndownService.turndown(htmlContent);
148
+
149
+ // Post-process: strip any leftover SVG images that slipped past DOM filters
150
+ // - Markdown images pointing to data:image/svg+xml or *.svg
151
+ // - Empty links left behind after image removal: [](...)
152
+ fullMarkdownContent = fullMarkdownContent
153
+ .replace(/!\[[^\]]*\]\(\s*(?:data:image\/svg\+xml[^)]*|[^)]*\.svg(?:\?[^)]*)?)\s*\)/gi, '')
154
+ .replace(/\[\s*\]\(\s*[^)]*\s*\)/g, '');
155
+
156
+ // Remove anchors whose link text still contains encoded SVG payloads (edge cases)
157
+ fullMarkdownContent = fullMarkdownContent
158
+ .replace(/\[[^\]]*(?:data:image\/svg\+xml|%3csvg|svg%2bxml)[^\]]*\]\([^)]*\)/gi, '');
75
159
 
76
160
  // Apply chunking logic
77
161
  return this.applyChunking(fullMarkdownContent, params.offset || 0);
@@ -0,0 +1,142 @@
1
+ import { z } from 'zod';
2
+ import type { ToolResult } from './types/tool-result.js';
3
+ import { ModelDetailTool } from './model-detail.js';
4
+ import { DatasetDetailTool } from './dataset-detail.js';
5
+ import { spaceInfo } from '@huggingface/hub';
6
+ import { formatDate } from './utilities.js';
7
+
8
+ export const HUB_INSPECT_TOOL_CONFIG = {
9
+ name: 'hub_repo_details',
10
+ description:
11
+ 'Get details for one or more Hugging Face repos (model, dataset, or space). ' +
12
+ 'Auto-detects type unless specified.',
13
+ schema: z.object({
14
+ repo_ids: z
15
+ .array(z.string().min(1))
16
+ .min(1, 'Provide at least one id')
17
+ .max(10, 'Provide at most 10 repo ids')
18
+ .describe('Repo IDs for (models|dataset/space) - usually in author/name format (e.g. openai/gpt-oss-120b)'),
19
+ repo_type: z.enum(['model', 'dataset', 'space']).optional().describe('Specify lookup type; otherwise auto-detects'),
20
+ include_readme: z.boolean().default(true).describe('Include README from the repo'),
21
+ }),
22
+ annotations: {
23
+ title: 'Hub Repo Details',
24
+ destructiveHint: false,
25
+ readOnlyHint: true,
26
+ openWorldHint: false,
27
+ },
28
+ } as const;
29
+
30
+ export type HubInspectParams = z.infer<typeof HUB_INSPECT_TOOL_CONFIG.schema>;
31
+
32
+ export class HubInspectTool {
33
+ private readonly modelDetail: ModelDetailTool;
34
+ private readonly datasetDetail: DatasetDetailTool;
35
+ private readonly hubUrl?: string;
36
+
37
+ constructor(hfToken?: string, hubUrl?: string) {
38
+ this.modelDetail = new ModelDetailTool(hfToken, hubUrl);
39
+ this.datasetDetail = new DatasetDetailTool(hfToken, hubUrl);
40
+ this.hubUrl = hubUrl;
41
+ }
42
+
43
+ async inspect(params: HubInspectParams, includeReadme: boolean = false): Promise<ToolResult> {
44
+ const parts: string[] = [];
45
+ let successCount = 0;
46
+
47
+ for (const id of params.repo_ids) {
48
+ try {
49
+ const section = await this.inspectSingle(id, params.repo_type, includeReadme);
50
+ parts.push(section);
51
+ successCount += 1;
52
+ } catch (err) {
53
+ const msg = err instanceof Error ? err.message : String(err);
54
+ parts.push(`# ${id}\n\n- Error: ${msg}`);
55
+ }
56
+ }
57
+
58
+ return {
59
+ formatted: parts.join('\n\n---\n\n'),
60
+ totalResults: params.repo_ids.length,
61
+ resultsShared: successCount,
62
+ };
63
+ }
64
+
65
+ private async inspectSingle(
66
+ repoId: string,
67
+ type: 'model' | 'dataset' | 'space' | undefined,
68
+ includeReadme: boolean
69
+ ): Promise<string> {
70
+ // If caller constrained the type, do only that
71
+ if (type === 'model') {
72
+ return (await this.modelDetail.getDetails(repoId, includeReadme)).formatted;
73
+ }
74
+ if (type === 'dataset') {
75
+ return (await this.datasetDetail.getDetails(repoId, includeReadme)).formatted;
76
+ }
77
+ if (type === 'space') {
78
+ return await this.getSpaceDetails(repoId);
79
+ }
80
+
81
+ // Auto-detect: attempt all three and aggregate. The same id may exist for multiple types.
82
+ const matches: string[] = [];
83
+
84
+ try {
85
+ const r = await this.modelDetail.getDetails(repoId, includeReadme);
86
+ matches.push(`**Type: Model**\n\n${r.formatted}`);
87
+ } catch {
88
+ /* not a model */
89
+ }
90
+
91
+ try {
92
+ const r = await this.datasetDetail.getDetails(repoId, includeReadme);
93
+ matches.push(`**Type: Dataset**\n\n${r.formatted}`);
94
+ } catch {
95
+ /* not a dataset */
96
+ }
97
+
98
+ try {
99
+ const r = await this.getSpaceDetails(repoId);
100
+ matches.push(`**Type: Space**\n\n${r}`);
101
+ } catch {
102
+ /* not a space */
103
+ }
104
+
105
+ if (matches.length === 0) {
106
+ throw new Error(`Could not find repo '${repoId}' as model, dataset, or space.`);
107
+ }
108
+
109
+ return matches.join('\n\n---\n\n');
110
+ }
111
+
112
+ private async getSpaceDetails(spaceId: string): Promise<string> {
113
+ const additionalFields = ['author', 'tags', 'runtime', 'subdomain', 'sha'] as const;
114
+ const info = await spaceInfo<(typeof additionalFields)[number]>({
115
+ name: spaceId,
116
+ additionalFields: Array.from(additionalFields),
117
+ ...(this.hubUrl && { hubUrl: this.hubUrl }),
118
+ });
119
+
120
+ const lines: string[] = [];
121
+ lines.push(`# ${info.name}`);
122
+ lines.push('');
123
+ lines.push('## Overview');
124
+ interface SpaceExtra {
125
+ author?: string;
126
+ tags?: readonly string[] | string[];
127
+ runtime?: unknown;
128
+ subdomain?: string;
129
+ sha?: string;
130
+ }
131
+ const extra = info as Partial<SpaceExtra>;
132
+ if (extra.author) lines.push(`- **Author:** ${extra.author}`);
133
+ if (info.sdk) lines.push(`- **SDK:** ${info.sdk}`);
134
+ lines.push(`- **Likes:** ${info.likes}`);
135
+ lines.push(`- **Updated:** ${formatDate(info.updatedAt)}`);
136
+ const tags = Array.isArray(extra.tags) ? extra.tags : undefined;
137
+ if (tags && tags.length) lines.push(`- **Tags:** ${tags.join(', ')}`);
138
+ lines.push('');
139
+ lines.push(`**Link:** [https://hf.co/spaces/${info.name}](https://hf.co/spaces/${info.name})`);
140
+ return lines.join('\n');
141
+ }
142
+ }
package/src/index.ts CHANGED
@@ -8,6 +8,7 @@ export * from './utilities.js';
8
8
  export * from './paper-search.js';
9
9
  export * from './dataset-search.js';
10
10
  export * from './dataset-detail.js';
11
+ export * from './hub-inspect.js';
11
12
  export * from './duplicate-space.js';
12
13
  export * from './space-info.js';
13
14
  export * from './space-files.js';
@@ -2,6 +2,9 @@
2
2
  * Utility functions for fetching and processing README files from Hugging Face repositories
3
3
  */
4
4
 
5
+ // Maximum number of characters to include from a README
6
+ const DEFAULT_MAX_README_CHARS = 10_000;
7
+
5
8
  /**
6
9
  * Fetches README content from a Hugging Face repository
7
10
  *
@@ -40,6 +43,12 @@ export async function fetchReadmeContent(
40
43
  content = stripYamlFrontmatter(content);
41
44
  }
42
45
 
46
+ // Truncate overly long READMEs to a sensible default size
47
+ if (content.length > DEFAULT_MAX_README_CHARS) {
48
+ const truncated = content.slice(0, DEFAULT_MAX_README_CHARS);
49
+ content = `${truncated}\n\n[... truncated to ~${DEFAULT_MAX_README_CHARS.toString()} characters — full README: ${baseUrl}]`;
50
+ }
51
+
43
52
  // Return null if content is empty after processing
44
53
  if (!content.trim()) {
45
54
  return null;
@@ -71,4 +80,4 @@ function stripYamlFrontmatter(content: string): string {
71
80
 
72
81
  // No YAML frontmatter found, return original content
73
82
  return content;
74
- }
83
+ }
package/src/tool-ids.ts CHANGED
@@ -12,6 +12,7 @@ import {
12
12
  DATASET_SEARCH_TOOL_CONFIG,
13
13
  DATASET_DETAIL_TOOL_CONFIG,
14
14
  DATASET_DETAIL_PROMPT_CONFIG,
15
+ HUB_INSPECT_TOOL_CONFIG,
15
16
  DUPLICATE_SPACE_TOOL_CONFIG,
16
17
  SPACE_INFO_TOOL_CONFIG,
17
18
  SPACE_FILES_TOOL_CONFIG,
@@ -28,6 +29,7 @@ export const MODEL_DETAIL_TOOL_ID = MODEL_DETAIL_TOOL_CONFIG.name;
28
29
  export const PAPER_SEARCH_TOOL_ID = PAPER_SEARCH_TOOL_CONFIG.name;
29
30
  export const DATASET_SEARCH_TOOL_ID = DATASET_SEARCH_TOOL_CONFIG.name;
30
31
  export const DATASET_DETAIL_TOOL_ID = DATASET_DETAIL_TOOL_CONFIG.name;
32
+ export const HUB_INSPECT_TOOL_ID = HUB_INSPECT_TOOL_CONFIG.name;
31
33
  export const DUPLICATE_SPACE_TOOL_ID = DUPLICATE_SPACE_TOOL_CONFIG.name;
32
34
  export const SPACE_INFO_TOOL_ID = SPACE_INFO_TOOL_CONFIG.name;
33
35
  export const SPACE_FILES_TOOL_ID = SPACE_FILES_TOOL_CONFIG.name;
@@ -46,6 +48,7 @@ export const ALL_BUILTIN_TOOL_IDS = [
46
48
  PAPER_SEARCH_TOOL_ID,
47
49
  DATASET_SEARCH_TOOL_ID,
48
50
  DATASET_DETAIL_TOOL_ID,
51
+ HUB_INSPECT_TOOL_ID,
49
52
  DUPLICATE_SPACE_TOOL_ID,
50
53
  SPACE_INFO_TOOL_ID,
51
54
  SPACE_FILES_TOOL_ID,
@@ -62,7 +65,7 @@ export const TOOL_ID_GROUPS = {
62
65
  DOCS_SEMANTIC_SEARCH_TOOL_ID,
63
66
  ] as const,
64
67
  spaces: [SPACE_SEARCH_TOOL_ID, DUPLICATE_SPACE_TOOL_ID, SPACE_INFO_TOOL_ID, SPACE_FILES_TOOL_ID] as const,
65
- detail: [MODEL_DETAIL_TOOL_ID, DATASET_DETAIL_TOOL_ID] as const,
68
+ detail: [MODEL_DETAIL_TOOL_ID, DATASET_DETAIL_TOOL_ID, HUB_INSPECT_TOOL_ID] as const,
66
69
  docs: [DOCS_SEMANTIC_SEARCH_TOOL_ID, DOC_FETCH_TOOL_ID] as const,
67
70
  hf_api: [
68
71
  SPACE_SEARCH_TOOL_ID,