turbomcp_protocol/types/
resources.rs

1//! Resource access and template types
2//!
3//! This module contains types for the MCP resource system, including
4//! resource definitions, templates, subscriptions, and resource operations.
5
6use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8
9use super::{
10    content::ResourceContent,
11    core::{Annotations, Cursor, MimeType, Uri},
12};
13
14/// Resource definition per MCP 2025-06-18 specification
15#[derive(Debug, Clone, Serialize, Deserialize)]
16pub struct Resource {
17    /// Resource name (programmatic identifier)
18    pub name: String,
19
20    /// Display title for UI contexts (optional, falls back to name if not provided)
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub title: Option<String>,
23
24    /// The URI of this resource
25    pub uri: Uri,
26
27    /// A description of what this resource represents
28    /// This can be used by clients to improve the LLM's understanding of available resources
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub description: Option<String>,
31
32    /// The MIME type of this resource, if known
33    #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
34    pub mime_type: Option<MimeType>,
35
36    /// Optional annotations for the client
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub annotations: Option<Annotations>,
39
40    /// The size of the raw resource content, in bytes (before base64 encoding or tokenization), if known
41    /// This can be used by Hosts to display file sizes and estimate context window usage
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub size: Option<u64>,
44
45    /// General metadata field for extensions and custom data
46    #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
47    pub meta: Option<HashMap<String, serde_json::Value>>,
48}
49
50/// Resource contents
51#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct ResourceContents {
53    /// The URI of this resource
54    pub uri: Uri,
55    /// The MIME type of this resource, if known
56    #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
57    pub mime_type: Option<MimeType>,
58    /// General metadata field for extensions and custom data
59    #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
60    pub meta: Option<HashMap<String, serde_json::Value>>,
61}
62
63/// Resource template definition
64#[derive(Debug, Clone, Serialize, Deserialize)]
65pub struct ResourceTemplate {
66    /// Template name (programmatic identifier)
67    pub name: String,
68
69    /// Display title for UI contexts (optional, falls back to name if not provided)
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub title: Option<String>,
72
73    /// URI template for this resource
74    #[serde(rename = "uriTemplate")]
75    pub uri_template: String,
76
77    /// A description of what this resource template represents
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub description: Option<String>,
80
81    /// The MIME type of resources generated from this template, if known
82    #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
83    pub mime_type: Option<MimeType>,
84
85    /// Optional annotations for the client
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub annotations: Option<Annotations>,
88
89    /// General metadata field for extensions and custom data
90    #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
91    pub meta: Option<HashMap<String, serde_json::Value>>,
92}
93
94/// List resources request
95#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct ListResourcesRequest {
97    /// Optional cursor for pagination
98    #[serde(skip_serializing_if = "Option::is_none")]
99    pub cursor: Option<Cursor>,
100    /// Optional metadata per MCP 2025-06-18 specification
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub _meta: Option<serde_json::Value>,
103}
104
105/// List resources result
106#[derive(Debug, Clone, Serialize, Deserialize)]
107pub struct ListResourcesResult {
108    /// Available resources
109    pub resources: Vec<Resource>,
110    /// Optional continuation token
111    #[serde(rename = "nextCursor", skip_serializing_if = "Option::is_none")]
112    pub next_cursor: Option<Cursor>,
113    /// Optional metadata per MCP 2025-06-18 specification
114    #[serde(skip_serializing_if = "Option::is_none")]
115    pub _meta: Option<serde_json::Value>,
116}
117
118/// List resource templates request
119#[derive(Debug, Clone, Serialize, Deserialize)]
120pub struct ListResourceTemplatesRequest {
121    /// Optional cursor for pagination
122    #[serde(skip_serializing_if = "Option::is_none")]
123    pub cursor: Option<Cursor>,
124    /// Optional metadata per MCP 2025-06-18 specification
125    #[serde(skip_serializing_if = "Option::is_none")]
126    pub _meta: Option<serde_json::Value>,
127}
128
129/// List resource templates result
130#[derive(Debug, Clone, Serialize, Deserialize)]
131pub struct ListResourceTemplatesResult {
132    /// Available resource templates
133    #[serde(rename = "resourceTemplates")]
134    pub resource_templates: Vec<ResourceTemplate>,
135    /// Optional continuation token
136    #[serde(rename = "nextCursor", skip_serializing_if = "Option::is_none")]
137    pub next_cursor: Option<Cursor>,
138    /// Optional metadata per MCP 2025-06-18 specification
139    #[serde(skip_serializing_if = "Option::is_none")]
140    pub _meta: Option<serde_json::Value>,
141}
142
143/// Read resource request
144#[derive(Debug, Clone, Serialize, Deserialize)]
145pub struct ReadResourceRequest {
146    /// Resource URI
147    pub uri: Uri,
148    /// Optional metadata per MCP 2025-06-18 specification
149    #[serde(skip_serializing_if = "Option::is_none")]
150    pub _meta: Option<serde_json::Value>,
151}
152
153/// Read resource result
154#[derive(Debug, Clone, Serialize, Deserialize)]
155pub struct ReadResourceResult {
156    /// Resource contents (can be text or binary)
157    pub contents: Vec<ResourceContent>,
158    /// Optional metadata per MCP 2025-06-18 specification
159    #[serde(skip_serializing_if = "Option::is_none")]
160    pub _meta: Option<serde_json::Value>,
161}
162
163/// Subscribe request
164#[derive(Debug, Clone, Serialize, Deserialize)]
165pub struct SubscribeRequest {
166    /// Resource URI
167    pub uri: Uri,
168}
169
170/// Unsubscribe request
171#[derive(Debug, Clone, Serialize, Deserialize)]
172pub struct UnsubscribeRequest {
173    /// Resource URI
174    pub uri: Uri,
175}
176
177/// Resource updated notification
178#[derive(Debug, Clone, Serialize, Deserialize)]
179pub struct ResourceUpdatedNotification {
180    /// Resource URI
181    pub uri: Uri,
182}