chore: upgrade to rmcp 0.14.0 (#6674)

This commit is contained in:
Alex Hancock
2026-01-23 14:52:43 -05:00
committed by GitHub
parent ca7577ae49
commit 8233f0afac
37 changed files with 305 additions and 209 deletions
+7 -7
View File
@@ -971,7 +971,7 @@ mod tests {
use super::*;
use crate::conversation::message::Message;
use jsonwebtoken::{Algorithm, EncodingKey, Header};
use rmcp::model::{CallToolRequestParam, CallToolResult, Content, ErrorCode, ErrorData};
use rmcp::model::{CallToolRequestParams, CallToolResult, Content, ErrorCode, ErrorData};
use rmcp::object;
use test_case::test_case;
use wiremock::matchers::{body_string_contains, method, path};
@@ -1003,8 +1003,8 @@ mod tests {
Message::user().with_text("user text"),
Message::assistant().with_text("assistant prelude").with_tool_request(
"call-1",
Ok(CallToolRequestParam {
task: None,
Ok(CallToolRequestParams {
meta: None, task: None,
name: "tool_name".into(),
arguments: Some(object!({"param": "value"})),
}),
@@ -1029,8 +1029,8 @@ mod tests {
Message::user().with_text("user text"),
Message::assistant().with_tool_request(
"call-1",
Ok(CallToolRequestParam {
task: None,
Ok(CallToolRequestParams {
meta: None, task: None,
name: "tool_name".into(),
arguments: Some(object!({"param": "value"})),
}),
@@ -1054,8 +1054,8 @@ mod tests {
Message::user().with_text("user text"),
Message::assistant().with_tool_request(
"call-1",
Ok(CallToolRequestParam {
task: None,
Ok(CallToolRequestParams {
meta: None, task: None,
name: "tool_name".into(),
arguments: Some(object!({"param": "value"})),
}),
@@ -4,7 +4,7 @@ use crate::providers::base::Usage;
use crate::providers::errors::ProviderError;
use crate::providers::utils::{convert_image, ImageFormat};
use anyhow::{anyhow, Result};
use rmcp::model::{object, CallToolRequestParam, ErrorCode, ErrorData, JsonObject, Role, Tool};
use rmcp::model::{object, CallToolRequestParams, ErrorCode, ErrorData, JsonObject, Role, Tool};
use rmcp::object as json_object;
use serde_json::{json, Value};
use std::collections::HashSet;
@@ -249,7 +249,8 @@ pub fn response_to_message(response: &Value) -> Result<Message> {
.get(INPUT_FIELD)
.ok_or_else(|| anyhow!("Missing tool_use input"))?;
let tool_call = CallToolRequestParam {
let tool_call = CallToolRequestParams {
meta: None,
task: None,
name: name.into(),
arguments: Some(object(input.clone())),
@@ -613,8 +614,8 @@ where
}
};
let tool_call = CallToolRequestParam{
task: None,
let tool_call = CallToolRequestParams{
meta: None, task: None,
name: name.into(),
arguments: Some(object(parsed_args))
};
@@ -982,7 +983,8 @@ mod tests {
let messages = vec![
Message::assistant().with_tool_request(
"tool_1",
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: "calculator".into(),
arguments: Some(object!({"expression": "2 + 2"})),
@@ -9,7 +9,7 @@ use aws_smithy_types::{Document, Number};
use base64::Engine;
use chrono::Utc;
use rmcp::model::{
object, CallToolRequestParam, Content, ErrorCode, ErrorData, RawContent, ResourceContents,
object, CallToolRequestParams, Content, ErrorCode, ErrorData, RawContent, ResourceContents,
Role, Tool,
};
use serde_json::Value;
@@ -300,7 +300,8 @@ pub fn from_bedrock_content_block(block: &bedrock::ContentBlock) -> Result<Messa
bedrock::ContentBlock::Text(text) => MessageContent::text(text),
bedrock::ContentBlock::ToolUse(tool_use) => MessageContent::tool_request(
tool_use.tool_use_id.to_string(),
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: tool_use.name.clone().into(),
arguments: Some(object(from_bedrock_json(&tool_use.input.clone())?)),
@@ -7,7 +7,7 @@ use crate::providers::utils::{
};
use anyhow::{anyhow, Error};
use rmcp::model::{
object, AnnotateAble, CallToolRequestParam, Content, ErrorCode, ErrorData, RawContent,
object, AnnotateAble, CallToolRequestParams, Content, ErrorCode, ErrorData, RawContent,
ResourceContents, Role, Tool,
};
use serde::Serialize;
@@ -340,7 +340,8 @@ pub fn response_to_message(response: &Value) -> anyhow::Result<Message> {
Ok(params) => {
content.push(MessageContent::tool_request(
id,
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: function_name.into(),
arguments: Some(object(params)),
@@ -735,7 +736,8 @@ mod tests {
Message::user().with_text("How are you?"),
Message::assistant().with_tool_request(
"tool1",
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: "example".into(),
arguments: Some(object!({"param1": "value1"})),
@@ -781,7 +783,8 @@ mod tests {
fn test_format_messages_multiple_content() -> anyhow::Result<()> {
let mut messages = vec![Message::assistant().with_tool_request(
"tool1",
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: "example".into(),
arguments: Some(object!({"param1": "value1"})),
@@ -1160,7 +1163,8 @@ mod tests {
// Test that tool calls with None arguments are formatted as "{}" string
let message = Message::assistant().with_tool_request(
"tool1",
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: "test_tool".into(),
arguments: None, // This is the key case the fix addresses
@@ -1190,7 +1194,8 @@ mod tests {
// Test that tool calls with Some arguments are properly JSON-serialized
let message = Message::assistant().with_tool_request(
"tool1",
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: "test_tool".into(),
arguments: Some(object!({"param": "value", "number": 42})),
+10 -7
View File
@@ -4,7 +4,7 @@ use crate::providers::errors::ProviderError;
use crate::providers::utils::{is_valid_function_name, sanitize_function_name};
use anyhow::Result;
use rmcp::model::{
object, AnnotateAble, CallToolRequestParam, ErrorCode, ErrorData, RawContent, Role, Tool,
object, AnnotateAble, CallToolRequestParams, ErrorCode, ErrorData, RawContent, Role, Tool,
};
use serde::Serialize;
use std::borrow::Cow;
@@ -421,7 +421,8 @@ fn process_response_part_impl(
Some(MessageContent::tool_request_with_metadata(
id,
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: name.to_string().into(),
arguments,
@@ -688,7 +689,7 @@ pub fn create_request(
mod tests {
use super::*;
use crate::conversation::message::Message;
use rmcp::model::{CallToolRequestParam, CallToolResult};
use rmcp::model::{CallToolRequestParams, CallToolResult};
use rmcp::{model::Content, object};
use serde_json::json;
@@ -696,7 +697,7 @@ mod tests {
Message::new(role, 0, vec![MessageContent::text(text.to_string())])
}
fn set_up_tool_request_message(id: &str, tool_call: CallToolRequestParam) -> Message {
fn set_up_tool_request_message(id: &str, tool_call: CallToolRequestParams) -> Message {
Message::new(
Role::User,
0,
@@ -704,7 +705,7 @@ mod tests {
)
}
fn set_up_action_required_message(id: &str, tool_call: CallToolRequestParam) -> Message {
fn set_up_action_required_message(id: &str, tool_call: CallToolRequestParams) -> Message {
Message::new(
Role::User,
0,
@@ -770,7 +771,8 @@ mod tests {
let messages = vec![
set_up_tool_request_message(
"id",
CallToolRequestParam {
CallToolRequestParams {
meta: None,
task: None,
name: "tool_name".into(),
arguments: Some(object(arguments.clone())),
@@ -778,7 +780,8 @@ mod tests {
),
set_up_action_required_message(
"id2",
CallToolRequestParam {
CallToolRequestParams {
meta: None,
task: None,
name: "tool_name_2".into(),
arguments: Some(object(arguments.clone())),
+17 -10
View File
@@ -10,7 +10,7 @@ use async_stream::try_stream;
use chrono;
use futures::Stream;
use rmcp::model::{
object, AnnotateAble, CallToolRequestParam, Content, ErrorCode, ErrorData, RawContent,
object, AnnotateAble, CallToolRequestParams, Content, ErrorCode, ErrorData, RawContent,
ResourceContents, Role, Tool,
};
use serde::{Deserialize, Serialize};
@@ -339,7 +339,8 @@ pub fn response_to_message(response: &Value) -> anyhow::Result<Message> {
Ok(params) => {
content.push(MessageContent::tool_request(
id,
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: function_name.into(),
arguments: Some(object(params)),
@@ -574,8 +575,8 @@ where
Ok(params) => {
MessageContent::tool_request_with_metadata(
id.clone(),
Ok(CallToolRequestParam {
task: None,
Ok(CallToolRequestParams {
meta: None, task: None,
name: function_name.clone().into(),
arguments: Some(object(params))
}),
@@ -880,7 +881,8 @@ mod tests {
Message::user().with_text("How are you?"),
Message::assistant().with_tool_request(
"tool1",
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: "example".into(),
arguments: Some(object!({"param1": "value1"})),
@@ -925,7 +927,8 @@ mod tests {
fn test_format_messages_multiple_content() -> anyhow::Result<()> {
let mut messages = vec![Message::assistant().with_tool_request(
"tool1",
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: "example".into(),
arguments: Some(object!({"param1": "value1"})),
@@ -1165,7 +1168,8 @@ mod tests {
// Test that tool calls with None arguments are formatted as "{}" string
let message = Message::assistant().with_tool_request(
"tool1",
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: "test_tool".into(),
arguments: None, // This is the key case the fix addresses
@@ -1193,7 +1197,8 @@ mod tests {
// Test that tool calls with Some arguments are properly JSON-serialized
let message = Message::assistant().with_tool_request(
"tool1",
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: "test_tool".into(),
arguments: Some(object!({"param": "value", "number": 42})),
@@ -1224,7 +1229,8 @@ mod tests {
// Test that FrontendToolRequest with None arguments are formatted as "{}" string
let message = Message::assistant().with_frontend_tool_request(
"frontend_tool1",
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: "frontend_test_tool".into(),
arguments: None, // This is the key case the fix addresses
@@ -1252,7 +1258,8 @@ mod tests {
// Test that FrontendToolRequest with Some arguments are properly JSON-serialized
let message = Message::assistant().with_frontend_tool_request(
"frontend_tool1",
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: "frontend_test_tool".into(),
arguments: Some(object!({"action": "click", "element": "button"})),
@@ -5,7 +5,7 @@ use anyhow::{anyhow, Error};
use async_stream::try_stream;
use chrono;
use futures::Stream;
use rmcp::model::{object, CallToolRequestParam, RawContent, Role, Tool};
use rmcp::model::{object, CallToolRequestParams, RawContent, Role, Tool};
use serde::{Deserialize, Serialize};
use serde_json::{json, Value};
use std::ops::Deref;
@@ -440,7 +440,8 @@ pub fn responses_api_to_message(response: &ResponsesApiResponse) -> anyhow::Resu
ResponseContentBlock::ToolCall { id, name, input } => {
content.push(MessageContent::tool_request(
id.clone(),
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: name.clone().into(),
arguments: Some(object(input.clone())),
@@ -465,7 +466,8 @@ pub fn responses_api_to_message(response: &ResponsesApiResponse) -> anyhow::Resu
content.push(MessageContent::tool_request(
id.clone(),
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: name.clone().into(),
arguments: Some(object(parsed_args)),
@@ -524,7 +526,8 @@ fn process_streaming_output_items(
content.push(MessageContent::tool_request(
id,
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: name.into(),
arguments: Some(object(parsed_args)),
@@ -548,7 +551,8 @@ fn process_streaming_output_items(
content.push(MessageContent::tool_request(
call_id,
Ok(CallToolRequestParam {
Ok(CallToolRequestParams {
meta: None,
task: None,
name: name.into(),
arguments: Some(object(parsed_args)),
@@ -3,7 +3,7 @@ use crate::model::ModelConfig;
use crate::providers::base::Usage;
use crate::providers::errors::ProviderError;
use anyhow::{anyhow, Result};
use rmcp::model::{object, CallToolRequestParam, Role, Tool};
use rmcp::model::{object, CallToolRequestParams, Role, Tool};
use rmcp::object;
use serde_json::{json, Value};
use std::collections::HashSet;
@@ -184,7 +184,8 @@ pub fn parse_streaming_response(sse_data: &str) -> Result<Message> {
if !tool_input.is_empty() {
let input_value = serde_json::from_str::<Value>(&tool_input)
.unwrap_or_else(|_| Value::String(tool_input.clone()));
let tool_call = CallToolRequestParam {
let tool_call = CallToolRequestParams {
meta: None,
task: None,
name: name.into(),
arguments: Some(object(input_value)),
@@ -192,7 +193,8 @@ pub fn parse_streaming_response(sse_data: &str) -> Result<Message> {
message = message.with_tool_request(&id, Ok(tool_call));
} else {
// Tool with no input - use empty object
let tool_call = CallToolRequestParam {
let tool_call = CallToolRequestParams {
meta: None,
task: None,
name: name.into(),
arguments: Some(object!({})),
@@ -253,7 +255,8 @@ pub fn response_to_message(response: &Value) -> Result<Message> {
.ok_or_else(|| anyhow!("Missing tool input"))?
.clone();
let tool_call = CallToolRequestParam {
let tool_call = CallToolRequestParams {
meta: None,
task: None,
name: name.into(),
arguments: Some(object(input)),
@@ -693,7 +696,8 @@ data: {"id":"a9537c2c-2017-4906-9817-2456168d89fa","model":"claude-sonnet-4-2025
use crate::conversation::message::Message;
// Create a conversation with text, tool requests, and tool responses
let tool_call = CallToolRequestParam {
let tool_call = CallToolRequestParams {
meta: None,
task: None,
name: "calculator".into(),
arguments: Some(object!({"expression": "2 + 2"})),
+6 -5
View File
@@ -39,7 +39,7 @@ use crate::model::ModelConfig;
use crate::providers::formats::openai::create_request;
use anyhow::Result;
use reqwest::Client;
use rmcp::model::{object, CallToolRequestParam, RawContent, Tool};
use rmcp::model::{object, CallToolRequestParams, RawContent, Tool};
use serde_json::{json, Value};
use std::ops::Deref;
use std::time::Duration;
@@ -59,7 +59,7 @@ pub trait ToolInterpreter {
&self,
content: &str,
tools: &[Tool],
) -> Result<Vec<CallToolRequestParam>, ProviderError>;
) -> Result<Vec<CallToolRequestParams>, ProviderError>;
}
/// Ollama-specific implementation of the ToolInterpreter trait
@@ -200,7 +200,7 @@ impl OllamaInterpreter {
fn process_interpreter_response(
response: &Value,
) -> Result<Vec<CallToolRequestParam>, ProviderError> {
) -> Result<Vec<CallToolRequestParams>, ProviderError> {
let mut tool_calls = Vec::new();
tracing::info!(
"Tool interpreter response is {}",
@@ -225,7 +225,8 @@ impl OllamaInterpreter {
let arguments = item["arguments"].clone();
// Add the tool call to our result vector
tool_calls.push(CallToolRequestParam {
tool_calls.push(CallToolRequestParams {
meta: None,
task: None,
name: name.into(),
arguments: Some(object(arguments)),
@@ -247,7 +248,7 @@ impl ToolInterpreter for OllamaInterpreter {
&self,
last_assistant_msg: &str,
tools: &[Tool],
) -> Result<Vec<CallToolRequestParam>, ProviderError> {
) -> Result<Vec<CallToolRequestParams>, ProviderError> {
if tools.is_empty() {
return Ok(vec![]);
}
+3 -2
View File
@@ -13,7 +13,7 @@ use crate::conversation::message::{Message, MessageContent};
use crate::mcp_utils::ToolResult;
use crate::model::ModelConfig;
use rmcp::model::{object, CallToolRequestParam, Role, Tool};
use rmcp::model::{object, CallToolRequestParams, Role, Tool};
// ---------- Capability Flags ----------
#[derive(Debug)]
@@ -475,7 +475,8 @@ impl Provider for VeniceProvider {
function["arguments"].clone()
};
let tool_call = CallToolRequestParam {
let tool_call = CallToolRequestParams {
meta: None,
task: None,
name: name.into(),
arguments: Some(object(arguments)),