🔧 O que é um 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 da sua janela de contexto. Skills preenchem a lacuna entre o entendimento de linguagem e a ação no mundo real.
Todo skill tem quatro componentes:
- Name — um identificador único que o modelo usa para referenciar o skill (por exemplo,
web_search) - Description — texto em linguagem natural explicando o que o skill faz e quando usá-lo; o LLM lê isso para decidir quando chamar o skill
- Esquema de entrada — uma definição estruturada dos argumentos (JSON Schema); o modelo preenche esses campos com base na tarefa
- Implementation — o código real que é executado: uma chamada API, consulta ao banco de dados, comando 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 Chamamento de Ferramentas Funciona
Quando um agente tem acesso a skills, o LLM não os chama diretamente — ele requests uma chamada gerando uma saída estruturada. O runtime (seu código de aplicação) executa a chamada real e retorna o resultado. Aqui está o ciclo completo:
- Registro da 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
- Requisição de chamada de ferramenta — O modelo produz uma mensagem estruturada de "tool call" (por exemplo,
{ "tool": "web_search", "args": { "query": "current Gemini models" } }) - Execution — Seu código em 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 seguimento ou gera a resposta final
Este loop pode repetir muitas vezes em uma única interação. Uma tarefa agenteica 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. Veja como os conceitos se relacionam historicamente:
| Era | Name | Como funcionava | Status |
|---|---|---|---|
| 2023 | ChatGPT Plugins | Extensões instaláveis pelo usuário com um spec OpenAPI; o ChatGPT as chamava via HTTP | Obsoleto (substituído por GPTs + tools) |
| 2023 | OpenAI Function Calling | Definições de JSON Schema no nível da 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; 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 seu código de aplicação. MCP servers são processos independentes que expõem ferramentas através de um protocolo padronizado — tornando-os reutilizáveis entre 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 humanos no loop:
| Category | Examples | Risk | Recommendation |
|---|---|---|---|
| Read-only | web_search, read_file, get_weather, list_dir | Low | Permitir autonomamente; registrar todas as chamadas |
| Escrever (local) | write_file, create_dir, edit_code | Medium | Restringir a um diretório de workspace em sandbox |
| Rede / Externo | 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 a ambiente containerizado; HITL necessário |
| Destructive | delete_file, drop_table, revoke_access | Critical | Sempre exigir confirmação humana explícita |
🏗️ Anatomia de um Bom Skill
A decisão de design mais importante para um 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á-lo — "Use esta ferramenta quando o usuário pergunta sobre dados em tempo real ou eventos atuais" é melhor que "Busca na web"
- Declare o que 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 campos title, url e snippet"
- Mantenha abaixo de 200 palavras — descrições com mais de ~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 repetidas com segurança (leituras, consultas) são mais seguras do que ações únicas (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 do skill | O que faz | Argumentos chave | Risk |
|---|---|---|---|
web_search | Consultar um mecanismo de busca e retornar os principais resultados | query: string, num_results?: number | Low |
read_file | Ler um arquivo do diretório de workspace | path: string, offset?: number, limit?: number | Low |
write_file | Criar ou sobrescrever um arquivo | path: string, content: string | Medium |
run_tests | Executar a suíte de testes do projeto e retornar resultados | filter?: string | Medium |
browser_screenshot | Navegar para uma URL e retornar uma screenshot | url: string | Medium |
send_email | Enviar um email para um ou mais destinatários | to: string[], subject: string, body: string | Alto — sempre HITL |
run_shell | Executar um comando shell arbitrário | command: string, cwd?: string | Alto — sandbox necessário |
✅ Boas Práticas
Permissões mínimas
Conceda a cada agente apenas as ferramentas que ele precisa para sua tarefa específica. Um agente que responde FAQ não precisa de write_file or send_email. Quanto menor o espaço de ações, menor o raio de dano se o agente for manipulado. Veja: Agência Excessiva.
Auditar todas as chamadas de ferramenta
Registre toda chamada de ferramenta com seus argumentos e resultado. Isso possibilita depuração, atribuição de custo e detecção de comportamento anômalo (por exemplo, um agente lendo ~/.ssh/ quando deveria somente acessar 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 tempo de execução do agente, não apenas no prompt. Prompts podem ser sobrescritos; código não pode ser.
Cuidado com envenenamento de ferramenta
Se você permite que agentes instalem ou descubram MCP servers dinamicamente, um servidor malicioso pode registrar uma ferramenta com uma descrição que contém instruções ocultas. Sempre revise as descrições de ferramentas antes de adicioná-las ao registro do 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 uma stack trace de exceção bruta. Exemplo: { "error": "rate_limited", "retry_after": 5 }. Um erro bem descrito permite que o agente tente novamente, use uma ferramenta alternativa ou informe o usuário com elegância.