# Task ID: 73 **Title:** Implement In-Memory CacheProvider **Status:** done **Dependencies:** 71 ✓ **Priority:** high **Description:** Create the CacheProvider implementation that stages use for caching expensive computations. Start with in-memory cache for Phase 1, with content-addressed keys. **Details:** Create `src/mcplocal/src/proxymodel/cache-provider.ts`: ```typescript import { createHash } from 'crypto'; import type { CacheProvider } from './types'; export class InMemoryCacheProvider implements CacheProvider { private cache = new Map(); private maxSize: number; private ttlMs: number; constructor(options: { maxSize?: number; ttlMs?: number } = {}) { this.maxSize = options.maxSize ?? 1000; this.ttlMs = options.ttlMs ?? 3600000; // 1 hour default } hash(content: string): string { return createHash('sha256').update(content).digest('hex').slice(0, 16); } async get(key: string): Promise { const entry = this.cache.get(key); if (!entry) return null; if (Date.now() - entry.timestamp > this.ttlMs) { this.cache.delete(key); return null; } return entry.value; } async set(key: string, value: string): Promise { if (this.cache.size >= this.maxSize) this.evictOldest(); this.cache.set(key, { value, timestamp: Date.now() }); } async getOrCompute(key: string, compute: () => Promise): Promise { const cached = await this.get(key); if (cached !== null) return cached; const value = await compute(); await this.set(key, value); return value; } private evictOldest(): void { const oldest = [...this.cache.entries()].sort((a, b) => a[1].timestamp - b[1].timestamp)[0]; if (oldest) this.cache.delete(oldest[0]); } } ``` **Test Strategy:** Unit tests for: hash() produces consistent output, get() returns null for missing keys, set()/get() round-trip works, TTL expiration works, LRU eviction triggers at maxSize, getOrCompute() caches and returns cached values.