Skip to main content

RouterRequest

Struct RouterRequest 

Source
pub struct RouterRequest {
    pub id: RequestId,
    pub inner: McpRequest,
    pub extensions: Extensions,
}
Expand description

Request type for the tower Service implementation.

§Preserving extensions in middleware

When rewriting a request in middleware, use with_inner or clone_with_inner instead of constructing a new RouterRequest directly. Constructing with Extensions::new() will silently drop extensions set by earlier middleware layers (token claims, RBAC context, etc.).

// WRONG: drops extensions from earlier middleware
let rewritten = RouterRequest {
    id: req.id.clone(),
    inner: new_inner,
    extensions: Extensions::new(),
};

// RIGHT: preserves extensions
let rewritten = req.with_inner(new_inner);

Fields§

§id: RequestId

The JSON-RPC request ID.

§inner: McpRequest

The parsed MCP request.

§extensions: Extensions

Type-map for passing data (e.g., TokenClaims) through middleware.

Implementations§

Source§

impl RouterRequest

Source

pub fn new(id: RequestId, inner: McpRequest) -> Self

Create a new RouterRequest with empty extensions.

Source

pub fn with_inner(self, inner: McpRequest) -> Self

Replace the inner MCP request, preserving the id and extensions.

This is the recommended way to rewrite requests in middleware, as it ensures extensions set by earlier middleware layers (e.g., token claims, RBAC context) are not lost.

Source

pub fn with_id_and_inner(self, id: RequestId, inner: McpRequest) -> Self

Replace both the id and inner MCP request, preserving extensions.

Useful when middleware needs to assign a new request id (e.g., for fan-out or request duplication) while keeping the extensions from the original request.

Source

pub fn clone_with_inner(&self, inner: McpRequest) -> Self

Create a copy of this request with a different inner request, cloning the id and extensions from the original.

Unlike with_inner, this borrows self, which is useful when the original request is still needed (e.g., for traffic mirroring where you send the request to two backends).

Trait Implementations§

Source§

impl Clone for RouterRequest

Source§

fn clone(&self) -> RouterRequest

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for RouterRequest

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<S> Service<RouterRequest> for AuditService<S>
where S: Service<RouterRequest, Response = RouterResponse> + Clone + Send + 'static, S::Error: Send, S::Future: Send,

Source§

type Response = RouterResponse

Responses given by the service.
Source§

type Error = <S as Service<RouterRequest>>::Error

Errors produced by the service.
Source§

type Future = Pin<Box<dyn Future<Output = Result<RouterResponse, <S as Service<RouterRequest>>::Error>> + Send>>

The future response value.
Source§

fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>

Returns Poll::Ready(Ok(())) when the service is able to process requests. Read more
Source§

fn call(&mut self, req: RouterRequest) -> Self::Future

Process the request and return the response asynchronously. Read more
Source§

impl<S> Service<RouterRequest> for CatchError<S>
where S: Service<RouterRequest, Response = RouterResponse> + Clone + Send + 'static, S::Error: Display + Send, S::Future: Send,

Source§

type Response = RouterResponse

Responses given by the service.
Source§

type Error = Infallible

Errors produced by the service.
Source§

type Future = CatchErrorFuture<<S as Service<RouterRequest>>::Future>

The future response value.
Source§

fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>

Returns Poll::Ready(Ok(())) when the service is able to process requests. Read more
Source§

fn call(&mut self, req: RouterRequest) -> Self::Future

Process the request and return the response asynchronously. Read more
Source§

impl<S> Service<RouterRequest> for InjectAnnotations<S>
where S: Service<RouterRequest, Response = RouterResponse>,

Source§

type Response = RouterResponse

Responses given by the service.
Source§

type Error = <S as Service<RouterRequest>>::Error

Errors produced by the service.
Source§

type Future = <S as Service<RouterRequest>>::Future

The future response value.
Source§

fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>

Returns Poll::Ready(Ok(())) when the service is able to process requests. Read more
Source§

fn call(&mut self, req: RouterRequest) -> Self::Future

Process the request and return the response asynchronously. Read more
Source§

impl Service<RouterRequest> for McpRouter

Source§

type Response = RouterResponse

Responses given by the service.
Source§

type Error = Infallible

Errors produced by the service.
Source§

type Future = Pin<Box<dyn Future<Output = Result<<McpRouter as Service<RouterRequest>>::Response, <McpRouter as Service<RouterRequest>>::Error>> + Send>>

The future response value.
Source§

fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>

Returns Poll::Ready(Ok(())) when the service is able to process requests. Read more
Source§

fn call(&mut self, req: RouterRequest) -> Self::Future

Process the request and return the response asynchronously. Read more
Source§

impl<S> Service<RouterRequest> for McpTracingService<S>
where S: Service<RouterRequest, Response = RouterResponse, Error = Infallible> + Clone + Send + 'static, S::Future: Send,

Source§

type Response = RouterResponse

Responses given by the service.
Source§

type Error = Infallible

Errors produced by the service.
Source§

type Future = Pin<Box<dyn Future<Output = Result<RouterResponse, Infallible>> + Send>>

The future response value.
Source§

fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>

Returns Poll::Ready(Ok(())) when the service is able to process requests. Read more
Source§

fn call(&mut self, req: RouterRequest) -> Self::Future

Process the request and return the response asynchronously. Read more
Source§

impl<S> Service<RouterRequest> for ToolCallLoggingService<S>
where S: Service<RouterRequest, Response = RouterResponse> + Clone + Send + 'static, S::Error: Send, S::Future: Send,

Source§

type Response = RouterResponse

Responses given by the service.
Source§

type Error = <S as Service<RouterRequest>>::Error

Errors produced by the service.
Source§

type Future = Pin<Box<dyn Future<Output = Result<RouterResponse, <S as Service<RouterRequest>>::Error>> + Send>>

The future response value.
Source§

fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>

Returns Poll::Ready(Ok(())) when the service is able to process requests. Read more
Source§

fn call(&mut self, req: RouterRequest) -> Self::Future

Process the request and return the response asynchronously. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more