1use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8use turbomcp_core::MessageId;
9
10pub type ProtocolVersion = String;
12
13pub type RequestId = MessageId;
15
16pub type ProgressToken = String;
18
19pub type Uri = String;
21
22pub type MimeType = String;
24
25pub type Base64String = String;
27
28pub mod error_codes {
34 pub const PARSE_ERROR: i32 = -32700;
36 pub const INVALID_REQUEST: i32 = -32600;
38 pub const METHOD_NOT_FOUND: i32 = -32601;
40 pub const INVALID_PARAMS: i32 = -32602;
42 pub const INTERNAL_ERROR: i32 = -32603;
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
48pub struct JsonRpcError {
49 pub code: i32,
51 pub message: String,
53 #[serde(skip_serializing_if = "Option::is_none")]
55 pub data: Option<serde_json::Value>,
56}
57
58impl JsonRpcError {
59 pub fn new(code: i32, message: String) -> Self {
61 Self {
62 code,
63 message,
64 data: None,
65 }
66 }
67
68 pub fn with_data(code: i32, message: String, data: serde_json::Value) -> Self {
70 Self {
71 code,
72 message,
73 data: Some(data),
74 }
75 }
76
77 pub fn parse_error() -> Self {
79 Self::new(error_codes::PARSE_ERROR, "Parse error".to_string())
80 }
81
82 pub fn invalid_request() -> Self {
84 Self::new(error_codes::INVALID_REQUEST, "Invalid Request".to_string())
85 }
86
87 pub fn method_not_found(method: &str) -> Self {
89 Self::new(
90 error_codes::METHOD_NOT_FOUND,
91 format!("Method not found: {method}"),
92 )
93 }
94
95 pub fn invalid_params(details: &str) -> Self {
97 Self::new(
98 error_codes::INVALID_PARAMS,
99 format!("Invalid params: {details}"),
100 )
101 }
102
103 pub fn internal_error(details: &str) -> Self {
105 Self::new(
106 error_codes::INTERNAL_ERROR,
107 format!("Internal error: {details}"),
108 )
109 }
110}
111
112pub type Cursor = String;
114
115#[derive(Debug, Clone, Serialize, Deserialize)]
122pub struct BaseMetadata {
123 pub name: String,
125
126 #[serde(skip_serializing_if = "Option::is_none")]
132 pub title: Option<String>,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize)]
137pub struct Implementation {
138 pub name: String,
140 #[serde(skip_serializing_if = "Option::is_none")]
142 pub title: Option<String>,
143 pub version: String,
145}
146
147#[derive(Debug, Clone, Serialize, Deserialize, Default)]
149pub struct Annotations {
150 #[serde(skip_serializing_if = "Option::is_none")]
152 pub audience: Option<Vec<String>>,
153 #[serde(skip_serializing_if = "Option::is_none")]
155 pub priority: Option<f64>,
156 #[serde(flatten)]
158 pub custom: HashMap<String, serde_json::Value>,
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize)]
167#[serde(tag = "method")]
168pub enum ClientRequest {
169 #[serde(rename = "initialize")]
171 Initialize(InitializeRequest),
172
173 #[serde(rename = "tools/list")]
175 ListTools(ListToolsRequest),
176
177 #[serde(rename = "tools/call")]
179 CallTool(CallToolRequest),
180
181 #[serde(rename = "prompts/list")]
183 ListPrompts(ListPromptsRequest),
184
185 #[serde(rename = "prompts/get")]
187 GetPrompt(GetPromptRequest),
188
189 #[serde(rename = "resources/list")]
191 ListResources(ListResourcesRequest),
192
193 #[serde(rename = "resources/read")]
195 ReadResource(ReadResourceRequest),
196
197 #[serde(rename = "resources/subscribe")]
199 Subscribe(SubscribeRequest),
200
201 #[serde(rename = "resources/unsubscribe")]
203 Unsubscribe(UnsubscribeRequest),
204
205 #[serde(rename = "logging/setLevel")]
207 SetLevel(SetLevelRequest),
208
209 #[serde(rename = "sampling/createMessage")]
211 CreateMessage(CreateMessageRequest),
212
213 #[serde(rename = "roots/list")]
215 ListRoots(ListRootsRequest),
216}
217
218#[derive(Debug, Clone, Serialize, Deserialize)]
220#[serde(tag = "method")]
221pub enum ServerRequest {
222 #[serde(rename = "ping")]
224 Ping,
225}
226
227#[derive(Debug, Clone, Serialize, Deserialize)]
229#[serde(tag = "method")]
230pub enum ClientNotification {
231 #[serde(rename = "notifications/initialized")]
233 Initialized(InitializedNotification),
234
235 #[serde(rename = "notifications/progress")]
237 Progress(ProgressNotification),
238
239 #[serde(rename = "notifications/roots/list_changed")]
241 RootsListChanged(RootsListChangedNotification),
242}
243
244#[derive(Debug, Clone, Serialize, Deserialize)]
246#[serde(tag = "method")]
247pub enum ServerNotification {
248 #[serde(rename = "notifications/message")]
250 Message(LoggingNotification),
251
252 #[serde(rename = "notifications/resources/updated")]
254 ResourceUpdated(ResourceUpdatedNotification),
255
256 #[serde(rename = "notifications/resources/list_changed")]
258 ResourceListChanged,
259
260 #[serde(rename = "notifications/progress")]
262 Progress(ProgressNotification),
263
264 #[serde(rename = "notifications/cancelled")]
266 Cancelled(CancelledNotification),
267
268 #[serde(rename = "notifications/prompts/list_changed")]
270 PromptsListChanged,
271
272 #[serde(rename = "notifications/tools/list_changed")]
274 ToolsListChanged,
275
276 #[serde(rename = "notifications/roots/list_changed")]
278 RootsListChanged,
279}
280
281#[derive(Debug, Clone, Serialize, Deserialize)]
287pub struct InitializeRequest {
288 #[serde(rename = "protocolVersion")]
290 pub protocol_version: ProtocolVersion,
291 pub capabilities: ClientCapabilities,
293 #[serde(rename = "clientInfo")]
295 pub client_info: Implementation,
296}
297
298#[derive(Debug, Clone, Serialize, Deserialize)]
300pub struct InitializeResult {
301 #[serde(rename = "protocolVersion")]
303 pub protocol_version: ProtocolVersion,
304 pub capabilities: ServerCapabilities,
306 #[serde(rename = "serverInfo")]
308 pub server_info: Implementation,
309 #[serde(skip_serializing_if = "Option::is_none")]
311 pub instructions: Option<String>,
312}
313
314#[derive(Debug, Clone, Serialize, Deserialize)]
316pub struct InitializedNotification;
317
318#[derive(Debug, Clone, Serialize, Deserialize, Default)]
324pub struct ClientCapabilities {
325 #[serde(skip_serializing_if = "Option::is_none")]
327 pub experimental: Option<HashMap<String, serde_json::Value>>,
328
329 #[serde(skip_serializing_if = "Option::is_none")]
331 pub roots: Option<RootsCapabilities>,
332
333 #[serde(skip_serializing_if = "Option::is_none")]
335 pub sampling: Option<SamplingCapabilities>,
336
337 #[serde(skip_serializing_if = "Option::is_none")]
339 pub elicitation: Option<ElicitationCapabilities>,
340}
341
342#[derive(Debug, Clone, Serialize, Deserialize, Default)]
344pub struct ServerCapabilities {
345 #[serde(skip_serializing_if = "Option::is_none")]
347 pub experimental: Option<HashMap<String, serde_json::Value>>,
348
349 #[serde(skip_serializing_if = "Option::is_none")]
351 pub logging: Option<LoggingCapabilities>,
352
353 #[serde(skip_serializing_if = "Option::is_none")]
355 pub completions: Option<CompletionCapabilities>,
356
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub prompts: Option<PromptsCapabilities>,
360
361 #[serde(skip_serializing_if = "Option::is_none")]
363 pub resources: Option<ResourcesCapabilities>,
364
365 #[serde(skip_serializing_if = "Option::is_none")]
367 pub tools: Option<ToolsCapabilities>,
368}
369
370#[derive(Debug, Clone, Serialize, Deserialize, Default)]
372pub struct SamplingCapabilities;
373
374#[derive(Debug, Clone, Serialize, Deserialize, Default)]
376pub struct ElicitationCapabilities;
377
378#[derive(Debug, Clone, Serialize, Deserialize, Default)]
380pub struct CompletionCapabilities;
381
382#[derive(Debug, Clone, Serialize, Deserialize, Default)]
384pub struct RootsCapabilities {
385 #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
387 pub list_changed: Option<bool>,
388}
389
390#[derive(Debug, Clone, Serialize, Deserialize, Default)]
392pub struct LoggingCapabilities;
393
394#[derive(Debug, Clone, Serialize, Deserialize, Default)]
396pub struct PromptsCapabilities {
397 #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
399 pub list_changed: Option<bool>,
400}
401
402#[derive(Debug, Clone, Serialize, Deserialize, Default)]
404pub struct ResourcesCapabilities {
405 #[serde(skip_serializing_if = "Option::is_none")]
407 pub subscribe: Option<bool>,
408
409 #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
411 pub list_changed: Option<bool>,
412}
413
414#[derive(Debug, Clone, Serialize, Deserialize, Default)]
416pub struct ToolsCapabilities {
417 #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
419 pub list_changed: Option<bool>,
420}
421
422#[derive(Debug, Clone, Serialize, Deserialize)]
428#[serde(tag = "type")]
429pub enum ContentBlock {
430 #[serde(rename = "text")]
432 Text(TextContent),
433 #[serde(rename = "image")]
435 Image(ImageContent),
436 #[serde(rename = "audio")]
438 Audio(AudioContent),
439 #[serde(rename = "resource_link")]
441 ResourceLink(ResourceLink),
442 #[serde(rename = "resource")]
444 Resource(EmbeddedResource),
445}
446
447pub type Content = ContentBlock;
449
450#[derive(Debug, Clone, Serialize, Deserialize)]
452pub struct TextContent {
453 pub text: String,
455 #[serde(skip_serializing_if = "Option::is_none")]
457 pub annotations: Option<Annotations>,
458 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
460 pub meta: Option<HashMap<String, serde_json::Value>>,
461}
462
463#[derive(Debug, Clone, Serialize, Deserialize)]
465pub struct ImageContent {
466 pub data: String,
468 #[serde(rename = "mimeType")]
470 pub mime_type: String,
471 #[serde(skip_serializing_if = "Option::is_none")]
473 pub annotations: Option<Annotations>,
474 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
476 pub meta: Option<HashMap<String, serde_json::Value>>,
477}
478
479#[derive(Debug, Clone, Serialize, Deserialize)]
481pub struct AudioContent {
482 pub data: String,
484 #[serde(rename = "mimeType")]
486 pub mime_type: String,
487 #[serde(skip_serializing_if = "Option::is_none")]
489 pub annotations: Option<Annotations>,
490 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
492 pub meta: Option<HashMap<String, serde_json::Value>>,
493}
494
495#[derive(Debug, Clone, Serialize, Deserialize)]
497pub struct ResourceLink {
498 pub name: String,
500 #[serde(skip_serializing_if = "Option::is_none")]
502 pub title: Option<String>,
503 pub uri: String,
505 #[serde(skip_serializing_if = "Option::is_none")]
507 pub description: Option<String>,
508 #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
510 pub mime_type: Option<String>,
511 #[serde(skip_serializing_if = "Option::is_none")]
513 pub annotations: Option<Annotations>,
514 #[serde(skip_serializing_if = "Option::is_none")]
516 pub size: Option<u64>,
517 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
519 pub meta: Option<HashMap<String, serde_json::Value>>,
520}
521
522#[derive(Debug, Clone, Serialize, Deserialize)]
524pub struct EmbeddedResource {
525 pub resource: ResourceContent,
527 #[serde(skip_serializing_if = "Option::is_none")]
529 pub annotations: Option<Annotations>,
530 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
532 pub meta: Option<HashMap<String, serde_json::Value>>,
533}
534
535#[derive(Debug, Clone, Serialize, Deserialize)]
537#[serde(rename_all = "lowercase")]
538pub enum Role {
539 User,
541 Assistant,
543}
544
545#[derive(Debug, Clone, Serialize, Deserialize, Default)]
551pub struct ToolAnnotations {
552 #[serde(skip_serializing_if = "Option::is_none")]
554 pub title: Option<String>,
555 #[serde(skip_serializing_if = "Option::is_none")]
557 pub audience: Option<Vec<String>>,
558 #[serde(skip_serializing_if = "Option::is_none")]
560 pub priority: Option<f64>,
561 #[serde(flatten)]
563 pub custom: HashMap<String, serde_json::Value>,
564}
565
566#[derive(Debug, Clone, Serialize, Deserialize)]
568pub struct Tool {
569 pub name: String,
571
572 #[serde(skip_serializing_if = "Option::is_none")]
574 pub title: Option<String>,
575
576 #[serde(skip_serializing_if = "Option::is_none")]
579 pub description: Option<String>,
580
581 #[serde(rename = "inputSchema")]
583 pub input_schema: ToolInputSchema,
584
585 #[serde(rename = "outputSchema", skip_serializing_if = "Option::is_none")]
588 pub output_schema: Option<ToolOutputSchema>,
589
590 #[serde(skip_serializing_if = "Option::is_none")]
593 pub annotations: Option<ToolAnnotations>,
594
595 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
597 pub meta: Option<HashMap<String, serde_json::Value>>,
598}
599
600#[derive(Debug, Clone, Serialize, Deserialize)]
602pub struct ToolInputSchema {
603 #[serde(rename = "type")]
605 pub schema_type: String,
606 #[serde(skip_serializing_if = "Option::is_none")]
608 pub properties: Option<HashMap<String, serde_json::Value>>,
609 #[serde(skip_serializing_if = "Option::is_none")]
611 pub required: Option<Vec<String>>,
612 #[serde(
614 rename = "additionalProperties",
615 skip_serializing_if = "Option::is_none"
616 )]
617 pub additional_properties: Option<bool>,
618}
619
620#[derive(Debug, Clone, Serialize, Deserialize)]
622pub struct ToolOutputSchema {
623 #[serde(rename = "type")]
625 pub schema_type: String,
626 #[serde(skip_serializing_if = "Option::is_none")]
628 pub properties: Option<HashMap<String, serde_json::Value>>,
629 #[serde(skip_serializing_if = "Option::is_none")]
631 pub required: Option<Vec<String>>,
632 #[serde(
634 rename = "additionalProperties",
635 skip_serializing_if = "Option::is_none"
636 )]
637 pub additional_properties: Option<bool>,
638}
639
640#[derive(Debug, Clone, Serialize, Deserialize)]
642pub struct ListToolsRequest;
643
644#[derive(Debug, Clone, Serialize, Deserialize)]
646pub struct ListToolsResult {
647 pub tools: Vec<Tool>,
649 #[serde(rename = "nextCursor", skip_serializing_if = "Option::is_none")]
651 pub next_cursor: Option<String>,
652}
653
654#[derive(Debug, Clone, Serialize, Deserialize)]
656pub struct CallToolRequest {
657 pub name: String,
659 #[serde(skip_serializing_if = "Option::is_none")]
661 pub arguments: Option<HashMap<String, serde_json::Value>>,
662}
663
664#[derive(Debug, Clone, Serialize, Deserialize)]
666pub struct CallToolResult {
667 pub content: Vec<ContentBlock>,
669 #[serde(rename = "isError", skip_serializing_if = "Option::is_none")]
671 pub is_error: Option<bool>,
672}
673
674#[derive(Debug, Clone, Serialize, Deserialize)]
680pub struct Prompt {
681 pub name: String,
683
684 #[serde(skip_serializing_if = "Option::is_none")]
686 pub title: Option<String>,
687
688 #[serde(skip_serializing_if = "Option::is_none")]
690 pub description: Option<String>,
691
692 #[serde(skip_serializing_if = "Option::is_none")]
694 pub arguments: Option<Vec<PromptArgument>>,
695
696 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
698 pub meta: Option<HashMap<String, serde_json::Value>>,
699}
700
701#[derive(Debug, Clone, Serialize, Deserialize)]
703pub struct PromptArgument {
704 pub name: String,
706
707 #[serde(skip_serializing_if = "Option::is_none")]
709 pub title: Option<String>,
710
711 #[serde(skip_serializing_if = "Option::is_none")]
713 pub description: Option<String>,
714
715 #[serde(skip_serializing_if = "Option::is_none")]
717 pub required: Option<bool>,
718}
719
720pub type PromptInput = HashMap<String, serde_json::Value>;
722
723#[derive(Debug, Clone, Serialize, Deserialize)]
725pub struct ListPromptsRequest;
726
727#[derive(Debug, Clone, Serialize, Deserialize)]
729pub struct ListPromptsResult {
730 pub prompts: Vec<Prompt>,
732 #[serde(rename = "nextCursor", skip_serializing_if = "Option::is_none")]
734 pub next_cursor: Option<String>,
735}
736
737#[derive(Debug, Clone, Serialize, Deserialize)]
739pub struct GetPromptRequest {
740 pub name: String,
742 #[serde(skip_serializing_if = "Option::is_none")]
744 pub arguments: Option<PromptInput>,
745}
746
747#[derive(Debug, Clone, Serialize, Deserialize)]
749pub struct GetPromptResult {
750 #[serde(skip_serializing_if = "Option::is_none")]
752 pub description: Option<String>,
753 pub messages: Vec<PromptMessage>,
755}
756
757#[derive(Debug, Clone, Serialize, Deserialize)]
759pub struct PromptMessage {
760 pub role: Role,
762 pub content: Content,
764}
765
766#[derive(Debug, Clone, Serialize, Deserialize)]
772pub struct Resource {
773 pub name: String,
775
776 #[serde(skip_serializing_if = "Option::is_none")]
778 pub title: Option<String>,
779
780 pub uri: String,
782
783 #[serde(skip_serializing_if = "Option::is_none")]
786 pub description: Option<String>,
787
788 #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
790 pub mime_type: Option<String>,
791
792 #[serde(skip_serializing_if = "Option::is_none")]
794 pub annotations: Option<Annotations>,
795
796 #[serde(skip_serializing_if = "Option::is_none")]
799 pub size: Option<u64>,
800
801 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
803 pub meta: Option<HashMap<String, serde_json::Value>>,
804}
805
806#[derive(Debug, Clone, Serialize, Deserialize)]
808pub struct ResourceContents {
809 pub uri: String,
811 #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
813 pub mime_type: Option<String>,
814 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
816 pub meta: Option<HashMap<String, serde_json::Value>>,
817}
818
819#[derive(Debug, Clone, Serialize, Deserialize)]
821pub struct TextResourceContents {
822 pub uri: String,
824 #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
826 pub mime_type: Option<String>,
827 pub text: String,
829 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
831 pub meta: Option<HashMap<String, serde_json::Value>>,
832}
833
834#[derive(Debug, Clone, Serialize, Deserialize)]
836pub struct BlobResourceContents {
837 pub uri: String,
839 #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
841 pub mime_type: Option<String>,
842 pub blob: String,
844 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
846 pub meta: Option<HashMap<String, serde_json::Value>>,
847}
848
849#[derive(Debug, Clone, Serialize, Deserialize)]
851#[serde(untagged)]
852pub enum ResourceContent {
853 Text(TextResourceContents),
855 Blob(BlobResourceContents),
857}
858
859#[derive(Debug, Clone, Serialize, Deserialize)]
861pub struct ListResourcesRequest {
862 #[serde(skip_serializing_if = "Option::is_none")]
864 pub cursor: Option<String>,
865}
866
867#[derive(Debug, Clone, Serialize, Deserialize)]
869pub struct ListResourcesResult {
870 pub resources: Vec<Resource>,
872 #[serde(rename = "nextCursor", skip_serializing_if = "Option::is_none")]
874 pub next_cursor: Option<String>,
875}
876
877#[derive(Debug, Clone, Serialize, Deserialize)]
879pub struct ReadResourceRequest {
880 pub uri: Uri,
882}
883
884#[derive(Debug, Clone, Serialize, Deserialize)]
886pub struct ReadResourceResult {
887 pub contents: Vec<ResourceContent>,
889}
890
891#[derive(Debug, Clone, Serialize, Deserialize)]
893pub struct SubscribeRequest {
894 pub uri: Uri,
896}
897
898#[derive(Debug, Clone, Serialize, Deserialize)]
900pub struct UnsubscribeRequest {
901 pub uri: Uri,
903}
904
905#[derive(Debug, Clone, Serialize, Deserialize)]
907pub struct ResourceUpdatedNotification {
908 pub uri: Uri,
910}
911
912#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
918#[serde(rename_all = "lowercase")]
919pub enum LogLevel {
920 Debug,
922 Info,
924 Notice,
926 Warning,
928 Error,
930 Critical,
932 Alert,
934 Emergency,
936}
937
938#[derive(Debug, Clone, Serialize, Deserialize)]
940pub struct SetLevelRequest {
941 pub level: LogLevel,
943}
944
945#[derive(Debug, Clone, Serialize, Deserialize)]
947pub struct SetLevelResult;
948
949#[derive(Debug, Clone, Serialize, Deserialize)]
951pub struct LoggingNotification {
952 pub level: LogLevel,
954 pub data: serde_json::Value,
956 #[serde(skip_serializing_if = "Option::is_none")]
958 pub logger: Option<String>,
959}
960
961#[derive(Debug, Clone, Serialize, Deserialize)]
967pub struct ProgressNotification {
968 #[serde(rename = "progressToken")]
971 pub progress_token: ProgressToken,
972 pub progress: f64,
975 #[serde(skip_serializing_if = "Option::is_none")]
977 pub total: Option<f64>,
978 #[serde(skip_serializing_if = "Option::is_none")]
980 pub message: Option<String>,
981}
982
983#[derive(Debug, Clone, Serialize, Deserialize)]
985pub struct CancelledNotification {
986 #[serde(rename = "requestId")]
989 pub request_id: RequestId,
990 #[serde(skip_serializing_if = "Option::is_none")]
993 pub reason: Option<String>,
994}
995
996#[derive(Debug, Clone, Serialize, Deserialize)]
1002pub struct CreateMessageRequest {
1003 pub messages: Vec<SamplingMessage>,
1005 #[serde(rename = "modelPreferences", skip_serializing_if = "Option::is_none")]
1007 pub model_preferences: Option<ModelPreferences>,
1008 #[serde(rename = "systemPrompt", skip_serializing_if = "Option::is_none")]
1010 pub system_prompt: Option<String>,
1011 #[serde(rename = "includeContext", skip_serializing_if = "Option::is_none")]
1013 pub include_context: Option<IncludeContext>,
1014 #[serde(skip_serializing_if = "Option::is_none")]
1016 pub temperature: Option<f64>,
1017 #[serde(rename = "maxTokens", skip_serializing_if = "Option::is_none")]
1019 pub max_tokens: Option<u32>,
1020 #[serde(rename = "stopSequences", skip_serializing_if = "Option::is_none")]
1022 pub stop_sequences: Option<Vec<String>>,
1023 #[serde(skip_serializing_if = "Option::is_none")]
1025 pub metadata: Option<HashMap<String, serde_json::Value>>,
1026}
1027
1028#[derive(Debug, Clone, Serialize, Deserialize)]
1030pub struct ModelPreferences {
1031 #[serde(skip_serializing_if = "Option::is_none")]
1033 pub hints: Option<Vec<ModelHint>>,
1034 #[serde(rename = "costPriority", skip_serializing_if = "Option::is_none")]
1036 pub cost_priority: Option<f64>,
1037 #[serde(rename = "speedPriority", skip_serializing_if = "Option::is_none")]
1039 pub speed_priority: Option<f64>,
1040 #[serde(
1042 rename = "intelligencePriority",
1043 skip_serializing_if = "Option::is_none"
1044 )]
1045 pub intelligence_priority: Option<f64>,
1046}
1047
1048#[derive(Debug, Clone, Serialize, Deserialize)]
1050pub struct ModelHint {
1051 pub name: Option<String>,
1053}
1054
1055#[derive(Debug, Clone, Serialize, Deserialize)]
1057#[serde(rename_all = "lowercase")]
1058pub enum IncludeContext {
1059 None,
1061 ThisServer,
1063 AllServers,
1065}
1066
1067#[derive(Debug, Clone, Serialize, Deserialize)]
1069pub struct SamplingMessage {
1070 pub role: Role,
1072 pub content: Content,
1074}
1075
1076#[derive(Debug, Clone, Serialize, Deserialize)]
1078pub struct CreateMessageResult {
1079 pub role: Role,
1081 pub content: Content,
1083 #[serde(skip_serializing_if = "Option::is_none")]
1085 pub model: Option<String>,
1086 #[serde(rename = "stopReason", skip_serializing_if = "Option::is_none")]
1088 pub stop_reason: Option<String>,
1089}
1090
1091#[derive(Debug, Clone, Serialize, Deserialize)]
1097pub struct Root {
1098 pub uri: Uri,
1100 #[serde(skip_serializing_if = "Option::is_none")]
1102 pub name: Option<String>,
1103}
1104
1105#[derive(Debug, Clone, Serialize, Deserialize)]
1107pub struct ListRootsRequest;
1108
1109#[derive(Debug, Clone, Serialize, Deserialize)]
1111pub struct ListRootsResult {
1112 pub roots: Vec<Root>,
1114}
1115
1116#[derive(Debug, Clone, Serialize, Deserialize)]
1118pub struct RootsListChangedNotification;
1119
1120#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1122pub struct EmptyResult {}
1123
1124#[cfg(test)]
1125mod tests {
1126 use super::*;
1127
1128 #[test]
1129 fn test_serialize_deserialize() {
1130 let tool = Tool {
1131 name: "test_tool".to_string(),
1132 title: Some("Test Tool".to_string()),
1133 description: Some("A test tool".to_string()),
1134 input_schema: ToolInputSchema {
1135 schema_type: "object".to_string(),
1136 properties: None,
1137 required: None,
1138 additional_properties: None,
1139 },
1140 output_schema: None,
1141 annotations: None,
1142 meta: None,
1143 };
1144
1145 let json = serde_json::to_string(&tool).unwrap();
1146 let deserialized: Tool = serde_json::from_str(&json).unwrap();
1147 assert_eq!(tool.name, deserialized.name);
1148 }
1149
1150 #[test]
1151 fn test_content_types() {
1152 let text_content = ContentBlock::Text(TextContent {
1153 text: "Hello, World!".to_string(),
1154 annotations: None,
1155 meta: None,
1156 });
1157
1158 let json = serde_json::to_string(&text_content).unwrap();
1159 let _deserialized: ContentBlock = serde_json::from_str(&json).unwrap();
1160
1161 let _compatible: Content = text_content;
1163 }
1164}