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

PrimitiveInitiée parEffetExemple
ToolLe modèleAction ou lecture dynamiquesend_email(to, body)
ResourceLe modèle ou l'userLecture seule, contenu attaché au contextefile:///docs/CV.pdf
PromptL'utilisateurTemplate de message pré-rédigé« Rédige un rapport sur X »
Les trois primitives MCP, qui initie l'appel et à quoi ça sert.

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

Ce que j'expose… a un effet de bord ? ou prend des params oui Tool non Resource
Question unique : opération avec effet de bord ou paramètres → tool. Sinon → resource.

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.