Claude Code giấu 40.170 token: bật hay tắt MCP tool search?
Phép đo trên Claude Code v2.1.263 cho thấy tool search giữ 40.170 token định nghĩa MCP ngoài prompt. Khi nào nên tắt, và vì sao auto:5 phản tác dụng.
Bạn gắn thêm MCP server thứ tư vào Claude Code, rồi thấy context còn lại hụt đi một mảng trước khi kịp gõ lệnh đầu tiên. Lần sau bạn gắn thêm ba server nữa, lại chẳng thấy gì thay đổi. Bài này lấy một phép đo thật để trả lời câu hỏi giữa hai lần đó: tool search giấu bao nhiêu token, và mỗi giá trị của ENABLE_TOOL_SEARCH đổi lại cho bạn cái gì.
40.170 token là phần bị hoãn lại
Nhóm Rulestack đo trên máy của họ bằng một prompt tối giản, để gần như toàn bộ input là phần prefix cố định. Con số họ công bố: request đầu tiên của một phiên Claude Code mới mang 20.819 input token khi tool search bật (mặc định), và 60.989 token khi đặt ENABLE_TOOL_SEARCH=false. Chênh lệch khoảng 40.170 token chính là 88 định nghĩa tool mà tool search giữ ngoài prompt cho tới khi model hỏi đúng tên.
Bối cảnh đo, theo tác giả: Claude Code v2.1.263, ngày 2026-09-09, bốn MCP server cộng server của browser extension, model context 1M token. Phần bị hoãn gồm 69 tool từ MCP server — riêng một mail server 29, browser-automation 22, memory plugin 14 — cộng 19 built-in tool mà Claude Code cũng hoãn qua cùng cơ chế. Trung bình khoảng 456 token mỗi định nghĩa.
Đây là điểm đáng nhớ nhất: chi phí đó không trả một lần. Prefix cố định nằm trước hội thoại và được đọc lại ở mọi lượt, kể cả những lượt không đụng tới bất kỳ MCP tool nào.
| ENABLE_TOOL_SEARCH | Input token, request đầu | Trong đó cache creation |
|---|---|---|
| unset (mặc định, hoãn) | 20.819 | 7.840 |
| false (nạp hết) | 60.989 | 60.987 |
| auto:5 | 62.319 | 7.840 |
auto:5 không "tiết kiệm hơn auto" — nó làm toán trên context window
Dòng thứ ba mới là chỗ dễ sập bẫy. Chế độ ngưỡng nạp tool lên trước chừng nào tổng định nghĩa còn dưới N% context window, và chỉ hoãn khi vượt ngưỡng. Với context 1M, 5% là 50.000 token; đống định nghĩa ở đây khoảng 40.000, tức là dưới ngưỡng, nên auto:5 nạp hết — request lên 62.319 token, cao hơn cả false vì tool search vẫn còn trong prompt.
Ngưỡng mặc định của auto là 10%, tức 100.000 token trên context 1M. Cũng 10% đó trên context 200K chỉ là 20.000 token, và khi ấy 40.000 token định nghĩa của máy này sẽ bị hoãn. Cùng một setting, hai hành vi ngược nhau, chỉ vì đổi model. Nếu ý định của bạn là "giữ prompt nhỏ", unset mới là giá trị đúng — nó hoãn vô điều kiện.
Nó thành bao nhiêu tiền mỗi phiên
Trường total_cost_usd trên chính các lần chạy đó, theo tác giả: 0,092 USD cho lần đầu và 0,016 USD cho các lần sau với unset; 0,613 USD và 0,035 USD với false. Khoảng cách lần đầu lớn vì ghi 61K token vào cache đắt hơn ghi 8K. Khoảng cách các lần sau nhỏ hơn nhưng vĩnh viễn — cache read tính theo token, và prefix được đọc lại mỗi lượt.
Đây là khoản trong hóa đơn bạn cắt được mà không phải đổi model, đổi prompt, hay bỏ bớt server.
Khi nào tắt tool search là đúng
Lý do đặt false là tương thích, không phải hiệu năng. Ba trường hợp tác giả dẫn từ tài liệu: proxy không chuyển tiếp khối tool_reference mà tính năng này dựa vào, deployment từ chối beta header, và model cũ hơn thế hệ Claude 4.5. Claude Code tự tắt tool search khi ANTHROPIC_BASE_URL trỏ vào host không phải first-party, vì phần lớn proxy rơi mất khối đó.
Có một chi tiết vận hành ít người để ý và nó nghiêng hẳn về phía mặc định: lỗi kết nối server chỉ được báo cho model khi tool search bật. Khi bật, Claude biết server nào hỏng và vì sao, nên nó nói được "mail server không kết nối được" thay vì hành xử như chưa từng có server đó. Tắt đi, model không nhận được tín hiệu lỗi nào.
Hai nút chỉnh còn lại
Một server có thể miễn hoãn bằng alwaysLoad: true trong config, một tool riêng lẻ thì dùng "anthropic/alwaysLoad": true trong _meta. Tài liệu khuyên dùng hẹp — chỉ cho "một số ít tool mà Claude cần ở mọi lượt" — vì mỗi tool nạp trước ăn vào phần context lẽ ra dành cho hội thoại. Bật nó còn khiến lúc khởi động phải chờ server đó, giới hạn ở connect timeout 5 giây tiêu chuẩn.
Nếu bạn viết MCP server: mô tả tool và instructions đều bị cắt ở 2KB, và khi tool search bật thì instructions chính là thứ Claude đọc để quyết định có tìm trong server của bạn hay không. Một server có 29 tool mô tả kỹ nhưng instructions để trống, ở đầu phiên, chỉ là 29 cái tên.
Tầng cắt token thứ hai: lọc output trước khi nó vào context
Tool definitions chỉ là phần prefix. Phần phình to trong lúc chạy là output của Bash. Trong một bài mô tả setup Claude Code 2026 trên Dev.to, tác giả móc một PreToolUse hook chặn trước mọi lệnh Bash và viết lại các lệnh CLI như git status, find, grep, ps aux để đi qua một proxy lọc. Số liệu tác giả công bố cho setup hiện tại: 39.646 lệnh, tiết kiệm 276,4 triệu token, tức 86,8%, trong đó riêng thao tác đọc file chiếm 217,8 triệu token trên 3.067 lần gọi. Anh quy đổi 276 triệu token thành khoảng 4.100 USD theo giá input 15 USD/triệu token của Opus — đây là ước tính của tác giả, dựa trên đơn giá anh chọn, không phải hóa đơn đối chiếu.
Ba bài học cấu hình trong cùng bài đó đáng chép lại vì chúng cũng là chuyện context: giữ CLAUDE.md ngắn (bản đầu hơn 200 dòng thì model đọc lướt rồi quên, dưới 30 dòng chọn lọc hiệu quả hơn); tách rule theo path để rule Rust chỉ nạp trên file .rs; và tắt bớt skill không dùng — anh cài 55 skill nhưng chỉ để 40 cái active.
Đo trên máy bạn trong năm phút
mkdir /tmp/toolsearch-lab && cd /tmp/toolsearch-lab
claude -p "Reply with just OK." --output-format json --max-turns 1 | jq .usage
ENABLE_TOOL_SEARCH=false claude -p "Reply with just OK." --output-format json --max-turns 1 | jq .usage
ENABLE_TOOL_SEARCH=auto:5 claude -p "Reply with just OK." --output-format json --max-turns 1 | jq .usage
Cộng ba trường input_tokens, cache_read_input_tokens và cache_creation_input_tokens ở mỗi lần chạy. Hiệu giữa hai lần đầu là tổng định nghĩa đang bị hoãn trên máy bạn. Chia nó cho context window của model bạn dùng để biết auto sẽ đặt ranh giới ở đâu. Chạy claude mcp list để biết con số đó đến từ những server nào.
Con số 40.170 là của một máy. Cơ chế thì giống nhau, còn độ lớn phụ thuộc hoàn toàn vào những gì bạn đã cắm vào. Thứ đáng theo dõi tiếp: mỗi lần bạn đổi sang model có context nhỏ hơn, ngưỡng auto dịch theo, và một setting bạn tưởng đã chốt xong sẽ đổi hành vi mà không báo gì cả.
Không spam, hủy đăng ký bất kỳ lúc nào.