Analyse de l’Architecture Roo pour la Gestion des MCPs
Ce document détaille l’architecture de l’extension Roo pour VS Code en ce qui concerne la gestion des serveurs MCP (Model Context Protocol), avec un focus sur les serveurs écrits en Python.
1. Architecture des Processus
L’architecture de gestion des MCPs dans Roo repose sur trois composants principaux :
McpServerManager.ts: Il s’agit d’un singleton qui garantit qu’une seule instance duMcpHubest active pour toute l’extension VS Code. Il gère le cycle de vie global du hub.McpHub.ts: C’est le cœur orchestral du système. Une instance unique de cette classe est responsable de :- Lire et fusionner les configurations MCP depuis le fichier global (
mcp_settings.json) et le fichier de projet (.roo/mcp.json). - Gérer le cycle de vie de chaque serveur MCP : démarrage, arrêt et redémarrage.
- Établir la communication (via
stdio,sse, oustreamable-http) avec les processus serveur. - Capturer les logs (
stderr) des serveurs.
- Lire et fusionner les configurations MCP depuis le fichier global (
ClineProvider.ts: C’est la couche de communication entre la logique de l’extension (le “backend”) et l’interface utilisateur (la webview). Elle interagit avec leMcpHubpour afficher l’état des serveurs et transmettre les actions de l’utilisateur (ex: redémarrer un serveur).
2. Cycle de Vie d’un Serveur MCP Python (stdio)
Le cycle de vie d’un serveur configuré avec le transport stdio est le suivant :
- Démarrage :
- La méthode
connectToServerdansMcpHub.tsest appelée. - Elle lit la configuration du serveur (
command,args,env, etc.). - Sous Windows, la commande est systématiquement encapsulée dans
cmd.exe /c .... Ceci est fait pour assurer la compatibilité avec des exécutables qui ne sont pas des.exe(comme les scripts PowerShell ou les batchs utilisés par certains gestionnaires de versions de Node.js). - Un nouveau processus enfant est lancé en utilisant les informations de la configuration.
- Le
McpHubattache des “listeners” aux fluxstdoutetstderrdu processus pour établir la communication et capturer les logs.
- La méthode
- Redémarrage (“Hot Reload”) :
- Le redémarrage n’est pas automatique par défaut. Il doit être explicitement activé en ajoutant une propriété
"watchPaths": ["/chemin/vers/votre/code"]à la configuration du serveur dansmcp_settings.json. - Si
watchPathsest configuré, la méthodesetupFileWatcherutilise la bibliothèquechokidarpour surveiller les changements dans les chemins spécifiés. - Lorsqu’un changement est détecté, la méthode
restartConnectionest invoquée. restartConnectionappelledeleteConnection(qui tue le processus enfant) puisconnectToServer(qui en relance un nouveau).
- Le redémarrage n’est pas automatique par défaut. Il doit être explicitement activé en ajoutant une propriété
- Problème du Cache Python (
.pyc) :- Le cycle de redémarrage de Roo ne nettoie pas les fichiers de bytecode Python (
.pyc). - Si Python, lors du redémarrage, estime qu’un fichier
.pycexistant est encore valide (ce qui peut arriver en cas de désynchronisation de l’horloge ou d’autres facteurs), il le chargera au lieu de recompiler le fichier.pymodifié. - C’est une cause très probable du problème de “code non mis à jour”.
- Le cycle de redémarrage de Roo ne nettoie pas les fichiers de bytecode Python (
3. Configuration et Logs
- Configuration :
- Le système utilise une configuration hiérarchique : les serveurs définis dans le fichier
.roo/mcp.jsondu projet surchargent ceux définis dans le fichier globalmcp_settings.json. - La configuration permet de définir des variables d’environnement (
env), y compris lePYTHONPATH, qui influence directement la manière dont Python importe les modules.
- Le système utilise une configuration hiérarchique : les serveurs définis dans le fichier
- Logs :
- Les logs sont exclusivement capturés depuis le flux
stderrdu processus MCP. - La méthode
connectToServerdansMcpHub.tsattache un listener àstderr. - Toute sortie sur
stderrest stockée dans la propriétéerrorHistoryde l’objet serveur, avec un timestamp. - Il n’existe pas de mécanisme simple pour visualiser ces logs depuis l’interface, ni de fichier de log centralisé dédié aux MCPs. Le
console.errorde l’extension VS Code reste le principal canal de débogage.
- Les logs sont exclusivement capturés depuis le flux
4. Stratégie de Diagnostic et Recommandations
Basé sur cette analyse, voici une procédure fiable pour le développement itératif de MCPs Python et des recommandations pour améliorer l’écosystème Roo.
Procédure Fiable de Redémarrage pour MCPs Python
Pour garantir que les modifications du code Python sont toujours prises en compte, la procédure suivante doit être suivie :
Activer le Rechargement Automatique (Hot-Reload) : Modifiez votre fichier
mcp_settings.jsonpour inclure la propriétéwatchPathsdans la configuration de votre serveur. Le chemin doit pointer vers le répertoire racine de votre code MCP.Exemple pour
jupyter-papermill-mcp-server:"jupyter-papermill-mcp-server": { "command": "C:/Users/jsboi/.conda/envs/mcp-jupyter/python.exe", "args": [ "-m", "papermill_mcp.main_fastmcp" ], "env": { "PYTHONPATH": "D:/dev/roo-extensions/mcps/internal/servers/jupyter-papermill-mcp-server" }, "watchPaths": [ "D:/dev/roo-extensions/mcps/internal/servers/jupyter-papermill-mcp-server/papermill_mcp" ], ... }Avec cette configuration, Roo redémarrera automatiquement le serveur à chaque modification d’un fichier Python dans le répertoire
papermill_mcp.Forcer le Nettoyage du Cache
.pyc: Pour contrer le problème de cache, la meilleure solution est de modifier la commande de démarrage pour qu’elle nettoie les fichiers.pycavant de lancer le serveur. Étant donné que Roo sur Windows utilisecmd.exe, nous pouvons chaîner les commandes.La solution la plus propre est de créer un script de lancement.
a. Créez
start_jupyter_mcp.batdansD:/dev/roo-extensions/mcps/internal/servers/jupyter-papermill-mcp-server:@echo off echo Cleaning Python cache... del /s /q __pycache__ echo Starting MCP server... C:/Users/jsboi/.conda/envs/mcp-jupyter/python.exe -m papermill_mcp.main_fastmcpb. Mettez à jour
mcp_settings.jsonpour utiliser ce script :"jupyter-papermill-mcp-server": { "command": "D:/dev/roo-extensions/mcps/internal/servers/jupyter-papermill-mcp-server/start_jupyter_mcp.bat", "args": [], "watchPaths": [ "D:/dev/roo-extensions/mcps/internal/servers/jupyter-papermill-mcp-server/papermill_mcp" ], ... }Note :
envavecPYTHONPATHpeut ne plus être nécessaire si le script est lancé depuis le bon répertoire de travail (cwd), mais il est plus sûr de le conserver.
Recommandations pour roo-state-manager
L’expérience de diagnostic a montré des limitations dans les outils actuels. Voici des recommandations pour améliorer roo-state-manager :
- Créer un outil
get_mcp_server_state: Cet outil permettrait d’inspecter l’état interne d’un ou de tous les serveurs MCP gérés par leMcpHub.- Arguments :
server_name(optionnel). - Retour : Un objet JSON contenant des informations pour chaque serveur :
status(‘connected’, ‘disconnected’, ‘connecting’)config(la configuration appliquée)tools(la liste des outils détectés)errorHistory(les 10-20 derniers logsstderravec timestamps). Cet outil aurait rendu le diagnostic des logs beaucoup plus direct.
- Arguments :
- Améliorer
rebuild_and_restart_mcp:- L’outil devrait détecter le type de projet MCP (ex:
package.jsonvsrequirements.txt/pyproject.toml). - Il devrait accepter un paramètre
project_pathpour savoir où exécuter la commande de build, au lieu de l’exécuter systématiquement dans le répertoire de travail courant. - Pour les projets Python, il pourrait automatiquement effectuer le nettoyage des
.pycavant de redémarrer.
- L’outil devrait détecter le type de projet MCP (ex: