Skip to content

Why Your Context Window Is Half Full Before You Type

Sessions compacting sooner, odd tool choices, a model that got worse after you set it up properly. Often the cause is ~95K tokens of preamble you never chose. Here is the audit.

August 1, 202610 min readShift The Culture

Your sessions compact sooner than they used to, the agent forgets things it knew an hour ago, and your token bill climbs while your output does not. The usual explanation is “long conversations.” Often the real answer is that a large fraction of the window was already spent before you typed the first character — on skill descriptions, memory-file imports, and tool definitions from servers you installed months ago and never used. Here is how to measure it, and what to cut.

The part of the window you never see

Three things get injected ahead of your first message, every session, whether or not you use them:

  • Skill names and descriptions.A skill's body is loaded on demand — that is the whole design, and it is a good one. But the name and description must be present in the system prompt at all times, because that is how the model knows the skill exists. Install a few hundred skills and you have permanently mortgaged part of every future session.
  • Memory files and everything they import. Your CLAUDE.md or AGENTS.md loads in full — and so does every file its @import lines pull in, transitively. A 900-byte CLAUDE.md that imports four rule files is not a 900-byte CLAUDE.md.
  • MCP tool definitions. Every connected server contributes a name, a description, and a full JSON schema per tool. A server with twenty tools is twenty schemas in your context on every request, used or not.
Skills are cheap to install and permanently expensive to keep. Nothing in the interface tells you which of them you are still paying for.

Real numbers from a real machine

This is the accounting from the laptop this site is built on — an unusually heavy setup, deliberately, because we install things to review them. It is not a horror story about someone else:

context_budget — cost before a single character is typed
# Context budget

**~95,316 estimated tokens always loaded.**
For scale: ~47.7% of a 200K window, ~9.5% of a 1M window.

| Source                                       | Count |  Est. tokens |
|----------------------------------------------|------:|-------------:|
| Skill descriptions                           | 1,767 |       92,884 |
| Memory files (CLAUDE.md/AGENTS.md + imports) |     3 |        2,432 |
| MCP servers configured                       |    10 | not measured |
| **Total measurable**                         |       |   **95,316** |

> **79 duplicate skill names** are costing ~9,435 tokens.

Two things stand out. First, the average skill description costs about fifty tokens — trivial individually, which is exactly why nobody counts them, and 92,884 tokens in aggregate. Second, roughly ten thousand of those tokens are pure waste: the same skill installed twice under two names, because one copy came from the author and one came bundled inside somebody's collection. agent-browser was present three times, from three publishers.

The symptoms, and why they get misdiagnosed

  • “It compacts too early.” Compaction triggers on total window pressure. If half the window is preamble, your conversation gets half the runway — so the agent starts losing the thread of a task that used to fit comfortably.
  • “It picks weird tools.” More available tools means more plausible wrong choices. Twelve servers offering overlapping ways to read a file is a selection problem you created.
  • “It got dumber after I set it up properly.” This is the one people report and nobody explains. An afternoon of installing everything recommended is an afternoon spent filling the window with manuals for tools you will never call.

The misdiagnosis is always the same: people blame the model, switch models, and get the same behavior, because the cost travels with the configuration rather than with the provider.

Measure it in two minutes

You cannot cut what you have not counted. These give you the shape of the problem with nothing installed — roughly four characters per token is close enough to decide with.

Terminal — the two-minute audit
# 1. how many skills are always announcing themselves?
$ ls ~/.claude/skills | wc -l
    1774

# 2. how many are the same skill under a different publisher prefix?
$ ls ~/.claude/skills | sed 's/.*__//' | sort | uniq -d | wc -l
      68
$ ls ~/.claude/skills | sed 's/.*__//' | sort | uniq -d | head -5
agent-browser
art-master
boneyard
career-ops
clone-website

# 3. what does your memory file really weigh, imports included?
$ wc -c ~/.claude/CLAUDE.md
     903 /Users/you/.claude/CLAUDE.md
