Resources are designed to be application-controlled, meaning that the client application can decide how and when they should be used.
Different MCP clients may handle resources differently. For example:
- Claude Desktop currently requires users to explicitly select resources before they can be used
- Other clients might automatically select resources based on heuristics
- Some implementations may even allow the AI model itself to determine which resources to use
Overview
Resources represent any kind of data that an MCP server wants to make available to clients. This can include:- File contents
- Database records
- API responses
- Live system data
- Screenshots and images
- Log files
- And more
Resource URIs
Resources are identified using URIs that follow this format:file:///home/user/documents/report.pdf
postgres://database/customers/schema
screen://localhost/display1
Resource types
Resources can contain two types of content:Text resources
Text resources contain UTF-8 encoded text data. These are suitable for:- Source code
- Configuration files
- Log files
- JSON/XML data
- Plain text
Binary resources
Binary resources contain raw binary data encoded in base64. These are suitable for:- Images
- PDFs
- Audio files
- Video files
- Other non-text formats
Resource discovery
Clients can discover available resources through two main methods:Direct resources
Servers expose a list of concrete resources via theresources/list
endpoint. Each resource includes:
Resource templates
For dynamic resources, servers can expose URI templates that clients can use to construct valid resource URIs:Reading resources
To read a resource, clients make aresources/read
request with the resource URI.
The server responds with a list of resource contents:
Servers may return multiple resources in response to one
resources/read
request. This could be used, for example, to return a list of files inside a directory when the directory is read.Resource updates
MCP supports real-time updates for resources through two mechanisms:List changes
Servers can notify clients when their list of available resources changes via thenotifications/resources/list_changed
notification.
Content changes
Clients can subscribe to updates for specific resources:- Client sends
resources/subscribe
with resource URI - Server sends
notifications/resources/updated
when the resource changes - Client can fetch latest content with
resources/read
- Client can unsubscribe with
resources/unsubscribe
Example implementation
Here’s a simple example of implementing resource support in an MCP server:Best practices
When implementing resource support:- Use clear, descriptive resource names and URIs
- Include helpful descriptions to guide LLM understanding
- Set appropriate MIME types when known
- Implement resource templates for dynamic content
- Use subscriptions for frequently changing resources
- Handle errors gracefully with clear error messages
- Consider pagination for large resource lists
- Cache resource contents when appropriate
- Validate URIs before processing
- Document your custom URI schemes
Security considerations
When exposing resources:- Validate all resource URIs
- Implement appropriate access controls
- Sanitize file paths to prevent directory traversal
- Be cautious with binary data handling
- Consider rate limiting for resource reads
- Audit resource access
- Encrypt sensitive data in transit
- Validate MIME types
- Implement timeouts for long-running reads
- Handle resource cleanup appropriately