Doc Lib MCP
Um servidor MCP para ingestão de documentos, fragmentação, busca semântica e gerenciamento de notas.
Documentação
Servidor MCP doc-lib-mcp
Um servidor Model Context Protocol (MCP) para ingestão de documentos, fragmentação (chunking), busca semântica e gerenciamento de notas.
Componentes
Recursos
- Implementa um sistema simples de armazenamento de notas com:
- Esquema de URI personalizado
note://para acessar notas individuais - Cada recurso de nota possui um nome, descrição e tipo MIME
text/plain
- Esquema de URI personalizado
Prompts
- Fornece um prompt:
- summarize-notes: Cria resumos de todas as notas armazenadas
- Argumento opcional "style" para controlar o nível de detalhe (breve/detalhado)
- Gera um prompt combinando todas as notas atuais com a preferência de estilo
- summarize-notes: Cria resumos de todas as notas armazenadas
Ferramentas
O servidor implementa uma ampla gama de ferramentas:
- add-note: Adiciona uma nova nota ao armazenamento de notas em memória
- Argumentos:
name(string),content(string)
- Argumentos:
- ingest-string: Ingere e fragmenta uma string Markdown ou texto simples fornecida via mensagem
- Argumentos:
content(string, obrigatório),source(string, opcional),tags(lista de strings, opcional)
- Argumentos:
- ingest-markdown: Ingere e fragmenta um arquivo Markdown (.md)
- Argumentos:
path(string)
- Argumentos:
- ingest-python: Ingere e fragmenta um arquivo Python (.py)
- Argumentos:
path(string)
- Argumentos:
- ingest-openapi: Ingere e fragmenta um arquivo JSON OpenAPI
- Argumentos:
path(string)
- Argumentos:
- ingest-html: Ingere e fragmenta um arquivo HTML
- Argumentos:
path(string)
- Argumentos:
- ingest-html-url: Ingere e fragmenta conteúdo HTML de uma URL (opcionalmente usando Playwright para conteúdo dinâmico)
- Argumentos:
url(string),dynamic(booleano, opcional)
- Argumentos:
- smart_ingestion: Extrai todo o conteúdo tecnicamente relevante de um arquivo usando Gemini e, em seguida, fragmenta usando lógica robusta de Markdown.
- Argumentos:
path(string, obrigatório): Caminho do arquivo a ser ingerido.prompt(string, opcional): Prompt personalizado a ser usado para o Gemini.tags(lista de strings, opcional): Lista opcional de tags para classificação.
- Usa Gemini 2.0 Flash 001 para extrair apenas código, configuração, estrutura Markdown e definições técnicas (sem resumos ou comentários).
- Passa o conteúdo extraído para um fragmentador baseado em mistune 3.x que preserva blocos de código e conteúdo Markdown/narrativo como fragmentos separados.
- Cada fragmento é incorporado e armazenado para busca semântica e recuperação.
- Argumentos:
- search-chunks: Busca semântica sobre o conteúdo ingerido
- Argumentos:
query(string): A consulta de busca semântica.top_k(inteiro, opcional, padrão 3): Número de resultados principais a retornar.type(string, opcional): Filtrar resultados por tipo de fragmento (ex.:code,html,markdown).tag(string, opcional): Filtrar resultados por tag nos metadados do fragmento.
- Retorna os fragmentos mais relevantes para uma determinada consulta, opcionalmente filtrados por tipo e/ou tag.
- Argumentos:
- delete-source: Exclui todos os fragmentos de uma determinada fonte
- Argumentos:
source(string)
- Argumentos:
- delete-chunk-by-id: Exclui um ou mais fragmentos por id
- Argumentos:
id(inteiro, opcional),ids(lista de inteiros, opcional) - Você pode excluir um único fragmento especificando
id, ou excluir vários fragmentos de uma vez especificandoids.
- Argumentos:
- update-chunk-type: Atualiza o atributo tipo de um fragmento por id
- Argumentos:
id(inteiro, obrigatório),type(string, obrigatório)
- Argumentos:
- ingest-batch: Ingere e fragmenta vários arquivos de documentação (Markdown, OpenAPI JSON, Python) em lote
- Argumentos:
paths(lista de strings)
- Argumentos:
- list-sources: Lista todas as fontes exclusivas (caminhos de arquivo) que foram ingeridas e armazenadas em memória, com filtragem opcional por tag ou busca semântica.
- Argumentos:
tag(string, opcional): Filtrar fontes por tag nos metadados do fragmento.query(string, opcional): Consulta de busca semântica para encontrar fontes relevantes.top_k(inteiro, opcional, padrão 10): Número de fontes principais a retornar ao usar consulta.
- Argumentos:
- get-context: Recupera fragmentos de conteúdo relevantes (apenas conteúdo) para uso como contexto de IA, com filtragem por tag, tipo e similaridade semântica.
- Argumentos:
query(string, opcional): A consulta de busca semântica.tag(string, opcional): Filtrar resultados por uma tag específica nos metadados do fragmento.type(string, opcional): Filtrar resultados por tipo de fragmento (ex.: 'code', 'markdown').top_k(inteiro, opcional, padrão 5): O número de fragmentos relevantes principais a recuperar.
- Argumentos:
- update-chunk-metadata: Atualiza o campo de metadados de um fragmento por id
- Argumentos:
id(inteiro),metadata(objeto)
- Argumentos:
- tag-chunks-by-source: Adiciona tags especificadas aos metadados de todos os fragmentos associados a uma determinada fonte (URL ou caminho de arquivo). Mescla com tags existentes.
- Argumentos:
source(string),tags(lista de strings)
- Argumentos:
- list-notes: Lista todas as notas atualmente armazenadas e seu conteúdo.
Fragmentação e Extração de Código
- Arquivos Markdown, Python, OpenAPI e HTML são divididos em fragmentos lógicos para recuperação e busca eficientes.
- O fragmentador Markdown usa a API AST do mistune 3.x e regex para dividir robustamente o conteúdo por blocos de código e narrativa, preservando toda a formatação original.
- Tanto blocos de código quanto conteúdo Markdown/narrativo são preservados como fragmentos separados.
- O fragmentador HTML usa a biblioteca
readability-lxmlpara extrair o conteúdo principal primeiro e, em seguida, extrai trechos de código de bloco das tags<pre>como fragmentos dedicados de "code". O conteúdo inline<code>permanece parte dos fragmentos narrativos.
Busca Semântica
- A ferramenta
search-chunksrealiza busca semântica baseada em vetores sobre todo o conteúdo ingerido, retornando os fragmentos mais relevantes para uma determinada consulta. - Suporta argumentos opcionais
typeetagpara filtrar resultados por tipo de fragmento (ex.:code,html,markdown) e/ou por tag nos metadados do fragmento, antes da classificação semântica. - Isso permite recuperação altamente direcionada, como "todos os fragmentos de código marcados com 'langfuse' relevantes para 'cost and usage'".
Gerenciamento de Metadados
- Os fragmentos incluem um campo
metadatapara categorização e marcação (tagging). - A ferramenta
update-chunk-metadatapermite atualizar metadados de qualquer fragmento pelo seu id. - A ferramenta
tag-chunks-by-sourcepermite adicionar tags a todos os fragmentos de uma fonte específica em uma única operação. A marcação mescla novas tags com as existentes, preservando tags anteriores.
Configuração
O servidor requer as seguintes variáveis de ambiente (podem ser definidas em um arquivo .env):
Configuração do Ollama
- OLLAMA_HOST: Hostname para a API do Ollama (padrão: localhost)
- OLLAMA_PORT: Porta para a API do Ollama (padrão: 11434)
- RAG_AGENT: Modelo Ollama a ser usado para respostas RAG (padrão: llama3)
- OLLAMA_MODEL: Modelo Ollama a ser usado para embeddings (padrão: nomic-embed-text-v2-moe)
Configuração do Banco de Dados
- HOST: Host do banco de dados PostgreSQL (padrão: localhost)
- DB_PORT: Porta do banco de dados PostgreSQL (padrão: 5432)
- DB_NAME: Nome do banco de dados PostgreSQL (padrão: doclibdb)
- DB_USER: Usuário do banco de dados PostgreSQL (padrão: doclibdb_user)
- DB_PASSWORD: Senha do banco de dados PostgreSQL (padrão: doclibdb_password)
Configuração do Reranker
- RERANKER_MODEL_PATH: Caminho para o modelo reranker (padrão: /srv/samba/fileshare2/AI/models/bge-reranker-v2-m3)
- RERANKER_USE_FP16: Se deve usar FP16 para o reranker (padrão: True)
Início Rápido
Instalação
Claude Desktop
No MacOS: ~/Library/Application\ Support/Claude/claude_desktop_config.json
No Windows: %APPDATA%/Claude/claude_desktop_config.json
Configuração de Servidores Não Publicados
``` "mcpServers": { "doc-lib-mcp": { "command": "uv", "args": [ "--directory", "/home/administrator/python-share/doc-lib-mcp", "run", "doc-lib-mcp" ] } } ```Configuração de Servidores Publicados
``` "mcpServers": { "doc-lib-mcp": { "command": "uvx", "args": [ "doc-lib-mcp" ] } } ```Desenvolvimento
Compilação e Publicação
Para preparar o pacote para distribuição:
- Sincronize as dependências e atualize o lockfile:
uv sync
- Compile as distribuições do pacote:
uv build
Isso criará distribuições source e wheel no diretório dist/.
- Publique no PyPI:
uv publish
Observação: Você precisará definir as credenciais do PyPI via variáveis de ambiente ou flags de comando:
- Token:
--tokenouUV_PUBLISH_TOKEN - Ou usuário/senha:
--username/UV_PUBLISH_USERNAMEe--password/UV_PUBLISH_PASSWORD
Depuração
Como os servidores MCP são executados via stdio, a depuração pode ser desafiadora. Para a melhor experiência de depuração, recomendamos fortemente o uso do MCP Inspector.
Você pode iniciar o MCP Inspector via npm com este comando:
npx @modelcontextprotocol/inspector uv --directory /home/administrator/python-share/doc-lib-mcp run doc-lib-mcp
Ao iniciar, o Inspector exibirá uma URL que você pode acessar no seu navegador para começar a depurar.