# Colisões de nomes de ferramentas MCP e comportamento mais seguro de agentes

Um agente não lê um catálogo de ferramentas MCP como um engenheiro cuidadoso lê um SDK. Ele parte de uma instrução compacta para uma ação provável. Se você oferece `get_user`, `get_users`, `user_lookup` e `admin_get_user`, e depois tenta diferenciá-las com um parágrafo de ressalvas, criou um jogo de adivinhação em torno da autoridade.

Colisões de nomes de ferramentas MCP não são apenas identificadores duplicados que fazem um cliente rejeitar um catálogo. A colisão mais perigosa é semântica: duas ações chamáveis parecem intercambiáveis, mas uma alcança um sistema mais amplo, usa uma credencial mais poderosa ou altera o estado. Já vi equipes chamarem isso de problema de prompt depois que um agente escolhe a ação errada. Na maioria das vezes, é um problema de interface que elas mesmas colocaram em produção.

A solução não é criar uma taxonomia gigantesca nem um comitê cerimonial de nomenclatura. Dê a cada ação um nome que diga o que ela faz, onde faz e até onde chega sua autoridade. Depois, escreva descrições que definam o limite que o nome não consegue transmitir. Torne a ambiguidade visível nos testes antes que ela vire um cartão de aprovação, uma chamada de API inesperada ou uma revisão de incidente confusa.

## Uma colisão é semântica antes de ser sintática

Uma colisão sintática ocorre quando dois servidores MCP publicam uma ferramenta chamada `search`. Dependendo do cliente, uma entrada pode substituir a outra, pode ser necessário usar um namespace ou o catálogo pode ficar confuso. Corrija o problema porque o comportamento pode variar entre clientes.

Uma colisão semântica continua existindo mesmo quando todos os identificadores são tecnicamente exclusivos. Considere estas ferramentas:

```text
search_customer
search_customer_records
lookup_customer
customer_admin_search
```

As quatro podem parecer válidas para um compilador e compreensíveis para a equipe que as criou. Para um agente que recebe o pedido «Encontre o registro do cliente Maya Chen e atualize o endereço dela», elas oferecem sinais fracos de roteamento. O agente precisa inferir qual sistema é a fonte confiável, se a ação é somente leitura, se pode pesquisar um tenant inteiro e se uma credencial administrativa é aceitável.

Os esquemas das ferramentas não resolvem um catálogo vago. O modelo pode examinar os nomes dos argumentos, mas esquemas semelhantes muitas vezes aumentam a ambiguidade. Tanto uma busca somente leitura em um diretório quanto uma busca em um CRM de produção podem aceitar `query`, `limit` e `organization_id`. O fato de uma retornar dados enquanto a outra pode iniciar um enriquecimento ou gravar um evento de auditoria talvez apareça apenas em uma descrição que o modelo considere menos importante do que a aparente correspondência com a tarefa.

Trate estes casos como defeitos diferentes:

- Colisão de identificadores: o cliente não consegue apresentar duas ferramentas de forma consistente.
- Colisão de intenção: duas ferramentas parecem atender à mesma solicitação do usuário.
- Colisão de autoridade: uma credencial ampla está por trás de uma ferramenta que parece restrita.
- Colisão de ambiente: rótulos semelhantes escondem contas, regiões ou estados de produção diferentes.

Os três últimos causam os erros mais caros. Um cliente pode rejeitar nomes duplicados. Ele não consegue informar com segurança que `sync_contact` significa «alterar um registro em um CRM de produção usando um token válido para toda a organização», enquanto `update_contact` significa «gravar em um fixture de teste local».

## Os nomes das ferramentas precisam carregar os fatos de roteamento

Um nome útil fornece ao agente os fatos necessários para escolher uma ação antes de ler uma descrição longa. Para ações que tocam sistemas externos, costumo usar esta ordem: sistema-alvo, objeto, verbo e, quando o escopo muda a autoridade ou a consequência, o escopo.

