Um agente recebe duas tools com nomes parecidos e escolhe a errada. Outra chamada usa um identificador que não existe porque o parâmetro dizia apenas "ID". A aplicação rejeita o pedido, mas o modelo não sabe se deve corrigir o argumento, escolher outra ferramenta ou responder sem chamar nada.

Para escrever uma boa descrição de tool, explique quatro decisões: o que a ferramenta faz, quando o agente deve escolhê-la, quais dados os parâmetros representam e que resultado ele receberá. O schema limita a forma da chamada. A descrição orienta a escolha. Um não substitui o outro.

Esse trabalho acontece antes do runtime. O servidor MCP em TypeScript para agentes de código mostra como expor uma superfície estreita. Aqui, o foco é escrever a interface que o modelo lê antes de enviar o primeiro argumento.

Diagrama mostra um agente de IA escolhendo uma tool entre opções, usando escopo e descrição antes de fazer a chamada.

Resumo prático

  • Nomeie a intenção que o agente precisa cumprir, não a classe ou o endpoint interno.
  • Diga quando usar a tool e quando escolher outra opção.
  • Descreva parâmetros ambíguos com unidade, formato, origem e exemplos curtos.
  • Mantenha ferramentas parecidas separadas por escopo e teste a seleção com casos reais.

O que uma descrição de tool precisa responder?

Uma descrição útil responde à pergunta "esta é a ferramenta certa para este pedido?". O guia de function calling do Google Cloud separa a declaração da função, os parâmetros e a execução que devolve o resultado ao modelo. Esses campos não são decoração: formam a superfície que o agente usa para propor uma chamada.

Comece pela intenção, não pela implementação. O agente não precisa saber que a função chama um endpoint REST ou que o handler consulta uma tabela. Ele precisa saber que a tool busca pedidos existentes por número ou cliente, por exemplo. A camada de execução pode mudar sem obrigar o modelo a reaprender uma decisão de negócio.

Uma descrição deve deixar quatro coisas legíveis:

  • Ação: qual pergunta ou tarefa a tool resolve.
  • Momento: que sinais indicam que ela deve ser chamada.
  • Limite: quais pedidos pertencem a outra tool ou exigem confirmação.
  • Resultado: que tipo de evidência volta e o que ainda não foi confirmado.

Isso não significa transformar a descrição em um manual. Detalhes de autenticação, retries internos e nomes de tabelas pertencem ao código e aos logs. O texto entregue ao modelo deve conter a informação necessária para decidir, não todo o histórico da implementação.

Cápsula citável: A descrição de uma tool é uma parte da interface do agente. Ela deve explicar a ação, o momento de uso, os limites e o resultado esperado. O schema valida a forma dos argumentos, mas não ensina sozinho quando uma ferramenta é mais adequada que outra.

Como escolher nomes que diferenciam as tools?

O nome deve representar a operação que o agente reconhece, com um vocabulário estável e específico. buscar_dados não distingue clientes, pedidos ou faturas. consultar_pedido_por_numero já reduz a ambiguidade porque informa o objeto e o critério principal.

Evite nomes baseados em detalhes que só existem no código, como executeQueryV2, customerLookupService ou runWorkflow. Eles podem fazer sentido para quem abriu o repositório, mas não respondem à tarefa que aparece na conversa.

Este é um exemplo ilustrativo de duas tools de leitura. O código não depende de um provedor específico:

const tools = [
  {
    name: "consultar_pedido_por_numero",
    description:
      "Busca um pedido existente pelo número exato e devolve status, itens e datas observadas.",
  },
  {
    name: "buscar_pedidos_do_cliente",
    description:
      "Lista pedidos associados a um cliente quando o usuário não tem um número de pedido.",
  },
];

As duas tools ainda precisam de schemas de entrada e saída. A diferença é que cada descrição responde a uma intenção distinta. Se uma delas atende tanto busca por número como busca por nome, o agente precisa adivinhar qual regra vale e a ferramenta vira uma caixa maior do que deveria.

