MCP Utility Tools
A collection of utility tools for the Model Context Protocol (MCP) that provide caching, retry logic, batch operations, and rate limiting capabilities to enhance any MCP-based workflow.
Features
- π Retry with Exponential Backoff - Automatically retry failed operations with configurable delays
- πΎ TTL-based Caching - Cache expensive operations with automatic expiration
- π Batch Operations - Process multiple operations in parallel with concurrency control
- π¦ Rate Limiting - Prevent API abuse with sliding window rate limiting
- π Full TypeScript Support - Type-safe with comprehensive TypeScript definitions
Installation
npm install mcp-utility-tools
# or with yarn
yarn add mcp-utility-tools
# or with bun
bun add mcp-utility-tools
Quick Start
1. Add to Claude Desktop
Add the utility tools to your Claude Desktop configuration:
{
"mcpServers": {
"utility-tools": {
"command": "npx",
"args": ["mcp-utility-tools"]
}
}
}
2. Use with Claude
Once configured, Claude can use these tools to enhance any workflow:
# Check cache before expensive operation
cache_result = mcp_cache_get(key="api-response", namespace="github")
if not cache_result["found"]:
# Fetch data with retry
response = fetch_with_retry("https://api.github.com/user/repos")
# Cache for 5 minutes
mcp_cache_put(
key="api-response",
value=response,
ttl_seconds=300,
namespace="github"
)
Available Tools
π retry_operation
Retry operations with exponential backoff and jitter.
{
"tool": "retry_operation",
"arguments": {
"operation_id": "unique-operation-id",
"operation_type": "http_request",
"operation_data": {
"url": "https://api.example.com/data",
"method": "GET"
},
"max_retries": 3,
"initial_delay_ms": 1000
}
}
Features:
- Tracks retry attempts across multiple calls
- Exponential backoff with configurable delays
- Optional jitter to prevent thundering herd
- Prevents duplicate retries for successful operations
πΎ Cache Operations
cache_get
Retrieve values from cache with TTL support.
{
"tool": "cache_get",
"arguments": {
"key": "user-data-123",
"namespace": "users"
}
}
cache_put
Store values with automatic expiration.
{
"tool": "cache_put",
"arguments": {
"key": "user-data-123",
"value": { "name": "John", "role": "admin" },
"ttl_seconds": 300,
"namespace": "users"
}
}
Features:
- Namespace support to prevent key collisions
- Automatic cleanup of expired entries
- Configurable TTL (1 second to 24 hours)
- Memory-efficient storage
π batch_operation
Process multiple operations with controlled concurrency.
{
"tool": "batch_operation",
"arguments": {
"operations": [
{ "id": "op1", "type": "fetch", "data": { "url": "/api/1" } },
{ "id": "op2", "type": "fetch", "data": { "url": "/api/2" } },
{ "id": "op3", "type": "fetch", "data": { "url": "/api/3" } }
],
"concurrency": 2,
"timeout_ms": 5000,
"continue_on_error": true,
"use_cache": true
}
}
Features:
- Configurable concurrency (1-20 operations)
- Per-operation timeout
- Continue or fail-fast on errors
- Optional result caching
- Maintains order of results
π¦ rate_limit_check
Implement sliding window rate limiting.
{
"tool": "rate_limit_check",
"arguments": {
"resource": "api.github.com",
"max_requests": 60,
"window_seconds": 60,
"increment": true
}
}
Features:
- Per-resource tracking
- Sliding window algorithm
- Automatic reset after time window
- Check without incrementing option
Integration Examples
With GitHub MCP Server
// Cache GitHub API responses
async function getRepositoryWithCache(owner: string, repo: string) {
const cacheKey = `github:${owner}/${repo}`;
// Check cache first
const cached = await mcp_cache_get({
key: cacheKey,
namespace: "github"
});
if (cached.found) {
return cached.value;
}
// Fetch with retry
const data = await retryableGitHubCall(owner, repo);
// Cache for 10 minutes
await mcp_cache_put({
key: cacheKey,
value: data,
ttl_seconds: 600,
namespace: "github"
});
return data;
}
With Slack MCP Server
// Rate-limited Slack notifications
async function sendSlackNotifications(messages: string[], channel: string) {
for (const message of messages) {
// Check rate limit
const canSend = await mcp_rate_limit_check({
resource: `slack:${channel}`,
max_requests: 10,
window_seconds: 60,
increment: true
});
if (!canSend.allowed) {
console.log(`Rate limited. Retry in ${canSend.reset_in_seconds}s`);
await sleep(canSend.reset_in_seconds * 1000);
}
await mcp_slack_post_message({
channel_id: channel,
text: message
});
}
}
Architecture
βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ
β β β β β β
β Claude/Client ββββββΆβ MCP Utility ToolsββββββΆβ Cache Storage β
β β β β β (In-Memory) β
βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ
β β
β β
βΌ βΌ
βββββββββββββββββββ ββββββββββββββββββββ
β Other MCP β β Retry/Rate β
β Servers β β Limit Tracking β
βββββββββββββββββββ ββββββββββββββββββββ
Development
# Clone the repository
git clone https://github.com/haasonsaas/mcp-utility-tools.git
cd mcp-utility-tools
# Install dependencies
npm install
# Build the project
npm run build
# Run tests
npm test
# Run in development mode
npm run dev
Testing
Run the comprehensive test suite:
# Unit tests
npm test
# Integration tests with test harness
npm run test:integration
# Test with MCP Inspector
npx @modelcontextprotocol/inspector build/index-v2.js
Contributing
We welcome contributions! Please see our Contributing Guide for details.
Areas for Contribution
- π Storage Backends: Add Redis, SQLite support
- π§ New Tools: Circuit breakers, request deduplication
- π Metrics: Add performance tracking and analytics
- π Examples: More integration examples with other MCP servers
License
MIT Β© Jonathan Haas
Acknowledgments
Built on top of the Model Context Protocol SDK by Anthropic.
Made with β€οΈ for the MCP community