cloud-tools
Análise de custos, inventário e desperdícios em múltiplas nuvens via MCP: AWS, GCP, Cloudflare e OVH.
Documentação
Análise de custo, inventário e desperdício multi-nuvem em Rust — exposta como um servidor MCP para que um agente de IA possa consultar gastos e desperdícios diretamente, e como uma API HTTP para todo o resto.
Ele reporta gastos e desperdícios: instâncias ociosas, nós superdimensionados, hardware de geração anterior, recursos não anexados e compromissos que você não está usando.
Oito ferramentas, um formato
Toda ferramenta recebe cloud e nada mais do que precisa. Credenciais nunca
aparecem em uma chamada de ferramenta — o servidor as lê do próprio ambiente, então o
agente nunca lida com um segredo e nunca precisa receber um.
{ "cloud": "aws" }
{ "cloud": "gcp" }
Comece com check_access. Ela não recebe argumentos, não contata nenhuma nuvem e informa
quais nuvens este servidor consegue alcançar e o que está faltando para as que não consegue.
| Ferramenta | AWS | GCP | Cloudflare | OVH |
|---|---|---|---|---|
check_access | informa a configuração para todas as quatro | |||
get_costs | sim | precisa de uma tabela de faturamento | sim | sim |
compare_costs | sim | precisa de uma tabela de faturamento | — | — |
get_inventory | — | sim | sim | sim |
get_waste | sim | sim | — | — |
get_commitments | sim | sim | — | — |
get_recommendations | — | sim | — | — |
get_cross_cloud_summary | toda nuvem que o servidor consegue alcançar |
Um travessão não é um resultado vazio silencioso. A ferramenta responde, por exemplo,
waste analysis is not implemented for ovh; supported: aws, gcp, então um agente
não pode interpretar uma lacuna como um atestado de saúde.
Lendo um zero corretamente
get_waste e get_inventory retornam um campo coverage e uma lista errors.
Um total zero significa uma de duas coisas totalmente diferentes:
| cobertura | significado |
|---|---|
complete | Nada está sendo desperdiçado. |
PARTIAL — N API call(s) failed… | Parte da conta não pôde ser lida. |
Um resultado parcial não é um atestado de saúde.
Configurando o servidor
As credenciais são lidas do ambiente da máquina que executa o cloud-tools. Nada é armazenado, e toda chamada é somente leitura.
AWS
Resolvido nesta ordem, vence o primeiro encontrado:
AWS_ACCESS_KEY_IDeAWS_SECRET_ACCESS_KEY~/.aws/credentials, perfil deAWS_PROFILE, caso contrário[default]- Uma função de tarefa ECS
- Uma função de instância EC2
Um perfil somente SSO não é lido diretamente. Exporte-o primeiro:
aws configure export-credentials --profile <name> --format env.
Para escanear uma conta diferente, passe uma função para assumir. Um ARN de função não é um segredo, então permanece como argumento:
{ "cloud": "aws", "target": { "role_arn": "arn:aws:iam::…:role/ReadOnly" } }
CLOUD_TOOLS_AWS_ROLE_ARN e CLOUD_TOOLS_AWS_EXTERNAL_ID definem um padrão para
isso, se toda chamada deve assumir a mesma função.
get_waste lê instâncias EC2, volumes, snapshots, AMIs, IPs Elásticos, pares de
chaves e instâncias reservadas; RDS; S3; Lambda; DynamoDB; ECS; ElastiCache; balanceadores
de carga; gateways NAT; grupos de logs do CloudWatch sem retenção; e Compute
Optimizer. Instâncias ociosas e superdimensionadas vêm das séries de CPU do CloudWatch, então são
medidas em vez de estimadas.
GCP
Credenciais padrão de aplicativo — gcloud auth application-default login é
suficiente — ou GOOGLE_APPLICATION_CREDENTIALS apontando para um arquivo de conta de serviço.
| Variável | Finalidade |
|---|---|
CLOUD_TOOLS_GCP_PROJECTS | IDs de projetos separados por vírgula para consultar |
CLOUD_TOOLS_GCP_BILLING_TABLE | Exportação de faturamento do BigQuery, project.dataset.table |
Os projetos também podem ser escolhidos por chamada com target.project_ids, que é como um
agente escaneia vários.
billing_table importa. O Google não publica uma API de gastos por serviço, então os
custos reais vêm da exportação de faturamento do BigQuery. Sem ela, get_costs recorre
à API de Orçamentos e rotula o resultado como "source": "budgets" com uma nota
dizendo que são valores de orçamento, não gastos. compare_costs exige isso diretamente.
Cloudflare
CLOUDFLARE_API_TOKEN a token with read access to account resources
CLOUDFLARE_ACCOUNT_ID
OVH
OVH_APPLICATION_KEY
OVH_APPLICATION_SECRET
OVH_CONSUMER_KEY
OVH_ENDPOINT ovh-eu (default), ovh-us or ovh-ca
Instalação
Ainda não lançado. A tag mais recente é
v0.1.0, que publicou.tar.gzarquivos com os nomes antigos de assets, e@munhq/cloud-toolsnão está no npm. Os três comandos abaixo começam a funcionar no momento em quev0.2.0for marcado. Até lá, compile a partir do código-fonte:cargo build --release.
Como servidor MCP
claude mcp add cloud-tools -- npx -y @munhq/cloud-tools
Qualquer coisa que leia um JSON de configuração — Claude Desktop, Cursor, Windsurf, Zed, Cline:
{ "mcpServers": { "cloud-tools": { "command": "npx", "args": ["-y", "@munhq/cloud-tools"] } } }
O pacote npm é um pequeno wrapper, porque o servidor é um binário compilado e
não JavaScript. Na instalação, ele resolve o asset de release para sua plataforma,
verifica-o contra o SHA256SUMS publicado, armazena-o em cache sob
~/.cache/cloud-tools/bin/ e o executa.
Como binário
Binários pré-compilados para Linux, macOS e Windows, x86_64 e arm64, estão anexados a
cada release. O script abaixo
baixa o da sua máquina e o verifica contra SHA256SUMS:
curl -sSL https://raw.githubusercontent.com/munhq/cloud-tools/main/install.sh | bash
Ou pegue um único asset diretamente:
curl -fsSLO https://github.com/munhq/cloud-tools/releases/latest/download/cloud-tools-x86_64-linux
chmod +x cloud-tools-x86_64-linux
Como contêiner
docker run -i --rm \
-e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_REGION \
munhq/cloud-tools
Executando
Construído como uma biblioteca (cloud_tools) com um binário opcional. Duas flags de recurso, ambas ativadas por padrão:
mcp— servidor MCP via stdio e HTTP transmissível, viarmcphttp— API HTTP via axum
cargo build --release
./target/release/cloud-tools # MCP server on stdio
Como servidor MCP, ele se conecta a qualquer agente compatível com MCP. O agente chama as ferramentas acima diretamente e raciocina sobre os resultados.
Para incorporá-lo, dependa da biblioteca e desative os recursos do binário:
cloud-tools = { git = "https://github.com/munhq/cloud-tools", default-features = false }
Status
Funcionando e usado em contas reais de AWS, GCP, Cloudflare e OVH. A análise de
desperdício existe apenas para AWS e GCP — Cloudflare e OVH não têm nenhuma, não
apenas menos regras, e get_waste diz isso em vez de retornar uma lista vazia.
A AWS ainda não tem ferramenta de inventário, embora as chamadas de listagem por trás dela já existam.
Contribuições adicionando cobertura de provedores são bem-vindas.
Política de Privacidade
O cloud-tools não coleta nada. Não há telemetria, nem análise, nem comunicação de qualquer tipo — verificado pelo fato de que os únicos hosts no código-fonte são as APIs dos provedores de nuvem mais github.com, que o wrapper npm usa para baixar o binário para sua plataforma.
O que é coletado. Nada. Sem conta, sem cadastro, sem identificador.
O que é processado, e onde. As credenciais que você passa são usadas para assinar solicitações ao seu próprio provedor de nuvem e são mantidas em memória durante a vida dessa chamada. O servidor roda na sua máquina, então nada é enviado à munhq ou a terceiros. As respostas voltam ao cliente MCP que as solicitou e a nenhum outro lugar.
Armazenamento e retenção. Nada é gravado em disco e nada é retido.
A única exceção é o wrapper npm, que armazena em cache o binário baixado sob
~/.cache/cloud-tools/bin/ para não ser rebaixado a cada execução. Esse cache
contém um programa, nunca seus dados ou credenciais.
Registro de logs. Os diagnósticos vão para o stderr, que seu cliente MCP captura. Credenciais nunca são registradas. Mensagens de erro citam a resposta do próprio provedor, que pode nomear um projeto, um ID de conta ou um recurso — as mesmas informações que a ferramenta foi solicitada a reportar.
Compartilhamento com terceiros. Nenhum. Os únicos destinos de rede são as APIs de nuvem
dos provedores cujas credenciais você fornece:
AWS (*.amazonaws.com), Google Cloud (*.googleapis.com), Cloudflare
(api.cloudflare.com) e OVH (*.api.ovh.com, api.us.ovhcloud.com).
Permissões. Somente leitura é suficiente para toda ferramenta. Todas as oito declaram
readOnlyHint: true, e nada neste servidor cria, modifica ou exclui um
recurso de nuvem.
Contato. hello@munhq.com. A versão canônica desta política está em https://munhq.com/privacy/cloud-tools.
Licença
Apache-2.0. Veja LICENSE.