Skip to main content
Il Model Context Protocol (MCP) è uno standard aperto per connettere agenti AI a strumenti e fonti di dati esterni. Con MCP, il tuo agente può interrogare database, integrarsi con API come Slack e GitHub e connettersi ad altri servizi senza scrivere implementazioni di strumenti personalizzate. I server MCP possono essere eseguiti come processi locali, connettersi tramite HTTP o essere eseguiti direttamente all’interno della tua applicazione SDK.
Questa pagina copre la configurazione di MCP per l’Agent SDK. Per aggiungere server MCP al Claude Code CLI in modo che si carichino in ogni progetto, consulta Ambiti di installazione di MCP.

Quickstart

Questo esempio si connette al server MCP della documentazione di Claude Code utilizzando il trasporto HTTP e utilizza allowedTools con un carattere jolly per consentire tutti gli strumenti dal server.
L’agente si connette al server di documentazione, cerca informazioni su hooks e restituisce i risultati.

Aggiungere un server MCP

È possibile configurare i server MCP nel codice quando si chiama query(), oppure in un file .mcp.json caricato tramite settingSources.

Aggiungere un server nel codice

Passare i server MCP direttamente nell’opzione mcpServers. Questo esempio avvia un server MCP del filesystem locale per /Users/me/projects. Sostituire quel percorso con una directory sulla propria macchina:

Aggiungere un server da un file di configurazione

Creare un file .mcp.json nella radice del progetto. Il file viene rilevato quando la sorgente di impostazione project è abilitata, il che avviene per le opzioni predefinite di query(). Se si imposta settingSources esplicitamente, includere "project" affinché questo file venga caricato. Sostituire /Users/me/projects con una directory sulla propria macchina:

Tempistica della connessione

Claude Code registra i server che passate in options.mcpServers all’avvio e invia il messaggio init una volta che l’attesa del primo turno, se presente, si risolve. Se ogni server options.mcpServers ritarda il primo turno, e quando si connette, dipende dal suo tipo: I server caricati da file di configurazione come .mcp.json o da plugin comunemente mostrano pending nel messaggio init. Quando options.mcpServers contiene un server stdio, HTTP o SSE, il primo turno attende anche questi server in sospeso, fino a MCP_TIMEOUT. Quando options.mcpServers è vuoto o contiene solo server SDK, il primo turno attende invece fino a 2 secondi:
  • Con ricerca degli strumenti, l’impostazione predefinita: l’attesa copre i server ancora in sospeso configurati con alwaysLoad: true e non il resto. Il resto continua a connettersi in background. Disponibilità degli strumenti descrive come Claude raggiunge i loro strumenti una volta che si connettono.
  • Senza ricerca degli strumenti: l’attesa copre ogni server in sospeso. Configurare la ricerca degli strumenti copre cosa disattiva la ricerca degli strumenti. Se escludete lo strumento ToolSearch dalla sessione, ad esempio tramite disallowedTools, la sessione viene eseguita anche senza ricerca degli strumenti.
Se impostate permissionPromptToolName, il primo turno attende anche il server di quello strumento in ogni caso, fino a MCP_TIMEOUT. Per impostare voi stessi l’attesa del primo turno, aggiungete CLAUDE_CODE_MCP_STARTUP_WAIT_MS all’opzione env, ad esempio CLAUDE_CODE_MCP_STARTUP_WAIT_MS: "5000". Il primo turno attende quindi fino a quel numero di millisecondi per ogni server in sospeso, indipendentemente dal fatto che la ricerca degli strumenti sia disponibile o meno. Questa scadenza sostituisce anche l’attesa del primo turno MCP_TIMEOUT per i server stdio, HTTP e SSE in options.mcpServers. CLAUDE_CODE_MCP_STARTUP_WAIT_MS richiede Claude Code v2.1.274 o successivo. I server ancora in sospeso quando l’attesa termina continuano a connettersi in background. Impostate la variabile a 0 per saltare l’attesa. Un server permissionPromptToolName mantiene la sua propria attesa MCP_TIMEOUT indipendentemente dal valore. Per bloccare l’avvio stesso in una fase separata e precedente rispetto all’attesa del primo turno, prima che il messaggio init sia inviato:
  • Impostare MCP_CONNECTION_NONBLOCKING a 0 per bloccare l’intero batch di connessione. Claude Code limita tale attesa a 5 secondi per impostazione predefinita. Regolare il limite con la variabile di ambiente MCP_CONNECT_TIMEOUT_MS, in millisecondi. I server ancora in sospeso a quella scadenza continuano a connettersi in background.
  • Impostare alwaysLoad: true sulla configurazione di un server per rendere i suoi strumenti disponibili ai loro schemi completi al primo turno, esenti dal differimento della ricerca degli strumenti. Claude Code attende all’avvio gli strumenti di quel server, limitati alla stessa scadenza, mentre gli altri server continuano a connettersi in background; un server remoto con un elenco di strumenti memorizzato nella cache li fornisce senza connettersi, secondo la tabella sopra.
