> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getmcpulse.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Tool health

> Every tool on a server, called or not, with the badge that says which one is the problem.

The tool health table lists **every tool your server registers**, not only the ones that ran. A tool with no calls in range still appears, because it still costs its schema in every session.

Sorted by calls descending, then by name.

## Columns

| Column             |                                                                 | Shown by default |
| ------------------ | --------------------------------------------------------------- | ---------------- |
| Tool               | The name exactly as your server registered it                   | ✓                |
| Share              | This tool's share of the server's traffic                       | ✓                |
| Calls              | Calls in range, with a delta and the row's own sparkline        | ✓                |
| First-call success | The share right first time, with retries beside it              | ✓                |
| Bad args           | Arguments your schema rejected                                  | ✓                |
| Tool errors        | `isError: true`, returned deliberately                          | ✓                |
| Crashes            | Your handler threw                                              | ✓                |
| Empty              | Succeeded and returned nothing usable                           | ✓                |
| p95                | The latency bucket the 95th-slowest call falls in               | ✓                |
| Status             | The badge below                                                 | ✓                |
| Avg response       | Average `response_bytes` per call                               |                  |
| Schema             | `schema_bytes` from the [startup payload](/metrics/schema-size) |                  |

## The column picker, not a scrollbar

Twelve columns do not fit in a panel, and a horizontal scroller is the worst way to hold a table: the columns you cannot see are the ones you forget you have. So the table opens on a set that fits, with the rest one click away in a picker beside its search box.

Three things about it are deliberate.

**The menu is read off the column definitions**, so the words in it are the words in the headers by construction. The tool name opts out — every other column is about it.

**What is hidden by default is what is already stated elsewhere on the same screen.** Average response sits under the latency panel; schema bytes have a [panel of their own](/metrics/schema-size). Never the [outcomes](/metrics/outcomes), which are what the table was widened for — and not the sparkline either, which is the row's own shape where the chart above it is the server's.

**Your choice is stored as the difference from the defaults**, per table. Storing "the hidden ones" would make a default-hidden column impossible to switch on; storing every column would pin you to whatever set existed the day you last opened the menu.

The clients panel shares the same picker and the same outcome columns, so a row means the same thing on both.

## The status badge

| Badge              | Condition                          |
| ------------------ | ---------------------------------- |
| **never used**     | Registered, no calls in range      |
| **heavy payload**  | Average response over 10,000 bytes |
| **low first-call** | First-call rate under 70%          |
| **healthy**        | None of the above                  |

Heavy payload is checked first, so a tool that is both heavy and struggling shows **heavy payload** — the larger, more concrete problem, and often the cause of the other.

These thresholds are the **same constants** the [insight rules](/insights/overview) read. The table cannot say a tool is healthy while the panel directly beneath it says it is not.

## Reading the table

Work down the calls column, not across it. The tool at the top is where a percentage point is worth the most.

Three shapes worth recognising:

* **High calls, low first-call.** The most valuable thing on the screen. See [Improve first-call success](/guides/improve-first-call).
* **Low calls, large schema.** Paying for something nobody uses. See [Dead tools](/tools/dead).
* **Any calls, heavy payload.** Every one of those calls is spending context. See [Cut context cost](/guides/cut-context-cost).

## Paging and search

**Five rows a page here, ten on a table that is the page.** There are two constants because there are two kinds of table: the team list, the key list and the [live call feed](/metrics/live-calls) *are* their page and get ten; the tool table and the clients panel are one panel among ten, where ten rows is half a screen of one panel and pushes the insights below the fold. The pager appears only when there is more than one page, so six tools show no pager and nothing is missing.

The search box lives in the table's own header and is always rendered. It belongs to the table rather than the page: a control that comes and goes gives nobody a way to tell a rule from a bug.

## Related

* [Tool detail](/tools/detail)
* [Dead tools](/tools/dead)
