Skip to main content
Glama
OPTIMIZATIONS.md13.9 kB
# Meraki MCP Optimizations ## What Was Optimized The dynamic MCP (`meraki-mcp-dynamic.py`) now includes several performance and safety optimizations. ## 1. Response Caching System **Problem:** Repeatedly calling the same read-only operations wastes API quota and Claude messages. **Solution:** Automatic caching of all read-only operations (GET/list methods). ### How It Works: - Read-only responses are cached for 5 minutes (configurable) - Cache key based on method + parameters (same query = same cache entry) - Cached responses include `"_from_cache": true` indicator - Cache automatically expires after TTL - No caching for write operations (always fresh) ### Benefits: - ✅ Reduces Meraki API calls (avoids rate limits) - ✅ Faster responses for repeated queries - ✅ Saves Claude message quota - ✅ Reduces load on Meraki infrastructure ### Configuration: ```bash # In .env file ENABLE_CACHING=true # Enable/disable caching CACHE_TTL_SECONDS=300 # 5 minutes (adjust as needed) ``` ### Example: ``` # First call - hits Meraki API You: "Show me my networks" Response: [networks data] # Second call within 5 minutes - from cache You: "Show me my networks" Response: [networks data] with "_from_cache": true # After 5 minutes - fresh API call You: "Show me my networks" Response: [fresh networks data] ``` ### Cache Management Tools: ```bash # Check cache statistics cache_stats # Clear cache manually cache_clear ``` ## 2. Read-Only Safety Mode **Problem:** Easy to accidentally run destructive operations while exploring. **Solution:** Optional read-only mode that blocks all write operations. ### How It Works: - Detects write operations (create, update, delete, remove, reboot, etc.) - If `READ_ONLY_MODE=true`, blocks write operations with clear error - Read operations work normally - Can be toggled anytime via .env file ### Benefits: - ✅ Safe exploration of production environments - ✅ Prevents accidental changes - ✅ Great for learning/training - ✅ Audit-friendly (only read access) ### Configuration: ```bash # In .env file READ_ONLY_MODE=false # Default: allow all operations READ_ONLY_MODE=true # Block write operations ``` ### Example: ``` # With READ_ONLY_MODE=true You: "Get my networks" Response: [networks data] ✅ Works You: "Delete network L_12345" Response: { "error": "Write operation blocked - READ_ONLY_MODE is enabled", "hint": "Set READ_ONLY_MODE=false in .env to enable write operations" } ❌ Blocked ``` ## 3. Enhanced Error Handling **Problem:** API failures and rate limits cause errors. **Solution:** Built-in retry logic and rate limit handling. ### How It Works: ```python dashboard = meraki.DashboardAPI( api_key=MERAKI_API_KEY, suppress_logging=True, maximum_retries=3, # Auto-retry failed requests wait_on_rate_limit=True # Auto-wait when rate limited ) ``` ### Benefits: - ✅ Automatic retry on transient failures (3 attempts) - ✅ Intelligent backoff on rate limits - ✅ No manual error handling needed - ✅ More reliable operations ### Example: ``` # Without retry API call fails → Error immediately # With retry (automatic) API call fails → Retry #1 → Retry #2 → Success ✅ # With rate limit handling Hit rate limit → Auto-wait 1 second → Retry → Success ✅ ``` ## 4. Enhanced Error Handling **Problem:** API failures and rate limits cause errors. **Solution:** Built-in retry logic and rate limit handling. ### How It Works: - Tools labeled as `[READ]`, `[WRITE]`, or `[MISC]` - Visible in tool descriptions - Easy to identify safe vs. risky operations ### Example: ``` [ORGANIZATIONS] [READ] getOrganizationAdmins [NETWORKS] [WRITE] deleteNetwork [DEVICES] [WRITE] rebootDevice [WIRELESS] [READ] getNetworkWirelessSsids ``` ## 5. Response Size Management & File Caching **Problem:** Large API responses (e.g., VPN status with 300 items) fill up Claude's context window quickly, causing performance issues and context overflow. **Solution:** Automatic response size monitoring, pagination enforcement, and file-based caching for large responses. ### How It Works: - **Token Estimation:** Automatically estimates response size in tokens - **Pagination Limits:** Enforces maximum items per page (default: 100) - **File Caching:** Large responses saved to JSON files automatically - **Truncated Responses:** Returns preview with metadata about cached full data - **Cache Management:** Tools to list, retrieve, and clear cached files ### Benefits: - ✅ Prevents context window overflow - ✅ Faster Claude responses (smaller payloads) - ✅ Full data preserved in files for analysis - ✅ Automatic pagination control - ✅ Works with grep/jq/ack for file parsing ### Configuration: ```bash # In .env file ENABLE_FILE_CACHING=true # Enable file caching (default: true) MAX_RESPONSE_TOKENS=5000 # Max tokens before truncation (default: 5000) MAX_PER_PAGE=100 # Max items per page (default: 100) RESPONSE_CACHE_DIR=.meraki_cache # Cache directory (default: .meraki_cache) ``` ### Example - Large Response: ``` # Request with large result set call_meraki_api( section="appliance", method="getOrganizationApplianceVpnStatuses", parameters={"organizationId": "426512", "perPage": 300} ) # Automatic handling: 1. perPage reduced from 300 → 100 (enforced limit) 2. Response ~25k tokens detected 3. Full response saved to: .meraki_cache/appliance_getOrganizationApplianceVpnStatuses_a1b2c3d4_20250119_143022.json 4. Truncated response returned: { "_response_truncated": true, "_reason": "Response too large (~25100 tokens)", "_full_response_cached": ".meraki_cache/appliance_getOrganizationApplianceVpnStatuses_a1b2c3d4_20250119_143022.json", "_total_items": 250, "_showing": "preview", "_preview": [ // First 3 items shown... ], "_hints": { "reduce_page_size": "Reduce request: Use perPage parameter with value <= 100", "access_via_mcp_paginated": "get_cached_response(filepath='...', offset=0, limit=10) - Returns 10 items at a time", "access_via_cli_full": "cat ... | jq '.data' - View all data", "search_via_cli": "cat ... | jq '.data[] | select(.field == \"value\")' - Search/filter", "count_via_cli": "cat ... | jq '.data | length' - Count items", "recommendation": "For large datasets, command-line tools (jq, grep) are recommended over MCP tools" }, "_pagination_limited": true, "_pagination_message": "Request modified: pagination limited to 100 items per page" } ``` ### File Cache Management Tools: ```bash # List all cached response files list_cached_responses Response: { "cache_dir": ".meraki_cache", "total_files": 5, "files": [ { "filename": "appliance_getOrganizationApplianceVpnStatuses_a1b2c3d4_20250119_143022.json", "filepath": ".meraki_cache/appliance_getOrganizationApplianceVpnStatuses_a1b2c3d4_20250119_143022.json", "size_bytes": 524288, "size_kb": 512.0, "modified": "2025-01-19T14:30:22" } ] } # Retrieve cached response (paginated to avoid context overflow) get_cached_response( filepath=".meraki_cache/appliance_getOrganizationApplianceVpnStatuses_a1b2c3d4_20250119_143022.json", offset=0, limit=10 ) Response: { "_paginated": true, "_total_items": 250, "_offset": 0, "_limit": 10, "_returned_items": 10, "_has_more": true, "_next_offset": 10, "_hints": { "next_page": "get_cached_response(filepath='...', offset=10, limit=10)", "full_data_cli": "cat ... | jq '.data'", ... }, "data": [/* 10 items */] } # Get next page get_cached_response(filepath="...", offset=10, limit=10) # Clear old cached files (older than 24 hours) clear_cached_files(older_than_hours=24) Response: { "deleted_count": 3, "kept_count": 2, "deleted_files": [...] } ``` ### Using Cached Files with Command-Line Tools (Recommended): **Why CLI tools are better for large datasets:** - No context window limitations - Faster processing - More powerful querying (jq, grep, awk) - Can pipe to other tools ```bash # Parse with jq cat .meraki_cache/appliance_getOrganizationApplianceVpnStatuses_*.json | jq '.data[].deviceStatus' # Search with grep grep -r "online" .meraki_cache/ # Count items with jq cat .meraki_cache/appliance_*.json | jq '.data | length' # Extract specific fields cat .meraki_cache/appliance_*.json | jq '.data[] | {serial: .deviceSerial, status: .deviceStatus}' # Filter by condition cat .meraki_cache/appliance_*.json | jq '.data[] | select(.vpnMode == "spoke")' # Get specific indices (like pagination) cat .meraki_cache/appliance_*.json | jq '.data[10:20]' # Items 10-20 ``` **MCP Pagination (Alternative for small queries):** ```bash # Use get_cached_response with pagination for interactive exploration # Good for: Spot checks, exploring structure, small samples # Not recommended for: Processing full datasets, complex filtering get_cached_response(filepath="...", offset=0, limit=10) # First 10 get_cached_response(filepath="...", offset=10, limit=10) # Next 10 ``` ### Adjusting Response Size Limits: ```bash # More aggressive truncation (smaller context) MAX_RESPONSE_TOKENS=2000 # Truncate at ~2k tokens # Less aggressive (larger responses allowed) MAX_RESPONSE_TOKENS=10000 # Allow up to ~10k tokens # Disable file caching (return all data) ENABLE_FILE_CACHING=false # Not recommended for large datasets ``` ### Pagination Control: ```bash # Stricter pagination limit MAX_PER_PAGE=50 # Limit to 50 items per page # More relaxed (use with caution) MAX_PER_PAGE=200 # Allow up to 200 items (may cause context issues) ``` ### Real-World Impact: **Before Response Size Management:** ``` # Request: getOrganizationApplianceVpnStatuses with perPage=300 → Returns 25k token response → Fills up Claude's context window → Performance degradation → Risk of context overflow errors ``` **After Response Size Management:** ``` # Same request → Automatically reduced to perPage=100 → Response saved to file (512 KB) → Returns 3-item preview (~500 tokens) → Claude context preserved → Full data accessible via file or get_cached_response ``` **Token Savings:** ~95% reduction in context usage (25k → ~500 tokens) ## 6. Configuration Visibility **Problem:** Hard to know current MCP settings. **Solution:** New `get_mcp_config` tool shows all settings. ### Example: ``` get_mcp_config Response: { "read_only_mode": false, "caching_enabled": true, "cache_ttl_seconds": 300, "file_caching_enabled": true, "max_response_tokens": 5000, "max_per_page": 100, "response_cache_dir": ".meraki_cache", "organization_id_configured": true, "api_key_configured": true, "total_tools": 804, "sdk_sections": ["organizations", "networks", ...] } ``` ## Performance Impact ### Before Optimizations: - Every query = API call - No retry on failures - No protection against accidental changes - Manual rate limit management ### After Optimizations: - **50-90% fewer API calls** (depends on query patterns) - **Faster responses** for cached data (instant vs. 200-500ms) - **Automatic retry** on failures - **Automatic rate limit handling** - **Safety mode** for exploration ## Real-World Scenarios ### Scenario 1: Monitoring Dashboard ``` # Check network status every minute While caching is enabled: - 1st check: API call - Next 4 minutes: Cached (4 API calls saved) - 6th minute: Fresh API call Result: 83% fewer API calls ``` ### Scenario 2: Learning/Training ``` # Enable read-only mode READ_ONLY_MODE=true # Students can explore safely - View all configurations ✅ - Learn API structure ✅ - Cannot make changes ❌ (blocked) Result: Zero risk of accidental changes ``` ### Scenario 3: Bulk Operations ``` # Automatic retry + rate limiting - Update 100 devices - Some fail transiently → Auto-retry ✅ - Hit rate limit → Auto-wait ✅ - All succeed without manual intervention Result: Reliable bulk operations ``` ## Configuration Best Practices ### Development/Learning: ```bash ENABLE_CACHING=true CACHE_TTL_SECONDS=300 READ_ONLY_MODE=true # Safe exploration ``` ### Production Monitoring: ```bash ENABLE_CACHING=true CACHE_TTL_SECONDS=60 # Shorter for fresher data READ_ONLY_MODE=false ``` ### Production Changes: ```bash ENABLE_CACHING=false # Always fresh data for changes CACHE_TTL_SECONDS=0 READ_ONLY_MODE=false ``` ### Quick Status Checks: ```bash ENABLE_CACHING=true CACHE_TTL_SECONDS=600 # 10 minutes, less frequent updates READ_ONLY_MODE=true ``` ## Backward Compatibility All optimizations are: - ✅ **Opt-in** via configuration - ✅ **Backward compatible** (defaults match old behavior) - ✅ **Non-breaking** (existing workflows unchanged) - ✅ **Configurable** (adjust to your needs) ## Testing the Optimizations ### Test Caching: ``` # Run twice within 5 minutes 1. Use getOrganizations 2. Use getOrganizations again # Second response should include "_from_cache": true ``` ### Test Read-Only Mode: ``` # Set READ_ONLY_MODE=true in .env # Restart Claude Desktop 1. Use getOrganizations → ✅ Works 2. Use deleteNetwork with networkId="test" → ❌ Blocked ``` ### Test Auto-Retry: ``` # Automatic - just use any tool # If transient failure occurs, it will auto-retry # You'll see success without manual intervention ``` ### Check Configuration: ``` Use get_mcp_config to see all settings ``` ## Summary These optimizations make the MCP: - **Faster** - Caching reduces latency and API calls - **More reliable** - Auto-retry and rate limit handling - **Safer** - Read-only mode prevents accidents - **Context-efficient** - Response size management prevents context overflow - **Smarter** - Automatic operation type detection and pagination control - **Transparent** - Config tool shows all settings - **Flexible** - File caching enables external tool integration (jq, grep, ack) All while maintaining 100% backward compatibility!

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/MKutka/meraki-magic-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server