diff --git a/docs/concepts/resources.mdx b/docs/concepts/resources.mdx
index f48f14f..5f91a09 100644
--- a/docs/concepts/resources.mdx
+++ b/docs/concepts/resources.mdx
@@ -24,7 +24,7 @@ Each resource is identified by a unique URI and can contain either text or binar
Resources are identified using URIs that follow this format:
```
-[protocol]://[path]
+[protocol]://[host]/[path]
```
For example:
@@ -42,7 +42,7 @@ Resources can contain two types of content:
Text resources contain UTF-8 encoded text data. These are suitable for:
- Source code
-- Configuration files
+- Configuration files
- Log files
- JSON/XML data
- Plain text
@@ -66,37 +66,39 @@ Servers expose a list of concrete resources via the `resources/list` endpoint. E
```typescript
{
- uri: string; // Unique identifier for the resource
- name: string; // Human-readable name
+ uri: string; // Unique identifier for the resource
+ name: string; // Human-readable name
description?: string; // Optional description
- mimeType?: string; // Optional MIME type
+ mimeType?: string; // Optional MIME type
}
```
-### Resource templates
+### Resource templates
-For dynamic resources, servers can expose URI templates that clients can use to construct valid resource URIs:
+For dynamic resources, servers can expose [URI templates](https://datatracker.ietf.org/doc/html/rfc6570) that clients can use to construct valid resource URIs:
```typescript
{
uriTemplate: string; // URI template following RFC 6570
name: string; // Human-readable name for this type
description?: string; // Optional description
- mimeType?: string; // Optional MIME type for all matching resources
+ mimeType?: string; // Optional MIME type for all matching resources
}
```
## Reading resources
-To read a resource, clients make a `resources/read` request with the resource URI. The server responds with:
+To read a resource, clients make a `resources/read` request with the resource URI.
+
+The server responds with a list of resource contents:
```typescript
{
contents: [
{
- uri: string; // The requested URI
+ uri: string; // The URI of the resource
mimeType?: string; // Optional MIME type
-
+
// One of:
text?: string; // For text resources
blob?: string; // For binary resources (base64 encoded)
@@ -105,6 +107,10 @@ To read a resource, clients make a `resources/read` request with the resource UR
}
```
+
+ 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:
@@ -113,7 +119,7 @@ MCP supports real-time updates for resources through two mechanisms:
Servers can notify clients when their list of available resources changes via the `notifications/resources/list_changed` notification.
-### Content changes
+### Content changes
Clients can subscribe to updates for specific resources:
@@ -126,45 +132,58 @@ Clients can subscribe to updates for specific resources:
Here's a simple example of implementing resource support in an MCP server:
-```typescript
-const server = new Server({
- name: "example-server",
- version: "1.0.0"
-});
-
-// List available resources
-server.setRequestHandler(ListResourcesRequestSchema, async () => {
- return {
- resources: [
- {
- uri: "file:///logs/app.log",
- name: "Application Logs",
- mimeType: "text/plain"
+
+
+ ```typescript
+ const server = new Server({
+ name: "example-server",
+ version: "1.0.0"
+ }, {
+ capabilities: {
+ resources: {}
}
- ]
- };
-});
+ });
-// Read resource contents
-server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
- const uri = request.params.uri;
-
- if (uri === "file:///logs/app.log") {
- const logContents = await readLogFile();
- return {
- contents: [
- {
- uri,
- mimeType: "text/plain",
- text: logContents
- }
- ]
- };
- }
-
- throw new Error("Resource not found");
-});
-```
+ // List available resources
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
+ return {
+ resources: [
+ {
+ uri: "file:///logs/app.log",
+ name: "Application Logs",
+ mimeType: "text/plain"
+ }
+ ]
+ };
+ });
+
+ // Read resource contents
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
+ const uri = request.params.uri;
+
+ if (uri === "file:///logs/app.log") {
+ const logContents = await readLogFile();
+ return {
+ contents: [
+ {
+ uri,
+ mimeType: "text/plain",
+ text: logContents
+ }
+ ]
+ };
+ }
+
+ throw new Error("Resource not found");
+ });
+ ```
+
+
+ ```python
+ # Python implementation coming soon
+ ```
+
+
## Best practices
@@ -194,4 +213,4 @@ When exposing resources:
- Encrypt sensitive data in transit
- Validate MIME types
- Implement timeouts for long-running reads
-- Handle resource cleanup appropriately
\ No newline at end of file
+- Handle resource cleanup appropriately