MCP क्लाइंट बनाएँ
कोई ADK-Rust एप्लिकेशन तब MCP क्लाइंट होता है जब वह किसी सर्वर से कनेक्ट होता है, उसके प्रकाशित कैटलॉग को पढ़ता है, और चयनित क्षमताएँ किसी एजेंट या वर्कफ़्लो के लिए उपलब्ध कराता है।
इंस्टॉल करें
[dependencies]
adk-tool = { version = "2.1.0", features = ["mcp"] }
रिमोट Streamable HTTP के लिए:
adk-tool = { version = "2.1.0", features = ["mcp", "http-transport"] }
स्थानीय stdio कनेक्शन
use adk_tool::{
McpToolset,
mcp::rmcp::{ServiceExt, transport::TokioChildProcess},
};
use std::sync::Arc;
use tokio::process::Command;
let command = Command::new("./target/release/company-mcp");
let client = ().serve(TokioChildProcess::new(command)?).await?;
let toolset = McpToolset::new(client)
.with_name("company_tools")
.with_tools(&["find_customer", "read_order", "request_refund"]);
let shutdown = toolset.cancellation_token().await;
let agent = LlmAgentBuilder::new("support")
.model(model)
.toolset(Arc::new(toolset))
.build()?;
// Run the agent, then close the client-owned MCP session.
shutdown.cancel();
प्रोडक्शन में बाइनरी का पूर्ण पथ उपयोग करें। डिप्लॉयमेंट कॉन्फ़िगरेशन में latest जैसे पैकेज टैग से बचें, क्योंकि इनके कारण बिल्ड और इंसिडेंट रिकवरी पुनरुत्पाद्य नहीं रहते।
टूल की खोज और फ़िल्टरिंग
McpToolset प्रत्येक प्रकाशित MCP टूल को ADK-Rust Tool में बदलता है। यह सर्वर के इनपुट और आउटपुट स्कीमा को अपरिवर्तित रखता है। चयनित मॉडल प्रदाता अपना अनुरोध बनाते समय स्कीमा की एक प्रति को सामान्यीकृत करता है।
एडाप्टर MCP टूल एनोटेशन को भी बनाए रखता है। readOnlyHint ADK टूल को केवल-पठन और समवर्ती रूप से सुरक्षित चिह्नित करता है; idempotentHint पुनः कनेक्ट करने के बाद सुरक्षित रीप्ले की अनुमति देता है, लेकिन अपने-आप टूल को स्वचालित समानांतर डिस्पैच के योग्य नहीं बनाता। संकेतों के अभाव में दोनों व्यवहार अक्षम रहते हैं।
महत्वपूर्ण: MCP एनोटेशन सर्वर द्वारा प्रकाशित संकेत हैं। स्वचालित रीप्ले और डिस्पैच मेटाडेटा का उपयोग केवल एप्लिकेशन की विश्वसनीयता सीमा के भीतर मौजूद सर्वरों के साथ करें।
let reviewed = McpToolset::new(client).with_filter(|name| {
matches!(name, "read_order" | "read_policy" | "request_replacement")
});
फ़िल्टरिंग मॉडल की दृश्यता को नियंत्रित करती है। यह टूल निष्पादन के समय प्राधिकरण का स्थान नहीं लेती।
संसाधन, प्रॉम्प्ट और पूर्णता
use serde_json::json;
let resources = toolset.list_resources().await?;
let templates = toolset.list_resource_templates().await?;
let policy = toolset.read_resource("company://policy/refunds").await?;
let prompts = toolset.list_prompts().await?;
let prompt = toolset
.get_prompt(
"investigate_order",
Some(serde_json::Map::from_iter([
("order_id".to_string(), json!("ORD-1042")),
])),
)
.await?;
let suggestions = toolset
.complete_prompt_argument("investigate_order", "order_id", "ORD-", None)
.await?;
रिसोर्स-टेम्पलेट पूर्णता में complete_resource_argument का उपयोग होता है। जो सर्वर सूची संचालन लागू नहीं करता, वह MCP MethodNotFound के साथ प्रतिक्रिया देते समय एक खाली सूची लौटाता है; अन्य प्रोटोकॉल और ट्रांसपोर्ट विफलताएँ त्रुटियाँ बनी रहती हैं।
संसाधन सब्सक्रिप्शन
use adk_tool::{AutoDeclineElicitationHandler, McpToolset, ResourceNotificationHandler};
use std::sync::Arc;
struct ResourceUpdates;
#[async_trait::async_trait]
impl ResourceNotificationHandler for ResourceUpdates {
async fn handle_resource_updated(
&self,
uri: &str,
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
println!("Resource changed: {uri}");
Ok(())
}
async fn handle_resource_list_changed(
&self,
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
println!("The resource catalog changed");
Ok(())
}
}
let toolset = McpToolset::with_handlers(
transport,
Arc::new(AutoDeclineElicitationHandler),
Arc::new(ResourceUpdates),
).await?;
toolset.subscribe_resource("company://inventory/sku-42").await?;
toolset.unsubscribe_resource("company://inventory/sku-42").await?;
McpToolset अपने सीमित कनेक्शन रिफ्रेश के बाद सक्रिय सदस्यताओं को पुनर्स्थापित करता है।
McpServerManager प्रबंधित प्रक्रिया के पुनरारंभ के दौरान भी सदस्यताओं को बनाए रखता है।
हैंडलर की त्रुटियाँ और पैनिक लॉग किए जाते हैं, बिना MCP कनेक्शन को समाप्त किए।
Streamable HTTP के लिए, कॉल करने से पहले
McpHttpClientBuilder::with_resource_notification_handler के साथ उसी हैंडलर को कॉन्फ़िगर करें
connect_with_elicitation।
जानकारी अनुरोध
जानकारी अनुरोध करने से सर्वर को टूल कॉल संभालते समय जानकारी माँगने की सुविधा मिलती है। एप्लिकेशन तय करता है कि अनुरोध को कैसे प्रस्तुत करना है और उसे स्वीकार, अस्वीकार या रद्द करना है।
let toolset = McpToolset::with_elicitation_handler(
transport,
Arc::new(MyElicitationHandler),
).await?;
ADK-Rust फ़ॉर्म और URL जानकारी अनुरोध का समर्थन घोषित करता है। हैंडलर की विफलता या पैनिक अस्वीकृति में बदल जाता है, जिससे MCP सत्र सुरक्षित रहता है। एप्लिकेशन को फिर भी स्वीकृत मानों का सत्यापन करना और सहमति नीति लागू करनी होगी।
पूर्ण क्लाइंट और सर्वर युग्म के लिए examples/mcp_elicitation देखें।
सहमत कार्य
use adk_tool::McpTaskConfig;
use std::time::Duration;
let toolset = McpToolset::new(client).with_task_support(
McpTaskConfig::enabled()
.poll_interval(Duration::from_secs(1))
.timeout(Duration::from_secs(120))
.max_attempts(120),
);
कार्य मोड दो सहमत तथ्यों से चुना जाता है:
- सर्वर
tasks.requests.tools.callघोषित करता है; और - टूल कार्य समर्थन को आवश्यक या वैकल्पिक के रूप में घोषित करता है।
ADK-Rust tools/call के साथ कार्य मेटाडेटा भेजता है, बनाए गए कार्य को प्राप्त करता है, tasks/get पर स्थिति की जाँच करता है, tasks/result को पढ़ता है, और स्थानीय सीमाएँ पार होने पर tasks/cancel को कॉल करता है। input_required को टाइप की गई त्रुटि के रूप में लौटाया जाता है, क्योंकि एक सामान्य ADK टूल कॉल अभी तक प्रोटोकॉल-निरपेक्ष कार्य-पुनःआरंभ इनपुट चैनल उपलब्ध नहीं कराती।
दूरस्थ Streamable HTTP
use adk_tool::{McpAuth, McpHttpClientBuilder};
use std::time::Duration;
let toolset = McpHttpClientBuilder::new("https://mcp.example.com/mcp")
.with_auth(McpAuth::bearer(std::env::var("MCP_TOKEN")?))
.header("X-Tenant-ID", "tenant-42")
.timeout(Duration::from_secs(30))
.reinit_on_expired_session(true)
.connect()
.await?;
बिल्डर bearer tokens, एक कस्टम API-key header और निश्चित OAuth 2.0 client credentials का समर्थन करता है। प्रमाणीकरण प्रवाह चुनने से पहले Security and authorization देखें।