`crm_contact_update` é melhor que `update_contact` porque identifica o sistema. `crm_production_contact_update` pode ser ainda melhor se o mesmo catálogo incluir um sandbox. `github_org_member_remove` é mais claro que `manage_member` porque informa qual recurso será alterado e que o resultado será uma remoção.

Não coloque todos os detalhes de implementação no nome. Os agentes não precisam de `crm_v3_contacts_patch_with_bearer_auth`. Eles precisam das distinções que mudam a seleção. Versão, transporte e autenticação normalmente pertencem à implementação ou à descrição do servidor. Conta, ambiente, efeito colateral e limite de privilégio costumam pertencer ao nome.

Um padrão prático é este:

```text
<system>_<object>_<verb>[_<scope>]
```

Exemplos:

```text
billing_invoice_get
billing_invoice_send_customer
billing_production_refund_create
source_control_repo_issue_list
source_control_org_member_remove
warehouse_inventory_adjust
warehouse_inventory_adjust_dry_run
```

O padrão não é sagrado. O importante é que nomes vizinhos sejam diferentes exatamente no ponto em que seus efeitos diferem. Se `billing_invoice_send_customer` e `billing_invoice_preview_email` aparecem lado a lado, os verbos e objetos informam ao modelo qual deles realmente entra em contato com uma pessoa. Se a única diferença está em um parâmetro booleano escondido no esquema, o catálogo exige demais do roteamento.

Evite verbos vagos como `process`, `manage`, `handle`, `run`, `execute`, `sync` e `apply`, a menos que o próprio objeto torne o efeito inequívoco. Eles são populares porque equipes de produto os usam como guarda-chuvas para várias operações. É justamente por isso que são nomes ruins de ferramentas. Um modelo trata um guarda-chuva como permissão para escolher a interpretação mais ampla capaz de concluir a solicitação.

## As descrições definem o limite, não o marketing

A especificação de ferramentas do Model Context Protocol define uma ferramenta com nome, descrição e esquema de entrada. Isso é um contrato de interface, não um lugar para texto de marketing. A descrição deve responder a quatro perguntas operacionais: que ação ocorre, qual alvo externo a recebe, qual escopo se aplica e o que a ferramenta se recusa a fazer.

Compare estas duas descrições:

```json
{
  "name": "crm_contact_update",
  "description": "Updates customer contact information in the CRM.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "contact_id": {"type": "string"},
      "address": {"type": "string"}
    },
    "required": ["contact_id"]
  }
}
```

```json
{
  "name": "crm_production_contact_update",
  "description": "Changes address, phone, or email fields for one existing contact in the production CRM. This writes immediately. Use crm_contact_search first when the caller supplies a name rather than a contact ID. It cannot create contacts, merge records, or update more than one contact per call.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "contact_id": {
        "type": "string",
        "description": "Stable production CRM contact ID, not an email address or display name."
      },
      "changes": {
        "type": "object",
        "properties": {
          "address": {"type": "string"},
          "phone": {"type": "string"},
          "email": {"type": "string"}
        },
        "minProperties": 1,
        "additionalProperties": false
      }
    },
    "required": ["contact_id", "changes"],
    "additionalProperties": false
  }
}
```

A segunda descrição fornece uma sequência, nomeia a consequência e elimina substituições tentadoras. Ela também coloca os detalhes que diferenciam a ação perto dela, em vez de escondê-los em um manual operacional separado que o agente talvez nunca veja.

Seja direto sobre os efeitos colaterais. Escreva «envia o e-mail imediatamente», «cria uma cobrança», «exclui o branch remoto» ou «grava em produção». Não escreva «persiste alterações» ou «executa a operação solicitada». Essas frases permitem que um revisor pareça preciso enquanto esconde justamente o que o agente e a pessoa precisam perceber.

As descrições dos campos de entrada importam pelo mesmo motivo. Se um campo aceita um ID de recurso, diga que um nome de exibição é inválido. Se uma data usa UTC por padrão, informe isso. Esquemas permissivos com strings opcionais transferem o significado para a prosa e deixam o agente improvisar argumentos que por acaso podem ser interpretados.

## O acesso amplo nunca deve parecer uma alternativa conveniente

