如果您的 MCP 服务器使用 OAuth, 每个目录都认为它没有工具

2026年8月22日1 次浏览来源:Dev.to阅读原文

我们运送了一个远程的MCP服务器, 到处注册, 然后发现一些奇怪的东西: 每个目录都列出它根本没有工具。

不是错误的工具。

不算数 Zero.

Glama的API回了这个:Smithery的页面没有做同样的事情.

Mcp.

Directory也是一样。 4个工作工具,生态系统中的每一个发现表面都说服务器什么也没做.

如果您在 OAuth 2.1 后面运行一个远程的 MCP 服务器, 这几乎肯定发生在您身上, 而您的日志中没有任何信息会告诉你。

为什么会这样 MCP客户端发现服务器可以通过调用.

这是一个正常的JSON-RPC方法,如果你把你的处理器包入一个认证——这些文件以及每一个例子都鼓励它——那么,它和其他所有的东西都与认证一样。

我们的处理者看起来是这样的:正确,而且非常明智。

每个工具呼叫都花费信用,所以每个工具呼叫都需要一个用户.

但一个目录爬行者没有账户.

它进行握手,得到一个401,并记录它可以看到的东西——一个名字,一个URL,和一个空的能力列表.

它无法区分"这个服务器需要认证"和"这个服务器什么都不做"之间的区别.

最能说明问题的是Smithery的扫描日志: 它停止了死亡。

在人类通过互动 OAuth 授权点击后,它才得到: 它的扫描仪发现了全部四个——但是这个结果来自于一次性的人类授权,它不是公共页面所制作的.

因此上市仍然告诉访客服务器没有能力.

为什么比看起来MCP目录更重要的是发现层.

有人浏览服务器读取工具列表以决定是否安装.

一个没有工具的上市并不是一个软弱的上市,它是一个枯萎的上市——而每一个反射出另一个目录的目录都会向前复制出"虚空".

您可以在每一个存在且仍然隐形的注册处注册.

修正描述服务器提供的东西不是特权操作.

调用这些工具是。

所以他们分开: 3个缩小 使这个无法成为验证的绕道 这是值得仔细复制的部分。

每一个问题都有其具体原因。

1.

标题表示验证。

如果请求带有一个符号,即使该方法是公开的,它也会走经认证的路径.

如果没有这个,持有已过期代币的客户会默默地回归匿名访问,而不是得到触发刷新的401.

悄悄地失败比失败更糟。

2.

仅限职位。

在可流式HTTP中,打开SSE流并终止会话.

也没有携带一个JSON-RPC方法,你可以检查,所以也不能归类为公开.

他们继续认证

3.

每条信息都是批发的,而不仅仅是一份.

JSON-RPC允许分批.

与批量混合不是公开请求。

从来没有。

还有一条第二道防线: 公道运行时没有上下文的呼叫器,所以如果一个到达它,充电功能就找不到用户并拒绝.

大门从两个方向关闭。

检查一下 实际伤害的失败模式是失去OAuth的发现.

如果你的401停止广告, 符合要求的客户 不再知道在哪里认证, 并且他们失败 默默无闻,而不是催促。

请明确选中: 请检查 Expected , 无 auth 200 , 无 auth 完整工具列表 , 无 auth 401 用无效的代号 401 Batch 混合 + 401 (SSE 流) , 在任何 401 存在时无 auth 401 , 其中最后一行是实际运行的 : 你想看看吗?

更改后,Smithery的扫描仪在完全没有浏览器步骤的情况下运行了干净: 这个在路上发现的虫子 再看那条日志线: 在修复前,它说: 从默认到v.1.0,如果你不设置它.

我们没有。

因此,我们的服务器一直以图书馆的占位符名称向每一个连接的客户端——克洛德桌面,克索尔,所有客户端——介绍自己.

一行:它与.在同一个选项对象中进行.

现在值得检查一下你的,它不花任何代价 并且是每个客户展示的字符串。

外卖 如果您运行带有认证的远程 MCP 服务器, 请访问

分享