{"slug": "how-to-kill-the-bloat-in-claude-code-s-system-prompt", "title": "How to Kill the Bloat in Claude Code's System Prompt", "summary": "Claude Code's system prompt includes unnecessary tool definitions and instructions that inflate token usage on every request. Users can reduce payload size by disabling bundled skills, removing individual tools via deny rules, and measuring context with the /context command. This can save tens of thousands of tokens per turn.", "body_md": "# How To Kill The Bloat In Claude Code's System Prompt\n\nEvery message you send Claude Code ships a payload you never see. Not your prompt — the machinery around it: tool definitions, a skills catalogue, system instructions for features you may never touch. It goes out on every request, and you're billed for it every turn.\n\nYou can remove most of it. The six steps below show how to see what your requests actually contain, then trim it with two settings Claude Code already has. Mine dropped by tens of thousands of tokens per turn.\n\n[1. Measure your context with ](#1-measure-your-context-with-context)`/context`\n\n`/context`\n\nType `/context`\n\nin any Claude Code session. It breaks your context window down by category — system prompt, system tools, MCP tools, memory files, messages — each with a token count and its share of the window.\n\nNote the numbers now, before changing anything. You'll compare against them in the last step.\n\n`/context`\n\nshows the tools as a group. It won't tell you which individual tool is largest — it reports one \"tools\" number, not a ranking. The next step fixes that.\n\n[2. Find the biggest offenders with a logging proxy](#2-find-the-biggest-offenders-with-a-logging-proxy)\n\nClaude Code talks to the Anthropic API over HTTP, so you can put a proxy in between that forwards each request untouched, streams the reply straight back, and records what went past. The CLI doesn't notice.\n\nGrab [ proxy.mjs](https://gist.github.com/mattpocock/5b3d76ea21f5f698aefded47a9cea3b1) — one file, no dependencies, Node built-ins only. Run it:\n\n```\nnode proxy.mjs\n```\n\nPoint Claude Code at it in another terminal and send a message:\n\n```\nANTHROPIC_BASE_URL=http://localhost:8787 claude\n```\n\nEach request is written to `./logs/`\n\nas readable Markdown, and a ranked table prints to the terminal:\n\n```\n[agent-proxy] 69 tools · 154,946 tool bytes · 65,538 real input tokens\n  Workflow      21229 B  ~5307 tok\n  DesignSync     8978 B  ~2245 tok\n  Monitor        7767 B  ~1942 tok\n  …\n```\n\nOpen the Markdown file and read it: every tool's full schema, the system prompt, the message history — the whole request as the model receives it. The ranked table at the top is your list to work from, so you can remove the exact tools you don't use rather than guess.\n\nNow you know what's in the payload and which parts are largest. The next two steps remove it. Both settings live in your settings file — `~/.claude/settings.json`\n\nfor every project, or `.claude/settings.json`\n\nfor one.\n\n[3. Switch off whole features with ](#3-switch-off-whole-features-with-disable-flags)`disable*`\n\nflags\n\n`disable*`\n\nflagsSome features bring a whole cluster of tools and instructions with them. A single flag turns the feature off along with everything it carries:\n\n`disableBundledSkills`\n\n— removes all of Anthropic's bundled skills at once (the`dataviz`\n\n,`review`\n\n,`init`\n\ncatalogue), while leaving their slash commands typable.`disableWorkflows`\n\n— removes the multi-agent`Workflow`\n\ntool, the largest single line in the table.\n\nUse one whenever a whole feature isn't earning its place.\n\n[4. Remove individual tools with ](#4-remove-individual-tools-with-deny-rules)`deny`\n\nrules\n\n`deny`\n\nrulesFor individual tools, a `permissions.deny`\n\nrule with a bare tool name removes that tool's definition from the payload — Claude never sees it:\n\n```\n{\n  \"permissions\": {\n    \"deny\": [\"NotebookEdit\", \"CronCreate\"]\n  }\n}\n```\n\nOne detail worth knowing: a bare name (`\"NotebookEdit\"`\n\n) removes the tool. A scoped rule (`\"Bash(rm *)\"`\n\n, `\"Skill(dataviz)\"`\n\n) blocks the matching call but leaves the definition in the payload. To shrink the request, use bare names.\n\nThe flags in the previous step are the broad first pass; these deny rules pick off the individual tools the flags don't cover.\n\nKeeping some skills but not all?\n\n`disableBundledSkills`\n\nis all-or-nothing. To drop them one at a time, use`skillOverrides`\n\nwith a skill set to`\"off\"`\n\n(removed from the payload) or`\"user-invocable-only\"`\n\n(still typable, but Claude doesn't see it).\n\n[5. Apply the full configuration](#5-apply-the-full-configuration)\n\nHere's what the previous two steps produced — the flags and deny rules that trim the bloat, ready to drop into `~/.claude/settings.json`\n\n:\n\n```\n{\n  \"permissions\": {\n    \"deny\": [\n      \"EnterPlanMode\",\n      \"ExitPlanMode\",\n      \"DesignSync\",\n      \"NotebookEdit\",\n      \"SendMessage\",\n      \"PushNotification\",\n      \"RemoteTrigger\",\n      \"ReportFindings\",\n      \"ScheduleWakeup\",\n      \"AskUserQuestion\",\n      \"CronCreate\",\n      \"CronDelete\",\n      \"CronList\"\n    ]\n  },\n  \"disableBundledSkills\": true,\n  \"disableWorkflows\": true,\n  \"disableRemoteControl\": true,\n  \"disableClaudeAiConnectors\": true,\n  \"disableArtifact\": true\n}\n```\n\nTreat it as a menu, not a prescription. The reason to see your own payload first is so you cut what you don't use. If you work in plan mode, keep it. If you write notebooks, keep `NotebookEdit`\n\n. The list above is what earned removal for me.\n\nOne caveat: some of what looks like bloat is machinery that background jobs and multi-agent runs rely on — the task tools, `Workflow`\n\n, worktree tools. If you use those, keep them.\n\n[6. Re-measure with ](#6-re-measure-with-context)`/context`\n\n`/context`\n\nRestart Claude Code so it reloads the settings, and run `/context`\n\nagain. The tools count and token total should be lower.\n\nThat difference is the tokens you were sending every turn and now aren't — cheaper requests, and less for the model to read past before it reaches your problem.\n\n## Join over 70,000 Developers Becoming AI Heroes\n\n### Engineering fundamentals are your biggest advantage. Learn how to leverage them and leave vibe coding behind.\n\nI respect your privacy. Unsubscribe at any time.\n\n**Share**", "url": "https://wpnews.pro/news/how-to-kill-the-bloat-in-claude-code-s-system-prompt", "canonical_source": "https://www.aihero.dev/how-to-kill-the-bloat-in-claude-codes-system-prompt", "published_at": "2026-07-09 04:04:55+00:00", "updated_at": "2026-07-09 05:14:13.130662+00:00", "lang": "en", "topics": ["developer-tools", "large-language-models"], "entities": ["Claude Code", "Anthropic"], "alternates": {"html": "https://wpnews.pro/news/how-to-kill-the-bloat-in-claude-code-s-system-prompt", "markdown": "https://wpnews.pro/news/how-to-kill-the-bloat-in-claude-code-s-system-prompt.md", "text": "https://wpnews.pro/news/how-to-kill-the-bloat-in-claude-code-s-system-prompt.txt", "jsonld": "https://wpnews.pro/news/how-to-kill-the-bloat-in-claude-code-s-system-prompt.jsonld"}}