Skip to content

Commit 83adbc0

Browse files
authored
Merge pull request #1845 from jlowin/responsecachingmiddleware
Add Response Caching Middleware
2 parents ef4afe4 + f5d770e commit 83adbc0

5 files changed

Lines changed: 1029 additions & 8 deletions

File tree

docs/servers/middleware.mdx

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,51 @@ mcp.add_middleware(DetailedTimingMiddleware())
449449

450450
The built-in versions include custom logger support, proper formatting, and **DetailedTimingMiddleware** provides operation-specific hooks like `on_call_tool` and `on_read_resource` for granular timing.
451451

452+
### Caching Middleware
453+
454+
Caching middleware is essential for improving performance and reducing server load. FastMCP provides caching middleware at `fastmcp.server.middleware.caching`.
455+
456+
Here's how to use the full version:
457+
458+
```python
459+
from fastmcp.server.middleware.caching import ResponseCachingMiddleware
460+
461+
mcp.add_middleware(ResponseCachingMiddleware())
462+
```
463+
464+
Out of the box, it caches call/list tool, resources, and prompts to an in-memory cache. Sending a notification of a tool/resource/prompt change will invalidate the cache for the affected method. List calls are stored under global keys, if you share a key_value backend across servers, keep this in mind and consider using the PrefixCollectionsWrapper in py-key-value-aio to namespace collections by server.
465+
466+
Each method can be configured individually, for example, caching list tools for 30 seconds, skipping caching for tools other than `tool1` and not caching and requests to read resources:
467+
468+
```python
469+
from fastmcp.server.middleware.caching import ResponseCachingMiddleware, CallToolSettings, ListToolsSettings, ReadResourceSettings
470+
471+
mcp.add_middleware(ResponseCachingMiddleware(
472+
list_tools_settings=ListToolsSettings(
473+
ttl=30,
474+
),
475+
call_tool_settings=CallToolSettings(
476+
included_tools=["tool1"],
477+
),
478+
read_resource_settings=ReadResourceSettings(
479+
enabled=False
480+
)
481+
))
482+
```
483+
484+
It can also be configured to cache to disk:
485+
486+
```python
487+
from fastmcp.server.middleware.caching import ResponseCachingMiddleware
488+
from key_value.aio.stores.disk import DiskStore
489+
490+
mcp.add_middleware(ResponseCachingMiddleware(
491+
cache_storage=DiskStore(directory="cache"),
492+
))
493+
```
494+
495+
See the Contrib modules for caching middleware implementations that support additional features like distributed caching.
496+
452497
### Logging Middleware
453498

454499
Request and response logging is crucial for debugging, monitoring, and understanding usage patterns in your MCP server. FastMCP provides comprehensive logging middleware at `fastmcp.server.middleware.logging`.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ dependencies = [
1515
"pydantic[email]>=2.11.7",
1616
"pyperclip>=1.9.0",
1717
"openapi-core>=0.19.5",
18-
"py-key-value-aio[disk,memory]>=0.2.2",
18+
"py-key-value-aio[disk,memory]>=0.2.2,<0.3.0",
1919
"websockets>=15.0.1",
2020
]
2121

0 commit comments

Comments
 (0)