Update to rmcp 1.1.0 (#7619)

Co-authored-by: Alex Hancock <alexhancock@block.xyz>
This commit is contained in:
Jack Amadeo
2026-03-05 21:40:52 -05:00
committed by GitHub
parent abadb87892
commit 325bf396af
61 changed files with 729 additions and 1757 deletions
+72 -142
View File
@@ -3,21 +3,19 @@ use crate::agents::types::SharedProvider;
use crate::session_context::{SESSION_ID_HEADER, WORKING_DIR_HEADER};
use rmcp::model::{
CreateElicitationRequestParams, CreateElicitationResult, ElicitationAction, ErrorCode,
ExtensionCapabilities, Extensions, JsonObject, Meta, SamplingMessageContent,
ExtensionCapabilities, Extensions, JsonObject, LoggingMessageNotification, Meta,
SamplingMessageContent,
};
/// MCP client implementation for Goose
use rmcp::{
model::{
CallToolRequest, CallToolRequestParams, CallToolResult, CancelledNotification,
CancelledNotificationMethod, CancelledNotificationParam, ClientCapabilities, ClientInfo,
ClientRequest, CreateMessageRequestParams, CreateMessageResult, GetPromptRequest,
GetPromptRequestParams, GetPromptResult, Implementation, InitializeResult,
ListPromptsRequest, ListPromptsResult, ListResourcesRequest, ListResourcesResult,
ListToolsRequest, ListToolsResult, LoggingMessageNotification,
LoggingMessageNotificationMethod, PaginatedRequestParams, ProgressNotification,
ProgressNotificationMethod, ProtocolVersion, ReadResourceRequest,
ReadResourceRequestParams, ReadResourceResult, RequestId, Role, SamplingMessage,
ServerNotification, ServerResult,
CallToolRequestParams, CallToolResult, CancelledNotificationParam, ClientCapabilities,
ClientInfo, ClientRequest, CreateMessageRequestParams, CreateMessageResult,
GetPromptRequestParams, GetPromptResult, Implementation, InitializeRequestParams,
InitializeResult, ListPromptsResult, ListResourcesResult, ListToolsResult, Notification,
PaginatedRequestParams, ProtocolVersion, ReadResourceRequestParams, ReadResourceResult,
Request, RequestId, RequestOptionalParam, Role, SamplingMessage, ServerNotification,
ServerResult,
},
service::{
ClientInitializeError, PeerRequestOptions, RequestContext, RequestHandle, RunningService,
@@ -171,13 +169,9 @@ impl ClientHandler for GooseClient {
.await
.iter()
.for_each(|handler| {
let _ = handler.try_send(ServerNotification::ProgressNotification(
ProgressNotification {
params: params.clone(),
method: ProgressNotificationMethod,
extensions: context.extensions.clone(),
},
));
let mut not = Notification::new(params.clone());
not.extensions = context.extensions.clone();
let _ = handler.try_send(ServerNotification::ProgressNotification(not));
});
}
@@ -191,13 +185,10 @@ impl ClientHandler for GooseClient {
.await
.iter()
.for_each(|handler| {
let _ = handler.try_send(ServerNotification::LoggingMessageNotification(
LoggingMessageNotification {
params: params.clone(),
method: LoggingMessageNotificationMethod,
extensions: context.extensions.clone(),
},
));
let mut notification = LoggingMessageNotification::new(params.clone());
notification.extensions = context.extensions.clone();
let _ =
handler.try_send(ServerNotification::LoggingMessageNotification(notification));
});
}
@@ -260,10 +251,8 @@ impl ClientHandler for GooseClient {
)
})?;
Ok(CreateMessageResult {
model: usage.model,
stop_reason: Some(CreateMessageResult::STOP_REASON_END_TURN.to_string()),
message: SamplingMessage::new(
Ok(CreateMessageResult::new(
SamplingMessage::new(
Role::Assistant,
if let Some(content) = response.content.first() {
match content {
@@ -283,7 +272,9 @@ impl ClientHandler for GooseClient {
SamplingMessageContent::text("")
},
),
})
usage.model,
)
.with_stop_reason(CreateMessageResult::STOP_REASON_END_TURN))
}
async fn create_elicitation(
@@ -344,24 +335,19 @@ impl ClientHandler for GooseClient {
);
}
ClientInfo {
meta: None,
protocol_version: ProtocolVersion::V_2025_03_26,
capabilities: ClientCapabilities::builder()
InitializeRequestParams::new(
ClientCapabilities::builder()
.enable_extensions_with(extensions)
.enable_sampling()
.enable_elicitation()
.build(),
client_info: Implementation {
name: self.client_name.clone(),
version: std::env::var("GOOSE_MCP_CLIENT_VERSION")
Implementation::new(
self.client_name.clone(),
std::env::var("GOOSE_MCP_CLIENT_VERSION")
.unwrap_or(env!("CARGO_PKG_VERSION").to_owned()),
icons: None,
title: None,
description: None,
website_url: None,
},
}
),
)
.with_protocol_version(ProtocolVersion::V_2025_03_26)
}
}
@@ -491,12 +477,7 @@ async fn send_cancel_message(
reason: Option<String>,
) -> Result<(), ServiceError> {
peer.send_notification(
CancelledNotification {
params: CancelledNotificationParam { request_id, reason },
method: CancelledNotificationMethod,
extensions: Default::default(),
}
.into(),
Notification::new(CancelledNotificationParam { request_id, reason }).into(),
)
.await
}
@@ -517,11 +498,9 @@ impl McpClientTrait for McpClient {
.send_request_with_context(
session_id,
None,
ClientRequest::ListResourcesRequest(ListResourcesRequest {
params: Some(PaginatedRequestParams { meta: None, cursor }),
method: Default::default(),
extensions: Default::default(),
}),
ClientRequest::ListResourcesRequest(RequestOptionalParam::with_param(
PaginatedRequestParams::default().with_cursor(cursor),
)),
cancel_token,
)
.await?;
@@ -542,14 +521,9 @@ impl McpClientTrait for McpClient {
.send_request_with_context(
session_id,
None,
ClientRequest::ReadResourceRequest(ReadResourceRequest {
params: ReadResourceRequestParams {
meta: None,
uri: uri.to_string(),
},
method: Default::default(),
extensions: Default::default(),
}),
ClientRequest::ReadResourceRequest(Request::new(ReadResourceRequestParams::new(
uri.to_string(),
))),
cancel_token,
)
.await?;
@@ -570,11 +544,9 @@ impl McpClientTrait for McpClient {
.send_request_with_context(
session_id,
None,
ClientRequest::ListToolsRequest(ListToolsRequest {
params: Some(PaginatedRequestParams { meta: None, cursor }),
method: Default::default(),
extensions: Default::default(),
}),
ClientRequest::ListToolsRequest(RequestOptionalParam::with_param(
PaginatedRequestParams::default().with_cursor(cursor),
)),
cancel_token,
)
.await?;
@@ -593,16 +565,11 @@ impl McpClientTrait for McpClient {
working_dir: Option<&str>,
cancel_token: CancellationToken,
) -> Result<CallToolResult, Error> {
let request = ClientRequest::CallToolRequest(CallToolRequest {
params: CallToolRequestParams {
meta: None,
task: None,
name: name.to_string().into(),
arguments,
},
method: Default::default(),
extensions: Default::default(),
});
let mut params = CallToolRequestParams::new(name.to_string());
if let Some(args) = arguments {
params = params.with_arguments(args);
}
let request = ClientRequest::CallToolRequest(Request::new(params));
let result = self
.send_request_with_context(session_id, working_dir, request, cancel_token)
@@ -624,11 +591,9 @@ impl McpClientTrait for McpClient {
.send_request_with_context(
session_id,
None,
ClientRequest::ListPromptsRequest(ListPromptsRequest {
params: Some(PaginatedRequestParams { meta: None, cursor }),
method: Default::default(),
extensions: Default::default(),
}),
ClientRequest::ListPromptsRequest(RequestOptionalParam::with_param(
PaginatedRequestParams::default().with_cursor(cursor),
)),
cancel_token,
)
.await?;
@@ -650,19 +615,15 @@ impl McpClientTrait for McpClient {
Value::Object(map) => Some(map),
_ => None,
};
let mut params = GetPromptRequestParams::new(name.to_string());
if let Some(args) = arguments {
params = params.with_arguments(args);
}
let res = self
.send_request_with_context(
session_id,
None,
ClientRequest::GetPromptRequest(GetPromptRequest {
params: GetPromptRequestParams {
meta: None,
name: name.to_string(),
arguments,
},
method: Default::default(),
extensions: Default::default(),
}),
ClientRequest::GetPromptRequest(Request::new(params)),
cancel_token,
)
.await?;
@@ -791,72 +752,41 @@ mod tests {
}
fn list_resources_request(extensions: Extensions) -> ClientRequest {
ClientRequest::ListResourcesRequest(ListResourcesRequest {
params: Some(PaginatedRequestParams {
meta: None,
cursor: None,
}),
method: Default::default(),
extensions,
})
let mut req = RequestOptionalParam::with_param(PaginatedRequestParams::default());
req.extensions = extensions;
ClientRequest::ListResourcesRequest(req)
}
fn read_resource_request(extensions: Extensions) -> ClientRequest {
ClientRequest::ReadResourceRequest(ReadResourceRequest {
params: ReadResourceRequestParams {
meta: None,
uri: "test://resource".to_string(),
},
method: Default::default(),
extensions,
})
let mut req = Request::new(ReadResourceRequestParams::new(
"test://resource".to_string(),
));
req.extensions = extensions;
ClientRequest::ReadResourceRequest(req)
}
fn list_tools_request(extensions: Extensions) -> ClientRequest {
ClientRequest::ListToolsRequest(ListToolsRequest {
params: Some(PaginatedRequestParams {
meta: None,
cursor: None,
}),
method: Default::default(),
extensions,
})
let mut req = RequestOptionalParam::with_param(PaginatedRequestParams::default());
req.extensions = extensions;
ClientRequest::ListToolsRequest(req)
}
fn call_tool_request(extensions: Extensions) -> ClientRequest {
ClientRequest::CallToolRequest(CallToolRequest {
params: CallToolRequestParams {
meta: None,
task: None,
name: "tool".to_string().into(),
arguments: None,
},
method: Default::default(),
extensions,
})
let mut req = Request::new(CallToolRequestParams::new("tool".to_string()));
req.extensions = extensions;
ClientRequest::CallToolRequest(req)
}
fn list_prompts_request(extensions: Extensions) -> ClientRequest {
ClientRequest::ListPromptsRequest(ListPromptsRequest {
params: Some(PaginatedRequestParams {
meta: None,
cursor: None,
}),
method: Default::default(),
extensions,
})
let mut req = RequestOptionalParam::with_param(PaginatedRequestParams::default());
req.extensions = extensions;
ClientRequest::ListPromptsRequest(req)
}
fn get_prompt_request(extensions: Extensions) -> ClientRequest {
ClientRequest::GetPromptRequest(GetPromptRequest {
params: GetPromptRequestParams {
meta: None,
name: "prompt".to_string(),
arguments: None,
},
method: Default::default(),
extensions,
})
let mut req = Request::new(GetPromptRequestParams::new("prompt".to_string()));
req.extensions = extensions;
ClientRequest::GetPromptRequest(req)
}
#[test_case(