Décisions de conception MCP
Ce document explique les principales décisions de conception prises lors de l'implémentation de la prise en charge MCP (Model Context Protocol) dans mini-me.
Table des matières
- Transport HTTP uniquement
- Prise en charge du texte uniquement
- Pas de transport stdio (pour l'instant)
- Pas de prise en charge OAuth 2.0
- Pas de mise en cache
- Pas de découverte paresseuse
- Préfixage des noms d'outils
- Filtrage des outils
- Authentification via variables d'environnement
- Système de permissions
- Gestion des erreurs
Transport HTTP uniquement
Décision : Implémenter uniquement le transport HTTP (HTTP streamable), pas stdio.
Justification :
- Simplicité : Le transport HTTP est plus simple à implémenter et à déboguer
- Cas d'utilisation courant : La plupart des serveurs MCP hébergés utilisent le transport HTTP
- Sécurité : HTTP sur TLS fournit une sécurité intégrée
- Compatibilité : Fonctionne avec tous les services MCP hébergés (GitHub, Context7, Wikipedia, etc.)
- Effort d'implémentation : Stdio nécessite la gestion de sous-processus, ce qui ajoute de la complexité
Compromis :
- Ne peut pas utiliser les serveurs MCP locaux basés sur stdio
- Ne peut pas utiliser les serveurs MCP basés sur Docker qui n'exposent que stdio
Futur : Le transport stdio sera ajouté lorsqu'il y aura une demande pour les serveurs MCP locaux.
Prise en charge du texte uniquement
Décision : Ne prendre en charge que les outils MCP qui utilisent des entrées/sorties texte. Filtrer les outils binaires.
Justification :
- Philosophie de conception : Mini-me est conçu comme un agent basé sur le texte
- Sécurité : Les données binaires peuvent être dangereuses (images, exécutables, etc.)
- Simplicité : Le texte est plus facile à gérer, journaliser et afficher
- Compatibilité : Tous les principaux serveurs MCP (GitHub, Context7, Wikipedia) utilisent des outils texte uniquement
- Contexte : La fenêtre de contexte de mini-me est basée sur le texte
Implémentation :
Les outils qui nécessitent des données binaires (format binary ou type binary) sont automatiquement filtrés lors de la découverte des outils, avec un avertissement affiché au démarrage.
Pas de transport stdio (pour l'instant)
Décision : Reporter l'implémentation du transport stdio.
Justification :
- HTTP est suffisant : Tous les serveurs MCP publics connus actuellement utilisent HTTP
- Complexité : Stdio nécessite la gestion de sous-processus, le streaming d'entrée/sortie
- Priorités : Se concentrer sur le transport HTTP en premier, ajouter stdio plus tard si nécessaire
- Cas d'utilisation : Stdio est principalement pour les serveurs MCP locaux/auto-hébergés
Solution de contournement : Utilisez des serveurs MCP basés sur HTTP ou exécutez des serveurs MCP comme services HTTP.
Futur : Sera implémenté lorsque les utilisateurs demanderont des serveurs MCP locaux basés sur stdio.
Pas de prise en charge OAuth 2.0
Décision : Ne prendre en charge que l'authentification par token Bearer et par clé API. Pas de flux OAuth 2.0.
Justification :
- Simplicité : OAuth 2.0 nécessite une gestion complexe du flux d'authentification via navigateur
- Cas d'utilisation : Les serveurs MCP actuels n'ont pas besoin d'OAuth 2.0
- Sécurité : Les tokens Bearer et clés API sont plus simples à gérer avec les variables d'environnement
- Complexité : OAuth 2.0 nécessite des callbacks, le stockage de l'état, la gestion des rafraîchissements de tokens
Compromis :
- Ne peut pas utiliser les serveurs MCP qui nécessitent OAuth 2.0
- Les utilisateurs doivent utiliser des tokens personnels ou des clés API
Solution de contournement : Utilisez des serveurs MCP auto-hébergés qui acceptent des tokens Bearer ou des clés API.
Futur : L'implémentation d'OAuth 2.0 sera ajoutée si des serveurs MCP populaires l'exigent.
Pas de mise en cache
Décision : Ne pas mettre en cache les résultats des outils MCP.
Justification :
- Actualité : Les données des outils MCP (code, documentation, etc.) peuvent changer fréquemment
- Simplicité : Pas besoin de gérer l'invalidation du cache
- Espace : La mise en cache nécessiterait du stockage et de la gestion de la mémoire
- Prédictibilité : Les utilisateurs s'attendent à des données en temps réel
Compromis :
- Réexécution des mêmes requêtes retourne des données fraîches
- Pas de gain de performance pour les requêtes répétées
Futur : La mise en cache pourrait être ajoutée pour des outils spécifiques où c'est utile (ex : documentation statique).
Pas de découverte paresseuse
Décision : Découvrir tous les outils MCP au démarrage, pas à la demande.
Justification :
- Prédictabilité : Tous les outils sont disponibles dès le départ
- Simplicité : Pas besoin de gérer la découverte à la demande
- Bannière : La bannière de démarrage affiche tous les outils disponibles
- Erreurs préventives : Les erreurs de configuration sont détectées tôt
Compromis :
- Temps de démarrage plus long si de nombreux serveurs MCP sont configurés
- Les serveurs MCP non disponibles ne sont pas disponibles pour toute la session
Futur : La découverte paresseuse pourrait être implémentée pour améliorer les performances de démarrage.
Préfixage des noms d'outils
Décision : Préfixer tous les noms d'outils MCP avec le nom du serveur.
Justification :
- Éviter les collisions : Plusieurs serveurs peuvent avoir des outils avec le même nom (ex :
search) - Clarté : Les noms préfixés indiquent clairement la source de l'outil (ex :
github_search_code) - Consistance : Nettoyage des noms pour garantir des identifiants valides
Format : {nom_serveur}_{nom_original_outil}
Nettoyage :
- Les caractères non alphanumériques deviennent des underscores
- Les tirets deviennent des underscores
- Les underscores multiples sont réduits à un seul
Exemple :
resolve-library-id→context7_resolve_library_idquery-docs→context7_query_docs
Filtrage des outils
Décision : Permettre aux utilisateurs de filtrer quels outils de chaque serveur sont exposés.
Justification :
- Sécurité : Limiter les outils disponibles réduit la surface d'attaque
- Simplicité : Les utilisateurs n'ont pas besoin de voir tous les outils d'un serveur
- Performance : Moins d'outils = démarrage plus rapide
- Contrôle : Les utilisateurs peuvent désactiver des outils spécifiques qu'ils ne veulent pas
Implémentation :
servers:
- name: github
tools: # Seuls ces outils seront disponibles
- get_me
- list_repositories
- search_code
Authentification via variables d'environnement
Décision : Charger les tokens d'authentification uniquement depuis des variables d'environnement.
Justification :
- Sécurité : Évite de committer des secrets dans le contrôle de version
- Flexibilité : Permet aux utilisateurs d'utiliser leurs propres mécanismes de gestion de secrets
- Compatibilité : Fonctionne avec tous les systèmes (Linux, macOS, Windows)
- Bonnes pratiques : Suit les principes de sécurité standard (12-factor app)
Implémentation :
auth:
type: bearer
tokenEnv: GITHUB_PERSONAL_ACCESS_TOKEN
Le token est chargé depuis la variable d'environnement GITHUB_PERSONAL_ACCESS_TOKEN.
Système de permissions
Décision : Implémenter un système de permissions pour les outils MCP.
Justification :
- Sécurité : Prévenir l'exécution inattendue d'outils qui pourraient être dangereux
- Contrôle : Donner aux utilisateurs le contrôle sur quels outils peuvent être exécutés
- Transparence : Les utilisateurs savent quand un outil MCP est sur le point de s'exécuter
Modes :
ask: Demande à l'utilisateur avant d'exécuter chaque outil MCP (par défaut)auto: Exécute les outils MCP automatiquement sans demande
Configuration globale :
mcp:
permissions: ask # Mode par défaut pour tous les serveurs
Configuration par serveur :
servers:
- name: github
permissions: auto # Remplace le mode global pour ce serveur
Gestion des erreurs
Décision : Gérer les erreurs MCP de manière transparente avec des messages clairs.
Justification :
- Expérience utilisateur : Les utilisateurs doivent comprendre pourquoi un outil a échoué
- Débogage : Les messages d'erreur clairs aident à diagnostiquer les problèmes
- Résilience : Mini-me doit continuer à fonctionner même si un serveur MCP échoue
Stratégie :
- Erreurs de configuration : Détectées au démarrage, affichées comme avertissements
- Erreurs de connexion : Le serveur est ignoré avec un avertissement
- Erreurs d'exécution : Retournées à l'utilisateur avec un message clair
- Erreurs de timeout : Gérées comme des échecs de connexion
Parsing SSE
Décision : Implémenter un parseur SSE (Server-Sent Events) robuste pour les réponses MCP.
Justification :
- Spécification MCP : Le protocole MCP utilise SSE pour la communication
- Fiabilité : Le parsing doit gérer les événements partiels, les erreurs, les timeouts
- Performance : Le parsing doit être efficace pour ne pas ralentir les requêtes
Implémentation :
Le parseur SSE de mini-me gère :
- Les événements complets
- Les événements partiaux (streaming)
- Les erreurs de parsing
- Les timeouts
Voir aussi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 |
|