Il messaggio system con sottotipo init segnala lo stato di ogni server nel momento in cui viene emesso; vedere Gestione degli errori per leggere questi stati.

Consenti strumenti MCP

Gli strumenti MCP richiedono un’autorizzazione esplicita prima che Claude possa utilizzarli. Senza autorizzazione, Claude vedrà che gli strumenti sono disponibili ma non sarà in grado di chiamarli.

Convenzione di denominazione degli strumenti

Gli strumenti MCP sono denominati mcp__<server-name>__<tool-name>, dove <server-name> è il nome con cui registri il server, ad esempio la sua chiave in mcpServers. I caratteri nel nome del server come . e gli spazi vengono sostituiti da _. Questa tabella mostra il nome completo di uno strumento list_issues per due chiavi di server: Usa i nomi completi degli strumenti in allowedTools e nelle regole di permesso MCP. Per un server fornito da un plugin, <server-name> assume la forma con ambito del plugin e inizia con plugin_.

Auto-approvazione con allowedTools

Utilizzare allowedTools per approvare automaticamente strumenti MCP specifici in modo che Claude possa utilizzarli senza un prompt di autorizzazione:
I caratteri jolly (*) consentono di approvare tutti gli strumenti da un server senza elencare singolarmente ciascuno.
Preferire allowedTools rispetto alle modalità di autorizzazione per l’accesso MCP. permissionMode: "acceptEdits" non approva automaticamente gli strumenti MCP (solo le modifiche ai file e i comandi Bash del filesystem). permissionMode: "bypassPermissions" approva automaticamente gli strumenti MCP ma disabilita anche la maggior parte degli altri prompt di sicurezza, il che è più ampio del necessario; vedere Come vengono valutate le autorizzazioni per i prompt che rimangono. Un carattere jolly in allowedTools concede esattamente il server MCP che desiderate e nient’altro. Vedere Modalità di autorizzazione per un confronto completo.

Scopri gli strumenti disponibili

Per vedere quali strumenti fornisce un server MCP, controllare la documentazione del server o ispezionare l’array tools nel messaggio di inizializzazione system. I nomi degli strumenti MCP iniziano con mcp__. Claude Code emette il messaggio di inizializzazione dopo l’attesa di connessione al primo turno per i server passati in options.mcpServers, quindi l’array tools elenca gli strumenti mcp__ di ciascun server che si è connesso entro quel momento, più quelli dei server con un elenco di strumenti memorizzato nella cache, che si connettono al primo utilizzo. Gli strumenti di qualsiasi altro server che non si è ancora connesso sono assenti; vedere Gestione degli errori per leggere lo stato di ciascun server. Questo filtro stampa i nomi degli strumenti MCP:
Potete anche chiedere a Claude di elencare gli strumenti disponibili da un server.

Tipi di trasporto

I server MCP comunicano con il vostro agente utilizzando diversi protocolli di trasporto. Controllate la documentazione del server per vedere quale trasporto supporta:
  • Se la documentazione vi fornisce un comando da eseguire (come npx @modelcontextprotocol/server-filesystem), utilizzate stdio
  • Se la documentazione vi fornisce un URL, utilizzate HTTP o SSE
  • Se state costruendo i vostri strumenti personalizzati nel codice, utilizzate un server MCP SDK

Server stdio

Processi locali che comunicano tramite stdin/stdout. Utilizza questo tipo per i server MCP che esegui sulla stessa macchina. Per il formato .mcp.json, utilizza gli stessi campi mostrati in Aggiungere un server da un file di configurazione. Nel codice, passa il comando e i suoi argomenti. Sostituisci /Users/me/projects con una directory sulla tua macchina:

Server HTTP/SSE

Utilizzate HTTP o SSE per i server MCP ospitati nel cloud e le API remote. Per il modulo .mcp.json, utilizzate gli stessi campi dell’esempio in Intestazioni HTTP per server remoti, con "type": "sse" per un server SSE. Nel codice, passate l’URL del server:
Per il trasporto HTTP trasmissibile, utilizzate "type": "http" invece. Nei file di configurazione .mcp.json e altri file JSON, "streamable-http" è accettato come alias per "http". Il tipo McpHttpServerConfig degli SDK dichiara solo "http", quindi utilizzate "http" per i server che passate nel codice.

Server MCP SDK

