Rust Docs MCP Server
Consulte a documentação mais recente de crates Rust.
Documentação
Rust Docs MCP Server
⭐ Gosta deste projeto? Por favor, marque o repositório com estrela no GitHub para mostrar seu apoio e ficar atualizado! ⭐
Motivação
Assistentes de codificação modernos com IA (como Cursor, Cline, Roo Code, etc.) são excelentes em entender a estrutura e a sintaxe do código, mas muitas vezes têm dificuldade com os detalhes de bibliotecas e frameworks em rápida evolução, especialmente em ecossistemas como Rust, onde crates são atualizados com frequência. O corte nos dados de treinamento significa que eles podem não ter conhecimento das APIs mais recentes, levando a sugestões de código incorretas ou desatualizadas.
Este servidor MCP resolve esse desafio fornecendo uma fonte de conhecimento focada e atualizada
para um crate Rust específico. Ao executar uma instância deste servidor para um crate
(por exemplo, serde, tokio, reqwest), você dá ao seu assistente de codificação
com LLM uma ferramenta (query_rust_docs) que ele pode usar antes de escrever código relacionado
a esse crate.
Quando instruído a usar esta ferramenta, o LLM pode fazer perguntas específicas sobre a API ou o uso do crate e receber respostas derivadas diretamente da documentação atual. Isso melhora significativamente a precisão e a relevância do código gerado, reduzindo a necessidade de correção manual e acelerando o desenvolvimento.
Múltiplas instâncias deste servidor podem ser executadas simultaneamente, permitindo que o assistente LLM acesse a documentação de vários crates diferentes durante uma sessão de codificação.
Este servidor busca a documentação de um crate Rust especificado, gera embeddings para o conteúdo e fornece uma ferramenta MCP para responder perguntas sobre o crate com base no contexto da documentação.
Recursos
- Documentação Direcionada: Foca em um único crate Rust por instância do servidor.
- Suporte a Recursos: Permite especificar recursos necessários do crate para a geração da documentação.
- Busca Semântica: Usa o modelo
text-embedding-3-smallda OpenAI para encontrar as seções de documentação mais relevantes para uma determinada pergunta. - Resumo com LLM: Utiliza o modelo
gpt-4o-mini-2024-07-18da OpenAI para gerar respostas concisas com base apenas no contexto da documentação recuperada. - Cache: Armazena em cache o conteúdo da documentação gerada e os embeddings no
diretório de dados XDG do usuário (
~/.local/share/rustdocs-mcp-server/ou similar) com base no crate, versão e recursos solicitados para acelerar execuções subsequentes. - Integração MCP: Executa como um servidor MCP padrão via stdio, expondo ferramentas e recursos.
Pré-requisitos
- Chave da API OpenAI: Necessária para gerar embeddings e resumir respostas.
O servidor espera que esta chave esteja disponível na variável de ambiente
OPENAI_API_KEY. (O servidor também requer acesso à rede para baixar dependências do crate e interagir com a API da OpenAI).
Instalação
A maneira recomendada de instalar é baixar o binário pré-compilado para o seu sistema operacional na página de Releases do GitHub.
- Vá para a página de Releases.
- Baixe o arquivo apropriado (
.zippara Windows,.tar.gzpara Linux/macOS) para o seu sistema. - Extraia o binário
rustdocs_mcp_server(ourustdocs_mcp_server.exe). - Coloque o binário em um diretório incluído na variável de ambiente
PATHdo seu sistema (por exemplo,/usr/local/bin,~/bin).
Compilando a partir do Código Fonte (Alternativa)
Se preferir compilar a partir do código fonte, você precisará do Rust Toolchain instalado.
- Clone o repositório:
git clone https://github.com/Govcraft/rust-docs-mcp-server.git cd rust-docs-mcp-server - Compile o servidor:
cargo build --release
Uso
Nota Importante para Crates Novos:
Ao usar o servidor com um crate pela primeira vez (ou com uma nova versão/conjunto de recursos), ele precisa baixar a documentação e gerar embeddings. Esse processo pode levar algum tempo, especialmente para crates com documentação extensa, e requer uma conexão ativa com a internet e uma chave da API OpenAI.
Recomenda-se executar o servidor uma vez diretamente do seu terminal para qualquer nova configuração de crate antes de adicioná-lo ao seu assistente de codificação com IA (como Roo Code, Cursor, etc.). Isso permite que a geração inicial de embeddings e o cache sejam concluídos. Assim que você vir as mensagens de inicialização do servidor indicando que ele está pronto (por exemplo, "MCP Server listening on stdio"), você pode desligá-lo (Ctrl+C). Execuções subsequentes, incluindo aquelas iniciadas pelo seu assistente de codificação, usarão os dados em cache e iniciarão muito mais rápido.
Executando o Servidor
O servidor é iniciado a partir da linha de comando e requer a Especificação do ID do Pacote
para o crate alvo. Esta especificação segue o formato usado
pelo Cargo (por exemplo, crate_name, crate_name@version_req). Para obter os detalhes completos
da especificação, consulte man cargo-pkgid ou a
documentação do Cargo.
Opcionalmente, você pode especificar os recursos necessários do crate usando o sinalizador -F ou
--features, seguido por uma lista separada por vírgulas de recursos. Isso é
necessário para crates que exigem que recursos específicos sejam habilitados para que o
cargo doc seja bem-sucedido (por exemplo, crates que exigem um recurso de tempo de execução como
async-stripe).
# Set the API key (replace with your actual key)
export OPENAI_API_KEY="sk-..."
# Example: Run server for the latest 1.x version of serde
rustdocs_mcp_server "serde@^1.0"
# Example: Run server for a specific version of reqwest
rustdocs_mcp_server "reqwest@0.12.0"
# Example: Run server for the latest version of tokio
rustdocs_mcp_server tokio
# Example: Run server for async-stripe, enabling a required runtime feature
rustdocs_mcp_server "async-stripe@0.40" -F runtime-tokio-hyper-rustls
# Example: Run server for another crate with multiple features
rustdocs_mcp_server "some-crate@1.2" --features feat1,feat2
Na primeira execução para uma versão específica do crate e conjunto de recursos, o servidor irá:
- Baixar a documentação do crate usando
cargo doc(com os recursos especificados). - Analisar a documentação HTML.
- Gerar embeddings para o conteúdo da documentação usando a API da OpenAI (isso
pode levar algum tempo e gerar custos, embora normalmente apenas frações de um
centavo de dólar para a maioria dos crates; até mesmo um crate grande como
async-stripecom mais de 5000 páginas de documentação custou apenas US$ 0,18 para a geração de embeddings durante os testes). - Armazenar em cache o conteúdo da documentação e os embeddings para que o custo não seja incorrido novamente.
- Iniciar o servidor MCP.
Execuções subsequentes para a mesma versão do crate e conjunto de recursos carregarão os dados do cache, tornando a inicialização muito mais rápida.
Interação MCP
O servidor se comunica usando o Model Context Protocol por meio de entrada/saída padrão (stdio). Ele expõe o seguinte:
-
Ferramenta:
query_rust_docs- Descrição: Consulta a documentação do crate Rust específico para o qual o servidor foi iniciado, usando busca semântica e resumo com LLM.
- Esquema de Entrada:
{ "type": "object", "properties": { "question": { "type": "string", "description": "The specific question about the crate's API or usage." } }, "required": ["question"] } - Saída: Uma resposta em texto contendo a resposta gerada pelo LLM com base
no contexto da documentação relevante, prefixada com
From <crate_name> docs:. - Exemplo de Chamada MCP:
{ "jsonrpc": "2.0", "method": "callTool", "params": { "tool_name": "query_rust_docs", "arguments": { "question": "How do I make a simple GET request with reqwest?" } }, "id": 1 }
-
Recurso:
crate://<crate_name>- Descrição: Fornece o nome do crate Rust para o qual esta instância do servidor está configurada.
- URI:
crate://<crate_name>(por exemplo,crate://serde,crate://reqwest) - Conteúdo: Texto simples contendo o nome do crate.
-
Registro: O servidor envia logs informativos (mensagens de inicialização, etapas de processamento de consultas) de volta ao cliente MCP por meio de notificações
logging/message.
Exemplo de Configuração de Cliente (Roo Code)
Você pode configurar clientes MCP como o Roo Code para executar múltiplas instâncias deste
servidor, cada uma direcionada a um crate diferente. Aqui está um exemplo de trecho para o
arquivo mcp_settings.json do Roo Code, configurando servidores para reqwest e
async-stripe (observe o argumento de recursos adicionado para async-stripe):
{
"mcpServers": {
"rust-docs-reqwest": {
"command": "/path/to/your/rustdocs_mcp_server",
"args": [
"reqwest@0.12"
],
"env": {
"OPENAI_API_KEY": "YOUR_OPENAI_API_KEY_HERE"
},
"disabled": false,
"alwaysAllow": []
},
"rust-docs-async-stripe": {
"command": "rustdocs_mcp_server",
"args": [
"async-stripe@0.40",
"-F",
" runtime-tokio-hyper-rustls"
],
"env": {
"OPENAI_API_KEY": "YOUR_OPENAI_API_KEY_HERE"
},
"disabled": false,
"alwaysAllow": []
}
}
}
Nota:
- Substitua
/path/to/your/rustdocs_mcp_serverpelo caminho real para o binário compilado no seu sistema se ele não estiver no seu PATH. - Substitua
YOUR_OPENAI_API_KEY_HEREpela sua chave real da API OpenAI. - As chaves (
rust-docs-reqwest,rust-docs-async-stripe) são nomes arbitrários que você escolhe para identificar as instâncias do servidor dentro do Roo Code.
Exemplo de Configuração de Cliente (Claude Desktop)
Para usuários do Claude Desktop, você pode configurar o servidor nas configurações do MCP.
Aqui está um exemplo configurando servidores para serde e async-stripe:
{
"mcpServers": {
"rust-docs-serde": {
"command": "/path/to/your/rustdocs_mcp_server",
"args": [
"serde@^1.0"
]
},
"rust-docs-async-stripe-rt": {
"command": "rustdocs_mcp_server",
"args": [
"async-stripe@0.40",
"-F",
"runtime-tokio-hyper-rustls"
]
}
}
}
Nota:
- Certifique-se de que
rustdocs_mcp_serveresteja no PATH do seu sistema ou forneça o caminho completo (por exemplo,/path/to/your/rustdocs_mcp_server). - As chaves (
rust-docs-serde,rust-docs-async-stripe-rt) são nomes arbitrários que você escolhe para identificar as instâncias do servidor. - Lembre-se de definir a variável de ambiente
OPENAI_API_KEYonde o Claude Desktop possa acessá-la (isso pode ser em todo o sistema ou por meio de como você inicia o Claude Desktop). A configuração MCP do Claude Desktop pode não suportar diretamente a definição de variáveis de ambiente por servidor como o Roo Code. - O exemplo mostra como adicionar o argumento
-Fpara crates comoasync-stripeque exigem recursos específicos.
Cache
- Localização: A documentação e os embeddings em cache são armazenados no diretório
de dados XDG, normalmente em
~/.local/share/rustdocs-mcp-server/<crate_name>/<sanitized_version_req>/<features_hash>/embeddings.bin. Osanitized_version_reqé derivado do requisito de versão, efeatures_hashé um hash que representa a combinação específica de recursos solicitados na inicialização. Isso garante que diferentes conjuntos de recursos sejam armazenados em cache separadamente. - Formato: Os dados são armazenados em cache usando serialização
bincode. - Regeneração: Se o arquivo de cache estiver ausente, corrompido ou não puder ser decodificado, o servidor regenerará automaticamente a documentação e os embeddings.
Como Funciona
- Inicialização: Analisa a especificação do crate e os recursos opcionais da
linha de comando usando
clap. - Verificação de Cache: Procura um arquivo de cache pré-existente para o crate, requisito de versão e conjunto de recursos específicos.
- Geração de Documentação (se houver falta de cache):
- Cria um projeto Rust temporário dependendo apenas do crate alvo,
habilitando os recursos especificados no seu
Cargo.toml. - Executa
cargo docusando a API da bibliotecacargopara gerar documentação HTML no diretório temporário. - Localiza dinamicamente o diretório de saída correto dentro de
target/docprocurando o subdiretório que contémindex.html.
- Cria um projeto Rust temporário dependendo apenas do crate alvo,
habilitando os recursos especificados no seu
- Extração de Conteúdo (se houver falta de cache):
- Percorre os arquivos HTML gerados dentro do diretório de documentação localizado.
- Usa o crate
scraperpara analisar cada arquivo HTML e extrair o conteúdo de texto da área de conteúdo principal (<section id="main-content">).
- Geração de Embeddings (se houver falta de cache):
- Usa o crate
async-openaietiktoken-rspara gerar embeddings para cada trecho de documento extraído usando o modelotext-embedding-3-small. - Calcula o custo estimado com base no número de tokens processados.
- Usa o crate
- Cache (se houver falta de cache): Salva o conteúdo do documento extraído e seus
embeddings correspondentes no arquivo de cache (o caminho inclui o hash dos recursos)
usando
bincode. - Inicialização do Servidor: Inicializa o
RustDocsServercom os documentos e embeddings carregados/gerados. - Serviço MCP: Inicia o servidor MCP usando
rmcpvia stdio. - Tratamento de Consultas (ferramenta
query_rust_docs):- Gera um embedding para a pergunta do usuário.
- Calcula a similaridade de cosseno entre o embedding da pergunta e todos os embeddings de documentos em cache.
- Identifica o trecho de documento com a maior similaridade.
- Envia a pergunta do usuário e o conteúdo do trecho de documento com melhor correspondência
para o modelo
gpt-4o-mini-2024-07-18por meio da API da OpenAI. - O LLM é instruído a responder à pergunta com base apenas no contexto fornecido.
- Retorna a resposta do LLM ao cliente MCP.
Licença
Este projeto está licenciado sob a Licença MIT.
Copyright (c) 2025 Govcraft
Patrocinador
Govcraft é uma loja de uma pessoa só—sem apoio corporativo, sem investidores, apenas eu construindo ferramentas úteis. Se este projeto ajudar você, patrocinar mantém o trabalho em andamento.