内容
# mcp-auth-gateway
<p align="center">
<strong>
<a href="#快速入门">快速入门</a>
•
<a href="CONTRIBUTING.md">贡献指南</a>
•
<a href="https://github.com/nicknikolakakis/mcp-auth-gateway/issues">联系我们</a>
</strong>
</p>
<p align="center">
<a href="https://github.com/nicknikolakakis/mcp-auth-gateway/actions/workflows/test.yml?query=branch%3Amain">
<img alt="构建状态" src="https://img.shields.io/github/actions/workflow/status/nicknikolakakis/mcp-auth-gateway/test.yml?branch=main&style=for-the-badge&label=tests">
</a>
<a href="https://goreportcard.com/report/github.com/nicknikolakakis/mcp-auth-gateway">
<img alt="Go 报告卡" src="https://goreportcard.com/badge/github.com/nicknikolakakis/mcp-auth-gateway?style=for-the-badge">
</a>
<a href="https://github.com/nicknikolakakis/mcp-auth-gateway/releases">
<img alt="最新版本" src="https://img.shields.io/github/v/release/nicknikolakakis/mcp-auth-gateway?include_prereleases&style=for-the-badge">
</a>
<a href="LICENSE">
<img alt="许可证" src="https://img.shields.io/badge/许可证-Apache%202.0-blue.svg?style=for-the-badge">
</a>
</p>
---
MCP 服务器的通用身份验证网关。包装任何仅限于标准输入/输出的 MCP 服务器,并为其添加 OAuth 2.1 身份验证,通过 Streamable HTTP/SSE 暴露给远程客户端,以便 Claude Desktop、Cowork 和其他 MCP 客户端访问。
## 为什么
大多数 MCP 服务器设计为通过标准输入/输出在本地运行。这使得它们对于需要以下功能的团队来说是不可用的:
- **集中式托管** 在 Kubernetes 或云基础设施上
- **按用户身份验证** 通过企业 SSO(Salesforce、Google、GitHub、Okta、Azure AD)
- **进程隔离** 以便每个用户都有自己的 MCP 服务器实例
- **审计日志** 记录谁使用了哪些工具以及何时使用
没有现有的项目能结合所有这些功能。mcp-auth-gateway 填补了这一空白。
## 架构
```mermaid
graph TD
客户端[MCP 客户端<br/>Claude Desktop / Cowork / 等] -->|HTTPS + Bearer token| 网关
subgraph 网关[mcp-auth-gateway]
OAuth[OAuth 2.1 服务器<br/>PKCE + DCR]
桥接[标准输入/输出-HTTP 桥接<br/>JSON-RPC]
池[进程池<br/>按用户 / singleflight]
Token[令牌注入<br/>Unix 套接字]
end
OAuth -.->|基于配置| OIDC[任意 OIDC 提供商<br/>Google / GitHub / Salesforce / Okta]
池 -->|为每个用户生成| MCP[任意标准输入/输出 MCP 服务器<br/>基于配置]
Token -->|注入凭证| MCP
MCP -->|API 调用| API[上游 API<br/>Salesforce / GitHub / 等]
```
## 功能
- **基于配置**:针对任意 OIDC 提供商和任意标准输入/输出 MCP 服务器的 YAML 配置
- **OAuth 2.1**:PKCE、动态客户端注册、令牌刷新(符合 MCP 规范)
- **按用户隔离**:每个身份验证用户都有一个单独的 MCP 进程
- **安全令牌交付**:Unix 域套接字注入(不是环境变量或文件)
- **可观察性**:结构化 JSON 日志、Prometheus 指标
- **适用于 Kubernetes**:无分发镜像、健康检查、优雅关闭
## 快速入门
### 1. 配置
```yaml
# config.yaml
网关:
基础网址: "https://mcp.yourcompany.com"
监听: ":8080"
oidc:
发行者网址: "https://accounts.google.com"
作用域: ["openid", "email"]
用户 ID 声明: "sub"
允许的域: ["yourcompany.com"]
mcp_server:
命令: "npx"
参数: ["-y", "@modelcontextprotocol/server-github"]
令牌交付: "env"
令牌环境变量: "GITHUB_PERSONAL_ACCESS_TOKEN"
```
### 2. 运行
```bash
# 构建
make build
# 运行
./bin/mcp-auth-gateway --config config.yaml
```
### 3. 从 Claude Desktop 连接
```json
{
"mcpServers": {
"my-server": {
"url": "https://mcp.yourcompany.com/mcp"
}
}
}
```
第一次连接会打开一个浏览器弹出窗口用于 SSO 登录。之后,它就可以正常工作了。
## 示例配置
<details>
<summary>Salesforce</summary>
```yaml
oidc:
发行者网址: "https://login.salesforce.com"
作用域: ["openid", "id", "api", "refresh_token"]
用户 ID 声明: "sub"
mcp_server:
命令: "node"
参数: ["mcp-server/index.js"]
令牌交付: "unix_socket"
令牌环境变量: "SF_TOKEN_FD"
额外环境变量:
SF_INSTANCE_URL: "{{instance_url}}"
ssrf:
验证字段: "urls.custom_domain"
允许列表正则表达式: '^https://[a-z0-9-]+(\.(my|sandbox))?\.salesforce\.com(/.*)?$'
```
</details>
<details>
<summary>GitHub</summary>
```yaml
oidc:
授权端点: "https://github.com/login/oauth/authorize"
令牌端点: "https://github.com/login/oauth/access_token"
用户信息端点: "https://api.github.com/user"
作用域: ["read:user", "repo"]
用户 ID 声明: "id"
mcp_server:
命令: "npx"
参数: ["-y", "@modelcontextprotocol/server-github"]
令牌交付: "env"
令牌环境变量: "GITHUB_PERSONAL_ACCESS_TOKEN"
```
</details>
<details>
<summary>Google Workspace</summary>
```yaml
oidc:
发行者网址: "https://accounts.google.com"
作用域: ["openid", "email", "profile"]
用户 ID 声明: "sub"
允许的域: ["yourcompany.com"]
mcp_server:
命令: "python"
参数: ["-m", "google_workspace_mcp"]
令牌交付: "env"
令牌环境变量: "GOOGLE_ACCESS_TOKEN"
```
</details>
## 开发
```bash
make build # 构建二进制文件
make test # 运行单元测试
make lint # 运行 linter
make run # 使用示例配置运行
```
## 社区
- [贡献指南](CONTRIBUTING.md)
- [行为准则](CODE_OF_CONDUCT.md)
- [安全策略](SECURITY.md)
- [治理](GOVERNANCE.md)
- [路线图](ROADMAP.md)
## 许可证
Apache 2.0 - 请参阅 [LICENSE](LICENSE)。