🛡️ MCP para Pentesters — Claude Orquestrando Tools via Linguagem Natural
Status: ✅ Concluído Ambiente: 💻 Kali Linux 2025.x · Python 3.13 · MCP SDK 1.26.0 · Anthropic API Tags: 🏷️ #mcp #pentest #redteam #python #claude #anthropic #automação
Nos módulos anteriores construímos um MCP Server com Tools, Resources e Prompts, e integramos a NVD API para busca de CVEs. Agora chegamos na etapa final: conectar tudo ao Claude via API e fazer a IA orquestrar as tools automaticamente através de linguagem natural — sem clicar em nada.
🧠 Como o Claude Orquestra as Tools
O fluxo completo de uma chamada em linguagem natural:
1️⃣ Você digita: "faz um dns lookup no google.com e verifica a porta 443"
2️⃣ Claude lê as tools disponíveis (nome + docstring + tipos)
3️⃣ Claude decide chamar dns_lookup("google.com")
4️⃣ Recebe o IP retornado e decide chamar check_open_port("142.250.x.x", 443)
5️⃣ Consolida tudo num relatório estruturado
💡 Você não especifica qual tool usar. O Claude decide sozinho com base nos docstrings que você escreveu no server.
💳 Passo 1 — Configurar Créditos na API Anthropic
Para usar o Claude via API você precisa de créditos na plataforma da Anthropic:
Acesse: console.anthropic.com → Billing
Clique em Buy Credits (mínimo recomendado: US$ 5,00)
Aguarde a confirmação do pagamento
⚠️ Atenção: Após adicionar créditos, gere uma nova API key em API Keys → Create Key. Keys antigas criadas antes da adição de créditos podem não funcionar corretamente.
🔑 Passo 2 — Gerar e Configurar a API Key
1. Gerar a key no console:
console.anthropic.com → API Keys → + Create Key
Nome sugerido: kali-mcp
Copie a key imediatamente — ela só aparece uma vez
2. Exportar no Kali:
source ~/mcp-env/bin/activate
export ANTHROPIC_API_KEY="sk-ant-SEU-TOKEN-AQUI"
# Confirma que exportou corretamente
echo $ANTHROPIC_API_KEY
⚠️ Atenção com o shell: No Kali como root, o prompt exibe #. O comando export deve ter espaço antes — #export (sem espaço) é interpretado como comentário e não executa.
🧪 Passo 3 — Testar a API antes de tudo
Valide que a key e os créditos estão funcionando com um teste rápido:
def mcp_tools_to_anthropic(tools):
result = []
for tool in tools:
result.append({
"name": tool.name,
"description": tool.description,
"input_schema": tool.inputSchema
})
return result
# ─────────────────────────────────────────
# LOOP PRINCIPAL
# ─────────────────────────────────────────
print(f"\n✅ Conectado ao PentestServer")
print(f"🔧 {len(tools)} tools disponíveis: {', '.join(t['name'] for t in tools)}")
print(f"🤖 Modelo: {MODEL}")
print("\n" + "─"*60)
print("Digite sua pergunta ou comando. 'sair' para encerrar.")
print("─"*60 + "\n")
response = anthropic_client.messages.create(
model=MODEL,
max_tokens=4096,
system="""Você é um assistente especializado em pentest e segurança ofensiva.
Você tem acesso a tools de reconhecimento e busca de vulnerabilidades.
SEMPRE leia o resource 'file://escopo' antes de executar qualquer scan.
Seja objetivo e técnico. Apresente resultados em formato estruturado.""",
tools=tools,
messages=messages
)
while response.stop_reason == "tool_use":
tool_calls = [b for b in response.content if b.type == "tool_use"]
text_blocks = [b for b in response.content if b.type == "text"]
for tb in text_blocks:
if tb.text.strip():
print(f"\nClaude: {tb.text}")
response = anthropic_client.messages.create(
model=MODEL,
max_tokens=4096,
system="""Você é um assistente especializado em pentest e segurança ofensiva.
Você tem acesso a tools de reconhecimento e busca de vulnerabilidades.
SEMPRE leia o resource 'file://escopo' antes de executar qualquer scan.
Seja objetivo e técnico. Apresente resultados em formato estruturado.""",
tools=tools,
messages=messages
)
final_text = ""
for block in response.content:
if hasattr(block, "text"):
final_text += block.text
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
await chat_loop(session, anthropic_client)