Protocole de contexte des modĂšles (MCP)
Carte de la documentation : Vue dâensemble et architecture · Client · Gestionnaire dynamique · CrĂ©ation de serveurs · SĂ©curitĂ© · Tests
MCP fournit Ă une application dâIA un moyen standard de dĂ©couvrir et dâutiliser des capacitĂ©s dĂ©tenues par un autre processus ou service. Un serveur peut publier :
- des outils qui effectuent des actions ;
- des ressources qui renvoient un contexte lisible ;
- des invites qui fournissent des modÚles de messages réutilisables ; et
- des suggestions de complĂ©tion qui aident un client Ă renseigner les arguments dâune invite ou dâune ressource.
ADK-Rust est gĂ©nĂ©ralement le client MCP. McpToolset transforme les outils MCP dĂ©couverts en valeurs Tool ADK-Rust ordinaires, afin quâun LlmAgent puisse les sĂ©lectionner et les appeler. Le framework expose Ă©galement les ressources, les invites, la complĂ©tion, les abonnements, la sollicitation dâinformations et le cycle de vie nĂ©gociĂ© des tĂąches. Pour la crĂ©ation de serveurs MCP et les travaux avancĂ©s sur le protocole, ADK-Rust rĂ©exporte la version exacte de SDK rmcp quâil utilise.
ADK-Rust 2 utilise rmcp 3.1, le SDK officiel de Rust. Le client annonce MCP 2025-11-25 et se connecte aux serveurs 2026-07-28 via leur procĂ©dure dâĂ©tablissement de liaison historique. examples/mcp_protocol_revisions prĂ©sente les deux rĂ©visions ainsi que lâextension de tĂąches SEP-2663 avec un serveur intĂ©grĂ©.
Architecture
Il existe deux couches distinctes :
McpToolsetgÚre une connexion client MCP initialisée. Il découvre les capacités du serveur et les adapte à ADK-Rust.McpServerManagergÚre un registre évolutif de serveurs stdio locaux. Il démarre, surveille, redémarre, met à jour, active, désactive, conserve et agrÚge ces connexions.
Le gestionnaire nâaccorde pas lâautorisation dâutiliser les outils. Il prĂ©serve autoApprove lors de la lecture dâune configuration compatible, mais lâapplication doit appliquer sa politique habituelle dâautorisation et dâapprobation ADK-Rust.
Installation
La prise en charge de stdio local MCP est activée explicitement :
[dependencies]
adk-tool = { version = "2.1.0", features = ["mcp"] }
Ajoutez Streamable HTTP lors de la connexion Ă des services distants :
adk-tool = { version = "2.1.0", features = ["mcp", "http-transport"] }
Les anciens rappels dâĂ©chantillonnage nĂ©cessitent la fonctionnalitĂ© distincte mcp-sampling. Le projet MCP a rendu obsolĂštes lâĂ©chantillonnage, les racines et la journalisation via SEP-2577 ; utilisez ces APIs uniquement pour maintenir un dĂ©ploiement compatible.
Connecter un serveur local
use adk_tool::{
McpToolset,
mcp::rmcp::{ServiceExt, transport::TokioChildProcess},
};
use std::sync::Arc;
use tokio::process::Command;
let command = Command::new("./target/release/company-mcp");
let client = ().serve(TokioChildProcess::new(command)?).await?;
let toolset = McpToolset::new(client)
.with_name("company_tools")
.with_tools(&["find_customer", "read_order", "request_refund"]);
let agent = LlmAgentBuilder::new("support")
.model(model)
.toolset(Arc::new(toolset.clone()))
.build()?;
// Keep the token when the application owns the process lifecycle.
let shutdown = toolset.cancellation_token().await;
// ... run the agent ...
shutdown.cancel();
McpToolset conserve les schĂ©mas dâentrĂ©e et de sortie du serveur tels quels. Chaque adaptateur de modĂšle normalise une copie pour son fournisseur lors de la construction de la requĂȘte du modĂšle. Cela permet au mĂȘme serveur MCP de fonctionner avec Gemini, OpenAI, Anthropic et dâautres fournisseurs sans altĂ©rer le schĂ©ma source.
Utiliser le protocole au-delĂ des outils
use serde_json::json;
let resources = toolset.list_resources().await?;
let templates = toolset.list_resource_templates().await?;
let contents = toolset.read_resource("company://policy/refunds").await?;
let prompts = toolset.list_prompts().await?;
let prompt = toolset
.get_prompt(
"investigate_order",
Some(serde_json::Map::from_iter([
("order_id".to_string(), json!("ORD-1042")),
])),
)
.await?;
let suggestions = toolset
.complete_prompt_argument("investigate_order", "order_id", "ORD-", None)
.await?;
toolset.subscribe_resource("company://inventory/sku-42").await?;
// ... receive notifications in a custom ClientHandler ...
toolset.unsubscribe_resource("company://inventory/sku-42").await?;
Les mĂ©thodes pratiques renvoient une liste vide lorsquâun serveur plus ancien nâimplĂ©mente pas la liste des ressources ou des invites. Les opĂ©rations portant sur une ressource ou une invite dĂ©clarĂ©e renvoient une erreur lorsque lâappel distant Ă©choue.
Gestion dynamique des serveurs
Utilisez McpServerManager lorsque lâapplication a besoin dâun ensemble de processus enfants locaux MCP plutĂŽt que dâune seule connexion statique.
use adk_tool::mcp::manager::{McpServerConfig, McpServerManager};
use std::collections::HashMap;
use std::sync::Arc;
use std::time::Duration;
let manager = Arc::new(McpServerManager::from_json_file("mcp.json")?
.with_name("product_mcp_servers")
.with_health_check_interval(Duration::from_secs(15))
.with_grace_period(Duration::from_secs(2)));
let outcomes = manager.start_all().await;
for (server_id, outcome) in outcomes {
if let Err(error) = outcome {
eprintln!("{server_id} did not start: {error}");
}
}
manager.start_monitoring();
let agent = LlmAgentBuilder::new("operator")
.model(model)
.toolset(manager.clone())
.build()?;
Le registre dâexĂ©cution prend en charge :
manager.add_server("billing".into(), billing_config).await?;
manager.start_server("billing").await?;
manager.update_server("billing", replacement_config).await?;
manager.disable_server("billing").await?;
manager.enable_server("billing").await?;
manager.save_json_file("mcp.json").await?;
manager.remove_server("billing").await?;
manager.shutdown().await?;
Lorsque deux serveurs publient le mĂȘme nom dâoutil, lâensemble dâoutils agrĂ©gĂ© prĂ©fixe les deux noms avec {server_id}__{tool_name}. Les noms uniques restent inchangĂ©s.
Le moniteur dâintĂ©gritĂ© dĂ©tecte une connexion MCP fermĂ©e. Un
RestartPolicy configuré contrÎle les tentatives limitées avec une temporisation
exponentielle. Il sâagit dâune supervision de connexion, et non dâune
vĂ©rification dâintĂ©gritĂ© au niveau de lâapplication : utilisez un outil de
domaine ou une sonde de service distincte lorsque vous devez vérifier la base
de données sous-jacente du serveur ou un API externe.
ExĂ©cutez lâexemple dĂ©terministe :
cargo run --manifest-path examples/mcp_manager/Cargo.toml
Il dĂ©marre un vĂ©ritable serveur enfant Rust MCP et met Ă lâĂ©preuve la dĂ©couverte, un appel dâoutil, lâajout/lâactivation/la mise Ă jour/la dĂ©sactivation/la suppression Ă lâexĂ©cution, la persistance de la configuration et lâarrĂȘt. Il ne tĂ©lĂ©charge pas de paquets et ne nĂ©cessite pas de clĂ© API.
HTTP diffusé à distance
use adk_tool::{McpAuth, McpHttpClientBuilder};
use std::time::Duration;
let toolset = McpHttpClientBuilder::new("https://mcp.example.com/mcp")
.with_auth(McpAuth::bearer(std::env::var("MCP_TOKEN")?))
.header("X-Tenant-ID", "tenant-42")
.timeout(Duration::from_secs(30))
.reinit_on_expired_session(true)
.connect()
.await?;
Le gĂ©nĂ©rateur applique des dĂ©lais dâexpiration aux requĂȘtes, des en-tĂȘtes personnalisĂ©s, des jetons bearer, des en-tĂȘtes de clĂ© API personnalisĂ©s et une rĂ©cupĂ©ration limitĂ©e lorsquâune session HTTP expire.
OAuth2Config implĂ©mente une requĂȘte de jeton Ă identifiants client fixe
OAuth 2.0. Il est utile pour un serveur possédant un point de terminaison de
jeton connu. Il ne sâagit pas du flux dâautorisation MCP complet : il
nâeffectue pas la dĂ©couverte des mĂ©tadonnĂ©es de la ressource protĂ©gĂ©e, la
dĂ©couverte du serveur dâautorisation, lâautorisation via navigateur, PKCE ou
la nĂ©gociation dâindicateur de ressource. Utilisez lâautorisation
APIs de rmcp ou un composant dâidentitĂ© externe lorsque le dĂ©ploiement
requiert ce flux.
Sollicitation
Un serveur MCP peut avoir besoin dâinformations qui nâĂ©taient pas incluses dans les arguments de lâoutil. Dans ce cas, il peut renvoyer une demande de sollicitation au client. Lâapplication dĂ©cide comment prĂ©senter la demande Ă une personne et sâil convient de lâaccepter, de la refuser ou de lâannuler.
let toolset = McpToolset::with_elicitation_handler(
transport,
Arc::new(MyElicitationHandler),
).await?;
ADK-Rust annonce Ă la fois lâinterface et lâURL. Une erreur ou une panique du gestionnaire est convertie en refus afin que la connexion MCP reste utilisable. Validez les valeurs renvoyĂ©es et appliquez les rĂšgles de consentement dans lâapplication avant dâaccepter une requĂȘte ayant des consĂ©quences.
Voir examples/mcp_elicitation pour un serveur complet et un client interactif.
Tùches MCP de longue durée
MCP 2025-11-25 peut convertir un appel dâoutil en tĂąche de protocole. ADK-Rust utilise le
flux de tĂąche uniquement lorsque le serveur a nĂ©gociĂ© tasks.requests.tools.call et que lâoutil
déclare la prise en charge obligatoire ou facultative des tùches.
use adk_tool::McpTaskConfig;
use std::time::Duration;
let toolset = McpToolset::new(client).with_task_support(
McpTaskConfig::enabled()
.poll_interval(Duration::from_secs(1))
.timeout(Duration::from_secs(120))
.max_attempts(120),
);
En mode tĂąche, ADK-Rust :
- envoie
tools/callavec les métadonnées officielles de la tùche ; - reçoit la tùche créée ;
- interroge
tasks/geten utilisant lâintervalle suggĂ©rĂ© par le serveur ; - lit la charge utile finale via
tasks/result; et - appelle
tasks/cancellorsque son dĂ©lai dâattente ou sa limite dâinterrogations locale est atteinte.
input_required est renvoyĂ©e sous forme dâerreur typĂ©e, car un appel dâoutil ADK ordinaire
ne dispose pas encore dâun canal de reprise neutre vis-Ă -vis du protocole permettant
de fournir cette entrée manquante. Concevez explicitement cette interaction dans le
flux de travail qui en est responsable.
Carte des capacités
| MCP capacité | ADK-Rust 2 interface | Remarques |
|---|---|---|
| DĂ©couverte et appels dâoutils | McpToolset, Toolset | SchĂ©mas bruts ; rĂ©sultats multimodaux et structurĂ©s prĂ©servĂ©s |
| Filtrage des outils | with_filter, with_tools | Filtrer avant lâexposition au modĂšle |
| Ressources et modĂšles | mĂ©thodes de liste/lecture | Gestion de lâabsence de mĂ©thode pour les anciens serveurs |
| Invites | mĂ©thodes de liste/rĂ©cupĂ©ration | Cartes dâarguments typĂ©es |
| Complétion | méthodes de complétion des invites/ressources | Renvoie le CompletionInfo officiel |
| Abonnements aux ressources | mĂ©thodes dâabonnement/dĂ©sabonnement | Les notifications nĂ©cessitent un gestionnaire client appropriĂ© |
| Sollicitation | ElicitationHandler | Modes formulaire et URL |
| TĂąches | McpTaskConfig | Cycle de vie des tĂąches dâappel dâoutil nĂ©gociĂ©es |
| stdio local | TokioChildProcess | Direct ou géré par le gestionnaire |
| Streamable HTTP | McpHttpClientBuilder | DĂ©lais dâexpiration, en-tĂȘtes, injection dâauthentification, rĂ©cupĂ©ration de session |
| Registre local dynamique | McpServerManager | Ajouter/mettre à jour/activer/désactiver/supprimer/enregistrer/surveiller/redémarrer |
| Création et extensions du serveur | adk_tool::mcp::rmcp | Réexportation exacte de SDK pour une utilisation avancée |
| Ăchantillonnage, racines, journalisation | fonctionnalitĂ© de compatibilitĂ© / rmcp | ObsolĂšte en amont via SEP-2577 |
Choisir la limite
Utilisez un FunctionTool Rust lorsque la capacitĂ© appartient au mĂȘme processus et Ă la mĂȘme
version. Utilisez MCP lorsquâun autre programme, une autre Ă©quipe, un autre langage, une autre
limite de sécurité ou un autre déploiement possÚde la capacité et doit publier son propre contrat.
Pour les déploiements en production :
- exposez le plus petit ensemble dâoutils utile ;
- séparez les actions en lecture seule des actions ayant des conséquences ;
- gardez les secrets hors des arguments de ligne de commande et des fichiers
mcp.jsonversionnés ; - authentifiez les serveurs HTTP distants et limitez strictement les identifiants ;
- considérez les descriptions des outils et le contenu renvoyé par les serveurs comme des entrées non fiables ;
- maintenez lâautorisation et lâapprobation ADK-Rust autour de lâexĂ©cution des outils ;
- imposez des dĂ©lais dâexpiration aux connexions, aux outils et aux tĂąches ; et
- consignez les appels dâoutils, les approbations, les erreurs et les changements du cycle de vie des serveurs.
Limites actuelles
McpServerManagergĂšre les processus enfants locaux via stdio. Les services HTTP distants utilisentMcpHttpClientBuilderet une configuration gĂ©rĂ©e par lâapplication.- Les vĂ©rifications dâĂ©tat du gestionnaire dĂ©tectent les connexions MCP fermĂ©es ; elles nâappellent pas dâoutil dâĂ©tat au niveau mĂ©tier.
- Les modifications du registre sont sĂ©rialisĂ©es pendant quâun processus enfant termine sa nĂ©gociation MCP.
autoApproveconcerne la compatibilitĂ© de configuration, et non lâapplication des autorisations.- Lâassistant OAuth intĂ©grĂ© correspond aux identifiants du client, et non au flux complet de dĂ©couverte et dâautorisation de lâutilisateur MCP OAuth.
Ces limites sont énoncées afin que les décisions de déploiement restent explicites.