pub struct StreamProxyHandler { /* private fields */ }Expand description
A proxy handler that forwards requests to a client based on the server’s capabilities
Isolation:
BackendIsolation::Shared: one backend, clones share Arcs (stdio).BackendIsolation::PerSession: factory creates a disconnected handler; backend is opened duringinitialize(so capabilities are real) and dropped with the session.
Implementations§
Source§impl ProxyHandler
impl ProxyHandler
Sourcepub fn swap_backend_from_connection(&self, conn: Option<StreamClientConnection>)
pub fn swap_backend_from_connection(&self, conn: Option<StreamClientConnection>)
Update the backend from a high-level client connection.
Source§impl ProxyHandler
impl ProxyHandler
Sourcepub fn upstream_peers(&self) -> Arc<UpstreamPeerRegistry>
pub fn upstream_peers(&self) -> Arc<UpstreamPeerRegistry>
Shared upstream peer registry used across reconnects.
Sourcepub fn new_disconnected(
mcp_id: String,
tool_filter: ToolFilter,
default_info: InitializeResult,
) -> ProxyHandler
pub fn new_disconnected( mcp_id: String, tool_filter: ToolFilter, default_info: InitializeResult, ) -> ProxyHandler
创建断开状态的 handler(用于初始化) 后续通过 swap_backend() 注入实际的后端连接
pub fn new_disconnected_with_fallback( mcp_id: String, tool_filter: ToolFilter, default_info: InitializeResult, fallback_tools: Option<ListToolsResult>, ) -> ProxyHandler
Sourcepub fn new_per_session(
connector: Arc<dyn BackendConnector>,
mcp_id: String,
tool_filter: ToolFilter,
) -> ProxyHandler
pub fn new_per_session( connector: Arc<dyn BackendConnector>, mcp_id: String, tool_filter: ToolFilter, ) -> ProxyHandler
Create a disconnected per-session handler (URL isolation).
Backend is opened during ServerHandler::initialize so the initialize
response carries real backend capabilities.
Sourcepub fn isolation(&self) -> BackendIsolation
pub fn isolation(&self) -> BackendIsolation
Isolation mode for this handler.
pub fn new( client: RunningService<RoleClient, BackendNotificationBridge>, ) -> ProxyHandler
pub fn with_mcp_id( client: RunningService<RoleClient, BackendNotificationBridge>, mcp_id: String, ) -> ProxyHandler
Sourcepub fn with_tool_filter(
client: RunningService<RoleClient, BackendNotificationBridge>,
mcp_id: String,
tool_filter: ToolFilter,
) -> ProxyHandler
pub fn with_tool_filter( client: RunningService<RoleClient, BackendNotificationBridge>, mcp_id: String, tool_filter: ToolFilter, ) -> ProxyHandler
创建带工具过滤器的 ProxyHandler(带初始后端连接,shared 隔离)
Sourcepub fn swap_backend(
&self,
new_client: Option<RunningService<RoleClient, BackendNotificationBridge>>,
)
pub fn swap_backend( &self, new_client: Option<RunningService<RoleClient, BackendNotificationBridge>>, )
原子性替换后端连接
- Some(client): 设置新的后端连接
- None: 标记后端断开
版本控制:每次调用都会递增 backend_version,使旧 session 失效
注意:
- 新 client 应使用与本 handler 相同的
UpstreamPeerRegistry(见StreamClientConnection::connect_with_peers)。 - 对
BackendIsolation::PerSession的 management stub(builder 返回值) 调用此方法没有运维意义:真实后端由各 session handler 持有。
pub fn swap_backend_with_discovery( &self, new_client: Option<RunningService<RoleClient, BackendNotificationBridge>>, complete_tools: Option<ListToolsResult>, )
Sourcepub fn is_backend_available(&self) -> bool
pub fn is_backend_available(&self) -> bool
检查后端是否可用(快速检查,不发送请求)
Sourcepub async fn is_mcp_server_ready(&self) -> bool
pub async fn is_mcp_server_ready(&self) -> bool
检查 mcp 服务是否正常(异步版本,会发送验证请求)
Sourcepub fn is_terminated(&self) -> bool
pub fn is_terminated(&self) -> bool
检查后端连接是否已关闭(同步版本,仅检查 transport 状态)
Sourcepub async fn is_terminated_async(&self) -> bool
pub async fn is_terminated_async(&self) -> bool
异步检查后端连接是否已断开(会发送验证请求)
Sourcepub fn get_server_info_json(&self) -> Value
pub fn get_server_info_json(&self) -> Value
获取后端 ServerInfo 的 JSON 表示
用于跨 rmcp 版本桥接:将 rmcp 1.4.0 的 ServerInfo 序列化为 JSON, 供 rmcp 0.10 侧反序列化使用。
Sourcepub fn get_backend_version(&self) -> u64
pub fn get_backend_version(&self) -> u64
获取当前后端版本号
版本号用于跟踪后端连接变化:
- 0: 断开状态
- 1+: 已连接,每次 swap_backend 递增
用途:配合 ProxyAwareSessionManager 实现 session 版本控制
Source§impl ProxyHandler
impl ProxyHandler
Trait Implementations§
Source§impl BackendBridge for ProxyHandler
impl BackendBridge for ProxyHandler
Source§fn get_server_info_json(&self) -> Value
fn get_server_info_json(&self) -> Value
Source§fn is_backend_available(&self) -> bool
fn is_backend_available(&self) -> bool
Source§fn is_mcp_server_ready(&self) -> Pin<Box<dyn Future<Output = bool> + Send + '_>>
fn is_mcp_server_ready(&self) -> Pin<Box<dyn Future<Output = bool> + Send + '_>>
Source§impl Clone for ProxyHandler
impl Clone for ProxyHandler
Source§fn clone(&self) -> ProxyHandler
fn clone(&self) -> ProxyHandler
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ProxyHandler
impl Debug for ProxyHandler
Source§impl From<ProxyHandler> for McpHandler
impl From<ProxyHandler> for McpHandler
Source§fn from(handler: StreamProxyHandler) -> Self
fn from(handler: StreamProxyHandler) -> Self
Source§impl ServerHandler for ProxyHandler
impl ServerHandler for ProxyHandler
Source§async fn initialize(
&self,
request: InitializeRequestParams,
context: RequestContext<RoleServer>,
) -> Result<InitializeResult, ErrorData>
async fn initialize( &self, request: InitializeRequestParams, context: RequestContext<RoleServer>, ) -> Result<InitializeResult, ErrorData>
Connect per-session backends before returning capabilities.
fn get_info(&self) -> InitializeResult
async fn list_tools( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> Result<ListToolsResult, ErrorData>
Source§async fn call_tool(
&self,
request: CallToolRequestParams,
context: RequestContext<RoleServer>,
) -> Result<CallToolResponse, ErrorData>
async fn call_tool( &self, request: CallToolRequestParams, context: RequestContext<RoleServer>, ) -> Result<CallToolResponse, ErrorData>
tools/call request from a client. Read moreasync fn list_resources( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> Result<ListResourcesResult, ErrorData>
async fn read_resource( &self, request: ReadResourceRequestParams, context: RequestContext<RoleServer>, ) -> Result<ReadResourceResponse, ErrorData>
async fn list_resource_templates( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> Result<ListResourceTemplatesResult, ErrorData>
async fn list_prompts( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> Result<ListPromptsResult, ErrorData>
async fn get_prompt( &self, request: GetPromptRequestParams, context: RequestContext<RoleServer>, ) -> Result<GetPromptResponse, ErrorData>
async fn complete( &self, request: CompleteRequestParams, context: RequestContext<RoleServer>, ) -> Result<CompleteResult, ErrorData>
async fn subscribe( &self, request: SubscribeRequestParams, context: RequestContext<RoleServer>, ) -> Result<(), ErrorData>
async fn unsubscribe( &self, request: UnsubscribeRequestParams, context: RequestContext<RoleServer>, ) -> Result<(), ErrorData>
async fn set_level( &self, request: SetLevelRequestParams, context: RequestContext<RoleServer>, ) -> Result<(), ErrorData>
async fn enqueue_task( &self, request: CallToolRequestParams, context: RequestContext<RoleServer>, ) -> Result<CreateTaskResult, ErrorData>
async fn list_tasks( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> Result<ListTasksResult, ErrorData>
async fn get_task_info( &self, request: GetTaskParams, context: RequestContext<RoleServer>, ) -> Result<GetTaskResult, ErrorData>
async fn get_task_result( &self, request: GetTaskPayloadParams, context: RequestContext<RoleServer>, ) -> Result<GetTaskPayloadResult, ErrorData>
async fn cancel_task( &self, request: CancelTaskParams, context: RequestContext<RoleServer>, ) -> Result<CancelTaskResult, ErrorData>
async fn on_initialized(&self, context: NotificationContext<RoleServer>)
async fn on_progress( &self, notification: ProgressNotificationParam, _context: NotificationContext<RoleServer>, )
async fn on_cancelled( &self, notification: CancelledNotificationParam, _context: NotificationContext<RoleServer>, )
fn ping( &self, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
Source§fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>
fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>
Source§fn discover(
&self,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<DiscoverResult, ErrorData>> + MaybeSendFuture
fn discover( &self, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<DiscoverResult, ErrorData>> + MaybeSendFuture
fn on_custom_request( &self, request: CustomRequest, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CustomResult, ErrorData>> + MaybeSendFuture
fn on_roots_list_changed( &self, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture
fn on_task_status( &self, params: TaskStatusNotificationParam, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture
fn on_custom_notification( &self, notification: CustomNotification, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture
Auto Trait Implementations§
impl !RefUnwindSafe for ProxyHandler
impl !UnwindSafe for ProxyHandler
impl Freeze for ProxyHandler
impl Send for ProxyHandler
impl Sync for ProxyHandler
impl Unpin for ProxyHandler
impl UnsafeUnpin for ProxyHandler
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<R, S> DynService<R> for Swhere
R: ServiceRole,
S: Service<R>,
impl<R, S> DynService<R> for Swhere
R: ServiceRole,
S: Service<R>,
fn handle_request( &self, request: <R as ServiceRole>::PeerReq, context: RequestContext<R>, ) -> Pin<Box<dyn Future<Output = Result<<R as ServiceRole>::Resp, ErrorData>> + Send + '_>>
fn handle_notification( &self, notification: <R as ServiceRole>::PeerNot, context: NotificationContext<R>, ) -> Pin<Box<dyn Future<Output = Result<(), ErrorData>> + Send + '_>>
fn get_info(&self) -> <R as ServiceRole>::Info
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request