Claude Code's 25,000-token MCP limit let a 49,964-token result through. We measured both checks A developer measured Claude Code v2.1.273's handling of large MCP tool outputs and found that its 25,000-token limit is enforced by a check that only triggers after a character-based size check, allowing 24,000 characters of CJK text to enter context as 49,964 tokens — roughly twice the stated limit. The testing used a minimal 65-line stdio MCP server with tools that return a specified number of characters, and the results show the token check does not catch dense non-Latin text. The findings highlight a gap between the documented token limit and the actual enforcement behavior in Claude Code's MCP output handling. We had a 65-line stdio MCP server return text of whatever size we asked for, then read what Claude Code v2.1.273 actually put in context. Two separate checks act on a large result. A size check swaps it for a file path and a 2KB preview somewhere between 45,000 and 52,000 characters. A 25,000-token check swaps it for an error message and a file path. The token check only runs once a result is long in characters, so 24,000 characters of CJK text went straight into context as 49,964 tokens, about twice the limit. The MCP page of the Claude Code docs has a short section on large tool output. It says Claude Code "displays a warning when any MCP tool output exceeds 10,000 tokens", that the maximum is 25,000 tokens by default and can be changed with the MAX MCP OUTPUT TOKENS environment variable, and that when a result goes over the limit, Claude Code saves it to a file under the session's tool-results directory and "replaces it in the conversation with a message that names the file path". A second paragraph says a server can raise the "default persist-to-disk threshold" for one tool by setting meta "anthropic/maxResultSizeChars" in its tools/list entry, up to a hard ceiling of 500,000 characters. That is two different words for the limit, tokens in one paragraph and characters in the next, and no number for the character threshold. We wanted to see which check fires where, what Claude receives in each case, and what it costs in input tokens. So we built the smallest server we could and walked the output size up and down. Everything ran on 2026-09-16, with Claude Code 2.1.273 and the default model on our account, claude-opus-5 1m , inside a throwaway directory made with mktemp -d . The server is a Python script with no dependencies. It speaks newline-delimited JSON-RPC over stdio, answers initialize , tools/list , and tools/call , and has two tools. emit text takes one integer, chars , and returns exactly that many characters. emit text annotated does the same thing but declares "anthropic/maxResultSizeChars": 300000 in its meta . The text is filler with a marker at each end: a BEGIN-MARKER line, numbered lines of eight random words from a 52-word list, and an END-MARKER: end-