Token导航 LogoToken导航

MCP Server · 安全风控

self hosted oauth MCP

一个自托管的MCP服务器,支持OAuth 2.0认证,使用Keycloak作为身份提供者,适用于需要自主控制基础设施的场景。

stdio官方级别未说明来源级核验工具 2
自托管Python安全

快速开始

作者 / 组织
OhadRubin
提供方
OhadRubin
运行时
Python

工具数量

2

来源目录标注

资源数量

0

来源目录标注

提示词数量

0

来源目录标注

GitHub Star

0

仓库热度

收录来源

1 个

MCP World

选型结论

self hosted oauth MCP 属于安全风控类 MCP Server,公开资料标注 2 个工具,通过stdio 本地进程接入,客户端适配情况以官方文档为准,有可以直接复制的安装命令;接入前要先准备 OAuth 授权。

分类

安全风控

传输方式

stdio

认证方式

OAuth 授权

部署方式

公开资料未说明

安装与配置

安装命令

uv run python client.py

公开命令不是通用的启动方式,拼不出可靠配置示例;请在客户端 MCP 配置里按官方文档填写 command 和 args。

上手步骤

  1. 1

    准备运行环境

    stdio 服务在本地起进程,需要先装好 Python,再按安装命令拉取依赖。

  2. 2

    安装服务

    复制下面的安装命令执行;命令里带占位符的位置换成自己的密钥或路径。

  3. 3

    写入客户端配置

    在客户端的 MCP 配置里填启动命令和参数,保存后完全退出客户端再打开,让新配置生效。

  4. 4

    验证是否可用

    连接成功后客户端会列出 2 个工具,随便调一个只读工具确认能返回结果。

接入前确认

不要直接授予不必要的文件、网络或账号权限;先核对安装命令和配置内容。

详细介绍

自托管OAuth MCP服务器

一个自托管的MCP(模型上下文协议)服务器,使用Keycloak作为身份提供者进行OAuth 2.0身份验证。此设置允许您完全在自己的基础设施上运行受OAuth保护的MCP服务器,并支持动态URL(ngrok、反向代理等)。

特性

  • 使用PKCE的完整OAuth 2.0授权代码流
  • 动态客户端注册(DCR)支持
  • 适用于ngrok和其他反向代理
  • Keycloak作为身份提供者
  • FastMCP发行JWT代币
  • 预配置的测试用户和客户端

建筑

