🔧 O que é uma Skill?
No contexto de agentes de IA, um skill (também chamado de tool or function) é uma capacidade empacotada e reutilizável que um LLM pode invocar para interagir com o mundo fora de sua janela de contexto. Skills fazem a ponte entre a compreensão de linguagem e a ação no mundo real.
Toda skill tem quatro componentes:
- Name — um identificador único que o modelo usa para referenciar a skill (por exemplo,
web_search) - Description — texto em linguagem natural explicando o que a skill faz e quando usá-la; o LLM lê isso para decidir quando chamar a skill
- Esquema de entrada — uma definição estruturada dos argumentos (JSON Schema); o modelo preenche estes com base na tarefa
- Implementation — o código real que roda: uma chamada de API, consulta ao banco de dados, comando de shell ou qualquer outra operação
Exemplo: A get_weather skill tem a descrição "Busca o clima atual para uma cidade", aceita { "city": "string" } como entrada, e chama uma API de clima. O LLM nunca vê a chave da API ou a chamada HTTP — ele apenas recebe o resultado de volta como texto.
⚙️ Como o Chamado de Ferramentas Funciona
Quando um agente tem acesso a skills, o LLM não as chama diretamente — ele requests uma chamada gerando uma saída estruturada. O runtime (o código da sua aplicação) executa a chamada real e retorna o resultado. Aqui está o ciclo completo:
- Registro de ferramenta — Seu código envia ao modelo uma lista de skills disponíveis com suas descrições e schemas
- Raciocínio do modelo — O LLM lê a tarefa e as ferramentas disponíveis, decide qual ferramenta chamar e com quais argumentos
- Pedido de chamada de ferramenta — O modelo produz uma mensagem estruturada de "tool call" (por exemplo,
{ "tool": "web_search", "args": { "query": "current Gemini models" } }) - Execution — O código do seu runtime chama a função, API ou serviço real
- Injeção de resultado — O resultado é adicionado de volta ao contexto da conversa
- Raciocínio contínuo — O modelo lê o resultado e ou chama outra ferramenta, faz uma pergunta de acompanhamento, ou gera a resposta final
Este loop pode se repetir muitas vezes em um único turno. Uma tarefa agente complexa pode chamar 10–20 ferramentas em sequência antes de produzir uma resposta final.
📊 Skills vs Plugins vs MCP Servers
A terminologia evoluiu rapidamente. Eis como os conceitos se relacionam historicamente:
| Era | Name | Como funcionava | Status |
|---|---|---|---|
| 2023 | ChatGPT Plugins | Extensões instaláveis pelo usuário com um OpenAPI spec; o ChatGPT as chamava via HTTP | Obsoleto (substituído por GPTs + tools) |
| 2023 | OpenAI Function Calling | Definições de JSON Schema em nível de API; o modelo produz uma chamada de função estruturada, seu código a executa | Ativo — renomeado para "tool use" |
| 2023– | Tool Use / Skills | Igual ao function calling; a Anthropic cunhou "tool use", outros usam "skills" ou "functions" | Ativo — padrão atual |
| 2024– | MCP Servers | Protocolo padronizado (Anthropic, Dez 2024) para empacotar e distribuir servidores de ferramentas; qualquer cliente MCP pode conectar-se a qualquer servidor MCP | Ativo — ecossistema em crescimento |
Distinção chave: O uso tradicional de ferramentas é definido inline no código da sua aplicação. MCP servers são processos autônomos que expõem ferramentas por um protocolo padronizado — tornando-os reutilizáveis através de diferentes clientes de IA (Claude Desktop, Cursor, VS Code, agentes customizados). Leia mais: O que é MCP.
🗂️ Categorias de Ferramentas & Níveis de Risco
Nem todas as ferramentas apresentam o mesmo risco. Agrupar por nível de risco ajuda a definir o espaço de ação e onde adicionar checkpoints human-in-the-loop:
| Category | Examples | Risk | Recommendation |
|---|---|---|---|
| Read-only | web_search, read_file, get_weather, list_dir | Low | Permitir autonomamente; registrar todas as chamadas |
| Write (local) | write_file, create_dir, edit_code | Medium | Restringir a um diretório de workspace em sandbox |
| Network / External | send_email, post_to_slack, call_api | Médio–Alto | Aprovação HITL para envios irreversíveis |
| OS / Shell | run_command, execute_script, install_package | High | Restringir ao ambiente containerizado; HITL exigido |
| Destructive | delete_file, drop_table, revoke_access | Critical | Sempre exigir confirmação humana explícita |
🏗️ Anatomia de uma Boa Skill
A decisão de design mais importante para uma skill é sua description. O LLM lê as descrições para decidir qual ferramenta chamar — uma descrição mal escrita leva à seleção errada da ferramenta, chamadas perdidas ou argumentos ambíguos.
O que torna uma descrição eficaz
- Seja explícito sobre quando usá-la — "Use this tool when the user asks about real-time data or current events" é melhor do que "Searches the web"
- Declare o que ela NÃO faz — "Não retorna dados históricos com mais de 30 dias"
- Descreva o formato de saída — "Retorna um array JSON de resultados de busca com os campos title, url e snippet"
- Mantenha abaixo de 200 palavras — descrições maiores que ~200 tokens podem sobrecarregar a atenção do modelo quando muitas ferramentas estão registradas
Princípios de design de schema
- Obrigatório vs opcional — Marque campos como obrigatórios somente se realmente necessário; campos opcionais com defaults reduzem erros do modelo
- Use enums para valores restritos —
"format": {"enum": ["json", "markdown", "text"]}previne valores alucinatórios - Prefira ferramentas idempotentes — Ferramentas que podem ser reexecutadas com segurança (leituras, consultas) são mais seguras do que ações de única execução (envios, exclusões)
- Retorne dados estruturados — Respostas JSON são mais fáceis para o modelo raciocinar do que blobs de texto não estruturado
💡 Exemplos do Mundo Real
| Nome da skill | O que ela faz | Argumentos chave | Risk |
|---|---|---|---|
web_search | Consulta um motor de busca e retorna os principais resultados | query: string, num_results?: number | Low |
read_file | Leia um arquivo do diretório de workspace | path: string, offset?: number, limit?: number | Low |
write_file | Crie ou sobrescreva um arquivo | path: string, content: string | Medium |
run_tests | Execute a suíte de testes do projeto e retorne resultados | filter?: string | Medium |
browser_screenshot | Navegue até uma URL e retorne uma captura de tela | url: string | Medium |
send_email | Envie um e-mail para um ou mais destinatários | to: string[], subject: string, body: string | Alto — sempre HITL |
run_shell | Execute um comando arbitrário do shell | command: string, cwd?: string | Alto — sandbox exigido |
✅ Boas Práticas
Permissões mínimas
Conceda a cada agente somente as ferramentas que ele precisa para sua tarefa específica. Um agente que responde perguntas frequentes não precisa de write_file or send_email. Quanto menor o espaço de ação, menor a área de impacto se o agente for manipulado. Veja: Agência Excessiva.
Audite todas as chamadas de ferramenta
Registre toda chamada de ferramenta com seus argumentos e resultado. Isso possibilita depuração, atribuição de custos, e detecção de comportamento anômalo (por exemplo, um agente lendo ~/.ssh/ quando deveria acessar apenas o diretório do projeto). Plataformas AgentOps como LangSmith tornam isso fácil.
Humano-no-loop para ações irreversíveis
Qualquer ação que seja difícil ou impossível de desfazer — enviar mensagens, excluir dados, fazer compras — deve exigir confirmação humana explícita antes da execução. Construa checkpoints HITL no runtime do seu agente, não apenas no prompt. Prompts podem ser sobrescritos; código não pode.
Cuidado com envenenamento de ferramenta
Se você permitir que agentes instalem ou descubram MCP servers dinamicamente, um servidor malicioso pode registrar uma ferramenta com uma descrição que contenha instruções ocultas. Sempre revise descrições de ferramentas antes de adicioná-las ao registro do seu agente. Veja: Envenenamento de Ferramenta.
Escreva retornos de erro claros
Quando uma ferramenta falha, retorne um erro estruturado com contexto suficiente para o modelo se recuperar ou escalar — não um rastreamento de pilha (stack trace) cru. Exemplo: { "error": "rate_limited", "retry_after": 5 }. Um erro bem descrito permite que o agente tente novamente, use uma ferramenta de fallback ou informe o usuário com elegância.