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 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.
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 weighWhat 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.
-
efaimo check --mcpDoes 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.
-
efaimo check --skillIs this skill worth loading?
Frontmatter schema, trigger collisions across everything you have installed, token budget, reference integrity, injection patterns.
-
efaimo testDid the skill actually help?
Runs a task with the skill and without it, then reports the difference. Still a design, not a plan.
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 SEP-2575
initialize, notifications/initialized Every request now carries its own protocol version and client capabilities in _meta.
- removed SEP-2567
Mcp-Session-Id, protocol level sessionsCross call state becomes server minted handles, passed back as ordinary tool arguments.
- removed SEP-2575
Last-Event-ID, SSE resumabilityA broken response stream loses the in flight request. Clients re-issue it as a new one.
- removed SEP-2575
ping, logging/setLevel, notifications/ roots/ list_changed Log level moves per request into _meta.
- added SEP-2575
server/discover Servers MUST implement it, to advertise supported versions, capabilities and identity.
- added SEP-2322
resultType on every resultEither complete, or input_required for a multi round trip interim result.
- added SEP-2322
Multi Round-Trip RequestsReplaces every server initiated request: roots/
list, sampling/ createMessage, elicitation/ create. - added SEP-2243
Mcp-Method, Mcp-NameNow required headers on Streamable HTTP POST requests.
- added SEP-2549
ttlMs, cacheScopeNow required on every list and resource read result, so clients can cache and stop polling.
- deprecated SEP-2577
Roots, Sampling, LoggingStill fully functional, but new implementations should not adopt them.
- deprecated PR #2858
Dynamic Client RegistrationIn favor of Client ID Metadata Documents. Kept for servers that do not support CIMD yet.
- moved SEP-2663
TasksOut of the core protocol and into an official extension, io.modelcontextprotocol/
tasks.
The previous pattern of server-initiated requests is no longer supported. This is a breaking change.
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.