┌─────────────┐      ┌─────────────────┐      ┌──────────────────┐
│   Client    │─────▶│  nginx (:9000)  │─────▶│  mcp-server      │
│             │      │                 │      │  (:8007)         │
└─────────────┘      │  /mcp ──────────┼─────▶│  FastMCP + OAuth │
                     │                 │      └──────────────────┘
                     │  /realms/* ─────┼─────▶┌──────────────────┐
                     │  /authorize     │      │  Keycloak        │
                     │  /token         │      │  (:9090)         │
                     └─────────────────┘      └──────────────────┘
  • 引擎X:端口9000上的反向代理,路由MCP流量和OAuth端点
  • 钥匙斗篷:OAuth 2.0/OpenID连接身份提供者
  • mcp服务器:带有DynamicOIDCProxy的FastMCP服务器,用于URL感知身份验证

先决条件

  • Docker和Docker Compose
  • Python 3.11+(用于本地开发/测试)
  • 紫外线 (Python包管理器)

快速开始

  1. 启动服务:
   docker compose up -d
  1. 等待初始化 (大约需要30秒):
   docker compose logs -f keycloak-init

init服务会自动配置Keycloak并将凭据写入 .env.

  1. 使用预先生成的令牌进行测试:
   uv run python client.py
  1. 使用完整的OAuth流程进行测试:
   uv run python oauth_client.py http://localhost:9000

配置

默认凭据

设置值
领域mcp
客户端IDmcp-server
测试用户user / password
管理控制台http://localhost:9090 (admin / admin)

环境变量

这 keycloak-init 服务创建了一个 .env 文件包含:

变量描述
KEYCLOAK_CLIENT_IDOAuth客户端ID
KEYCLOAK_CLIENT_SECRETOAuth客户端密钥(自动生成)
MCP_TOKEN预先生成的JWT访问令牌用于测试

服务器环境变量

变量默认值描述
KEYCLOAK_URLhttp://localhost:9090JWKS的内部密钥斗篷URL
KEYCLOAK_PUBLIC_URLhttp://nginx:80通过nginx创建密钥斗篷URL
KEYCLOAK_REALMmcpKeycloak领域名称
KEYCLOAK_CLIENT_IDmcp-serverOAuth客户端ID

用法

选项1:直接令牌身份验证

使用来自的预生成令牌 .env:

import asyncio
from fastmcp import Client
from dotenv import load_dotenv
import os

load_dotenv()

async def main():
    async with Client(
        "http://localhost:9000/mcp",
        auth=os.getenv("MCP_TOKEN"),
    ) as client:
        tools = await client.list_tools()
        print("Tools:", [t.name for t in tools])

        result = await client.call_tool("hello", {"name": "World"})
        print(result.content[0].text)

asyncio.run(main())

选项2:完整的OAuth流程

运行执行完整授权代码流的OAuth客户端:

uv run python oauth_client.py http://localhost:9000

这将:

  1. 发现OAuth端点
  2. 注册为动态客户端
  3. 打开浏览器进行用户登录(使用 user / password)
  4. 代币的交换授权码
  5. 使用访问令牌调用MCP工具

接触互联网(ngrok)

要与外部客户端一起使用或测试来自不同来源的OAuth流:

  1. 开始ngrok:
   ngrok http 9000
  1. 使用ngrok URL进行测试:
   uv run python oauth_client.py https://your-subdomain.ngrok-free.app

服务器自动检测来自的公共URL X-Forwarded-* 并相应地调整所有OAuth URL。

端点

端点描述
/mcpMCP服务器(可流式传输http)
/.well-known/oauth-authorization-serverOAuth服务器元数据
/.well-known/oauth-protected-resource/mcp受保护的资源元数据
/authorizeOAuth授权端点
/tokenOAuth令牌端点
/register动态客户端注册
/realms/mcp/...Keycloak OIDC端点(代理)
/debug显示请求标头的调试端点

MCP工具

服务器提供了两个示例工具:

  • 你好(姓名:str):返回问候语(hello, {name})
  • add(a:int,b:int):将两个数字相加

项目结构

.
├── docker-compose.yml    # Service orchestration
├── Dockerfile            # MCP server container
├── nginx.conf            # Reverse proxy configuration
├── server.py             # FastMCP server with DynamicOIDCProxy
├── client.py             # Simple test client (uses pre-generated token)
├── oauth_client.py       # Full OAuth flow test client
├── setup_keycloak.py     # Keycloak configuration script
├── realm-export.json     # Keycloak realm import config
├── pyproject.toml        # Python dependencies
└── .env                  # Generated credentials (gitignored)

发展

本地设置

# Install dependencies
uv sync

# Run server locally (requires Keycloak running in Docker)
uv run python server.py

重建MCP服务器

docker compose build mcp-server
docker compose up -d mcp-server

查看日志

# All services
docker compose logs -f

# Specific service
docker compose logs -f mcp-server
docker compose logs -f keycloak

重置所有内容

docker compose down -v
rm -f .env
docker compose up -d

运作原理

动态OIDC代理

服务器使用自定义 DynamicOIDCProxy 扩展FastMCP的类 OIDCProxy 要支持动态URL,请执行以下操作:

  1. 动态URL检测:从中提取公共URL X-Forwarded-Proto 和 X-Forwarded-Host 标头
  2. URL重写中间件:在响应中将内部URL(nginx、keycloak、localhost)重写为公共URL
  3. 动态代币交换:使用检测到的公共URL进行OAuth令牌交换redirect_uri
  4. 灵活的令牌验证:跳过发行者验证,以支持使用不同公共URL发行的令牌

OAuth流

  1. 客户端从以下位置发现OAuth端点 /.well-known/oauth-authorization-server
  2. 客户端通过以下方式动态注册 /register
  3. 客户端将用户重定向到 /authorize PKCE挑战
  4. 用户使用Keycloak进行身份验证
  5. Keycloak重定向回MCP服务器 /auth/callback
  6. MCP服务器与Keycloak交换代码并发出FastMCP JWT
  7. 客户端通过以下方式交换FastMCP令牌的授权码 /token
  8. 客户端使用访问令牌调用MCP工具

故障排除

“不记名代币被拒绝”

  • 检查Keycloak是否正常: docker compose ps
  • 查看令牌验证日志: docker compose logs mcp-server
  • 服务器跳过颁发者验证以获得动态URL支持

“无效的redirect_uri”

  • 确保realm-export.json具有 "redirectUris": ["*"]
  • 更改后重建: docker compose down -v && docker compose up -d

“连接被拒绝”

  • 等待所有服务启动: docker compose ps
  • 检查Keycloak健康状况: curl http://localhost:9090/health

与ngrok的代币交换失败

  • 确保nginx正在转发X-Forwarded标头
  • 检查调试终结点: curl https://your-ngrok-url/debug

安全说明

  • 默认配置使用开发设置(无SSL,简单密码)
  • 生产:

- 通过nginx启用HTTPS - 使用强凭据 - 考虑使用固定的公共URL启用颁发者验证 - 查看Keycloak安全设置

  • 这 .env 文件包含机密,不应提交

许可证

麻省理工学院

工具与能力

工具数量

2

资源数量

0

提示词数量

0

能力标签

自托管Python本地部署OAuth2.0身份认证KeycloakMCP协议

数量来自来源目录的标注,具体工具清单以官方文档为准。

典型使用场景

资产与漏洞排查

批量查询资产和漏洞信息,输出待修清单。

日志审计

从日志里筛出异常访问和高风险操作。

合规检查

按规则核对配置项,记录不符合项。

选择建议

值得选的地方

  • 只提供 2 个工具,职责集中,接入后不容易误操作。
  • 有现成的安装命令,不用自己找入口,照着跑就能起服务。
  • 公开说明写得比较完整,接入前能看清能力边界。

先想清楚的地方

  • stdio 方式要求本地装好 Python,换机器要重新装一遍。
  • 需要自备OAuth 授权,没有凭据没法直接试。
  • 第三方目录整理,版本更新和行为细节以官方仓库为准。

更适合

  • 需要在安全风控场景里让模型直接调用外部能力的人。
  • 想先快速试一下、能接受在本地跑服务的人。

不太适合

  • 完全不想在本地装环境的人。
  • 暂时拿不到OAuth 授权的人。
  • 需要厂商级 SLA 和技术支持的生产环境。

同类对比

5 个同类
MCP Server工具数传输方式安装命令收录来源最后核验
self hosted oauth MCP

MCP World · 本页

2stdio有1 个2026-05-17
Modelcontextprotocol C22988b0

MCP World

0stdio有1 个2026-05-17
Hexstrike AI

MCP World

0stdio有1 个2026-05-17
Cyber Strike AI

MCP World

75未说明未标注1 个2026-05-17
MCP Scan

MCP World

0stdio有1 个2026-05-17

按同分类和工具数量挑出最接近的几条,字段以各自详情页为准。

常见问题

5 条

self hosted oauth MCP 怎么安装?

公开资料给出的安装命令是 uv run python client.py,运行环境为 Python。装完后按客户端要求写进 MCP 配置,重启客户端生效。

self hosted oauth MCP 怎么在 Claude Desktop、Cursor 里配置?

它是stdio 本地进程,客户端配置里要写启动命令和参数,运行环境是 Python;保存后完全退出客户端再打开,配置才会生效。

self hosted oauth MCP 收费吗?

本站只整理公开资料,不代收费用,也没有标注具体价格。是否收费取决于服务本身和背后的接口额度,正式使用前按官方说明确认。

self hosted oauth MCP 需要 API Key 吗?

公开资料标注的认证方式是OAuth 授权,也就是要先拿到凭据才能连上;凭据只填在自己本地的配置里,不要写进公开仓库。

self hosted oauth MCP 支持哪些客户端?

公开资料没有标注具体客户端;能配置本地 MCP 命令的客户端都能接,配置方式参照官方文档。

来源信息

继续浏览同类 MCP