Claude CodeServices
Services
20+ servicesClaude Code's service layer handles compaction, MCP integration, LSP, analytics, memory extraction, and more. These run as background processes alongside the main query loop.
Service Overview
Compaction
13 files · ~15K
4-level context window management
MCP
25 files · 470KB
External tool integration (4 transports)
LSP
6 files · ~5K
Language Server Protocol
Analytics
6 files · ~8K
Datadog + GrowthBook pipeline
Memory
5 files · ~6K
Auto-extraction + session memory
Tools
2 files · ~1K
StreamingToolExecutor + orchestration
Plugins
8 files · ~10K
Plugin install + marketplace
Tokens
1 files · ~2K
Multi-provider token counting
Compaction System
Multi-level context window management keeps conversations within token limits. The system uses 4 strategies with increasing aggressiveness:
// Token budget calculation:
effective_window = model_context (e.g., 200K for opus)
- max_output_tokens (e.g., 16K)
- reserved_for_summary (20K)
= ~164K effective
autocompact_threshold = effective_window - 13K buffer
// Strategy 1: Microcompact (every API call)
→ Single-turn compression inline
→ Cached, no API call needed
→ Compresses tool results if unchanged
// Strategy 2: Autocompact (threshold trigger)
→ Full conversation summary via forked agent
→ Replaces old messages with summary + preserved tail
→ Marks boundary message with summary metrics
→ Circuit breaker: max 3 consecutive failures
// Strategy 3: History Snipping (feature-gated)
→ Removes oldest messages below threshold
→ Less aggressive than autocompact
// Strategy 4: Context Collapse (experimental)
→ Incremental context reduction
→ Builds collapse store separately
→ Projected at read-time (non-destructive)MCP (Model Context Protocol)
The MCP service is the largest service at 470KB across 25 files. It enables Claude Code to integrate external tools from any MCP-compatible server.
// MCP client supports 4 transport types:
1. stdio → Local process communication
2. SSE → Server-Sent Events (HTTP streaming)
3. HTTP → Standard HTTP requests
4. WebSocket → Full-duplex communication
// How MCP tools work:
1. MCP server exposes tools via JSON schema
2. mcpClient.ts patches MCPTool definition at runtime:
- Sets real tool name (e.g., "mcp_weather_get_current")
- Injects actual input/output schemas
- Wires up call() to invoke MCP server RPC
3. MCPTool uses passthrough schema (z.object({}).passthrough())
4. No validation at Claude Code layer — MCP server is responsible
// Key files:
client.ts — 119KB — Protocol client orchestrator
config.ts — 51KB — Settings, env vars, server validation
auth.ts — 88KB — OAuth flow, token management
elicitationHandler.ts — User prompts during tool callsLSP (Language Server Protocol)
// LSP provides IDE-like features:
- Diagnostics (errors, warnings)
- Hover information
- Go-to-definition
- Code completions
// Architecture:
LSPServerManager (singleton)
└─ LSPServerInstance[] (per language/framework)
└─ LSPClient (protocol implementation)
└─ LSPDiagnosticRegistry (collects diagnostics)
// Lifecycle:
initializeLspServerManager() → Async init with generation counter
getLspServerManager() → Get active manager (undefined if not ready)
getInitializationStatus() → not-started | pending | success | failed
// Integration with tools:
FileEditTool → Notifies LSP of file changes → Triggers diagnostics
FileWriteTool → Same notification path
LSPTool → Direct query interface for the modelAnalytics Pipeline
// Event pipeline with queue-until-sink pattern:
logEvent(name, metadata) → Sync event logging
logEventAsync(name, metadata) → Async event logging
attachAnalyticsSink() → Register backend (Datadog, 1P)
// Safety type:
AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
// → Enforces: no file content, no user code in analytics
// PII handling:
_PROTO_* keys → PII-tagged columns (Anthropic 1P only)
stripProtoFields() → Removes PII before Datadog fanout
// GrowthBook integration (feature gates):
checkStatsigFeatureGate_CACHED_MAY_BE_STALE()
// → Cached gate values prevent blocking on init
// → User attributes: ID, session, platform, org, subscription
// → A/B experiment tracking with variation IDsTool Orchestration Service
// services/tools/ — Two key files:
// 1. toolOrchestration.ts (189 lines) — runTools() generator
// Batch partitioning and serial/concurrent execution
// Read-only batch → up to 10 parallel
// Write batch → serial with context modifiers
// 2. StreamingToolExecutor.ts (226 lines)
// Concurrent execution while model streams
// addTool() → enqueue as tool_use blocks arrive
// processQueue() → respect concurrency constraints
// getCompletedResults() → yield finished results
// discard() → cleanup on streaming fallback