mcp_protocol/types/resource/
mod.rs

1// mcp-protocol/src/types/resource/mod.rs
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5/// Represents a resource that can be accessed by the client
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct Resource {
8    /// URI that uniquely identifies the resource
9    pub uri: String,
10    
11    /// Human-readable name of the resource
12    pub name: String,
13    
14    /// Optional description of the resource
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub description: Option<String>,
17    
18    /// Optional MIME type of the resource content
19    #[serde(rename = "mimeType")]
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub mime_type: Option<String>,
22    
23    /// Optional size in bytes
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub size: Option<u64>,
26    
27    /// Optional custom annotations
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub annotations: Option<HashMap<String, serde_json::Value>>,
30}
31
32/// Content of a resource, which can be either text or binary data
33#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct ResourceContent {
35    /// URI that uniquely identifies the resource
36    pub uri: String,
37    
38    /// MIME type of the resource content
39    #[serde(rename = "mimeType")]
40    pub mime_type: String,
41    
42    /// Text content (used for text resources)
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub text: Option<String>,
45    
46    /// Binary content encoded as base64 (used for binary resources)
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub blob: Option<String>,
49}
50
51/// Parameters for listing resources
52#[derive(Debug, Clone, Serialize, Deserialize)]
53pub struct ResourcesListParams {
54    /// Optional cursor for pagination
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub cursor: Option<String>,
57}
58
59/// Result of listing resources
60#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct ResourcesListResult {
62    /// List of available resources
63    pub resources: Vec<Resource>,
64    
65    /// Optional cursor for the next page of results
66    #[serde(rename = "nextCursor")]
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub next_cursor: Option<String>,
69}
70
71/// Parameters for reading a resource
72#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct ResourceReadParams {
74    /// URI of the resource to read
75    pub uri: String,
76}
77
78/// Result of reading a resource
79#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct ResourceReadResult {
81    /// Contents of the resource
82    pub contents: Vec<ResourceContent>,
83}
84
85/// Parameters for subscribing to a resource
86#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct ResourceSubscribeParams {
88    /// URI of the resource to subscribe to
89    pub uri: String,
90}
91
92/// Parameters for a resource update notification
93#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct ResourceUpdatedParams {
95    /// URI of the updated resource
96    pub uri: String,
97}
98
99/// Resource template that can be parameterized
100#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct ResourceTemplate {
102    /// URI template that can be expanded with parameters
103    #[serde(rename = "uriTemplate")]
104    pub uri_template: String,
105    
106    /// Human-readable name of the template
107    pub name: String,
108    
109    /// Optional description of the template
110    #[serde(skip_serializing_if = "Option::is_none")]
111    pub description: Option<String>,
112    
113    /// Optional MIME type of resources generated from this template
114    #[serde(rename = "mimeType")]
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub mime_type: Option<String>,
117    
118    /// Optional custom annotations
119    #[serde(skip_serializing_if = "Option::is_none")]
120    pub annotations: Option<HashMap<String, serde_json::Value>>,
121}
122
123/// Parameters for listing resource templates
124#[derive(Debug, Clone, Serialize, Deserialize)]
125pub struct ResourceTemplatesListParams {
126    /// Optional cursor for pagination
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub cursor: Option<String>,
129}
130
131/// Result of listing resource templates
132#[derive(Debug, Clone, Serialize, Deserialize)]
133pub struct ResourceTemplatesListResult {
134    /// List of available resource templates
135    #[serde(rename = "resourceTemplates")]
136    pub resource_templates: Vec<ResourceTemplate>,
137    
138    /// Optional cursor for the next page of results
139    #[serde(rename = "nextCursor")]
140    #[serde(skip_serializing_if = "Option::is_none")]
141    pub next_cursor: Option<String>,
142}
143
144/// Parameters for template parameter completion - DEPRECATED in favor of the general completion API
145/// (This is kept for backward compatibility with existing code)
146#[derive(Debug, Clone, Serialize, Deserialize)]
147pub struct ResourceTemplateCompletionParams {
148    /// URI template to complete
149    #[serde(rename = "uriTemplate")]
150    pub uri_template: String,
151    
152    /// Parameter name to complete
153    pub parameter: String,
154    
155    /// Current value of the parameter (for contextual completion)
156    #[serde(skip_serializing_if = "Option::is_none")]
157    pub value: Option<String>,
158}
159
160/// Result of template parameter completion - DEPRECATED in favor of the general completion API
161/// (This is kept for backward compatibility with existing code)
162#[derive(Debug, Clone, Serialize, Deserialize)]
163pub struct ResourceTemplateCompletionResult {
164    /// List of completion suggestions
165    pub items: Vec<super::completion::CompletionItem>,
166}
167
168/// Parameters for unsubscribing from a resource
169#[derive(Debug, Clone, Serialize, Deserialize)]
170pub struct ResourceUnsubscribeParams {
171    /// URI of the resource to unsubscribe from
172    pub uri: String,
173}