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    #[cfg_attr(feature = "camel_case", 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 {
37        data: String,
38        #[serde(rename = "mimeType")]
39        mime_type: String,
40    },
41
42    #[serde(rename = "audio")]
43    Audio {
44        data: String,
45        #[serde(rename = "mimeType")]
46        mime_type: String,
47    },
48
49    #[serde(rename = "resource")]
50    Resource { resource: serde_json::Value },
51}
52
53/// Result of a tool call
54#[derive(Debug, Clone, Serialize, Deserialize)]
55pub struct ToolCallResult {
56    pub content: Vec<ToolContent>,
57
58    #[serde(rename = "isError")]
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub is_error: Option<bool>,
61}
62
63/// Parameters for listing tools
64#[derive(Debug, Clone, Serialize, Deserialize)]
65pub struct ToolsListParams {
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub cursor: Option<String>,
68}
69
70/// Result of listing tools
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct ToolsListResult {
73    pub tools: Vec<Tool>,
74
75    #[serde(rename = "nextCursor")]
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub next_cursor: Option<String>,
78}