mirror of
https://github.com/mcp-use/mcp-use.git
synced 2026-09-14 18:06:01 +08:00
8348c59a53
* docs: reorganize navigation and clean up content - Remove 'Misc' group with misplaced blog posts - Remove 'Libraries' redirect group from Home nav - Simplify 'Dev Tools' group (flatten Inspector, CLI, Tunneling) - Remove individual changelog versions from Python nav (keep summary) - Remove changelog from TypeScript 'Get Started' group - Remove tunneling duplicate from Python Development group - Rewrite mcp101 as clean MCP concepts page (was pitch deck) - Delete typescript/blog posts (not technical docs) - Add redirects for deleted blog post URLs * docs: fix content accuracy and remove sloppy language - Fix broken python/server/mcp-apps link in home page - Remove informal pitch-speak from python/server/index.mdx - Fix grammar error in typescript/server/index.mdx - Update typescript/client/logging.mdx: remove fake 'coming soon' API code - Fix non-existent model name gpt-5.1 in typescript quickstart - Fix mcp_use naming in development contributing guide * docs: fix incorrect TypeScript server API calls in inspector docs - Replace server.addTool() with server.tool() (correct mcp-use API) - Add missing zod import to debugging-chatgpt-apps example * docs: fix fake model names (gpt-5.1 → gpt-4o) in agent docs * docs: update model names, fix APIs, and add agent visibility hints - Replace all deprecated model names with latest: gpt-4.1, gpt-4.1-mini, claude-sonnet-4-6, claude-opus-4-7, gemini-2.5-flash across all docs - Fix TypeScript server.tool() API in installation.mdx (old positional string form) - Fix TypeScript agent.run() in quickstart.mdx (deprecated string form → object) - Remove broken manufact.com/docs/llms.txt hidden hints from 5 pages - Add <Visibility for="agents"> block to mcp101.mdx with install commands, key classes, and API signatures for agent-oriented navigation - Add LangChain provider install note to Python quickstart (mcp-use agent requires a separate langchain-* provider package) - Update model name cards in Python llm-integration.mdx * docs: clean up remaining stale model names and improve accuracy - Update supported model lists in Python and TypeScript llm-integration pages - Fix cost optimization table to use current model IDs - Update TypeScript agent overview supported providers list * docs: add LangChain provider install to TypeScript quickstart agent section The MCPAgent requires a separate @langchain/* provider package; this was not mentioned before the code example that imports from @langchain/openai. * docs: update to latest flagship model IDs (May 2026) - OpenAI: gpt-4.1 → gpt-5.5, gpt-4.1-mini → gpt-5.5-mini - Google: gemini-2.5-flash → gemini-3.1-flash, gemini-2.5-pro → gemini-3.1-pro - Groq: llama-3.1-* → llama-4-scout-17b-16e-instruct - Anthropic (claude-opus-4-7, claude-sonnet-4-6) already current, no change * docs: replace all em dashes with hyphens * docs: restore llms.txt hints using Visibility component * docs: simplify TypeScript logging page to unsupported notice only * docs: rewrite mcp101 to explain MCP protocol with mcp-use examples and doc links * docs: remove goal.md * docs: revert nav changes, keep only Misc group removal and blog redirects * docs: reorder mcp101 to Server/App -> Client/Inspector -> Agent, restore title * docs: add code examples for Resources and Prompts in mcp101 * docs: remove em dashes from mcp101 * docs: add MCPClient code examples to mcp101 * docs: add React client example to mcp101 * docs: add agent code examples to mcp101 * docs: expand MCP Apps section in mcp101 with example and links * docs: restore Contacts, Socials, and Founders sections to mcp101 * docs: add context-setting intro paragraph to mcp101 for new readers * docs: add MCP stores section to mcp101 intro with Claude, ChatGPT, Cursor * docs: fix Claude store link * docs: fix ChatGPT store link * docs: fix Cursor store link * docs: replace store Cards with linked image grid * docs: add captions to store images * docs: add Notifications to client primitives table in mcp101 * docs: add lead-in paragraph before resource cards at bottom of mcp101 * docs: move resource cards to end of page after Contacts/Socials/Founders * docs: demote Contacts/Socials/Founders to bold text to remove from TOC * docs: move Contacts/Socials/Founders to very end of mcp101 * docs: add Resources and Contacts section headers, link official MCP docs * chore(docs): update site metadata, footer links, and rename mcp_use to mcp-use * update docs metadata + images * docs: enhance MCP section by highlighting the reach of MCP stores with 1 billion weekly active users * api ref
209 lines
6.1 KiB
Plaintext
209 lines
6.1 KiB
Plaintext
---
|
|
title: "Resources"
|
|
description: "Define and expose resources from your MCP server"
|
|
icon: "file"
|
|
---
|
|
|
|
Resources expose data to MCP clients. Unlike tools (which perform actions), resources provide read-only access to content like files, database records, or live data.
|
|
|
|
## Example
|
|
|
|
```python
|
|
@server.resource(
|
|
uri="config://{section}",
|
|
name="app_config",
|
|
title="Application Config",
|
|
description="Get configuration for a specific section",
|
|
mime_type="application/json",
|
|
)
|
|
def get_config(section: str) -> str:
|
|
"""Get configuration for a specific section."""
|
|
configs = {
|
|
"database": '{"host": "localhost", "port": 5432}',
|
|
"cache": '{"enabled": true, "ttl": 3600}',
|
|
}
|
|
return configs.get(section, '{"error": "Section not found"}')
|
|
```
|
|
|
|
## Anatomy of a Resource
|
|
|
|
When a client calls `resources/list`, the server returns metadata for each resource. Resources with URI templates (like `{section}`) are returned via `resources/templates/list` instead.
|
|
|
|
Here's the JSON-RPC response that the example above produces when a client calls `resources/templates/list`:
|
|
|
|
```json
|
|
{
|
|
"jsonrpc": "2.0",
|
|
"id": 1,
|
|
"result": {
|
|
"resourceTemplates": [
|
|
{
|
|
"uriTemplate": "config://{section}",
|
|
"name": "app_config",
|
|
"title": "Application Config",
|
|
"description": "Get configuration for a specific section",
|
|
"mimeType": "application/json"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
Here's what maps to what:
|
|
|
|
| Python | MCP Schema | Notes |
|
|
|--------|-----------|-------|
|
|
| `uri="config://{section}"` | `"uriTemplate"` | `{section}` makes it a template; without it, it would be a static `"uri"` |
|
|
| `name="app_config"` | `"name"` | Falls back to function name if omitted |
|
|
| `title="Application Config"` | `"title"` | Human-readable display name |
|
|
| `description="Get configuration..."` | `"description"` | Falls back to docstring if omitted |
|
|
| `mime_type="application/json"` | `"mimeType"` | Tells clients how to interpret the content |
|
|
| `section: str` | *(extracted from URI)* | Parameter matched from the URI template |
|
|
|
|
<Tip>
|
|
If your URI contains `{param}` placeholders, the resource is registered as a **template**. Otherwise, it's registered as a **static resource**.
|
|
</Tip>
|
|
|
|
## Static Resources
|
|
|
|
Resources without URI parameters are static - they always return at the same URI:
|
|
|
|
```python
|
|
from datetime import datetime
|
|
|
|
@server.resource(
|
|
uri="time://current",
|
|
name="current_time",
|
|
title="Current Time",
|
|
mime_type="text/plain",
|
|
)
|
|
def current_time() -> str:
|
|
"""Returns the current server time."""
|
|
return datetime.now().isoformat()
|
|
```
|
|
|
|
## Resource Templates
|
|
|
|
Use `{param}` placeholders in the URI to create dynamic resources:
|
|
|
|
```python
|
|
@server.resource(
|
|
uri="user://{user_id}",
|
|
name="user_profile",
|
|
title="User Profile",
|
|
description="Get a user's profile by ID",
|
|
mime_type="application/json",
|
|
)
|
|
def get_user(user_id: str) -> str:
|
|
"""Fetch user profile by ID."""
|
|
users = {"1": "Alice", "2": "Bob"}
|
|
name = users.get(user_id, "Unknown")
|
|
return f'{{"id": "{user_id}", "name": "{name}"}}'
|
|
```
|
|
|
|
Clients request `user://123` and the function receives `user_id="123"`.
|
|
|
|
### Multiple Parameters
|
|
|
|
Templates support multiple parameters:
|
|
|
|
```python
|
|
@server.resource(
|
|
uri="file://{folder}/{filename}",
|
|
name="file_content",
|
|
mime_type="text/plain",
|
|
)
|
|
def get_file(folder: str, filename: str) -> str:
|
|
"""Read a file from a folder."""
|
|
return f"Content of {folder}/{filename}"
|
|
```
|
|
|
|
## Async Resources
|
|
|
|
Resources can be async for I/O operations:
|
|
|
|
```python
|
|
import httpx
|
|
|
|
@server.resource(
|
|
uri="api://weather",
|
|
mime_type="application/json",
|
|
)
|
|
async def weather_data() -> str:
|
|
"""Fetch current weather data."""
|
|
async with httpx.AsyncClient() as client:
|
|
response = await client.get("https://api.weather.com/current")
|
|
return response.text
|
|
```
|
|
|
|
## Binary Resources
|
|
|
|
Return bytes for binary content:
|
|
|
|
```python
|
|
@server.resource(
|
|
uri="image://logo",
|
|
mime_type="image/png",
|
|
)
|
|
def logo_image() -> bytes:
|
|
"""Return the application logo."""
|
|
with open("logo.png", "rb") as f:
|
|
return f.read()
|
|
```
|
|
|
|
## Resource Subscriptions
|
|
|
|
Clients can subscribe to resources and receive notifications when they change. This follows the [MCP resource subscriptions spec](https://modelcontextprotocol.io/specification/2025-11-25/server/resources#subscriptions).
|
|
|
|
### How It Works
|
|
|
|
1. Client sends `resources/subscribe` with a resource URI
|
|
2. Your server updates the resource and calls `notify_resource_updated()`
|
|
3. All subscribed clients receive a `notifications/resources/updated` notification
|
|
4. Clients re-read the resource to get the new content
|
|
|
|
MCPServer handles subscribe/unsubscribe tracking automatically - you just need to call `notify_resource_updated()` when your resource changes.
|
|
|
|
### Example
|
|
|
|
```python
|
|
current_price = 100.0
|
|
|
|
@server.resource(uri="data://price", name="stock_price", mime_type="text/plain")
|
|
def get_price() -> str:
|
|
return str(current_price)
|
|
|
|
@server.tool()
|
|
async def update_price(new_price: float) -> str:
|
|
"""Update the stock price and notify subscribers."""
|
|
global current_price
|
|
current_price = new_price
|
|
await server.notify_resource_updated("data://price")
|
|
return f"Price updated to {new_price}"
|
|
```
|
|
|
|
When a client subscribes to `data://price` and then any client calls `update_price`, all subscribers receive the notification and can re-read the resource.
|
|
|
|
<Note>
|
|
Subscriptions are session-scoped - they're automatically cleaned up when a client disconnects. If the server restarts, clients need to re-subscribe.
|
|
</Note>
|
|
|
|
## Common MIME Types
|
|
|
|
| MIME Type | Use Case |
|
|
|-----------|----------|
|
|
| `text/plain` | Plain text content |
|
|
| `application/json` | JSON data |
|
|
| `text/markdown` | Markdown documents |
|
|
| `text/html` | HTML content |
|
|
| `image/png` | PNG images |
|
|
|
|
## Resources vs Tools
|
|
|
|
| Aspect | Resources | Tools |
|
|
|--------|-----------|-------|
|
|
| Purpose | Expose data | Perform actions |
|
|
| Side effects | None (read-only) | May modify state |
|
|
| Caching | Can be cached | Generally not cached |
|
|
| Use case | Configuration, files, status | Operations, calculations |
|