Quando a ferramenta muta dados, o nome também deve deixar a ação visível. preparar_reembolso e confirmar_reembolso não têm o mesmo risco nem a mesma condição de uso. A descrição deve reforçar essa diferença, mas a autorização continua sendo uma decisão do runtime, não uma promessa escrita no texto.

Como descrever parâmetros sem esconder a ambiguidade?

Um parâmetro não está explicado só porque tem um nome. id, date, status e amount podem representar várias coisas. O guia do Google Cloud recomenda nomes claros e descrições detalhadas para funções e parâmetros. A aplicação precisa transformar essa recomendação em perguntas concretas sobre cada campo.

Para cada parâmetro, informe o que ele identifica, qual formato aceita, de onde o usuário pode obtê-lo e que unidade ou fuso horário se aplica. Se o valor deve vir de uma resposta anterior, diga isso. Se o agente não deve inventá-lo, escreva a regra.

const consultarPedido = {
  name: "consultar_pedido_por_numero",
  description:
    "Busca um pedido existente pelo número exato. Use quando o usuário informar o número; não use para descobrir pedidos de um cliente.",
  parameters: {
    type: "object",
    properties: {
      numero: {
        type: "string",
        description:
          "Número visível no comprovante do pedido, como PED-1042. Não use o telefone ou o ID interno do cliente.",
      },
    },
    required: ["numero"],
  },
};

O exemplo também mostra o que não deve acontecer: trocar um identificador por outro só porque ambos são strings. O schema pode exigir string, mas não consegue explicar sozinho a diferença entre PED-1042, um telefone e um UUID interno.

Inclua exemplos apenas quando eles eliminam uma dúvida real. Um exemplo de formato ajuda com datas, códigos compostos e unidades. Muitos exemplos decorativos aumentam o texto disponível sem melhorar a decisão. Se a regra for longa o bastante para virar um parágrafo de exceções, talvez a tool esteja abrangendo duas operações.

Cápsula citável: Parâmetros bem descritos carregam semântica que um tipo JSON não expressa. Diga o que o campo identifica, qual formato aceita, qual unidade usa e de onde o valor deve vir. Um schema pode rejeitar um tipo inválido, mas não distingue sozinho um número de pedido de outro identificador textual.

Como dizer quando o agente não deve chamar a tool?

Uma boa descrição contém limites positivos e negativos. Dizer apenas "busca pedidos" não explica se a tool deve ser usada para criar um pedido, localizar um cliente ou consultar uma entrega. O agente precisa reconhecer a fronteira com as ferramentas vizinhas.

Escreva a regra em linguagem operacional:

  1. Use esta tool quando o pedido trouxer um número de pedido completo.
  2. Use a busca por cliente quando o usuário não souber esse número.
  3. Não use esta tool para alterar, cancelar ou reembolsar um pedido.
  4. Não preencha o número por inferência; peça o dado que falta.

Essas frases não concedem permissão. Elas reduzem a chance de o modelo tratar uma tool de leitura como uma ação ou escolher uma operação de mutação porque o nome parece parecido. A validação de autorização e argumentos continua no código, como explica o artigo sobre validar tool calls em TypeScript.

Também vale separar tools por escopo. A documentação de estratégia de tools MCP da AWS alerta que poucas ferramentas podem deixar o modelo sem contexto, enquanto muitas podem confundir a escolha e a sequência. A mesma orientação recomenda pensar na granularidade e no escopo de cada tool.

Na documentação atual de function calling do Google Cloud, a recomendação é fornecer apenas as tools relevantes para a tarefa e usar um conjunto ativo de 10 a 20 como referência operacional. Isso não é uma lei para todo agente. É um sinal de que uma descrição perfeita não conserta um catálogo indiscriminado. Filtre a superfície antes de revisar o texto.

Como revisar uma descrição sem prometer que ela funciona?

Não trate a descrição como texto que só precisa parecer claro. Revise-a com casos que representem decisões concorrentes. O objetivo não é provar que um modelo sempre escolherá a tool certa. É descobrir se a interface deixa uma escolha importante sem resposta.

