返回市场
MCP服务器客户端增强认证

MCP服务器客户端增强认证

作者:Nick-Lucas2 星标更新:2025-09-23

项目介绍

带有更好认证的MCP客户端和服务端

该项目的目标是提供一个模型实现的Model Context Protocol Typescript SDK,该SDK在服务端和客户端上运行,并通过流式HTTP传输,同时使用由Better Auth提供的外部OAuth服务器。

尽管目前还远非“模型”,但由于MCP和BetterAuth文档中的空白以及此仓库中展示并解决的一系列问题,代表了SDK的一些粗糙边缘。可能有一些更正确的方法来解决问题,欢迎反馈(和PR)以改进实现。

资源

项目组件

  • auth-server:启用MCP插件的Better Auth实现。MCP插件基本上启用了带有动态客户端注册的oauth2.1端点。基于drizzle-orm sqlite数据库构建,已配置Better Auth及其迁移。
  • auth-ui:一个简单的Vite/TanStack-Router项目,包含一个重定向页面,用于通过GitHub登录Better Auth。
  • mcp-server:一个具有StreamableHTTP传输的MCP服务器,以及用于代理到auth-server的oauth请求的ProxyOAuthServerProvider。
  • mcp-client-cli:一个简单的交互式CLI,它使用MCP客户端SDK与mcp-server通信并协商身份验证。

配置

pnpm install

# 设置sqlite数据库
pnpm db:migrate

# 启动MCP服务器、认证服务器和UI
pnpm dev

# 启动MCP客户端CLI
pnpm cli

在交互式CLI中使用MCP

pnpm cli

> echo ping pong

# 您将被提示登录,请完成此操作

> echo ping pong
# > Hello Nick Lucas: ping pong

在Claude Code中使用MCP

claude mcp add mcp-demo http://localhost:3001/mcp -t http

claude
> /mcp
# 选择mcp-demo

> 1. 认证
# 完成登录

> echo ping pong
# > Hello Nick Lucas: ping pong

当前可能存在解决方案的问题

> Better Auth的MCP插件未实现/userinfo

为了传递用户详情和令牌过期时间等细节,这些信息需要从认证服务器获取,但Better Auth当前并未提供oauth /authinfo端点,尽管它在.well-known/oauth-authorization-server中记录了一个。当他们的oauth2.1支持落地且MCP插件被弃用时,这种情况应该会改变。

另一种方法是使用JWT,并使用认证服务器的JWKs来验证令牌,Better Auth确实提供了jwt插件,但如何获得带有声明的JWT并返回给客户端并不明显。

目前我们不得不手动实现/userinfo端点。

> OAuthClientProvider没有提供延迟启动回调服务器的方法以处理oauth重定向

理想情况下,当MCP客户端SDK触发身份验证流程时,客户端有机会启动一个HTTP服务器并确定其回调URL。如果你已经在一个URL上运行,因为你是web客户端或API,这很容易,但对于CLI来说,在启动服务器时你需要选择一个可用的端口。但是get redirectUrl()不能是一个Promise,因此当你创建OAuthClientProvider实例时,你必须已经知道端口。

理想情况下,这个接口会被设计得稍微不同一些,以便可以延迟启动HTTP服务器并返回其URI。

> ProxyOAuthServerProvider验证client_secret但没有机制在客户端注册后缓存它们

上述文件中有丰富的细节,但基本上MCP客户端、MCP服务器和认证服务器都需要知道给定客户端的client_id->client_secret映射。我们在实例化ProxyOAuthServerProvider时被迫实现getClient,但registerClient对用户不可见。我能看到的两个解决方案是:

  1. 使用ProxyOAuthServerProvider时不验证client_secret,因为这是认证服务器的责任,并从ProxyOAuthServerProvider中移除getClient,因为它不需要。
  2. 提供一种覆盖ProxyOAuthServerProvider使用的clientStore的方法,这样你可以维护自己选择的缓存。