What did users keep asking my server to do that it couldn’t?Not “which tool is slow.” Not “what’s my error rate.” The actual user goals your tools reached for and missed.
What’s in the report
AGapReport covers a project over a time window and contains:
topFailedAsks
The hero list. User asks your tools attempted but couldn’t satisfy, ranked by
count, each with
exampleSessionIds so you can read the real transcripts.topIntents
What users come to your server to do, ranked. The denominator that makes the
failed asks meaningful.
toolCombos
Which tools get used together in a session. Surfaces missing glue between
capabilities agents keep chaining by hand.
errorPatterns
Recurring
{ tool, error } pairs by count — the structural failures behind
the failed asks.markdown, so you can drop it into a PR, an
issue, or a weekly digest without touching the dashboard.
How an ask becomes “failed”
Each session gets summarized into a one-lineintentSummary and a
sessionOutcome — success, partial, failed, or unknown. When the
outcome is partial or failed, the summary records attemptedButFailed (the
specific asks that didn’t land) and, where the model can infer it, a
missingCapability. The report clusters those attemptedButFailed strings
across sessions, dedupes near-identical asks, and ranks them. That ranked list
is topFailedAsks.
The honest ceiling
mcpeye sees your server from the server side. That vantage point is a feature — it needs no client instrumentation and works for any agent that connects — but it has a hard limit you should know up front: In practice this means the Intent Gap Report is a high-precision view of the gap: everything in it is a real ask your server saw and couldn’t satisfy. It is not a complete view of all unmet demand — the silent misses live in the agent’s client transcript, which the server never sees. We’d rather report a sharp, trustworthy subset than guess at what we can’t observe.See the full pipeline
How injected intent becomes a clustered report.