CLAUDE LABJP
MEMORY — Claude Code closes a cluster of long-session memory leaks, including MCP stdio stderr piling up to 64 MB per server and LSP documents staying open indefinitelyTABLES — Very large markdown tables no longer stall rendering; tables over 200 rows now show the first 200 with a "… N more rows" noticeSPEED — Sessions carrying many deny/ask permission rules no longer lose seconds every turn: rule matchers are compiled once and cachedTOOLS — print/SDK sessions with many MCP tools get up to 7x faster tool rounds thanks to cached tool-pool assemblyARTIFACTS — Claude Code Artifacts turn session work into live, shareable web pages that update in place — useful for PR walkthroughs and dashboardsDEADLINE — Opus 4.7 fast mode is removed on July 24; speed: "fast" will error, so move to Opus 4.8 fast mode before thenMEMORY — Claude Code closes a cluster of long-session memory leaks, including MCP stdio stderr piling up to 64 MB per server and LSP documents staying open indefinitelyTABLES — Very large markdown tables no longer stall rendering; tables over 200 rows now show the first 200 with a "… N more rows" noticeSPEED — Sessions carrying many deny/ask permission rules no longer lose seconds every turn: rule matchers are compiled once and cachedTOOLS — print/SDK sessions with many MCP tools get up to 7x faster tool rounds thanks to cached tool-pool assemblyARTIFACTS — Claude Code Artifacts turn session work into live, shareable web pages that update in place — useful for PR walkthroughs and dashboardsDEADLINE — Opus 4.7 fast mode is removed on July 24; speed: "fast" will error, so move to Opus 4.8 fast mode before then
Articles/Claude Code
Claude Code/2026-07-17Advanced

The Morning My Table Ended in "… 2,847 more rows" — Separating Render Caps from Token Cost in Tool Output

Claude Code 2.1.209 caps markdown tables at 200 rows plus a remainder count. Only the rendering is capped — the model still receives every row. Here is how to measure the gap and redesign tool output around aggregates.

claude-code129mcp17tool-outputcontext8automation94

Premium Article

I opened the log from an overnight aggregation job I run as an indie developer and found … 2,847 more rows sitting under the table.

That is the Claude Code 2.1.209 rendering fix doing its job. Before it landed, a table that size would stall the terminal and eat memory. It is a welcome change.

Then I kept staring at it and grew uneasy. Two hundred rows reached my eyes. How many reached the model?

The cap is on rendering, not on context

The changelog entry reads: very large markdown tables no longer stall rendering or balloon memory, and tables over 200 rows now display the first 200 rows plus a … N more rows line. What got fixed is the terminal.

The text handed to the model travels a different path. If your MCP server returns a 3,047-row table, all 3,047 rows land in the conversation history. The 200-row cap is a courtesy extended to human eyes, and to human eyes only.

Blurring that distinction has a cost. You see the truncation, feel like things got lighter, and lose the motivation to revisit what your tool returns. In reality, only the reviewer's terminal got lighter. Billing and context consumption did not move an inch — and now the weight is harder to notice, because it stopped showing up on screen.

I was happily relieved the first time I saw the truncation. It took me a few minutes to reconsider, and only because the week before I had been chasing a job whose context filled up faster than my estimates said it should.

Estimate what one table drags in, before you send it

Start with numbers instead of intuition. The byte math is arithmetic you can do in your head.

Measure the real size of the rows your job returns:

# Dump what the MCP tool returns and look at the actual size.
# If the tool has no debug hook, reproduce the same query from the CLI.
wc -c /tmp/daily_rows.md
wc -l /tmp/daily_rows.md
 
# Average bytes per line
awk 'END { printf "avg bytes/line: %.1f\n", (NR ? total/NR : 0) } { total += length($0) + 1 }' /tmp/daily_rows.md

My aggregation rows carry six columns — date, category, hits, ratio, delta, note — and land around 74 bytes per line. At 3,047 rows that is 74 × 3,047 ≈ 225 KB. Add the header and separator and it is still roughly 225 KB.

I do not convert those bytes to tokens with a multiplier. Text with mixed Japanese and ASCII has an awkward byte-to-token ratio, so I hand it to the official count_tokens endpoint instead.

# pip install anthropic
import anthropic
 
client = anthropic.Anthropic(api_key="YOUR_API_KEY")
 
with open("/tmp/daily_rows.md", encoding="utf-8") as f:
    table = f.read()
 
# Everything, as the tool currently returns it
full = client.messages.count_tokens(
    model="claude-sonnet-5",
    messages=[{"role": "user", "content": table}],
)
 
# Only the 200 rows you actually see on screen, for comparison
head_200 = "\n".join(table.splitlines()[:202])  # header + separator + 200 rows
capped = client.messages.count_tokens(
    model="claude-sonnet-5",
    messages=[{"role": "user", "content": head_200}],
)
 
print(f"full   : {full.input_tokens:,} tokens")
print(f"head200: {capped.input_tokens:,} tokens")
print(f"ratio  : {full.input_tokens / capped.input_tokens:.1f}x")
 
# Expected output (varies with your row content):
# full   : 62,431 tokens
# head200: 4,238 tokens
# ratio  : 14.7x

Numbers change the conversation. What fits neatly into 200 rows on screen arrives at the model more than ten times heavier — and it rides along on every turn's input.

Your ratio will differ. The ratio itself matters less than confirming once, with your own numbers, that what you see and what the model receives are not connected.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
You can verify the gap between rendered rows and billed tokens yourself, using count_tokens alongside raw byte counts
You'll get a working refactor that turns a full-table MCP tool into a three-layer response: summary, top-N, and a pointer to the full result
You'll leave with a rule for deciding screen rows and model input separately, instead of letting one dictate the other
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Claude Code2026-07-15
Answering auto mode's confirmation prompts in headless runs — a deny-by-default permission-prompt-tool
auto mode's confirmation step is a friend when you're at the keyboard, but in an unattended midnight run it becomes the reason a job sits waiting until morning. Here is how I catch those prompts with permission-prompt-tool, decide deny-by-default, and log every ruling — with working code.
Claude Code2026-06-18
Give an Unattended Agent Only the MCP Tools It Needs — Enforcing a Deny-by-Default Policy
An unattended Claude Code agent can't lean on a permission prompt, so whatever a tool can reach becomes the blast radius. Here's how to lock MCP servers and tools down to deny-by-default and hand back only what the job needs, with managed-settings.json examples.
Claude Code2026-03-24
How to Automate Game Development with Claude Code × unity-mcp — A Complete Workflow from Concept to Release
Learn how to combine Claude Code with unity-mcp to automate Unity game development. The hcg-workflows skill set provides an 8-phase workflow from planning to deployment.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →