MCP
ZeroClaw est un client MCP : il se connecte à des serveurs Model Context Protocol externes et expose leurs outils à l’agent. Chaque outil MCP est préfixé sous la forme <server>__<tool> (par exemple filesystem__read_file), de sorte que les outils provenant de serveurs différents n’entrent jamais en collision.
Configurer MCP
Le support de MCP est activé par défaut, mais aucun outil MCP externe n’est exposé tant qu’au moins un serveur n’est pas configuré sous mcp.servers et qu’un agent se voit attribuer ce serveur via ses mcp_bundles (voir le filtrage des serveurs par agent ci-dessous). Configurez via le gateway, zerocode, ou zeroclaw config set :
zeroclaw config set mcp.servers.filesystem.command npx
Définissez mcp.enabled = false pour désactiver le chargement des outils MCP sans supprimer les définitions de serveur.
Portée des serveurs par agent (mcp_bundles)
Une entrée [[mcp.servers]] ne définit qu’un serveur. Les serveurs auxquels un agent se connecte effectivement sont déterminés par les agents.<alias>.mcp_bundles de cet agent, et le modèle est sécurisé par défaut : l’omission ne constitue pas une autorisation.
- Un agent sans
mcp_bundlesne se connecte à aucun serveur MCP, même lorsquemcp.serversest non vide. - Un bundle
[mcp_bundles.<alias>]désigne les serveurs qu’il accorde par leurnamemcp.servers, avec une listeexcludeoptionnelle. Le grant d’un agent correspond à l’union des serveurs de tous les bundles qu’il référence, soustraite de toutnameexclu par l’un de ces bundles (le refus l’emporte). - Un alias de bundle inconnu, ou un nom de serveur de bundle qui ne correspond à aucun serveur configuré, n’accorde aucun accès. Les deux échouent en mode fermé et sont signalés comme des avertissements non fatals par la validation de la configuration, de sorte qu’une faute de frappe restreint l’accès d’un agent au lieu de l’élargir.
[[mcp.servers]]
name = "filesystem"
command = "npx"
[mcp_bundles.files]
servers = ["filesystem"]
[agents.assistant]
mcp_bundles = ["files"] # se connecte à `filesystem`; un agent sans cela n'obtient aucun serveur MCP
- Les modifications du bundle deviennent effectives au redémarrage de la session. Le résolveur (
Config::mcp_servers_for_agent) s’exécute au moment de la création de la session/agent ; la modification de[mcp_bundles.*]ou deagents.<alias>.mcp_bundlespendant qu’une session est active ne modifie pas les serveurs connectés à cette session. Fermez et redémarrez les sessions concernées pour appliquer les nouvelles autorisations.
Il s’agit de la frontière de connexion (les serveurs auxquels un agent s’adresse). Les contrôles allowed_tools / excluded_tools ci-dessous sont la frontière de capacité par outil appliquée en plus de ce qu’un serveur autorisé expose.
Transports
Un serveur est accessible via l’un des trois transports (le champ transport) :
| Transport | Quand utiliser | Champs obligatoires |
|---|---|---|
stdio (par défaut) | Un processus local que vous lancez (un serveur MCP Node.js ou Python) | command, args optionnel, env |
http | Un serveur distant communiquant en MCP via HTTP POST | url, headers facultatif |
sse | Un serveur distant communiquant via MCP sur HTTP + Server-Sent Events | url, headers facultatif |
env (stdio) et headers (http/sse) sont stockés en tant que secrets ; headers contient généralement le jeton Authorization: Bearer … pour le serveur en amont.
Ajoutez un serveur via la passerelle, zerocode, ou zeroclaw config set (par exemple zeroclaw config set mcp.servers.filesystem.command npx). Un serveur stdio nécessite command plus args/env optionnels ; un serveur http/sse nécessite url plus headers optionnels. Les commandes par champ figurent dans le tableau des champs ci-dessous.
Modification des serveurs
Trois interfaces modifient la même table [[mcp.servers]] :
config.toml: modifiez manuellement les clés documentées ci-dessous. La table complète est rétablie à l’enregistrement.- zerocode TUI (
/config->mcp.servers) : éditeur dédié à chaque champ. La section affiche une ligne par serveur, identifiée par lenamedu serveur ; ouvrez une ligne pour modifiertransport,command/url,headers,envettool_timeout_secsen tant que champs individuels.+ Addcrée une nouvelle entrée initialisée avec le nom que vous fournissez ; la suppression dans la liste des alias retire l’entrée. Le champnamene se modifie pas en ligne, car renommer la clé naturelle en cours d’édition invaliderait les références en cours ; utilisez le tableau de bord ou modifiezconfig.tomlà la main pour renommer pour le moment. - Tableau de bord web : affiche actuellement
mcp.serversvia un éditeur de tableau JSON. Une migration vers la même interface par champ que celle utilisée par la TUI est prévue ; en attendant, le tableau de bord reste un éditeur utilisable, mais plus rudimentaire.
Champs du serveur
Champs par serveur ([[mcp.servers]]), générés à partir du schéma :
args
Arguments de commande pour le transport stdio.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/mcp.servers et définissez le champ mcp.servers.args.
zerocode
Dans le volet Config, définissez le champ mcp.servers.args.
zeroclaw config
zeroclaw config set mcp.servers.args <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_mcp__servers__args=
command
Exécutable à lancer pour le transport stdio.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/mcp.servers et définissez le champ mcp.servers.command.
zerocode
Dans le panneau Config, définissez le champ mcp.servers.command.
zeroclaw config
zeroclaw config set mcp.servers.command <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_mcp__servers__command=
env 🔑
Variables d’environnement facultatives pour le transport stdio.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/mcp.servers et définissez le champ mcp.servers.env.
zerocode
Dans le volet Config, définissez le champ mcp.servers.env.
zeroclaw config
zeroclaw config set mcp.servers.env # entrée masquée, stockée chiffrée
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_mcp__servers__env=
headers 🔑
En-têtes HTTP optionnels pour les transports HTTP/SSE. Traités comme secrets : les valeurs contiennent généralement des jetons Bearer pour le serveur MCP en amont.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/mcp.servers et définissez le champ mcp.servers.headers.
zerocode
Dans le volet Config, définissez le champ mcp.servers.headers.
zeroclaw config
zeroclaw config set mcp.servers.headers # entrée masquée, stockée chiffrée
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_mcp__servers__headers=
max_response_bytes
Nombre maximal d’octets acceptés pour le corps d’une réponse HTTP/SSE JSON-RPC unique, imposé lors de la lecture, avant l’analyse du corps ou la matérialisation de toute ressource intégrée. Un serveur compromis ou qui se comporte mal ne peut pas provoquer une allocation illimitée du corps de la réponse. Il s’agit de la limite de taille encodée sur le réseau, et non du budget de matérialisation décodée : None/0 utilise la valeur par défaut intégrée de 16,078,168 octets, dimensionnée pour qu’un blob de ressource intégrée de 10 MiB une fois décodé (son expansion base64 et la marge nécessaire pour l’enveloppe JSON-RPC) tienne encore. La valeur distincte de 10 MiB correspond au budget global du blob décodé appliqué après l’analyse, et non à cette limite de taille sur le réseau.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/mcp.servers et définissez le champ mcp.servers.max_response_bytes.
zerocode
Dans le volet Config, définissez le champ mcp.servers.max_response_bytes.
zeroclaw config
zeroclaw config set mcp.servers.max_response_bytes <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_mcp__servers__max_response_bytes=
name
Nom d’affichage utilisé comme préfixe d’outil (<server>__<tool>). Renseigné à partir du map_key fourni lorsque l’entrée est créée via create_map_key("mcp.servers", "<name>") ; #[serde(default)] permet à la macro de construire par défaut à partir de {} avant que le nom ne soit injecté.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/mcp.servers et définissez le champ mcp.servers.name.
zerocode
Dans le volet Config, définissez le champ mcp.servers.name.
zeroclaw config
zeroclaw config set mcp.servers.name <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_mcp__servers__name=
pinned_resources
URIs de ressources à lire une fois au démarrage de l’agent et à injecter dans le prompt système comme contexte non fiable d’origine serveur. Chacune est lue via resources/read sur ce serveur ; les pins sur un serveur qui n’annonce pas les ressources, ou que la politique d’outils de l’agent refuse, sont ignorés avec un avertissement. Lecture une fois par exécution (non actualisée ; pas d’abonnements).
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/mcp.servers et définissez le champ mcp.servers.pinned_resources.
zerocode
Dans le panneau Configuration, définissez le champ mcp.servers.pinned_resources.
zeroclaw config
zeroclaw config set mcp.servers.pinned_resources <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_mcp__servers__pinned_resources=
tls_ca_cert_path
Chemin absolu vers un certificat d’autorité de certification encodé en PEM ou un bundle à approuver en plus des autorités racines par défaut pour le transport HTTP/SSE de ce serveur. La vérification du certificat et du nom d’hôte reste activée. Le chemin doit désigner un fichier ordinaire d’une taille maximale de 1 MiB ; un fichier absent, illisible, vide, trop volumineux, non ordinaire ou invalide constitue une erreur de connexion irrécupérable, et non un repli vers le magasin de confiance par défaut. Lorsqu’il est défini, l’URL configurée et tout point de terminaison de messages SSE annoncé doivent utiliser HTTPS ; les URL en clair et les redirections de rétrogradation sont rejetées. Ignoré par stdio.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/mcp.servers et définissez le champ mcp.servers.tls_ca_cert_path.
zerocode
Dans le volet Config, définissez le champ mcp.servers.tls_ca_cert_path.
zeroclaw config
zeroclaw config set mcp.servers.tls_ca_cert_path <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_mcp__servers__tls_ca_cert_path=
tool_timeout_secs
Délai d’expiration optionnel par appel en secondes (plafonné lors de la validation).
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/mcp.servers et définissez le champ mcp.servers.tool_timeout_secs.
zerocode
Dans le volet Config, définissez le champ mcp.servers.tool_timeout_secs.
zeroclaw config
zeroclaw config set mcp.servers.tool_timeout_secs <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_mcp__servers__tool_timeout_secs=
transport
Type de transport (par défaut : stdio).
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/mcp.servers et définissez le champ mcp.servers.transport.
zerocode
Dans le volet Config, définissez le champ mcp.servers.transport.
zeroclaw config
zeroclaw config set mcp.servers.transport <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_mcp__servers__transport=
url
URL pour les transports HTTP/SSE.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/mcp.servers et définissez le champ mcp.servers.url.
zerocode
Dans le volet Config, définissez le champ mcp.servers.url.
zeroclaw config
zeroclaw config set mcp.servers.url <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_mcp__servers__url=
tool_timeout_secs est un délai d’expiration optionnel par appel ; il doit être supérieur à 0 et est plafonné à 600 secondes.
Confiance dans une CA personnalisée
Pour un serveur HTTP ou SSE dont le certificat est délivré par une autorité de certification privée, définissez tls_ca_cert_path sur un chemin absolu contenant un ou plusieurs certificats d’autorité de certification encodés au format PEM. Les certificats configurés sont ajoutés au magasin de confiance par défaut ; les vérifications de la chaîne de certificats, de l’expiration et du nom d’hôte restent activées.
Un fichier CA dont le chemin est relatif, qui est manquant, illisible, vide, trop volumineux, non ordinaire ou invalide constitue une erreur de connexion bloquante pour ce serveur. Le chemin doit désigner un fichier ordinaire dont la taille ne dépasse pas 1 MiB. Les liens symboliques sont suivis, de sorte que la rotation des certificats et les configurations de secrets montés qui exposent le bundle via un lien symbolique fonctionnent comme prévu ; le fichier cible est validé après son ouverture, et tout lien symbolique qui pointe vers un répertoire, un périphérique ou un FIFO est rejeté. ZeroClaw ne désactive jamais la vérification et n’effectue jamais de repli silencieux lorsque ce champ est défini. L’URL du serveur configurée et tout point de terminaison de messages annoncé par un serveur SSE doivent utiliser https:// ; les URL en clair et les redirections vers un protocole moins sécurisé sont rejetées avant l’envoi des en-têtes de requête ou du contenu. La valeur est prise en compte au démarrage de la session MCP ; redémarrez la session concernée après l’avoir modifiée. Supprimez le champ et redémarrez la session pour revenir au magasin de confiance par défaut. Les serveurs Stdio l’ignorent.
Champs de premier niveau
deferred_loading
Chargez les schémas d’outils MCP à la demande via tool_search au lieu de les inclure systématiquement dans la fenêtre de contexte du LLM. Lorsque cette option est activée, seuls les noms des outils sont répertoriés dans l’invite système ; le LLM doit appeler tool_search pour récupérer les schémas complets avant d’invoquer un outil différé.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/mcp et définissez le champ mcp.deferred_loading.
zerocode
Dans le volet Config, définissez le champ mcp.deferred_loading.
zeroclaw config
zeroclaw config set mcp.deferred_loading <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_mcp__deferred_loading=
servers
Serveurs MCP configurés. L’annotation #[nested] indique à la macro d’exposer ceci comme une section List dans map_key_sections(), de sorte que l’affordance + Add MCP server du tableau de bord et le point de terminaison POST /api/config/map-key?path=mcp.servers&key=<name> la prennent en charge automatiquement (pas de table manuelle côté passerelle). #[natural_key = "name"] active pour le Vec le routage de propriétés par élément (voir route_vec_path et la branche #[natural_key] du derive Configurable). Avec cela, set_prop("mcp.servers.<name>.url", ...) et get_prop("mcp.servers.<name>.transport") se résolvent vers les set_prop / get_prop propres à l’élément correspondant, et la section mcp.servers se comporte comme un HashMap<String, McpServerConfig> du point de vue du tableau de bord / TUI. name lui-même devient en lecture seule via set_prop ; le renommage passe par rename_map_key, qui modifie le champ name sur place.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/mcp et définissez le champ mcp.servers.
zerocode
Dans le volet Config, définissez le champ mcp.servers.
zeroclaw config
zeroclaw config set mcp.servers <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_mcp__servers=
Chargement différé
mcp.deferred_loading est défini sur false par défaut, de sorte que les outils MCP configurés sont inclus de manière anticipée dans le contexte du modèle. Définissez-le sur true pour placer uniquement les noms des outils MCP dans l’invite système ; le LLM appelle l’outil intégré tool_search pour récupérer le schéma complet d’un outil avant de l’invoquer. Cela permet de garder une petite fenêtre de contexte initiale lorsqu’un serveur expose de nombreux outils.
Sécurité et approbation
Les appels d’outils MCP passent par la même barrière d’approbation que tous les autres outils, régie par le profil de risque de l’agent (risk_profiles.<alias>). L’étape de découverte tool_search est approuvée automatiquement afin que le chargement différé de MCP puisse fonctionner dans les sessions non interactives, mais les outils découverts depuis les serveurs MCP suivent toujours la politique d’approbation normale :
- Au niveau d’autonomie
level = full, aucune confirmation d’appel d’outil (outils MCP inclus). - Sinon, un appel d’outil MCP demande une approbation, sauf si son nom préfixé (
<server>__<tool>) figure dans la listeauto_approvedu profil.auto_approve = ["*"]approuve tout ; une entrée exacte commeauto_approve = ["filesystem__read_file"]approuve uniquement cet outil. always_askest l’inverse : un nom (ou"*") à cet endroit déclenche toujours une demande de confirmation, ce qui prévaut surauto_approve.
Autorisation : allowed_tools / excluded_tools
Les portes d’approbation déterminent quand un appel d’outil nécessite une validation humaine. Les portes d’autorisation déterminent si l’agent peut appeler un outil tout court. Les deux sont indépendantes.
Conservez les trois contrôles d’outils MCP sur leurs propres axes :
| Contrôle | Portée | Utilisez-le pour |
|---|---|---|
tool_filter_groups | Exposition des invites/du contexte | Décidez quels schémas d’outils MCP sont visibles pour le modèle pendant un tour. |
auto_approve / always_ask | Politique d’approbation | Déterminer si un appel d’outil MCP sélectionné nécessite l’approbation de l’opérateur. |
allowed_tools / excluded_tools | Politique de capacité | Décidez quels noms d’outils préfixés le profil de risque peut utiliser. |
Pour les outils MCP découverts au moment de l’exécution, le contrat de capacité comporte une exception spécifique à MCP :
- Si le champ
allowed_toolsdu profil de risque est vide ou omis, aucune contrainte d’autorisation ne s’applique ; chaque outil découvert (MCP ou intégré) est accessible. La configuration TOML ne fait pas de distinction entre un champ omis etallowed_tools = []; les deux se désérialisent vers le même état « aucune contrainte d’autorisation » au niveau du profil de risque. Si vous avez besoin d’une barrière explicite de refus total, faites-le sur la listeallowed_toolspar exécution fournie par l’appelant (les tâches cron et autres restricteurs transmettent cette liste directement) ou viaexcluded_toolscouvrant les outils spécifiques que vous souhaitez bloquer. - Si
allowed_toolsn’est pas vide, tout outil MCP dont le nom contient__(la convention<server>__<tool>) est automatiquement ajouté à la liste blanche effective sans devoir y être répertorié individuellement. Les outils intégrés non-MCP nécessitent toujours une entrée exacte. excluded_toolsopère toujours par soustraction, y compris à partir de l’ensemble MCP auto-admis. Pour bloquer un seul outil MCP commefilesystem__write_filetout en gardant le reste du serveurfilesystemaccessible, placez-le dansexcluded_tools.
La justification : avant cette exception, chaque agent qui épinglait une liste allowed_tools pour verrouiller sa surface intégrée perdait silencieusement tous les outils MCP, même ceux explicitement configurés par l’opérateur. Le coût est que la liste de refus est désormais le principal levier de l’opérateur pour bloquer les capacités MCP destructrices sous un profil épinglé par liste d’autorisation.
Si vous souhaitez le modèle strict d’avant cette modification, où vous n’autorisez que les outils MCP que vous listez explicitement sans auto-autorisation __, combinez une entrée allowed_tools explicite avec une entrée excluded_tools pour chaque outil voisin destructeur que vous devez bloquer :
[risk_profiles.assistant]
allowed_tools = [
"file_read",
"filesystem__read_file",
]
# Bloque l'équivalent destructeur qui serait sinon automatiquement admis via
# l'exception `__` ci-dessus.
excluded_tools = [
"filesystem__write_file",
]
auto_approve = [
"filesystem__read_file",
]
L’exception d’admission automatique MCP __ se limite uniquement au champ allowed_tools du profil de risque. Les listes d’autorisation par exécution fournies par l’appelant, comme un allowed_tools de tâche cron ou toute autre invocation restreinte qui transmet une liste explicite au runtime, sont toujours traitées comme des intersections strictes de listes explicites, sans admission automatique __ par-dessus. Une tâche cron qui se restreint à allowed_tools = ["cron_add"] n’exposera pas filesystem__write_file au modèle, même si le profil de risque de l’agent l’admettrait automatiquement via la convention __ ; la restriction par exécution demeure une frontière de capacités fiable, quel que soit le nombre de serveurs MCP configurés.
auto_approve seul ne masque pas un outil au modèle ; il répond uniquement à la question d’approbation après que le modèle a sélectionné cet outil. Utilisez tool_filter_groups pour réduire le bruit du prompt et allowed_tools / excluded_tools pour imposer une limite de capacités.
Consultez Niveaux d’autonomie pour la surface complète des champs par profil, et la Référence de configuration pour chaque champ MCP et sa valeur par défaut.
MCP Ressources et invites
Outre les outils MCP, ZeroClaw expose les ressources et les invites des serveurs connectés.
Outils
Deux outils intégrés sont disponibles (sous réserve de la politique d’accès aux outils de votre agent) :
mcp_resources:action: "list"(server,cursoroptionnels) liste les ressources ;action: "read"avecuri(préfixé<server>__<uri>) renvoie le contenu.mcp_prompts:action: "list"liste les prompts ;action: "get"avecname(préfixé<server>__<name>) etargumentsoptionnels renvoie les messages de prompt rendus.
Les serveurs qui n’annoncent pas les capacités resource/prompt sont ignorés, et les appels contre eux renvoient une erreur claire « does not support ».
Épinglage des ressources dans le contexte
Chaque entrée de serveur MCP accepte un champ optionnel pinned_resources : une liste d’URI de ressources à lire une fois au démarrage et à injecter dans le prompt système. Configurez-le via les mêmes interfaces de configuration utilisées pour définir le serveur (la gateway, zerocode ou zeroclaw config set, comme indiqué sous Configurer MCP), en spécifiant les ressources que vous souhaitez que l’agent conserve en permanence. Le champ est vide par défaut, les serveurs ne l’utilisant pas ne sont donc pas affectés.
Le contenu épinglé est lu une fois par exécution (pas de rafraîchissement en direct) et est étiqueté trust="untrusted-external" afin que le modèle le traite comme des données, et non comme des instructions.
Blobs de ressources intégrés dans les résultats des outils
Lorsqu’un résultat MCP tools/call inclut un élément de contenu de la forme type: "resource" avec un blob imbriqué (base64), ZeroClaw ne déverse pas ce base64 dans le contexte du modèle. À la place, il matérialise les octets dans le répertoire uploads/ de l’espace de travail de la session (avec le même utilitaire partagé et la même limite de 10 MB que pour les resource.blob entrants via ACP), puis remplace la sortie de l’outil destinée au modèle par un texte de provenance sans blob, accompagné d’un marqueur [Document: …] ou [IMAGE:…]. Ce comportement dépend de la forme du contenu, et non du nom de l’outil. La matérialisation n’envoie pas automatiquement le fichier aux clients ACP ; l’agent appelle toujours deliver_file lorsqu’un envoi sortant est nécessaire. Voir réception du blob session/prompt par ACP.
Comme le résultat provient d’un serveur non approuvé, deux limites par appel sont appliquées avant le décodage, le hachage ou l’écriture de tout blob : au maximum 64 blobs de ressources par résultat de tools/call, et une taille décodée cumulée estimée d’au plus 10 MiB pour l’ensemble. Lorsqu’un résultat dépasse l’une ou l’autre de ces limites, chaque blob de ressource est remplacé par un marqueur [attachment unavailable: …] et rien n’est écrit sur le disque, de sorte qu’un tableau contenant de nombreux blobs vides ou minuscules ne peut pas imposer un traitement par élément. Chaque blob individuel reste soumis à la même limite de 10 MB par fichier.
Indépendamment de ces budgets décodés, chaque serveur MCP HTTP/SSE dispose également d’une limite de taille du corps de réponse au niveau du transport, max_response_bytes, appliquée aux octets bruts encodés transmis sur le réseau avant l’analyse du corps, afin qu’un serveur ne puisse pas imposer une lecture illimitée. Il ne s’agit pas de la limite décodée de 10 MiB mentionnée ci-dessus : sa valeur par défaut est de 16 078 168 octets, soit l’expansion en base64 de l’agrégat décodé de 10 MiB, plus une marge pour l’enveloppe JSON-RPC, afin qu’un blob valide proche de la limite soit tout de même matérialisé. Définissez max_response_bytes sur un serveur pour remplacer cette valeur ; le définir à 0 ou ne pas le définir utilise cette valeur par défaut.
Sécurité
Le contenu des ressources et des prompts provient du serveur MCP configuré et est traité comme non fiable : il est enveloppé de provenance, expurgé des secrets et borné en longueur avant d’entrer dans le contexte. L’accès à mcp_resources / mcp_prompts et aux serveurs spécifiques est régi par la politique d’accès aux outils de votre agent (profil de risque), et se restreint correctement lors de la délégation à des sous-agents.