search_orders
Agents retry it and you cannot see that
The agent asks, gets something it cannot use, and asks again with different arguments — 2.4 times on average before it gives up. Your logs show three or four successful calls.
Analytics for MCP servers
MCPulse shows you which tools AI agents retry, which come back empty, and which they never call at all. Two lines inside your own server. It never sees your arguments or your results.
Free forever. No card, no trial to expire. All ten MCP SDKs supported.
Tool health
last 7 days
| Tool | Calls | First-call | Verdict |
|---|---|---|---|
| search_orders | 4,120 | 68% | Retried 2.4× |
| create_order | 1,904 | 97% | Healthy |
| get_invoice | 2,551 | 88% | 12% empty |
| export_report | 0 | — | Never called |
Needs attention. export_report costs 480 tokens of schema every session and has never been called.
The problem
Every failure below is recorded as a success by everything you already have. That is why they go on happening.
search_orders
The agent asks, gets something it cannot use, and asks again with different arguments — 2.4 times on average before it gives up. Your logs show three or four successful calls.
get_invoice
An empty list is still a success. No error is raised, nothing is logged as a failure, and the agent got nothing it could use. 12% of this tool's calls end that way.
export_report
Registered, described, and dead. It still costs 480 tokens of schema in every single session, crowding the context agents use to pick between the tools that do work.
Agents struggle with search_orders
Only 68% of calls to search_orders succeed first time. Agents retried it 2.4 times on average across 4,120 calls.
get_invoice returns empty results
306 calls to get_invoice returned empty with no error — 12% of 2,551 calls. The agent was told these succeeded.
export_report has never been called
export_report has never been called but costs 480 tokens of schema every session — $1.73 across 1,200 sessions in this range.
list_customers returns a lot of context
list_customers returns 14 kB per call — about 3.5k tokens, roughly $0.01 of context each time, and $32 across 3,008 calls.
What you get
How often each tool is reached, how often the agent got what it needed first time, how often it came back empty, and what it costs to answer. The rows worth opening are coloured. The rest are left alone.
Why this one
Tracing shows you one call that happened. This shows you whether agents can use your server at all — and hands the answer back as a list of tools to change.
01
The usual way to measure a tool call is to record it: the arguments going in, the answer coming back, sometimes the whole session. This records how long the call took, how big the answer was, and a scrambled fingerprint of the arguments. Nothing that could hold a customer record ever leaves your server.
02
Your tool descriptions are scored against the whole ecosystem, not against your own last week. A trace viewer has one server in it: yours. It can never tell you that two of your tools read as the same thing to the agent choosing between them.
03
A trace is evidence you still have to read. This is a list: reword this one, this one comes back empty, delete this one. The teams that fixed tool selection cut tools rather than added dashboards — and cutting means knowing which.
| Capability | MCPulse | PostHog | AgentCat | Sentry |
|---|---|---|---|---|
| Sees your arguments and results | Never — sizes and a hash | Yes | Yes, plus session replay | Yes |
| First-call success and retry rate | Yes | No | No | No |
| Scored against public servers | 4,749 servers | No | No | No |
| Dead tools and schema cost | Yes | Dead tools only | No | No |
| Languages | TypeScript | TypeScript | TypeScript | Several |
| Free tier | 1 server, 10k calls | Yes | 500 sessions a month | On every plan |
Taken from each product's own documentation in September 2026. They are all good at what they are for. If you want session replay, or a tool call stitched into the agent trace around it, install one of those instead. BetterMeter is left out because its documentation is too thin to fill a row honestly. Datadog and Grafana solve the opposite problem — their MCP servers hand their telemetry to an agent.
Free, no account, nothing uploaded
We read the tool definitions of 4,749 public MCP servers
— 82,549 tools. One in six had no word to tell it apart
from the tool beside it. Paste your
tools/list and see where yours
sits. It runs in this browser, and nothing is uploaded.
How it works
Not its URL, not its auth, not its dependencies, and not its uptime.
01
An npm package you install, not a proxy. Your server keeps its own URL, so anything that already links to it still works and your OAuth still works. Nothing of ours sits in the request path. If we are down, your server keeps serving.
02
Sizes and fingerprints only. Your arguments become twelve characters of a one-way hash — enough to tell whether two calls were the same, and not enough for anything else. There is no option to turn this off, because a guarantee you can switch off is not one.
import { watch } from "@mcpulse/sdk"
watch (server, { key })
✓ same server back
03
One import, one wrap, after your tools are registered. watch() hands back the same server, so nothing downstream changes. No runtime dependencies at all — it will not drag anything into your tree.
Install
Four steps, about two minutes: add the package, paste your key, wrap the server you already built, restart. Everything else stays exactly as it is.
$ npm install @mcpulse/sdk
added 1 package in 1.2s
✓ 0 dependencies
✓ 0 vulnerabilities
# .env
MCPULSE_KEY=mp_live_4f8a2c19bd7e
# An ingest key is a secret. Anyone holding it
# can write data into this MCP.
import { watch } from "@mcpulse/sdk";
// … your registerTool calls …
watch(server, { key: process.env.MCPULSE_KEY });
// Returns the same server. Nothing downstream changes.
Overview · last 7 days
Calls
12,481
+18% vs prior 7 days
First-call
68%
−4% vs prior 7 days
Agents retried search_orders 2.4 times on average before getting a usable answer.
Metrics
Thirteen are counted as your calls arrive, or the moment your server boots. Three need a night's worth of calls before they mean anything, and say so on the dashboard.
All sixteen, and when each one updates →Counted as each payload lands.
11 metrics
02:00 UTC. Labelled as of yesterday, because they are.
3 metrics
Sent once, when your server boots.
2 metrics
Pricing
Every plan records all sixteen metrics and reaches its own data through the API and an MCP connector. What you pay for is how much traffic, how far back, and whether it tells you when something breaks.
See whether your server is working.
$0 / month
No card, no trial to expire
For a server people depend on.
$49 / month
or $490 a year — 2 months free
For a lot of traffic and a long memory.
$100 / month
or $1,000 a year — 2 months free
Every plan starts free. No trial to expire, no card up front. Caps, downgrades and who takes the payment →
Why believe it
We are not going to show you a wall of logos. The claims this product makes are about schemas and traffic, so the evidence is data you can recompute and a tool you can point at your own server.
4,749
public servers read
The schema survey behind this product, with the corpus, the method and the things it cannot tell you all written down.
Read the survey →Open
data and analysis
Every figure in the survey is in analysis.json, with the servers and tools behind it in examples.json. The collector rebuilds the corpus from a public API in about twenty minutes.
Check the numbers →0
runtime dependencies
The SDK pulls nothing into your tree, and nothing of ours sits in your request path. Two lines, and it hands the same server object back.
See the package →Free
to test on your own server
Score your own tool schemas against the corpus before you install anything. It runs in your browser and nothing is uploaded.
Open the checker →Questions
The four worth asking before you install anything.
Nothing. The SDK runs inside your process and sends its own batches outward, so your tool calls never traverse anything of ours. A failed batch is dropped the way a network error is dropped. This is the whole reason it is a package and not a proxy: a proxy that is down is a server that is down.
No. One row leaves your process per call. It holds which tool ran, how long it took, how big the answer was, and a one-way fingerprint of the arguments. There is no field that could hold customer data — which is a stronger thing to be able to say than a promise about how the fields get used. The fingerprint is twelve characters of a SHA-256 with the keys sorted: enough to tell whether two calls were the same, not enough for anything else. There is no option to turn this off, because a guarantee you can switch off is not one.
Recording happens after your handler has returned and batches are sent on their own schedule, so a tool call never waits on us. The SDK has no runtime dependencies, so it drags nothing into your tree. And every path through it is wrapped: if the recording itself fails, it fails silently rather than turning a working tool call into an error. Instrumentation that can break the thing it measures is worse than no instrumentation.
No. You add a package and wrap the server object you already built; `watch()` hands the same server back, so nothing downstream sees a difference. Your URL, your OAuth, your deployment and your dependencies are untouched. That is the point of not being a proxy: a proxy would move your traffic to a new address, which breaks your OAuth and breaks every directory that already lists you.
Create a server, paste the key, restart. Your dead tools and what each schema costs show up immediately. The call metrics fill in as traffic arrives.
Free forever. No card, no trial to expire. All ten MCP SDKs supported.