The symptom: Claude Code lists the coding-os MCP server as connected and the agent can see tool names like cos_task_board, but the first call in a session fails with an input-validation/schema error — and sometimes works on retry.
This is deferred tool loading, and it’s by design. The coding-os server exposes dozens of cos_* tools; loading every JSON schema into the agent’s context at session start would burn thousands of tokens before any work happens. So Claude Code sees the names immediately but fetches schemas on demand.
The agent has to load a tool’s schema once per session before calling it:
ToolSearch("select:cos_task_board,cos_graph_search")
After that, calls validate normally for the rest of the session. The “works on retry” behavior is the agent doing exactly this after the first failure.
Rules of thumb:
- Batch the select — load the family of tools needed for the task in one
ToolSearchcall. - This is a per-session cost, not per-call.
- Runtimes that don’t defer schemas don’t need this step.