Skip to main content

mcp_stdio_proxy/proxy/
mod.rs

1//! Proxy module - re-exports handler types from proxy libraries
2//!
3//! This module provides a unified interface for proxy handlers by re-exporting
4//! types from mcp-sse-proxy, mcp-streamable-proxy, and mcp-common libraries.
5
6// Re-export SseHandler as ProxyHandler for backward compatibility
7// SseHandler is used because it's based on rmcp 0.10 which supports both
8// SSE server mode and CLI stdio mode used in the main project
9pub use mcp_sse_proxy::SseHandler as ProxyHandler;
10
11// Re-export SseServerHandler (unified handler for SSE server mode)
12pub use mcp_sse_proxy::SseServerHandler;
13
14// Re-export StreamProxyHandler with an alias to distinguish from SSE ProxyHandler
15// Both mcp-sse-proxy and mcp-streamable-proxy export ProxyHandler, so we use an alias
16pub use mcp_streamable_proxy::ProxyHandler as StreamProxyHandler;
17
18// Re-export ToolFilter from mcp-common
19pub use mcp_common::ToolFilter;
20
21// Re-export client connection types for high-level API (each from its own library)
22pub use mcp_sse_proxy::{McpClientConfig, SseClientConnection};
23pub use mcp_streamable_proxy::StreamClientConnection;
24
25// Re-export Builder APIs for server creation
26pub use mcp_sse_proxy::server_builder::{BackendConfig as SseBackendConfig, SseServerBuilder};
27pub use mcp_streamable_proxy::server_builder::{
28    BackendConfig as StreamBackendConfig, StreamServerBuilder,
29};
30
31/// Unified handler enum that can hold either SSE or Stream handler
32///
33/// This allows ProxyHandlerManager to store handlers of either type
34/// while providing a common interface for status checks.
35#[derive(Clone, Debug)]
36pub enum McpHandler {
37    /// SSE protocol handler (from mcp-sse-proxy)
38    /// Holds SseServerHandler which unifies SseHandler and BackendSessionHandler
39    Sse(Box<SseServerHandler>),
40    /// Streamable HTTP protocol handler (from mcp-streamable-proxy)
41    Stream(Box<StreamProxyHandler>),
42}
43
44impl McpHandler {
45    /// Check if the underlying MCP server is ready
46    pub async fn is_mcp_server_ready(&self) -> bool {
47        match self {
48            McpHandler::Sse(h) => h.is_mcp_server_ready().await,
49            McpHandler::Stream(h) => h.is_mcp_server_ready().await,
50        }
51    }
52
53    /// Check if the backend connection is terminated
54    pub async fn is_terminated_async(&self) -> bool {
55        match self {
56            McpHandler::Sse(h) => h.is_terminated_async().await,
57            McpHandler::Stream(h) => h.is_terminated_async().await,
58        }
59    }
60}
61
62impl From<ProxyHandler> for McpHandler {
63    fn from(handler: ProxyHandler) -> Self {
64        McpHandler::Sse(Box::new(SseServerHandler::Sse(handler)))
65    }
66}
67
68impl From<SseServerHandler> for McpHandler {
69    fn from(handler: SseServerHandler) -> Self {
70        McpHandler::Sse(Box::new(handler))
71    }
72}
73
74impl From<StreamProxyHandler> for McpHandler {
75    fn from(handler: StreamProxyHandler) -> Self {
76        McpHandler::Stream(Box::new(handler))
77    }
78}