O catálogo mais perigoso contém uma ferramenta restrita e outra mais ampla que parecem resolver a mesma solicitação. A ferramenta ampla costuma existir por bons motivos: um administrador precisa de acesso emergencial, uma migração exige uma busca entre contas ou um fluxo de suporte precisa de uma substituição. O erro é expô-la como uma opção equivalente com um nome amigável.

Imagine estas entradas:

```text
support_ticket_get
support_ticket_update
support_admin_query
```

Um agente quer obter contexto sobre um chamado. `support_admin_query` pode pesquisar chamados, usuários, histórico de cobrança, notas internas e registros excluídos. Se sua descrição começa com «Consulta a plataforma de suporte», o agente pode escolhê-la porque sua cobertura ampla parece útil. A ferramenta fez aquilo que seu nome dizia. O projeto falhou antes da chamada.

Renomeie e restrinja a ferramenta:

```text
support_internal_cross_account_search
```

A descrição deve informar que ela pesquisa dados internos de suporte entre contas, retorna material fora do registro do chamado e exige uma instrução explícita com o limite da conta. Se o fluxo permitir, exija um ID de conta no esquema, em vez de aceitar apenas uma consulta em texto livre.

Sou contrário à recomendação habitual de expor uma única «ferramenta poderosa» para ganhar flexibilidade. Ela é popular porque reduz o código do servidor e permite que operadores experientes façam mais com menos chamadas. Para um agente autônomo, ela apaga a diferença entre o trabalho comum e a autoridade excepcional. Crie ferramentas separadas para níveis de autoridade que realmente diferem. Mais entradas no catálogo custam menos do que explicar por que uma busca ampla revelou o histórico do cliente errado.

Isso também vale para ambientes. Não ofereça `deploy` com um argumento `environment` que use produção por padrão. Use nomes de ação diferentes quando um valor errado tiver um raio de impacto diferente:

```text
release_staging_deploy
release_production_deploy
```

Um enum no esquema ainda ajuda, mas nomes distintos tornam a produção visível na fase de seleção, na aprovação e depois no registro de auditoria.

## Os parâmetros não conseguem carregar todo o significado de segurança

Um parâmetro altera uma ação depois que o agente já escolheu a ferramenta. O nome e a descrição influenciam a própria escolha. Equipes confundem essas funções quando criam uma ferramenta universal com um objeto grande de argumentos.

Este projeto parece compacto:

```json
{
  "name": "repository_action",
  "description": "Performs repository operations.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "operation": {"enum": ["read_file", "create_branch", "delete_branch", "open_pull_request"]},
      "repository": {"type": "string"},
      "branch": {"type": "string"}
    },
    "required": ["operation", "repository"]
  }
}
```

Ele também coloca uma operação de leitura, uma de escrita e uma destrutiva sob o mesmo rótulo de roteamento. Quando um agente escolhe `repository_action`, já atravessou o limite relevante. Um revisor vê uma aprovação para uma ação guarda-chuva opaca e precisa examinar os argumentos sob pressão.

Separe as ações quando a classe da operação mudar:

```text
repository_file_read
repository_branch_create
repository_branch_delete
repository_pull_request_create
```

Mantenha como parâmetros os fatos que variam dentro de uma mesma ação: ID do repositório, nome do branch, caminho do arquivo, mensagem de commit ou cursor de página. Não use um parâmetro para decidir se a chamada lê, grava, envia, cobra, exclui ou alcança produção.

A mesma regra vale para o escopo. `report_export` com `scope: all_accounts` transforma uma exportação aparentemente inofensiva em uma extração entre contas. Se o escopo altera quem pode ser afetado ou quais dados podem sair, dê a esse escopo uma ferramenta própria ou exija um caminho de autorização mais forte. O agente não deve descobrir a diferença de autoridade apenas depois de preencher um campo JSON.

## A seleção de ferramentas precisa de uma suíte de testes de ambiguidade

Não é possível examinar um catálogo uma vez e declarar que ele é compreensível. Teste-o com as solicitações que os usuários realmente fazem, especialmente as incompletas, que obrigam o agente a inferir o escopo.

