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    #[serde(skip_serializing_if = "Option::is_none")]
26    pub arguments: Option<serde_json::Value>,
27}
28
29/// A single content item in a tool result
30#[derive(Debug, Clone, Serialize, Deserialize)]
31#[serde(tag = "type")]
32pub enum ToolContent {
33    #[serde(rename = "text")]
34    Text { text: String },
35
36    #[serde(rename = "image")]
37    Image {
38        data: String,
39        #[serde(rename = "mimeType")]
40        mime_type: String,
41    },
42
43    #[serde(rename = "audio")]
44    Audio {
45        data: String,
46        #[serde(rename = "mimeType")]
47        mime_type: String,
48    },
49
50    #[serde(rename = "resource")]
51    Resource { resource: serde_json::Value },
52}
53
54/// Result of a tool call
55#[derive(Debug, Clone, Serialize, Deserialize)]
56pub struct ToolCallResult {
57    pub content: Vec<ToolContent>,
58
59    #[serde(rename = "isError")]
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub is_error: Option<bool>,
62}
63
64/// Parameters for listing tools
65#[derive(Debug, Clone, Serialize, Deserialize)]
66pub struct ToolsListParams {
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub cursor: Option<String>,
69}
70
71/// Result of listing tools
72#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct ToolsListResult {
74    pub tools: Vec<Tool>,
75
76    #[serde(rename = "nextCursor")]
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub next_cursor: Option<String>,
79}