query, et contrôler les outils auxquels Claude peut accéder. Il couvre également la gestion des erreurs, les annotations d’outils et le retour de contenu non textuel comme les images.
Référence rapide
| Si vous voulez… | Faites ceci |
|---|---|
| Définir un outil | Utilisez @tool (Python) ou tool() (TypeScript) avec un nom, une description, un schéma et un gestionnaire. Voir Créer un outil personnalisé. |
| Enregistrer un outil auprès de Claude | Enveloppez dans create_sdk_mcp_server / createSdkMcpServer et transmettez à mcpServers dans query(). Voir Appeler un outil personnalisé. |
| Pré-approuver un outil | Ajoutez à vos outils autorisés. Voir Configurer les outils autorisés. |
| Supprimer un outil intégré du contexte de Claude | Transmettez un tableau tools listant uniquement les outils intégrés que vous souhaitez. Voir Configurer les outils autorisés. |
| Laisser Claude appeler les outils en parallèle | Définissez readOnlyHint: true sur les outils sans effets secondaires. Voir Ajouter des annotations d’outils. |
| Gérer les erreurs sans arrêter la boucle | Retournez isError: true au lieu de lever une exception. Voir Gérer les erreurs. |
| Retourner des images ou des fichiers | Utilisez des blocs image ou resource dans le tableau de contenu. Voir Retourner des images et des ressources. |
| Retourner un résultat JSON lisible par machine | Définissez structuredContent sur le résultat. Voir Retourner des données structurées. |
| Adapter à de nombreux outils | Utilisez la recherche d’outils pour charger les outils à la demande. |
Créer un outil personnalisé
Un outil est défini par quatre parties, transmises comme arguments à l’assistanttool() en TypeScript ou au décorateur @tool en Python :
- Nom : un identifiant unique que Claude utilise pour appeler l’outil.
- Description : ce que fait l’outil. Claude lit ceci pour décider quand l’appeler.
- Schéma d’entrée : les arguments que Claude doit fournir. En TypeScript, c’est toujours un schéma Zod, et les
argsdu gestionnaire sont typés automatiquement à partir de celui-ci. En Python, c’est un dictionnaire mappant les noms aux types, comme{"latitude": float}, que le SDK convertit en JSON Schema pour vous. Le décorateur Python accepte également un dictionnaire JSON Schema complet directement quand vous avez besoin d’énumérations, de plages, de champs optionnels ou d’objets imbriqués. - Gestionnaire : la fonction asynchrone qui s’exécute quand Claude appelle l’outil. Elle reçoit les arguments validés et doit retourner un objet avec :
content(obligatoire) : un tableau de blocs de résultats, chacun avec untypede"text","image"ou"resource". Voir Retourner des images et des ressources pour les blocs non textuels.structuredContent(optionnel) : un objet JSON contenant le résultat sous forme de données lisibles par machine, retourné aux côtés decontent. Voir Retourner des données structurées.isError(optionnel) : définissez surtruepour signaler un échec d’outil afin que Claude puisse y réagir. Voir Gérer les erreurs.
createSdkMcpServer (TypeScript) ou create_sdk_mcp_server (Python). Le serveur s’exécute en processus à l’intérieur de votre application, pas comme un processus séparé.
Exemple d’outil météo
Cet exemple définit un outilget_temperature et l’enveloppe dans un serveur MCP. Il configure uniquement l’outil ; pour le transmettre à query et l’exécuter, voir Appeler un outil personnalisé ci-dessous.
tool() ou la référence Python @tool pour les détails complets des paramètres, y compris les formats de schéma JSON et la structure des valeurs de retour.
Appeler un outil personnalisé
Transmettez le serveur MCP que vous avez créé àquery via l’option mcpServers. La clé dans mcpServers devient le segment {server_name} dans le nom complètement qualifié de chaque outil : mcp__{server_name}__{tool_name}. Listez ce nom dans allowedTools afin que l’outil s’exécute sans invite de permission.
Ces extraits réutilisent le weatherServer de l’exemple ci-dessus pour demander à Claude quel est le temps dans un endroit spécifique.
Ajouter plus d’outils
Un serveur contient autant d’outils que vous en listez dans son tableautools. Avec plus d’un outil sur un serveur, vous pouvez lister chacun dans allowedTools individuellement ou utiliser le caractère générique mcp__weather__* pour couvrir tous les outils que le serveur expose.
L’exemple ci-dessous ajoute un deuxième outil, get_precipitation_chance, au weatherServer de l’exemple d’outil météo et le reconstruit avec les deux outils dans le tableau.
Ajouter des annotations d’outils
Les annotations d’outils sont des métadonnées optionnelles décrivant le comportement d’un outil. Transmettez-les comme cinquième argument à l’assistanttool() en TypeScript ou via l’argument de mot-clé annotations pour le décorateur @tool en Python. Tous les champs d’indice sont des booléens.
| Champ | Par défaut | Signification |
|---|---|---|
readOnlyHint | false | L’outil ne modifie pas son environnement. Contrôle si l’outil peut être appelé en parallèle avec d’autres outils en lecture seule. |
destructiveHint | true | L’outil peut effectuer des mises à jour destructrices. Informatif uniquement. |
idempotentHint | false | Les appels répétés avec les mêmes arguments n’ont aucun effet supplémentaire. Informatif uniquement. |
openWorldHint | true | L’outil atteint les systèmes en dehors de votre processus. Informatif uniquement. |
readOnlyHint: true peut toujours écrire sur le disque si c’est ce que fait le gestionnaire. Gardez l’annotation exacte par rapport au gestionnaire.
Cet exemple ajoute readOnlyHint à l’outil get_temperature de l’exemple d’outil météo.
ToolAnnotations dans la référence TypeScript ou Python.
Contrôler l’accès aux outils
L’exemple d’outil météo a enregistré un serveur et listé les outils dansallowedTools. Cette section couvre comment les noms d’outils sont construits et comment limiter l’accès quand vous avez plusieurs outils ou que vous souhaitez restreindre les outils intégrés.
Format du nom d’outil
Quand les outils MCP sont exposés à Claude, leurs noms suivent un format spécifique :- Modèle :
mcp__{server_name}__{tool_name} - Exemple : Un outil nommé
get_temperaturedans le serveurweatherdevientmcp__weather__get_temperature
Configurer les outils autorisés
L’optiontools et les listes autorisées/interdites affectent deux couches : la disponibilité, qui contrôle si un outil apparaît dans le contexte de Claude, et la permission, qui contrôle si un appel est approuvé une fois que Claude tente de l’utiliser. tools et les entrées disallowedTools sans portée changent la disponibilité. allowedTools et les règles disallowedTools avec portée changent la permission uniquement.
| Option | Couche | Effet |
|---|---|---|
tools: ["Read", "Grep"] | Disponibilité | Seuls les outils intégrés listés sont dans le contexte de Claude. Les outils intégrés non listés sont supprimés. Les outils MCP ne sont pas affectés. |
tools: [] | Disponibilité | Tous les outils intégrés sont supprimés. Claude ne peut utiliser que vos outils MCP. |
| outils autorisés | Permission | Les outils listés s’exécutent sans invite de permission. Les outils non listés restent disponibles ; les appels passent par le flux de permission. |
| outils interdits | Les deux | Un nom d’outil simple tel que "Bash" supprime l’outil du contexte de Claude, comme l’omission de tools. Une règle avec portée telle que "Bash(rm *)" laisse l’outil dans le contexte et refuse uniquement les appels correspondants. |
tools ou listez son nom simple dans disallowedTools (Python : disallowed_tools) ; les deux gardent l’outil hors du contexte afin que Claude ne le tente jamais. Une règle disallowedTools avec portée bloque les appels correspondants mais laisse l’outil visible, donc Claude peut gaspiller un tour en le tentant. Voir Configurer les permissions pour l’ordre d’évaluation complet.
Gérer les erreurs
La façon dont votre gestionnaire signale les erreurs détermine si la boucle d’agent continue ou s’arrête :| Ce qui se passe | Résultat |
|---|---|
| Le gestionnaire lève une exception non capturée | La boucle d’agent s’arrête. Claude ne voit jamais l’erreur, et l’appel query échoue. |
Le gestionnaire capture l’erreur et retourne isError: true (TS) / "is_error": True (Python) | La boucle d’agent continue. Claude voit l’erreur comme des données et peut réessayer, essayer un outil différent ou expliquer l’échec. |
try/except (Python) ou try/catch (TypeScript) environnant et est également retourné comme un résultat d’erreur. Dans les deux cas, le gestionnaire retourne normalement et la boucle d’agent continue.
Retourner des images et des ressources
Le tableaucontent dans un résultat d’outil accepte les blocs text, image et resource. Vous pouvez les mélanger dans la même réponse.
Images
Un bloc image porte les octets d’image en ligne, codés en base64. Il n’y a pas de champ URL. Pour retourner une image qui se trouve à une URL, récupérez-la dans le gestionnaire, lisez les octets de réponse et encodez-les en base64 avant de les retourner. Le résultat est traité comme une entrée visuelle.| Champ | Type | Notes |
|---|---|---|
type | "image" | |
data | string | Octets codés en base64. Base64 brut uniquement, pas de préfixe data:image/...;base64, |
mimeType | string | Obligatoire. Par exemple image/png, image/jpeg, image/webp, image/gif |
Ressources
Un bloc ressource intègre un morceau de contenu identifié par un URI. L’URI est un libellé pour que Claude le référence ; le contenu réel se trouve dans le champtext ou blob du bloc. Utilisez ceci quand votre outil produit quelque chose qui a du sens à adresser par nom plus tard, comme un fichier généré ou un enregistrement d’un système externe.
| Champ | Type | Notes |
|---|---|---|
type | "resource" | |
resource.uri | string | Identifiant du contenu. N’importe quel schéma URI |
resource.text | string | Le contenu, s’il est textuel. Fournissez ceci ou blob, pas les deux |
resource.blob | string | Le contenu codé en base64, s’il est binaire |
resource.mimeType | string | Optionnel |
file:///tmp/report.md est un libellé que Claude peut référencer plus tard ; le SDK ne lit pas à partir de ce chemin.
CallToolResult. Voir la spécification MCP pour la définition complète.
Retourner des données structurées
structuredContent est un objet JSON optionnel sur le résultat, séparé du tableau content. Utilisez-le pour retourner des valeurs brutes que Claude peut lire comme des champs exacts au lieu de les analyser à partir d’une chaîne de texte ou d’une image.
Quand structuredContent est défini, Claude reçoit le JSON plus tous les blocs image ou ressource de content. Les blocs de texte dans content ne sont pas transmis, car on suppose qu’ils dupliquent les données structurées. L’exemple ci-dessous rend un graphique sous forme de bloc image et retourne les points de données derrière lui dans structuredContent du même gestionnaire.
TypeScript
Le décorateur Python
@tool transmet uniquement content et is_error du dictionnaire de retour du gestionnaire. Pour retourner structuredContent de Python, exécutez un serveur MCP autonome à la place d’un serveur SDK en processus.Exemple : convertisseur d’unités
Cet outil convertit les valeurs entre les unités de longueur, température et poids. Un utilisateur peut demander « convertir 100 kilomètres en miles » ou « qu’est-ce que 72°F en Celsius », et Claude choisit le bon type d’unité et les unités de la demande. Il démontre deux modèles :- Schémas d’énumération :
unit_typeest limité à un ensemble fixe de valeurs. En TypeScript, utilisezz.enum(). En Python, le schéma dict ne supporte pas les énumérations, donc le dictionnaire JSON Schema complet est requis. - Gestion des entrées non supportées : quand une paire de conversion n’est pas trouvée, le gestionnaire retourne
isError: trueafin que Claude puisse dire à l’utilisateur ce qui s’est mal passé au lieu de traiter un échec comme un résultat normal.
query de la même manière que l’exemple météo. Cet exemple envoie trois invites différentes dans une boucle pour montrer le même outil gérant différents types d’unités. Pour chaque réponse, il inspecte les objets AssistantMessage (qui contiennent les appels d’outils que Claude a effectués pendant ce tour) et imprime chaque ToolUseBlock avant d’imprimer le texte final de ResultMessage. Cela vous permet de voir quand Claude utilise l’outil par rapport à répondre à partir de ses propres connaissances.
Étapes suivantes
Les outils personnalisés enveloppent les fonctions asynchrones dans une interface standard. Vous pouvez mélanger les modèles de cette page dans le même serveur : un seul serveur peut contenir un outil de base de données, un outil de passerelle API et un moteur de rendu d’image côte à côte. À partir d’ici :- Si votre serveur grandit à des dizaines d’outils, voir la recherche d’outils pour différer le chargement jusqu’à ce que Claude en ait besoin.
- Pour vous connecter à des serveurs MCP externes (système de fichiers, GitHub, Slack) au lieu de construire les vôtres, voir Connecter les serveurs MCP.
- Pour contrôler quels outils s’exécutent automatiquement par rapport à ceux nécessitant une approbation, voir Configurer les permissions.