pub struct ProxyServer { /* private fields */ }Expand description
MCP server handler that proxies requests to an upstream MCP server.
ProxyServer intercepts every call_tool response and applies the
FilterEngine pipeline before returning results to Claude, while
list_tools responses are forwarded as-is.
The filter engine is held behind an ArcSwap so it can be atomically
replaced at runtime when external presets change on disk (hot reload).
§Examples
let config = Arc::new(Config::from_upstream(&["npx", "some-mcp"], None).unwrap());
let engine = Arc::new(ArcSwap::from(Arc::new(FilterEngine::new(config))));
// let proxy = ProxyServer::new(engine, None, upstream_peer);Implementations§
Source§impl ProxyServer
impl ProxyServer
Sourcepub fn new(
engine: Arc<ArcSwap<FilterEngine>>,
tracker: Option<Arc<Tracker>>,
upstream: Peer<RoleClient>,
) -> Self
pub fn new( engine: Arc<ArcSwap<FilterEngine>>, tracker: Option<Arc<Tracker>>, upstream: Peer<RoleClient>, ) -> Self
Trait Implementations§
Source§impl Clone for ProxyServer
impl Clone for ProxyServer
Source§fn clone(&self) -> ProxyServer
fn clone(&self) -> ProxyServer
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl ServerHandler for ProxyServer
impl ServerHandler for ProxyServer
fn get_info(&self) -> ServerInfo
fn get_peer(&self) -> Option<Peer<RoleServer>>
fn set_peer(&mut self, peer: Peer<RoleServer>)
fn list_tools( &self, request: PaginatedRequestParam, _context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListToolsResult, McpError>> + Send + '_
fn call_tool( &self, request: CallToolRequestParam, _context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CallToolResult, McpError>> + Send + '_
fn ping( &self, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + Send
fn initialize( &self, request: InitializeRequestParam, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<InitializeResult, ErrorData>> + Send
fn complete( &self, request: CompleteRequestParam, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CompleteResult, ErrorData>> + Send
fn set_level( &self, request: SetLevelRequestParam, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + Send
fn get_prompt( &self, request: GetPromptRequestParam, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<GetPromptResult, ErrorData>> + Send
fn list_prompts( &self, request: Option<PaginatedRequestParamInner>, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListPromptsResult, ErrorData>> + Send
fn list_resources( &self, request: Option<PaginatedRequestParamInner>, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListResourcesResult, ErrorData>> + Send
fn list_resource_templates( &self, request: Option<PaginatedRequestParamInner>, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListResourceTemplatesResult, ErrorData>> + Send
fn read_resource( &self, request: ReadResourceRequestParam, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ReadResourceResult, ErrorData>> + Send
fn subscribe( &self, request: SubscribeRequestParam, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + Send
fn unsubscribe( &self, request: UnsubscribeRequestParam, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + Send
fn on_cancelled( &self, notification: CancelledNotificationParam, ) -> impl Future<Output = ()> + Send
fn on_progress( &self, notification: ProgressNotificationParam, ) -> impl Future<Output = ()> + Send
fn on_initialized(&self) -> impl Future<Output = ()> + Send
fn on_roots_list_changed(&self) -> impl Future<Output = ()> + Send
Auto Trait Implementations§
impl Freeze for ProxyServer
impl !RefUnwindSafe for ProxyServer
impl Send for ProxyServer
impl Sync for ProxyServer
impl Unpin for ProxyServer
impl UnsafeUnpin for ProxyServer
impl !UnwindSafe for ProxyServer
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
Mutably borrows from an owned value. Read more
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, ) -> Pin<Box<dyn Future<Output = Result<(), ErrorData>> + Send + '_>>
fn get_peer(&self) -> Option<Peer<R>>
fn set_peer(&mut self, peer: Peer<R>)
fn get_info(&self) -> <R as ServiceRole>::Info
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<H> Service<RoleServer> for Hwhere
H: ServerHandler,
impl<H> Service<RoleServer> for Hwhere
H: ServerHandler,
async fn handle_request( &self, request: <RoleServer as ServiceRole>::PeerReq, context: RequestContext<RoleServer>, ) -> Result<<RoleServer as ServiceRole>::Resp, ErrorData>
async fn handle_notification( &self, notification: <RoleServer as ServiceRole>::PeerNot, ) -> Result<(), ErrorData>
fn get_peer(&self) -> Option<Peer<RoleServer>>
fn set_peer(&mut self, peer: Peer<RoleServer>)
fn get_info(&self) -> <RoleServer as ServiceRole>::Info
Source§impl<S> ServiceExt<RoleServer> for Swhere
S: Service<RoleServer>,
impl<S> ServiceExt<RoleServer> for Swhere
S: Service<RoleServer>,
fn serve_with_ct<T, E, A>( self, transport: T, ct: CancellationToken, ) -> impl Future<Output = Result<RunningService<RoleServer, S>, E>> + Send
Source§fn into_dyn(self) -> Box<dyn DynService<R>>
fn into_dyn(self) -> Box<dyn DynService<R>>
Convert this service to a dynamic boxed service Read more