From 17c2b5970e0b62915fafd47503ea8e9fd09b7236 Mon Sep 17 00:00:00 2001 From: Naveen Narayanan Date: Mon, 17 Mar 2025 19:56:40 -0700 Subject: [PATCH 1/3] [MCP] Allow additional metadata from mcp responses --- src/tools/calculator.rs | 2 ++ src/tools/file_system/directory.rs | 3 +++ src/tools/file_system/mod.rs | 1 + src/tools/file_system/read.rs | 2 ++ src/tools/file_system/search.rs | 2 ++ src/tools/file_system/write.rs | 1 + src/tools/mod.rs | 5 +++++ src/tools/test_tool.rs | 2 ++ 8 files changed, 18 insertions(+) diff --git a/src/tools/calculator.rs b/src/tools/calculator.rs index dbd2ae3..14b849f 100644 --- a/src/tools/calculator.rs +++ b/src/tools/calculator.rs @@ -217,12 +217,14 @@ impl ToolProvider for CalculatorTool { text: result.to_string(), }], is_error: false, + _meta: None, }), Err(error) => Ok(ToolResult { content: vec![ToolContent::Text { text: error.to_string(), }], is_error: true, + _meta: None, }), } } diff --git a/src/tools/file_system/directory.rs b/src/tools/file_system/directory.rs index 78fa8d3..3fa8bba 100644 --- a/src/tools/file_system/directory.rs +++ b/src/tools/file_system/directory.rs @@ -70,6 +70,7 @@ impl ToolProvider for DirectoryTool { text: format!("Created directory: {}", path), }], is_error: false, + _meta: None, }) } Some("list_directory") => { @@ -96,6 +97,7 @@ impl ToolProvider for DirectoryTool { text: listing.join("\n"), }], is_error: false, + _meta: None, }) } Some("move_file") => { @@ -115,6 +117,7 @@ impl ToolProvider for DirectoryTool { text: format!("Moved {} to {}", source, destination), }], is_error: false, + _meta: None, }) } _ => Err(McpError::InvalidParams), diff --git a/src/tools/file_system/mod.rs b/src/tools/file_system/mod.rs index 531b9a3..e1c2bae 100644 --- a/src/tools/file_system/mod.rs +++ b/src/tools/file_system/mod.rs @@ -105,6 +105,7 @@ impl ToolProvider for FileSystemTools { return Ok(ToolResult { content: vec![ToolContent::Text { text: dirs }], is_error: false, + _meta: None, }); } diff --git a/src/tools/file_system/read.rs b/src/tools/file_system/read.rs index a431082..0af362a 100644 --- a/src/tools/file_system/read.rs +++ b/src/tools/file_system/read.rs @@ -92,6 +92,7 @@ impl ToolProvider for ReadFileTool { Ok(ToolResult { content: vec![ToolContent::Text { text: content }], is_error: false, + _meta: None, }) } Some("read_multiple_files") => { @@ -119,6 +120,7 @@ impl ToolProvider for ReadFileTool { Ok(ToolResult { content: contents, is_error: false, + _meta: None, }) } _ => Err(McpError::InvalidParams), diff --git a/src/tools/file_system/search.rs b/src/tools/file_system/search.rs index f67379f..e511e68 100644 --- a/src/tools/file_system/search.rs +++ b/src/tools/file_system/search.rs @@ -131,6 +131,7 @@ impl ToolProvider for SearchTool { }, }], is_error: false, + _meta: None, }) } Some("get_file_info") => { @@ -140,6 +141,7 @@ impl ToolProvider for SearchTool { Ok(ToolResult { content: vec![ToolContent::Text { text: info }], is_error: false, + _meta: None, }) } _ => Err(McpError::InvalidParams), diff --git a/src/tools/file_system/write.rs b/src/tools/file_system/write.rs index b8c3265..726e73e 100644 --- a/src/tools/file_system/write.rs +++ b/src/tools/file_system/write.rs @@ -74,6 +74,7 @@ impl ToolProvider for WriteFileTool { text: format!("Successfully wrote {} bytes to {}", content.len(), path), }], is_error: false, + _meta: None, }) } } diff --git a/src/tools/mod.rs b/src/tools/mod.rs index 0a8290c..0d0499c 100644 --- a/src/tools/mod.rs +++ b/src/tools/mod.rs @@ -75,6 +75,11 @@ pub struct ResourceContent { pub struct ToolResult { pub content: Vec, pub is_error: bool, + + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(default)] + #[serde(rename = "_meta")] + pub _meta: Option> } // Request/Response types diff --git a/src/tools/test_tool.rs b/src/tools/test_tool.rs index c779327..2fc3cad 100644 --- a/src/tools/test_tool.rs +++ b/src/tools/test_tool.rs @@ -44,6 +44,7 @@ impl ToolProvider for TestTool { Ok(ToolResult { content: vec![], is_error: false, + _meta: None, }) } } @@ -99,6 +100,7 @@ impl ToolProvider for PingTool { Ok(ToolResult { content: vec![ToolContent::Text { text: body }], is_error: false, + _meta: None, }) } } From f5edf91dddffbc3537673d974e06e9b2b04c52c4 Mon Sep 17 00:00:00 2001 From: Naveen Narayanan Date: Tue, 18 Mar 2025 00:29:55 -0700 Subject: [PATCH 2/3] Cleanup --- src/tools/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/mod.rs b/src/tools/mod.rs index 0d0499c..ae69b61 100644 --- a/src/tools/mod.rs +++ b/src/tools/mod.rs @@ -79,7 +79,7 @@ pub struct ToolResult { #[serde(skip_serializing_if = "Option::is_none")] #[serde(default)] #[serde(rename = "_meta")] - pub _meta: Option> + pub _meta: Option>, } // Request/Response types From 4dc69a7423680031c6fe539b941b0f39bb5f1a22 Mon Sep 17 00:00:00 2001 From: Naveen Narayanan Date: Tue, 18 Mar 2025 00:32:04 -0700 Subject: [PATCH 3/3] Fixing tests --- tests/tools.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/tools.rs b/tests/tools.rs index 8330dd2..0dd4e0f 100644 --- a/tests/tools.rs +++ b/tests/tools.rs @@ -66,6 +66,7 @@ impl ToolProvider for MockCalculatorTool { text: "Division by zero".to_string(), }], is_error: true, + _meta: None, }); } params.a / params.b @@ -78,6 +79,7 @@ impl ToolProvider for MockCalculatorTool { text: result.to_string(), }], is_error: false, + _meta: None, }) } }