+ {title} +
+
+ One Executor workspace — 31 integrations — connected to each harness twice: plain, and
+ with ?search_tools=true, which adds one minimal
+ search_<integration> tool per integration. The
+ difference between the two captured sessions is what 31 tool definitions cost, and
+ where they end up.
+
Same server, four context windows
+
+ Everything below is verbatim from the captured request each harness sent to its model.
+ For these runs the server also returned an MCP instructions
+ field carrying a tracer string, to pin down where server instructions surface.
+
{`You are a Claude agent, built on Anthropic's Claude Agent SDK.
+
+You are an interactive agent that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.
+⋮ (no MCP content anywhere in the system prompt)`}
+ {`{
+ "name": "mcp__executor__search_mcp_linear_app",
+ "description": "Search this integration's tools; empty query lists all. Run results with execute.",
+ "input_schema": {
+ "type": "object",
+ "properties": { "query": { "type": "string" } },
+ "$schema": "http://json-schema.org/draft-07/schema#"
+ }
+}
+⋮ × 38, resent every turn`}
+ {`
+# MCP Server Instructions
+
+The following MCP servers have provided instructions for how to use their tools and resources:
+
+## executor
+Executor exposes every connected integration through search and execute. INSTRUCTIONS-MARKER-9F3 Prefer the search tools for discovery.
+ `}
+ {`You are OpenCode, the best coding agent on the planet.
+⋮
+
+
+ Executor exposes every connected integration through search and execute. INSTRUCTIONS-MARKER-9F3 Prefer the search tools for discovery.
+
+
+⋮`}
+ {`{
+ "name": "executor_search_mcp_linear_app",
+ "description": "Search this integration's tools; empty query lists all. Run results with execute.",
+ "input_schema": {
+ "type": "object",
+ "properties": { "query": { "type": "string" } },
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "additionalProperties": false
+ },
+ "eager_input_streaming": true
+}
+⋮ × 38, resent every turn`}
+ <mcp_instructions> block as code mode off
+ {`"name": "execute",
+"description": "Run a confined orchestration script with access to connected MCP tools.
+This is a restricted JavaScript language for calling tools, not a general-purpose runtime.
+⋮
+ - tools.executor.search_mcp_linear_app(input: {
+ query?: string,
+ }): Promise // Search this integration's tools; empty query lists all. Run results with execute.
+⋮ × 38 signatures`}
+ {`name="executor" source="mcp"
+namespaceUseInstructions:
+ "Executor exposes every connected integration through search and execute. INSTRUCTIONS-MARKER-9F3 Prefer the search tools for discovery."
+tools: execute · skills · resume ·
+ search_axiom_mcp · search_github_rest · search_google_gmail ·
+ search_mcp_linear_app · … (names only, ≈5.5 tokens each)`}
+ GetDynamicTools; the wire shows Cursor downloads
+ them all at session start but withholds them from the prompt
+ {`input[0] type: "additional_tools" 9 native tools: exec, wait,
+ request_user_input, collaboration.* — 24,220 chars, none yours
+input[1…] type: "message" developer + user turns
+⋮ your server appears in NONE of it — prompts byte-identical with 7 vs 38 tools`}
+ {`"client_metadata": { "code_mode_tool_names": {
+ "search_google_gmail": { "name": "search_google_gmail", "namespace": "mcp__executor" },
+ ⋮ 37 more
+} }`}
+ callable only as JS inside exec; server instructions dropped too — the marker appears nowhere
+ What 31 tool definitions cost, by harness
+
+ Δ prompt tokens between the plain and ?search_tools=true sessions,
+ as reported by the provider's usage accounting (input + cache write + cache read). Same
+ workspace, same prompt; only the endpoint query differs.
+
+ Cursor's model traffic terminates at its backend, so its pair comes from Cursor's own + per-request usage meter rather than a captured prompt. JSON tool definitions tokenize at + roughly 2.4 characters per token — schema punctuation is token-dense. +
+Design for the weakest channel
+The name is the only universal channel
++ Every harness that shows tools at all shows the name. Descriptions reach only the + inliners; schemas effectively reach only the inliners. If information must arrive, + put it in the name. +
+Schema tricks don't travel
++ An enum of options inside a parameter looks clever and costs less — and is invisible + in Cursor and Codex, the two harnesses where you'd need it most. +
+Keep definitions small anyway
++ Where tools are inlined, every byte is paid on every turn, multiplied by tool count. + One shared description sentence and a single parameter cut this surface by more than half. +
+Measure with provider usage, not estimates
++ Client-side token meters and character counts both mislead. Run the same session + twice and diff what the provider bills — that number is the truth. +
+