Open source · MCP and agent skills

Know what you feed your agent.

Every MCP server and every skill you install is loaded into the context window before you type a word, and you pay for it on every request after that. efaimo measures what it costs and audits what you got for it, from your terminal, against your real config.

License
Apache 2.0
Runtime
Node 20+
Target
v0.1, Jul 24
The output of a tool that does not exist yet. Every value is a question mark because nobody has run it, including us.

The cost

You are paying for tools
you never called.

A tool definition is not a link. It is text: a name, a description, and a full JSON Schema for every parameter, for every tool on every server you have switched on. It goes to the model on every request, whether or not the model ever calls it. Skill frontmatter works the same way, loaded up front so the model knows when a skill applies.

None of that is a bug. A model cannot pick a tool it cannot see, and discovery has to be paid for somewhere. But it is a budget, and a budget nobody reads is not a budget.

So how many tokens did your loadout cost you before you typed a word today? If you cannot answer that, that is the whole product.

Servers SHOULD return tools from tools/list in a deterministic order to enable client-side caching and improve LLM prompt cache hit rates.
MCP specification, draft changelog -> The protocol itself now budgets for the prompt cache. Nothing about this is exotic any more.

One thing that is measured The registry that lists these servers proves who published them, with GitHub OAuth and DNS or HTTP domain verification. That is identity, and identity is worth having. It is a different question from what a server costs you once it is loaded, and the registry is still, in its own words, a preview release. Source ->

The tool

Four commands.
One question each.

efaimo is a CLI and nothing else. No account, no hosted service, no config file, no daemon sitting between your agent and your tools. It reads what you already have and prints what it found.

  • efaimo weigh

    What does this cost me?

    Counts the tokens a server or a skill adds to your context, reproducing the way your host actually serializes it. Point it at a stdio command, a URL, a repo, a skill folder, or a whole installed client config.

    mcp + skills v0.1, Jul 24
  • efaimo check --mcp

    Does this survive July 28?

    Runs a server against the 2026-07-28 specification, then against description quality and annotation hygiene. Every rule names the SEP it came from.

    mcp v0.1, Jul 24
  • efaimo check --skill

    Is this skill worth loading?

    Frontmatter schema, trigger collisions across everything you have installed, token budget, reference integrity, injection patterns.

    skills v0.2
  • efaimo test

    Did the skill actually help?

    Runs a task with the skill and without it, then reports the difference. Still a design, not a plan.

    skills designing

Nothing above has been released. The chips are milestones, not states, and they are the only claim on this page that you cannot check yourself in a browser tab.

July 28, 2026

The protocol
goes stateless.

The specification published on 2025-11-25 is being replaced. The release candidate locked on May 21. The final publishes on July 28. The spec calls it a breaking change in those words, and every line below links to the pull request that made it.

  • removed
    initialize, notifications/initialized

    Every request now carries its own protocol version and client capabilities in _meta.

    SEP-2575
  • removed
    Mcp-Session-Id, protocol level sessions

    Cross call state becomes server minted handles, passed back as ordinary tool arguments.

    SEP-2567
  • removed
    Last-Event-ID, SSE resumability

    A broken response stream loses the in flight request. Clients re-issue it as a new one.

    SEP-2575
  • removed
    ping, logging/setLevel, notifications/roots/list_changed

    Log level moves per request into _meta.

    SEP-2575
  • added
    server/discover

    Servers MUST implement it, to advertise supported versions, capabilities and identity.

    SEP-2575
  • added
    resultType on every result

    Either complete, or input_required for a multi round trip interim result.

    SEP-2322
  • added
    Multi Round-Trip Requests

    Replaces every server initiated request: roots/list, sampling/createMessage, elicitation/create.

    SEP-2322
  • added
    Mcp-Method, Mcp-Name

    Now required headers on Streamable HTTP POST requests.

    SEP-2243
  • added
    ttlMs, cacheScope

    Now required on every list and resource read result, so clients can cache and stop polling.

    SEP-2549
  • deprecated
    Roots, Sampling, Logging

    Still fully functional, but new implementations should not adopt them.

    SEP-2577
  • deprecated
    Dynamic Client Registration

    In favor of Client ID Metadata Documents. Kept for servers that do not support CIMD yet.

    PR #2858
  • moved
    Tasks

    Out of the core protocol and into an official extension, io.modelcontextprotocol/tasks.

    SEP-2663
The previous pattern of server-initiated requests is no longer supported. This is a breaking change.
MCP specification, Multi Round-Trip Requests ->

And yet nothing breaks that day.

The same release adopts a feature lifecycle policy with a minimum twelve month deprecation window, so a server written against the old spec keeps working for a year while you move. Hosts are cutting definition cost from their side too. This is not an emergency, and a tool that measures things for a living should be the last one to tell you it is.

It is simply the date on which does mine still comply stops being a matter of opinion. That is what efaimo check --mcp is for.

Method

A number you cannot defend
is worse than no number.

This is a measuring tool, so the measurements are the product and the method is the warranty. Four commitments, and the receipts for them will live in the repo.

  • reproduce

    weigh does not guess from a schema. It reproduces the way a host actually serializes definitions into the prompt, then counts what comes out. The command that produced a number ships next to the number.

  • label

    OpenAI's tokenizer runs exactly, locally. Anthropic's is exact through the count-tokens API and approximate without a key. Gemini's is approximate. The output says which one it used, every time, and the word estimated appears wherever it is earned.

  • cite

    Every check rule names the SEP or the published rubric behind it, like the 12 above. If a rule cannot be cited it is not a rule, it is an opinion, and it ships as a note rather than a failure.

  • dogfood

    The repo carries its own SKILL.md, and it has to pass efaimo check before it ships. Anything that grades other people's work should survive its own grader first.

Nothing here
has shipped.

The npm name efaimo is unclaimed. The GitHub org is empty. v0.1 targets July 24, four days before the specification it checks. You can verify all three of those sentences in under a minute, which is more or less the point.