Aller au contenu

ADR-004 — MCP comme couche d'outils

Contexte

Lyra pilote des choses très différentes (VM KVM, sauvegardes, TV, lampes, ampli, Chromecast) et doit pouvoir en piloter d'autres sans changer son code.

Décision

Chaque domaine est un serveur MCP lancé par le démon et joint en stdio (modules/mcp.py, exécuteur HESTIA dans lyra/hestia/) :

  • déclaration dans config.yaml (mcp.servers.<nom>) ; outils préfixés par ce nom (tv.power_on) ;
  • session persistante pour un serveur lancé par un chemin absolu ou par Python, processus par appel pour un serveur Node ;
  • liste des outils lue en direct (tools/list), indexée pour la recherche sémantique ;
  • catalogue d'installation déclaratif (installer/core/catalog.yaml) : ajouter un serveur ne demande aucun code.

Alternatives

Aucune note ne discute d'une autre approche : le premier client MCP (pour fedora-agents) date de la phase 1. Ce qui a joué depuis : les serveurs fournis servent aussi à d'autres clients MCP (assistants de bureau, éditeurs), et un nouveau domaine s'ajoute par la configuration.

Conséquences

  • Le cœur fonctionne sans aucun serveur ; chacun s'ajoute ou se retire par la configuration.
  • Les opérations très longues (clone de VM, sauvegarde) dépassaient le délai d'un appel MCP : elles passent par scripts/async_mcp_wrapper.py, qui lance directement les scripts système en tâche de fond.
  • Un serveur MCP tourne avec les droits de l'utilisateur et tout son environnement : installer un serveur, c'est lui faire confiance. Ses descriptions d'outils orientent la recherche, et sa sortie est lue par le modèle de dialogue. Voir le modèle de menaces.
  • Un serveur doit vider sa sortie d'erreur : un tube de 64 Ko plein figeait le démon (corrigé, article).