写好 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 的流程
- 确定服务器名:采用反向 DNS 格式,如
io.github.你的用户名/服务器名(GitHub 命名空间)或com.你的域名/服务器名(域名命名空间)。 - 先把包发到对应包注册中心:npm / PyPI / NuGet / 容器镜像仓库,Registry 只登记元数据,不托管代码。
- 写 server.json:声明名称、版本、包位置、传输方式与运行参数。
- 做归属验证:npm 包需在
package.json里写mcpName与服务器名一致;PyPI 与 NuGet 包需在 README 里出现mcp-name: $SERVER_NAME字符串(可以藏在注释里)。 - 提交发布:通过 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 把代码安全扫描交给了底层包注册中心和下游聚合器,作者自己要盯住依赖告警。
- 没有写清权限范围:用户最关心”这个服务器能碰我什么”,描述里必须写明文件系统范围、出网域名和所需令牌权限。
让人愿意装的三件小事
- README 第一段就给可复制的配置:直接给客户端能粘贴的 JSON 片段,不要让用户自己拼命令。
- 提供最小可跑示例:一个环境变量、一条调用,跑通即成功。
- 写清失败排查:至少覆盖”连不上””一直挂起””报 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 验证;包版本是否确实已发布到公共源。









评论 (0)