Loading...
    • Guía para desarrolladores
    • Referencia de API
    • MCP
    • Recursos
    • Notas de la versión
    Search...
    ⌘K
    Primeros pasos
    Introducción a ClaudeInicio rápido
    Modelos y precios
    Descripción general de modelosElegir un modeloNovedades en Claude 4.5Migración a Claude 4.5Deprecación de modelosPrecios
    Construir con Claude
    Descripción general de característicasUsar la API de MessagesVentanas de contextoMejores prácticas de prompting
    Capacidades
    Almacenamiento en caché de promptsEdición de contextoPensamiento extendidoEsfuerzoStreaming de MessagesProcesamiento por lotesCitasSoporte multilingüeConteo de tokensEmbeddingsVisiónSoporte de PDFAPI de FilesResultados de búsquedaSalidas estructuradas
    Herramientas
    Descripción generalCómo implementar el uso de herramientasStreaming de herramientas de grano finoHerramienta BashHerramienta de ejecución de códigoLlamada de herramientas programáticaHerramienta de uso de computadoraHerramienta de editor de textoHerramienta de búsqueda webHerramienta de búsqueda webHerramienta de memoriaHerramienta de búsqueda de herramientas
    Agent Skills
    Descripción generalInicio rápidoMejores prácticasUsar Skills con la API
    Agent SDK
    Descripción generalInicio rápidoSDK de TypeScriptTypeScript V2 (vista previa)SDK de PythonGuía de migración
    Entrada de streamingManejo de permisosControlar la ejecución con hooksGestión de sesionesPunto de control de archivosSalidas estructuradas en el SDKAlojamiento del Agent SDKDespliegue seguro de agentes de IAModificar prompts del sistemaMCP en el SDKHerramientas personalizadasSubagentes en el SDKComandos de barra en el SDKAgent Skills en el SDKSeguimiento de costos y usoListas de tareasPlugins en el SDK
    MCP en la API
    Conector MCPServidores MCP remotos
    Claude en plataformas de terceros
    Amazon BedrockMicrosoft FoundryVertex AI
    Ingeniería de prompts
    Descripción generalGenerador de promptsUsar plantillas de promptsMejorador de promptsSer claro y directoUsar ejemplos (prompting multishot)Dejar que Claude piense (CoT)Usar etiquetas XMLDar un rol a Claude (prompts del sistema)Rellenar la respuesta de ClaudeEncadenar prompts complejosConsejos de contexto largoConsejos de pensamiento extendido
    Probar y evaluar
    Definir criterios de éxitoDesarrollar casos de pruebaUsar la herramienta de evaluaciónReducir latencia
    Fortalecer protecciones
    Reducir alucinacionesAumentar consistencia de salidaMitigar ataques de jailbreakRechazos de streamingReducir fuga de promptsMantener a Claude en personaje
    Administración y monitoreo
    Descripción general de Admin APIAPI de uso y costoAPI de Claude Code Analytics
    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
    Guías

    Herramientas Personalizadas

    Construye e integra herramientas personalizadas para extender la funcionalidad del SDK de Claude Agent
    • Creando Herramientas Personalizadas
    • Usando Herramientas Personalizadas
    • Formato del Nombre de la Herramienta
    • Configurando Herramientas Permitidas
    • Ejemplo de Múltiples Herramientas
    • Seguridad de Tipos con Python
    • Manejo de Errores
    • Herramientas de Ejemplo
    • Herramienta de Consulta de Base de Datos
    • Herramienta de Gateway de API
    • Herramienta de Calculadora
    • Documentación Relacionada

    Las herramientas personalizadas te permiten extender las capacidades de Claude Code con tu propia funcionalidad a través de servidores MCP en proceso, permitiendo que Claude interactúe con servicios externos, APIs, o realice operaciones especializadas.

    Creando Herramientas Personalizadas

    Usa las funciones auxiliares createSdkMcpServer y tool para definir herramientas personalizadas con seguridad de tipos:

    import { query, tool, createSdkMcpServer } from "@anthropic-ai/claude-agent-sdk";
    import { z } from "zod";
    
    // Crear un servidor MCP del SDK con herramientas personalizadas
    const customServer = createSdkMcpServer({
      name: "my-custom-tools",
      version: "1.0.0",
      tools: [
        tool(
          "get_weather",
          "Obtener la temperatura actual de una ubicación usando coordenadas",
          {
            latitude: z.number().describe("Coordenada de latitud"),
            longitude: z.number().describe("Coordenada de longitud")
          },
          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 Herramientas Personalizadas

    Pasa el servidor personalizado a la función query a través de la opción mcpServers como un diccionario/objeto.

    Importante: Las herramientas MCP personalizadas requieren modo de entrada de streaming. Debes usar un generador asíncrono/iterable para el parámetro prompt - una cadena simple no funcionará con servidores MCP.

    Formato del Nombre de la Herramienta

    Cuando las herramientas MCP se exponen a Claude, sus nombres siguen un formato específico:

    • Patrón: mcp__{server_name}__{tool_name}
    • Ejemplo: Una herramienta llamada get_weather en el servidor my-custom-tools se convierte en mcp__my-custom-tools__get_weather

    Configurando Herramientas Permitidas

    Puedes controlar qué herramientas puede usar Claude a través de la opción allowedTools:

    Ejemplo de Múltiples Herramientas

    Cuando tu servidor MCP tiene múltiples herramientas, puedes permitirlas selectivamente:

    Seguridad de Tipos con Python

    El decorador @tool soporta varios enfoques de definición de esquemas para seguridad de tipos:

    Manejo de Errores

    Maneja errores de manera elegante para proporcionar retroalimentación significativa:

    Herramientas de Ejemplo

    Herramienta de Consulta de Base de Datos

    Herramienta de Gateway de API

    Herramienta de Calculadora

    Documentación Relacionada

    • Referencia del SDK de TypeScript
    • Referencia del SDK de Python
    • Documentación de MCP
    • Resumen del SDK
    import { query } from "@anthropic-ai/claude-agent-sdk";
    
    // Usar las herramientas personalizadas en tu consulta con entrada de streaming
    async function* generateMessages() {
      yield {
        type: "user" as const,
        message: {
          role: "user" as const,
          content: "¿Cuál es el clima en San Francisco?"
        }
      };
    }
    
    for await (const message of query({
      prompt: generateMessages(),  // Usar generador asíncrono para entrada de streaming
      options: {
        mcpServers: {
          "my-custom-tools": customServer  // Pasar como objeto/diccionario, no como array
        },
        // Opcionalmente especificar qué herramientas puede usar Claude
        allowedTools: [
          "mcp__my-custom-tools__get_weather",  // Permitir la herramienta del clima
          // Agregar otras herramientas según sea necesario
        ],
        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", "Traducir texto", { /* ... */ }, async (args) => { /* ... */ }),
        tool("search_web", "Buscar en la web", { /* ... */ }, async (args) => { /* ... */ })
      ]
    });
    
    // Permitir solo herramientas específicas con entrada de streaming
    async function* generateMessages() {
      yield {
        type: "user" as const,
        message: {
          role: "user" as const,
          content: "Calcula 5 + 3 y traduce 'hello' al español"
        }
      };
    }
    
    for await (const message of query({
      prompt: generateMessages(),  // Usar generador asíncrono para entrada de streaming
      options: {
        mcpServers: {
          utilities: multiToolServer
        },
        allowedTools: [
          "mcp__utilities__calculate",   // Permitir calculadora
          "mcp__utilities__translate",   // Permitir traductor
          // "mcp__utilities__search_web" NO está permitido
        ]
      }
    })) {
      // Procesar mensajes
    }
    import { z } from "zod";
    
    tool(
      "process_data",
      "Procesar datos estructurados con seguridad de tipos",
      {
        // El esquema Zod define tanto la validación en tiempo de ejecución como los tipos de 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 está completamente tipado basado en el esquema
        // TypeScript sabe: args.data.name es string, args.data.age es number, etc.
        console.log(`Procesando los datos de ${args.data.name} como ${args.format}`);
        
        // Tu lógica de procesamiento aquí
        return {
          content: [{
            type: "text",
            text: `Datos procesados para ${args.data.name}`
          }]
        };
      }
    )
    tool(
      "fetch_data",
      "Obtener datos de una API",
      {
        endpoint: z.string().url().describe("URL del endpoint de la API")
      },
      async (args) => {
        try {
          const response = await fetch(args.endpoint);
          
          if (!response.ok) {
            return {
              content: [{
                type: "text",
                text: `Error de 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: `Falló al obtener datos: ${error.message}`
            }]
          };
        }
      }
    )
    const databaseServer = createSdkMcpServer({
      name: "database-tools",
      version: "1.0.0",
      tools: [
        tool(
          "query_database",
          "Ejecutar una consulta de base de datos",
          {
            query: z.string().describe("Consulta SQL a ejecutar"),
            params: z.array(z.any()).optional().describe("Parámetros de la consulta")
          },
          async (args) => {
            const results = await db.query(args.query, args.params || []);
            return {
              content: [{
                type: "text",
                text: `Se encontraron ${results.length} filas:\n${JSON.stringify(results, null, 2)}`
              }]
            };
          }
        )
      ]
    });
    const apiGatewayServer = createSdkMcpServer({
      name: "api-gateway",
      version: "1.0.0",
      tools: [
        tool(
          "api_request",
          "Hacer solicitudes API autenticadas a servicios externos",
          {
            service: z.enum(["stripe", "github", "openai", "slack"]).describe("Servicio a llamar"),
            endpoint: z.string().describe("Ruta del endpoint de la API"),
            method: z.enum(["GET", "POST", "PUT", "DELETE"]).describe("Método HTTP"),
            body: z.record(z.any()).optional().describe("Cuerpo de la solicitud"),
            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("Expresión matemática a evaluar"),
            precision: z.number().optional().default(2).describe("Precisión decimal")
          },
          async (args) => {
            try {
              // Usar una librería de evaluación matemática segura en producción
              const result = eval(args.expression); // ¡Solo ejemplo!
              const formatted = Number(result).toFixed(args.precision);
              
              return {
                content: [{
                  type: "text",
                  text: `${args.expression} = ${formatted}`
                }]
              };
            } catch (error) {
              return {
                content: [{
                  type: "text",
                  text: `Error: Expresión inválida - ${error.message}`
                }]
              };
            }
          }
        ),
        tool(
          "compound_interest",
          "Calcular interés compuesto para una inversión",
          {
            principal: z.number().positive().describe("Monto de inversión inicial"),
            rate: z.number().describe("Tasa de interés anual (como decimal, ej. 0.05 para 5%)"),
            time: z.number().positive().describe("Período de inversión en años"),
            n: z.number().positive().default(12).describe("Frecuencia de capitalización por año")
          },
          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álisis de Inversión:\n` +
                      `Principal: $${args.principal.toFixed(2)}\n` +
                      `Tasa: ${(args.rate * 100).toFixed(2)}%\n` +
                      `Tiempo: ${args.time} años\n` +
                      `Capitalización: ${args.n} veces por año\n\n` +
                      `Monto Final: $${amount.toFixed(2)}\n` +
                      `Interés Ganado: $${interest.toFixed(2)}\n` +
                      `Retorno: ${((interest / args.principal) * 100).toFixed(2)}%`
              }]
            };
          }
        )
      ]
    });