MCP认证工具包
MCP服务器的OAuth 2.1。一个工人。五分钟。
每个MCP服务器构建者都遇到了同样的问题:OAuth规范是残酷的。 AuthKit是墙的另一边。
一个单一的Cloudflare Worker+D1数据库,处理整个MCP OAuth规范-- 发现、注册、同意、令牌——这样你的MCP服务器就不必这么做了。
    
在生产中运行 authkit.open0p.com,为OAuth提供支持 OpZero.sh.
______________________________________________________________________
问题
您想构建一个MCP服务器。Claude、ChatGPT和其他客户端需要使用您的服务器对用户进行身份验证。规范说:实现OAuth 2.1。
这意味着RFC 9728(受保护的资源元数据)、RFC 8414(授权服务器元数据)、RFC7591(动态客户端注册)、具有S256的PKCE、同意屏幕、令牌刷新、令牌撤销和多租户支持。在你的第一次工具调用开始之前。
我们花了数周时间与之斗争。然后我们把它撕成了自己的服务。
解决方案
AuthKit是专为MCP构建的独立OAuth授权服务器(约600行)。您的MCP服务器指向其 authorization_servers 到AuthKit,整个OAuth舞蹈——注册、同意、令牌——都发生在这里。
MCP服务器的唯一任务: 验证Bearer令牌。
// Your MCP server's /.well-known/oauth-protected-resource
{
"resource": "https://your-mcp-server.com/mcp",
"authorization_servers": ["https://your-authkit-instance.com"],
"bearer_methods_supported": ["header"]
}这就是整个整合。
它实现了什么
| 规格 | 内容 | 状态 |
|---|---|---|
| RFC 9728 | 受保护的资源元数据 | 每台服务器自动生成 |
| RFC 8414 | 授权服务器元数据 | 完成 |
| RFC 7591 | 动态客户端注册 | 完成 |
| OAuth 2.1 | 授权码+PKCE(S256) | 完成 |
| -- | 令牌刷新(30天TTL) | 完成 |
| -- | 令牌撤销 | 完成 |
| -- | 登录/注册同意屏幕 | 完成 |
| -- | 多租户(多个MCP服务器) | 完成 |
运作原理
Claude / ChatGPT AuthKit (CF Worker + D1) Your MCP Server
| | |
| POST /mcp (no token) | |
|------------------------------------------------------------>|
| 401 + WWW-Authenticate | |
||
| { authorization_servers: ["https://authkit..."] } |
|| |
| { endpoints... } | |
|| |
| { client_id } | |
|| |
| [consent screen] | |
|| |
| 302 -> callback?code=xxx| |
|| |
| { access_token, ... } | |
||
| | GET /oauth/userinfo |
| ||
| [tools response] | |
| enter a strong random string
# Deploy
wrangler deploy住在 https://mcp-authkit..workers.dev.
注册您的MCP服务器
curl -X POST https://your-authkit.workers.dev/api/servers \
-H "Authorization: Bearer YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "My MCP Server",
"resource_url": "https://my-mcp.com/mcp",
"scopes": ["mcp:tools"]
}'答复:
{
"server_id": "srv_abc123...",
"api_key": "sak_xyz789...",
"prm_url": "https://your-authkit.workers.dev/prm/srv_abc123...",
"message": "Set authorization_servers in your PRM to point to this gateway."
}连接您的MCP服务器
将服务器的受保护资源元数据指向AuthKit实例,并通过验证令牌 /oauth/userinfo 终点。就这样
看 集成指南 完整的演练。
API 参考
| 方法 | 端点 | 描述 |
|---|---|---|
GET | /.well-known/oauth-authorization-server | 授权服务器元数据(RFC 8414) |
POST | /oauth/register | 动态客户端注册(RFC 7591) |
GET | /oauth/authorize | 授权+同意UI |
POST | /oauth/token | 代码->与PKCE进行令牌交换 |
POST | /oauth/revoke | 令牌撤销 |
GET | /oauth/userinfo | 访问令牌中的用户信息 |
GET | /prm/:server_id | 自动生成的受保护资源元数据(RFC 9728) |
POST | /api/servers | 注册MCP服务器(管理员) |
GET | /health | 健康检查 |
看 API 参考 有关请求/响应的详细信息。
令牌格式
| 类型 | 前缀 | 生存期 | 示例 |
|---|---|---|---|
| 访问令牌 | mat_ | 1小时 | mat_dhcbqsgb... |
| 刷新令牌 | mrt_ | 30天 | mrt_ydqd0ug1... |
| 验证码 | code_ | 10分钟 | code_zkm6ukm... |
| 服务器API密钥 | sak_ | 永久 | sak_6rvstdl7... |
所有令牌在存储之前都经过哈希(SHA-256)处理。明文在创建时只返回一次。
项目结构
mcp-authkit/
src/
worker.js The entire OAuth gateway (~600 lines)
docs/
integration.md How to wire up your MCP server
api.md Full API reference
how-it-works.md Deep dive on the OAuth flow
decisions.md Why we built it this way
war-story.md 10 attempts, every bug, the full timeline
scripts/
test-flow.sh End-to-end OAuth flow test
schema.sql D1 database schema (7 tables)
wrangler.toml Cloudflare Worker config
package.json战争故事
这个项目之所以存在,是因为我们花了 5天内尝试10次 试图让MCP OAuth在带有Better Auth的Next.js应用程序中工作。在env变量中跟踪换行符、布尔值与字符串同意重定向、将哈希令牌与原始字符串进行比较、缺少OPTIONS处理程序、未记录的配置标志——每个错误都表现为“什么都没发生”
转折点是意识到OAuth是基础设施,而不是产品。把它撕下来。
注意事项
这是一个为真实产品提供动力的参考实现。它不是:
- 具有SLA的维护库
- Auth0/Stytch/职员的替代品
- 大规模的战斗测试(它适用于我们的流量)
用它来学习、分叉、窃取图案。如果您需要支持生产身份验证,请使用专用的身份验证提供程序。
由OpZero制造
OpZero 的 是一个AI原生部署平台。从任何MCP客户端(Claude、Cursor或您自己的代理)将网站发送到Cloudflare、Netlify和Vercel。
AuthKit是为其提供支持的OAuth层。我们将其开源,因为每个MCP构建者都不必对抗相同的规范。
- opzero.sh --从AI部署
- UAT发动机 --基于MCP的AI原生测试(也是开源的)
- @OpZero sh --更多来自OpZero
贡献
欢迎捐款。看 贡献.md 作为指导方针。
许可证
______________________________________________________________________
如果这为您省去了OAuth带来的麻烦,请给 OpZero 的 看一眼-- 这是我们为之构建的部署平台。
