feat(model): add ServerConfig and ClientConfig (#1266)
This commit is contained in:
parent
fbfc5cc96e
commit
165ff92df1
6 changed files with 331 additions and 303 deletions
|
|
@ -274,8 +274,8 @@ macro_rules! client_handler_methods {
|
|||
std::future::ready(())
|
||||
}
|
||||
|
||||
fn get_info(&self) -> ClientInfo {
|
||||
InitializeRequestParams::default()
|
||||
fn get_info(&self) -> ClientConfig {
|
||||
ClientConfig::default()
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
@ -292,12 +292,12 @@ pub trait ClientHandler: Sized + 'static {
|
|||
client_handler_methods!();
|
||||
}
|
||||
|
||||
/// Do nothing, with default client info.
|
||||
/// Do nothing, with the default client config.
|
||||
impl ClientHandler for () {}
|
||||
|
||||
/// Do nothing, with a specific client info.
|
||||
impl ClientHandler for ClientInfo {
|
||||
fn get_info(&self) -> ClientInfo {
|
||||
/// Do nothing, with a specific client config.
|
||||
impl ClientHandler for ClientConfig {
|
||||
fn get_info(&self) -> ClientConfig {
|
||||
self.clone()
|
||||
}
|
||||
}
|
||||
|
|
@ -422,7 +422,7 @@ macro_rules! impl_client_handler_for_wrapper {
|
|||
(**self).on_custom_notification(notification, context)
|
||||
}
|
||||
|
||||
fn get_info(&self) -> ClientInfo {
|
||||
fn get_info(&self) -> ClientConfig {
|
||||
(**self).get_info()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -334,15 +334,15 @@ macro_rules! server_handler_methods {
|
|||
/// ```
|
||||
/// use rmcp::{
|
||||
/// ErrorData as McpError, RoleServer, ServerHandler,
|
||||
/// model::{InitializeRequestParams, InitializeResult, ServerInfo},
|
||||
/// model::{InitializeRequestParams, InitializeResult, ServerConfig},
|
||||
/// service::RequestContext,
|
||||
/// };
|
||||
///
|
||||
/// struct MyServer;
|
||||
///
|
||||
/// impl ServerHandler for MyServer {
|
||||
/// fn get_info(&self) -> ServerInfo {
|
||||
/// ServerInfo::default()
|
||||
/// fn get_info(&self) -> ServerConfig {
|
||||
/// ServerConfig::default()
|
||||
/// }
|
||||
///
|
||||
/// async fn initialize(
|
||||
|
|
@ -600,8 +600,8 @@ macro_rules! server_handler_methods {
|
|||
std::future::ready(())
|
||||
}
|
||||
|
||||
fn get_info(&self) -> ServerInfo {
|
||||
InitializeResult::default()
|
||||
fn get_info(&self) -> ServerConfig {
|
||||
ServerConfig::default()
|
||||
}
|
||||
|
||||
/// SEP-2663 `tasks/get`: return the current [`DetailedTask`] state.
|
||||
|
|
@ -839,7 +839,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
(**self).on_custom_notification(notification, context)
|
||||
}
|
||||
|
||||
fn get_info(&self) -> ServerInfo {
|
||||
fn get_info(&self) -> ServerConfig {
|
||||
(**self).get_info()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1119,26 +1119,58 @@ impl InitializeResult {
|
|||
}
|
||||
}
|
||||
|
||||
/// Full server initialize payload (`InitializeResult`).
|
||||
/// A server's own configuration: the protocol version, capabilities,
|
||||
/// implementation identity, and instructions it advertises to clients.
|
||||
///
|
||||
/// Prefer [`InitializeResult`]. The name collides with the protocol's
|
||||
/// `serverInfo` field, which is only the [`Implementation`] identity (#1082).
|
||||
//
|
||||
// The signatures this crate publishes (`ServerHandler::get_info`,
|
||||
// `DiscoverResult::from_server_info`, and the `ClientInfo` equivalents below)
|
||||
// keep spelling the alias. It resolves to the same type, so the spelling makes
|
||||
// no difference to callers, but rustdoc records the name as written and the
|
||||
// public API check treats a respelling as a changed item. Moving those
|
||||
// signatures onto the canonical names is a documented API change and belongs in
|
||||
// the next major release.
|
||||
#[deprecated(note = "use `InitializeResult` instead")]
|
||||
/// This is what `ServerHandler::get_info` returns. It is an alias for
|
||||
/// [`InitializeResult`] because the same value is sent as the `initialize`
|
||||
/// response on the wire.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use rmcp::model::{ServerCapabilities, ServerConfig};
|
||||
///
|
||||
/// let config = ServerConfig::new(ServerCapabilities::builder().enable_tools().build())
|
||||
/// .with_instructions("Call `add` to sum two numbers.");
|
||||
/// assert!(config.capabilities.tools.is_some());
|
||||
/// ```
|
||||
pub type ServerConfig = InitializeResult;
|
||||
|
||||
/// A client's own configuration: the protocol version, capabilities, and
|
||||
/// implementation identity it advertises to servers.
|
||||
///
|
||||
/// This is what `ClientHandler::get_info` returns. It is an alias for
|
||||
/// [`InitializeRequestParams`] because the same value is sent as the
|
||||
/// `initialize` request on the wire.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use rmcp::model::{ClientCapabilities, ClientConfig, Implementation};
|
||||
///
|
||||
/// let config = ClientConfig::new(
|
||||
/// ClientCapabilities::builder().enable_elicitation().build(),
|
||||
/// Implementation::new("my-client", "1.0.0"),
|
||||
/// );
|
||||
/// assert!(config.capabilities.elicitation.is_some());
|
||||
/// ```
|
||||
pub type ClientConfig = InitializeRequestParams;
|
||||
|
||||
/// Deprecated alias for [`ServerConfig`].
|
||||
///
|
||||
/// The name collides with the protocol's `serverInfo` field, which is only the
|
||||
/// [`Implementation`] identity, so `server_info.server_info` was easy to
|
||||
/// misread (#1082).
|
||||
#[deprecated(note = "use `ServerConfig` instead")]
|
||||
pub type ServerInfo = InitializeResult;
|
||||
|
||||
/// Full client initialize params (`InitializeRequestParams`).
|
||||
/// Deprecated alias for [`ClientConfig`].
|
||||
///
|
||||
/// Prefer [`InitializeRequestParams`]. The name collides with the protocol's
|
||||
/// `clientInfo` field, which is only the [`Implementation`] identity (#1082).
|
||||
#[deprecated(note = "use `InitializeRequestParams` instead")]
|
||||
/// The name collides with the protocol's `clientInfo` field, which is only the
|
||||
/// [`Implementation`] identity, so `client_info.client_info` was easy to
|
||||
/// misread (#1082).
|
||||
#[deprecated(note = "use `ClientConfig` instead")]
|
||||
pub type ClientInfo = InitializeRequestParams;
|
||||
|
||||
/// Information negotiated about a server peer.
|
||||
|
|
@ -1298,18 +1330,18 @@ impl DiscoverResult {
|
|||
self
|
||||
}
|
||||
|
||||
/// Create a discovery result from the server's initialization information.
|
||||
/// Create a discovery result from the server's configuration.
|
||||
pub fn from_server_info(
|
||||
supported_versions: Vec<ProtocolVersion>,
|
||||
server_info: ServerInfo,
|
||||
server_config: ServerConfig,
|
||||
) -> Self {
|
||||
let InitializeResult {
|
||||
let ServerConfig {
|
||||
capabilities,
|
||||
server_info,
|
||||
instructions,
|
||||
meta,
|
||||
..
|
||||
} = server_info;
|
||||
} = server_config;
|
||||
let mut result = Self {
|
||||
result_type: ResultType::COMPLETE,
|
||||
supported_versions,
|
||||
|
|
|
|||
|
|
@ -13,10 +13,10 @@ use crate::{
|
|||
model::{
|
||||
ArgumentInfo, CacheScope, CallToolRequest, CallToolRequestParams, CallToolResponse,
|
||||
CallToolResult, CancelTaskParams, CancelTaskRequest, CancelledNotification,
|
||||
CancelledNotificationParam, ClientJsonRpcMessage, ClientNotification, ClientRequest,
|
||||
ClientResult, CompleteRequest, CompleteRequestParams, CompleteResult, CompletionContext,
|
||||
CompletionInfo, DEFAULT_MRTR_MAX_ROUNDS, DiscoverRequest, DiscoverRequestParams,
|
||||
DiscoverResult, ErrorData, GetExtensions, GetMeta, GetPromptRequest,
|
||||
CancelledNotificationParam, ClientConfig, ClientJsonRpcMessage, ClientNotification,
|
||||
ClientRequest, ClientResult, CompleteRequest, CompleteRequestParams, CompleteResult,
|
||||
CompletionContext, CompletionInfo, DEFAULT_MRTR_MAX_ROUNDS, DiscoverRequest,
|
||||
DiscoverRequestParams, DiscoverResult, ErrorData, GetExtensions, GetMeta, GetPromptRequest,
|
||||
GetPromptRequestParams, GetPromptResponse, GetPromptResult, GetTaskParams, GetTaskRequest,
|
||||
GetTaskResult, InitializeRequest, InitializeRequestParams, InitializedNotification,
|
||||
InputRequest, InputRequiredResult, InputResponses, JsonRpcResponse, ListPromptsRequest,
|
||||
|
|
@ -266,7 +266,7 @@ impl ServiceRole for RoleClient {
|
|||
type PeerReq = ServerRequest;
|
||||
type PeerResp = ServerResult;
|
||||
type PeerNot = ServerNotification;
|
||||
type Info = InitializeRequestParams;
|
||||
type Info = ClientConfig;
|
||||
type PeerInfo = ServerPeerInfo;
|
||||
type InitializeError = ClientInitializeError;
|
||||
const IS_CLIENT: bool = true;
|
||||
|
|
|
|||
|
|
@ -16,13 +16,13 @@ use crate::{
|
|||
CancelledNotification, CancelledNotificationParam, ClientJsonRpcMessage,
|
||||
ClientNotification, ClientRequest, ClientResult, CreateMessageRequest,
|
||||
CreateMessageRequestParams, CreateMessageResult, EmptyResult, ErrorData,
|
||||
InitializeRequestParams, InitializeResult, ListRootsRequest, ListRootsResult,
|
||||
LoggingMessageNotification, LoggingMessageNotificationParam, ProgressNotification,
|
||||
ProgressNotificationParam, PromptListChangedNotification, ProtocolVersion,
|
||||
ResourceListChangedNotification, ResourceUpdatedNotification,
|
||||
ResourceUpdatedNotificationParam, ServerNotification, ServerRequest, ServerResult,
|
||||
SubscriptionFilter, SubscriptionsAcknowledgedNotification,
|
||||
SubscriptionsAcknowledgedNotificationParams, ToolListChangedNotification,
|
||||
InitializeRequestParams, ListRootsRequest, ListRootsResult, LoggingMessageNotification,
|
||||
LoggingMessageNotificationParam, ProgressNotification, ProgressNotificationParam,
|
||||
PromptListChangedNotification, ProtocolVersion, ResourceListChangedNotification,
|
||||
ResourceUpdatedNotification, ResourceUpdatedNotificationParam, ServerConfig,
|
||||
ServerNotification, ServerRequest, ServerResult, SubscriptionFilter,
|
||||
SubscriptionsAcknowledgedNotification, SubscriptionsAcknowledgedNotificationParams,
|
||||
ToolListChangedNotification,
|
||||
},
|
||||
transport::DynamicTransportError,
|
||||
};
|
||||
|
|
@ -38,7 +38,7 @@ impl ServiceRole for RoleServer {
|
|||
type PeerReq = ClientRequest;
|
||||
type PeerResp = ClientResult;
|
||||
type PeerNot = ClientNotification;
|
||||
type Info = InitializeResult;
|
||||
type Info = ServerConfig;
|
||||
type PeerInfo = InitializeRequestParams;
|
||||
|
||||
type InitializeError = ServerInitializeError;
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@ use crate::{
|
|||
model::{
|
||||
ClientCapabilities, ClientJsonRpcMessage, ClientNotification, ClientRequest, ErrorCode,
|
||||
ErrorData, GetExtensions, GetMeta, Implementation, InitializeRequest,
|
||||
InitializeRequestParams, InitializeResult, InitializedNotification, JsonObject,
|
||||
JsonRpcError, ProtocolVersion, RequestId, ServerJsonRpcMessage, ServerResult,
|
||||
InitializeRequestParams, InitializedNotification, JsonObject, JsonRpcError,
|
||||
ProtocolVersion, RequestId, ServerConfig, ServerJsonRpcMessage, ServerResult,
|
||||
},
|
||||
serve_server,
|
||||
service::{
|
||||
|
|
@ -367,7 +367,7 @@ impl<S: Service<RoleServer>> Service<RoleServer> for NegotiatingStatelessHttpSer
|
|||
self.0.handle_notification(notification, context).await
|
||||
}
|
||||
|
||||
fn get_info(&self) -> InitializeResult {
|
||||
fn get_info(&self) -> ServerConfig {
|
||||
self.0.get_info()
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue