MCP सर्वर प्रकाशित करें
ADK-Rust McpToolset के माध्यम से MCP सर्वरों का उपयोग करता है, लेकिन यह प्रत्येक
सर्वर-साइड SDK API को रैप नहीं करता। सर्वर लेखक आधिकारिक rmcp SDK का उपयोग करते हैं, जिसे
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 का उपयोग करें। दूरस्थ परिनियोजनों के लिए प्रमाणीकरण, अनुरोध सीमाएँ, सत्र नीति, अवलोकनीयता और एप्लिकेशन-स्तरीय स्वास्थ्य जाँच भी आवश्यक हैं।
सर्वर राउटर, संसाधनों, प्रॉम्प्ट, कस्टम हैंडलर, ट्रांसपोर्ट, प्राधिकरण और एक्सटेंशन APIs के लिए आधिकारिक rmcp दस्तावेज़ देखें।