httpmcp_rust/handlers/resources.rs
1use crate::context::RequestContext;
2use crate::error::Result;
3use crate::protocol::{Resource, ResourceContents, ResourceTemplate};
4use async_trait::async_trait;
5
6/// Trait for implementing resource providers
7///
8/// Implement this trait to provide resources (files, data, etc.) to MCP clients.
9/// All methods receive a RequestContext with access to headers and request metadata.
10#[async_trait]
11pub trait ResourceProvider: Send + Sync {
12 /// List available resources
13 ///
14 /// # Arguments
15 /// * `cursor` - Optional pagination cursor
16 /// * `ctx` - Request context with headers and metadata
17 ///
18 /// # Returns
19 /// A tuple of (resources, next_cursor)
20 async fn list_resources(
21 &self,
22 cursor: Option<&str>,
23 ctx: &RequestContext,
24 ) -> Result<(Vec<Resource>, Option<String>)>;
25
26 /// Read a specific resource by URI
27 ///
28 /// # Arguments
29 /// * `uri` - The URI of the resource to read
30 /// * `ctx` - Request context with headers and metadata
31 ///
32 /// # Returns
33 /// The resource contents
34 async fn read_resource(&self, uri: &str, ctx: &RequestContext)
35 -> Result<Vec<ResourceContents>>;
36
37 /// List resource templates (optional)
38 ///
39 /// Resource templates define URI patterns for dynamic resources.
40 /// Return empty vec if not supported.
41 async fn list_templates(&self, _ctx: &RequestContext) -> Result<Vec<ResourceTemplate>> {
42 Ok(vec![])
43 }
44
45 /// Subscribe to resource changes (optional)
46 ///
47 /// Called when a client subscribes to changes for a specific resource.
48 /// Return Ok if subscription is accepted.
49 async fn subscribe(&self, _uri: &str, _ctx: &RequestContext) -> Result<()> {
50 Ok(())
51 }
52
53 /// Unsubscribe from resource changes (optional)
54 async fn unsubscribe(&self, _uri: &str, _ctx: &RequestContext) -> Result<()> {
55 Ok(())
56 }
57}