23,662 tool calls: thirty days of agent traces from one machine

A deterministic census of every tool call my coding agents made in 30 days — what they actually run, where they fail, what they reach for, and how little of it looks like the tool ecosystem being built for them.

Public data on what AI agents do is thin in a specific way: the two best instruments both measure something adjacent to behavior, and both say so themselves. Anthropic’s Economic Index “Cadences” report (June 2026, ~9,700 users with linked sessions) classifies conversation outputs and states plainly that it does not measure tool-calling patterns. A UK AISI census of 177,000 MCP tools (arXiv:2603.23802, March 2026) maps the tool supply and notes its usage proxy — package downloads — counts installs, “rather than individual tool calls.”

So here is the missing granularity at the smallest useful scale: every tool call one power user’s agents made on one machine over thirty days. n=1, but it is the level of resolution the public instruments say they cannot see.

What was run

A ~180-line Python script (stdlib only, no model calls) streamed every Claude Code session transcript on this machine — 653 JSONL files, ~490 MB — and counted tool-use and tool-result events with timestamps inside 2026-07-15 → 2026-08-14 (snapshot 15:00 UTC). Sessions spanned Claude Code CLI and desktop across whatever model versions those thirty days actually used (an Opus 4.x / Fable 5 mix; per-call model attribution was not extracted). Error status comes from the harness’s own is_error flag; permission denials are matched by the harness’s denial message strings; Bash commands are grouped by first token after peeling cd … && prefixes.

Excluded, honestly: cloud-scheduled agent runs, a household chat agent on another machine, and anything another vendor’s harness did. This is one machine’s local traces.

The shape of a month

MeasureValue
Main sessions active in window118
Subagent transcripts153
Project workspaces5
Assistant turns46,812
Tool calls23,662
— made by subagents5,944 (25.1%)
Tool errors839 (3.5%)
Human permission denials91 (0.38%)

What the tools were

ToolCallsShareError rate
Bash12,17451.4%4.2%
Edit3,68115.6%4.4%
Read2,90312.3%0.7%
Write1,4576.2%3.0%
Task tracking (create/update)1,2045.1%0.0%
Agent (subagent spawn)3941.7%0.0%
Web (fetch + search)4622.0%8.2%
Browser automation (MCP)5692.4%8.3%
Everything else8183.5%

Two-thirds of everything is the terminal plus file edits. The single biggest fact in the dataset is that the terminal is the agent’s real interface: half of all tool calls are shell commands, and 86% of those are composite (&&, pipes, subshells) — not “run this program” but small programs in themselves.

What runs inside the shell is just as lopsided:

Bash familyCalls
grep1,362
git1,092
echo1,001
python3891
ls659
br (a task-tracker CLI)614
npm566
sed460
cat382
npx354
node279
uv176
gh167
ssh164

The most-run command is grep. Add ls, cat, and the Read tool and a large fraction of agent activity is looking at things before touching them. The MCP census found the tool market shifting hard toward action tools (27% → 65% of downloads in 16 months); the observed behavior on this machine is perception-heavy — the actions are there, but they sit on a large substrate of reading, searching, and checking.

Also notable: a bespoke task-tracker CLI (br) outranks npm. Deterministic personal tooling, built to be driven by agents, gets more agent traffic than the ecosystem’s package manager.

What almost never happens

MCP tools: 2.8% of calls. 669 total, and 85% of those are one server (browser automation). Against an ecosystem that published 177,000 MCP tools in sixteen months, one power user’s agents touched MCP a handful of times a day — and mostly to drive a browser. The supply is MCP-shaped; this usage is terminal-shaped.

Skills: 0.17% of calls. From an installed base of roughly a hundred available skills, model-invoked skill loads happened 41 times in a month, and no single skill fired more than four times. (User-typed slash commands enter sessions through a different channel and are not in this count — the 41 measures what the model reaches for.) A public tool called skillreaper made “zero telemetry” its selling point precisely because nobody can see firing rates; this is one firing rate, and it is low.

Human intervention: 0.38%. The human said no 91 times in 23,662 calls — mostly to shell commands and web fetches. Combined with the 3.5% error rate, the loop runs green ~96% of the time at this permission configuration.

What agents reach for mid-task

This harness lazy-loads rarely-used tools; a loading call is a clean signal of wanting a capability that wasn’t at hand. It happened 212 times: roughly half for web research (search + fetch), a quarter for task tracking, the rest for agent-to-agent messaging, background monitors, and scheduling. If you wanted a demand signal for what to build into an agent harness first, this column is it: retrieval, todo state, and coordination — not payments, not marketplaces.

Delegation

394 subagent spawns produced 25% of all tool calls. A fifth of the spawns are verification-shaped (code review and adversarial critique agents), which matches how the sessions are configured — but the ratio is the interesting part: for every four worker spawns, one skeptic.

Caveats, all of them

One user, one machine, one harness vendor, thirty days, and a permission configuration tuned over months — none of this generalizes on its own. The window includes vacation-paced weeks. Session counts include some sessions that were themselves about building agent tooling, which inflates the self-referential families (br, gh). Denial detection is string-matching and may undercount. The point is not that these numbers are the ecosystem’s — it is that numbers at this resolution are obtainable in an afternoon from data you already have, and until the platforms publish call-level aggregates, self-census is the only instrument that sees this layer at all.