Docs Fetch MCP Server
Obter conteúdo de páginas da web com exploração recursiva.
Documentação
Servidor MCP de Busca de Documentação
Um servidor de Model Context Protocol (MCP) baseado em Bun para buscar páginas de documentação e realizar rastreamentos limitados de documentação.
O servidor expõe uma ferramenta MCP, fetch_doc_content. Ela busca uma URL raiz, extrai Markdown legível, classifica links e pode rastrear páginas vinculadas dentro de limites explícitos de profundidade, página, tempo limite e escopo. Os resultados são retornados como JSON estruturado com metadados de rastreamento, conteúdo da página, links classificados, sinalizadores de truncamento e erros por página.
Recursos
- Caminho de busca estática rápida com
axios - Renderização opcional com Puppeteer para páginas renderizadas no cliente ou páginas finas
- Extração de Markdown com cabeçalhos, listas, blocos de código, tabelas, citações em bloco e links
- Semântica real de profundidade de rastreamento:
depth: 1retorna apenas a página raizdepth: 2inclui links filhos diretosdepth: 3inclui netos, até o máximo de5
- Normalização de URL antes da deduplicação: fragmentos, parâmetros de rastreamento, portas padrão e duplicatas de barra final são removidos
- Escopo de rastreamento por mesma origem e
pathPrefixopcional - Limites de
maxPages,maxConcurrency, tempo limite global, tempo limite por página e truncamento de conteúdo por página - Resultados parciais com falhas explícitas por página
- Validação de argumentos em tempo de execução compartilhada com o esquema de ferramenta anunciado
Requisitos
- Bun
>=1.3.0 - Instalação do navegador do Puppeteer se
renderforautooualways
Este projeto usa Bun para gerenciamento de dependências, execução em tempo de execução, builds e testes.
Instalação
bun install
bun run build
Configure seu cliente MCP:
{
"mcpServers": {
"docs-fetch": {
"command": "bun",
"args": ["/path/to/docs-fetch-mcp/build/index.js"]
}
}
}
Para desenvolvimento local sem build:
{
"mcpServers": {
"docs-fetch": {
"command": "bun",
"args": ["/path/to/docs-fetch-mcp/src/index.ts"]
}
}
}
Ferramenta
fetch_doc_content
Busca uma URL e opcionalmente rastreia páginas vinculadas.
Parâmetros:
| Nome | Tipo | Padrão | Limite | Descrição |
|---|---|---|---|---|
url | string | obrigatório | Somente HTTP/HTTPS | URL raiz a ser buscada. |
depth | número | 1 | 1 a 5 | Distância do link a partir da raiz. |
maxPages | número | 10 | 1 a 50 | Máximo de páginas retornadas no rastreamento. |
maxConcurrency | número | 3 | 1 a 8 | Máximo de páginas buscadas de uma vez. |
timeoutMs | número | 45000 | 5000 a 120000 | Tempo limite global do rastreamento. |
perPageTimeoutMs | número | 10000 | 1000 a 60000 | Tempo limite de busca por página. |
render | string | auto | auto, always, never | Estratégia de renderização do navegador. |
sameOrigin | booleano | true | n/a | Restringe links rastreados à mesma origem. |
pathPrefix | string | omitido | n/a | Escopo opcional de prefixo de caminho para rastreamento, como /docs. |
contentLimit | número | 12000 | 1000 a 50000 | Caracteres de Markdown por página antes do truncamento. |
includeLinks | booleano | true | n/a | Inclui links classificados nos objetos de página retornados. |
Exemplo de solicitação:
{
"url": "https://example.com/docs",
"depth": 2,
"maxPages": 8,
"pathPrefix": "/docs",
"render": "auto"
}
Formato da resposta:
{
"rootUrl": "https://example.com/docs",
"normalizedRootUrl": "https://example.com/docs",
"explorationDepth": 2,
"maxPages": 8,
"pagesExplored": 3,
"pagesFailed": 1,
"timedOut": false,
"durationMs": 1234,
"crawl": {
"sameOrigin": true,
"pathPrefix": "/docs",
"maxConcurrency": 3,
"render": "auto",
"perPageTimeoutMs": 10000
},
"content": [
{
"url": "https://example.com/docs",
"finalUrl": "https://example.com/docs",
"depth": 0,
"status": 200,
"title": "Documentation",
"description": "Example documentation",
"canonicalUrl": "https://example.com/docs",
"headings": ["Documentation"],
"content": "# Documentation\n\n...",
"contentLength": 2400,
"truncated": false,
"fetchedWith": "http",
"links": [
{
"url": "https://example.com/docs/api",
"text": "API reference",
"score": 18.5,
"internal": true
}
]
}
],
"errors": [
{
"url": "https://example.com/docs/missing",
"depth": 1,
"error": "Request failed with status code 404",
"status": 404
}
]
}
Comportamento de Rastreamento
- O rastreamento é em largura (breadth-first).
- URLs são normalizadas antes da deduplicação e enfileiramento.
sameOrigin: truerejeita links cuja origem difere da URL raiz normalizada.pathPrefixrestringe ainda mais os links a um prefixo de caminho na origem raiz.includeLinks: falseoculta links nos objetos de página retornados, mas não desativa a descoberta de links para rastreamento.render: "never"usa apenas o caminho de busca HTTP.render: "always"usa Puppeteer para cada página buscada.render: "auto"tenta HTTP primeiro e depois usa Puppeteer quando HTTP falha ou o conteúdo extraído é muito fino.- O fallback do navegador atualmente preserva o status de resposta renderizado e extrai o corpo da página mesmo para páginas não-2xx.
Arquitetura
src/index.ts CLI entrypoint
src/server.ts MCP server wiring and tool registration
src/config/tool-options.ts Shared tool schema/default/range metadata
src/tool/fetch-doc-content-args.ts Runtime argument validation
src/crawler/docs-crawler.ts Crawl orchestration and queue management
src/crawler/page-fetcher.ts HTTP fetch, browser fallback, extraction coordination
src/browser/browser-manager.ts Reusable Puppeteer browser/page handling
src/content/content-extractor.ts Page metadata/content extraction facade
src/content/main-content-selector.ts Main content selection
src/content/link-extractor.ts Link normalization, dedupe, and ranking
src/content/markdown-renderer.ts HTML-to-Markdown rendering
src/content/text-cleanup.ts Shared text normalization helpers
src/utils/url.ts URL normalization and scope utilities
src/types/index.ts Shared TypeScript types
O esquema MCP e a normalização de opções em tempo de execução compartilham a mesma fonte de metadados em src/config/tool-options.ts. Mantenha novas opções lá primeiro, depois conecte o comportamento por meio de validação e opções do rastreador.
Desenvolvimento
bun install
bun run dev
bun run test
bun run typecheck
bun run build
Scripts:
bun run dev: executa o servidor MCP a partir do código-fonte TypeScript.bun run test: executa testes Bun emsrc.bun run typecheck: executa TypeScript com--noEmit.bun run build: gerabuild/index.jscom um shebang Bun.bun run start: executa o servidor MCP compilado.
Testes
Os testes são colocados junto aos módulos que cobrem:
src/crawler/docs-crawler.test.ts: profundidade de rastreamento, escopo, falhas e visibilidade de links.src/crawler/page-fetcher.test.ts: caracterização de fallback de busca/renderização.src/content/content-extractor.test.ts: extração e truncamento de Markdown.src/tool/fetch-doc-content-args.test.ts: validação de limites e sincronização de esquema/padrão.src/utils/url.test.ts: normalização de URL e auxiliares de escopo.
Ao alterar o comportamento, adicione ou atualize testes de caracterização primeiro. Para refatorações, mantenha bun run test, bun run typecheck e bun run build verdes.
Notas
- Use
render: "never"para rastreamentos rápidos de documentação estática e testes. - Use
pathPrefixpara sites de documentação que compartilham um domínio com páginas de marketing, blogs ou aplicativos. - A instalação do navegador Puppeteer pode ser ignorada somente se os chamadores usarem
render: "never". - O renderizador Markdown personalizado é intencionalmente coberto por testes de caracterização; preserve a compatibilidade de saída a menos que faça uma mudança explícita de comportamento.
Licença
MIT