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}