feat(model): add ServerConfig and ClientConfig (#1266)
This commit is contained in:
parent
fbfc5cc96e
commit
165ff92df1
16 changed files with 331 additions and 303 deletions
|
|
@ -3,7 +3,7 @@ use std::env;
|
|||
use anyhow::{Context, Result};
|
||||
use rmcp::{
|
||||
ServiceExt,
|
||||
model::InitializeRequestParams,
|
||||
model::ClientConfig,
|
||||
transport::{
|
||||
StreamableHttpClientTransport,
|
||||
auth::{AuthClient, ClientCredentialsConfig, OAuthState},
|
||||
|
|
@ -73,7 +73,7 @@ async fn main() -> Result<()> {
|
|||
);
|
||||
|
||||
// Connect to MCP server and list tools
|
||||
let client_service = InitializeRequestParams::default();
|
||||
let client_service = ClientConfig::default();
|
||||
let client = client_service.serve(transport).await?;
|
||||
tracing::info!("Connected to MCP server");
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ use axum::{
|
|||
};
|
||||
use rmcp::{
|
||||
RoleClient, ServiceExt,
|
||||
model::InitializeRequestParams,
|
||||
model::ClientConfig,
|
||||
service::RunningService,
|
||||
transport::{
|
||||
StreamableHttpClientTransport,
|
||||
|
|
@ -58,7 +58,7 @@ async fn callback_handler(
|
|||
|
||||
enum ConnectOutcome {
|
||||
/// The server accepted the unauthenticated connection.
|
||||
Connected(RunningService<RoleClient, InitializeRequestParams>),
|
||||
Connected(RunningService<RoleClient, ClientConfig>),
|
||||
/// The server answered 401; authorize with this `WWW-Authenticate`
|
||||
/// challenge and reconnect.
|
||||
AuthRequired(String),
|
||||
|
|
@ -72,7 +72,7 @@ async fn try_connect(http_client: reqwest::Client, server_url: &str) -> Result<C
|
|||
http_client,
|
||||
StreamableHttpClientTransportConfig::with_uri(server_url),
|
||||
);
|
||||
match InitializeRequestParams::default().serve(transport).await {
|
||||
match ClientConfig::default().serve(transport).await {
|
||||
Ok(client) => Ok(ConnectOutcome::Connected(client)),
|
||||
Err(error) => match error.auth_challenge() {
|
||||
Some(challenge) => Ok(ConnectOutcome::AuthRequired(challenge.to_string())),
|
||||
|
|
@ -90,7 +90,7 @@ async fn authorize_and_connect(
|
|||
client_metadata_url: &str,
|
||||
code_receiver: oneshot::Receiver<CallbackParams>,
|
||||
output: &mut BufWriter<tokio::io::Stdout>,
|
||||
) -> Result<RunningService<RoleClient, InitializeRequestParams>> {
|
||||
) -> Result<RunningService<RoleClient, ClientConfig>> {
|
||||
tracing::info!("Server requires authorization: {challenge}");
|
||||
|
||||
// initialize oauth state machine
|
||||
|
|
@ -156,7 +156,7 @@ async fn authorize_and_connect(
|
|||
auth_client,
|
||||
StreamableHttpClientTransportConfig::with_uri(server_url),
|
||||
);
|
||||
Ok(InitializeRequestParams::default().serve(transport).await?)
|
||||
Ok(ClientConfig::default().serve(transport).await?)
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ use clap::{Parser, ValueEnum};
|
|||
use rmcp::{
|
||||
ClientHandler, ServiceExt,
|
||||
model::{
|
||||
CallToolRequestParams, ClientCapabilities, Implementation, InitializeRequestParams,
|
||||
CallToolRequestParams, ClientCapabilities, ClientConfig, Implementation,
|
||||
ProgressNotificationParam,
|
||||
},
|
||||
service::{NotificationContext, RoleClient},
|
||||
|
|
@ -121,8 +121,8 @@ impl ClientHandler for ProgressAwareClient {
|
|||
}
|
||||
}
|
||||
|
||||
fn get_info(&self) -> InitializeRequestParams {
|
||||
InitializeRequestParams::new(
|
||||
fn get_info(&self) -> ClientConfig {
|
||||
ClientConfig::new(
|
||||
ClientCapabilities::default(),
|
||||
Implementation::new("progress-test-client", "1.0.0"),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -2,8 +2,7 @@ use anyhow::Result;
|
|||
use rmcp::{
|
||||
ClientLifecycleMode, ClientServiceExt,
|
||||
model::{
|
||||
CallToolRequestParams, ClientCapabilities, Implementation, InitializeRequestParams,
|
||||
ProtocolVersion,
|
||||
CallToolRequestParams, ClientCapabilities, ClientConfig, Implementation, ProtocolVersion,
|
||||
},
|
||||
transport::StreamableHttpClientTransport,
|
||||
};
|
||||
|
|
@ -19,7 +18,7 @@ async fn main() -> Result<()> {
|
|||
.with(tracing_subscriber::fmt::layer())
|
||||
.init();
|
||||
let transport = StreamableHttpClientTransport::from_uri("http://localhost:8000/mcp");
|
||||
let client_info = InitializeRequestParams::new(
|
||||
let client_info = ClientConfig::new(
|
||||
ClientCapabilities::default(),
|
||||
Implementation::new("streamable-http-client", "0.0.1"),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
use rmcp::{
|
||||
ClientLifecycleMode, ClientServiceExt,
|
||||
model::{InitializeRequestParams, ProtocolVersion, SubscriptionFilter},
|
||||
model::{ClientConfig, ProtocolVersion, SubscriptionFilter},
|
||||
transport::StreamableHttpClientTransport,
|
||||
};
|
||||
|
||||
|
|
@ -13,7 +13,7 @@ async fn main() -> anyhow::Result<()> {
|
|||
.init();
|
||||
|
||||
let transport = StreamableHttpClientTransport::from_uri("http://127.0.0.1:8000/mcp");
|
||||
let client = InitializeRequestParams::default()
|
||||
let client = ClientConfig::default()
|
||||
.serve_with_lifecycle(
|
||||
transport,
|
||||
ClientLifecycleMode::Discover {
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ async fn main() -> Result<()> {
|
|||
.init();
|
||||
|
||||
// Declare the tasks extension in our client capabilities (SEP-2663).
|
||||
let client_info = rmcp::model::InitializeRequestParams::new(
|
||||
let client_info = rmcp::model::ClientConfig::new(
|
||||
ClientCapabilities::builder().enable_tasks().build(),
|
||||
rmcp::model::Implementation::from_build_env(),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -206,8 +206,8 @@ impl Counter {
|
|||
#[tool_handler(meta = MetaObject(rmcp::object!({"tool_meta_key": "tool_meta_value"})))]
|
||||
#[prompt_handler(meta = MetaObject(rmcp::object!({"router_meta_key": "router_meta_value"})))]
|
||||
impl ServerHandler for Counter {
|
||||
fn get_info(&self) -> InitializeResult {
|
||||
InitializeResult::new(
|
||||
fn get_info(&self) -> ServerConfig {
|
||||
ServerConfig::new(
|
||||
ServerCapabilities::builder()
|
||||
.enable_prompts()
|
||||
.enable_resources()
|
||||
|
|
|
|||
|
|
@ -131,8 +131,8 @@ impl ProgressDemo {
|
|||
|
||||
#[tool_handler]
|
||||
impl ServerHandler for ProgressDemo {
|
||||
fn get_info(&self) -> InitializeResult {
|
||||
InitializeResult::new(ServerCapabilities::builder().enable_tools().build())
|
||||
fn get_info(&self) -> ServerConfig {
|
||||
ServerConfig::new(ServerCapabilities::builder().enable_tools().build())
|
||||
.with_protocol_version(ProtocolVersion::V_2024_11_05)
|
||||
.with_server_info(Implementation::from_build_env())
|
||||
.with_instructions(
|
||||
|
|
|
|||
|
|
@ -151,8 +151,8 @@ impl ServerHandler for TaskDemo {
|
|||
self.tasks.cancel_task(&request.task_id)
|
||||
}
|
||||
|
||||
fn get_info(&self) -> InitializeResult {
|
||||
InitializeResult::new(
|
||||
fn get_info(&self) -> ServerConfig {
|
||||
ServerConfig::new(
|
||||
ServerCapabilities::builder()
|
||||
.enable_tools()
|
||||
.enable_tasks()
|
||||
|
|
|
|||
|
|
@ -310,8 +310,8 @@ impl SqlQueryServer {
|
|||
|
||||
#[prompt_handler(router = self.prompt_router)]
|
||||
impl ServerHandler for SqlQueryServer {
|
||||
fn get_info(&self) -> InitializeResult {
|
||||
InitializeResult::new(
|
||||
fn get_info(&self) -> ServerConfig {
|
||||
ServerConfig::new(
|
||||
ServerCapabilities::builder()
|
||||
.enable_completions()
|
||||
.enable_prompts()
|
||||
|
|
|
|||
|
|
@ -155,8 +155,8 @@ impl ElicitationEnumFormServer {
|
|||
|
||||
#[tool_handler(router = self.tool_router)]
|
||||
impl ServerHandler for ElicitationEnumFormServer {
|
||||
fn get_info(&self) -> InitializeResult {
|
||||
InitializeResult::new(ServerCapabilities::builder().enable_tools().build())
|
||||
fn get_info(&self) -> ServerConfig {
|
||||
ServerConfig::new(ServerCapabilities::builder().enable_tools().build())
|
||||
.with_server_info(Implementation::from_build_env())
|
||||
.with_instructions(
|
||||
"Simple server demonstrating elicitation for enum selection".to_string(),
|
||||
|
|
|
|||
|
|
@ -147,8 +147,8 @@ impl ElicitationServer {
|
|||
|
||||
#[tool_handler(router = self.tool_router)]
|
||||
impl ServerHandler for ElicitationServer {
|
||||
fn get_info(&self) -> InitializeResult {
|
||||
InitializeResult::new(ServerCapabilities::builder().enable_tools().build())
|
||||
fn get_info(&self) -> ServerConfig {
|
||||
ServerConfig::new(ServerCapabilities::builder().enable_tools().build())
|
||||
.with_server_info(Implementation::from_build_env())
|
||||
.with_instructions(
|
||||
"Simple server demonstrating elicitation for user name collection".to_string(),
|
||||
|
|
|
|||
|
|
@ -113,8 +113,8 @@ fn finish_weather_request(
|
|||
}
|
||||
|
||||
impl ServerHandler for WeatherServer {
|
||||
fn get_info(&self) -> InitializeResult {
|
||||
let mut info = InitializeResult::new(ServerCapabilities::builder().enable_tools().build());
|
||||
fn get_info(&self) -> ServerConfig {
|
||||
let mut info = ServerConfig::new(ServerCapabilities::builder().enable_tools().build());
|
||||
// MRTR requires 2026-07-28 or newer.
|
||||
info.protocol_version = ProtocolVersion::V_2026_07_28;
|
||||
info
|
||||
|
|
@ -173,8 +173,8 @@ impl ServerHandler for WeatherServer {
|
|||
struct InteractiveClient;
|
||||
|
||||
impl ClientHandler for InteractiveClient {
|
||||
fn get_info(&self) -> InitializeRequestParams {
|
||||
InitializeRequestParams::new(
|
||||
fn get_info(&self) -> ClientConfig {
|
||||
ClientConfig::new(
|
||||
ClientCapabilities::builder().enable_elicitation().build(),
|
||||
Implementation::new("mrtr-example-client", env!("CARGO_PKG_VERSION")),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -363,13 +363,12 @@ impl PromptServer {
|
|||
|
||||
#[prompt_handler(router = self.prompt_router)]
|
||||
impl ServerHandler for PromptServer {
|
||||
fn get_info(&self) -> InitializeResult {
|
||||
InitializeResult::new(ServerCapabilities::builder().enable_prompts().build())
|
||||
.with_instructions(
|
||||
"This server provides various prompt templates for code review, data analysis, \
|
||||
fn get_info(&self) -> ServerConfig {
|
||||
ServerConfig::new(ServerCapabilities::builder().enable_prompts().build()).with_instructions(
|
||||
"This server provides various prompt templates for code review, data analysis, \
|
||||
writing assistance, debugging help, and personalized learning paths. \
|
||||
All prompts are designed to provide structured, context-aware assistance.",
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -21,8 +21,8 @@ use tracing_subscriber::{self, EnvFilter};
|
|||
pub struct SamplingDemoServer;
|
||||
|
||||
impl ServerHandler for SamplingDemoServer {
|
||||
fn get_info(&self) -> InitializeResult {
|
||||
InitializeResult::new(ServerCapabilities::builder().enable_tools().build())
|
||||
fn get_info(&self) -> ServerConfig {
|
||||
ServerConfig::new(ServerCapabilities::builder().enable_tools().build())
|
||||
.with_instructions(concat!(
|
||||
"This is a demo server that requests sampling from clients. It provides tools that use LLM capabilities.\n\n",
|
||||
"IMPORTANT: This server requires a client that supports the 'sampling/createMessage' method. ",
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ use std::{borrow::Cow, time::Duration};
|
|||
|
||||
use rmcp::{
|
||||
ErrorData, ServerHandler,
|
||||
model::{InitializeResult, ProtocolVersion, ServerCapabilities, SubscriptionFilter},
|
||||
model::{ProtocolVersion, ServerCapabilities, ServerConfig, SubscriptionFilter},
|
||||
service::SubscriptionContext,
|
||||
transport::streamable_http_server::{
|
||||
StreamableHttpServerConfig, StreamableHttpService, session::local::LocalSessionManager,
|
||||
|
|
@ -18,8 +18,8 @@ impl ServerHandler for SubscriptionServer {
|
|||
Cow::Borrowed(&[ProtocolVersion::V_2026_07_28])
|
||||
}
|
||||
|
||||
fn get_info(&self) -> InitializeResult {
|
||||
InitializeResult::new(
|
||||
fn get_info(&self) -> ServerConfig {
|
||||
ServerConfig::new(
|
||||
ServerCapabilities::builder()
|
||||
.enable_tools()
|
||||
.enable_tool_list_changed()
|
||||
|
|
|
|||
Loading…
Reference in a new issue