Loading...
    • Guia do Desenvolvedor
    • Referência da API
    • MCP
    • Recursos
    • Notas de lançamento
    Search...
    ⌘K
    Primeiros passos
    Introdução ao ClaudeInício rápido
    Modelos e preços
    Visão geral dos modelosEscolhendo um modeloNovidades no Claude 4.5Migrando para Claude 4.5Descontinuação de modelosPreços
    Construir com Claude
    Visão geral de recursosUsando a API MessagesJanelas de contextoMelhores práticas de prompting
    Capacidades
    Cache de promptEdição de contextoPensamento estendidoEsforçoStreaming de mensagensProcessamento em loteCitaçõesSuporte multilíngueContagem de tokensEmbeddingsVisãoSuporte a PDFAPI de arquivosResultados de buscaSaídas estruturadas
    Ferramentas
    Visão geralComo implementar o uso de ferramentasStreaming de ferramentas granularFerramenta BashFerramenta de execução de códigoChamada de ferramenta programáticaFerramenta de uso do computadorFerramenta de editor de textoFerramenta de busca na webFerramenta de pesquisa na webFerramenta de memóriaFerramenta de busca de ferramentas
    Habilidades do agente
    Visão geralInício rápidoMelhores práticasUsando habilidades com a API
    SDK do agente
    Visão geralInício rápidoSDK TypeScriptTypeScript V2 (preview)SDK PythonGuia de migração
    Entrada de streamingTratamento de permissõesControlar execução com hooksGerenciamento de sessãoPonto de verificação de arquivoSaídas estruturadas no SDKHospedando o SDK do agenteImplantação segura de agentes de IAModificando prompts do sistemaMCP no SDKFerramentas personalizadasSubagentos no SDKComandos de barra no SDKHabilidades do agente no SDKRastreando custos e usoListas de tarefasPlugins no SDK
    MCP na API
    Conector MCPServidores MCP remotos
    Claude em plataformas de terceiros
    Amazon BedrockMicrosoft FoundryVertex AI
    Engenharia de prompts
    Visão geralGerador de promptsUsar modelos de promptsMelhorador de promptsSeja claro e diretoUse exemplos (prompting multishot)Deixe Claude pensar (CoT)Use tags XMLDê um papel ao Claude (prompts do sistema)Preencha a resposta do ClaudeEncadeie prompts complexosDicas de contexto longoDicas de pensamento estendido
    Testar e avaliar
    Definir critérios de sucessoDesenvolver casos de testeUsando a ferramenta de avaliaçãoReduzindo latência
    Fortalecer proteções
    Reduzir alucinaçõesAumentar consistência de saídaMitigar jailbreaksRecusas de streamingReduzir vazamento de promptManter Claude em personagem
    Administração e monitoramento
    Visão geral da API de administraçãoAPI de uso e custoAPI de análise de código Claude
    Console
    Log in
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...

    Solutions

    • AI agents
    • Code modernization
    • Coding
    • Customer support
    • Education
    • Financial services
    • Government
    • Life sciences

    Partners

    • Amazon Bedrock
    • Google Cloud's Vertex AI

    Learn

    • Blog
    • Catalog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Company

    • Anthropic
    • Careers
    • Economic Futures
    • Research
    • News
    • Responsible Scaling Policy
    • Security and compliance
    • Transparency

    Learn

    • Blog
    • Catalog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Help and security

    • Availability
    • Status
    • Support
    • Discord

    Terms and policies

    • Privacy policy
    • Responsible disclosure policy
    • Terms of service: Commercial
    • Terms of service: Consumer
    • Usage policy
    Guias

    Ferramentas Personalizadas

    Construa e integre ferramentas personalizadas para estender a funcionalidade do Claude Agent SDK
    • Criando Ferramentas Personalizadas
    • Usando Ferramentas Personalizadas
    • Formato do Nome da Ferramenta
    • Configurando Ferramentas Permitidas
    • Exemplo de Múltiplas Ferramentas
    • Segurança de Tipos com Python
    • Tratamento de Erros
    • Ferramentas de Exemplo
    • Ferramenta de Consulta de Banco de Dados
    • Ferramenta de Gateway de API
    • Ferramenta de Calculadora
    • Documentação Relacionada

    As ferramentas personalizadas permitem que você estenda as capacidades do Claude Code com sua própria funcionalidade através de servidores MCP em processo, permitindo que o Claude interaja com serviços externos, APIs ou execute operações especializadas.

    Criando Ferramentas Personalizadas

    Use as funções auxiliares createSdkMcpServer e tool para definir ferramentas personalizadas com segurança de tipos:

    import { query, tool, createSdkMcpServer } from "@anthropic-ai/claude-agent-sdk";
    import { z } from "zod";
    
    // Criar um servidor MCP SDK com ferramentas personalizadas
    const customServer = createSdkMcpServer({
      name: "my-custom-tools",
      version: "1.0.0",
      tools: [
        tool(
          "get_weather",
          "Obter temperatura atual para uma localização usando coordenadas",
          {
            latitude: z.number().describe("Coordenada de latitude"),
            longitude: z.number().describe("Coordenada de longitude")
          },
          async (args) => {
            const response = await fetch(`https://api.open-meteo.com/v1/forecast?latitude=${args.latitude}&longitude=${args.longitude}&current=temperature_2m&temperature_unit=fahrenheit`);
            const data = await response.json();
    
            return {
              content: [{
                type: "text",
                text: `Temperatura: ${data.current.temperature_2m}°F`
              }]
            };
          }
        )
      ]
    });

    Usando Ferramentas Personalizadas

    Passe o servidor personalizado para a função query através da opção mcpServers como um dicionário/objeto.

    Importante: Ferramentas MCP personalizadas requerem modo de entrada de streaming. Você deve usar um gerador assíncrono/iterável para o parâmetro prompt - uma string simples não funcionará com servidores MCP.

    Formato do Nome da Ferramenta

    Quando as ferramentas MCP são expostas ao Claude, seus nomes seguem um formato específico:

    • Padrão: mcp__{nome_do_servidor}__{nome_da_ferramenta}
    • Exemplo: Uma ferramenta chamada get_weather no servidor my-custom-tools torna-se mcp__my-custom-tools__get_weather

    Configurando Ferramentas Permitidas

    Você pode controlar quais ferramentas o Claude pode usar através da opção allowedTools:

    Exemplo de Múltiplas Ferramentas

    Quando seu servidor MCP tem múltiplas ferramentas, você pode permitir seletivamente:

    Segurança de Tipos com Python

    O decorador @tool suporta várias abordagens de definição de esquema para segurança de tipos:

    Tratamento de Erros

    Trate erros graciosamente para fornecer feedback significativo:

    Ferramentas de Exemplo

    Ferramenta de Consulta de Banco de Dados

    Ferramenta de Gateway de API

    Ferramenta de Calculadora

    Documentação Relacionada

    • Referência do SDK TypeScript
    • Referência do SDK Python
    • Documentação MCP
    • Visão Geral do SDK
    import { query } from "@anthropic-ai/claude-agent-sdk";
    
    // Usar as ferramentas personalizadas em sua consulta com entrada de streaming
    async function* generateMessages() {
      yield {
        type: "user" as const,
        message: {
          role: "user" as const,
          content: "Qual é o clima em São Francisco?"
        }
      };
    }
    
    for await (const message of query({
      prompt: generateMessages(),  // Usar gerador assíncrono para entrada de streaming
      options: {
        mcpServers: {
          "my-custom-tools": customServer  // Passar como objeto/dicionário, não array
        },
        // Opcionalmente especificar quais ferramentas o Claude pode usar
        allowedTools: [
          "mcp__my-custom-tools__get_weather",  // Permitir a ferramenta do clima
          // Adicionar outras ferramentas conforme necessário
        ],
        maxTurns: 3
      }
    })) {
      if (message.type === "result" && message.subtype === "success") {
        console.log(message.result);
      }
    }
    const multiToolServer = createSdkMcpServer({
      name: "utilities",
      version: "1.0.0",
      tools: [
        tool("calculate", "Realizar cálculos", { /* ... */ }, async (args) => { /* ... */ }),
        tool("translate", "Traduzir texto", { /* ... */ }, async (args) => { /* ... */ }),
        tool("search_web", "Pesquisar na web", { /* ... */ }, async (args) => { /* ... */ })
      ]
    });
    
    // Permitir apenas ferramentas específicas com entrada de streaming
    async function* generateMessages() {
      yield {
        type: "user" as const,
        message: {
          role: "user" as const,
          content: "Calcule 5 + 3 e traduza 'olá' para espanhol"
        }
      };
    }
    
    for await (const message of query({
      prompt: generateMessages(),  // Usar gerador assíncrono para entrada de streaming
      options: {
        mcpServers: {
          utilities: multiToolServer
        },
        allowedTools: [
          "mcp__utilities__calculate",   // Permitir calculadora
          "mcp__utilities__translate",   // Permitir tradutor
          // "mcp__utilities__search_web" NÃO é permitido
        ]
      }
    })) {
      // Processar mensagens
    }
    import { z } from "zod";
    
    tool(
      "process_data",
      "Processar dados estruturados com segurança de tipos",
      {
        // Esquema Zod define tanto validação em tempo de execução quanto tipos TypeScript
        data: z.object({
          name: z.string(),
          age: z.number().min(0).max(150),
          email: z.string().email(),
          preferences: z.array(z.string()).optional()
        }),
        format: z.enum(["json", "csv", "xml"]).default("json")
      },
      async (args) => {
        // args é totalmente tipado baseado no esquema
        // TypeScript sabe: args.data.name é string, args.data.age é number, etc.
        console.log(`Processando dados de ${args.data.name} como ${args.format}`);
        
        // Sua lógica de processamento aqui
        return {
          content: [{
            type: "text",
            text: `Dados processados para ${args.data.name}`
          }]
        };
      }
    )
    tool(
      "fetch_data",
      "Buscar dados de uma API",
      {
        endpoint: z.string().url().describe("URL do endpoint da API")
      },
      async (args) => {
        try {
          const response = await fetch(args.endpoint);
          
          if (!response.ok) {
            return {
              content: [{
                type: "text",
                text: `Erro da API: ${response.status} ${response.statusText}`
              }]
            };
          }
          
          const data = await response.json();
          return {
            content: [{
              type: "text",
              text: JSON.stringify(data, null, 2)
            }]
          };
        } catch (error) {
          return {
            content: [{
              type: "text",
              text: `Falha ao buscar dados: ${error.message}`
            }]
          };
        }
      }
    )
    const databaseServer = createSdkMcpServer({
      name: "database-tools",
      version: "1.0.0",
      tools: [
        tool(
          "query_database",
          "Executar uma consulta de banco de dados",
          {
            query: z.string().describe("Consulta SQL para executar"),
            params: z.array(z.any()).optional().describe("Parâmetros da consulta")
          },
          async (args) => {
            const results = await db.query(args.query, args.params || []);
            return {
              content: [{
                type: "text",
                text: `Encontradas ${results.length} linhas:\n${JSON.stringify(results, null, 2)}`
              }]
            };
          }
        )
      ]
    });
    const apiGatewayServer = createSdkMcpServer({
      name: "api-gateway",
      version: "1.0.0",
      tools: [
        tool(
          "api_request",
          "Fazer requisições de API autenticadas para serviços externos",
          {
            service: z.enum(["stripe", "github", "openai", "slack"]).describe("Serviço para chamar"),
            endpoint: z.string().describe("Caminho do endpoint da API"),
            method: z.enum(["GET", "POST", "PUT", "DELETE"]).describe("Método HTTP"),
            body: z.record(z.any()).optional().describe("Corpo da requisição"),
            query: z.record(z.string()).optional().describe("Parâmetros de consulta")
          },
          async (args) => {
            const config = {
              stripe: { baseUrl: "https://api.stripe.com/v1", key: process.env.STRIPE_KEY },
              github: { baseUrl: "https://api.github.com", key: process.env.GITHUB_TOKEN },
              openai: { baseUrl: "https://api.openai.com/v1", key: process.env.OPENAI_KEY },
              slack: { baseUrl: "https://slack.com/api", key: process.env.SLACK_TOKEN }
            };
            
            const { baseUrl, key } = config[args.service];
            const url = new URL(`${baseUrl}${args.endpoint}`);
            
            if (args.query) {
              Object.entries(args.query).forEach(([k, v]) => url.searchParams.set(k, v));
            }
            
            const response = await fetch(url, {
              method: args.method,
              headers: { Authorization: `Bearer ${key}`, "Content-Type": "application/json" },
              body: args.body ? JSON.stringify(args.body) : undefined
            });
            
            const data = await response.json();
            return {
              content: [{
                type: "text",
                text: JSON.stringify(data, null, 2)
              }]
            };
          }
        )
      ]
    });
    const calculatorServer = createSdkMcpServer({
      name: "calculator",
      version: "1.0.0",
      tools: [
        tool(
          "calculate",
          "Realizar cálculos matemáticos",
          {
            expression: z.string().describe("Expressão matemática para avaliar"),
            precision: z.number().optional().default(2).describe("Precisão decimal")
          },
          async (args) => {
            try {
              // Use uma biblioteca de avaliação matemática segura em produção
              const result = eval(args.expression); // Apenas exemplo!
              const formatted = Number(result).toFixed(args.precision);
              
              return {
                content: [{
                  type: "text",
                  text: `${args.expression} = ${formatted}`
                }]
              };
            } catch (error) {
              return {
                content: [{
                  type: "text",
                  text: `Erro: Expressão inválida - ${error.message}`
                }]
              };
            }
          }
        ),
        tool(
          "compound_interest",
          "Calcular juros compostos para um investimento",
          {
            principal: z.number().positive().describe("Valor do investimento inicial"),
            rate: z.number().describe("Taxa de juros anual (como decimal, ex: 0.05 para 5%)"),
            time: z.number().positive().describe("Período de investimento em anos"),
            n: z.number().positive().default(12).describe("Frequência de capitalização por ano")
          },
          async (args) => {
            const amount = args.principal * Math.pow(1 + args.rate / args.n, args.n * args.time);
            const interest = amount - args.principal;
            
            return {
              content: [{
                type: "text",
                text: `Análise de Investimento:\n` +
                      `Principal: R$${args.principal.toFixed(2)}\n` +
                      `Taxa: ${(args.rate * 100).toFixed(2)}%\n` +
                      `Tempo: ${args.time} anos\n` +
                      `Capitalização: ${args.n} vezes por ano\n\n` +
                      `Valor Final: R$${amount.toFixed(2)}\n` +
                      `Juros Ganhos: R$${interest.toFixed(2)}\n` +
                      `Retorno: ${((interest / args.principal) * 100).toFixed(2)}%`
              }]
            };
          }
        )
      ]
    });