Windmill 的 UI 里有一个「Generate MCP URL」按钮,点进去选文件夹、生成 URL、复制,几步操作。但如果你要在多台机器上部署,或者想把它写进部署脚本里,每次都开浏览器就不太现实了。
其实这个操作完全可以用一条命令完成。
核心思路 链接到标题
Windmill 的 MCP Server 支持两种接入方式:
- OAuth 流:交互式,适合桌面端工具(Claude Desktop、Cursor)
- Token 方式:无交互,适合 CLI、自动化脚本、AI Agent
本文聚焦 Token 方式。核心就是创建一个带特定 scope 的 API Token,然后用它构造 MCP URL。
操作步骤 链接到标题
1. 调用 API 创建 MCP Token 链接到标题
MCP_TOKEN=$(curl -X POST http://<windmill-host>/api/users/tokens/create \
-H "Authorization: Bearer $WM_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"label": "my-mcp",
"scopes": ["mcp:scripts:f/ebooks/*"]
}')
关键在 scopes 字段。它的格式决定了暴露哪些工具。
2. 构造 MCP URL 链接到标题
echo "http://<windmill-host>/api/mcp/w/<workspace-id>/mcp?token=$MCP_TOKEN"
把 <windmill-host> 换成你的 Windmill 实例地址,<workspace-id> 换成你的 workspace ID(通常是 default)。
3. 注册到 MCP 客户端 链接到标题
以 OpenClaw 为例:
openclaw mcp set windmill '{
"url": "http://<windmill-host>/api/mcp/w/<workspace-id>/mcp?token=<MCP_TOKEN>",
"transport": "streamable-http"
}'
验证:
openclaw mcp probe windmill
# → windmill: N tools
Scope 格式详解 链接到标题
scope 参数决定了 MCP Server 暴露哪些工具,格式非常灵活:
| scope | 暴露内容 |
|---|---|
mcp:scripts:f/ebooks/* |
仅暴露 f/ebooks 文件夹下的脚本 |
mcp:scripts:f/ebooks/hello |
仅暴露单个脚本 f/ebooks/hello |
mcp:flows:f/* |
暴露全部 flow |
mcp:endpoints:* |
暴露 Windmill 内置管理 API(listScripts、runScriptByPath 等) |
mcp:* |
全部暴露 |
建议优先使用文件夹通配符 f/inbox/*,这样新增脚本时不需要重新生成 Token。如果加上 mcp:endpoints:*,客户端会看到几十个 Windmill 管理工具(如 createVariable、deleteScriptByPath),一般不需要暴露这些。
多个 scope 组合 链接到标题
-d '{"scopes": ["mcp:scripts:f/ebooks/*", "mcp:scripts:f/another/*"]}'
还可以在同一实例上注册多个 MCP Server,每个对应不同的 Token 和文件夹权限,实现细粒度访问控制。
Token 放在哪里 链接到标题
这里有一个容易忽略的细节:Token 放在 URL query 参数里,而不是 Authorization Header。
✅ http://host/api/mcp/w/default/mcp?token=<TOKEN>
❌ Authorization: Bearer <TOKEN>
Windmill 的 MCP 端点会在 query 中解析 token,用 Header 反而会返回 “Unauthorized: missing mcp scope”。
注意事项 链接到标题
- 脚本的 summary 和 description:如果为空,MCP 工具的名称和描述也是空的,AI Agent 很难理解这个工具是做什么的。在 Windmill 中给脚本加上合适的 summary 和 description,MCP 会自动继承过来。
- Token 安全:scope 尽量收窄,只暴露必要的文件夹。Token 泄露后对方只能操作限定范围的脚本。
- 多 workspace:如果需要连接多个 workspace,注册不同的 MCP Server 即可,每个独立配置。
总结 链接到标题
# 三行完成全部配置
MCP_TOKEN=$(curl -s -X POST http://<host>/api/users/tokens/create \
-H "Authorization: Bearer $WM_TOKEN" \
-d '{"label":"mcp","scopes":["mcp:scripts:f/inbox/*"]}')
openclaw mcp set windmill "{
\"url\": \"http://<host>/api/mcp/w/default/mcp?token=$MCP_TOKEN\",
\"transport\": \"streamable-http\"
}"
openclaw mcp probe windmill
不需要打开浏览器,不需要点按钮,一条命令搞定。