poem_mcpserver/protocol/
initialize.rs1use serde::{Deserialize, Serialize};
4use time::Date;
5
6#[derive(Debug, Deserialize)]
8pub struct ClientCapabilities {}
9
10#[derive(Debug, Deserialize)]
12pub struct ClientInfo {
13 pub name: String,
15 pub version: String,
17}
18
19#[derive(Debug, Deserialize)]
21#[serde(rename_all = "camelCase")]
22pub struct InitializeRequest {
23 #[serde(with = "protocol_version_serde")]
25 pub protocol_version: Date,
26 pub capabilities: ClientCapabilities,
28 pub client_info: ClientInfo,
30}
31
32#[derive(Debug, Serialize)]
34#[serde(rename_all = "camelCase")]
35pub struct PromptsCapability {
36 pub list_changed: bool,
39}
40
41#[derive(Debug, Serialize)]
43#[serde(rename_all = "camelCase")]
44pub struct ResourcesCapability {
45 pub list_changed: bool,
48 pub subscribe: bool,
51}
52
53#[derive(Debug, Serialize)]
55#[serde(rename_all = "camelCase")]
56pub struct ToolsCapability {
57 pub list_changed: bool,
60}
61
62#[derive(Debug, Serialize)]
64#[serde(rename_all = "camelCase")]
65pub struct ServerCapabilities {
66 pub prompts: PromptsCapability,
68 pub resources: ResourcesCapability,
70 pub tools: ToolsCapability,
72}
73
74#[derive(Debug, Clone, Serialize)]
76pub struct ServerInfo {
77 pub name: String,
79 pub version: String,
81}
82
83#[derive(Debug, Serialize)]
85#[serde(rename_all = "camelCase")]
86pub struct InitializeResponse {
87 #[serde(with = "protocol_version_serde")]
89 pub protocol_version: Date,
90 pub capabilities: ServerCapabilities,
92 pub server_info: ServerInfo,
94 pub instructions: Option<String>,
96}
97
98mod protocol_version_serde {
99 use serde::{Deserialize, Deserializer, Serializer, de::Error as _};
100 use time::{Date, format_description::BorrowedFormatItem};
101
102 const DESC: &[BorrowedFormatItem] = time::macros::format_description!("[year]-[month]-[day]");
103
104 pub(super) fn serialize<S>(date: &Date, serializer: S) -> Result<S::Ok, S::Error>
105 where
106 S: Serializer,
107 {
108 serializer.serialize_str(&date.format(DESC).unwrap())
109 }
110
111 pub(super) fn deserialize<'de, D>(deserializer: D) -> Result<Date, D::Error>
112 where
113 D: Deserializer<'de>,
114 {
115 let s = String::deserialize(deserializer)?;
116 Date::parse(&s, DESC).map_err(|err| D::Error::custom(err.to_string()))
117 }
118}