Skip to content
New We read the schemas of 4,951 MCP servers →

Your MCP server works. Does it work for the model?

You publish a server and see nothing — not which tools get called, not whether the model understands your descriptions, not what your server costs the people running it. MCPulse answers that, from two lines inside your own process.

Start measuring — free

Node 20.12+ · zero runtime dependencies · works with any MCP transport

  • ok

    Ran and returned a result.

  • bad_args

    Arguments failed validation — your handler never ran.

  • tool_error

    Ran and returned isError: true.

  • crashed

    Threw.

How it works

Three decisions, and they are all the same decision

Nothing about your server should have to change so that you can see it.

01

Inside your server, not in front of it

An npm package you install, not a proxy. Directory-listed servers cannot change their URL and OAuth breaks the moment traffic is redirected — so the SDK sits beside your traffic instead of in it. If we are down, your server keeps serving.

{ email: "ada@…" } 9c1b4e2f0a11
02

Never your arguments, never your results

Sizes and hashes only. args_hash is twelve hex characters of a SHA-256 over the arguments with keys sorted: 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

Two lines, then it is measuring

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

Two lines, and it is measuring

The package runs inside your own server. It is not a proxy — your URL does not change, your OAuth does not break, and if MCPulse is down your server keeps serving.

terminal

$ 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.

Insights

A tool name, a number, and a consequence

A dashboard that makes you work out what to do with it has done half the job. Every insight names the tool, counts the thing, and says what it is costing you.

search_orders

Agents retried it 2.4 times on average before getting a usable answer.

list_customers

Returns ~14k tokens per call, roughly $0.04 of context every time it runs.

get_invoice

312 calls returned empty with no error at all.

export_report

Has never been called, but costs 480 tokens of schema every session.

Metrics

Sixteen numbers, and where each one comes from

Most are counted as your calls arrive. Three need a night's worth of calls in order and are labelled as of yesterday, because pretending otherwise would be the first lie the product told you.

Live on ingest

Counted as each payload lands.

11 metrics

  • 01

    Calls per tool

    Which of your tools the model actually reaches.

  • 02

    Calls per day

    The shape of a range — by the hour when you ask for a single day, drawn flat at zero when nothing happened, never left blank.

  • 03

    Which client

    Claude Desktop, Cursor, or something you did not expect — with its own outcomes, latency and first-call rate, not just a share of the total.

  • 04

    Crashes

    Your handler threw. A bug list, sorted by tool.

  • 05

    Tool errors

    You returned isError deliberately. Healthy in small doses.

  • 06

    Bad arguments

    Validation rejected the call. Usually your schema, not the model.

  • 07

    Empty answers

    Succeeded and returned nothing usable. The failure nobody reports.

  • 08

    Speed

    Four buckets, because percentiles cannot be summed across days.

  • 09

    Result size

    Bytes per answer, which is what context actually costs.

  • 10

    Sessions

    Counted from their own rows, so one crossing midnight counts once.

  • 11

    Cost per session

    What a single conversation with your server spends.

Nightly pass

02:00 UTC. Labelled as of yesterday, because they are.

3 metrics

  • 12

    Retries

    Same tool, inside 30 seconds, with different arguments.

  • 13

    First-call success

    Asked once, got something usable, moved on.

  • 14

    Tool pairs

    Which tools get called one after another.

From the startup payload

Sent once, when your server boots.

2 metrics

  • 15

    Schema size

    What each tool costs in context before anyone asks a question.

  • 16

    Dead tools

    Registered, described, and never once called.

Retries are the hard one, and the one worth having. Within a session, the same tool called twice inside 30 seconds with different arguments is the model rewording and trying again. With the same arguments it is pagination or polling, and it is not a retry. Get that distinction wrong and every well-behaved paginating tool grades as broken.

Find out what your tools are actually doing

Create an MCP, paste the key, restart. The first payload lands before you have finished reading the install page.