All posts
MCP education··5 min read

MCP server analytics: what to measure when your customers' agents are the users

An MCP server's unit of analysis isn't the request — it's the customer. This post lays out the four metric layers worth building (adoption, reliability, per-tool health, protection headroom), the request-log schema that makes incidents diagnosable, and two pitfalls we hit in production: system events polluting usage counters, and HTTP 200s hiding failed tool calls.

⌘
Command+K team
Platform engineering

MCP analytics is customer analytics

Server metrics answer "is it up?". An MCP serving your customers' AI agents has a sharper question: who is using what, and is it working for them? The unit of analysis isn't the request — it's the customer.

commandplusk.com/dashboard — Usage · Announcekit
Requests (30d)
5,368
Failures (30d)
95
p95 latency
870 ms
Daily requests — last 30 days Successful Failed

The four layers worth building

  • Adoption. Connected customers, calls per customer per month, last activity. This is your "are AI features landing?" dashboard — and your expansion signal.
  • Reliability. Success rate on tool calls (not handshakes), p95 latency windowed over 24h/7d/30d. Tool errors ride inside HTTP 200 in MCP — count outcomes, not status codes.
  • Per-tool health. Which tools get used (curation feedback) and which fail (often a schema drift signal from your upstream API).
  • Protection headroom. Usage against quotas, caps and rate limits — the difference between "we throttled a runaway agent" and "we found out from a customer email".

Logs: the request level still matters

Aggregates say something is wrong; logs say what. The log schema that has paid for itself, line by line: timestamp, event (including auth failures and gateway rejections — absence of evidence is undiagnosable), tool, customer, outcome, latency, client IP and user agent (which is how you catch CDN-level blocking of AI clients).

commandplusk.com/dashboard — Logs · All MCPs
AtEventToolCustomerOutcome
9:20 PMtools/list—admin@commandplusk.comSuccess 363 ms
8:57 PMtools/callpostada@loopwork.ioSuccess 867 ms
8:45 PMtools/calllabelsada@loopwork.ioSuccess 295 ms
8:33 PMtools/callactivitiesfelix@brightpath.appSuccess 843 ms
8:21 PMtools/callget_latest_activitiesfelix@brightpath.appSuccess 891 ms
8:03 PMtools/callpostsada@loopwork.ioFailed 593 ms
7:48 PMtools/callmefelix@brightpath.appSuccess 488 ms

Per-request logs kept 30 days · daily aggregates forever · system events filterable

Two pitfalls we hit so you don't

  • System events polluting usage. Discovery probes and 401s counted as traffic inflate error rates and even consume quotas. Log them, but keep them out of usage rollups and headline KPIs.
  • Status-code truthiness. A failed MCP tool call is usually HTTP 200 with an error payload. Dashboards keyed on status codes will show a green wall while customers suffer — key on the outcome flag.

All of this ships with the gateway

Per-customer usage, windowed reliability, request logs with auth failures and client signatures, 30-day retention — it's the standard dashboard on every Command+K MCP deployment.

FAQ

What metrics should I track for an MCP server?
Four layers: adoption (connected customers, calls per customer per month), reliability (success rate on tool calls, p95 latency over 24h/7d/30d), per-tool health (which tools are used, which fail), and protection headroom (usage against quotas and rate limits). Aggregate counters alone hide who is affected — per-customer attribution is the key dimension.
Why should system events be separated from usage metrics?
Auth probes, discovery requests, and rejected calls are diagnostics, not product usage. If they land in the same counters, a bot hammering 401s reads as a 90% error rate, consumes quota, and pollutes top-tools — we hit exactly this and now log system events separately from usage rollups.
How long should MCP request logs be retained?
A workable default: per-request logs for 30 days (enough for debugging and support), daily aggregates forever (enough for trends and billing history). State the policy in the UI so owners aren't guessing.

Keep reading

Go deeper