内容
# mcp-oauth-proxy
将任何本地 **stdio** MCP 服务器封装为 **OAuth 2.1** 前端,以便将其添加为 **claude.ai 自定义连接器**(网页、移动端、桌面端)。
claude.ai 的自定义连接器通过 HTTPS 与远程 MCP 进行通信,并使用 OAuth 2.1(动态客户端注册 + PKCE)进行身份验证——**没有静态的 bearer-token 字段**。此代理提供 OAuth 层,并桥接到 stdio 后端。
## 状态
可用。参见 [`deploy/README.md`](deploy/README.md) 以获取完整的部署指南(Caddy、Tailscale、无头 Obsidian)。设计详情:[`docs/superpowers/specs/2026-07-06-mcp-oauth-proxy-design.md`](docs/superpowers/specs/2026-07-06-mcp-oauth-proxy-design.md)。
## 首个使用场景
公开 [`mcp-obsidian`](https://github.com/MarkusPfundstein/mcp-obsidian) - 使 Obsidian 保险库在任何地方都可供 Claude 访问。后端可配置,因此代理适用于任何 stdio MCP 服务器。
## 架构(简要)
```
claude.ai → Caddy (TLS) → mcp-oauth-proxy (OAuth 2.1 + FastMCP 代理) → stdio 后端 → (tailscale) → Obsidian REST API
```
## 封装其他 MCP 服务器
代理是**与后端无关的**。要公开不同的单个 stdio MCP 服务器:
1. 设置 `MCP_BACKEND_COMMAND` 和 `MCP_BACKEND_ARGS` 以调用您的服务器(默认值:`uvx` 和 `mcp-obsidian`)。
2. 使用 `MCP_BACKEND_ENV_*` 将环境变量转发到后端(例如,`MCP_BACKEND_ENV_API_KEY=secret` 在子进程中变为 `API_KEY=secret`)。
示例:封装 `mcp-github`:
```bash
MCP_BACKEND_COMMAND=uvx
MCP_BACKEND_ARGS=mcp-github
MCP_BACKEND_ENV_GITHUB_TOKEN=ghp_...
```
## 在一个连接器后面放置多个 MCP 服务器
将 `MCP_SERVERS_CONFIG` 设置为已挂载的 JSON 文件(Claude-desktop `mcpServers` 形状),以通过同一个连接器和登录公开多个服务器。当设置时,它会覆盖单个 `MCP_BACKEND_*` 变量。拥有多个服务器时,每个后端的工具都**按其配置键命名**(例如 `obsidian_...`、`github_...`);单个服务器文件保持不变前缀。参见 [`deploy/servers.example.json`](deploy/servers.example.json)。
```json
{
"mcpServers": {
"obsidian": { "command": "uvx", "args": ["mcp-obsidian"], "env": { "OBSIDIAN_API_KEY": "..." } },
"github": { "command": "uvx", "args": ["mcp-github"], "env": { "GITHUB_TOKEN": "..." } }
}
}
```
每个 stdio 服务器的子进程仅接收主机环境允许列表(`PATH` 等)加上其自己的 `env` 块 - 代理的秘密环境永远不会转发。