Publier un serveur MCP

ADK-Rust consomme des serveurs MCP via McpToolset, mais il n’enveloppe pas chaque SDK API cĂŽtĂ© serveur. Les auteurs de serveurs utilisent le SDK officiel rmcp rĂ©exportĂ© par adk_tool::mcp::rmcp afin que les types de protocole client et serveur restent alignĂ©s.

Pour un crate de serveur autonome, dĂ©pendre directement de la mĂȘme version de rmcp est Ă©galement appropriĂ© :

[dependencies]
rmcp = { version = "2.2", features = ["transport-io", "schemars"] }
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["full"] }

Serveur stdio minimal

use rmcp::{
    ServerHandler,
    handler::server::{router::tool::ToolRouter, wrapper::Parameters},
    model::{ServerCapabilities, ServerInfo},
    schemars, tool, tool_handler, tool_router,
};
use serde::Deserialize;

#[derive(Debug, Deserialize, schemars::JsonSchema)]
struct LookupInput {
    order_id: String,
}

#[derive(Debug, Clone)]
struct OrderServer {
    tool_router: ToolRouter<Self>,
}

#[tool_router]
impl OrderServer {
    #[tool(description = "Read one order by its public order ID")]
    async fn read_order(
        &self,
        Parameters(input): Parameters<LookupInput>,
    ) -> String {
        format!("Order {} is ready for investigation", input.order_id)
    }
}

#[tool_handler]
impl ServerHandler for OrderServer {
    fn get_info(&self) -> ServerInfo {
        ServerInfo::new(ServerCapabilities::builder().enable_tools().build())
            .with_instructions("Read-only order investigation tools")
    }
}

let service = rmcp::ServiceExt::serve(
    OrderServer { tool_router: OrderServer::tool_router() },
    rmcp::transport::io::stdio(),
).await?;
service.waiting().await?;

Le fixture examples/mcp_manager déterministe utilise cette structure de serveur et est compilé et exécuté par les contrÎles de vérification MCP.

Publier des capacitĂ©s honnĂȘtes

N’annoncez une capacitĂ© que lorsque le gestionnaire l’implĂ©mente. Un client utilise la rĂ©ponse d’initialisation pour dĂ©terminer s’il peut appeler des ressources, des invites, la complĂ©tion, l’élicitation, des abonnements ou des tĂąches.

Pour les outils capables de gĂ©rer des tĂąches, dĂ©clarez la prise en charge des tĂąches de l’outil et annoncez tasks.requests.tools.call. Le client peut refuser un outil nĂ©cessitant des tĂąches lorsque le serveur n’a pas nĂ©gociĂ© la prise en charge des tĂąches.

Les outils sont des frontiÚres de sécurité

Les descriptions et le schéma JSON aident le modÚle à formuler un appel ; ils ne constituent ni une validation des entrées ni une autorisation. Un serveur doit :

  • valider chaque entrĂ©e indĂ©pendamment du modĂšle ;
  • rĂ©soudre l’identitĂ© et le pĂ©rimĂštre du locataire Ă  la frontiĂšre du serveur ;
  • autoriser l’action et la ressource spĂ©cifiques ;
  • sĂ©parer les opĂ©rations de lecture des Ă©critures ayant des consĂ©quences ;
  • Ă©viter de renvoyer des secrets ou des donnĂ©es non bornĂ©es ;
  • rendre explicites les nouvelles tentatives et l’idempotence pour les effets de bord ; et
  • consigner suffisamment d’élĂ©ments probants pour expliquer le rĂ©sultat.

Choisir un transport

Utilisez stdio lorsque le client possĂšde le processus enfant local. Utilisez Streamable HTTP lorsqu’il s’agit d’un service dĂ©ployĂ© indĂ©pendamment. Les dĂ©ploiements distants nĂ©cessitent Ă©galement une authentification, des limites de requĂȘtes, une stratĂ©gie de session, de l’observabilitĂ© et une sonde de santĂ© au niveau de l’application.

Consultez la documentation officielle de rmcp pour les routeurs de serveur, les ressources, les invites, les gestionnaires personnalisĂ©s, les transports, l’autorisation et l’extension APIs.

Publier un serveur MCP - Documentation ADK-Rust | ADK-Rust