1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
11#[serde(untagged)]
12pub enum JSONRPCMessage {
13 Request(JSONRPCRequest),
14 Notification(JSONRPCNotification),
15 BatchRequest(JSONRPCBatchRequest),
16 Response(JSONRPCResponse),
17 Error(JSONRPCError),
18 BatchResponse(JSONRPCBatchResponse),
19}
20
21pub type JSONRPCBatchRequest = Vec<JSONRPCRequestOrNotification>;
23
24#[derive(Debug, Clone, Serialize, Deserialize)]
25#[serde(untagged)]
26pub enum JSONRPCRequestOrNotification {
27 Request(JSONRPCRequest),
28 Notification(JSONRPCNotification),
29}
30
31pub type JSONRPCBatchResponse = Vec<JSONRPCResponseOrError>;
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
35#[serde(untagged)]
36pub enum JSONRPCResponseOrError {
37 Response(JSONRPCResponse),
38 Error(JSONRPCError),
39}
40
41pub const LATEST_PROTOCOL_VERSION: &str = "2025-03-26";
42pub const JSONRPC_VERSION: &str = "2.0";
43
44#[derive(Debug, Clone, Serialize, Deserialize)]
47#[serde(untagged)]
48pub enum ProgressToken {
49 String(String),
50 Number(i64),
51}
52
53pub type Cursor = String;
55
56#[derive(Debug, Clone, Serialize, Deserialize)]
57pub struct Request {
58 pub method: String,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 pub params: Option<RequestParams>,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize)]
64pub struct RequestParams {
65 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
66 pub meta: Option<RequestMeta>,
67 #[serde(flatten)]
68 pub other: HashMap<String, Value>,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct RequestMeta {
73 #[serde(rename = "progressToken", skip_serializing_if = "Option::is_none")]
79 pub progress_token: Option<ProgressToken>,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize)]
83pub struct Notification {
84 pub method: String,
85 #[serde(skip_serializing_if = "Option::is_none")]
86 pub params: Option<NotificationParams>,
87}
88
89#[derive(Debug, Clone, Serialize, Deserialize)]
90pub struct NotificationParams {
91 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
94 pub meta: Option<HashMap<String, Value>>,
95 #[serde(flatten)]
96 pub other: HashMap<String, Value>,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize)]
100pub struct Result {
101 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
104 pub meta: Option<HashMap<String, Value>>,
105 #[serde(flatten)]
106 pub other: HashMap<String, Value>,
107}
108
109#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
111#[serde(untagged)]
112pub enum RequestId {
113 String(String),
114 Number(i64),
115}
116
117#[derive(Debug, Clone, Serialize, Deserialize)]
119pub struct JSONRPCRequest {
120 pub jsonrpc: String,
121 pub id: RequestId,
122 #[serde(flatten)]
123 pub request: Request,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize)]
128pub struct JSONRPCNotification {
129 pub jsonrpc: String,
130 #[serde(flatten)]
131 pub notification: Notification,
132}
133
134#[derive(Debug, Clone, Serialize, Deserialize)]
136pub struct JSONRPCResponse {
137 pub jsonrpc: String,
138 pub id: RequestId,
139 pub result: Result,
140}
141
142pub const PARSE_ERROR: i32 = -32700;
144pub const INVALID_REQUEST: i32 = -32600;
145pub const METHOD_NOT_FOUND: i32 = -32601;
146pub const INVALID_PARAMS: i32 = -32602;
147pub const INTERNAL_ERROR: i32 = -32603;
148
149#[derive(Debug, Clone, Serialize, Deserialize)]
151pub struct JSONRPCError {
152 pub jsonrpc: String,
153 pub id: RequestId,
154 pub error: ErrorObject,
155}
156
157#[derive(Debug, Clone, Serialize, Deserialize)]
158pub struct ErrorObject {
159 pub code: i32,
161 pub message: String,
164 #[serde(skip_serializing_if = "Option::is_none")]
168 pub data: Option<Value>,
169}
170
171pub type EmptyResult = Result;
174
175#[derive(Debug, Clone, Serialize, Deserialize)]
188pub struct CancelledNotification {
189 pub method: String,
190 pub params: CancelledParams,
191}
192
193#[derive(Debug, Clone, Serialize, Deserialize)]
194pub struct CancelledParams {
195 #[serde(rename = "requestId")]
200 pub request_id: RequestId,
201 #[serde(skip_serializing_if = "Option::is_none")]
204 pub reason: Option<String>,
205}
206
207#[derive(Debug, Clone, Serialize, Deserialize)]
210pub struct InitializeParams {
211 #[serde(rename = "protocolVersion")]
214 pub protocol_version: String,
215 pub capabilities: ClientCapabilities,
216 #[serde(rename = "clientInfo")]
217 pub client_info: Implementation,
218}
219
220#[derive(Debug, Clone, Serialize, Deserialize)]
223pub struct InitializeResult {
224 #[serde(rename = "protocolVersion")]
228 pub protocol_version: String,
229 pub capabilities: ServerCapabilities,
230 #[serde(rename = "serverInfo")]
231 pub server_info: Implementation,
232 #[serde(skip_serializing_if = "Option::is_none")]
239 pub instructions: Option<String>,
240 #[serde(flatten)]
241 pub result: Result,
242}
243
244#[derive(Debug, Clone, Serialize, Deserialize)]
247pub struct InitializedNotification {
248 pub method: String,
249}
250
251#[derive(Debug, Clone, Serialize, Deserialize, Default)]
255pub struct ClientCapabilities {
256 #[serde(skip_serializing_if = "Option::is_none")]
258 pub experimental: Option<HashMap<String, Value>>,
259 #[serde(skip_serializing_if = "Option::is_none")]
261 pub roots: Option<RootsCapability>,
262 #[serde(skip_serializing_if = "Option::is_none")]
264 pub sampling: Option<Value>,
265}
266
267#[derive(Debug, Clone, Serialize, Deserialize)]
268pub struct RootsCapability {
269 #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
271 pub list_changed: Option<bool>,
272}
273
274#[derive(Debug, Clone, Serialize, Deserialize, Default)]
278pub struct ServerCapabilities {
279 #[serde(skip_serializing_if = "Option::is_none")]
281 pub experimental: Option<HashMap<String, Value>>,
282 #[serde(skip_serializing_if = "Option::is_none")]
284 pub logging: Option<Value>,
285 #[serde(skip_serializing_if = "Option::is_none")]
287 pub completions: Option<Value>,
288 #[serde(skip_serializing_if = "Option::is_none")]
290 pub prompts: Option<PromptsCapability>,
291 #[serde(skip_serializing_if = "Option::is_none")]
293 pub resources: Option<ResourcesCapability>,
294 #[serde(skip_serializing_if = "Option::is_none")]
296 pub tools: Option<ToolsCapability>,
297}
298
299#[derive(Debug, Clone, Serialize, Deserialize)]
300pub struct PromptsCapability {
301 #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
304 pub list_changed: Option<bool>,
305}
306
307#[derive(Debug, Clone, Serialize, Deserialize)]
308pub struct ResourcesCapability {
309 #[serde(skip_serializing_if = "Option::is_none")]
311 pub subscribe: Option<bool>,
312 #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
315 pub list_changed: Option<bool>,
316}
317
318#[derive(Debug, Clone, Serialize, Deserialize)]
319pub struct ToolsCapability {
320 #[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
322 pub list_changed: Option<bool>,
323}
324
325#[derive(Debug, Clone, Serialize, Deserialize)]
327pub struct Implementation {
328 pub name: String,
329 pub version: String,
330}
331
332#[derive(Debug, Clone, Serialize, Deserialize)]
338pub struct ProgressNotification {
339 pub method: String,
340 pub params: ProgressParams,
341}
342
343#[derive(Debug, Clone, Serialize, Deserialize)]
344pub struct ProgressParams {
345 #[serde(rename = "progressToken")]
348 pub progress_token: ProgressToken,
349 pub progress: f64,
352 #[serde(skip_serializing_if = "Option::is_none")]
354 pub total: Option<f64>,
355 #[serde(skip_serializing_if = "Option::is_none")]
357 pub message: Option<String>,
358}
359
360#[derive(Debug, Clone, Serialize, Deserialize)]
362pub struct PaginatedRequest {
363 #[serde(flatten)]
364 pub request: Request,
365}
366
367#[derive(Debug, Clone, Serialize, Deserialize)]
368pub struct PaginatedParams {
369 #[serde(skip_serializing_if = "Option::is_none")]
373 pub cursor: Option<Cursor>,
374 #[serde(flatten)]
375 pub other: HashMap<String, Value>,
376}
377
378#[derive(Debug, Clone, Serialize, Deserialize)]
379pub struct PaginatedResult {
380 #[serde(rename = "nextCursor", skip_serializing_if = "Option::is_none")]
383 pub next_cursor: Option<Cursor>,
384 #[serde(flatten)]
385 pub result: Result,
386}
387
388#[derive(Debug, Clone, Serialize, Deserialize)]
392pub struct ListResourcesResult {
393 pub resources: Vec<Resource>,
394 #[serde(flatten)]
395 pub paginated: PaginatedResult,
396}
397
398#[derive(Debug, Clone, Serialize, Deserialize)]
400pub struct ListResourceTemplatesResult {
401 #[serde(rename = "resourceTemplates")]
402 pub resource_templates: Vec<ResourceTemplate>,
403 #[serde(flatten)]
404 pub paginated: PaginatedResult,
405}
406
407#[derive(Debug, Clone, Serialize, Deserialize)]
408pub struct ReadResourceParams {
409 pub uri: String,
412}
413
414#[derive(Debug, Clone, Serialize, Deserialize)]
416pub struct ReadResourceResult {
417 pub contents: Vec<ResourceContents>,
418 #[serde(flatten)]
419 pub result: Result,
420}
421
422#[derive(Debug, Clone, Serialize, Deserialize)]
426pub struct ResourceListChangedNotification {
427 pub method: String,
428}
429
430#[derive(Debug, Clone, Serialize, Deserialize)]
434pub struct ResourceUpdatedNotification {
435 pub method: String,
436 pub params: ResourceUpdatedParams,
437}
438
439#[derive(Debug, Clone, Serialize, Deserialize)]
440pub struct ResourceUpdatedParams {
441 pub uri: String,
444}
445
446#[derive(Debug, Clone, Serialize, Deserialize)]
448pub struct Resource {
449 pub uri: String,
451 pub name: String,
455 #[serde(skip_serializing_if = "Option::is_none")]
461 pub description: Option<String>,
462 #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
464 pub mime_type: Option<String>,
465 #[serde(skip_serializing_if = "Option::is_none")]
467 pub annotations: Option<Annotations>,
468 #[serde(skip_serializing_if = "Option::is_none")]
474 pub size: Option<i64>,
475}
476
477#[derive(Debug, Clone, Serialize, Deserialize)]
479pub struct ResourceTemplate {
480 #[serde(rename = "uriTemplate")]
483 pub uri_template: String,
484 pub name: String,
488 #[serde(skip_serializing_if = "Option::is_none")]
494 pub description: Option<String>,
495 #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
499 pub mime_type: Option<String>,
500 #[serde(skip_serializing_if = "Option::is_none")]
502 pub annotations: Option<Annotations>,
503}
504
505#[derive(Debug, Clone, Serialize, Deserialize)]
507#[serde(untagged)]
508pub enum ResourceContents {
509 Text(TextResourceContents),
510 Blob(BlobResourceContents),
511}
512
513#[derive(Debug, Clone, Serialize, Deserialize)]
514pub struct TextResourceContents {
515 pub uri: String,
517 #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
519 pub mime_type: Option<String>,
520 pub text: String,
523}
524
525#[derive(Debug, Clone, Serialize, Deserialize)]
526pub struct BlobResourceContents {
527 pub uri: String,
529 #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
531 pub mime_type: Option<String>,
532 pub blob: String,
534}
535
536#[derive(Debug, Clone, Serialize, Deserialize)]
540pub struct ListPromptsResult {
541 pub prompts: Vec<Prompt>,
542 #[serde(flatten)]
543 pub paginated: PaginatedResult,
544}
545
546#[derive(Debug, Clone, Serialize, Deserialize)]
548pub struct GetPromptResult {
549 #[serde(skip_serializing_if = "Option::is_none")]
551 pub description: Option<String>,
552 pub messages: Vec<PromptMessage>,
553 #[serde(flatten)]
554 pub result: Result,
555}
556
557#[derive(Debug, Clone, Serialize, Deserialize)]
559pub struct Prompt {
560 pub name: String,
562 #[serde(skip_serializing_if = "Option::is_none")]
564 pub description: Option<String>,
565 #[serde(skip_serializing_if = "Option::is_none")]
567 pub arguments: Option<Vec<PromptArgument>>,
568}
569
570#[derive(Debug, Clone, Serialize, Deserialize)]
572pub struct PromptArgument {
573 pub name: String,
575 #[serde(skip_serializing_if = "Option::is_none")]
577 pub description: Option<String>,
578 #[serde(skip_serializing_if = "Option::is_none")]
580 pub required: Option<bool>,
581}
582
583#[derive(Debug, Clone, Serialize, Deserialize)]
585#[serde(rename_all = "lowercase")]
586pub enum Role {
587 User,
588 Assistant,
589}
590
591#[derive(Debug, Clone, Serialize, Deserialize)]
596pub struct PromptMessage {
597 pub role: Role,
598 pub content: Content,
599}
600
601#[derive(Debug, Clone, Serialize, Deserialize)]
602#[serde(tag = "type", rename_all = "lowercase")]
603pub enum Content {
604 Text(TextContent),
605 Image(ImageContent),
606 Audio(AudioContent),
607 Resource(EmbeddedResource),
608}
609
610#[derive(Debug, Clone, Serialize, Deserialize)]
615pub struct EmbeddedResource {
616 pub resource: ResourceContents,
617 #[serde(skip_serializing_if = "Option::is_none")]
619 pub annotations: Option<Annotations>,
620}
621
622#[derive(Debug, Clone, Serialize, Deserialize)]
626pub struct PromptListChangedNotification {
627 pub method: String,
628}
629
630#[derive(Debug, Clone, Serialize, Deserialize)]
634pub struct ListToolsResult {
635 pub tools: Vec<Tool>,
636 #[serde(flatten)]
637 pub paginated: PaginatedResult,
638}
639
640#[derive(Debug, Clone, Serialize, Deserialize)]
651pub struct CallToolResult {
652 pub content: Vec<Content>,
653 #[serde(rename = "isError", skip_serializing_if = "Option::is_none")]
657 pub is_error: Option<bool>,
658 #[serde(flatten)]
659 pub result: Result,
660}
661
662#[derive(Debug, Clone, Serialize, Deserialize)]
666pub struct ToolListChangedNotification {
667 pub method: String,
668}
669
670#[derive(Debug, Clone, Serialize, Deserialize)]
679pub struct ToolAnnotations {
680 #[serde(skip_serializing_if = "Option::is_none")]
682 pub title: Option<String>,
683 #[serde(rename = "readOnlyHint", skip_serializing_if = "Option::is_none")]
687 pub read_only_hint: Option<bool>,
688 #[serde(rename = "destructiveHint", skip_serializing_if = "Option::is_none")]
695 pub destructive_hint: Option<bool>,
696 #[serde(rename = "idempotentHint", skip_serializing_if = "Option::is_none")]
703 pub idempotent_hint: Option<bool>,
704 #[serde(rename = "openWorldHint", skip_serializing_if = "Option::is_none")]
711 pub open_world_hint: Option<bool>,
712}
713
714#[derive(Debug, Clone, Serialize, Deserialize)]
716pub struct CallToolParams {
717 pub name: String,
719 #[serde(skip_serializing_if = "Option::is_none")]
721 pub arguments: Option<HashMap<String, Value>>,
722}
723
724#[derive(Debug, Clone, Serialize, Deserialize)]
726pub struct GetPromptParams {
727 pub name: String,
729 #[serde(skip_serializing_if = "Option::is_none")]
731 pub arguments: Option<HashMap<String, Value>>,
732}
733
734#[derive(Debug, Clone, Serialize, Deserialize)]
736pub struct Tool {
737 pub name: String,
739 #[serde(skip_serializing_if = "Option::is_none")]
744 pub description: Option<String>,
745 #[serde(rename = "inputSchema")]
747 pub input_schema: ToolInputSchema,
748 #[serde(skip_serializing_if = "Option::is_none")]
750 pub annotations: Option<ToolAnnotations>,
751}
752
753#[derive(Debug, Clone, Serialize, Deserialize)]
754pub struct ToolInputSchema {
755 #[serde(rename = "type")]
756 pub schema_type: String,
757 #[serde(skip_serializing_if = "Option::is_none")]
758 pub properties: Option<HashMap<String, Value>>,
759 #[serde(skip_serializing_if = "Option::is_none")]
760 pub required: Option<Vec<String>>,
761}
762
763#[derive(Debug, Clone, Serialize, Deserialize)]
769pub struct LoggingMessageNotification {
770 pub method: String,
771 pub params: LoggingMessageParams,
772}
773
774#[derive(Debug, Clone, Serialize, Deserialize)]
775pub struct LoggingMessageParams {
776 pub level: LoggingLevel,
778 #[serde(skip_serializing_if = "Option::is_none")]
780 pub logger: Option<String>,
781 pub data: Value,
784}
785
786#[derive(Debug, Clone, Serialize, Deserialize)]
791#[serde(rename_all = "lowercase")]
792pub enum LoggingLevel {
793 Debug,
794 Info,
795 Notice,
796 Warning,
797 Error,
798 Critical,
799 Alert,
800 Emergency,
801}
802
803#[derive(Debug, Clone, Serialize, Deserialize)]
809pub struct CreateMessageRequest {
810 pub method: String,
811 pub params: CreateMessageParams,
812}
813
814#[derive(Debug, Clone, Serialize, Deserialize)]
815pub struct CreateMessageParams {
816 pub messages: Vec<SamplingMessage>,
817 #[serde(rename = "modelPreferences", skip_serializing_if = "Option::is_none")]
820 pub model_preferences: Option<ModelPreferences>,
821 #[serde(rename = "systemPrompt", skip_serializing_if = "Option::is_none")]
824 pub system_prompt: Option<String>,
825 #[serde(rename = "includeContext", skip_serializing_if = "Option::is_none")]
829 pub include_context: Option<IncludeContext>,
830 #[serde(skip_serializing_if = "Option::is_none")]
831 pub temperature: Option<f64>,
832 #[serde(rename = "maxTokens")]
835 pub max_tokens: i64,
836 #[serde(rename = "stopSequences", skip_serializing_if = "Option::is_none")]
837 pub stop_sequences: Option<Vec<String>>,
838 #[serde(skip_serializing_if = "Option::is_none")]
841 pub metadata: Option<Value>,
842}
843
844#[derive(Debug, Clone, Serialize, Deserialize)]
845#[serde(rename_all = "camelCase")]
846pub enum IncludeContext {
847 None,
848 ThisServer,
849 AllServers,
850}
851
852#[derive(Debug, Clone, Serialize, Deserialize)]
857pub struct CreateMessageResult {
858 pub role: Role,
859 pub content: SamplingContent,
860 pub model: String,
862 #[serde(rename = "stopReason", skip_serializing_if = "Option::is_none")]
864 pub stop_reason: Option<StopReason>,
865 #[serde(flatten)]
866 pub result: Result,
867}
868
869#[derive(Debug, Clone, Serialize, Deserialize)]
870#[serde(rename_all = "camelCase")]
871pub enum StopReason {
872 EndTurn,
873 StopSequence,
874 MaxTokens,
875 #[serde(untagged)]
876 Other(String),
877}
878
879#[derive(Debug, Clone, Serialize, Deserialize)]
881pub struct SamplingMessage {
882 pub role: Role,
883 pub content: SamplingContent,
884}
885
886#[derive(Debug, Clone, Serialize, Deserialize)]
887#[serde(tag = "type", rename_all = "lowercase")]
888pub enum SamplingContent {
889 Text(TextContent),
890 Image(ImageContent),
891 Audio(AudioContent),
892}
893
894#[derive(Debug, Clone, Serialize, Deserialize)]
897pub struct Annotations {
898 #[serde(skip_serializing_if = "Option::is_none")]
903 pub audience: Option<Vec<Role>>,
904 #[serde(skip_serializing_if = "Option::is_none")]
910 pub priority: Option<f64>,
911}
912
913#[derive(Debug, Clone, Serialize, Deserialize)]
915pub struct TextContent {
916 pub text: String,
918 #[serde(skip_serializing_if = "Option::is_none")]
920 pub annotations: Option<Annotations>,
921}
922
923#[derive(Debug, Clone, Serialize, Deserialize)]
925pub struct ImageContent {
926 pub data: String,
928 #[serde(rename = "mimeType")]
931 pub mime_type: String,
932 #[serde(skip_serializing_if = "Option::is_none")]
934 pub annotations: Option<Annotations>,
935}
936
937#[derive(Debug, Clone, Serialize, Deserialize)]
939pub struct AudioContent {
940 pub data: String,
942 #[serde(rename = "mimeType")]
945 pub mime_type: String,
946 #[serde(skip_serializing_if = "Option::is_none")]
948 pub annotations: Option<Annotations>,
949}
950
951#[derive(Debug, Clone, Serialize, Deserialize)]
965pub struct ModelPreferences {
966 #[serde(skip_serializing_if = "Option::is_none")]
974 pub hints: Option<Vec<ModelHint>>,
975 #[serde(rename = "costPriority", skip_serializing_if = "Option::is_none")]
979 pub cost_priority: Option<f64>,
980 #[serde(rename = "speedPriority", skip_serializing_if = "Option::is_none")]
984 pub speed_priority: Option<f64>,
985 #[serde(
989 rename = "intelligencePriority",
990 skip_serializing_if = "Option::is_none"
991 )]
992 pub intelligence_priority: Option<f64>,
993}
994
995#[derive(Debug, Clone, Serialize, Deserialize)]
1000pub struct ModelHint {
1001 #[serde(skip_serializing_if = "Option::is_none")]
1015 pub name: Option<String>,
1016}
1017
1018#[derive(Debug, Clone, Serialize, Deserialize)]
1021pub struct ArgumentInfo {
1022 pub name: String,
1024 pub value: String,
1026}
1027
1028#[derive(Debug, Clone, Serialize, Deserialize)]
1029#[serde(tag = "type")]
1030pub enum Reference {
1031 #[serde(rename = "ref/resource")]
1032 Resource(ResourceReference),
1033 #[serde(rename = "ref/prompt")]
1034 Prompt(PromptReference),
1035}
1036
1037#[derive(Debug, Clone, Serialize, Deserialize)]
1039pub struct ResourceReference {
1040 pub uri: String,
1042}
1043
1044#[derive(Debug, Clone, Serialize, Deserialize)]
1046pub struct PromptReference {
1047 pub name: String,
1049}
1050
1051#[derive(Debug, Clone, Serialize, Deserialize)]
1053pub struct CompleteResult {
1054 pub completion: CompletionInfo,
1055 #[serde(flatten)]
1056 pub result: Result,
1057}
1058
1059#[derive(Debug, Clone, Serialize, Deserialize)]
1060pub struct CompletionInfo {
1061 pub values: Vec<String>,
1063 #[serde(skip_serializing_if = "Option::is_none")]
1066 pub total: Option<i64>,
1067 #[serde(rename = "hasMore", skip_serializing_if = "Option::is_none")]
1071 pub has_more: Option<bool>,
1072}
1073
1074#[derive(Debug, Clone, Serialize, Deserialize)]
1080pub struct ListRootsResult {
1081 pub roots: Vec<Root>,
1082 #[serde(flatten)]
1083 pub result: Result,
1084}
1085
1086#[derive(Debug, Clone, Serialize, Deserialize)]
1088pub struct Root {
1089 pub uri: String,
1093 #[serde(skip_serializing_if = "Option::is_none")]
1098 pub name: Option<String>,
1099}
1100
1101#[derive(Debug, Clone, Serialize, Deserialize)]
1106pub struct RootsListChangedNotification {
1107 pub method: String,
1108}
1109
1110#[derive(Debug, Clone, Serialize, Deserialize)]
1112#[serde(tag = "method")]
1113pub enum ClientRequest {
1114 #[serde(rename = "ping")]
1115 Ping,
1116 #[serde(rename = "initialize")]
1117 Initialize {
1118 #[serde(rename = "protocolVersion")]
1119 protocol_version: String,
1120 capabilities: ClientCapabilities,
1121 #[serde(rename = "clientInfo")]
1122 client_info: Implementation,
1123 },
1124 #[serde(rename = "completion/complete")]
1125 Complete {
1126 #[serde(rename = "ref")]
1127 reference: Reference,
1128 argument: ArgumentInfo,
1130 },
1131 #[serde(rename = "logging/setLevel")]
1132 SetLevel {
1133 level: LoggingLevel,
1136 },
1137 #[serde(rename = "prompts/get")]
1138 GetPrompt {
1139 name: String,
1141 #[serde(skip_serializing_if = "Option::is_none")]
1143 arguments: Option<HashMap<String, String>>,
1144 },
1145 #[serde(rename = "prompts/list")]
1146 ListPrompts,
1147 #[serde(rename = "resources/list")]
1148 ListResources,
1149 #[serde(rename = "resources/templates/list")]
1150 ListResourceTemplates,
1151 #[serde(rename = "resources/read")]
1152 ReadResource {
1153 uri: String,
1155 },
1156 #[serde(rename = "resources/subscribe")]
1157 Subscribe {
1158 uri: String,
1160 },
1161 #[serde(rename = "resources/unsubscribe")]
1162 Unsubscribe {
1163 uri: String,
1165 },
1166 #[serde(rename = "tools/call")]
1167 CallTool {
1168 name: String,
1169 #[serde(skip_serializing_if = "Option::is_none")]
1170 arguments: Option<HashMap<String, Value>>,
1171 },
1172 #[serde(rename = "tools/list")]
1173 ListTools,
1174}
1175
1176impl ClientRequest {
1177 pub fn method(&self) -> &'static str {
1179 match self {
1180 ClientRequest::Ping => "ping",
1181 ClientRequest::Initialize { .. } => "initialize",
1182 ClientRequest::Complete { .. } => "completion/complete",
1183 ClientRequest::SetLevel { .. } => "logging/setLevel",
1184 ClientRequest::GetPrompt { .. } => "prompts/get",
1185 ClientRequest::ListPrompts => "prompts/list",
1186 ClientRequest::ListResources => "resources/list",
1187 ClientRequest::ListResourceTemplates => "resources/templates/list",
1188 ClientRequest::ReadResource { .. } => "resources/read",
1189 ClientRequest::Subscribe { .. } => "resources/subscribe",
1190 ClientRequest::Unsubscribe { .. } => "resources/unsubscribe",
1191 ClientRequest::CallTool { .. } => "tools/call",
1192 ClientRequest::ListTools => "tools/list",
1193 }
1194 }
1195}
1196
1197#[derive(Debug, Clone, Serialize, Deserialize)]
1198#[serde(tag = "method")]
1199pub enum ClientNotification {
1200 #[serde(rename = "notifications/cancelled")]
1201 Cancelled {
1202 #[serde(rename = "requestId")]
1204 request_id: RequestId,
1205 #[serde(skip_serializing_if = "Option::is_none")]
1207 reason: Option<String>,
1208 },
1209 #[serde(rename = "notifications/progress")]
1210 Progress {
1211 #[serde(rename = "progressToken")]
1213 progress_token: ProgressToken,
1214 progress: f64,
1216 #[serde(skip_serializing_if = "Option::is_none")]
1218 total: Option<f64>,
1219 #[serde(skip_serializing_if = "Option::is_none")]
1221 message: Option<String>,
1222 },
1223 #[serde(rename = "notifications/initialized")]
1224 Initialized,
1225 #[serde(rename = "notifications/roots/list_changed")]
1226 RootsListChanged,
1227}
1228
1229#[derive(Debug, Clone, Serialize, Deserialize)]
1230#[serde(untagged)]
1231pub enum ClientResult {
1232 Empty(EmptyResult),
1233 CreateMessage(CreateMessageResult),
1234 ListRoots(ListRootsResult),
1235}
1236
1237#[derive(Debug, Clone, Serialize, Deserialize)]
1239#[serde(tag = "method")]
1240pub enum ServerRequest {
1241 #[serde(rename = "ping")]
1242 Ping,
1243 #[serde(rename = "sampling/createMessage")]
1244 CreateMessage(Box<CreateMessageParams>),
1245 #[serde(rename = "roots/list")]
1246 ListRoots,
1247}
1248
1249#[derive(Debug, Clone, Serialize, Deserialize)]
1250#[serde(tag = "method")]
1251pub enum ServerNotification {
1252 #[serde(rename = "notifications/cancelled")]
1253 Cancelled {
1254 #[serde(rename = "requestId")]
1256 request_id: RequestId,
1257 #[serde(skip_serializing_if = "Option::is_none")]
1259 reason: Option<String>,
1260 },
1261 #[serde(rename = "notifications/progress")]
1262 Progress {
1263 #[serde(rename = "progressToken")]
1265 progress_token: ProgressToken,
1266 progress: f64,
1268 #[serde(skip_serializing_if = "Option::is_none")]
1270 total: Option<f64>,
1271 #[serde(skip_serializing_if = "Option::is_none")]
1273 message: Option<String>,
1274 },
1275 #[serde(rename = "notifications/message")]
1276 LoggingMessage {
1277 level: LoggingLevel,
1279 #[serde(skip_serializing_if = "Option::is_none")]
1281 logger: Option<String>,
1282 data: Value,
1284 },
1285 #[serde(rename = "notifications/resources/updated")]
1286 ResourceUpdated {
1287 uri: String,
1289 },
1290 #[serde(rename = "notifications/resources/list_changed")]
1291 ResourceListChanged,
1292 #[serde(rename = "notifications/tools/list_changed")]
1293 ToolListChanged,
1294 #[serde(rename = "notifications/prompts/list_changed")]
1295 PromptListChanged,
1296}
1297
1298#[derive(Debug, Clone, Serialize, Deserialize)]
1299#[serde(untagged)]
1300pub enum ServerResult {
1301 Empty(EmptyResult),
1302 Initialize(InitializeResult),
1303 Complete(CompleteResult),
1304 GetPrompt(GetPromptResult),
1305 ListPrompts(ListPromptsResult),
1306 ListResourceTemplates(ListResourceTemplatesResult),
1307 ListResources(ListResourcesResult),
1308 ReadResource(ReadResourceResult),
1309 CallTool(CallToolResult),
1310 ListTools(ListToolsResult),
1311}