query e controlar quais ferramentas Claude pode acessar. Também cobre tratamento de erros, anotações de ferramentas e retorno de conteúdo não-texto como imagens.
Referência rápida
Criar uma ferramenta personalizada
Uma ferramenta é definida por quatro partes, passadas como argumentos para o auxiliartool() em TypeScript ou o decorador @tool em Python:
- Nome: um identificador único que Claude usa para chamar a ferramenta.
- Descrição: o que a ferramenta faz. Claude lê isto para decidir quando chamá-la.
- Esquema de entrada: os argumentos que Claude deve fornecer. Em TypeScript isto é sempre um esquema Zod, e os
argsdo manipulador são tipados automaticamente a partir dele. Em Python isto é um dict mapeando nomes para tipos, como{"latitude": float}, que o SDK converte para JSON Schema para você. O decorador Python também aceita um dict completo de JSON Schema diretamente quando você precisa de enums, intervalos, campos opcionais ou objetos aninhados. - Manipulador: a função assíncrona que executa quando Claude chama a ferramenta. Ela recebe os argumentos validados e deve retornar um objeto com:
content(obrigatório): um array de blocos de resultado, cada um com umtypede"text","image","audio","resource"ou"resource_link". Veja Retornar imagens e recursos para blocos não-texto.structuredContent(opcional): um objeto JSON contendo o resultado como dados legíveis por máquina, retornado junto comcontent. Veja Retornar dados estruturados.isError(opcional): defina comotruepara sinalizar uma falha de ferramenta para que Claude possa reagir a ela. Veja Tratar erros.
createSdkMcpServer (TypeScript) ou create_sdk_mcp_server (Python). O servidor executa em processo dentro de sua aplicação, não como um processo separado.
Exemplo de ferramenta de clima
Este exemplo define uma ferramentaget_temperature e a envolve em um servidor MCP. Ele apenas configura a ferramenta; para passá-la para query e executá-la, veja Chamar uma ferramenta personalizada abaixo.
tool() ou a referência Python @tool para detalhes completos de parâmetros, incluindo formatos de entrada JSON Schema e estrutura de valor de retorno.
Chamar uma ferramenta personalizada
Passe o servidor MCP que você criou paraquery via a opção mcpServers. A chave em mcpServers torna-se o segmento {server_name} no nome totalmente qualificado de cada ferramenta: mcp__{server_name}__{tool_name}. Liste esse nome em allowedTools para que a ferramenta execute sem um prompt de permissão.
Estes trechos reutilizam o weatherServer do exemplo acima para perguntar a Claude qual é o clima em um local específico.
Adicionar mais ferramentas
Um servidor contém quantas ferramentas você listar em seu arraytools. Com mais de uma ferramenta em um servidor, você pode listar cada uma em allowedTools individualmente ou usar o curinga mcp__weather__* para cobrir cada ferramenta que o servidor expõe.
O exemplo abaixo adiciona uma segunda ferramenta, get_precipitation_chance, ao weatherServer do exemplo de ferramenta de clima e o reconstrói com ambas as ferramentas no array.
Adicionar anotações de ferramentas
Anotações de ferramentas são metadados opcionais descrevendo como uma ferramenta se comporta. Passe-as como o quinto argumento para o auxiliartool() em TypeScript ou via o argumento de palavra-chave annotations para o decorador @tool em Python. Todos os campos de dica são Booleanos.
Anotações são metadados, não imposição. Uma ferramenta marcada com
readOnlyHint: true ainda pode escrever em disco se é isso que o manipulador faz. Mantenha a anotação precisa em relação ao manipulador.
Este exemplo adiciona readOnlyHint à ferramenta get_temperature do exemplo de ferramenta de clima.
ToolAnnotations na referência TypeScript ou Python.
Controlar acesso a ferramentas
O exemplo de ferramenta de clima registrou um servidor e listou ferramentas emallowedTools. Esta seção cobre como nomes de ferramentas são construídos e como escopar acesso quando você tem múltiplas ferramentas ou quer restringir integrados.
Formato de nome de ferramenta
Quando ferramentas MCP são expostas a Claude, seus nomes seguem um formato específico:- Padrão:
mcp__{server_name}__{tool_name} - Exemplo: Uma ferramenta nomeada
get_temperatureno servidorweathertorna-semcp__weather__get_temperature
Configurar ferramentas permitidas
A opçãotools e as listas de permitidas/não permitidas afetam duas camadas: disponibilidade, que controla se uma ferramenta aparece no contexto de Claude, e permissão, que controla se uma chamada é aprovada uma vez que Claude tenta. tools e entradas de disallowedTools com nome simples alteram a disponibilidade. allowedTools e regras de disallowedTools com escopo alteram apenas a permissão.
Para remover um integrado completamente, omita-o de
tools ou liste seu nome simples em disallowedTools (Python: disallowed_tools); ambos mantêm a ferramenta fora do contexto para que Claude nunca tente. Uma regra disallowedTools com escopo bloqueia chamadas correspondentes mas deixa a ferramenta visível, então Claude pode desperdiçar um turno tentando. Veja Configurar permissões para a ordem de avaliação completa.
Tratar erros
Um erro de manipulador não interrompe o loop do agente. O servidor MCP em processo do SDK captura exceções não capturadas e as retorna como resultados de erro, portanto como você relata um erro determina o que Claude lê, não se a consulta falha:
Em ambos os casos Claude pode tentar novamente, tentar uma ferramenta diferente ou explicar a falha. Capture erros você mesmo quando a mensagem de exceção bruta não for suficiente para Claude agir.
O exemplo abaixo captura dois tipos de falhas dentro do manipulador e compõe a mensagem de erro que Claude lê. Um status HTTP não-200 é capturado da resposta e retornado como um resultado de erro. Um erro de rede ou JSON inválido é capturado pelo
try/except (Python) ou try/catch (TypeScript) circundante e também retornado como um resultado de erro. Em ambos os casos Claude recebe uma mensagem que descreve a falha em vez de uma string de exceção bruta.
Retornar imagens e recursos
O arraycontent em um resultado de ferramenta aceita blocos text, image, audio, resource e resource_link. Você pode misturá-los na mesma resposta. Em TypeScript, blocos de áudio são salvos em disco e Claude recebe um bloco de texto com o caminho do arquivo salvo; em Python, o SDK remove blocos de áudio do resultado da ferramenta e registra um aviso. Blocos de link de recurso são convertidos em um bloco de texto contendo o nome do link, URI e descrição.
Imagens
Um bloco de imagem carrega os bytes da imagem inline, codificados como base64. Não há campo de URL. Para retornar uma imagem que vive em uma URL, busque-a no manipulador, leia os bytes da resposta e codifique-os em base64 antes de retornar. O resultado é processado como entrada visual.Recursos
Um bloco de recurso incorpora um pedaço de conteúdo identificado por uma URI. A URI é um rótulo para Claude referenciar; o conteúdo real fica no campotext ou blob do bloco. Use isto quando sua ferramenta produz algo que faz sentido endereçar por nome depois, como um arquivo gerado ou um registro de um sistema externo.
Este exemplo mostra um bloco de recurso retornado de dentro de um manipulador de ferramenta. A URI
file:///tmp/report.md é um rótulo que Claude pode referenciar depois; o SDK não lê desse caminho.
CallToolResult. Veja a especificação MCP para a definição completa.
Retornar dados estruturados
structuredContent é um objeto JSON opcional no resultado, separado do array content. Use-o para retornar valores brutos que Claude pode ler como campos exatos em vez de analisá-los de uma string de texto ou imagem.
Quando structuredContent é definido, Claude recebe o JSON mais quaisquer blocos de imagem ou recurso de content. Blocos de texto em content não são encaminhados, já que são assumidos duplicar os dados estruturados. O exemplo abaixo renderiza um gráfico como um bloco de imagem e retorna os pontos de dados por trás dele em structuredContent do mesmo manipulador.
TypeScript
O decorador Python
@tool encaminha apenas content e is_error do dict de retorno do manipulador. Para retornar structuredContent de Python, execute um servidor MCP autônomo em vez de um servidor SDK em processo.Exemplo: conversor de unidades
Esta ferramenta converte valores entre unidades de comprimento, temperatura e peso. Um usuário pode perguntar “converter 100 quilômetros para milhas” ou “qual é 72°F em Celsius,” e Claude escolhe o tipo de unidade certo e unidades da solicitação. Demonstra dois padrões:- Esquemas de enum:
unit_typeé restrito a um conjunto fixo de valores. Em TypeScript, usez.enum(). Em Python, o esquema dict não suporta enums, então o dict completo de JSON Schema é necessário. - Tratamento de entrada não suportada: quando um par de conversão não é encontrado, o manipulador retorna
isError: truepara que Claude possa dizer ao usuário o que deu errado em vez de tratar uma falha como um resultado normal.
query da mesma forma que o exemplo de clima. Este exemplo envia três prompts diferentes em um loop para mostrar a mesma ferramenta tratando diferentes tipos de unidades. Para cada resposta, ele inspeciona objetos AssistantMessage (que contêm as chamadas de ferramenta que Claude fez durante esse turno) e imprime cada ToolUseBlock antes de imprimir o texto final de ResultMessage. Isto permite que você veja quando Claude está usando a ferramenta versus respondendo de seu próprio conhecimento.
Próximos passos
Ferramentas personalizadas envolvem funções assíncronas em uma interface padrão. Você pode misturar os padrões nesta página no mesmo servidor: um único servidor pode conter uma ferramenta de banco de dados, uma ferramenta de gateway de API e um renderizador de imagem lado a lado. A partir daqui:- Se seu servidor crescer para dezenas de ferramentas, veja tool search para adiar o carregamento delas até Claude precisar delas.
- Para conectar a servidores MCP externos (sistema de arquivos, GitHub, Slack) em vez de construir os seus próprios, veja Conectar servidores MCP.
- Para controlar quais ferramentas executam automaticamente versus exigindo aprovação, veja Configurar permissões.