What You’ll Learn
By the end of this guide, you’ll know how to:- ✅ Enable caching for specific tools
- ✅ Configure TTL (time-to-live) per tool
- ✅ Use sliding windows to keep hot data cached
- ✅ Switch between memory and Redis storage
- ✅ Handle cache misses and invalidation
Prerequisites
- A FrontMCP project with at least one app and tool
- Understanding of tool execution flow
- (Optional) Redis server for production caching
Step 1: Install the Cache Plugin
Step 2: Add Plugin to Your App
Step 3: Enable Caching on Tools
Caching is opt-in per tool. Add thecache field to your tool metadata:
- Class-based Tool
- Function-based Tool
- Custom TTL
- With Sliding Window
Step 4: Test Cache Behavior
Start your server
Call the tool twice
Observe cache hit
[DEBUG] Cache hit for get-user-profileTest cache expiration
How Caching Works
Cache Key Generation
- Tool name (e.g.,
get-user-profile) - Validated input (e.g.,
{ userId: "user-123" })
Before Execution (Will Hook)
After Execution (Did Hook)
Sliding Window (Optional)
slideWindow: true, each cache read refreshes the TTL, keeping popular data cached longerConfiguration Options
Tool-Level Cache Options
true- Use plugin’s default TTL{ ttl, slideWindow }- Custom configuration
defaultTTL.Examples:60- 1 minute300- 5 minutes3600- 1 hour86400- 1 day
true, reading from cache refreshes the TTL
Use cases:- Trending/popular data
- Frequently accessed reports
- User dashboards
Common Patterns
Pattern 1: Fast-Changing Data (Short TTL)
Pattern 1: Fast-Changing Data (Short TTL)
Pattern 2: Expensive Reports (Long TTL)
Pattern 2: Expensive Reports (Long TTL)
Pattern 3: Hot Data with Sliding Window
Pattern 3: Hot Data with Sliding Window
Pattern 4: Multi-Tenant Isolation
Pattern 4: Multi-Tenant Isolation
Memory vs Redis
When to Use Memory Cache
Development
Single Instance
Non-Critical Data
Simple Setup
When to Use Redis
Production
Multi-Instance
Persistence
Better Eviction
Troubleshooting
Cache not working
Cache not working
- Tool has
cache: trueorcache: { ... }in metadata - Plugin is registered in app’s
pluginsarray - Redis is running (if using Redis backend)
- No errors in server logs
Stale data being returned
Stale data being returned
Non-deterministic tools being cached
Non-deterministic tools being cached
Best Practices
1. Only Cache Deterministic Tools
1. Only Cache Deterministic Tools
- Database queries by ID
- API calls with stable responses
- Report generation
- Static data lookup
- Tools that return current time/date
- Tools with random output
- Tools with side effects (mutations)
2. Choose Appropriate TTLs
2. Choose Appropriate TTLs
3. Include Scoping Fields
3. Include Scoping Fields
4. Use Redis for Production
4. Use Redis for Production
- Persistence across restarts
- Sharing across instances
- Better memory management
- Monitoring and debugging tools
5. Monitor Cache Performance
5. Monitor Cache Performance
- High miss rates (TTL too short? Tool not deterministic?)
- Memory growth (TTL too long?)