Module 3 sur 10, leçon 1 sur 5
Les outils et MCP
Comprendre un appel d’outil de bout en bout et concevoir des outils qu’un modèle utilise correctement.
C’est dans les outils que se joue une grande partie de la qualité d’un agent.
Le modèle n’exécute rien
Un appel d’outil se déroule en quatre temps :
- Vous envoyez au modèle la conversation et la liste des outils, avec leur description et leur schéma.
- Le modèle répond par une demande structurée : tel outil, tels arguments.
- Votre code valide cette demande et l’exécute.
- Vous renvoyez le résultat au modèle, qui continue.
L’étape 3 est votre point de contrôle : autorisation, validation des arguments, journalisation. Le modèle propose, votre code dispose.
Écrire un bon outil
- Le nom et la description sont lus par le modèle : ils font partie du prompt.
- Préférez peu d’outils bien séparés à beaucoup d’outils qui se recouvrent.
- Renvoyez des erreurs qui expliquent quoi corriger. Le modèle peut alors se rattraper tout seul.
- Limitez la taille des résultats : chaque réponse consomme du contexte.
- Rendez les écritures idempotentes, car un agent peut relancer la même action.
MCP
Model Context Protocol est un standard ouvert pour connecter un agent à des sources de données et à des outils. Un hôte embarque un client, le client se connecte à des serveurs, et chaque serveur expose ce qu’il sait faire. Un outil écrit une fois devient utilisable par tout client compatible.
MCP règle la connexion, pas la confiance. Un serveur tiers peut décrire ses outils de façon trompeuse ou renvoyer des contenus piégés. Traitez-le comme une dépendance : à auditer.
Le modèle propose, votre code valide et exécute.
Exemple : Une erreur dont le modèle peut se servir
Le modèle propose, votre code décide. Quand un appel est refusé, le message repart vers le modèle : il doit donc dire quoi faire ensuite.
function refundOrder(input, orders) {
const order = orders[input.orderId];
if (!order) return { error: 'Unknown order. Ask the customer to confirm the number.' };
if (input.amount > order.total) {
return { error: `Amount too high. The most you can refund is ${order.total}.` };
}
return { refunded: input.amount };
}
const orders = { 4512: { total: 80 } };
refundOrder({ orderId: 4512, amount: 120 }, orders);
{ error: 'Amount too high. The most you can refund is 80.' }
Un simple « entrée invalide » laisse le modèle deviner. Ici il reçoit la limite et peut corriger l’appel tout seul.
Essayez dans l’éditeur
// registry: { name: { schema, run } }async function execute(block, registry) { const tool = registry[block.name]; const output = await tool.run(block.input); return { type: 'tool_result', tool_use_id: block.id, content: JSON.stringify(output) };}module.exports = { execute };