# Tracking missing capabilities - Docs

One of the most valuable signals an MCP server owner can get is: *the agent wanted to do something I don't currently support.* Without that signal, gaps in your tool surface are invisible — the agent either gives up silently or hallucinates a tool name.

`reportMissing` is the SDK's hook for capturing those gaps.

## Enabling

TypeScript

PostHog AI

```typescript
instrument(server, posthog, {
  reportMissing: true,
})
```

With this on, the SDK registers a virtual tool called `get_more_tools` on your server. The tool is advertised to the agent through `tools/list` like any other tool, with a description that tells the agent to call it whenever the user's request can't be satisfied by the available tools.

## What gets captured

When the agent invokes `get_more_tools`, the SDK:

1.  Emits its own dedicated `$mcp_missing_capability` event — **not** a `$mcp_tool_call`.
2.  Stamps `$mcp_intent` with the agent's reasoning describing what the user was trying to do.
3.  Returns a benign response to the agent so it can continue its turn.

That gives you a queryable feed of unmet asks per server:

SQL

[Run in PostHog](https://us.posthog.com/sql?open_query=SELECT%0A++properties.%24mcp_intent+AS+unmet_request%2C%0A++properties.%24mcp_client_name+AS+client%2C%0A++count%28%29+AS+times_asked%0AFROM+events%0AWHERE+event+%3D+'%24mcp_missing_capability'%0A++AND+timestamp+%3E+now%28%29+-+INTERVAL+30+DAY%0AGROUP+BY+unmet_request%2C+client%0AORDER+BY+times_asked+DESC%0ALIMIT+50)

PostHog AI

```sql
SELECT
  properties.$mcp_intent AS unmet_request,
  properties.$mcp_client_name AS client,
  count() AS times_asked
FROM events
WHERE event = '$mcp_missing_capability'
  AND timestamp > now() - INTERVAL 30 DAY
GROUP BY unmet_request, client
ORDER BY times_asked DESC
LIMIT 50
```

## Complementary signal: advertised but uncalled

`reportMissing` tells you what's *missing*. The `$mcp_tools_list` event tells you what's *advertised but ignored* — tools the agent saw but never invoked.

SQL

[Run in PostHog](https://us.posthog.com/sql?open_query=WITH+listed+AS+%28%0A++SELECT+DISTINCT+arrayJoin%28properties.%24mcp_listed_tool_names%29+AS+tool_name%0A++FROM+events%0A++WHERE+event+%3D+'%24mcp_tools_list'%0A++++AND+timestamp+%3E+now%28%29+-+INTERVAL+30+DAY%0A%29%2C%0Acalled+AS+%28%0A++SELECT+DISTINCT+properties.%24mcp_tool_name+AS+tool_name%0A++FROM+events%0A++WHERE+event+%3D+'%24mcp_tool_call'%0A++++AND+timestamp+%3E+now%28%29+-+INTERVAL+30+DAY%0A%29%0ASELECT+tool_name+AS+zombie_tool%0AFROM+listed%0AWHERE+tool_name+NOT+IN+%28SELECT+tool_name+FROM+called%29%0AORDER+BY+tool_name)

PostHog AI

```sql
WITH listed AS (
  SELECT DISTINCT arrayJoin(properties.$mcp_listed_tool_names) AS tool_name
  FROM events
  WHERE event = '$mcp_tools_list'
    AND timestamp > now() - INTERVAL 30 DAY
),
called AS (
  SELECT DISTINCT properties.$mcp_tool_name AS tool_name
  FROM events
  WHERE event = '$mcp_tool_call'
    AND timestamp > now() - INTERVAL 30 DAY
)
SELECT tool_name AS zombie_tool
FROM listed
WHERE tool_name NOT IN (SELECT tool_name FROM called)
ORDER BY tool_name
```

Together, the two queries answer "what tools should I build?" and "what tools should I cut?".

{/ *TODO: ProductScreenshot of an insight showing the top unmet asks from get\_more\_tools, grouped by client* /}

## Caveats

**Agents have to actually call it**

`get_more_tools` is just another tool from the agent's perspective. Well-behaved agents that read tool descriptions will use it; clients that ignore the tool list won't. The signal is opt-in on the agent side as much as on yours.

**It's its own event, not a tool call**

`get_more_tools` emits a dedicated `$mcp_missing_capability` event rather than a `$mcp_tool_call`, so it never pollutes your tool-call volume, error-rate, or intent-source queries. Query it directly via `event = '$mcp_missing_capability'`.

**Only enable when you'll act on the signal**

The point is to feed a roadmap, not to collect data for its own sake. If you're not planning to triage unmet asks, leave it off.

### Community questions

Ask a question

### Was this page useful?

HelpfulCould be better