query e controllare a quali strumenti Claude può accedere. Copre anche la gestione degli errori, le annotazioni degli strumenti e la restituzione di contenuti non testuali come immagini.
Riferimento rapido
| Se vuoi… | Fai questo |
|---|---|
| Definire uno strumento | Usa @tool (Python) o tool() (TypeScript) con un nome, una descrizione, uno schema e un handler. Vedi Creare uno strumento personalizzato. |
| Registrare uno strumento con Claude | Avvolgi in create_sdk_mcp_server / createSdkMcpServer e passa a mcpServers in query(). Vedi Chiamare uno strumento personalizzato. |
| Pre-approvare uno strumento | Aggiungi ai tuoi strumenti consentiti. Vedi Configurare gli strumenti consentiti. |
| Rimuovere uno strumento integrato dal contesto di Claude | Passa un array tools elencando solo gli strumenti integrati che desideri. Vedi Configurare gli strumenti consentiti. |
| Permettere a Claude di chiamare strumenti in parallelo | Imposta readOnlyHint: true su strumenti senza effetti collaterali. Vedi Aggiungere annotazioni degli strumenti. |
| Gestire gli errori senza interrompere il ciclo | Restituisci isError: true invece di lanciare un’eccezione. Vedi Gestire gli errori. |
| Restituire immagini o file | Usa blocchi image o resource nell’array di contenuti. Vedi Restituire immagini e risorse. |
| Restituire un risultato JSON leggibile da macchina | Imposta structuredContent sul risultato. Vedi Restituire dati strutturati. |
| Scalare a molti strumenti | Usa tool search per caricare gli strumenti su richiesta. |
Creare uno strumento personalizzato
Uno strumento è definito da quattro parti, passate come argomenti al helpertool() in TypeScript o al decoratore @tool in Python:
- Nome: un identificatore univoco che Claude usa per chiamare lo strumento.
- Descrizione: cosa fa lo strumento. Claude legge questo per decidere quando chiamarlo.
- Schema di input: gli argomenti che Claude deve fornire. In TypeScript questo è sempre uno schema Zod, e gli
argsdell’handler sono tipizzati automaticamente da esso. In Python questo è un dict che mappa nomi a tipi, come{"latitude": float}, che l’SDK converte in JSON Schema per te. Il decoratore Python accetta anche un dict completo di JSON Schema direttamente quando hai bisogno di enum, intervalli, campi opzionali o oggetti annidati. - Handler: la funzione asincrona che viene eseguita quando Claude chiama lo strumento. Riceve gli argomenti convalidati e deve restituire un oggetto con:
content(obbligatorio): un array di blocchi di risultato, ognuno con untypedi"text","image"o"resource". Vedi Restituire immagini e risorse per blocchi non testuali.structuredContent(opzionale): un oggetto JSON che contiene il risultato come dati leggibili da macchina, restituito insieme acontent. Vedi Restituire dati strutturati.isError(opzionale): imposta sutrueper segnalare un fallimento dello strumento in modo che Claude possa reagire. Vedi Gestire gli errori.
createSdkMcpServer (TypeScript) o create_sdk_mcp_server (Python). Il server viene eseguito in-process all’interno della tua applicazione, non come processo separato.
Esempio di strumento meteo
Questo esempio definisce uno strumentoget_temperature e lo avvolge in un server MCP. Configura solo lo strumento; per passarlo a query e eseguirlo, vedi Chiamare uno strumento personalizzato di seguito.
tool() o il riferimento Python @tool per i dettagli completi dei parametri, inclusi i formati di input JSON Schema e la struttura del valore di ritorno.
Chiamare uno strumento personalizzato
Passa il server MCP che hai creato aquery tramite l’opzione mcpServers. La chiave in mcpServers diventa il segmento {server_name} nel nome completamente qualificato di ogni strumento: mcp__{server_name}__{tool_name}. Elenca quel nome in allowedTools in modo che lo strumento venga eseguito senza un prompt di autorizzazione.
Questi snippet riutilizzano il weatherServer dall’esempio precedente per chiedere a Claude qual è il meteo in una posizione specifica.
Aggiungere più strumenti
Un server contiene quanti strumenti elenchi nel suo arraytools. Con più di uno strumento su un server, puoi elencare ognuno in allowedTools individualmente o usare il wildcard mcp__weather__* per coprire ogni strumento che il server espone.
L’esempio di seguito aggiunge un secondo strumento, get_precipitation_chance, al weatherServer dall’esempio di strumento meteo e lo ricostruisce con entrambi gli strumenti nell’array.
Aggiungere annotazioni degli strumenti
Le annotazioni degli strumenti sono metadati opzionali che descrivono come si comporta uno strumento. Passali come quinto argomento al helpertool() in TypeScript o tramite l’argomento della parola chiave annotations per il decoratore @tool in Python. Tutti i campi hint sono booleani.
| Campo | Predefinito | Significato |
|---|---|---|
readOnlyHint | false | Lo strumento non modifica il suo ambiente. Controlla se lo strumento può essere chiamato in parallelo con altri strumenti di sola lettura. |
destructiveHint | true | Lo strumento può eseguire aggiornamenti distruttivi. Solo informativo. |
idempotentHint | false | Le chiamate ripetute con gli stessi argomenti non hanno effetti aggiuntivi. Solo informativo. |
openWorldHint | true | Lo strumento raggiunge sistemi al di fuori del tuo processo. Solo informativo. |
readOnlyHint: true può comunque scrivere su disco se è quello che fa l’handler. Mantieni l’annotazione accurata rispetto all’handler.
Questo esempio aggiunge readOnlyHint allo strumento get_temperature dall’esempio di strumento meteo.
ToolAnnotations nel riferimento TypeScript o Python.
Controllare l’accesso agli strumenti
L’esempio di strumento meteo ha registrato un server e elencato gli strumenti inallowedTools. Questa sezione copre come vengono costruiti i nomi degli strumenti e come limitare l’accesso quando hai più strumenti o vuoi limitare gli strumenti integrati.
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 denominato
get_temperaturenel serverweatherdiventamcp__weather__get_temperature
Configurare gli strumenti consentiti
L’opzionetools e gli elenchi consentiti/non consentiti influiscono su due livelli: la disponibilità, che controlla se uno strumento appare nel contesto di Claude, e l’autorizzazione, che controlla se una chiamata viene approvata una volta che Claude tenta di farla. tools e le voci disallowedTools con nome semplice cambiano la disponibilità. allowedTools e le regole disallowedTools con ambito cambiano solo l’autorizzazione.
| Opzione | Livello | Effetto |
|---|---|---|
tools: ["Read", "Grep"] | Disponibilità | Solo gli strumenti integrati elencati sono nel contesto di Claude. Gli strumenti integrati non elencati vengono rimossi. Gli strumenti MCP non sono interessati. |
tools: [] | Disponibilità | Tutti gli strumenti integrati vengono rimossi. Claude può usare solo i tuoi strumenti MCP. |
| strumenti consentiti | Autorizzazione | Gli strumenti elencati vengono eseguiti senza un prompt di autorizzazione. Gli strumenti non elencati rimangono disponibili; le chiamate passano attraverso il flusso di autorizzazione. |
| strumenti non consentiti | Entrambi | Un nome di strumento semplice come "Bash" rimuove lo strumento dal contesto di Claude, come se lo omettessi da tools. Una regola con ambito come "Bash(rm *)" lascia lo strumento nel contesto e nega solo le chiamate corrispondenti. |
tools o elencane il nome semplice in disallowedTools (Python: disallowed_tools); entrambi mantengono lo strumento fuori dal contesto in modo che Claude non lo tenti mai. Una regola disallowedTools con ambito blocca le chiamate corrispondenti ma lascia lo strumento visibile, quindi Claude potrebbe sprecare un turno tentandolo. Vedi Configurare le autorizzazioni per l’ordine di valutazione completo.
Gestire gli errori
Come il tuo handler segnala gli errori determina se il ciclo dell’agente continua o si ferma:| Cosa succede | Risultato |
|---|---|
| L’handler lancia un’eccezione non catturata | Il ciclo dell’agente si ferma. Claude non vede mai l’errore e la chiamata query fallisce. |
L’handler cattura l’errore e restituisce isError: true (TS) / "is_error": True (Python) | Il ciclo dell’agente continua. Claude vede l’errore come dati e può riprovare, provare uno strumento diverso o spiegare il fallimento. |
try/except (Python) o try/catch (TypeScript) circostante e viene anche restituito come risultato di errore. In entrambi i casi l’handler restituisce normalmente e il ciclo dell’agente continua.
Restituire immagini e risorse
L’arraycontent in un risultato dello strumento accetta blocchi text, image e resource. Puoi mischiarli nella stessa risposta.
Immagini
Un blocco immagine trasporta i byte dell’immagine inline, codificati come base64. Non c’è campo URL. Per restituire un’immagine che si trova in un URL, recuperala nell’handler, leggi i byte della risposta e codificali in base64 prima di restituire. Il risultato viene elaborato come input visivo.| Campo | Tipo | Note |
|---|---|---|
type | "image" | |
data | string | Byte codificati in base64. Solo base64 grezzo, nessun prefisso data:image/...;base64, |
mimeType | string | Obbligatorio. Ad esempio image/png, image/jpeg, image/webp, image/gif |
Risorse
Un blocco risorsa incorpora un pezzo di contenuto identificato da un URI. L’URI è un’etichetta per Claude da riferire; il contenuto effettivo si trova nel campotext o blob del blocco. Usa questo quando il tuo strumento produce qualcosa che ha senso affrontare per nome in seguito, come un file generato o un record da un sistema esterno.
| Campo | Tipo | Note |
|---|---|---|
type | "resource" | |
resource.uri | string | Identificatore per il contenuto. Qualsiasi schema URI |
resource.text | string | Il contenuto, se è testo. Fornisci questo o blob, non entrambi |
resource.blob | string | Il contenuto codificato in base64, se è binario |
resource.mimeType | string | Opzionale |
file:///tmp/report.md è un’etichetta che Claude può riferire in seguito; l’SDK non legge da quel percorso.
CallToolResult. Vedi la specifica MCP per la definizione completa.
Restituire dati strutturati
structuredContent è un oggetto JSON opzionale sul risultato, separato dall’array content. Usalo per restituire valori grezzi che Claude può leggere come campi esatti invece di analizzarli da una stringa di testo o da un’immagine.
Quando structuredContent è impostato, Claude riceve il JSON più eventuali blocchi di immagine o risorsa da content. I blocchi di testo in content non vengono inoltrati, poiché si presume che duplichino i dati strutturati. L’esempio di seguito renderizza un grafico come blocco immagine e restituisce i punti dati dietro di esso in structuredContent dallo stesso handler.
TypeScript
Il decoratore Python
@tool inoltro solo content e is_error dal dict di ritorno dell’handler. Per restituire structuredContent da Python, esegui un server MCP standalone invece di un server SDK in-process.Esempio: convertitore di unità
Questo strumento converte valori tra unità di lunghezza, temperatura e peso. Un utente può chiedere “converti 100 chilometri in miglia” o “quanto è 72°F in Celsius”, e Claude sceglie il tipo di unità e le unità corrette dalla richiesta. Dimostra due pattern:- Schemi enum:
unit_typeè vincolato a un insieme fisso di valori. In TypeScript, usaz.enum(). In Python, lo schema dict non supporta enum, quindi è richiesto il dict JSON Schema completo. - Gestione dell’input non supportato: quando una coppia di conversione non viene trovata, l’handler restituisce
isError: truein modo che Claude possa dire all’utente cosa è andato storto invece di trattare un fallimento come un risultato normale.
query nello stesso modo dell’esempio meteo. Questo esempio invia tre prompt diversi in un ciclo per mostrare lo stesso strumento che gestisce diversi tipi di unità. Per ogni risposta, ispeziona gli oggetti AssistantMessage (che contengono le chiamate dello strumento che Claude ha fatto durante quel turno) e stampa ogni ToolUseBlock prima di stampare il testo finale di ResultMessage. Questo ti permette di vedere quando Claude sta usando lo strumento rispetto a rispondere dalla sua stessa conoscenza.
Passaggi successivi
Gli strumenti personalizzati avvolgono funzioni asincrone in un’interfaccia standard. Puoi mescolare i pattern su questa pagina nello stesso server: un singolo server può contenere uno strumento di database, uno strumento di gateway API e un renderer di immagini uno accanto all’altro. Da qui:- Se il tuo server cresce fino a dozzine di strumenti, vedi tool search per differire il caricamento fino a quando Claude ne ha bisogno.
- Per connettersi a server MCP esterni (filesystem, GitHub, Slack) invece di costruire il tuo, vedi Connetti server MCP.
- Per controllare quali strumenti vengono eseguiti automaticamente rispetto a quelli che richiedono approvazione, vedi Configurare le autorizzazioni.