Skip to main content

Ariadne

Every MCP server you installed, and what it costs you every turn, whether you reach for it or not.

A server is judged once, before you install it. Then it joins every session you run and nothing measures it again.

What she does

A registry grades a server before you install it: where the code came from, what permissions it asks for, what a scanner found. That judgement is made once, from the outside, on a repository. Then you install the server, it becomes part of every session you run, and nothing measures it again.

Ariadne measures the one you already run. She is a Claude Code plugin, and she asks the servers she measures for one thing only, the list of tools they already publish.

The number that matters most is the one nothing else reports: a connected server charges you before you have called it even once. Its tool definitions are injected into every request, each with a name, a description and a JSON schema. Twelve servers with a dozen tools each cost you tens of thousands of tokens on every turn, whether or not you ever use one of them.

What the report says

/ariadne prints the session you are in. The table is the boring half:

text
  knossos
    standing cost   49,207 bytes (~13,669 estimated tokens)
    reach           2/33 tools
    calls           14
    returned        182,904 bytes (~50,807 estimated tokens)
    largest         38,213 bytes, from scan_project
    share           71.4% of MCP bytes returned
    latency p50     412ms
    latency p95     1,204ms

The findings under it are the reason to run her, and each one names its evidence:

text
  3 servers were connected and never called
    context7: 2 tools, 4,864 bytes (~1,351 estimated tokens) injected per request
    chaos: 3 tools, 22,146 bytes (~6,152 estimated tokens) injected per request
    momus: 11 tools, 8,737 bytes (~2,427 estimated tokens) injected per request
    Together they cost 35,747 bytes (~9,930 estimated tokens) on every turn, whether or
    not you reach for them.
    Observed across 6 sessions and 214 tool calls.

  argos has failed to connect in every session since 2026-08-10
    31 failed connections across 22 sessions on 9 days. Last error class: CONNECTION_CLOSED.
    Its tools have not existed for any of them.

A tool that describes itself in nine words and returns 38 KB in a single call stands out immediately. So does a server that stopped connecting a week ago and has been nothing but a config entry ever since.

Every rule carries a minimum sample and stays silent below it. One call is not a measurement, so no p95 appears until a tool has been called five times, and "never called" needs enough watched traffic behind it to mean anything.

Quick start

Needs Bun 1.1 or newer, and nothing else.

bash
claude plugin marketplace add https://aranea-development.nl/plugins/marketplace.json
claude plugin install ariadne@aranea

The first session after install builds the hook binary in the background and says so. From the next session, Ariadne is recording.

Then import the history your machine already has:

bash
ariadne backfill

Standing cost and connection history show up immediately after a backfill and a probe. Reach, latency and result sizes come from the hooks, and the hooks only have something to say once you have run real sessions with real tool calls in them. A report run straight after install shows 0 calls for every server. That is the correct number for a server nothing has called yet.

Three sources, and one that may vanish

Hooks record every tool call: its timing, the size of what went in and what came back, and whether it failed. That source is cheap and stable, and it sees nothing before a call happens.

So a prober connects to each configured server at session start, out of band, asks what it exposes, measures the payload and disconnects. That is the only way to learn the standing cost, because no transcript and no log records a tools/list payload.

The third source is Claude Code's own MCP logs, which have been recording connection attempts on your machine for weeks. Ariadne reads them, which is why she can print a real report on her first run instead of after a week of collecting. That path is undocumented and may move, so that source only ever adds to the picture, and nothing depends on it. If it disappears, the history goes and every other number stands. number stands.

Claude Code's own built-in tools are measured on the same axes, as a baseline. They make the MCP numbers legible, and they never produce a finding, because you cannot uninstall a built-in.

What she does not do

She never disables a server and never edits a config. Cutting one is your decision.

She records the size of tool arguments and the size of results, never the content of either. What came back is usually the most sensitive thing in a session, and a monitor that logs payloads is a second copy of your data in a place nobody is guarding. Server command lines, environments and URLs are never recorded either: claude mcp list prints API keys in its command column, and anything that logged what it enumerated would copy them along with it. Tool names, description lengths and schema shapes are recorded deliberately, because they are the server's published interface and the findings cannot be computed without them.

She does not grade a server. She measures. A grade from one machine's traffic would be a number pretending to be a judgement.

Nothing leaves the machine. There is no network code beyond the prober's connections to your own configured servers, and no export format. Everything lives under ~/.ariadne/.

She adds nothing to your context window unless you ask for a report. A tool whose subject is the cost of things sitting in your context has no business sitting in it.