Definite strumenti personalizzati direttamente nel codice della vostra applicazione invece di eseguire un processo server separato. Consultate la guida agli strumenti personalizzati per i dettagli di implementazione. Un server MCP SDK registrato da una richiesta di controllo initialize inizia a connettersi non appena Claude Code elabora la richiesta. Quando hai molti MCP tool configurati, le definizioni dei tool possono consumare una parte significativa della tua finestra di contesto. La ricerca dei tool risolve questo problema trattenendo le definizioni dei tool dal contesto e caricando solo quelli di cui Claude ha bisogno per ogni turno. La ricerca dei tool è abilitata per impostazione predefinita. Vedi Tool search per le opzioni di configurazione, le best practice e l’utilizzo della ricerca dei tool con i tool SDK personalizzati.

Autenticazione

La maggior parte dei server MCP richiede l’autenticazione per accedere ai servizi esterni. Passare le credenziali tramite variabili di ambiente nella configurazione del server.

Passare le credenziali tramite variabili di ambiente

Utilizzare il campo env per passare chiavi API, token e altre credenziali al server MCP:

Intestazioni HTTP per server remoti

Per i server HTTP e SSE, passare le intestazioni di autenticazione direttamente nella configurazione del server:
Per un esempio completo e funzionante di un server remoto autenticato con intestazioni, vedere Elencare i problemi da un repository.

Autenticazione OAuth2

La specifica MCP supporta OAuth 2.1 per l’autorizzazione. L’SDK non apre un browser né esegue un flusso OAuth interattivo. Quando un server configurato restituisce una sfida di autorizzazione e nessun token memorizzato è disponibile, l’esecuzione dell’agente continua senza gli strumenti di quel server, e il server segnala lo stato needs-auth. L’array mcp_servers del messaggio di inizializzazione del sistema potrebbe comunque mostrare pending per quel server quando viene emesso. Per confermare se un server necessita di credenziali, eseguire il polling di mcpServerStatus() nell’SDK TypeScript o get_mcp_status() in Python. Per fornire le credenziali, completare il flusso OAuth nella propria applicazione e passare il token di accesso risultante nelle headers del server:

Esempi

Elencare i problemi da un repository

Questo esempio si connette al server MCP GitHub remoto per elencare i problemi recenti. L’esempio include la registrazione del debug per verificare la connessione MCP e le chiamate agli strumenti. Prima di eseguire, crea un token di accesso personale GitHub con accesso in lettura ai repository che desideri interrogare e impostalo come variabile di ambiente:
Nella riga MCP servers:, uno status di connected per github conferma che il token funziona. Se Claude Code ha un elenco di strumenti memorizzato nella cache per il server, lo stato può leggere pending invece e il server si connette alla sua prima chiamata di strumento. Se lo stato è failed o needs-auth, vedi Gestione degli errori prima di fidarti del risultato, poiché Claude può ricorrere agli strumenti integrati quando il server non è disponibile.

Interrogare un database

Questo esempio utilizza DBHub per interrogare un database Postgres. L’agente scopre automaticamente lo schema del database, scrive la query SQL e restituisce i risultati. Lo strumento execute_sql di DBHub esegue qualsiasi SQL che l’agente emette, incluse le scritture, a meno che non lo limiti. Impostando readonly = true nel file di configurazione di DBHub, DBHub rifiuta le istruzioni INSERT, UPDATE, DELETE e DDL, quindi l’esempio non può modificare i tuoi dati anche se l’agente emette una scrittura. DBHub risolve ${DATABASE_URL} dall’ambiente del processo quando carica la configurazione, quindi la stringa di connessione rimane fuori dal file. Crea questo dbhub.toml accanto al tuo script:
dbhub.toml
Lo script quindi punta DBHub al file di configurazione invece di passare una stringa di connessione direttamente. Prima di eseguire, imposta la variabile di ambiente DATABASE_URL sulla tua stringa di connessione. Sostituisci i valori segnaposto con i dettagli del tuo database:

Gestione degli errori

