Skip to content

Build Not yet confirmed elsewhere1 publisher 2 min read Published

Wrap OAuth around all of MCP and the directories report zero tools

A developer's four-tool server read as empty on glama, Smithery and mcp.directory, because tools/list arrives without a token. The fix is a four-method allowlist.

The Engineer · Build desk

Send a correction

What happened

  • A remote MCP server behind OAuth 2.1 was registered across the directories, and every one of them listed it as having no tools.
  • glama's API returned the server with its name and hosting attributes intact and an empty tools array.
  • Smithery's page and mcp.directory showed the same nothing for a server running four working tools.
  • Smithery's scanner log halted at an authorization prompt and only recorded four tools after a human completed the OAuth flow by hand.
  • The cause was placement: tools/list is an ordinary JSON-RPC method, so wrapping the handler put capability discovery behind the token.

Why it matters

  • What it limits constraint Registry coverage buys nothing without a capability list, and because directories mirror each other, the empty version travels further than any correction will.
  • What doesn't add up contradiction Smithery holds four tools from an authorized scan while its public page shows none, so asking a directory to re-crawl does not fix an operator's listing; only changing the server does.
  • What it costs cost The bill arrives as installs that never happen, and it never shows up in server logs, so the detector of last resort is a human reading your own directory page.
  • What's now possible capability Splitting the surface lets an anonymous crawler read the tool list while anything touching credits or user data stays gated, with the charging path refusing calls that arrive with no caller.

The allowlist that repairs this is four method names long: initialize, notifications/initialized, ping, and tools/list [12]. Nothing on that list spends money, which is the test the author of the dev.to writeup applies. Describing what a server offers is not privileged, and calling those tools is [12]. The original wrapper was not sloppy, either. Every tool call in that server spends credits, so every tool call needs an identified user [7], and the docs and examples encourage wrapping the handler [6]. The wrapper simply also caught the one method that costs nothing to answer.

The conditions around the allowlist are the part worth reading twice, because each is a failure someone else will rediscover in production. A request carrying an Authorization header goes down the authenticated path even when its method is public; skip that and a client holding an expired token gets quiet anonymous service instead of the 401 that triggers a refresh [13]. The gate applies only to POST, because in Streamable HTTP a GET opens the SSE stream and a DELETE ends the session, and neither carries a JSON-RPC method you can inspect [14]. And since JSON-RPC permits batching, the check has to hold for every message in the array rather than any of them, or a tools/call rides in beside a tools/list [15].

That last condition has a runtime price: the classifier clones and parses the body of every POST before it knows whether auth applies [17]. Behind it sits a second stop. The public path runs with no caller in context, so a tools/call that slipped through finds no user and the charging function refuses [16]. The author also names the mistake that would cost more than an empty listing: a hand-rolled 401 that stops advertising WWW-Authenticate, which strips compliant clients of the header they rely on for OAuth discovery [19].

Three separate directories published the same empty array for the same server [18], which says the emptiness is not one crawler's bug but the predictable output of an anonymous handshake meeting a blanket 401 [8]. A crawler cannot distinguish "requires auth" from "does nothing" [8], and neither can your logs, where its 401 looks like any other unauthenticated request [20]. Middleware that wraps an exported handler operates at the granularity of the transport, not the method, and MCP's first useful move is anonymous by construction [4]. Auth strength was never in question here. Placement was, and placement is the thing no test suite was watching.

What to watch

  • Whether glama, Smithery or mcp.directory start rendering capabilities captured under an authorized scan instead of the anonymous one, and whether they label "auth required" separately from "no tools".

Clarity's read

What the record supports and how the coverage leans. The claims behind it follow.

Reality

Evidence52
Adoption28
Hype gap+22
Incentives58
Confidence56
Why these scores

Claim ledger

Ranked by verification strength, evidence, and original report placement.

  1. [1]

    A developer shipped a remote MCP server behind OAuth 2.1, registered it across directories, and found every directory listing it as having no tools at all.

    Reported Supported Source: dev.to post by the FrameThrower authorView cited source
  2. [2]

    glama's API returned the server as {"name": "FrameThrower MCP Server", "attributes": ["author:official", "hosting:remote-capable"], "tools": []}.

    Reported SupportedView cited source
  3. [3]

    Smithery's page and mcp.directory rendered the same empty capability list for a server with four working tools.

    Reported SupportedView cited source

Get this ledger inside ChatGPT. Ask about any of our stories and the answer brings its figure, each claim’s verdict and the sources. Free, no account.

Add to ChatGPTAdd to Claude

Sources

1 independent publisher whose own reporting we read for this story.

  1. dev.to

    1 article · August 22, 2026

    If your MCP server uses OAuth, every directory thinks it has zero tools

Share your take

Let Clarity write the post for you.

Signed-in readers get a short post drafted on this story in the register they choose — narrative, analytical, or a direct position — editable to the last word before it goes anywhere. The share buttons at the top of this story work without an account.

Topics and entities

Follow any of these and your For You feed starts watching them — no settings page required.

Topics

Entities

Loading related stories