当第三方 AI 应用程序通过 HTTP 协议与 OpenAPI MCP Server 通信时,若应用程序自身不具备处理阿里云认证的能力,可使用 aliyun utils mcp-proxy 作为本地认证代理。该代理可自动完成 OAuth 授权与 Token 管理,使应用程序无需处理凭证即可调用阿里云服务 API。
aliyun utils mcp-proxy 介绍
aliyun utils mcp-proxy 是阿里云 CLI 提供的 MCP Server 代理工具,用于简化第三方 AI 应用程序(例如 Dify、LangChain)与 OpenAPI MCP Server 的交互。首次启动时需手动完成 OAuth 授权,后续代理服务将自动处理 Token 刷新。
工作原理:应用程序将 API 请求发送至 mcp-proxy。代理服务添加凭证后,将请求转发至 OpenAPI MCP Server。
凭据分工:aliyun utils mcp-proxy 运行时使用两类凭据,二者作用于不同环节:
阿里云 CLI 凭据:即通过
aliyun configure配置的 AccessKey,可通过--profile指定使用哪一份配置。该凭据用于代理启动阶段查询或创建 OAuth 应用。OAuth 令牌:由代理在首次授权时获取,并在后续运行中自动刷新。代理向 OpenAPI MCP Server 转发请求时,使用该令牌完成身份鉴权。
因此,为 CLI 配置的凭据身份需具备 OAuth 应用相关的 RAM 权限,请参见步骤一:配置阿里云 CLI;而代理转发请求时可访问的 MCP Server 范围,由完成 OAuth 授权的身份决定。
启动 mcp-proxy 后,本机所有用户均可通过代理端口,以启动代理的 CLI 用户身份访问其权限范围内的所有 MCP Server。部署前请先阅读安全风险与防护,完成环境隔离、网络访问控制和服务器范围限制的配置。
配置并运行代理
步骤一:配置阿里云 CLI
安装或升级阿里云 CLI,确保版本不低于
3.5.0。安装方法,请参见安装/更新 CLI。使用阿里云账号或 RAM 用户的 AccessKey 配置 CLI。
aliyun configure # 根据提示输入 AccessKey ID、AccessKey Secret 和默认地域。如果使用 RAM 用户,请为其授予下表中的权限。
权限
作用
适用场景
ram:ListApplications按名称查询 OAuth 应用。
必需。代理首次启动,或本地保存的授权信息不可用时需要该权限。使用
--oauth-app-name指定已有应用时同样需要。ram:CreateApplication创建默认 OAuth 应用
aliyun-cli-mcp-proxy。未使用
--oauth-app-name指定应用,且默认应用尚不存在时需要该权限。ram:GetApplication按 ID 查询 OAuth 应用。
建议授予。代理凭该权限复用本地已保存的授权信息;未授予时,代理每次启动均需重新完成一次 OAuth 授权。
步骤二:首次运行代理并完成 OAuth 授权
首次运行 mcp-proxy 时,需完成一次性 OAuth 授权以获取刷新 Token 的权限。
在前台启动。
在有图形界面的环境中,不带
--no-browser参数时,CLI 会自动拉起浏览器执行 OAuth 授权登录流程,无需手动输入授权码。授权完成后可直接跳至第 5 步。aliyun utils mcp-proxy --host 127.0.0.1 --port 8088在无图形界面的服务器环境中操作时,请添加
--no-browser参数,后续步骤将引导手动获取授权码。aliyun utils mcp-proxy --host 127.0.0.1 --port 8088 --no-browser
说明使用
--oauth-app-name参数可指定自定义 OAuth 应用,该应用必须满足以下条件:OAuth 范围(Scope):必须包含
--scope参数指定的授权范围,默认为/acs/mcp-server。回调地址(Redirect URI):必须包含
http://<host>:<port>/callback,其中host和port为启动代理时--host和--port参数的值。应用类型:必须为
NativeApp类型的应用。
终端将输出授权 URL。
Setting up MCPOAuth profile 'default-mcp'... Opening browser for OAuth login... URL: https://signin.alibabacloud.com/oauth2/v1/auth?client_id=XXXX&response_type=code&scope=%2Facs%2Fmcp-server&redirect_uri=http://127.0.0.1:8088/callback&code_challenge=XXX&code_challenge_method=S256 Please open the authorization URL on a machine with a browser and complete the sign-in. After authorization, the browser will redirect to a callback URL. Even if the page fails to load (connection error), the authorization code is in the URL. Please copy the value of the `code` parameter from the browser's address bar. Example: If the URL is: http://127.0.0.1:8088/callback?code=abc123xyz&state=... Then copy only: abc123xyz Enter authorization code: <YOUR CODE>在浏览器中打开该 URL,登录并完成授权。
授权成功后,页面会跳转至包含
code参数的地址或直接显示授权码。将code值复制并粘贴至终端,按回车键确认。当终端显示
OAuth login successful!信息时,表示授权登录成功。2025/12/04 19:11:49 OAuth authorization code received successfully 2025/12/04 19:11:49 Start to exchange code for token with PKCE 2025/12/04 19:11:49 Exchange code for token with PKCE successfully OAuth login successful!当终端显示
MCP Proxy Server Started信息时,表示代理启动成功。MCP Profile 'default-mcp' configured for oauth app 'aliyun-cli-mcp-proxy' successfully! MCP Proxy Server Started Listen: 127.0.0.1:8088 Region: CN
步骤三:配置为 systemd 后台服务(以 CentOS 为例)
为确保代理稳定运行,建议将其配置为开机自启的 systemd 服务。
创建
systemd服务文件:aliyun-mcp-proxy。替换以下内容:
将命令中的
your-user替换为实际运行此命令的非root用户名。该用户必须已通过aliyun configure配置凭据,并已在该用户下完成上述 OAuth 授权。服务启动时会复用该用户主目录中已保存的授权凭据,不会再次触发浏览器授权。ExecStart必须填写aliyun命令的绝对路径。执行which aliyun获取实际路径,并替换示例中的/usr/local/bin/aliyun。systemd 不通过 shell 解析该字段,因此$(which aliyun)这类命令替换写法不会生效。
sudo tee /etc/systemd/system/aliyun-mcp-proxy.service << 'EOF' [Unit] Description=Aliyun CLI MCP Proxy After=network.target [Service] Type=simple User=your-user ExecStart=/usr/local/bin/aliyun utils mcp-proxy --host 127.0.0.1 --port 8088 --no-browser Restart=always RestartSec=10 Environment=HOME=/home/your-user [Install] WantedBy=multi-user.target EOF重新加载
systemd配置并启动服务。# 重新加载配置 sudo systemctl daemon-reload # 启动服务 sudo systemctl start aliyun-mcp-proxy # 设置开机自启 sudo systemctl enable aliyun-mcp-proxy
步骤四:验证代理服务
通过以下任一方式验证服务是否正常运行。
查看服务状态
执行以下命令查看服务状态。
sudo systemctl status aliyun-mcp-proxy若输出中包含
active (running),则表示服务已成功启动。请求代理端口
执行以下命令,直接请求代理端口。
curl http://127.0.0.1:8088/如果代理工作正常,将收到来自 MCP Server 的 XML 格式错误响应,表明代理与服务之间的链路已连通。
<?xml version='1.0' encoding='UTF-8'?><Error><RequestId>B3311876-XXXXX</RequestId><HostId>openapi-mcp.cn-hangzhou.aliyuncs.com</HostId><Code>InvalidAction.NotFound</Code><Message>Specified api is not found, please check your url and method.</Message><Recommend><![CDATA[https://api.alibabacloud.com/troubleshoot?q=InvalidAction.NotFound&product=OpenAPIExplorer&requestId=B3311876-XXX]]></Recommend></Error>
应用案例:在 Dify 中集成
以在同一台 ECS 上通过 Docker Compose 部署的 Dify 为例,介绍如何在应用中配置并使用 mcp-proxy 代理。
步骤一:获取宿主机 Docker 网桥 IP 并启动 mcp-proxy 代理服务
Dify 容器需通过宿主机的 Docker 网桥 IP 地址访问 mcp-proxy 服务。
执行以下命令,获取并记录该 IP 地址。
ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1执行后会得到类似
172.17.0.1的 IP 地址。在前台启动 mcp-proxy 代理服务。或者,在
systemd中修改启动命令然后通过服务启动。aliyun utils mcp-proxy --host 172.17.0.1 --port 8088 --no-browser说明回调地址由
--host和--port参数共同决定。将监听地址从127.0.0.1改为 Docker 网桥 IP 后,需在 RAM 控制台的集成管理 > OAuth 应用(公测)中,为对应的 OAuth 应用补充新的回调地址(例如http://172.17.0.1:8088/callback),否则启动时将因回调地址校验不通过而失败。
步骤二:在 Dify 中配置 MCP Server
进入 Dify 的 工具 > MCP 配置页面。
点击 添加 MCP 服务(HTTP)。
在 服务端点 URL 字段中,填入 MCP 代理地址。
在阿里云 OpenAPI MCP 服务控制台获取原始的 Streamable HTTP Endpoint 地址,并将该地址中的域名部分(host)替换为本地或内网代理地址。
示例转换:
原始 Endpoint:
https://openapi-mcp.cn-hangzhou.aliyuncs.com/accounts/1234/custom/cli-proxy-test/id/1234/mcp替换为代理地址(假设代理运行在
172.17.0.1:8088):http://172.17.0.1:8088/accounts/1234/custom/cli-proxy-test/id/1234/mcp
按需填入其他信息后点击添加并授权。Dify 将通过该代理地址与 MCP 服务通信。
安全风险与防护
启动 mcp-proxy 后,本机所有用户均可通过代理端口,以启动代理的 CLI 用户身份访问其权限范围内的所有 MCP Server。主要风险包括:
内部权限滥用:同一机器上的其他用户可利用代理端口执行越权操作,导致权限滥用或数据泄露。
外部暴露风险:代理端口监听在
0.0.0.0且未配置防火墙时,任何人均可通过该端口访问 MCP Server。
防护措施
环境隔离:仅在受信任的单用户环境中运行代理,避免在多用户共享服务器上使用。
网络访问控制:将代理监听地址(
--host)绑定到127.0.0.1(默认)或特定内网 IP。使用防火墙或安全组规则限制代理端口访问范围(例如仅允许特定应用服务器 IP 访问),严禁对公网暴露。访问控制:通过
--allowed-servers或--blocked-servers参数限制可访问的 MCP Server 范围,避免代理被用于访问非预期的服务。配置方法,请参见配置服务器访问控制。最小权限原则:为代理使用的 CLI 用户及其关联的 MCP Server 配置最小必要权限,优先授予只读权限。
审计与监控:定期审查代理服务的访问日志,监控异常请求。被访问控制拦截的请求会记录在代理日志中。
配置服务器访问控制
aliyun utils mcp-proxy 支持白名单和黑名单机制,限制可通过代理访问的 MCP Server 范围。
优先级规则
访问控制按以下顺序判定:
黑名单优先:命中黑名单的请求直接拒绝,即使同时存在于白名单中。
白名单过滤:白名单非空时,仅放行白名单中的服务器。
默认放行:未配置任何名单时,允许所有服务器访问。
获取服务器名称和服务器 ID
启动 aliyun utils mcp-proxy 后,终端会列出所有可用的 MCP Server 名称。示例输出:
Available Servers:
- cloudphone
MCP: http://127.0.0.1:8088/accounts/0000000000000000/system/eds-aic/cloudphone/id/XSkb9v4dXx000000/mcp
SSE: http://127.0.0.1:8088/accounts/0000000000000000/system/eds-aic/cloudphone/id/XSkb9v4dXx000000/sse
- multi_account
MCP: http://127.0.0.1:8088/accounts/0000000000000000/custom/multi_account/id/OV0Qkpxh0Uodx000/mcp
SSE: http://127.0.0.1:8088/accounts/0000000000000000/custom/multi_account/id/OV0Qkpxh0Uodx000/sse输出中的
cloudphone、multi_account即服务器name,位于id关键字前。输出中的
XSkb9v4dXx000000、OV0Qkpxh0Uodx000即服务器id,位于mcp关键字前。
URL 路径通常满足以下规则:
......./system/eds-aic/$server_name/id/$server_id/mcp
......./custom/$server_name/id/$server_id/mcp匹配模式
--allowed-servers 和 --blocked-servers 支持以下匹配模式,通过值的格式自动识别:
匹配模式 | 格式 | 示例 | 说明 |
服务器名称或 ID 匹配 | 不以 |
| 与服务器的 |
路径前缀匹配 | 以 |
| 匹配请求 URL 的路径前缀 |
路径前缀匹配使用前缀比较,一个前缀可同时命中多个服务器以及同一服务器的
/mcp和/sse两个端点。两种模式可在同一参数中混合使用。
配置示例
白名单模式:仅允许访问指定服务器
aliyun utils mcp-proxy --allowed-servers "ecs-basic,oss-basic"启动后仅
ecs-basic和oss-basic可访问。请求其他服务器时,代理返回 403 状态码和以下响应:Access denied: This MCP server is not allowed黑名单模式:禁止访问指定服务器
aliyun utils mcp-proxy --blocked-servers "cms-basic"启动后除
cms-basic外的所有服务器均可访问。请求cms-basic时,代理返回 403 状态码和以下响应:Access denied: This MCP server is blocked使用路径前缀匹配
aliyun utils mcp-proxy --allowed-servers "/accounts/0000000000000000/custom/"仅放行请求路径以该前缀开头的服务器。适用于按服务器类别整体控制的场景,无需逐个列出名称。
验证访问控制配置
启动代理后,终端会先输出当前生效的访问控制配置,再逐个列出当前账号下的全部 MCP Server 及其状态。以同时配置黑白名单为例:
aliyun utils mcp-proxy --allowed-servers "ecs-basic,oss-basic" --blocked-servers "oss-basic"输出如下(服务器列表已截断):
MCP Proxy Server Started
Listen: 127.0.0.1:8088
Region: CN
Access Control:
Blacklist (blocked servers):
- oss-basic
Whitelist (allowed servers):
- ecs-basic
- oss-basic
Available Servers:
- ecs-basic
MCP: http://127.0.0.1:8088/accounts/0000000000000000/system/Ecs/ecs-basic/id/daRi22dx71iX0000/mcp
SSE: http://127.0.0.1:8088/accounts/0000000000000000/system/Ecs/ecs-basic/id/daRi22dx71iX0000/sse
- oss-basic (blocked)
MCP: http://127.0.0.1:8088/accounts/0000000000000000/system/Oss/oss-basic/id/vP5TovGrt2jm0000/mcp
SSE: http://127.0.0.1:8088/accounts/0000000000000000/system/Oss/oss-basic/id/vP5TovGrt2jm0000/sse
- cms-basic (not in whitelist)
MCP: http://127.0.0.1:8088/accounts/0000000000000000/system/Cms/cms-basic/id/6PHbBzr8Bg6b0000/mcp
SSE: http://127.0.0.1:8088/accounts/0000000000000000/system/Cms/cms-basic/id/6PHbBzr8Bg6b0000/sse
Press Ctrl+C to stop服务器名称后的标记表示其当前状态:
无标记:可正常访问。
(blocked):命中黑名单。同时在黑白名单中的服务器仍标记为此,体现黑名单优先。(not in whitelist):未命中白名单。配置白名单后,未命中的服务器仍会列出并标记,不代表可访问。
请求被拦截时,代理返回 403 状态码,并在日志中记录被拦截的路径和具体原因。上述配置下,请求 oss-basic(命中黑名单)与 cms-basic(未命中白名单)的日志分别为:
MCP Proxy access denied: path /accounts/0000000000000000/system/Oss/oss-basic/id/vP5TovGrt2jm0000/mcp is in blocked servers list
MCP Proxy access denied: path /accounts/0000000000000000/system/Cms/cms-basic/id/6PHbBzr8Bg6b0000/mcp is not in allowed servers list安全事件处理
如果怀疑代理认证 Token 泄露或被滥用,立即执行以下操作:
停止
mcp-proxy服务。删除本地配置文件:
rm ~/.aliyun/.mcpproxy_config。删除该 OAuth 应用,使已泄露的 Refresh Token 永久失效。使用 RAM 管理员身份登录 RAM 控制台,在左侧导航栏选择集成管理 > OAuth 应用(公测),在企业应用页签单击目标应用操作列的删除应用;也可使用 CLI 删除。删除后重新完成 OAuth 授权时,CLI 会自动创建新的应用。
aliyun ims list-applications --cli-query "Applications.Application[?AppName=='aliyun-cli-mcp-proxy'].AppId" aliyun ims delete-application --app-id <应用 ID>检查 API 调用日志,确认是否存在异常操作。
重新启动代理并完成 OAuth 授权,获取新的 Token。
参数说明
aliyun utils mcp-proxy 命令支持通过不同参数以适应特定场景。
参数 | 描述 | 默认值 |
| 代理监听的主机地址。设为 |
|
| 代理监听的端口。该端口同时决定 OAuth 应用的回调地址,修改后需确保 OAuth 应用已包含对应的回调地址。 |
|
| 在无图形界面的环境中进行 OAuth 认证时使用。启用后,认证链接将直接打印在终端。 | 未启用 |
| 指定已存在的 OAuth 应用名称。使用此参数时,CLI 不会尝试自动创建应用。未指定时,代理使用默认应用 | 无 |
| OAuth 应用的授权范围(Scope)。使用 |
|
| 选择 OpenAPI MCP Server 的服务站点。 |
|
| 手动指定上游 OpenAPI MCP Server 的地址。未指定时,地址由 | 无 |
| 允许访问的 MCP Server 白名单,多个值用英文逗号分隔。支持服务器名称、ID 或路径前缀。未指定时允许所有服务器。请参见配置服务器访问控制。 | 无 |
| 禁止访问的 MCP Server 黑名单,多个值用英文逗号分隔。支持服务器名称、ID 或路径前缀。黑名单优先级高于白名单。请参见配置服务器访问控制。 | 无 |
常见问题
执行 aliyun utils mcp-proxy 进行 OAuth 认证后,出现 “ERROR: OAuth flow returned empty RefreshToken” 错误且代理启动失败,是什么原因?
该错误表示当前使用的 OAuth 应用不是 NativeApp 类型,无法在授权流程中返回 Refresh Token。任选以下一种方式处理:
删除该 OAuth 应用后重新启动代理,由 CLI 自动创建
NativeApp类型的应用。手动创建
NativeApp类型的应用,并在启动代理时通过--oauth-app-name指定。
启动代理时提示 failed to find OAuth application,且错误码为 NoPermission,如何处理?
报错示例:
ERROR: failed to find OAuth application 'aliyun-cli-mcp-proxy': SDKError:
StatusCode: 401
Code: NoPermission
Message: code: 401, The user has no permission
Data: {"AccessDeniedDetail":{"AuthAction":"ram:ListApplications","AuthPrincipalType":"SubUser", ...}}代理在启动阶段需要查询或创建 OAuth 应用,此操作使用阿里云 CLI 凭据完成。上述报错表示当前 CLI 凭据对应的 RAM 用户尚未获得 AuthAction 字段所指出的权限(示例中为 ram:ListApplications)。
任选以下一种方式处理:
为该 RAM 用户授予所需权限,请参见步骤一:配置阿里云 CLI。
改用具备所需权限的凭据运行代理,例如阿里云账号或已完成授权的其他 RAM 用户。
修改 --host 或 --port 后启动失败,提示 does not have required redirect URI,如何处理?
OAuth 应用需包含本次启动所对应的回调地址,修改 --host 或 --port 会改变该地址。报错示例:
ERROR: OAuth application validation failed: OAuth application 'aliyun-cli-mcp-proxy' does not have required redirect URI 'http://172.17.0.1:8088/callback'. Available redirect URIs: [http://127.0.0.1:8088/callback]使用 RAM 管理员身份登录 RAM 控制台,在左侧导航栏选择集成管理 > OAuth 应用(公测),在企业应用页签单击目标应用名称,然后在基本信息区域单击编辑,将报错信息中 required redirect URI 指出的地址添加到回调地址中。同一应用可保留多个回调地址,添加后原有地址仍然可用。
在 Dify 中配置后,提示“Connection Refused”或“Timeout”?
请检查以下两项:
mcp-proxy服务启动时,--host参数是否已配置为 Docker 网桥 IP 或宿主机内网 IP,以确保 Docker 容器可以访问。云服务器安全组或宿主机防火墙是否已放行从 Docker 容器到代理端口(例如
8088)的 TCP 流量。
如何查看 mcp-proxy 服务的运行日志?
若已配置为 systemd 服务,可使用以下命令实时查看日志:
sudo journalctl -u aliyun-mcp-proxy -f