Skip to main content

McpServer

Struct McpServer 

Source
pub struct McpServer { /* private fields */ }
Expand description

The main handle for the MCP integration.

McpServer can be attached to a RustApi instance (via its OpenAPI spec) to automatically discover tools. Tool invocations (in later milestones) will be driven through the normal RustAPI handler pipeline.

Implementations§

Source§

impl McpServer

Source

pub fn new(config: McpConfig) -> Self

Create a new MCP server with the given configuration.

Source

pub fn from_rustapi(app: &RustApi, config: McpConfig) -> Self

Create an MCP server pre-attached to a RustApi instance.

This is the most ergonomic way when you already have a built RustApi. If invocation_mode is InProcess or Auto, a direct in-process dispatcher is captured for zero-overhead tool calls (see RequestInvoker).

Source

pub fn from_spec(config: McpConfig, spec: &OpenApiSpec) -> Self

Create from an explicit OpenAPI spec.

Source

pub fn with_openapi(self, spec: OpenApiSpec) -> Self

Attach (or replace) the OpenAPI spec used for discovery.

Call this after RustApi::auto() / builder if you built the app first.

Source

pub fn with_http_base(self, base: impl Into<String>) -> Self

Configure the base URL of the main RustAPI HTTP server.

When set, tools/call will proxy the call over HTTP to this base (typically “http://127.0.0.1:8080” when using the concurrent runner). This guarantees that tool invocations go through the exact same middleware, auth, validation, and handler code as normal traffic.

Source

pub fn config(&self) -> &McpConfig

Get a reference to the active configuration.

Source

pub fn capabilities(&self) -> Vec<McpCapability>

Return the capabilities this server currently advertises.

Source

pub fn initialize(&self) -> InitializeResult

Perform the initialize handshake.

MCP clients call this first. Returns server info + supported capabilities.

Source

pub async fn list_tools(&self) -> Result<Vec<McpTool>>

Discover and return the list of tools that should be exposed to MCP clients.

Tools are derived from the attached OpenAPI spec (from RustApi), filtered according to McpConfig::allowed_tags and allowed_path_prefixes.

Source

pub async fn call_tool(&self, req: ToolCallRequest) -> Result<ToolCallResponse>

Execute a tool call by proxying it as a real HTTP request to the main RustAPI server (using the configured http_base).

This is the heart of Native MCP: the call goes through your normal layers, interceptors, extractors, validation, error handling, etc.

Source§

impl McpServer

Source

pub async fn serve(self, addr: &str) -> Result<()>

Start serving the MCP protocol over HTTP on the given address.

This starts a sidecar HTTP server (separate from your main RustAPI HTTP server) that MCP clients (Claude, etc.) can connect to for tool discovery and invocation.

Supports a minimal JSON-RPC over POST transport for:

  • initialize
  • tools/list
  • tools/call (proxies to the main RustAPI server so full middleware / validation / error handling applies)
Source

pub async fn serve_with_shutdown<F>(self, addr: &str, signal: F) -> Result<()>
where F: Future<Output = ()> + Send + 'static,

Like serve, but with a shutdown signal (e.g. ctrl_c()).

Trait Implementations§

Source§

impl Clone for McpServer

Source§

fn clone(&self) -> McpServer

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for McpServer

Source§

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

Formats the value using the given formatter. 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> 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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

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

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
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