Le Model Context Protocol expose trois primitives au LLM : tools, resources, prompts. La spec les définit mais ne dit pas clairement quand préférer l'une à l'autre. Voici comment je les distingue en pratique.
Vue d'ensemble
| Primitive | Initiée par | Effet | Exemple |
|---|---|---|---|
| Tool | Le modèle | Action ou lecture dynamique | send_email(to, body) |
| Resource | Le modèle ou l'user | Lecture seule, contenu attaché au contexte | file:///docs/CV.pdf |
| Prompt | L'utilisateur | Template de message pré-rédigé | « Rédige un rapport sur X » |
La règle simple
Pour décider quoi exposer :
- Tool si l'opération a un effet de bord (envoyer, créer, supprimer) ou si elle prend des paramètres que le modèle doit fournir.
- Resource si c'est du contenu statique ou semi-statique que le modèle peut citer (un doc, une image, une page de spec).
- Prompt si c'est un raccourci utilisateur, comme une commande slash dans Claude Desktop.
Le piège
L'erreur fréquente : utiliser un tool read_file(path) pour des fichiers documentaires. Ça marche mais c'est inefficace : le modèle doit deviner quel fichier appeler, et tu paies en tokens pour décrire le tool. Une resource file:///docs/foo.md est attachée d'office au contexte si l'utilisateur la sélectionne, ou listée dans resources/list sinon. Le LLM n'a pas à deviner.
Schéma de décision
Et prompt reste un cas à part, pas concurrent des deux autres : c'est une UX pour l'utilisateur, pas une primitive de contexte pour le modèle.