OAuth MCP服务器

一个基于Flask的Dataiku标准Web应用,通过OAuth 2.1安全协议暴露Dataiku代理工具作为MCP服务器,支持多个独立的MCP服务器,每个服务器拥有自己的工具和OAuth配置。

  • by JedIV
  • JavaScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 JedIV/mcp-oauth-server

使用说明

Dataiku MCP OAuth服务器

Dataiku标准Web应用程序(Flask后端)将Dataiku代理工具公开为 主控程序 由OAuth 2.1保护的服务器。支持 多个独立的MCP服务器,每个都有自己的工具和OAuth配置。像Claude Desktop、Claude Code、ChatGPT和VS Code这样的MCP客户端可以连接、验证和使用您的Dataiku代理作为工具。

建筑

一个Dataiku网络应用程序为 管理用户界面 和 多个MCP端点,每个配置的服务器一个:

MCP Client (Claude Desktop, etc.)
  |
  +-- POST /servers/<name>/mcp                  -- MCP StreamableHTTP (JSON-RPC 2.0)
  +-- GET  /servers/<name>/.well-known/...      -- OAuth discovery (PRM, OIDC, AS metadata)
  +-- POST /servers/<name>/oauth/register       -- Dynamic Client Registration (or proxy)
  +-- GET  /servers/<name>/oauth/authorize      -- Authorization (or redirect to external IdP)
  +-- POST /servers/<name>/oauth/token          -- Token exchange (or proxy)

Admin (Dataiku UI iframe)
  +-- GET/POST /admin/config                    -- Global config
  +-- GET/POST /admin/servers                   -- Server CRUD
  +-- DELETE   /admin/servers/<name>
  +-- GET/POST /admin/presets                   -- OAuth preset CRUD
  +-- DELETE   /admin/presets/<key>
  +-- GET      /admin/agents                    -- List available agent tools
  +-- POST     /admin/discover                  -- OIDC endpoint auto-discovery
  +-- GET      /admin/health                    -- Health check (per-server status)

多个服务器

每台服务器都有:

  • 它自己 MCP端点 在 /servers/<name>/mcp
  • 它自己 OAuth流程 (发现、注册、授权、令牌交换)
  • 它自己 代理工具 (项目+工具选择)
  • 它自己 OAuth预设 (从共享预设中选择)

这允许将不同的工具集暴露给不同的客户端或团队,每个客户端或团队都有独立的身份验证。

OAuth模式

该Web应用程序支持三种OAuth模式,配置为 预设 它们在服务器之间共享:

模式 用例 工作原理
内建 测试与开发 自带OAuth服务器 admin/admin 凭证
外部IdP(代理) Entra ID、Okta、Auth0等。 为不支持MCP DCR流的IdP代理DCR+auth
直接OAuth 2.1 钥匙斗篷等。 符合DCR标准的服务器;我们只是通过内省来验证令牌

文件

此仓库包含构成Dataiku标准Web应用程序的四个源文件:

文件 描述
params.python Flask后端-MCP协议、OAuth代理、令牌验证、管理员API、服务器+预置管理
params.html 管理UI标记——服务器和OAuth预设的选项卡
params.js 管理UI逻辑——服务器CRUD、预设CRUD、代理工具加载、健康显示
params.css 管理界面的样式

这些文件通过网络应用程序设置API部署到Dataiku。他们是 不 独立运行——它们在Dataiku webapp框架内运行,该框架提供Flask app 对象, getWebAppBackendUrl(),以及JS的IIFE包装器。

部署

该网络应用程序存在于Dataiku项目中 MCP_WITH_OAUTH,网络应用程序ID ylZBBDE.

要部署更改,请执行以下操作:

import dataiku
project = dataiku.api_client().get_project("MCP_WITH_OAUTH")
webapp = project.get_webapp("ylZBBDE")
settings = webapp.get_settings()
raw = settings.get_raw()

# Update files
for ext, key in [('python', 'python'), ('html', 'html'), ('js', 'js'), ('css', 'css')]:
    with open(f'params.{ext}') as f:
        raw['params'][key] = f.read()

settings.save()
webapp.stop_backend()
webapp.start_or_restart_backend()

配置

配置存储在以下项目变量中 mcp_oauth_config (v2格式):

{
  "config_version": 2,
  "base_url": "https://...",
  "presets": {
    "builtin-test": {
      "name": "Built-in (Testing)",
      "oauth_mode": "builtin",
      "oauth_enabled": true,
      "scopes": ["mcp:tools"]
    },
    "entra-prod": {
      "name": "Entra ID - Production",
      "oauth_mode": "external",
      "oauth_enabled": true,
      "authorization_server": "https://login.microsoftonline.com/{tenant}/v2.0",
      "client_id": "...",
      "client_secret": "...",
      "scopes": ["api://.../mcp.tools"]
    }
  },
  "servers": {
    "default": {
      "display_name": "Default",
      "active_preset": "entra-prod",
      "agent": { "project_key": "MCP_WITH_OAUTH", "tool_ids": ["ysAhcfA"] }
    },
    "analytics": {
      "display_name": "Analytics Tools",
      "active_preset": "builtin-test",
      "agent": { "project_key": "ANALYTICS", "tool_ids": ["tool1"] }
    }
  }
}

较旧的配置格式(仅限v1平面或预设)在首次加载时会自动迁移到v2。

关键设计决策

  • 烧瓶 (不是FastAPI)-与Dataiku的内置webapp框架配合使用
  • 多台服务器 --每个服务器都有自己的端点路径、工具和OAuth预设,而预设是全局共享的
  • OAuth代理模式 --对于像Entra ID这样不支持MCP动态客户端注册的IdP,Web应用程序充当代理:OIDC发现指向自我, /oauth/* 端点转发到外部IdP,同时在DCR支持中进行填隙
  • 没有PyJWT的JWT验证 --stdlib base64 解码+索赔检查。安全,因为我们自己代理代币交易所,所以代币来源是可信的
  • 项目变量中的配置 --不需要外部数据库;配置在重新启动后仍然有效
  • 通过Dataiku会话进行管理员身份验证 --管理员端点检查DSS会话Cookie, X-DKU-AuthenticatedUser 头,或API键
  • 服务器名称为URL slug --必须是带连字符的小写字母数字,直接用于端点URL

陷阱

  • Dataiku将webapp JS封装在IIFE中——所有函数都必须分配给 window 为了 onclick 处理人员工作
  • Entra ID拒绝 resource 参数(RFC 8707),当作用域存在时,代理会将其删除
  • Claude Desktop使用自己的client_id进行刷新令牌请求(与DCR client_id不同)
  • Dataiku网络应用程序代理剥离 Referer 标头但转发Cookie——身份验证检查使用 dss_access_token_ Cookie作为可靠信号
  • 内置的OAuth存储(客户端、令牌、身份验证代码)是全局的/跨服务器共享的——它们只是在测试