跳到主内容

MCP 服务器怎么发布分发:npm、PyPI、Docker 与官方 Registry 完整路径

100%
MCP 服务器怎么发布分发:npm、PyPI、Docker 与官方 Registry 完整路径

写好 MCP 服务器只是第一步,真正决定有没有人用的是分发方式。当前最省事的三条路是:Node/TS 项目发 npm 用 npx 一行启动、 Python 项目发 PyPI 用 uvx 启动、需要环境隔离的发容器镜像;想被官方渠道发现,就把元数据提交到官方 MCP Registry(它是元注册中心,不托管代码,只指向你的包)。

三条分发路径怎么选

方式适合用户侧命令优点代价
npm 包TypeScript / JavaScript 服务器npx -y @scope/mcp-server零安装、版本易升级、生态最主流需要维护 npm 账号与发布流程
PyPI 包Python 服务器uvx mcp-server-name依赖隔离、启动快打包配置与依赖声明要规范
容器镜像依赖复杂、需隔离、多语言docker run …环境可复现、可限制资源用户需装 Docker,启动相对重

如果服务器要访问用户本机文件,就走 stdio;如果要包装一个已有网络 API 、多人共用或需要标准 OAuth,就走 Streamable HTTP 。这个取舍在MCP 传输方式对比里有详细对照,选错了后面返工成本很高。

发布到官方 MCP Registry 的流程

  1. 确定服务器名:采用反向 DNS 格式,如 io.github.你的用户名/服务器名(GitHub 命名空间)或 com.你的域名/服务器名(域名命名空间)。
  2. 先把包发到对应包注册中心:npm / PyPI / NuGet / 容器镜像仓库,Registry 只登记元数据,不托管代码。
  3. 写 server.json:声明名称、版本、包位置、传输方式与运行参数。
  4. 做归属验证:npm 包需在 package.json 里写 mcpName 与服务器名一致;PyPI 与 NuGet 包需在 README 里出现 mcp-name: $SERVER_NAME 字符串(可以藏在注释里)。
  5. 提交发布:通过 Registry 的发布接口或 CLI 提交,命名空间通过 GitHub OAuth / Actions OIDC 或 DNS 、 HTTP 挑战完成验证。

server.json 长什么样

{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "name": "io.github.username/email-integration-mcp",
  "title": "Email Integration",
  "description": "Send emails and manage email accounts",
  "version": "1.0.0",
  "packages": [
    {
      "registryType": "npm",
      "identifier": "@username/email-integration-mcp",
      "version": "1.0.0",
      "transport": { "type": "stdio" }
    }
  ]
}

对应的 npm 包里要有 "mcpName": "io.github.username/email-integration-mcp",这是 Registry 验证归属的依据。

Registry 目前仍是 preview 状态,官方明确说明不保证数据持久性、正式版前可能有破坏性变更。所以不要把 Registry 当作唯一的分发渠道——自述文件里始终保留一份可直接复制的客户端配置片段。

六个容易踩的坑

  • 服务器名与包名对不上:归属验证失败的最常见原因,mcpName / mcp-name: 必须逐字符一致。
  • 只发二进制不发源:Registry 要求安装方式公开可获取,私有服务器(内网地址、私有源)不支持,需要自建私有 registry 。
  • 把密钥写进 server.json:元数据是公开的,需要的密钥应通过 env 声明由用户注入。
  • 版本号写死不更新:每次发版都要同步更新 Registry 元数据,否则用户装到的还是旧包。
  • 忽略安全扫描:Registry 把代码安全扫描交给了底层包注册中心和下游聚合器,作者自己要盯住依赖告警。
  • 没有写清权限范围:用户最关心”这个服务器能碰我什么”,描述里必须写明文件系统范围、出网域名和所需令牌权限。

让人愿意装的三件小事

  1. README 第一段就给可复制的配置:直接给客户端能粘贴的 JSON 片段,不要让用户自己拼命令。
  2. 提供最小可跑示例:一个环境变量、一条调用,跑通即成功。
  3. 写清失败排查:至少覆盖”连不上””一直挂起””报 schema 错”三种情况。

写完服务器想对照别人的做法,可以翻常用 MCP 服务器推荐清单;还卡在第一步的话,先看MCP Server 搭建教程把最小可用版本跑通。


官方 MCP Registry 会托管我的代码吗?
不会。它是元注册中心(metaregistry),只存指向包的元数据——”weather-server v1.2.0 在 npm:weather-mcp”,实际代码仍然在 npm 、 PyPI 、 Docker Hub 等包注册中心。

私有/企业内网的 MCP 服务器能发布吗?
不能发布到官方 Registry 。官方只接受安装方式公开可获取的服务器。企业内网场景应自建私有 registry,实现同一套 OpenAPI 规范即可被主流客户端消费。

npx 和 uvx 哪个体验更好?
取决于语言。 TypeScript 项目用 npx 最顺,Python 项目用 uvx 依赖隔离更干净、启动也快。对用户来说都是”一行命令不用装”,关键是你在 README 里给出哪一条。

归属验证一直失败怎么办?
先核对三处:server.json 的 name 、 npm 包的 mcpName(或 PyPI/NuGet README 里的 mcp-name 字符串)是否逐字符一致;命名空间是否已完成 GitHub 或 DNS 验证;包版本是否确实已发布到公共源。

这篇有帮助吗?
云上的幻象
云上的幻象查看主页

七彩云博客,分享 WordPress 建站实战与 AI 工具测评,覆盖服务器运维、站长工具、软件资源与电商运营干货,专注原创实用的主题插件、网站加速与安全优化教程。

795文章4评论

相关文章

评论 (0)

欢迎你,新朋友,感谢参与互动!文明发言,理性交流 · 首次评论将在审核后展示