使用说明
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存储(客户端、令牌、身份验证代码)是全局的/跨服务器共享的——它们只是在测试
