Skip to main content
Glama

fetch_link_documentation

Extract documentation components, APIs, and usage examples from website links using configurable crawling depth and content selectors.

Instructions

Fetch and analyze documentation from a website link, extracting all available components, APIs, and usage examples

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
depthNoHow deep to crawl links (0-3, default: 1)
selectorNoOptional CSS selector to focus on specific contentbody
urlYesThe URL to fetch documentation from (e.g., WindUI documentation)

Implementation Reference

  • The entry-point handler function for the 'fetch_link_documentation' tool. It clears visited URLs, crawls the provided URL (with optional selector and depth), formats the result, and returns it as MCP content.
    async fetchDocumentation(args: FetchDocumentationArgs) {
      this.visitedUrls.clear();
    
      try {
        const result = await this.crawlPage(args.url, args.selector || 'body', args.depth || 1);
        
        return {
          content: [
            {
              type: "text",
              text: this.formatDocumentationResult(result),
            },
          ],
        };
      } catch (error) {
        throw new Error(`Failed to fetch documentation: ${error instanceof Error ? error.message : String(error)}`);
      }
    }
  • Core helper method that performs the actual web crawling, content extraction (title, text, components, APIs, examples, links), and recursive crawling based on depth.
    private async crawlPage(url: string, selector: string, depth: number): Promise<DocumentationResult> {
      if (this.visitedUrls.has(url) || depth < 0) {
        return this.createEmptyResult(url);
      }
    
      this.visitedUrls.add(url);
    
      try {
        const response = await axios.get(url, {
          timeout: 10000,
          headers: {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
          }
        });
    
        const $ = cheerio.load(response.data);
        const selectedContent = $(selector);
    
        const result: DocumentationResult = {
          url,
          title: $('title').text().trim() || $('h1').first().text().trim() || 'Untitled',
          content: this.extractTextContent(selectedContent),
          components: this.extractComponents($),
          apis: this.extractAPIs($),
          examples: this.extractExamples($),
          links: this.extractLinks($, url),
        };
    
        // 如果depth > 0,继续爬取相关链接
        if (depth > 0) {
          const relatedLinks = result.links
            .filter(link => this.isRelevantLink(link))
            .slice(0, 5); // 限制每页最多5个链接
    
          for (const link of relatedLinks) {
            const subResult = await this.crawlPage(link, selector, depth - 1);
            result.content += `\n\n--- Linked Page: ${subResult.title} ---\n${subResult.content}`;
            result.components.push(...subResult.components);
            result.apis.push(...subResult.apis);
            result.examples.push(...subResult.examples);
          }
        }
    
        return result;
      } catch (error) {
        console.error(`Error crawling ${url}:`, error);
        return this.createEmptyResult(url);
      }
    }
  • JSON schema defining the input parameters for the tool: required 'url', optional 'selector' and 'depth'.
    inputSchema: {
      type: "object",
      properties: {
        url: {
          type: "string",
          description: "The URL to fetch documentation from (e.g., WindUI documentation)",
        },
        selector: {
          type: "string",
          description: "Optional CSS selector to focus on specific content",
          default: "body"
        },
        depth: {
          type: "number",
          description: "How deep to crawl links (0-3, default: 1)",
          default: 1
        }
      },
      required: ["url"],
    },
  • src/index.ts:33-62 (registration)
    Registers the tool in MCP ListToolsRequestHandler, providing name, description, and input schema.
    this.server.setRequestHandler(ListToolsRequestSchema, async () => {
      return {
        tools: [
          {
            name: "fetch_link_documentation",
            description: "Fetch and analyze documentation from a website link, extracting all available components, APIs, and usage examples",
            inputSchema: {
              type: "object",
              properties: {
                url: {
                  type: "string",
                  description: "The URL to fetch documentation from (e.g., WindUI documentation)",
                },
                selector: {
                  type: "string",
                  description: "Optional CSS selector to focus on specific content",
                  default: "body"
                },
                depth: {
                  type: "number",
                  description: "How deep to crawl links (0-3, default: 1)",
                  default: 1
                }
              },
              required: ["url"],
            },
          },
        ],
      };
    });
  • src/index.ts:68-71 (registration)
    Dispatches calls to 'fetch_link_documentation' to the LinkDocumentationTool instance in the CallToolRequestHandler.
    switch (name) {
      case "fetch_link_documentation":
        return await this.linkTool.fetchDocumentation(args as any);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lijianye521/link-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server