Skip to main content

mcp_kit/types/
messages.rs

1/// All MCP request/response/notification message types
2use serde::{Deserialize, Serialize};
3
4use crate::types::{
5    prompt::Prompt, resource::Resource, tool::Tool, ClientCapabilities, ClientInfo, Cursor,
6    LoggingLevel, Root, ServerCapabilities, ServerInfo,
7};
8
9// ─── Initialize ───────────────────────────────────────────────────────────────
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
12#[serde(rename_all = "camelCase")]
13pub struct InitializeRequest {
14    pub protocol_version: String,
15    pub capabilities: ClientCapabilities,
16    pub client_info: ClientInfo,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
20#[serde(rename_all = "camelCase")]
21pub struct InitializeResult {
22    pub protocol_version: String,
23    pub capabilities: ServerCapabilities,
24    pub server_info: ServerInfo,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub instructions: Option<String>,
27}
28
29// ─── Tools ───────────────────────────────────────────────────────────────────
30
31#[derive(Debug, Clone, Default, Serialize, Deserialize)]
32pub struct ListToolsRequest {
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub cursor: Option<Cursor>,
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
38#[serde(rename_all = "camelCase")]
39pub struct ListToolsResult {
40    pub tools: Vec<Tool>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub next_cursor: Option<Cursor>,
43}
44
45#[derive(Debug, Clone, Serialize, Deserialize)]
46pub struct CallToolRequest {
47    pub name: String,
48    #[serde(default)]
49    pub arguments: serde_json::Value,
50}
51
52// ─── Resources ───────────────────────────────────────────────────────────────
53
54#[derive(Debug, Clone, Default, Serialize, Deserialize)]
55pub struct ListResourcesRequest {
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub cursor: Option<Cursor>,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize)]
61#[serde(rename_all = "camelCase")]
62pub struct ListResourcesResult {
63    pub resources: Vec<Resource>,
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub next_cursor: Option<Cursor>,
66}
67
68#[derive(Debug, Clone, Serialize, Deserialize)]
69pub struct ReadResourceRequest {
70    pub uri: String,
71}
72
73pub use crate::types::resource::ReadResourceResult;
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
76pub struct SubscribeRequest {
77    pub uri: String,
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct UnsubscribeRequest {
82    pub uri: String,
83}
84
85// ─── Prompts ─────────────────────────────────────────────────────────────────
86
87#[derive(Debug, Clone, Default, Serialize, Deserialize)]
88pub struct ListPromptsRequest {
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub cursor: Option<Cursor>,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
94#[serde(rename_all = "camelCase")]
95pub struct ListPromptsResult {
96    pub prompts: Vec<Prompt>,
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub next_cursor: Option<Cursor>,
99}
100
101#[derive(Debug, Clone, Serialize, Deserialize)]
102pub struct GetPromptRequest {
103    pub name: String,
104    #[serde(default)]
105    pub arguments: std::collections::HashMap<String, String>,
106}
107
108pub use crate::types::prompt::GetPromptResult;
109
110// ─── Completion ───────────────────────────────────────────────────────────────
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct CompleteRequest {
114    #[serde(rename = "ref")]
115    pub reference: CompletionReference,
116    pub argument: CompletionArgument,
117}
118
119#[derive(Debug, Clone, Serialize, Deserialize)]
120#[serde(tag = "type", rename_all = "camelCase")]
121pub enum CompletionReference {
122    #[serde(rename = "ref/prompt")]
123    Prompt { name: String },
124    #[serde(rename = "ref/resource")]
125    Resource { uri: String },
126}
127
128#[derive(Debug, Clone, Serialize, Deserialize)]
129pub struct CompletionArgument {
130    pub name: String,
131    pub value: String,
132}
133
134#[derive(Debug, Clone, Serialize, Deserialize)]
135pub struct CompleteResult {
136    pub completion: CompletionValues,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize)]
140pub struct CompletionValues {
141    pub values: Vec<String>,
142    #[serde(skip_serializing_if = "Option::is_none")]
143    pub total: Option<u32>,
144    #[serde(skip_serializing_if = "Option::is_none")]
145    pub has_more: Option<bool>,
146}
147
148// ─── Logging ─────────────────────────────────────────────────────────────────
149
150#[derive(Debug, Clone, Serialize, Deserialize)]
151pub struct SetLevelRequest {
152    pub level: LoggingLevel,
153}
154
155// ─── Roots ───────────────────────────────────────────────────────────────────
156
157#[derive(Debug, Clone, Serialize, Deserialize)]
158pub struct ListRootsResult {
159    pub roots: Vec<Root>,
160}
161
162// ─── Notifications ────────────────────────────────────────────────────────────
163
164#[derive(Debug, Clone, Serialize, Deserialize)]
165#[serde(rename_all = "camelCase")]
166pub struct ProgressNotification {
167    pub progress_token: crate::protocol::ProgressToken,
168    pub progress: f64,
169    #[serde(skip_serializing_if = "Option::is_none")]
170    pub total: Option<f64>,
171    #[serde(skip_serializing_if = "Option::is_none")]
172    pub message: Option<String>,
173}
174
175#[derive(Debug, Clone, Serialize, Deserialize)]
176pub struct CancelledNotification {
177    pub request_id: crate::protocol::RequestId,
178    #[serde(skip_serializing_if = "Option::is_none")]
179    pub reason: Option<String>,
180}
181
182#[derive(Debug, Clone, Serialize, Deserialize)]
183pub struct LogMessageNotification {
184    pub level: LoggingLevel,
185    #[serde(skip_serializing_if = "Option::is_none")]
186    pub logger: Option<String>,
187    pub data: serde_json::Value,
188}
189
190#[derive(Debug, Clone, Serialize, Deserialize)]
191pub struct ResourceUpdatedNotification {
192    pub uri: String,
193}