Publicar un servidor MCP
ADK-Rust consume servidores MCP a través de McpToolset, pero no envuelve cada
SDK API del lado del servidor. Los autores de servidores utilizan el rmcp oficial SDK reexportado por
adk_tool::mcp::rmcp para que los tipos de protocolo del cliente y del servidor permanezcan alineados.
Para un crate de servidor independiente, también es apropiado depender directamente de la misma versión de rmcp:
[dependencies]
rmcp = { version = "2.2", features = ["transport-io", "schemars"] }
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["full"] }
Servidor stdio mínimo
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?;
El accesorio determinista examples/mcp_manager utiliza esta estructura de servidor y se
compila y ejecuta mediante las puertas de verificación MCP.
Publicar capacidades honestas
Anuncia una capacidad únicamente cuando el controlador la implemente. Un cliente utiliza la respuesta de inicialización para decidir si puede llamar a recursos, indicaciones, completado, elicitación, suscripciones o tareas.
Para las herramientas capaces de trabajar con tareas, declara la compatibilidad de la herramienta con tareas y anuncia
tasks.requests.tools.call. El cliente puede rechazar una herramienta que requiera tareas cuando el
servidor no haya negociado compatibilidad con tareas.
Las herramientas son límites de seguridad
Las descripciones y el esquema JSON ayudan al modelo a formar una llamada; no son validación de entradas ni autorización. Un servidor debe:
- validar cada entrada independientemente del modelo;
- resolver la identidad y el ámbito del inquilino en el límite del servidor;
- autorizar la acción y el recurso específicos;
- separar las operaciones de lectura de las escrituras con consecuencias;
- evitar devolver secretos o datos sin límites;
- hacer explícitos los reintentos y la idempotencia para los efectos secundarios; y
- registrar suficiente evidencia para explicar el resultado.
Elegir un transporte
Usa stdio cuando el cliente sea propietario del proceso hijo local. Usa Streamable HTTP cuando el servidor sea un servicio implementado de forma independiente. Las implementaciones remotas también necesitan autenticación, límites de solicitudes, política de sesiones, observabilidad y una sonda de estado a nivel de aplicación.
Consulta la documentación oficial de rmcp para obtener información sobre
enrutadores de servidor, recursos, indicaciones, controladores personalizados, transportes, autorización
y extensión APIs.