1#![allow(clippy::fallible_impl_from)]
9use serde::Deserialize;
10use serde::Serialize;
11use serde::de::DeserializeOwned;
12use std::convert::TryFrom;
13
14use ts_rs::TS;
15
16pub const MCP_SCHEMA_VERSION: &str = "2025-06-18";
17pub const JSONRPC_VERSION: &str = "2.0";
18
19pub trait ModelContextProtocolRequest {
21 const METHOD: &'static str;
22 type Params: DeserializeOwned + Serialize + Send + Sync + 'static;
23 type Result: DeserializeOwned + Serialize + Send + Sync + 'static;
24}
25
26pub trait ModelContextProtocolNotification {
28 const METHOD: &'static str;
29 type Params: DeserializeOwned + Serialize + Send + Sync + 'static;
30}
31
32fn default_jsonrpc() -> String {
33 JSONRPC_VERSION.to_owned()
34}
35
36#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
38pub struct Annotations {
39 #[serde(default, skip_serializing_if = "Option::is_none")]
40 pub audience: Option<Vec<Role>>,
41 #[serde(
42 rename = "lastModified",
43 default,
44 skip_serializing_if = "Option::is_none"
45 )]
46 pub last_modified: Option<String>,
47 #[serde(default, skip_serializing_if = "Option::is_none")]
48 pub priority: Option<f64>,
49}
50
51#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
53pub struct AudioContent {
54 #[serde(default, skip_serializing_if = "Option::is_none")]
55 pub annotations: Option<Annotations>,
56 pub data: String,
57 #[serde(rename = "mimeType")]
58 pub mime_type: String,
59 pub r#type: String, }
61
62#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
64pub struct BaseMetadata {
65 pub name: String,
66 #[serde(default, skip_serializing_if = "Option::is_none")]
67 pub title: Option<String>,
68}
69
70#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
71pub struct BlobResourceContents {
72 pub blob: String,
73 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
74 pub mime_type: Option<String>,
75 pub uri: String,
76}
77
78#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
79pub struct BooleanSchema {
80 #[serde(default, skip_serializing_if = "Option::is_none")]
81 pub default: Option<bool>,
82 #[serde(default, skip_serializing_if = "Option::is_none")]
83 pub description: Option<String>,
84 #[serde(default, skip_serializing_if = "Option::is_none")]
85 pub title: Option<String>,
86 pub r#type: String, }
88
89#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
90pub enum CallToolRequest {}
91
92impl ModelContextProtocolRequest for CallToolRequest {
93 const METHOD: &'static str = "tools/call";
94 type Params = CallToolRequestParams;
95 type Result = CallToolResult;
96}
97
98#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
99pub struct CallToolRequestParams {
100 #[serde(default, skip_serializing_if = "Option::is_none")]
101 pub arguments: Option<serde_json::Value>,
102 pub name: String,
103}
104
105#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
107pub struct CallToolResult {
108 pub content: Vec<ContentBlock>,
109 #[serde(rename = "isError", default, skip_serializing_if = "Option::is_none")]
110 pub is_error: Option<bool>,
111 #[serde(
112 rename = "structuredContent",
113 default,
114 skip_serializing_if = "Option::is_none"
115 )]
116 pub structured_content: Option<serde_json::Value>,
117}
118
119impl From<CallToolResult> for serde_json::Value {
120 fn from(value: CallToolResult) -> Self {
121 #[expect(clippy::unwrap_used)]
123 serde_json::to_value(value).unwrap()
124 }
125}
126
127#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
128pub enum CancelledNotification {}
129
130impl ModelContextProtocolNotification for CancelledNotification {
131 const METHOD: &'static str = "notifications/cancelled";
132 type Params = CancelledNotificationParams;
133}
134
135#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
136pub struct CancelledNotificationParams {
137 #[serde(default, skip_serializing_if = "Option::is_none")]
138 pub reason: Option<String>,
139 #[serde(rename = "requestId")]
140 pub request_id: RequestId,
141}
142
143#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
145pub struct ClientCapabilities {
146 #[serde(default, skip_serializing_if = "Option::is_none")]
147 pub elicitation: Option<serde_json::Value>,
148 #[serde(default, skip_serializing_if = "Option::is_none")]
149 pub experimental: Option<serde_json::Value>,
150 #[serde(default, skip_serializing_if = "Option::is_none")]
151 pub roots: Option<ClientCapabilitiesRoots>,
152 #[serde(default, skip_serializing_if = "Option::is_none")]
153 pub sampling: Option<serde_json::Value>,
154}
155
156#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
158pub struct ClientCapabilitiesRoots {
159 #[serde(
160 rename = "listChanged",
161 default,
162 skip_serializing_if = "Option::is_none"
163 )]
164 pub list_changed: Option<bool>,
165}
166
167#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
168#[serde(untagged)]
169pub enum ClientNotification {
170 CancelledNotification(CancelledNotification),
171 InitializedNotification(InitializedNotification),
172 ProgressNotification(ProgressNotification),
173 RootsListChangedNotification(RootsListChangedNotification),
174}
175
176#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
177#[serde(tag = "method", content = "params")]
178pub enum ClientRequest {
179 #[serde(rename = "initialize")]
180 InitializeRequest(<InitializeRequest as ModelContextProtocolRequest>::Params),
181 #[serde(rename = "ping")]
182 PingRequest(<PingRequest as ModelContextProtocolRequest>::Params),
183 #[serde(rename = "resources/list")]
184 ListResourcesRequest(<ListResourcesRequest as ModelContextProtocolRequest>::Params),
185 #[serde(rename = "resources/templates/list")]
186 ListResourceTemplatesRequest(
187 <ListResourceTemplatesRequest as ModelContextProtocolRequest>::Params,
188 ),
189 #[serde(rename = "resources/read")]
190 ReadResourceRequest(<ReadResourceRequest as ModelContextProtocolRequest>::Params),
191 #[serde(rename = "resources/subscribe")]
192 SubscribeRequest(<SubscribeRequest as ModelContextProtocolRequest>::Params),
193 #[serde(rename = "resources/unsubscribe")]
194 UnsubscribeRequest(<UnsubscribeRequest as ModelContextProtocolRequest>::Params),
195 #[serde(rename = "prompts/list")]
196 ListPromptsRequest(<ListPromptsRequest as ModelContextProtocolRequest>::Params),
197 #[serde(rename = "prompts/get")]
198 GetPromptRequest(<GetPromptRequest as ModelContextProtocolRequest>::Params),
199 #[serde(rename = "tools/list")]
200 ListToolsRequest(<ListToolsRequest as ModelContextProtocolRequest>::Params),
201 #[serde(rename = "tools/call")]
202 CallToolRequest(<CallToolRequest as ModelContextProtocolRequest>::Params),
203 #[serde(rename = "logging/setLevel")]
204 SetLevelRequest(<SetLevelRequest as ModelContextProtocolRequest>::Params),
205 #[serde(rename = "completion/complete")]
206 CompleteRequest(<CompleteRequest as ModelContextProtocolRequest>::Params),
207}
208
209#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
210#[serde(untagged)]
211pub enum ClientResult {
212 Result(Result),
213 CreateMessageResult(CreateMessageResult),
214 ListRootsResult(ListRootsResult),
215 ElicitResult(ElicitResult),
216}
217
218#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
219pub enum CompleteRequest {}
220
221impl ModelContextProtocolRequest for CompleteRequest {
222 const METHOD: &'static str = "completion/complete";
223 type Params = CompleteRequestParams;
224 type Result = CompleteResult;
225}
226
227#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
228pub struct CompleteRequestParams {
229 pub argument: CompleteRequestParamsArgument,
230 #[serde(default, skip_serializing_if = "Option::is_none")]
231 pub context: Option<CompleteRequestParamsContext>,
232 pub r#ref: CompleteRequestParamsRef,
233}
234
235#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
237pub struct CompleteRequestParamsContext {
238 #[serde(default, skip_serializing_if = "Option::is_none")]
239 pub arguments: Option<serde_json::Value>,
240}
241
242#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
244pub struct CompleteRequestParamsArgument {
245 pub name: String,
246 pub value: String,
247}
248
249#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
250#[serde(untagged)]
251pub enum CompleteRequestParamsRef {
252 PromptReference(PromptReference),
253 ResourceTemplateReference(ResourceTemplateReference),
254}
255
256#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
258pub struct CompleteResult {
259 pub completion: CompleteResultCompletion,
260}
261
262#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
263pub struct CompleteResultCompletion {
264 #[serde(rename = "hasMore", default, skip_serializing_if = "Option::is_none")]
265 pub has_more: Option<bool>,
266 #[serde(default, skip_serializing_if = "Option::is_none")]
267 pub total: Option<i64>,
268 pub values: Vec<String>,
269}
270
271impl From<CompleteResult> for serde_json::Value {
272 fn from(value: CompleteResult) -> Self {
273 #[expect(clippy::unwrap_used)]
275 serde_json::to_value(value).unwrap()
276 }
277}
278
279#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
280#[serde(untagged)]
281pub enum ContentBlock {
282 TextContent(TextContent),
283 ImageContent(ImageContent),
284 AudioContent(AudioContent),
285 ResourceLink(ResourceLink),
286 EmbeddedResource(EmbeddedResource),
287}
288
289#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
290pub enum CreateMessageRequest {}
291
292impl ModelContextProtocolRequest for CreateMessageRequest {
293 const METHOD: &'static str = "sampling/createMessage";
294 type Params = CreateMessageRequestParams;
295 type Result = CreateMessageResult;
296}
297
298#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
299pub struct CreateMessageRequestParams {
300 #[serde(
301 rename = "includeContext",
302 default,
303 skip_serializing_if = "Option::is_none"
304 )]
305 pub include_context: Option<String>,
306 #[serde(rename = "maxTokens")]
307 pub max_tokens: i64,
308 pub messages: Vec<SamplingMessage>,
309 #[serde(default, skip_serializing_if = "Option::is_none")]
310 pub metadata: Option<serde_json::Value>,
311 #[serde(
312 rename = "modelPreferences",
313 default,
314 skip_serializing_if = "Option::is_none"
315 )]
316 pub model_preferences: Option<ModelPreferences>,
317 #[serde(
318 rename = "stopSequences",
319 default,
320 skip_serializing_if = "Option::is_none"
321 )]
322 pub stop_sequences: Option<Vec<String>>,
323 #[serde(
324 rename = "systemPrompt",
325 default,
326 skip_serializing_if = "Option::is_none"
327 )]
328 pub system_prompt: Option<String>,
329 #[serde(default, skip_serializing_if = "Option::is_none")]
330 pub temperature: Option<f64>,
331}
332
333#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
335pub struct CreateMessageResult {
336 pub content: CreateMessageResultContent,
337 pub model: String,
338 pub role: Role,
339 #[serde(
340 rename = "stopReason",
341 default,
342 skip_serializing_if = "Option::is_none"
343 )]
344 pub stop_reason: Option<String>,
345}
346
347#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
348#[serde(untagged)]
349pub enum CreateMessageResultContent {
350 TextContent(TextContent),
351 ImageContent(ImageContent),
352 AudioContent(AudioContent),
353}
354
355impl From<CreateMessageResult> for serde_json::Value {
356 fn from(value: CreateMessageResult) -> Self {
357 #[expect(clippy::unwrap_used)]
359 serde_json::to_value(value).unwrap()
360 }
361}
362
363#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
364pub struct Cursor(String);
365
366#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
367pub enum ElicitRequest {}
368
369impl ModelContextProtocolRequest for ElicitRequest {
370 const METHOD: &'static str = "elicitation/create";
371 type Params = ElicitRequestParams;
372 type Result = ElicitResult;
373}
374
375#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
376pub struct ElicitRequestParams {
377 pub message: String,
378 #[serde(rename = "requestedSchema")]
379 pub requested_schema: ElicitRequestParamsRequestedSchema,
380}
381
382#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
385pub struct ElicitRequestParamsRequestedSchema {
386 pub properties: serde_json::Value,
387 #[serde(default, skip_serializing_if = "Option::is_none")]
388 pub required: Option<Vec<String>>,
389 pub r#type: String, }
391
392#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
394pub struct ElicitResult {
395 pub action: String,
396 #[serde(default, skip_serializing_if = "Option::is_none")]
397 pub content: Option<serde_json::Value>,
398}
399
400impl From<ElicitResult> for serde_json::Value {
401 fn from(value: ElicitResult) -> Self {
402 #[expect(clippy::unwrap_used)]
404 serde_json::to_value(value).unwrap()
405 }
406}
407
408#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
413pub struct EmbeddedResource {
414 #[serde(default, skip_serializing_if = "Option::is_none")]
415 pub annotations: Option<Annotations>,
416 pub resource: EmbeddedResourceResource,
417 pub r#type: String, }
419
420#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
421#[serde(untagged)]
422pub enum EmbeddedResourceResource {
423 TextResourceContents(TextResourceContents),
424 BlobResourceContents(BlobResourceContents),
425}
426
427pub type EmptyResult = Result;
428
429#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
430pub struct EnumSchema {
431 #[serde(default, skip_serializing_if = "Option::is_none")]
432 pub description: Option<String>,
433 pub r#enum: Vec<String>,
434 #[serde(rename = "enumNames", default, skip_serializing_if = "Option::is_none")]
435 pub enum_names: Option<Vec<String>>,
436 #[serde(default, skip_serializing_if = "Option::is_none")]
437 pub title: Option<String>,
438 pub r#type: String, }
440
441#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
442pub enum GetPromptRequest {}
443
444impl ModelContextProtocolRequest for GetPromptRequest {
445 const METHOD: &'static str = "prompts/get";
446 type Params = GetPromptRequestParams;
447 type Result = GetPromptResult;
448}
449
450#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
451pub struct GetPromptRequestParams {
452 #[serde(default, skip_serializing_if = "Option::is_none")]
453 pub arguments: Option<serde_json::Value>,
454 pub name: String,
455}
456
457#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
459pub struct GetPromptResult {
460 #[serde(default, skip_serializing_if = "Option::is_none")]
461 pub description: Option<String>,
462 pub messages: Vec<PromptMessage>,
463}
464
465impl From<GetPromptResult> for serde_json::Value {
466 fn from(value: GetPromptResult) -> Self {
467 #[expect(clippy::unwrap_used)]
469 serde_json::to_value(value).unwrap()
470 }
471}
472
473#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
475pub struct ImageContent {
476 #[serde(default, skip_serializing_if = "Option::is_none")]
477 pub annotations: Option<Annotations>,
478 pub data: String,
479 #[serde(rename = "mimeType")]
480 pub mime_type: String,
481 pub r#type: String, }
483
484#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
486pub struct Implementation {
487 pub name: String,
488 #[serde(default, skip_serializing_if = "Option::is_none")]
489 pub title: Option<String>,
490 pub version: String,
491}
492
493#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
494pub enum InitializeRequest {}
495
496impl ModelContextProtocolRequest for InitializeRequest {
497 const METHOD: &'static str = "initialize";
498 type Params = InitializeRequestParams;
499 type Result = InitializeResult;
500}
501
502#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
503pub struct InitializeRequestParams {
504 pub capabilities: ClientCapabilities,
505 #[serde(rename = "clientInfo")]
506 pub client_info: Implementation,
507 #[serde(rename = "protocolVersion")]
508 pub protocol_version: String,
509}
510
511#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
513pub struct InitializeResult {
514 pub capabilities: ServerCapabilities,
515 #[serde(default, skip_serializing_if = "Option::is_none")]
516 pub instructions: Option<String>,
517 #[serde(rename = "protocolVersion")]
518 pub protocol_version: String,
519 #[serde(rename = "serverInfo")]
520 pub server_info: Implementation,
521}
522
523impl From<InitializeResult> for serde_json::Value {
524 fn from(value: InitializeResult) -> Self {
525 #[expect(clippy::unwrap_used)]
527 serde_json::to_value(value).unwrap()
528 }
529}
530
531#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
532pub enum InitializedNotification {}
533
534impl ModelContextProtocolNotification for InitializedNotification {
535 const METHOD: &'static str = "notifications/initialized";
536 type Params = Option<serde_json::Value>;
537}
538
539#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
541pub struct JSONRPCError {
542 pub error: JSONRPCErrorError,
543 pub id: RequestId,
544 #[serde(rename = "jsonrpc", default = "default_jsonrpc")]
545 pub jsonrpc: String,
546}
547
548#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
549pub struct JSONRPCErrorError {
550 pub code: i64,
551 #[serde(default, skip_serializing_if = "Option::is_none")]
552 pub data: Option<serde_json::Value>,
553 pub message: String,
554}
555
556#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
558#[serde(untagged)]
559pub enum JSONRPCMessage {
560 Request(JSONRPCRequest),
561 Notification(JSONRPCNotification),
562 Response(JSONRPCResponse),
563 Error(JSONRPCError),
564}
565
566#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
568pub struct JSONRPCNotification {
569 #[serde(rename = "jsonrpc", default = "default_jsonrpc")]
570 pub jsonrpc: String,
571 pub method: String,
572 #[serde(default, skip_serializing_if = "Option::is_none")]
573 pub params: Option<serde_json::Value>,
574}
575
576#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
578pub struct JSONRPCRequest {
579 pub id: RequestId,
580 #[serde(rename = "jsonrpc", default = "default_jsonrpc")]
581 pub jsonrpc: String,
582 pub method: String,
583 #[serde(default, skip_serializing_if = "Option::is_none")]
584 pub params: Option<serde_json::Value>,
585}
586
587#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
589pub struct JSONRPCResponse {
590 pub id: RequestId,
591 #[serde(rename = "jsonrpc", default = "default_jsonrpc")]
592 pub jsonrpc: String,
593 pub result: Result,
594}
595
596#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
597pub enum ListPromptsRequest {}
598
599impl ModelContextProtocolRequest for ListPromptsRequest {
600 const METHOD: &'static str = "prompts/list";
601 type Params = Option<ListPromptsRequestParams>;
602 type Result = ListPromptsResult;
603}
604
605#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
606pub struct ListPromptsRequestParams {
607 #[serde(default, skip_serializing_if = "Option::is_none")]
608 pub cursor: Option<String>,
609}
610
611#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
613pub struct ListPromptsResult {
614 #[serde(
615 rename = "nextCursor",
616 default,
617 skip_serializing_if = "Option::is_none"
618 )]
619 pub next_cursor: Option<String>,
620 pub prompts: Vec<Prompt>,
621}
622
623impl From<ListPromptsResult> for serde_json::Value {
624 fn from(value: ListPromptsResult) -> Self {
625 #[expect(clippy::unwrap_used)]
627 serde_json::to_value(value).unwrap()
628 }
629}
630
631#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
632pub enum ListResourceTemplatesRequest {}
633
634impl ModelContextProtocolRequest for ListResourceTemplatesRequest {
635 const METHOD: &'static str = "resources/templates/list";
636 type Params = Option<ListResourceTemplatesRequestParams>;
637 type Result = ListResourceTemplatesResult;
638}
639
640#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
641pub struct ListResourceTemplatesRequestParams {
642 #[serde(default, skip_serializing_if = "Option::is_none")]
643 pub cursor: Option<String>,
644}
645
646#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
648pub struct ListResourceTemplatesResult {
649 #[serde(
650 rename = "nextCursor",
651 default,
652 skip_serializing_if = "Option::is_none"
653 )]
654 pub next_cursor: Option<String>,
655 #[serde(rename = "resourceTemplates")]
656 pub resource_templates: Vec<ResourceTemplate>,
657}
658
659impl From<ListResourceTemplatesResult> for serde_json::Value {
660 fn from(value: ListResourceTemplatesResult) -> Self {
661 #[expect(clippy::unwrap_used)]
663 serde_json::to_value(value).unwrap()
664 }
665}
666
667#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
668pub enum ListResourcesRequest {}
669
670impl ModelContextProtocolRequest for ListResourcesRequest {
671 const METHOD: &'static str = "resources/list";
672 type Params = Option<ListResourcesRequestParams>;
673 type Result = ListResourcesResult;
674}
675
676#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
677pub struct ListResourcesRequestParams {
678 #[serde(default, skip_serializing_if = "Option::is_none")]
679 pub cursor: Option<String>,
680}
681
682#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
684pub struct ListResourcesResult {
685 #[serde(
686 rename = "nextCursor",
687 default,
688 skip_serializing_if = "Option::is_none"
689 )]
690 pub next_cursor: Option<String>,
691 pub resources: Vec<Resource>,
692}
693
694impl From<ListResourcesResult> for serde_json::Value {
695 fn from(value: ListResourcesResult) -> Self {
696 #[expect(clippy::unwrap_used)]
698 serde_json::to_value(value).unwrap()
699 }
700}
701
702#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
703pub enum ListRootsRequest {}
704
705impl ModelContextProtocolRequest for ListRootsRequest {
706 const METHOD: &'static str = "roots/list";
707 type Params = Option<serde_json::Value>;
708 type Result = ListRootsResult;
709}
710
711#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
715pub struct ListRootsResult {
716 pub roots: Vec<Root>,
717}
718
719impl From<ListRootsResult> for serde_json::Value {
720 fn from(value: ListRootsResult) -> Self {
721 #[expect(clippy::unwrap_used)]
723 serde_json::to_value(value).unwrap()
724 }
725}
726
727#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
728pub enum ListToolsRequest {}
729
730impl ModelContextProtocolRequest for ListToolsRequest {
731 const METHOD: &'static str = "tools/list";
732 type Params = Option<ListToolsRequestParams>;
733 type Result = ListToolsResult;
734}
735
736#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
737pub struct ListToolsRequestParams {
738 #[serde(default, skip_serializing_if = "Option::is_none")]
739 pub cursor: Option<String>,
740}
741
742#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
744pub struct ListToolsResult {
745 #[serde(
746 rename = "nextCursor",
747 default,
748 skip_serializing_if = "Option::is_none"
749 )]
750 pub next_cursor: Option<String>,
751 pub tools: Vec<Tool>,
752}
753
754impl From<ListToolsResult> for serde_json::Value {
755 fn from(value: ListToolsResult) -> Self {
756 #[expect(clippy::unwrap_used)]
758 serde_json::to_value(value).unwrap()
759 }
760}
761
762#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
767pub enum LoggingLevel {
768 #[serde(rename = "alert")]
769 Alert,
770 #[serde(rename = "critical")]
771 Critical,
772 #[serde(rename = "debug")]
773 Debug,
774 #[serde(rename = "emergency")]
775 Emergency,
776 #[serde(rename = "error")]
777 Error,
778 #[serde(rename = "info")]
779 Info,
780 #[serde(rename = "notice")]
781 Notice,
782 #[serde(rename = "warning")]
783 Warning,
784}
785
786#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
787pub enum LoggingMessageNotification {}
788
789impl ModelContextProtocolNotification for LoggingMessageNotification {
790 const METHOD: &'static str = "notifications/message";
791 type Params = LoggingMessageNotificationParams;
792}
793
794#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
795pub struct LoggingMessageNotificationParams {
796 pub data: serde_json::Value,
797 pub level: LoggingLevel,
798 #[serde(default, skip_serializing_if = "Option::is_none")]
799 pub logger: Option<String>,
800}
801
802#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
807pub struct ModelHint {
808 #[serde(default, skip_serializing_if = "Option::is_none")]
809 pub name: Option<String>,
810}
811
812#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
824pub struct ModelPreferences {
825 #[serde(
826 rename = "costPriority",
827 default,
828 skip_serializing_if = "Option::is_none"
829 )]
830 pub cost_priority: Option<f64>,
831 #[serde(default, skip_serializing_if = "Option::is_none")]
832 pub hints: Option<Vec<ModelHint>>,
833 #[serde(
834 rename = "intelligencePriority",
835 default,
836 skip_serializing_if = "Option::is_none"
837 )]
838 pub intelligence_priority: Option<f64>,
839 #[serde(
840 rename = "speedPriority",
841 default,
842 skip_serializing_if = "Option::is_none"
843 )]
844 pub speed_priority: Option<f64>,
845}
846
847#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
848pub struct Notification {
849 pub method: String,
850 #[serde(default, skip_serializing_if = "Option::is_none")]
851 pub params: Option<serde_json::Value>,
852}
853
854#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
855pub struct NumberSchema {
856 #[serde(default, skip_serializing_if = "Option::is_none")]
857 pub description: Option<String>,
858 #[serde(default, skip_serializing_if = "Option::is_none")]
859 pub maximum: Option<i64>,
860 #[serde(default, skip_serializing_if = "Option::is_none")]
861 pub minimum: Option<i64>,
862 #[serde(default, skip_serializing_if = "Option::is_none")]
863 pub title: Option<String>,
864 pub r#type: String,
865}
866
867#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
868pub struct PaginatedRequest {
869 pub method: String,
870 #[serde(default, skip_serializing_if = "Option::is_none")]
871 pub params: Option<PaginatedRequestParams>,
872}
873
874#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
875pub struct PaginatedRequestParams {
876 #[serde(default, skip_serializing_if = "Option::is_none")]
877 pub cursor: Option<String>,
878}
879
880#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
881pub struct PaginatedResult {
882 #[serde(
883 rename = "nextCursor",
884 default,
885 skip_serializing_if = "Option::is_none"
886 )]
887 pub next_cursor: Option<String>,
888}
889
890impl From<PaginatedResult> for serde_json::Value {
891 fn from(value: PaginatedResult) -> Self {
892 #[expect(clippy::unwrap_used)]
894 serde_json::to_value(value).unwrap()
895 }
896}
897
898#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
899pub enum PingRequest {}
900
901impl ModelContextProtocolRequest for PingRequest {
902 const METHOD: &'static str = "ping";
903 type Params = Option<serde_json::Value>;
904 type Result = Result;
905}
906
907#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
910#[serde(untagged)]
911pub enum PrimitiveSchemaDefinition {
912 StringSchema(StringSchema),
913 NumberSchema(NumberSchema),
914 BooleanSchema(BooleanSchema),
915 EnumSchema(EnumSchema),
916}
917
918#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
919pub enum ProgressNotification {}
920
921impl ModelContextProtocolNotification for ProgressNotification {
922 const METHOD: &'static str = "notifications/progress";
923 type Params = ProgressNotificationParams;
924}
925
926#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
927pub struct ProgressNotificationParams {
928 #[serde(default, skip_serializing_if = "Option::is_none")]
929 pub message: Option<String>,
930 pub progress: f64,
931 #[serde(rename = "progressToken")]
932 pub progress_token: ProgressToken,
933 #[serde(default, skip_serializing_if = "Option::is_none")]
934 pub total: Option<f64>,
935}
936
937#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Hash, Eq, TS)]
938#[serde(untagged)]
939pub enum ProgressToken {
940 String(String),
941 Integer(i64),
942}
943
944#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
946pub struct Prompt {
947 #[serde(default, skip_serializing_if = "Option::is_none")]
948 pub arguments: Option<Vec<PromptArgument>>,
949 #[serde(default, skip_serializing_if = "Option::is_none")]
950 pub description: Option<String>,
951 pub name: String,
952 #[serde(default, skip_serializing_if = "Option::is_none")]
953 pub title: Option<String>,
954}
955
956#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
958pub struct PromptArgument {
959 #[serde(default, skip_serializing_if = "Option::is_none")]
960 pub description: Option<String>,
961 pub name: String,
962 #[serde(default, skip_serializing_if = "Option::is_none")]
963 pub required: Option<bool>,
964 #[serde(default, skip_serializing_if = "Option::is_none")]
965 pub title: Option<String>,
966}
967
968#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
969pub enum PromptListChangedNotification {}
970
971impl ModelContextProtocolNotification for PromptListChangedNotification {
972 const METHOD: &'static str = "notifications/prompts/list_changed";
973 type Params = Option<serde_json::Value>;
974}
975
976#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
981pub struct PromptMessage {
982 pub content: ContentBlock,
983 pub role: Role,
984}
985
986#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
988pub struct PromptReference {
989 pub name: String,
990 #[serde(default, skip_serializing_if = "Option::is_none")]
991 pub title: Option<String>,
992 pub r#type: String, }
994
995#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
996pub enum ReadResourceRequest {}
997
998impl ModelContextProtocolRequest for ReadResourceRequest {
999 const METHOD: &'static str = "resources/read";
1000 type Params = ReadResourceRequestParams;
1001 type Result = ReadResourceResult;
1002}
1003
1004#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1005pub struct ReadResourceRequestParams {
1006 pub uri: String,
1007}
1008
1009#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1011pub struct ReadResourceResult {
1012 pub contents: Vec<ReadResourceResultContents>,
1013}
1014
1015#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1016#[serde(untagged)]
1017pub enum ReadResourceResultContents {
1018 TextResourceContents(TextResourceContents),
1019 BlobResourceContents(BlobResourceContents),
1020}
1021
1022impl From<ReadResourceResult> for serde_json::Value {
1023 fn from(value: ReadResourceResult) -> Self {
1024 #[expect(clippy::unwrap_used)]
1026 serde_json::to_value(value).unwrap()
1027 }
1028}
1029
1030#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1031pub struct Request {
1032 pub method: String,
1033 #[serde(default, skip_serializing_if = "Option::is_none")]
1034 pub params: Option<serde_json::Value>,
1035}
1036
1037#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Hash, Eq, TS)]
1038#[serde(untagged)]
1039pub enum RequestId {
1040 String(String),
1041 Integer(i64),
1042}
1043
1044#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1046pub struct Resource {
1047 #[serde(default, skip_serializing_if = "Option::is_none")]
1048 pub annotations: Option<Annotations>,
1049 #[serde(default, skip_serializing_if = "Option::is_none")]
1050 pub description: Option<String>,
1051 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
1052 pub mime_type: Option<String>,
1053 pub name: String,
1054 #[serde(default, skip_serializing_if = "Option::is_none")]
1055 pub size: Option<i64>,
1056 #[serde(default, skip_serializing_if = "Option::is_none")]
1057 pub title: Option<String>,
1058 pub uri: String,
1059}
1060
1061#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1063pub struct ResourceContents {
1064 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
1065 pub mime_type: Option<String>,
1066 pub uri: String,
1067}
1068
1069#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1073pub struct ResourceLink {
1074 #[serde(default, skip_serializing_if = "Option::is_none")]
1075 pub annotations: Option<Annotations>,
1076 #[serde(default, skip_serializing_if = "Option::is_none")]
1077 pub description: Option<String>,
1078 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
1079 pub mime_type: Option<String>,
1080 pub name: String,
1081 #[serde(default, skip_serializing_if = "Option::is_none")]
1082 pub size: Option<i64>,
1083 #[serde(default, skip_serializing_if = "Option::is_none")]
1084 pub title: Option<String>,
1085 pub r#type: String, pub uri: String,
1087}
1088
1089#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1090pub enum ResourceListChangedNotification {}
1091
1092impl ModelContextProtocolNotification for ResourceListChangedNotification {
1093 const METHOD: &'static str = "notifications/resources/list_changed";
1094 type Params = Option<serde_json::Value>;
1095}
1096
1097#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1099pub struct ResourceTemplate {
1100 #[serde(default, skip_serializing_if = "Option::is_none")]
1101 pub annotations: Option<Annotations>,
1102 #[serde(default, skip_serializing_if = "Option::is_none")]
1103 pub description: Option<String>,
1104 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
1105 pub mime_type: Option<String>,
1106 pub name: String,
1107 #[serde(default, skip_serializing_if = "Option::is_none")]
1108 pub title: Option<String>,
1109 #[serde(rename = "uriTemplate")]
1110 pub uri_template: String,
1111}
1112
1113#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1115pub struct ResourceTemplateReference {
1116 pub r#type: String, pub uri: String,
1118}
1119
1120#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1121pub enum ResourceUpdatedNotification {}
1122
1123impl ModelContextProtocolNotification for ResourceUpdatedNotification {
1124 const METHOD: &'static str = "notifications/resources/updated";
1125 type Params = ResourceUpdatedNotificationParams;
1126}
1127
1128#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1129pub struct ResourceUpdatedNotificationParams {
1130 pub uri: String,
1131}
1132
1133pub type Result = serde_json::Value;
1134
1135#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1137pub enum Role {
1138 #[serde(rename = "assistant")]
1139 Assistant,
1140 #[serde(rename = "user")]
1141 User,
1142}
1143
1144#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1146pub struct Root {
1147 #[serde(default, skip_serializing_if = "Option::is_none")]
1148 pub name: Option<String>,
1149 pub uri: String,
1150}
1151
1152#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1153pub enum RootsListChangedNotification {}
1154
1155impl ModelContextProtocolNotification for RootsListChangedNotification {
1156 const METHOD: &'static str = "notifications/roots/list_changed";
1157 type Params = Option<serde_json::Value>;
1158}
1159
1160#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1162pub struct SamplingMessage {
1163 pub content: SamplingMessageContent,
1164 pub role: Role,
1165}
1166
1167#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1168#[serde(untagged)]
1169pub enum SamplingMessageContent {
1170 TextContent(TextContent),
1171 ImageContent(ImageContent),
1172 AudioContent(AudioContent),
1173}
1174
1175#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1177pub struct ServerCapabilities {
1178 #[serde(default, skip_serializing_if = "Option::is_none")]
1179 pub completions: Option<serde_json::Value>,
1180 #[serde(default, skip_serializing_if = "Option::is_none")]
1181 pub experimental: Option<serde_json::Value>,
1182 #[serde(default, skip_serializing_if = "Option::is_none")]
1183 pub logging: Option<serde_json::Value>,
1184 #[serde(default, skip_serializing_if = "Option::is_none")]
1185 pub prompts: Option<ServerCapabilitiesPrompts>,
1186 #[serde(default, skip_serializing_if = "Option::is_none")]
1187 pub resources: Option<ServerCapabilitiesResources>,
1188 #[serde(default, skip_serializing_if = "Option::is_none")]
1189 pub tools: Option<ServerCapabilitiesTools>,
1190}
1191
1192#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1194pub struct ServerCapabilitiesTools {
1195 #[serde(
1196 rename = "listChanged",
1197 default,
1198 skip_serializing_if = "Option::is_none"
1199 )]
1200 pub list_changed: Option<bool>,
1201}
1202
1203#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1205pub struct ServerCapabilitiesResources {
1206 #[serde(
1207 rename = "listChanged",
1208 default,
1209 skip_serializing_if = "Option::is_none"
1210 )]
1211 pub list_changed: Option<bool>,
1212 #[serde(default, skip_serializing_if = "Option::is_none")]
1213 pub subscribe: Option<bool>,
1214}
1215
1216#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1218pub struct ServerCapabilitiesPrompts {
1219 #[serde(
1220 rename = "listChanged",
1221 default,
1222 skip_serializing_if = "Option::is_none"
1223 )]
1224 pub list_changed: Option<bool>,
1225}
1226
1227#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1228#[serde(tag = "method", content = "params")]
1229pub enum ServerNotification {
1230 #[serde(rename = "notifications/cancelled")]
1231 CancelledNotification(<CancelledNotification as ModelContextProtocolNotification>::Params),
1232 #[serde(rename = "notifications/progress")]
1233 ProgressNotification(<ProgressNotification as ModelContextProtocolNotification>::Params),
1234 #[serde(rename = "notifications/resources/list_changed")]
1235 ResourceListChangedNotification(
1236 <ResourceListChangedNotification as ModelContextProtocolNotification>::Params,
1237 ),
1238 #[serde(rename = "notifications/resources/updated")]
1239 ResourceUpdatedNotification(
1240 <ResourceUpdatedNotification as ModelContextProtocolNotification>::Params,
1241 ),
1242 #[serde(rename = "notifications/prompts/list_changed")]
1243 PromptListChangedNotification(
1244 <PromptListChangedNotification as ModelContextProtocolNotification>::Params,
1245 ),
1246 #[serde(rename = "notifications/tools/list_changed")]
1247 ToolListChangedNotification(
1248 <ToolListChangedNotification as ModelContextProtocolNotification>::Params,
1249 ),
1250 #[serde(rename = "notifications/message")]
1251 LoggingMessageNotification(
1252 <LoggingMessageNotification as ModelContextProtocolNotification>::Params,
1253 ),
1254}
1255
1256#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1257#[serde(untagged)]
1258pub enum ServerRequest {
1259 PingRequest(PingRequest),
1260 CreateMessageRequest(CreateMessageRequest),
1261 ListRootsRequest(ListRootsRequest),
1262 ElicitRequest(ElicitRequest),
1263}
1264
1265#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1266#[serde(untagged)]
1267#[allow(clippy::large_enum_variant)]
1268pub enum ServerResult {
1269 Result(Result),
1270 InitializeResult(InitializeResult),
1271 ListResourcesResult(ListResourcesResult),
1272 ListResourceTemplatesResult(ListResourceTemplatesResult),
1273 ReadResourceResult(ReadResourceResult),
1274 ListPromptsResult(ListPromptsResult),
1275 GetPromptResult(GetPromptResult),
1276 ListToolsResult(ListToolsResult),
1277 CallToolResult(CallToolResult),
1278 CompleteResult(CompleteResult),
1279}
1280
1281#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1282pub enum SetLevelRequest {}
1283
1284impl ModelContextProtocolRequest for SetLevelRequest {
1285 const METHOD: &'static str = "logging/setLevel";
1286 type Params = SetLevelRequestParams;
1287 type Result = Result;
1288}
1289
1290#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1291pub struct SetLevelRequestParams {
1292 pub level: LoggingLevel,
1293}
1294
1295#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1296pub struct StringSchema {
1297 #[serde(default, skip_serializing_if = "Option::is_none")]
1298 pub description: Option<String>,
1299 #[serde(default, skip_serializing_if = "Option::is_none")]
1300 pub format: Option<String>,
1301 #[serde(rename = "maxLength", default, skip_serializing_if = "Option::is_none")]
1302 pub max_length: Option<i64>,
1303 #[serde(rename = "minLength", default, skip_serializing_if = "Option::is_none")]
1304 pub min_length: Option<i64>,
1305 #[serde(default, skip_serializing_if = "Option::is_none")]
1306 pub title: Option<String>,
1307 pub r#type: String, }
1309
1310#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1311pub enum SubscribeRequest {}
1312
1313impl ModelContextProtocolRequest for SubscribeRequest {
1314 const METHOD: &'static str = "resources/subscribe";
1315 type Params = SubscribeRequestParams;
1316 type Result = Result;
1317}
1318
1319#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1320pub struct SubscribeRequestParams {
1321 pub uri: String,
1322}
1323
1324#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1326pub struct TextContent {
1327 #[serde(default, skip_serializing_if = "Option::is_none")]
1328 pub annotations: Option<Annotations>,
1329 pub text: String,
1330 pub r#type: String, }
1332
1333#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1334pub struct TextResourceContents {
1335 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
1336 pub mime_type: Option<String>,
1337 pub text: String,
1338 pub uri: String,
1339}
1340
1341#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1343pub struct Tool {
1344 #[serde(default, skip_serializing_if = "Option::is_none")]
1345 pub annotations: Option<ToolAnnotations>,
1346 #[serde(default, skip_serializing_if = "Option::is_none")]
1347 pub description: Option<String>,
1348 #[serde(rename = "inputSchema")]
1349 pub input_schema: ToolInputSchema,
1350 pub name: String,
1351 #[serde(
1352 rename = "outputSchema",
1353 default,
1354 skip_serializing_if = "Option::is_none"
1355 )]
1356 pub output_schema: Option<ToolOutputSchema>,
1357 #[serde(default, skip_serializing_if = "Option::is_none")]
1358 pub title: Option<String>,
1359}
1360
1361#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1364pub struct ToolOutputSchema {
1365 #[serde(default, skip_serializing_if = "Option::is_none")]
1366 pub properties: Option<serde_json::Value>,
1367 #[serde(default, skip_serializing_if = "Option::is_none")]
1368 pub required: Option<Vec<String>>,
1369 pub r#type: String, }
1371
1372#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1374pub struct ToolInputSchema {
1375 #[serde(default, skip_serializing_if = "Option::is_none")]
1376 pub properties: Option<serde_json::Value>,
1377 #[serde(default, skip_serializing_if = "Option::is_none")]
1378 pub required: Option<Vec<String>>,
1379 pub r#type: String, }
1381
1382#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1391pub struct ToolAnnotations {
1392 #[serde(
1393 rename = "destructiveHint",
1394 default,
1395 skip_serializing_if = "Option::is_none"
1396 )]
1397 pub destructive_hint: Option<bool>,
1398 #[serde(
1399 rename = "idempotentHint",
1400 default,
1401 skip_serializing_if = "Option::is_none"
1402 )]
1403 pub idempotent_hint: Option<bool>,
1404 #[serde(
1405 rename = "openWorldHint",
1406 default,
1407 skip_serializing_if = "Option::is_none"
1408 )]
1409 pub open_world_hint: Option<bool>,
1410 #[serde(
1411 rename = "readOnlyHint",
1412 default,
1413 skip_serializing_if = "Option::is_none"
1414 )]
1415 pub read_only_hint: Option<bool>,
1416 #[serde(default, skip_serializing_if = "Option::is_none")]
1417 pub title: Option<String>,
1418}
1419
1420#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1421pub enum ToolListChangedNotification {}
1422
1423impl ModelContextProtocolNotification for ToolListChangedNotification {
1424 const METHOD: &'static str = "notifications/tools/list_changed";
1425 type Params = Option<serde_json::Value>;
1426}
1427
1428#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1429pub enum UnsubscribeRequest {}
1430
1431impl ModelContextProtocolRequest for UnsubscribeRequest {
1432 const METHOD: &'static str = "resources/unsubscribe";
1433 type Params = UnsubscribeRequestParams;
1434 type Result = Result;
1435}
1436
1437#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
1438pub struct UnsubscribeRequestParams {
1439 pub uri: String,
1440}
1441
1442impl TryFrom<JSONRPCRequest> for ClientRequest {
1443 type Error = serde_json::Error;
1444 fn try_from(req: JSONRPCRequest) -> std::result::Result<Self, Self::Error> {
1445 match req.method.as_str() {
1446 "initialize" => {
1447 let params_json = req.params.unwrap_or(serde_json::Value::Null);
1448 let params: <InitializeRequest as ModelContextProtocolRequest>::Params =
1449 serde_json::from_value(params_json)?;
1450 Ok(ClientRequest::InitializeRequest(params))
1451 }
1452 "ping" => {
1453 let params_json = req.params.unwrap_or(serde_json::Value::Null);
1454 let params: <PingRequest as ModelContextProtocolRequest>::Params =
1455 serde_json::from_value(params_json)?;
1456 Ok(ClientRequest::PingRequest(params))
1457 }
1458 "resources/list" => {
1459 let params_json = req.params.unwrap_or(serde_json::Value::Null);
1460 let params: <ListResourcesRequest as ModelContextProtocolRequest>::Params =
1461 serde_json::from_value(params_json)?;
1462 Ok(ClientRequest::ListResourcesRequest(params))
1463 }
1464 "resources/templates/list" => {
1465 let params_json = req.params.unwrap_or(serde_json::Value::Null);
1466 let params: <ListResourceTemplatesRequest as ModelContextProtocolRequest>::Params =
1467 serde_json::from_value(params_json)?;
1468 Ok(ClientRequest::ListResourceTemplatesRequest(params))
1469 }
1470 "resources/read" => {
1471 let params_json = req.params.unwrap_or(serde_json::Value::Null);
1472 let params: <ReadResourceRequest as ModelContextProtocolRequest>::Params =
1473 serde_json::from_value(params_json)?;
1474 Ok(ClientRequest::ReadResourceRequest(params))
1475 }
1476 "resources/subscribe" => {
1477 let params_json = req.params.unwrap_or(serde_json::Value::Null);
1478 let params: <SubscribeRequest as ModelContextProtocolRequest>::Params =
1479 serde_json::from_value(params_json)?;
1480 Ok(ClientRequest::SubscribeRequest(params))
1481 }
1482 "resources/unsubscribe" => {
1483 let params_json = req.params.unwrap_or(serde_json::Value::Null);
1484 let params: <UnsubscribeRequest as ModelContextProtocolRequest>::Params =
1485 serde_json::from_value(params_json)?;
1486 Ok(ClientRequest::UnsubscribeRequest(params))
1487 }
1488 "prompts/list" => {
1489 let params_json = req.params.unwrap_or(serde_json::Value::Null);
1490 let params: <ListPromptsRequest as ModelContextProtocolRequest>::Params =
1491 serde_json::from_value(params_json)?;
1492 Ok(ClientRequest::ListPromptsRequest(params))
1493 }
1494 "prompts/get" => {
1495 let params_json = req.params.unwrap_or(serde_json::Value::Null);
1496 let params: <GetPromptRequest as ModelContextProtocolRequest>::Params =
1497 serde_json::from_value(params_json)?;
1498 Ok(ClientRequest::GetPromptRequest(params))
1499 }
1500 "tools/list" => {
1501 let params_json = req.params.unwrap_or(serde_json::Value::Null);
1502 let params: <ListToolsRequest as ModelContextProtocolRequest>::Params =
1503 serde_json::from_value(params_json)?;
1504 Ok(ClientRequest::ListToolsRequest(params))
1505 }
1506 "tools/call" => {
1507 let params_json = req.params.unwrap_or(serde_json::Value::Null);
1508 let params: <CallToolRequest as ModelContextProtocolRequest>::Params =
1509 serde_json::from_value(params_json)?;
1510 Ok(ClientRequest::CallToolRequest(params))
1511 }
1512 "logging/setLevel" => {
1513 let params_json = req.params.unwrap_or(serde_json::Value::Null);
1514 let params: <SetLevelRequest as ModelContextProtocolRequest>::Params =
1515 serde_json::from_value(params_json)?;
1516 Ok(ClientRequest::SetLevelRequest(params))
1517 }
1518 "completion/complete" => {
1519 let params_json = req.params.unwrap_or(serde_json::Value::Null);
1520 let params: <CompleteRequest as ModelContextProtocolRequest>::Params =
1521 serde_json::from_value(params_json)?;
1522 Ok(ClientRequest::CompleteRequest(params))
1523 }
1524 _ => Err(serde_json::Error::io(std::io::Error::new(
1525 std::io::ErrorKind::InvalidData,
1526 format!("Unknown method: {}", req.method),
1527 ))),
1528 }
1529 }
1530}
1531
1532impl TryFrom<JSONRPCNotification> for ServerNotification {
1533 type Error = serde_json::Error;
1534 fn try_from(n: JSONRPCNotification) -> std::result::Result<Self, Self::Error> {
1535 match n.method.as_str() {
1536 "notifications/cancelled" => {
1537 let params_json = n.params.unwrap_or(serde_json::Value::Null);
1538 let params: <CancelledNotification as ModelContextProtocolNotification>::Params =
1539 serde_json::from_value(params_json)?;
1540 Ok(ServerNotification::CancelledNotification(params))
1541 }
1542 "notifications/progress" => {
1543 let params_json = n.params.unwrap_or(serde_json::Value::Null);
1544 let params: <ProgressNotification as ModelContextProtocolNotification>::Params =
1545 serde_json::from_value(params_json)?;
1546 Ok(ServerNotification::ProgressNotification(params))
1547 }
1548 "notifications/resources/list_changed" => {
1549 let params_json = n.params.unwrap_or(serde_json::Value::Null);
1550 let params: <ResourceListChangedNotification as ModelContextProtocolNotification>::Params = serde_json::from_value(params_json)?;
1551 Ok(ServerNotification::ResourceListChangedNotification(params))
1552 }
1553 "notifications/resources/updated" => {
1554 let params_json = n.params.unwrap_or(serde_json::Value::Null);
1555 let params: <ResourceUpdatedNotification as ModelContextProtocolNotification>::Params = serde_json::from_value(params_json)?;
1556 Ok(ServerNotification::ResourceUpdatedNotification(params))
1557 }
1558 "notifications/prompts/list_changed" => {
1559 let params_json = n.params.unwrap_or(serde_json::Value::Null);
1560 let params: <PromptListChangedNotification as ModelContextProtocolNotification>::Params = serde_json::from_value(params_json)?;
1561 Ok(ServerNotification::PromptListChangedNotification(params))
1562 }
1563 "notifications/tools/list_changed" => {
1564 let params_json = n.params.unwrap_or(serde_json::Value::Null);
1565 let params: <ToolListChangedNotification as ModelContextProtocolNotification>::Params = serde_json::from_value(params_json)?;
1566 Ok(ServerNotification::ToolListChangedNotification(params))
1567 }
1568 "notifications/message" => {
1569 let params_json = n.params.unwrap_or(serde_json::Value::Null);
1570 let params: <LoggingMessageNotification as ModelContextProtocolNotification>::Params = serde_json::from_value(params_json)?;
1571 Ok(ServerNotification::LoggingMessageNotification(params))
1572 }
1573 _ => Err(serde_json::Error::io(std::io::Error::new(
1574 std::io::ErrorKind::InvalidData,
1575 format!("Unknown method: {}", n.method),
1576 ))),
1577 }
1578 }
1579}