Blog / How agents load MCP tools

How many MCP tools is too many? Real token costs across five agents (2026)

Ninety-nine tools, 68,286 tokens of definitions. In one agent app that added nothing to the first request; in another it added 73,415 tokens to every request. Meanwhile Codex missed the tools entirely in 8 of 80 live runs. The useful question isn't how many tools. It's what each app does with them.

Leonid Bugaev · Published 21 Oct 2026

The short answer

Count is the wrong unit. What an MCP tool list costs, and whether agents find the right tool in it, depends on three things: how many tokens the definitions take, how each agent app loads them, and whether the words in your names and descriptions match what users ask for. Advice you'll find online ranges from “under 20 tools” to “128 is the cap”, but none of those numbers says which app your users run.

So we measured one real list: a 99-tool production MCP server, 68,286 tokens of definitions (o200k_base, compact JSON), in five agent configurations.

What 99 tools cost in each agent app

We captured the first request each app sent to its model for the prompt “say hi”, once with the server connected and once without, and stopped it before any model ran.

Codex 0.161.0
+0
Claude Code 2.1.301 (default)
+1,715
OpenCode 1.18.34
+73,415
Claude Code, tool search off
+107,541
How each app handled the same 99 tools, 16 Oct 2026
Agent appWhat the model sees firstUp-front costPaid again on each request?
Codex 0.161.0 (code mode)No MCP tool names at all; the model searches tool metadata with code+0No; search results enter the history
Claude Code 2.1.301, tool search on113 tool names, about 1,258 tokens, no schemas+1,715Only the definitions it loads (about 573 tokens each)
Grok Build 1.0.60A 189-token note saying which servers exist and how many toolssmallSearch returns full schemas of the top 10 hits (4,957 tokens)
OpenCode 2.0.31 (interactive)16 of the 99 tools with one-line descriptions (881 tokens), plus a search functionfirst request about 5,270 in totalOnly what its code prints
OpenCode 1.18.34All 99 definitions (63,245 tokens in its rendering)+73,415Yes, every request
Claude Code 2.1.301, tool search off or behind a custom API URLAll 99 definitions+107,541Yes, every request

Up-front deltas use each app's own token count and are single runs. Grok Build and OpenCode 2 rows describe the captured first request rather than a with/without delta.

The eager-loading cost is real money. In 40 live OpenCode 1 runs on eight read questions, the app averaged 3.7 model requests per question, so about 230k tokens of tool definitions per question, and 341,615 input tokens per question overall by its own count. Claude Code and Codex averaged about 222k and 221k on the same questions.

Watch for configuration traps. Claude Code switched tool search off when it ran behind a custom API base URL, such as a gateway or proxy, and loaded every definition. Setting ENABLE_TOOL_SEARCH=true turned it back on (143,357 → 22,446 first-request tokens in our check). If your users run Claude Code through a company gateway, they may be in the expensive row without knowing it.

The catch with search: agents can miss your tools

Search keeps the context small, but it adds a new failure: the search has to find your tool. On the same production server, in live read-only runs:

A synthetic sweep published this month, with 5 to 100 invented file tools, found no accuracy loss on frontier models and concluded that names decide how much the model reads under deferred loading (dev.to, October 2026). Our production list adds the other half: a real tool list in real apps, where the search sometimes never got there. Our runs can't say how much of that was the tool wording and how much the app's search.

Find where agents fail on your tools. Measure what fixes it.

Bring your MCP server, CLI or API and the jobs your users need done. We run real agents against them, read every call, and hand back measured gaps and fixes.

Test your MCP

Weight, not count

The 99 tools averaged about 690 tokens each, but the average hides the problem. Two tools made up about a third of the whole list, because their descriptions carried a full query grammar. In an eager-loading app, those two tools were paid for on every request, by every user, whether or not the job touched them.

So before cutting tools, sort them by size. Moving reference material out of the two heaviest descriptions (into a playbook the agent fetches when it needs it) saves more than deleting twenty small tools.

4 tools vs 99 tools: what changed

In a controlled test we built a 4-tool version of the same server and compared it with the full 99 tools. Both had the same start-here tool, get_instructions, with a hint telling the agent to call it first.

Mock server, 18 Oct 2026: right first step on job requests, and tokens before the first server call (median)
SetupClaude Code 2.1.302Codex 0.161.0
99 tools, start-here recipe24/24 (86–100%), 6.3k tokens24/24 (86–100%), 43.8k tokens
4 tools, start-here recipe12/12 (76–100%), 4.5k tokens12/12 (76–100%), 40.0k tokens
99 tools, start-here tool but no hint1/24 (1–20%)9/24 (21–57%)

Once the agent knew where to start, the number of tools stopped mattering for getting the job started. The small server only saved tokens. Without the hint, the agents went straight to whichever of the 99 tools looked relevant. These are mock results: they show how agents start a job, not how well they finish it.

What to do instead of picking a number

  1. Measure your tool list in tokens. Count tools/list as compact JSON with a named tokenizer, and sort tools by size.
  2. Find out which apps your users run, and how each loads tools. If any of them load everything on every request, the total size is a per-request bill. If they search, discovery is your risk.
  3. Slim the heaviest tools first. Move long reference text out of descriptions and into a playbook tool.
  4. Make tools findable. Put the words users say in tool names and in the first line of each description; test paraphrases of the same job.
  5. Give the agent a start-here tool and say so in the server instructions. See make the agent read your playbook first.
  6. Re-measure on every release of your server and of the apps. OpenCode 1 and OpenCode 2 load the same list in completely different ways.

For the full per-app picture, see how Claude Code, Codex, Grok and OpenCode load MCP tools. For a checklist of the other metrics, see how to measure MCP server quality.

How we measured

Sources

FAQ

Is there a limit on the number of MCP tools?

The MCP protocol has no tool limit. Agent apps set their own: VS Code has been reported to cap a chat request at 128 enabled tools, and Cursor's earlier 40-tool limit has reportedly been replaced by on-demand loading. What matters more is how the app loads tools: all definitions on every request, or names first with search.

How many tokens does an MCP tool definition use?

It varies a lot. In a 99-tool production list the average was about 690 tokens per tool (68,286 in total), but two tools made up about a third of the list. Count your own tools/list with a named tokenizer and look at the heaviest tools first.

Does Claude Code load all MCP tools into context?

Not by default. In our capture, Claude Code 2.1.301 with tool search on showed the model tool names only and added 1,715 tokens for 99 tools. With tool search off, or behind a custom API base URL, it loaded every definition and added 107,541 tokens.

Does Codex load MCP tools up front?

No. Codex 0.161.0 in its default code mode added 0 tokens up front: the model searches tool metadata from code. The cost moves to the search, about 40k tokens before the first call in our runs, and the search can miss: 8 of 80 live runs never reached the server's tools.

Should I split my MCP server into smaller servers?

Split if your users' apps load every definition on every request and the list is heavy, or if unrelated jobs compete for the same words. Otherwise, first make tools easy to find (user vocabulary in names and first lines) and give the agent a clear place to start. In our mock test, 4 tools and 99 tools performed the same once a start-here tool was in place.

Find where agents fail on your tools. Measure what fixes it.

Bring your MCP server, CLI or API and the jobs your users need done. We run real agents against them, read every call, and hand back measured gaps and fixes.

Test your MCP