$ grep -h '^@' ~/.claude/CLAUDE.md          # every import is another file
$ grep -rl '^@' ~/.claude/*.md | xargs wc -c | tail -1

# 4. what servers are actually connected?
$ claude mcp list

Step 2 is the highest-yield line in this article. The sed 's/.*__//' strips publisher prefixes, so dotenv and rohitg00__dotenv collapse to one name and show up as a duplicate. That crude version found 68 on this machine; a proper accounting that matches on content rather than name found 79. Either way it is thousands of tokens you get back for a fewrm -rf commands and no lost capability.

For a full accounting — including what each skill costs individually and what your @import lines silently pull in — we wrote whats-loaded-mcp, free and MIT, because we needed the number and nothing produced it:

Terminal — install the accounting
$ claude mcp add --scope user whats-loaded -- npx -y whats-loaded-mcp

What to cut, in the order that pays

  1. Duplicates. Free money, zero capability lost. Keep the copy from the original author, delete the bundled clones. Do this first because it requires no judgment.
  2. Skills you installed to try.Be honest about the difference between “I might want this” and “I used this in the last month.” A skill you have never invoked has cost you its description on every session since you installed it. Uninstalling is one command and reinstalling is one command.
  3. MCP servers scoped too broadly. A server registered at user scope loads everywhere. Most belong to one project. Register those at project scope so the schemas only appear where they are useful:
    Terminal — scope, don't globalize
    # everywhere (use sparingly)
    $ claude mcp add --scope user  whats-running -- npx -y whats-running-mcp
    
    # only in this project
    $ claude mcp add --scope local db-tools -- npx -y some-db-mcp
    
    $ claude mcp list
  4. Memory-file bloat. Open your CLAUDE.md and delete anything the model can discover on its own. Directory listings, dependency lists, and restatements of the README are pure cost. Keep decisions, constraints, and things that are true but not visible in the code. Our full argument for that is in how to write a CLAUDE.md that actually gets followed.
  5. Then re-measure. Not optional. The whole failure mode of this problem is that it is invisible; if you do not re-run the count you will not know whether the afternoon was worth it, and the setup will drift straight back.

The part that actually bites: drift

Every configuration is correct on the day it is set up. Then you install one thing, and another, and six months later you are back where you started with no single moment where anything went wrong. This is the same failure we see everywhere in agent operations — the individual asset is always fine, and the set is what rots.

The countermeasure is a number you check on a schedule rather than a cleanup you do when annoyed. Once a month, run the count. If the preamble has grown and your work has not changed, cut back to where it was. Ten minutes, and the window stays yours.

Honest limits

Character-count estimates are estimates. Tokenizers do not split on four characters, and different models tokenize differently — treat every number here as a ratio, useful for deciding what to cut and useless as a billing figure. If you need exact accounting, read your provider's usage reporting.

Trimming also has a floor. Some of that preamble is doing real work: the memory file that stops the agent from re-litigating a decision every session earns its tokens many times over. The goal is not a minimal configuration, it is a configuration where every always-loaded token is one you would deliberately pay for. Most people have never made that choice once.

And a bigger window is not a fix. Going from 200K to 1M turns a 48% preamble into a 9.5% preamble, which is a genuine improvement — and it also removes the pressure that would have made you notice. The bloat is still there, still adding distractors to every tool choice.

The bottom line

Count what loads before you type. Delete the duplicates, uninstall what you have not used in a month, scope MCP servers to the projects that need them, and cut your memory file down to things the model could not have worked out itself. Then re-measure, and put a monthly reminder on it, because this is a drift problem rather than a one-time cleanup.

The counter is free and MIT: whats-loaded-mcp. It sits alongside whats-running-mcp for live machine state on our agent tools page, with the Agent Fleet Ops Kit ($29) for people running several agents on one machine. Related: the MCP servers we actually run and running multiple coding agents on one machine.

SharePost on X
Free · 13 pages · no upsell inside

Get the Operator Field Kit — free

Six production prompts, the five-step operator setup, and nine rules from our own failure log.

  • 6 complete prompts — printed in full, not previews
  • The five-step setup, each step with a pass/fail test
  • 9 rules from the failure log that produced them

The kit, then the occasional operator note. One click unsubscribes and we never sell the address.

Keep reading