fix: gate optional dependencies behind feature flags (#672)

This commit is contained in:
Dale Seo 2026-02-24 11:02:28 -05:00 committed by GitHub
parent 98eef440c6
commit 91e208efb7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 23 additions and 4 deletions

View file

@ -24,7 +24,9 @@ pub use service::{RoleClient, serve_client};
pub use service::{RoleServer, serve_server};
pub mod handler;
#[cfg(feature = "server")]
pub mod task_manager;
#[cfg(any(feature = "client", feature = "server"))]
pub mod transport;
// re-export
@ -32,7 +34,7 @@ pub mod transport;
pub use pastey::paste;
#[cfg(all(feature = "macros", feature = "server"))]
pub use rmcp_macros::*;
#[cfg(any(feature = "macros", feature = "server"))]
#[cfg(any(feature = "server", feature = "schemars"))]
pub use schemars;
#[cfg(feature = "macros")]
pub use serde;

View file

@ -1,5 +1,8 @@
use std::{collections::BTreeMap, marker::PhantomData};
use std::collections::BTreeMap;
#[cfg(any(feature = "server", feature = "macros"))]
use std::marker::PhantomData;
#[cfg(any(feature = "server", feature = "macros"))]
use pastey::paste;
use serde::{Deserialize, Serialize};
@ -300,6 +303,7 @@ pub struct ServerCapabilities {
pub tasks: Option<TasksCapability>,
}
#[cfg(any(feature = "server", feature = "macros"))]
macro_rules! builder {
($Target: ident {$($f: ident: $T: ty),* $(,)?}) => {
paste! {
@ -405,6 +409,7 @@ macro_rules! builder {
}
}
#[cfg(any(feature = "server", feature = "macros"))]
builder! {
ServerCapabilities {
experimental: ExperimentalCapabilities,
@ -418,6 +423,7 @@ builder! {
}
}
#[cfg(any(feature = "server", feature = "macros"))]
impl<
const E: bool,
const EXT: bool,
@ -436,6 +442,7 @@ impl<
}
}
#[cfg(any(feature = "server", feature = "macros"))]
impl<
const E: bool,
const EXT: bool,
@ -454,6 +461,7 @@ impl<
}
}
#[cfg(any(feature = "server", feature = "macros"))]
impl<
const E: bool,
const EXT: bool,
@ -479,6 +487,7 @@ impl<
}
}
#[cfg(any(feature = "server", feature = "macros"))]
builder! {
ClientCapabilities{
experimental: ExperimentalCapabilities,
@ -490,6 +499,7 @@ builder! {
}
}
#[cfg(any(feature = "server", feature = "macros"))]
impl<const E: bool, const EXT: bool, const S: bool, const EL: bool, const TASKS: bool>
ClientCapabilitiesBuilder<ClientCapabilitiesBuilderState<E, EXT, true, S, EL, TASKS>>
{
@ -501,6 +511,7 @@ impl<const E: bool, const EXT: bool, const S: bool, const EL: bool, const TASKS:
}
}
#[cfg(any(feature = "server", feature = "macros"))]
impl<const E: bool, const EXT: bool, const R: bool, const EL: bool, const TASKS: bool>
ClientCapabilitiesBuilder<ClientCapabilitiesBuilderState<E, EXT, R, true, EL, TASKS>>
{
@ -521,7 +532,7 @@ impl<const E: bool, const EXT: bool, const R: bool, const EL: bool, const TASKS:
}
}
#[cfg(feature = "elicitation")]
#[cfg(all(feature = "elicitation", any(feature = "server", feature = "macros")))]
impl<const E: bool, const EXT: bool, const R: bool, const S: bool, const TASKS: bool>
ClientCapabilitiesBuilder<ClientCapabilitiesBuilderState<E, EXT, R, S, true, TASKS>>
{
@ -539,6 +550,7 @@ impl<const E: bool, const EXT: bool, const R: bool, const S: bool, const TASKS:
}
#[cfg(test)]
#[cfg(any(feature = "server", feature = "macros"))]
mod test {
use super::*;
#[test]

View file

@ -1,5 +1,6 @@
use std::{borrow::Cow, sync::Arc};
#[cfg(feature = "server")]
use schemars::JsonSchema;
/// Tools represent a routine that a server can execute
/// Tool calls represent requests from the client to execute one
@ -240,6 +241,7 @@ impl Tool {
/// # Panics
///
/// Panics if the generated schema does not have root type "object" as required by MCP specification.
#[cfg(feature = "server")]
pub fn with_output_schema<T: JsonSchema + 'static>(mut self) -> Self {
let schema = crate::handler::server::tool::schema_for_output::<T>()
.unwrap_or_else(|e| panic!("Invalid output schema for tool '{}': {}", self.name, e));
@ -248,6 +250,7 @@ impl Tool {
}
/// Set the input schema using a type that implements JsonSchema
#[cfg(feature = "server")]
pub fn with_input_schema<T: JsonSchema + 'static>(mut self) -> Self {
self.input_schema = crate::handler::server::tool::schema_for_type::<T>();
self

View file

@ -1,12 +1,14 @@
use futures::{FutureExt, future::BoxFuture};
use thiserror::Error;
#[cfg(feature = "server")]
use crate::model::ServerJsonRpcMessage;
use crate::{
error::ErrorData as McpError,
model::{
CancelledNotification, CancelledNotificationParam, Extensions, GetExtensions, GetMeta,
JsonRpcError, JsonRpcMessage, JsonRpcNotification, JsonRpcRequest, JsonRpcResponse, Meta,
NumberOrString, ProgressToken, RequestId, ServerJsonRpcMessage,
NumberOrString, ProgressToken, RequestId,
},
transport::{DynamicTransportError, IntoTransport, Transport},
};