Loading...
    • Guia do Desenvolvedor
    • Referência da API
    • MCP
    • Recursos
    • Notas de Lançamento
    Search...
    ⌘K

    Primeiros passos

    introget-started

    Modelos e preços

    overviewchoosing-a-modelwhats-new-claude-4-5migrating-to-claude-4model-deprecationspricing

    Criar com Claude

    overviewworking-with-messagescontext-windowsclaude-4-best-practices

    Capacidades

    prompt-cachingcontext-editingextended-thinkingstreamingbatch-processingcitationsmultilingual-supporttoken-countingembeddingsvisionpdf-supportfilessearch-resultsclaude-for-sheets

    Ferramentas

    overviewimplement-tool-usetoken-efficient-tool-usefine-grained-tool-streamingbash-toolcode-execution-toolcomputer-use-tooltext-editor-toolweb-fetch-toolweb-search-toolmemory-tool

    Habilidades do Agente

    overviewquickstartbest-practicesskills-guide

    SDK do Agente

    overviewtypescriptpython

    Guias

    streaming-vs-single-modepermissionssessionshostingmodifying-system-promptsmcpcustom-toolssubagentsslash-commandsskillscost-trackingtodo-trackingplugins

    MCP na API

    mcp-connectorremote-mcp-servers

    Claude em plataformas de terceiros

    claude-on-amazon-bedrockclaude-on-vertex-ai

    Engenharia de prompts

    overviewprompt-generatorprompt-templates-and-variablesprompt-improverbe-clear-and-directmultishot-promptingchain-of-thoughtuse-xml-tagssystem-promptsprefill-claudes-responsechain-promptslong-context-tipsextended-thinking-tips

    Testar e avaliar

    define-successdevelop-testseval-toolreduce-latency

    Fortalecer proteções

    reduce-hallucinationsincrease-consistencymitigate-jailbreakshandle-streaming-refusalsreduce-prompt-leakkeep-claude-in-character

    Administração e monitoramento

    administration-apiusage-cost-apiclaude-code-analytics-api
    Console
    Guias

    Ferramentas Personalizadas

    Construa e integre ferramentas personalizadas para estender a funcionalidade do Claude Agent SDK

    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:

    TypeScript
    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`
              }]
            };
          }
        )
      ]
    });
    Python
    from claude_agent_sdk import tool, create_sdk_mcp_server, ClaudeSDKClient, ClaudeAgentOptions
    from typing import Any
    import aiohttp
    
    # Definir uma ferramenta personalizada usando o decorador @tool
    @tool("get_weather", "Obter temperatura atual para uma localização usando coordenadas", {"latitude": float, "longitude": float})
    async def get_weather(args: dict[str, Any]) -> dict[str, Any]:
        # Chamar API do clima
        async with aiohttp.ClientSession() as session:
            async with session.get(
                f"https://api.open-meteo.com/v1/forecast?latitude={args['latitude']}&longitude={args['longitude']}&current=temperature_2m&temperature_unit=fahrenheit"
            ) as response:
                data = await response.json()
    
        return {
            "content": [{
                "type": "text",
                "text": f"Temperatura: {data['current']['temperature_2m']}°F"
            }]
        }
    
    # Criar um servidor MCP SDK com a ferramenta personalizada
    custom_server = create_sdk_mcp_server(
        name="my-custom-tools",
        version="1.0.0",
        tools=[get_weather]  # Passar a função decorada
    )

    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:

    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);
      }
    }

    Exemplo de Múltiplas Ferramentas

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

    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
    }

    Segurança de Tipos com Python

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

    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}`
          }]
        };
      }
    )

    Tratamento de Erros

    Trate erros graciosamente para fornecer feedback significativo:

    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}`
            }]
          };
        }
      }
    )

    Ferramentas de Exemplo

    Ferramenta de Consulta de Banco de Dados

    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)}`
              }]
            };
          }
        )
      ]
    });

    Ferramenta de Gateway de API

    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)
              }]
            };
          }
        )
      ]
    });

    Ferramenta de Calculadora

    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)}%`
              }]
            };
          }
        )
      ]
    });

    Documentação Relacionada

    • Referência do SDK TypeScript
    • Referência do SDK Python
    • Documentação MCP
    • Visão Geral do 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
    © 2025 ANTHROPIC PBC

    Products

    • Claude
    • Claude Code
    • Max plan
    • Team plan
    • Enterprise plan
    • Download app
    • Pricing
    • Log in

    Features

    • Claude and Slack
    • Claude in Excel

    Models

    • Opus
    • Sonnet
    • Haiku

    Solutions

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

    Claude Developer Platform

    • Overview
    • Developer docs
    • Pricing
    • Amazon Bedrock
    • Google Cloud’s Vertex AI
    • Console login

    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

    Help and security

    • Availability
    • Status
    • Support center

    Terms and policies

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

    Products

    • Claude
    • Claude Code
    • Max plan
    • Team plan
    • Enterprise plan
    • Download app
    • Pricing
    • Log in

    Features

    • Claude and Slack
    • Claude in Excel

    Models

    • Opus
    • Sonnet
    • Haiku

    Solutions

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

    Claude Developer Platform

    • Overview
    • Developer docs
    • Pricing
    • Amazon Bedrock
    • Google Cloud’s Vertex AI
    • Console login

    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

    Help and security

    • Availability
    • Status
    • Support center

    Terms and policies

    • Privacy policy
    • Responsible disclosure policy
    • Terms of service: Commercial
    • Terms of service: Consumer
    • Usage policy
    © 2025 ANTHROPIC PBC