Tracking missing capabilities

Contents

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
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
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
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?".

PostHog insight showing $mcp_missing_capability events broken down by MCP client name

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

Was this page useful?