fix: gate optional dependencies behind feature flags (#672)
This commit is contained in:
parent
98eef440c6
commit
91e208efb7
4 changed files with 23 additions and 4 deletions
|
|
@ -24,7 +24,9 @@ pub use service::{RoleClient, serve_client};
|
||||||
pub use service::{RoleServer, serve_server};
|
pub use service::{RoleServer, serve_server};
|
||||||
|
|
||||||
pub mod handler;
|
pub mod handler;
|
||||||
|
#[cfg(feature = "server")]
|
||||||
pub mod task_manager;
|
pub mod task_manager;
|
||||||
|
#[cfg(any(feature = "client", feature = "server"))]
|
||||||
pub mod transport;
|
pub mod transport;
|
||||||
|
|
||||||
// re-export
|
// re-export
|
||||||
|
|
@ -32,7 +34,7 @@ pub mod transport;
|
||||||
pub use pastey::paste;
|
pub use pastey::paste;
|
||||||
#[cfg(all(feature = "macros", feature = "server"))]
|
#[cfg(all(feature = "macros", feature = "server"))]
|
||||||
pub use rmcp_macros::*;
|
pub use rmcp_macros::*;
|
||||||
#[cfg(any(feature = "macros", feature = "server"))]
|
#[cfg(any(feature = "server", feature = "schemars"))]
|
||||||
pub use schemars;
|
pub use schemars;
|
||||||
#[cfg(feature = "macros")]
|
#[cfg(feature = "macros")]
|
||||||
pub use serde;
|
pub use serde;
|
||||||
|
|
|
||||||
|
|
@ -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 pastey::paste;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
|
@ -300,6 +303,7 @@ pub struct ServerCapabilities {
|
||||||
pub tasks: Option<TasksCapability>,
|
pub tasks: Option<TasksCapability>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "server", feature = "macros"))]
|
||||||
macro_rules! builder {
|
macro_rules! builder {
|
||||||
($Target: ident {$($f: ident: $T: ty),* $(,)?}) => {
|
($Target: ident {$($f: ident: $T: ty),* $(,)?}) => {
|
||||||
paste! {
|
paste! {
|
||||||
|
|
@ -405,6 +409,7 @@ macro_rules! builder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "server", feature = "macros"))]
|
||||||
builder! {
|
builder! {
|
||||||
ServerCapabilities {
|
ServerCapabilities {
|
||||||
experimental: ExperimentalCapabilities,
|
experimental: ExperimentalCapabilities,
|
||||||
|
|
@ -418,6 +423,7 @@ builder! {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "server", feature = "macros"))]
|
||||||
impl<
|
impl<
|
||||||
const E: bool,
|
const E: bool,
|
||||||
const EXT: bool,
|
const EXT: bool,
|
||||||
|
|
@ -436,6 +442,7 @@ impl<
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "server", feature = "macros"))]
|
||||||
impl<
|
impl<
|
||||||
const E: bool,
|
const E: bool,
|
||||||
const EXT: bool,
|
const EXT: bool,
|
||||||
|
|
@ -454,6 +461,7 @@ impl<
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "server", feature = "macros"))]
|
||||||
impl<
|
impl<
|
||||||
const E: bool,
|
const E: bool,
|
||||||
const EXT: bool,
|
const EXT: bool,
|
||||||
|
|
@ -479,6 +487,7 @@ impl<
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "server", feature = "macros"))]
|
||||||
builder! {
|
builder! {
|
||||||
ClientCapabilities{
|
ClientCapabilities{
|
||||||
experimental: ExperimentalCapabilities,
|
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>
|
impl<const E: bool, const EXT: bool, const S: bool, const EL: bool, const TASKS: bool>
|
||||||
ClientCapabilitiesBuilder<ClientCapabilitiesBuilderState<E, EXT, true, S, EL, TASKS>>
|
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>
|
impl<const E: bool, const EXT: bool, const R: bool, const EL: bool, const TASKS: bool>
|
||||||
ClientCapabilitiesBuilder<ClientCapabilitiesBuilderState<E, EXT, R, true, EL, TASKS>>
|
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>
|
impl<const E: bool, const EXT: bool, const R: bool, const S: bool, const TASKS: bool>
|
||||||
ClientCapabilitiesBuilder<ClientCapabilitiesBuilderState<E, EXT, R, S, true, TASKS>>
|
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(test)]
|
||||||
|
#[cfg(any(feature = "server", feature = "macros"))]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
use std::{borrow::Cow, sync::Arc};
|
use std::{borrow::Cow, sync::Arc};
|
||||||
|
|
||||||
|
#[cfg(feature = "server")]
|
||||||
use schemars::JsonSchema;
|
use schemars::JsonSchema;
|
||||||
/// Tools represent a routine that a server can execute
|
/// Tools represent a routine that a server can execute
|
||||||
/// Tool calls represent requests from the client to execute one
|
/// Tool calls represent requests from the client to execute one
|
||||||
|
|
@ -240,6 +241,7 @@ impl Tool {
|
||||||
/// # Panics
|
/// # Panics
|
||||||
///
|
///
|
||||||
/// Panics if the generated schema does not have root type "object" as required by MCP specification.
|
/// 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 {
|
pub fn with_output_schema<T: JsonSchema + 'static>(mut self) -> Self {
|
||||||
let schema = crate::handler::server::tool::schema_for_output::<T>()
|
let schema = crate::handler::server::tool::schema_for_output::<T>()
|
||||||
.unwrap_or_else(|e| panic!("Invalid output schema for tool '{}': {}", self.name, e));
|
.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
|
/// Set the input schema using a type that implements JsonSchema
|
||||||
|
#[cfg(feature = "server")]
|
||||||
pub fn with_input_schema<T: JsonSchema + 'static>(mut self) -> Self {
|
pub fn with_input_schema<T: JsonSchema + 'static>(mut self) -> Self {
|
||||||
self.input_schema = crate::handler::server::tool::schema_for_type::<T>();
|
self.input_schema = crate::handler::server::tool::schema_for_type::<T>();
|
||||||
self
|
self
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,14 @@
|
||||||
use futures::{FutureExt, future::BoxFuture};
|
use futures::{FutureExt, future::BoxFuture};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
|
#[cfg(feature = "server")]
|
||||||
|
use crate::model::ServerJsonRpcMessage;
|
||||||
use crate::{
|
use crate::{
|
||||||
error::ErrorData as McpError,
|
error::ErrorData as McpError,
|
||||||
model::{
|
model::{
|
||||||
CancelledNotification, CancelledNotificationParam, Extensions, GetExtensions, GetMeta,
|
CancelledNotification, CancelledNotificationParam, Extensions, GetExtensions, GetMeta,
|
||||||
JsonRpcError, JsonRpcMessage, JsonRpcNotification, JsonRpcRequest, JsonRpcResponse, Meta,
|
JsonRpcError, JsonRpcMessage, JsonRpcNotification, JsonRpcRequest, JsonRpcResponse, Meta,
|
||||||
NumberOrString, ProgressToken, RequestId, ServerJsonRpcMessage,
|
NumberOrString, ProgressToken, RequestId,
|
||||||
},
|
},
|
||||||
transport::{DynamicTransportError, IntoTransport, Transport},
|
transport::{DynamicTransportError, IntoTransport, Transport},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue