MCP sécurité et autorisation
MCP standardise la manière dont les capacités sont décrites et appelées. Il ne décide pas quelles capacités un agent doit recevoir ni quels effets de bord un utilisateur a approuvés.
Quatre décisions distinctes
- Authentification de connexion — ce client peut-il se connecter à ce serveur ?
- Visibilité des capacités — quels outils et ressources le modèle peut-il voir ?
- Autorisation d’exécution — cette identité peut-elle effectuer cette action spécifique sur cette ressource maintenant ?
- Approbation humaine — une action aux conséquences importantes exige-t-elle qu’une personne confirme ses entrées et effets exacts ?
Ne réduisez pas ces décisions à une liste de configuration autoApprove.
Serveurs stdio locaux
Un processus enfant local hérite d’une position puissante à l’intérieur de l’hôte de l’application.
- Utilisez un chemin exécutable absolu et vérifié.
- Épinglez les versions du package et du binaire ; évitez les balises
latest. - Transmettez uniquement les variables d’environnement requises.
- Ne placez pas de secrets dans les arguments de ligne de commande.
- Restreignez les racines du système de fichiers et les répertoires de travail.
- Appliquez un profil de bac à sable du système d’exploitation lorsque le serveur gère des entrées non fiables.
- Traitez les descriptions, ressources et résultats du serveur comme du contenu non fiable.
Les chemins de chargement de JSON et d’ajout/mise à jour à l’exécution valident les ID de serveur.
McpServerManager ne met pas en bac à sable la commande configurée.
HTTP Streamable à distance
McpHttpClientBuilder peut appliquer :
- des jetons de porteur ;
- un en-tête de clé API sélectionné par l’appelant ;
- des en-têtes arbitraires vérifiés ;
- l’obtention fixe d’un jeton de client-credentials OAuth 2.0 ;
- des délais d’attente des requêtes ; et
- une seule réinitialisation bornée de session après une réponse de session expirée.
OAuth2Config n’est pas le flux complet d’autorisation MCP. Il n’effectue pas
la découverte de métadonnées de ressource protégée, la découverte du serveur d’autorisation, l’autorisation via navigateur,
PKCE, ni la négociation de l’indicateur de ressource. Utilisez l’rmcp de
APIs d’autorisation ou un composant d’identité lorsque le déploiement requiert ce
flux.
Bornnez la requête de jeton afin qu’un serveur d’autorisation lent ou inaccessible ne puisse pas bloquer la configuration de la connexion, et notez que le client ne renvoie jamais le secret client — les corps d’erreur du point de terminaison de jeton sont masqués avant d’atteindre les journaux :
use adk_tool::mcp::OAuth2Config;
use std::time::Duration;
let auth = OAuth2Config::new(client_id, token_url)
.with_secret(client_secret)
.with_scopes(vec!["mcp.read".into(), "mcp.invoke".into()])
.with_timeout(Duration::from_secs(10)); // token request timeout
Le délai d’attente par défaut de la requête de jeton est de 30 secondes.
Exposition et exécution des outils
Utilisez with_tools ou with_filter pour exclure les capacités inutiles de la
requête du modèle. Appliquez ensuite l’autorisation et la confirmation d’outil ADK-Rust au
moment de l’exécution.
Pour les outils aux conséquences importantes :
- montrez à la personne les arguments finaux résolus ;
- distinguez l’autorisation ponctuelle de la politique durable ;
- liez l’approbation à l’ID exact de l’appel de fonction ;
- rendez les écritures externes idempotentes lorsque c’est possible ;
- stockez ensemble la décision d’approbation et le résultat de l’outil ; et
- ne considérez jamais une réponse de protocole réussie comme une preuve d’un résultat métier réussi sans vérifier les preuves renvoyées.
Élicitation
L’élicitation est une demande d’informations supplémentaires du serveur, pas une instruction que l’application doit suivre. Examinez le message, URL, les champs demandés et les métadonnées. Refusez les requêtes non prises en charge ou inattendues. Validez toutes les valeurs de formulaire acceptées avant de les utiliser.
Journalisation et secrets
Masquez les variables d’environnement, les en-têtes d’autorisation, les clés API, les réponses d’élicitation et les arguments sensibles des outils. Enregistrez plutôt l’ID du serveur, le nom de l’outil, l’ID de tâche, l’état, le timing, l’approbation et un résumé borné du résultat.