Loading...
    • Guida per sviluppatori
    • Riferimento API
    • MCP
    • Risorse
    • Note sulla versione
    Search...
    ⌘K
    Primi passi
    Introduzione a ClaudeAvvio rapido
    Modelli e prezzi
    Panoramica dei modelliScelta di un modelloNovità in Claude 4.6Guida alla migrazioneDeprecazioni dei modelliPrezzi
    Crea con Claude
    Panoramica delle funzioniUtilizzo dell'API MessagesGestione dei motivi di arrestoBest practice per i prompt
    Capacità del modello
    Extended thinkingAdaptive thinkingEffortFast mode (anteprima di ricerca)Output strutturatiCitazioniStreaming dei messaggiElaborazione batchSupporto PDFRisultati di ricercaSupporto multilingueEmbeddingsVision
    Strumenti
    PanoramicaCome implementare l'uso degli strumentiStrumento di ricerca webStrumento di recupero webStrumento di esecuzione del codiceStrumento di memoriaStrumento BashStrumento Computer useStrumento editor di testo
    Infrastruttura degli strumenti
    Ricerca strumentiChiamata programmatica degli strumentiStreaming granulare degli strumenti
    Gestione del contesto
    Finestre di contestoCompattazioneModifica del contestoPrompt cachingConteggio dei token
    File e risorse
    API Files
    Agent Skills
    PanoramicaAvvio rapidoBest practiceSkills per l'aziendaUtilizzo di Skills con l'API
    Agent SDK
    PanoramicaAvvio rapidoTypeScript SDKTypeScript V2 (anteprima)Python SDKGuida alla migrazione
    Streaming InputStreaming delle risposte in tempo realeGestione dei motivi di arrestoGestione dei permessiApprovazioni utente e inputControllare l'esecuzione con hookGestione della sessioneCheckpoint dei fileOutput strutturati nell'SDKHosting dell'Agent SDKDistribuzione sicura degli agenti AIModifica dei prompt di sistemaMCP nell'SDKStrumenti personalizzatiSubagenti nell'SDKSlash Commands nell'SDKAgent Skills nell'SDKTracciamento dei costi e dell'utilizzoElenchi di attivitàPlugin nell'SDK
    MCP nell'API
    Connettore MCPServer MCP remoti
    Claude su piattaforme di terze parti
    Amazon BedrockMicrosoft FoundryVertex AI
    Prompt engineering
    PanoramicaGeneratore di promptUsa modelli di promptMiglioratore di promptSii chiaro e direttoUsa esempi (multishot prompting)Lascia che Claude pensi (CoT)Usa tag XMLDai a Claude un ruolo (prompt di sistema)Concatena prompt complessiSuggerimenti per il contesto lungoSuggerimenti per extended thinking
    Test e valutazione
    Definisci criteri di successoSviluppa casi di testUtilizzo dello strumento di valutazioneRiduzione della latenza
    Rafforza i guardrail
    Riduci le allucinazioniAumenta la coerenza dell'outputMitiga i jailbreakStreaming dei rifiutiRiduci la perdita di promptMantieni Claude nel personaggio
    Amministrazione e monitoraggio
    Panoramica dell'API AdminResidenza dei datiWorkspaceAPI di utilizzo e costiAPI Claude Code AnalyticsZero Data Retention
    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
    Guide

    Strumenti Personalizzati

    Costruisci e integra strumenti personalizzati per estendere le funzionalità di Claude Agent SDK

    Gli strumenti personalizzati ti permettono di estendere le capacità di Claude Code con le tue funzionalità attraverso server MCP in-process, consentendo a Claude di interagire con servizi esterni, API o eseguire operazioni specializzate.

    Creazione di Strumenti Personalizzati

    Usa le funzioni helper createSdkMcpServer e tool per definire strumenti personalizzati type-safe:

    import { query, tool, createSdkMcpServer } from "@anthropic-ai/claude-agent-sdk";
    import { z } from "zod";
    
    // Crea un server SDK MCP con strumenti personalizzati
    const customServer = createSdkMcpServer({
      name: "my-custom-tools",
      version: "1.0.0",
      tools: [
        tool(
          "get_weather",
          "Ottieni la temperatura attuale per una località usando le coordinate",
          {
            latitude: z.number().describe("Coordinata di latitudine"),
            longitude: z.number().describe("Coordinata di longitudine")
          },
          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`
              }]
            };
          }
        )
      ]
    });

    Utilizzo di Strumenti Personalizzati

    Passa il server personalizzato alla funzione query tramite l'opzione mcpServers come dizionario/oggetto.

    Importante: Gli strumenti MCP personalizzati richiedono la modalità di input streaming. Devi usare un generatore asincrono/iterabile per il parametro prompt - una semplice stringa non funzionerà con i server MCP.

    Formato del Nome dello Strumento

    Quando gli strumenti MCP vengono esposti a Claude, i loro nomi seguono un formato specifico:

    • Pattern: mcp__{server_name}__{tool_name}
    • Esempio: Uno strumento chiamato get_weather nel server my-custom-tools diventa mcp__my-custom-tools__get_weather

    Configurazione degli Strumenti Consentiti

    Puoi controllare quali strumenti Claude può usare tramite l'opzione allowedTools:

    import { query } from "@anthropic-ai/claude-agent-sdk";
    
    // Usa gli strumenti personalizzati nella tua query con input streaming
    async function* generateMessages() {
      yield {
        type: "user" as const,
        message: {
          role: "user" as const,
          content: "Che tempo fa a San Francisco?"
        }
      };
    }
    
    for await (const message of query({
      prompt: generateMessages(),  // Usa generatore asincrono per input streaming
      options: {
        mcpServers: {
          "my-custom-tools": customServer  // Passa come oggetto/dizionario, non array
        },
        // Opzionalmente specifica quali strumenti Claude può usare
        allowedTools: [
          "mcp__my-custom-tools__get_weather",  // Consenti lo strumento meteo
          // Aggiungi altri strumenti se necessario
        ],
        maxTurns: 3
      }
    })) {
      if (message.type === "result" && message.subtype === "success") {
        console.log(message.result);
      }
    }

    Esempio con Strumenti Multipli

    Quando il tuo server MCP ha strumenti multipli, puoi consentirli selettivamente:

    const multiToolServer = createSdkMcpServer({
      name: "utilities",
      version: "1.0.0",
      tools: [
        tool("calculate", "Esegui calcoli", { /* ... */ }, async (args) => { /* ... */ }),
        tool("translate", "Traduci testo", { /* ... */ }, async (args) => { /* ... */ }),
        tool("search_web", "Cerca nel web", { /* ... */ }, async (args) => { /* ... */ })
      ]
    });
    
    // Consenti solo strumenti specifici con input streaming
    async function* generateMessages() {
      yield {
        type: "user" as const,
        message: {
          role: "user" as const,
          content: "Calcola 5 + 3 e traduci 'ciao' in spagnolo"
        }
      };
    }
    
    for await (const message of query({
      prompt: generateMessages(),  // Usa generatore asincrono per input streaming
      options: {
        mcpServers: {
          utilities: multiToolServer
        },
        allowedTools: [
          "mcp__utilities__calculate",   // Consenti calcolatrice
          "mcp__utilities__translate",   // Consenti traduttore
          // "mcp__utilities__search_web" NON è consentito
        ]
      }
    })) {
      // Elabora messaggi
    }

    Type Safety con Python

    Il decoratore @tool supporta vari approcci di definizione dello schema per la type safety:

    import { z } from "zod";
    
    tool(
      "process_data",
      "Elabora dati strutturati con type safety",
      {
        // Lo schema Zod definisce sia la validazione runtime che i tipi 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 è completamente tipizzato basato sullo schema
        // TypeScript sa: args.data.name è string, args.data.age è number, ecc.
        console.log(`Elaborando i dati di ${args.data.name} come ${args.format}`);
        
        // La tua logica di elaborazione qui
        return {
          content: [{
            type: "text",
            text: `Dati elaborati per ${args.data.name}`
          }]
        };
      }
    )

    Gestione degli Errori

    Gestisci gli errori con grazia per fornire feedback significativo:

    tool(
      "fetch_data",
      "Recupera dati da un'API",
      {
        endpoint: z.string().url().describe("URL endpoint API")
      },
      async (args) => {
        try {
          const response = await fetch(args.endpoint);
          
          if (!response.ok) {
            return {
              content: [{
                type: "text",
                text: `Errore 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: `Impossibile recuperare dati: ${error.message}`
            }]
          };
        }
      }
    )

    Strumenti di Esempio

    Strumento di Query Database

    const databaseServer = createSdkMcpServer({
      name: "database-tools",
      version: "1.0.0",
      tools: [
        tool(
          "query_database",
          "Esegui una query database",
          {
            query: z.string().describe("Query SQL da eseguire"),
            params: z.array(z.any()).optional().describe("Parametri query")
          },
          async (args) => {
            const results = await db.query(args.query, args.params || []);
            return {
              content: [{
                type: "text",
                text: `Trovate ${results.length} righe:\n${JSON.stringify(results, null, 2)}`
              }]
            };
          }
        )
      ]
    });

    Strumento API Gateway

    const apiGatewayServer = createSdkMcpServer({
      name: "api-gateway",
      version: "1.0.0",
      tools: [
        tool(
          "api_request",
          "Effettua richieste API autenticate a servizi esterni",
          {
            service: z.enum(["stripe", "github", "openai", "slack"]).describe("Servizio da chiamare"),
            endpoint: z.string().describe("Percorso endpoint API"),
            method: z.enum(["GET", "POST", "PUT", "DELETE"]).describe("Metodo HTTP"),
            body: z.record(z.any()).optional().describe("Corpo della richiesta"),
            query: z.record(z.string()).optional().describe("Parametri query")
          },
          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)
              }]
            };
          }
        )
      ]
    });

    Strumento Calcolatrice

    const calculatorServer = createSdkMcpServer({
      name: "calculator",
      version: "1.0.0",
      tools: [
        tool(
          "calculate",
          "Esegui calcoli matematici",
          {
            expression: z.string().describe("Espressione matematica da valutare"),
            precision: z.number().optional().default(2).describe("Precisione decimale")
          },
          async (args) => {
            try {
              // Usa una libreria di valutazione matematica sicura in produzione
              const result = eval(args.expression); // Solo esempio!
              const formatted = Number(result).toFixed(args.precision);
              
              return {
                content: [{
                  type: "text",
                  text: `${args.expression} = ${formatted}`
                }]
              };
            } catch (error) {
              return {
                content: [{
                  type: "text",
                  text: `Errore: Espressione non valida - ${error.message}`
                }]
              };
            }
          }
        ),
        tool(
          "compound_interest",
          "Calcola l'interesse composto per un investimento",
          {
            principal: z.number().positive().describe("Importo investimento iniziale"),
            rate: z.number().describe("Tasso di interesse annuale (come decimale, es. 0.05 per 5%)"),
            time: z.number().positive().describe("Periodo di investimento in anni"),
            n: z.number().positive().default(12).describe("Frequenza di capitalizzazione per anno")
          },
          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: `Analisi Investimento:\n` +
                      `Capitale: $${args.principal.toFixed(2)}\n` +
                      `Tasso: ${(args.rate * 100).toFixed(2)}%\n` +
                      `Tempo: ${args.time} anni\n` +
                      `Capitalizzazione: ${args.n} volte per anno\n\n` +
                      `Importo Finale: $${amount.toFixed(2)}\n` +
                      `Interesse Guadagnato: $${interest.toFixed(2)}\n` +
                      `Rendimento: ${((interest / args.principal) * 100).toFixed(2)}%`
              }]
            };
          }
        )
      ]
    });

    Documentazione Correlata

    • Riferimento SDK TypeScript
    • Riferimento SDK Python
    • Documentazione MCP
    • Panoramica SDK

    Was this page helpful?

    • Creazione di Strumenti Personalizzati
    • Utilizzo di Strumenti Personalizzati
    • Formato del Nome dello Strumento
    • Configurazione degli Strumenti Consentiti
    • Esempio con Strumenti Multipli
    • Type Safety con Python
    • Gestione degli Errori
    • Strumenti di Esempio
    • Strumento di Query Database
    • Strumento API Gateway
    • Strumento Calcolatrice
    • Documentazione Correlata