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

不需要打开浏览器,不需要点按钮,一条命令搞定。