Skip to main content

mcp_streamable_proxy/proxy_handler/
backend_bridge.rs

1use super::*;
2
3impl mcp_common::BackendBridge for ProxyHandler {
4    fn mcp_id(&self) -> &str {
5        self.mcp_id()
6    }
7
8    fn get_server_info_json(&self) -> serde_json::Value {
9        self.get_server_info_json()
10    }
11
12    fn is_backend_available(&self) -> bool {
13        self.is_backend_available()
14    }
15
16    fn is_mcp_server_ready(
17        &self,
18    ) -> std::pin::Pin<Box<dyn std::future::Future<Output = bool> + Send + '_>> {
19        Box::pin(self.is_mcp_server_ready())
20    }
21
22    fn is_terminated_async(
23        &self,
24    ) -> std::pin::Pin<Box<dyn std::future::Future<Output = bool> + Send + '_>> {
25        Box::pin(self.is_terminated_async())
26    }
27
28    fn call_peer_method(
29        &self,
30        method: &str,
31        params: serde_json::Value,
32    ) -> std::pin::Pin<
33        Box<dyn std::future::Future<Output = Result<serde_json::Value, String>> + Send + '_>,
34    > {
35        let method = method.to_string();
36        Box::pin(async move { ProxyHandler::call_peer_method(self, &method, params).await })
37    }
38}
39
40#[cfg(test)]
41mod meta_merge_tests {
42    use super::merge_context_meta_into_params;
43    use rmcp::model::{
44        CallToolRequestParams, NumberOrString, ProgressToken, RequestMetaObject, RequestParamsMeta,
45    };
46
47    #[test]
48    fn merge_copies_progress_token_from_context() {
49        let mut params = CallToolRequestParams::new("echo");
50        assert!(params.meta.is_none());
51
52        let mut context_meta = RequestMetaObject::new();
53        context_meta.set_progress_token(ProgressToken(NumberOrString::Number(42)));
54
55        merge_context_meta_into_params(&mut params, &context_meta);
56
57        assert_eq!(
58            params.progress_token(),
59            Some(ProgressToken(NumberOrString::Number(42)))
60        );
61    }
62
63    #[test]
64    fn merge_keeps_existing_params_meta_keys() {
65        let mut params = CallToolRequestParams::new("echo");
66        params.set_progress_token(ProgressToken(NumberOrString::Number(1)));
67
68        let mut context_meta = RequestMetaObject::new();
69        context_meta.set_progress_token(ProgressToken(NumberOrString::Number(99)));
70        context_meta.insert("traceId".to_string(), serde_json::json!("abc"));
71
72        merge_context_meta_into_params(&mut params, &context_meta);
73
74        assert_eq!(
75            params.progress_token(),
76            Some(ProgressToken(NumberOrString::Number(1))),
77            "params win on conflict"
78        );
79        assert_eq!(
80            params.meta.as_ref().and_then(|m| m.get("traceId")),
81            Some(&serde_json::json!("abc"))
82        );
83    }
84}