Skip to main content

mcp_kit/types/
mod.rs

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