Uma matriz pequena pode conter:

Caso Tool que deveria aparecer O que a descrição precisa deixar claro
Usuário informa PED-1042 consulta por número número exato e leitura somente
Usuário informa apenas o cliente busca por cliente ausência do número e critério de busca
Usuário pede cancelamento nenhuma leitura ação de mutação pertence a outra superfície
Usuário não informa o identificador pergunta de esclarecimento não inventar o valor ausente

Para cada caso, registre a tool escolhida, os argumentos produzidos e a razão esperada. Se a saída precisar de confirmação, registre também essa condição. O teste pode usar um modelo real, um mock ou uma fixture de chamada, mas a escolha deve ser explícita antes da execução.

Depois compare versões da definição como código. Uma mudança em description, name, inputSchema ou outputSchema pode alterar a forma como o agente entende a superfície. O teste de contrato para servidores MCP em TypeScript cobre a fronteira do protocolo; a matriz acima cobre a decisão que acontece antes da chamada.

Uma descrição falha quando o revisor consegue explicar como a tool funciona, mas não consegue explicar por que o agente deveria escolhê-la em vez da vizinha. O teste de leitura é simples: remova o nome interno da função e pergunte qual tarefa concreta continua visível.

O que deve ficar fora da descrição?

Não use a descrição para esconder uma política que deveria ser verificável. Frases como "sempre seguro", "não falha" ou "pode executar qualquer operação" são promessas vagas. O runtime precisa impor limites, validar argumentos, controlar autorização e verificar efeitos externos.

Também não coloque segredos, tokens, stack traces, nomes de tabelas sensíveis ou detalhes de infraestrutura. A descrição é enviada para a camada que ajuda o modelo a escolher. Logs de execução e diagnósticos de operador têm outra finalidade e outra política de retenção.

Evite ainda repetir o schema em prosa. Se status aceita três valores, declare o enum e explique somente a diferença que afeta a decisão. Se o campo é obrigatório, marque-o no schema e use o texto para dizer por que ele é necessário ou de onde vem.

No MCP, a definição de uma tool inclui nome, descrição e schemas de entrada e saída. A especificação de tools do MCP descreve essa superfície e lembra que tools são controladas pelo modelo, embora a aplicação deva manter controles de confiança e interação humana para ações sensíveis.

Cápsula citável: Descrições de tools devem orientar escolha, não substituir controles de segurança. Não coloque segredos nem prometa que uma operação é sempre segura. Autorização, validação, limites e confirmação precisam ser aplicados pelo runtime, enquanto o texto explica a intenção e os limites que o agente deve considerar.

Checklist antes de publicar uma tool

Antes de expor uma nova ferramenta ao agente, revise:

  • O nome descreve a intenção e diferencia as tools vizinhas.
  • A descrição diz quando usar e quando não usar.
  • Cada parâmetro informa significado, formato, unidade e origem quando isso importa.
  • A tool deixa claro se lê, propõe ou altera estado.
  • O schema marca campos obrigatórios, enumera valores e limita formas inválidas.
  • O resultado explica o que foi observado, não apenas que a chamada terminou.
  • A autorização e os limites existem no runtime.
  • Há pelo menos um caso de teste para cada escolha concorrente.
  • A superfície ativa contém somente as tools necessárias para a tarefa.

Uma descrição não torna o comportamento determinístico. Ela melhora o contrato que o modelo recebe e torna a decisão revisável. Se os casos continuam ambíguos depois de você escrever a regra de uso e a regra de não uso, o próximo ajuste provavelmente é dividir a tool ou reduzir o catálogo, não acrescentar mais adjetivos.

Como este artigo foi produzido

Este texto foi escrito por Samuel Fajreldines a partir de uma auditoria dos posts relacionados no repositório, da inspeção de resultados atuais e da leitura da documentação do Google Cloud, AWS e Model Context Protocol em 09/10/2026. Os exemplos TypeScript e JSON são ilustrativos. Não há benchmark próprio nem teste de seleção executado sendo apresentado como prova.

Fontes consultadas