mcp-streamable-proxy 0.2.10

Streamable HTTP proxy implementation for MCP protocol using rmcp 3.6
Documentation
use super::*;

impl mcp_common::BackendBridge for ProxyHandler {
    fn mcp_id(&self) -> &str {
        self.mcp_id()
    }

    fn get_server_info_json(&self) -> serde_json::Value {
        self.get_server_info_json()
    }

    fn is_backend_available(&self) -> bool {
        self.is_backend_available()
    }

    fn is_mcp_server_ready(
        &self,
    ) -> std::pin::Pin<Box<dyn std::future::Future<Output = bool> + Send + '_>> {
        Box::pin(self.is_mcp_server_ready())
    }

    fn is_terminated_async(
        &self,
    ) -> std::pin::Pin<Box<dyn std::future::Future<Output = bool> + Send + '_>> {
        Box::pin(self.is_terminated_async())
    }

    fn call_peer_method(
        &self,
        method: &str,
        params: serde_json::Value,
    ) -> std::pin::Pin<
        Box<dyn std::future::Future<Output = Result<serde_json::Value, String>> + Send + '_>,
    > {
        let method = method.to_string();
        Box::pin(async move { ProxyHandler::call_peer_method(self, &method, params).await })
    }
}

#[cfg(test)]
mod meta_merge_tests {
    use super::merge_context_meta_into_params;
    use rmcp::model::{
        CallToolRequestParams, NumberOrString, ProgressToken, RequestMetaObject, RequestParamsMeta,
    };

    #[test]
    fn merge_copies_progress_token_from_context() {
        let mut params = CallToolRequestParams::new("echo");
        assert!(params.meta.is_none());

        let mut context_meta = RequestMetaObject::new();
        context_meta.set_progress_token(ProgressToken(NumberOrString::Number(42)));

        merge_context_meta_into_params(&mut params, &context_meta);

        assert_eq!(
            params.progress_token(),
            Some(ProgressToken(NumberOrString::Number(42)))
        );
    }

    #[test]
    fn merge_keeps_existing_params_meta_keys() {
        let mut params = CallToolRequestParams::new("echo");
        params.set_progress_token(ProgressToken(NumberOrString::Number(1)));

        let mut context_meta = RequestMetaObject::new();
        context_meta.set_progress_token(ProgressToken(NumberOrString::Number(99)));
        context_meta.insert("traceId".to_string(), serde_json::json!("abc"));

        merge_context_meta_into_params(&mut params, &context_meta);

        assert_eq!(
            params.progress_token(),
            Some(ProgressToken(NumberOrString::Number(1))),
            "params win on conflict"
        );
        assert_eq!(
            params.meta.as_ref().and_then(|m| m.get("traceId")),
            Some(&serde_json::json!("abc"))
        );
    }
}