跳到主要内容

托管现有的 MCP Server

介绍

如果你想将只支持本地运行的 MCP Server 部署到云开发,来提供远程 MCP 服务,可以使用云开发托管本地 MCP Server 的功能。

托管后的 MCP Server 具备以下能力:

  • 支持远程 SSE/Post 访问
  • 支持 ApiKey 认证,保护 MCP Server 代码和密钥信息的安全
  • 支持在 Cursor 等支持 MCP 的客户端访问
  • 支持在 云开发 Agent 使用,构建复杂的自动化 Agent
  • 提交上架到云开发 MCP 市场,审核通过后即可让更多人来部署使用

本篇文章将会使用社区中的 MongoDB MCP 进行演示

最终代码地址:托管本地 MCP 到云开发服务端示例项目

准备工作

  1. 在开始前请确保已经开通云开发环境
  2. 本地具有 Node.js 环境(建议使用 Node.js LTS 版本),用于运行 @cloudbase/cli 命令来部署云托管服务

创建空白 MCP Server

云开发 AI+ 中创建一个 MCP Server,选择空白模板, 名称和服务名可以根据自己需要进行命名

准备代码

准备一个本地 MCP Server,例如支持 npx、uv 等命令运行的 MCP Server,本文将使用 MongoDB MCP 进行演示

可以下载 托管本地 MCP 到云开发服务端示例项目 来进行测试

其中包含 3 个文件

  • Dockerfile:云开发 MCP 服务 Dockerfile 文件
  • DOC.md:MCP 服务的展示文档(选填,需要上架云开发 MCP 时必填)
  • mcp-meta.json: 云开发 MCP 服务的配置文件(选填,需要上架云开发 MCP 时必填)

编写 Dockerfile

Dockerfile 内容如下:

# 使用 Node.js 官方 Alpine 镜像作为基础
FROM node:20-alpine

# 配置腾讯云镜像源
RUN npm config set registry https://mirrors.cloud.tencent.com/npm/ \
&& yarn config set registry https://mirrors.cloud.tencent.com/npm/

# 配置 Alpine 国内镜像源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tencent.com/g' /etc/apk/repositories

# 安装 Python(自动创建 python/pip 链接)
RUN apk update \
&& apk add --no-cache python3 py3-pip \
&& apk add curl

# 如果你的项目是一个 python 项目,推荐全局安装,提升运行态的性能
# 例如 RUN pip3 install --break-system-packages mysql-mcp-server
RUN pip3 install --break-system-packages uv

## 全局安装必须的 npm 依赖
## @cloudbase/mcp-transformer 必须安装
## 如果你的项目是一个 npm 包,推荐全局安装,提升运行态的性能
RUN npm install -g @cloudbase/mcp-transformer@1.0.0-beta.10 mongo-mcp

# 固定暴露端口
EXPOSE 80

# 启动命令
## 这里是使用 cloudbase-mcp-transformer 命令来将 Stdio 转换为远程 MCP 服务
## --stdioCmd 是指定需要转换的命令,其中可以引用环境变量,例如 $USER、$PASSWORD、$HOST、$PORT、$DATABASE
## 在创建云托管服务的时候,用户可以指定环境变量
## 如果你的项目依赖环境变量,需要在 mcp-meta.json 中进行声明
## --port 是指定转换后的服务端口,默认为 3000
CMD cloudbase-mcp-transformer stdioToCloudrun --stdioCmd "mongodb-mcp mongodb://$USER:$PASSWORD@$HOST:$PORT/$DATABASE?authSource=admin ./" --port 80

完成 Dockerfile 编写后,我们可以将 MCP Server 部署至云托管了。

部署到云端

部署代码

# 请保证全局安装了 `@cloudbase/cli` 并登录。
npm i -g @cloudbase/cli@latest
# 登录:
tcb login

进入 Dockerfile 所在的目录,运行以下命令进行部署,根据提示输入在准备工作章节中使用的云开发环境 id 及云托管服务名:

tcb cloudrun deploy