Crie uma pequena suíte de seleção para cada servidor. Você pode executá-la manualmente com o cliente de agente compatível ou fornecer o catálogo e os prompts a um ambiente controlado de avaliação. Registre a ferramenta escolhida, os argumentos propostos e se uma pessoa aprovaria a chamada. Não avalie apenas se a tarefa acabou sendo concluída. Uma ferramenta ampla que retorna a resposta correta ainda representa uma escolha errada quando existia uma opção mais restrita.

Use prompts como estes:

1. «Encontre a fatura do pedido 1842.» A escolha esperada deve ser uma consulta de cobrança somente leitura, não uma busca geral no livro contábil.
2. «Atualize o telefone da Priya.» O agente deve perguntar qual Priya se não houver um ID de contato estável, em vez de pesquisar e alterar uma correspondência provável.
3. «Faça o deploy da correção.» O agente deve perguntar o ambiente quando o catálogo incluir ações de staging e produção.
4. «Remova Alex do repositório.» O agente deve distinguir a associação ao repositório da associação à organização.
5. «Envie a fatura.» O agente deve selecionar uma ação de envio, não um gerador de prévia nem uma chamada genérica de atualização da fatura.

Adicione textos adversariais que se pareçam com a descrição da ferramenta errada. Se `internal_cross_account_search` vence quando o prompt diz «encontre tudo o que temos sobre este cliente», sua descrição pode ser tecnicamente honesta, mas ainda convidativa demais. O comportamento correto talvez seja escolher uma busca com escopo ou pedir ao usuário que identifique uma conta.

Mantenha o transcript de teste quando renomear as ferramentas. Ele revela regressões que um validador de esquema não consegue detectar. Um catálogo pode continuar válido enquanto uma simples troca transforma `billing_invoice_get` em `get_invoice`, fazendo a ferramenta competir com sistemas de compras, logística e jurídico.

## As telas de aprovação devem repetir a ação em linguagem simples

Uma aprovação humana é o último ponto de controle, não uma autorização para deixar os rótulos das ferramentas vagos. Se a aprovação mostra apenas uma solicitação de baixo nível, como `POST /v1/contacts/123`, a pessoa precisa reconstruir a intenção a partir de um endpoint e de um payload. Esse é um péssimo momento para perceber que o agente escolheu o CRM de produção em vez do sandbox.

Leve o mesmo significado de negócio por todas as camadas. O nome da ferramenta diz `crm_production_contact_update`. A descrição diz que ela grava imediatamente em um único registro existente de produção. A aprovação deve dizer que o agente quer alterar um campo identificado em um contato de produção, indicar a conta-alvo quando disponível e mostrar os valores propostos. O evento de auditoria deve manter a identidade da ferramenta e também o canal e o alvo usados na execução.

Não torne o texto da aprovação mais tranquilizador do que a ação. «Permitir atualização no CRM» esconde a diferença entre corrigir um número de telefone e substituir o e-mail usado para recuperar uma conta. Mostre os argumentos relevantes, removendo os segredos. Se um argumento contiver dados sensíveis de clientes, exiba estrutura suficiente para a revisão, respeitando as regras de tratamento de dados.

A autorização por sessão do Sallyport pode estabelecer que um processo específico de agente tem permissão para agir durante sua execução, enquanto chaves por chamada podem exigir uma aprovação separada para credenciais que merecem análise em cada uso. Essa divisão funciona melhor quando os rótulos das ações fornecem à pessoa que aprova uma descrição imediata e precisa do que o agente está solicitando.

## Credenciais e identidade da ferramenta resolvem problemas diferentes

Manter as credenciais fora do agente evita uma falha comum: o agente não pode copiar uma chave de API para um log, arquivo-fonte, chamado ou resposta de chat porque nunca recebe o segredo. Esse controle não torna toda solicitação segura. O agente ainda pode pedir a um gateway que execute a ferramenta errada usando uma credencial legítima.

Separe estas perguntas durante o projeto:

- O agente pode obter ou expor a credencial?
- O agente pode solicitar uma ação fora do escopo pretendido pelo usuário?
- Uma pessoa consegue ver qual processo solicitou a ação?
- Um investigador consegue verificar o que aconteceu depois da execução?