I server MCP possono non riuscire a connettersi per vari motivi: il processo del server potrebbe non essere installato, le credenziali potrebbero non essere valide, oppure un server remoto potrebbe essere irraggiungibile. Claude Code emette un messaggio system con sottotipo init all’inizio di ogni query. Questo messaggio include lo stato della connessione per ogni server MCP. Il campo status può essere "pending", "connected", "failed", "needs-auth" o "disabled". Claude Code emette il messaggio init dopo l’attesa di connessione al primo turno per i server passati in options.mcpServers, quindi un server di questo tipo che si è connesso entro l’attesa mostra "connected". Nel messaggio init, non trattare "pending" come un errore di per sé. Può significare uno di questi: Verificare la presenza di "failed" o "needs-auth" per rilevare i server che non saranno utilizzabili:
Lo stato di un server remoto può anche cambiare dopo che segnala "connected". Quando la connessione ad esso si interrompe durante la sessione, Claude Code sposta il server di nuovo a "pending" mentre si riconnette. Una successiva chiamata a mcpServerStatus() in TypeScript, o ClaudeSDKClient.get_mcp_status() in Python, può quindi segnalare "pending" per un server che hai visto connesso in precedenza, senza alcun cambiamento di configurazione da parte tua. Dopo che cinque tentativi di riconnessione falliscono, il server segnala "failed", o "needs-auth" quando ha bisogno di essere autorizzato di nuovo. Un server HTTP o SSE in stato "failed" può comunque tornare a "connected" senza alcuna chiamata da parte tua, perché Claude Code continua a riprovare in background dopo un errore transitorio. Per riprovare manualmente, chiama reconnectMcpServer() in TypeScript o ClaudeSDKClient.reconnect_mcp_server() in Python.

Troubleshooting

Server shows “failed” status

Controllare il messaggio init per vedere quali server non hanno potuto connettersi:
Uno stato "pending" non significa che il server non abbia potuto connettersi. Vedere Error handling per i casi che copre all’init. Per ottenere stati aggiornati più avanti nella sessione, chiamare il metodo mcpServerStatus() della query in TypeScript SDK, oppure ClaudeSDKClient.get_mcp_status() in Python. Cause comuni:
  • Missing environment variables: Assicurarsi che i token e le credenziali richiesti siano impostati. Per i server stdio, verificare che il campo env corrisponda a quello che il server si aspetta.
  • Server not installed: Per i comandi npx, verificare che il pacchetto esista e che Node.js sia nel vostro PATH.
  • Invalid connection string: Per i server di database, verificare il formato della stringa di connessione e che il database sia accessibile.
  • Network issues: Per i server HTTP/SSE remoti, controllare che l’URL sia raggiungibile e che eventuali firewall consentano la connessione.

Tools not being called

Se Claude vede gli strumenti ma non li utilizza, verificare di aver concesso il permesso con allowedTools:

Manca uno strumento da un server MCP dell’SDK

Nell’SDK TypeScript, quando lo schema di input di uno strumento non può essere convertito in JSON Schema, il server che hai creato con createSdkMcpServer() esclude quello strumento quando elenca i propri strumenti. In quel momento l’SDK emette un avviso. In Node.js l’avviso è un process warning con codice CLAUDE_SDK_MCP_TOOL_SCHEMA_UNCONVERTIBLE e inizia con questo testo:
Il resto dell’avviso riporta il messaggio dell’errore di conversione, quando presente, e poi indica cosa controllare e modificare. Prima della versione v0.3.286 dell’Agent SDK TypeScript, un singolo schema non convertibile faceva fallire l’intero elenco degli strumenti del server senza questo avviso, quindi nessuno degli strumenti di quel server raggiungeva Claude.

Connection timeouts

Le connessioni del server MCP scadono dopo 30 secondi per impostazione predefinita. Per modificare il tempo massimo che una chiamata di strumento in esecuzione può richiedere, impostare MCP_TOOL_TIMEOUT. Se il vostro server impiega più tempo per avviarsi, la connessione non riesce. Aumentare il limite di connessione con la variabile di ambiente MCP_TIMEOUT, in millisecondi. Per i server che necessitano di più tempo di avvio, considerare anche:
  • Utilizzare un server più leggero se disponibile
  • Pre-riscaldare il server prima di avviare l’agente
  • Controllare i log del server per le cause di inizializzazione lenta
In TypeScript, è possibile impostare il limite di chiamata dello strumento per un singolo SDK MCP server passando timeout a createSdkMcpServer().

Tool output exceeds maximum allowed tokens

L’SDK applica gli stessi limiti di output MCP di Claude Code. Quando il risultato riuscito di uno strumento senza contenuto di immagine è più grande di 25.000 token, Claude Code salva l’output in un file e sostituisce il risultato dello strumento con un messaggio di errore che indica il percorso del file, in modo che l’agente possa rileggere l’output in porzioni. Per modificare il limite di token, imposta la variabile d’ambiente MAX_MCP_OUTPUT_TOKENS. A meno che lo strumento non dichiari anthropic/maxResultSizeChars, un risultato testuale riuscito più lungo di 50.000 caratteri viene salvato in un file indipendentemente dal limite di token. Consulta Limiti e avvisi sull’output MCP per il comportamento completo, incluso il modo in cui un server dichiara tale annotazione.