Startup tax is everything Claude Code loads before you type: the cost of a fresh session that you pay again every time you start one.
| Surface | When loaded | Notes |
|---|---|---|
| System prompt | Session start | Core behavior, tool-use instructions |
Project-root CLAUDE.md | Session start | Re-injected from disk after compaction |
Auto memory (MEMORY.md) | Session start | First 200 lines or 25KB, whichever smaller |
| MCP tool names | Session start | Full schemas deferred by default |
| Skill descriptions | Session start | One-line index; bodies load on invocation |
Output style / --append-system-prompt | Session start | Both enter the system prompt |
How to keep it lean
The tax is continuous because CLAUDE.md competes with your task on every turn of the agentic loop. Keep it universal-only: under 300 lines, production target under 60. Include only what the agent cannot infer.
- Set
disable-model-invocation: trueon skills you invoke manually so descriptions stay out of the startup index until you run/skill-name. - Disconnect unused MCP servers instead of leaving their names in startup context.
- Run
/contextfor the live breakdown;/memoryto see which files loaded at startup.
Full map: How Claude Code’s agentic loop fills your context window.