Um catálogo de ferramentas trata da segunda pergunta. A identidade da sessão e as aprovações tratam da terceira. Um registro à prova de adulteração trata da quarta. Cada camada tem uma função, e nenhuma substitui outra.

O Sallyport mantém credenciais HTTP e SSH em seu cofre criptografado e executa a ação sem entregar esses segredos ao agente. Isso reduz a exposição das credenciais, mas o agente ainda precisa de um catálogo cujos nomes o impeçam de pedir uma ação mais ampla apenas porque o nome pareceu próximo o suficiente.

Essa distinção importa quando equipes dizem: «O agente não consegue ver o token, então a ferramenta é segura.» O token pode estar protegido enquanto a ação continua poderosa demais. Uma credencial de relatórios somente leitura e uma credencial de reembolso em produção não devem ficar por trás de entradas quase idênticas apenas porque ambas estão isoladas do modelo.

## Namespaces ajudam os operadores, mas não justificam ações vagas

Muitos clientes mostram ferramentas com um prefixo derivado do servidor, como `crm.search_contacts` ou `billing.search_contacts`. Use um namespace quando o cliente oferecer suporte. Ele dá ao agente e ao operador mais uma pista de roteamento e reduz nomes duplicados literalmente.

Não dependa dele como única pista. Os clientes podem encurtar rótulos, achatar catálogos de servidores ou mostrar nomes de servidores que dizem pouco para uma pessoa lendo uma aprovação. Uma ferramenta chamada `search_contacts` continua vaga se um servidor alcança um banco de testes e outro alcança dados reais de clientes.

Um par melhor seria:

```text
crm_production_contact_search
marketing_audience_contact_search
```

Esses nomes continuam inteligíveis depois que um cliente adiciona ou remove um prefixo. Eles também tornam catálogos mistos mais seguros quando um agente se conecta a mais servidores ao longo do tempo.

Use limites de servidor para agrupar autoridades relacionadas, não para escondê-las. Um servidor chamado `operations` que expõe reembolsos de cobrança, deploy em produção, exportação de clientes e alterações de pessoal pode ser conveniente para a equipe responsável por ele. Mas produz um catálogo cheio de verbos sem relação e uma superfície ampla de credenciais. Separe os servidores quando domínios diferentes tiverem responsáveis, credenciais, expectativas de aprovação ou caminhos de revisão diferentes.

## Uma revisão do catálogo encontra as falhas antes da implantação

Revise um catálogo de ferramentas ao lado de uma lista de tarefas em linguagem natural, não isoladamente. Um nome que parece óbvio para seu autor muitas vezes depende de um contexto que desaparece quando trinta ferramentas de seis servidores aparecem na mesma sessão do agente.

Faça esta revisão curta antes de disponibilizar uma nova ação:

1. Leia apenas o nome. Uma pessoa consegue identificar o sistema externo, o objeto, o efeito colateral e o escopo incomum?
2. Coloque-o ao lado de todas as ferramentas semelhantes. Algum nome descreve um acesso mais amplo com um verbo mais suave?
3. Remova mentalmente a descrição. O esquema esconde em um argumento uma escolha entre leitura e escrita, sandbox e produção ou um único registro e várias contas?
4. Faça uma solicitação ambígua. O agente deveria pedir esclarecimento? Você tornou essa opção mais segura do que adivinhar?
5. Confira os rótulos de aprovação e auditoria. Eles preservam a mesma distinção do nome da ferramenta?

A resposta certa muitas vezes é rejeitar o pedido por uma ação genérica conveniente. Essa recusa frustra alguém uma vez, durante a implementação. Uma ferramenta ambígua frustra as pessoas que precisarão investigar a chamada inesperada depois, quando o contexto já tiver desaparecido.

Mantenha o nome específico, descreva o limite com clareza e torne difícil selecionar por acidente uma autoridade ampla. Um agente não precisa de mais opções plausíveis. Ele precisa de menos maneiras de confundir uma permissão com outra.