配置环境变量

部署完成后可以在云托管服务详情页配置服务依赖的环境变量,例如 mongodb 例子中的 USERPASSWORDHOSTPORTDATABASE 等环境变量。

如果服务不依赖环境变量就可以运行,可以忽略这个步骤

使用

部署成功后即可在云开发 MCP Server 详情页中进行测试啦。进入 Tools 标签页,即可看到可用工具,并进行调用。

阅读以下文档使用托管的 MCP Server:

发布上架

如果需要将 MCP Server 发布到云开发 MCP 市场,请参考

FAQ

如何验证本地 MCP Server 是否功能可用?

首先我们在本地运行下 MCP Server,验证其功能的可用性。

Github MCP 为例,其给出了如下配置:

{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>"
}
}
}
}

这个配置说明:

  • 运行 npx -y @modelcontextprotocol/server-github 来启动 MCP Server
  • 需要配置环境变量 GITHUB_PERSONAL_ACCESS_TOKEN

为了方便本地调试,我们提供了 @cloudbase/mcp-inspector 调试工具,运行以下命令启动图形界面:

npx -y @cloudbase/mcp-inspector

运行后,可前往 http://127.0.0.1:5173 ,按以下步骤进行操作:

  1. Transport Type 选中 STDIO
  2. Command 填入 npx
  3. Arguments 填入 -y @modelcontextprotocol/server-github
  4. 前往 https://github.com/settings/tokens 创建 Github Token
  5. 点击 Environment Variables ,在展开的列表中添加 GITHUB_PERSONAL_ACCESS_TOKEN: <Token> ,填入刚刚创建的 Github Token
  6. 点击 Connect ,等待连接后即可测试其提供的工具了

本地测试了一两个工具后,我们可以确认这个 MCP Server 是可用的了。接下来,让我们开始将它转换为远程的 MCP Server。

如何本地调试 MCP Server 转换成 SSE 的效果?

将 Stdio 模式的 MCP Server 转换成支持 SSE 和 Post 的 HTTP 模式非常简单,只需运行:

npx -y cross-env GITHUB_PERSONAL_ACCESS_TOKEN=<YOUR_TOKEN> \
npx -y @cloudbase/mcp-transformer stdioToCloudrun \
--stdioCmd "npx -y @modelcontextprotocol/server-github" --noVerifyAccess --sseRoute local

这串命令挺长的,我们拆分下逐一解释各个部分的作用:

  • npx -y cross-env GITHUB_PERSONAL_ACCESS_TOKEN=<YOUR_TOKEN>:设置环境变量
  • npx -y @cloudbase/mcp-transformer stdioToCloudrun:运行 @cloudbase/mcp-transformer,这是我们提供的命令行工具,能够提供一个服务,将 Stdio 模式的 MCP Server 转换成以 SSE 和 Post 模式运行的 MCP Server。运行后,默认会在 http://127.0.0.1:3000/messages 提供服务
  • --stdioCmd "npx -y @modelcontextprotocol/server-github":运行 Stdio 模式的 MCP Server 的命令。@cloudbase/mcp-transformer 会使用此命令运行 Stdio 模式的 MCP Server,并提供 HTTP 服务,以此转换为以 SSE 和 Post 模式运行的 MCP Server
  • --noVerifyAccess:跳过鉴权的参数。在云托管上运行的 MCP Server 能够拿到调用者的身份,默认情况下会根据身份进行鉴权,仅允许来自超级管理员的调用。此处在本地运行时,为了方便,跳过鉴权
  • --sseRoute local:控制路由行为的参数,本地运行时需要填入此固定参数

运行后,再次回到 http://127.0.0.1:5173 ,按以下步骤进行操作:

  1. Transport Type 选中 SSEPOST
  2. URL 填入 http://127.0.0.1:3000/messages
  3. 点击 Connect ,等待连接后即可测试其提供的工具了

测试无误,则说明我们已经成功将本地 MCP Server 以 SSE/Post 模式运行了,可以通过 URL 进行远程访问了。