Skip to main content

mcp_kit/types/
mod.rs

1pub mod content;
2pub mod messages;
3pub mod prompt;
4pub mod resource;
5pub mod sampling;
6pub mod tool;
7
8use serde::{Deserialize, Serialize};
9
10// ─── Shared capability types ──────────────────────────────────────────────────
11
12#[derive(Debug, Clone, Default, Serialize, Deserialize)]
13pub struct Implementation {
14    pub name: String,
15    pub version: String,
16}
17
18impl Implementation {
19    pub fn new(name: impl Into<String>, version: impl Into<String>) -> Self {
20        Self {
21            name: name.into(),
22            version: version.into(),
23        }
24    }
25}
26
27pub type ClientInfo = Implementation;
28pub type ServerInfo = Implementation;
29
30// ─── Server capabilities ─────────────────────────────────────────────────────
31
32#[derive(Debug, Clone, Default, Serialize, Deserialize)]
33#[serde(rename_all = "camelCase")]
34pub struct ServerCapabilities {
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub tools: Option<ToolsCapability>,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub resources: Option<ResourcesCapability>,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub prompts: Option<PromptsCapability>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub logging: Option<LoggingCapability>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub experimental: Option<serde_json::Value>,
45}
46
47#[derive(Debug, Clone, Default, Serialize, Deserialize)]
48#[serde(rename_all = "camelCase")]
49pub struct ToolsCapability {
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub list_changed: Option<bool>,
52}
53
54#[derive(Debug, Clone, Default, Serialize, Deserialize)]
55#[serde(rename_all = "camelCase")]
56pub struct ResourcesCapability {
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub subscribe: Option<bool>,
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub list_changed: Option<bool>,
61}
62
63#[derive(Debug, Clone, Default, Serialize, Deserialize)]
64#[serde(rename_all = "camelCase")]
65pub struct PromptsCapability {
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub list_changed: Option<bool>,
68}
69
70#[derive(Debug, Clone, Default, Serialize, Deserialize)]
71pub struct LoggingCapability {}
72
73// ─── Client capabilities ─────────────────────────────────────────────────────
74
75#[derive(Debug, Clone, Default, Serialize, Deserialize)]
76#[serde(rename_all = "camelCase")]
77pub struct ClientCapabilities {
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub roots: Option<RootsCapability>,
80    #[serde(skip_serializing_if = "Option::is_none")]
81    pub sampling: Option<SamplingCapability>,
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub experimental: Option<serde_json::Value>,
84}
85
86#[derive(Debug, Clone, Default, Serialize, Deserialize)]
87#[serde(rename_all = "camelCase")]
88pub struct RootsCapability {
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub list_changed: Option<bool>,
91}
92
93#[derive(Debug, Clone, Default, Serialize, Deserialize)]
94pub struct SamplingCapability {}
95
96// ─── Logging ─────────────────────────────────────────────────────────────────
97
98#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
99#[serde(rename_all = "lowercase")]
100pub enum LoggingLevel {
101    Debug,
102    Info,
103    Notice,
104    Warning,
105    Error,
106    Critical,
107    Alert,
108    Emergency,
109}
110
111// ─── Roots ───────────────────────────────────────────────────────────────────
112
113#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct Root {
115    pub uri: String,
116    #[serde(skip_serializing_if = "Option::is_none")]
117    pub name: Option<String>,
118}
119
120// ─── Cursor / pagination ─────────────────────────────────────────────────────
121
122/// Opaque cursor for pagination
123pub type Cursor = String;
124
125#[derive(Debug, Clone, Default, Serialize, Deserialize)]
126pub struct PaginationParams {
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub cursor: Option<Cursor>,
129}