نشر خادم MCP

يستهلك ADK-Rust خوادم MCP من خلال McpToolset، لكنه لا يغلف كل API SDK على جانب الخادم. يستخدم مؤلفو الخوادم واجهة SDK الرسمية لـ rmcp المُعاد تصديرها بواسطة adk_tool::mcp::rmcp، بحيث تظل أنواع البروتوكول لدى العميل والخادم متوافقة.

بالنسبة إلى حزمة خادم مستقلة، يُعد الاعتماد مباشرةً على الإصدار نفسه من 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.

نشر القدرات الفعلية

أعلن عن القدرة فقط عندما ينفذ المعالج هذه القدرة. يستخدم العميل استجابة التهيئة ليقرر ما إذا كان يمكنه استدعاء الموارد والمطالبات والإكمال والاستثارة والاشتراكات أو المهام.

بالنسبة إلى الأدوات القادرة على تنفيذ المهام، صرّح بدعم الأداة للمهام وأعلن عن tasks.requests.tools.call. قد يرفض العميل أداة مهام مطلوبة عندما لا يكون الخادم قد تفاوض على دعم المهام.

الأدوات حدود أمنية

تساعد الأوصاف وJSON المخططَ النموذجَ على تكوين استدعاء؛ لكنها لا تمثل تحققًا من المدخلات أو تفويضًا. يجب على الخادم:

  • التحقق من كل إدخال بشكل مستقل عن النموذج؛
  • تحديد الهوية ونطاق المستأجر عند حدود الخادم؛
  • تفويض الإجراء والمورد المحددين؛
  • فصل عمليات القراءة عن عمليات الكتابة ذات العواقب؛
  • تجنب إرجاع الأسرار أو البيانات غير المحدودة؛
  • توضيح عمليات إعادة المحاولة وضمان عدم تكرار الآثار الجانبية؛ و
  • تسجيل ما يكفي من الأدلة لشرح النتيجة.

اختيار وسيلة نقل

استخدم stdio عندما يمتلك العميل العملية الفرعية المحلية. استخدم Streamable HTTP عندما يكون الخادم خدمة منشورة بشكل مستقل. تتطلب عمليات النشر عن بُعد أيضًا المصادقة، وحدود الطلبات، وسياسة الجلسة، وقابلية المراقبة، وفحصًا للصحة على مستوى التطبيق.

راجع وثائق rmcp الرسمية للاطلاع على موجّهات الخادم، والموارد، والمطالبات، والمعالجات المخصصة، ووسائل النقل، والتفويض، والامتداد APIs.