نشر خادم MCP
يستهلك ADK-Rust خوادم MCP عبر McpToolset، لكنه لا يغلف كل SDK API من جانب الخادم. يستخدم مؤلفو الخوادم rmcp SDK الرسمي الذي أعادت adk_tool::mcp::rmcp تصديره لتبقى أنواع بروتوكولات العميل والخادم متوافقة.
بالنسبة لـ server crate مستقل، فإن الاعتماد مباشرة على نفس إصدار rmcp مناسب أيضًا:
[dependencies]
rmcp = { version = "2.2", features = ["transport-io", "schemars"] }
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["full"] }
خادم stdio الأدنى
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?;
يستخدم examples/mcp_manager الثابت هذا الشكل من الخادم ويتم تجميعه وتنفيذه بواسطة بوابات التحقق MCP.
نشر القدرات الصادقة
أعلن عن القدرة فقط عندما يقوم الـ handler بتنفيذها. يستخدم الـ client استجابة التهيئة لتحديد ما إذا كان يمكنه استدعاء resources أو prompts أو completion أو elicitation أو subscriptions أو tasks.
بالنسبة لـ tools القادرة على المهام، أعلن عن دعم المهمة لـ tool وأعلن عن tasks.requests.tools.call. قد يرفض الـ client أداة مهمة مطلوبة عندما لا يتفاوض الخادم على دعم المهمة.
الأدوات هي حدود أمنية
تساعد الأوصاف و JSON Schema النموذج على تكوين استدعاء؛ إنها ليست تحققًا من المدخلات أو تفويضًا. يجب على الخادم:
- التحقق من صحة كل إدخال بشكل مستقل عن النموذج؛
- حل الهوية ونطاق المستأجر عند حدود الخادم؛
- تفويض الإجراء والمورد المحدد؛
- فصل عمليات القراءة عن عمليات الكتابة التبعية؛
- تجنب إرجاع الأسرار أو البيانات غير المحدودة؛
- جعل عمليات إعادة المحاولة والتكرارية صريحة للآثار الجانبية؛ و
- تسجيل أدلة كافية لشرح النتيجة.
اختر وسيلة نقل
استخدم stdio عندما يمتلك الـ client العملية الفرعية المحلية. استخدم Streamable HTTP عندما يكون الخادم خدمة منشورة بشكل مستقل. تحتاج عمليات النشر عن بعد أيضًا إلى authentication و request limits و session policy و observability و application-level health probe.
راجع وثائق rmcp الرسمية لـ server routers و resources و prompts و custom handlers و transports و authorization و extension APIs.