Claude Code hooks, slash commands e MCP: os três recursos que mudam seu fluxo
A diferença entre quem usa Claude Code e quem voa com ele não está no modelo. Está em três recursos que quase ninguém configura: hooks, slash commands e MCP.
A maioria instala o Claude Code, faz uns prompts, gosta, e para por aí. Trata como um autocomplete turbinado. Funciona, mas é desperdiçar a maior parte da ferramenta.
Neste tutorial você vai configurar os três recursos que transformam o Claude Code de assistente reativo em parte do seu fluxo: hooks para automatizar e blindar ações, slash commands para empacotar procedimentos repetidos, e MCP para dar ao agente acesso real às suas ferramentas. Tudo com os arquivos de config exatos.
TL;DR
- O que é: os três pontos de extensão do Claude Code — hooks (automação por evento), slash commands (procedimentos reutilizáveis) e MCP (conexão com ferramentas externas).
- Stack: Claude Code CLI,
settings.json,.mcp.json, arquivos Markdown em.claude/. - Custo/Acesso: tudo embutido no Claude Code, sem dependência paga extra (fora a conta do próprio Claude).
- Pré-requisito: Claude Code instalado. Se ainda não usa, comece por Claude Code: o que é, como funciona e por que os devs migraram pra ele.
Por que esses três recursos importam
O Claude Code não é só o modelo. É um harness: o modelo no centro, cercado de ferramentas, contexto e regras que decidem o que ele pode fazer e como. Hooks, slash commands e MCP são exatamente os três pontos onde você mexe nesse harness.
Pensa assim:
- Hook é o "sempre que acontecer X, faça Y" — automação determinística, sem depender do modelo lembrar.
- Slash command é o "quando eu pedir, execute esse procedimento" — um prompt empacotado e versionado.
- MCP é o "o agente agora enxerga essa ferramenta" — banco, issue tracker, monitoramento, o que for.
Antes, você cercava o agente na unha: copiava log do Sentry pro chat, repetia o mesmo prompt de revisão dez vezes, torcia pra ele não rodar um rm errado. Com os três configurados, isso vira parte da máquina. O agente lê o Sentry direto, você dispara a revisão com /review, e o rm -rf é bloqueado por um hook antes de chegar no shell.
Isso não é hype. É engenharia de fluxo. Vamos aos três.
Claude Code hooks: automação que não depende do modelo lembrar
Hook é um comando que o Claude Code dispara automaticamente em pontos da sessão. O modelo não decide se roda — o harness roda. É essa garantia que muda o jogo.
Os eventos cobrem o ciclo de vida inteiro. Os que você mais vai usar (referência oficial):
SessionStart— quando a sessão começa.UserPromptSubmit— quando você manda um prompt, antes do modelo ver.PreToolUse— antes de uma tool rodar (pode bloquear).PostToolUse— depois que a tool roda com sucesso.Stop— quando o Claude termina de responder.
Hooks ficam no settings.json — em ~/.claude/settings.json (vale pra todos os projetos), .claude/settings.json (do projeto, commitável) ou .claude/settings.local.json (do projeto, fora do git). A estrutura tem três níveis: evento → matcher (filtro por tool) → handler.
O caso clássico: barrar comando destrutivo antes dele rodar. No .claude/settings.json:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"if": "Bash(rm *)",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.sh"
}
]
}
]
}
}
E o script que decide. Ele recebe o input da tool como JSON no stdin e responde com uma decisão de permissão:
#!/bin/bash
COMMAND=$(jq -r '.tool_input.command')
if echo "$COMMAND" | grep -q 'rm -rf'; then
jq -n '{
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "deny",
permissionDecisionReason: "Comando destrutivo bloqueado por hook"
}
}'
else
exit 0 # sem decisão: segue o fluxo normal de permissão
fi
permissionDecision aceita deny, allow, ask ou defer. Saída com exit code 2 também bloqueia e manda o stderr de volta pro Claude como feedback — útil pra dizer pra ele o que fazer diferente, não só barrar.
A aplicação prática vai muito além de bloquear rm. Um PostToolUse com matcher Edit|Write que roda php artisan test (ou seu linter) toda vez que um arquivo muda. Um Stop que avisa no terminal quando a tarefa termina. Um SessionStart que injeta o estado atual do projeto no contexto. O impacto no fluxo: regras de qualidade e segurança deixam de depender do modelo "lembrar" e viram trilho fixo.
Slash commands: pare de repetir o mesmo prompt
Se você cola o mesmo bloco de instruções no chat toda semana, isso devia ser um slash command. É um arquivo Markdown que vira um comando /nome.
Detalhe importante de 2026: slash commands e skills foram unificados. Um arquivo em .claude/commands/deploy.md e um skill em .claude/skills/deploy/SKILL.md criam o mesmo /deploy e funcionam igual (docs). Os arquivos em .claude/commands/ continuam valendo; skills só adicionam recursos extras (pasta de apoio, invocação automática pelo modelo).
Um comando de revisão de PR, em .claude/commands/review-pr.md:
---
description: Revisa o PR atual buscando bugs e problemas de segurança
argument-hint: [numero-do-pr]
allowed-tools: Bash(gh pr diff *) Bash(gh pr view *)
---
Revise o PR #$1 com foco em correção e segurança.
Contexto já carregado:
- Diff do PR: !`gh pr diff $1`
- Arquivos alterados: !`gh pr diff $1 --name-only`
Aponte bugs, riscos de segurança e quebras de contrato. Seja específico no arquivo e na linha.
Três coisas acontecem aqui, e cada uma muda o resultado:
$1,$2,$ARGUMENTS— argumentos./review-pr 4521injeta4521no lugar de$1.$ARGUMENTSpega tudo de uma vez.!`comando`— injeção de contexto dinâmico. O Claude Code roda o comando antes do modelo ver o prompt e substitui a linha pela saída. O modelo recebe o diff já inline, não a instrução de buscá-lo.allowed-tools— concede as tools listadas sem pedir confirmação enquanto o comando roda.
O ganho não é digitar menos. É padronizar. O /review-pr da sua equipe roda sempre com o mesmo prompt, as mesmas tools e o contexto certo já carregado — versionado no repositório, igual pra todo mundo. Procedimento vira artefato, não memória de quem está na frente do teclado.
MCP: dar ao agente acesso real às suas ferramentas
Toda vez que você copia dado de outra ferramenta pro chat — log de monitoramento, issue do Jira, linha de um banco — é sinal de que falta um servidor MCP. O Model Context Protocol é um padrão aberto pra conectar o agente a ferramentas, bancos e APIs externos. Conectado, o Claude lê e age direto no sistema.
Adicionar um servidor é um comando. Os três transportes (referência):
# HTTP — servidores remotos (a maioria dos SaaS hoje)
claude mcp add --transport http notion https://mcp.notion.com/mcp
# SSE — streaming via server-sent events
claude mcp add --transport sse asana https://mcp.asana.com/sse
# stdio — processo local, pra ferramentas com acesso ao sistema
claude mcp add --transport stdio meu-server -- npx -y meu-mcp-server
O que mais confunde quem começa é o escopo, que decide onde a config mora e se a equipe compartilha:
local(padrão) — só você, só neste projeto. Fica em~/.claude.json.project— compartilhado via.mcp.jsonna raiz, commitável.user— você, em todos os seus projetos.
Para a equipe inteira ganhar a mesma ferramenta, use --scope project. O .mcp.json resultante é simples e vai pro git:
{
"mcpServers": {
"shared-server": {
"command": "/path/to/server",
"args": [],
"env": {}
}
}
}
Por segurança, o Claude Code pede aprovação antes de usar servidores de .mcp.json que vieram do repositório — você revisa antes de confiar. Para resetar as escolhas, claude mcp reset-project-choices.
O impacto em produto é o maior dos três. "Implemente a feature da issue ENG-4521 e abra o PR", "veja no Sentry quanto essa feature é usada", "puxe os 10 últimos pedidos do Postgres" — tudo isso vira pedido direto, sem ponte manual. O agente para de trabalhar a partir do que você cola e passa a trabalhar a partir do que o sistema realmente diz.
Limitações e pontos de atenção
Poder vem com responsabilidade. Onde o pessoal se queima:
- Hook é código que roda com suas permissões. Um
PreToolUsemal escrito pode travar a sessão ou rodar coisa que você não quer. Trate hooks como parte do código do projeto: revise, versione, teste. - MCP de
.mcp.jsoné superfície de ataque. Um servidor malicioso herdado de um repositório vê o que o agente vê. Por isso a aprovação existe — não clique em "confiar" no automático. Revise o.mcp.jsonantes. - Servidor MCP custa contexto. Cada servidor conectado injeta as descrições das tools no contexto. Conectar dez servidores "por garantia" come token budget e degrada a escolha de tool. Conecte o que a tarefa pede.
allowed-toolsem slash command não é blindagem. Ele concede tools sem prompt enquanto o comando roda; não substitui suas regras de permissão. Não use pra liberarBash(*)geral.
FAQ rápido
Hook bloqueou algo que eu queria. Como destravo?
Edite o if/matcher ou o script. Hook é determinístico: se a regra bate, ele dispara. Use /hooks dentro do Claude Code pra listar tudo que está configurado e achar o culpado.
Slash command e skill são a mesma coisa agora?
Praticamente. Os dois geram /nome. Skill adiciona pasta de apoio e invocação automática pelo modelo. Arquivo em .claude/commands/ continua funcionando — migre só se precisar dos extras.
Posso usar servidor MCP de terceiros com segurança? Pode, com critério. Prefira conectores revisados (o Anthropic Directory usa a mesma infra), e lembre que servidor MCP enxerga o que o agente enxerga. Não conecte servidor desconhecido num projeto com dado sensível.
Onde coloco a config: global ou do projeto?
Regra de bolso: o que é seu hábito pessoal vai em ~/.claude/; o que a equipe precisa compartilhar vai em .claude/ (ou .mcp.json) e entra no git.
Conclusão
Hooks, slash commands e MCP são os três pontos onde você para de usar o Claude Code e começa a moldar ele em volta do seu fluxo. Hook trava e automatiza. Slash command padroniza procedimento. MCP conecta o agente ao mundo real. Configura os três e o agente deixa de ser autocomplete e vira infraestrutura.
E esse é exatamente o salto que separa brincar com IA de construir produto com IA: parar de pedir código e começar a desenhar o harness em volta do modelo. Se você quer ver isso aplicado de ponta a ponta — do prompt até o agente rodando em produção — é o que a gente destrincha no workshop Do Prompt ao Harness: construindo um agente de vendas.
O próximo passo é abrir seu settings.json e escrever o primeiro hook. Começa pelo PreToolUse que barra o rm -rf. É o menor commit possível com o maior alívio de produção.
{AI Engineer} — apaixonado por Laravel, arquitetura de software e construir produtos com impacto. Compartilho aqui tutoriais, descobertas e reflexões sobre o dia a dia de engenharia.
Você também pode gostar
Claude Code: o que é, como funciona e por que os devs migraram pra ele
O Claude Code é a ferramenta de dev que mais cresceu no ano. Antes de instalar, entenda o que ele faz de diferente do Copilot e do Cursor e onde ele não é a resposta.
Programmatic tool calling: deixe o agente escrever o código em vez de chamar tool a tool
Chamar 12 tools uma a uma é caro, lento e entope o contexto. Programmatic tool calling vira o jogo: o agente escreve um código que orquestra as chamadas e devolve só a resposta. Entenda o padrão com exemplos da Claude API e do Code Mode da Cloudflare.
Agentic Code: o que muda quando o agente escreve, executa e testa o próprio código
Vibe coding deixou o dev no volante. SDD desenhou o mapa. Agentic Code tira o dev do carro e dá a chave pro agente, com freio de mão na mão. Cunhagem do termo em PT-BR, taxonomia de 4 níveis de autonomia, anatomia do ciclo plan/act/observe/reflect, demo comparativa de CRUD em três paradigmas, modos de falha reais e o que o harness precisa garantir pra rodar agente em produção sem quebrar tudo.
O que é Harness Engineering e por que seu Claude Code trava em tarefas longas
Quando o agente esquece o que estava fazendo, repete trabalho ou alucina arquivos, raramente é falha do modelo. É falha do harness. Definição do termo, anatomia mínima (loop, tools, contexto, memória) e o ponto onde a maioria dos devs para de evoluir o setup.