mcp_protocol/types/
tool.rs

1// mcp-protocol/src/types/tool.rs
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5/// Definition of a tool that can be called by the client
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct Tool {
8    pub name: String,
9    
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub description: Option<String>,
12    
13    #[serde(rename = "inputSchema")]
14    pub input_schema: serde_json::Value,
15    
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub annotations: Option<HashMap<String, serde_json::Value>>,
18}
19
20/// Parameters for a tool call
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct ToolCallParams {
23    pub name: String,
24    
25    pub arguments: serde_json::Value,
26}
27
28/// A single content item in a tool result
29#[derive(Debug, Clone, Serialize, Deserialize)]
30#[serde(tag = "type")]
31pub enum ToolContent {
32    #[serde(rename = "text")]
33    Text { text: String },
34    
35    #[serde(rename = "image")]
36    Image { data: String, #[serde(rename = "mimeType")] mime_type: String },
37    
38    #[serde(rename = "audio")]
39    Audio { data: String, #[serde(rename = "mimeType")] mime_type: String },
40    
41    #[serde(rename = "resource")]
42    Resource { resource: serde_json::Value },
43}
44
45/// Result of a tool call
46#[derive(Debug, Clone, Serialize, Deserialize)]
47pub struct ToolCallResult {
48    pub content: Vec<ToolContent>,
49    
50    #[serde(rename = "isError")]
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub is_error: Option<bool>,
53}
54
55/// Parameters for listing tools
56#[derive(Debug, Clone, Serialize, Deserialize)]
57pub struct ToolsListParams {
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub cursor: Option<String>,
60}
61
62/// Result of listing tools
63#[derive(Debug, Clone, Serialize, Deserialize)]
64pub struct ToolsListResult {
65    pub tools: Vec<Tool>,
66    
67    #[serde(rename = "nextCursor")]
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub next_cursor: Option<String>,
70}