本地 MCP Server 的架构限制
先说清楚本地 MCP Server 的工作方式,才能理解它的限制在哪里。 本地 MCP Server 使用 stdio transport:客户端(Claude Desktop / Cursor)启动 Server 进程,两个进程在同一台机器上通过标准输入输出通信。这个机制决定了两点:① Server 和客户端必须在同一台机器上;② Server 的生命周期由客户端控制,客户端退出 Server 也退出。场景 1:多设备——配置要同步三遍
具体问题: 在公司 Mac 上配好了连接内部数据库的 MCP Server,回家发现家里机器没配,周末用 Windows 本又得再配一遍。改了一个配置参数,三台机器都要改。 本地方案的限制:场景 2:团队共享——不可能让每个人都装一遍
具体问题: 写了一个连接内部数据库的 MCP Server,让团队里另外 2 个后端同学也用上。本地方案意味着每个人的机器都要:① 安装 Node.js;② 克隆 Server 代码;③ 配置数据库连接凭证;④ 在自己的客户端里填入配置。数据库密码要分发给每个人,离职了还得改密码。 本地方案的限制: 3 个人的机器上跑着 3 个 Server 实例,数据库连接数×3,凭证管理变成安全隐患。团队再大一点,维护成本线性增长。 上云之后如何解决: 一个 VPS 上跑一个 Server 实例,数据库凭证只存在 VPS 的环境变量里。给每个团队成员发一个独立的 Bearer Token,离职了只需要吊销对应 Token,数据库密码不用动:场景 3:7×24 在线——本地机器关机就断了
具体问题: MCP Server 里有一个工具需要监听 webhook(比如接收 GitHub push 事件后自动整理代码变更日志),或者有定时任务(每天凌晨拉取报表数据缓存起来)。本地机器一关机,这些功能全部断掉。 本地方案的限制:场景 4:出口 IP 风控——机房 IP 被第三方 API 拒绝
具体问题: MCP Server 内部需要调用某些第三方 API(OpenAI、Notion、某个数据提供商),这些 API 会对请求来源 IP 做风控。家用宽带 IP 在某些平台被标记为高风险,直接拒绝请求;机房 IP 的 ASN 归属是数据中心,同样被部分平台限速或拒绝。 上云之后如何解决: VPS 的出口 IP 固定,便于申请 API 白名单。如果机房 IP 仍然被风控,可以在 Server 里配置出口代理:场景 5:对外售卖——不可能把本地机器的地址给用户
具体问题: 写了一个对接自研数据服务的 MCP Server,想做成付费产品卖给用户。本地方案完全不可行:你不可能把家里 Mac 的 IP 地址和端口给用户,更无法保证服务可用性。 上云之后如何解决: VPS 配好域名和 HTTPS 之后,你有了一个对外可访问的https://api.your-product.com/mcp 端点。给每个付费用户生成独立 Token,接入计费系统控制用量:
决策树:要不要上 VPS?
按顺序回答下面的问题,碰到”是”就停下来:上 VPS 之前需要什么
确认上云后,需要准备:- 一台有独立公网 IP 的 VPS——不是 NAT 后的内网机,80 和 443 端口要能通
- 一个域名——Let’s Encrypt 签发 HTTPS 证书需要绑定域名,裸 IP 无法申请免费证书
- 基础 Linux 运维能力——能 SSH 进去、能跑 apt / systemctl 命令就够
常见问题
本地 MCP 和云端 MCP 的协议层有区别吗?
本地 MCP 和云端 MCP 的协议层有区别吗?
没有区别。两者使用完全相同的 MCP 协议和 JSON-RPC 2.0 报文格式,区别只在传输层:本地用 stdio(进程管道),云端用 Streamable HTTP(HTTPS 端点)。MCP Server 的业务逻辑代码完全不需要改,只需要换 transport 的初始化方式。
本地 MCP Server 有没有办法临时暴露到公网?
本地 MCP Server 有没有办法临时暴露到公网?
有,用 ngrok 或 Cloudflare Tunnel 做临时隧道,可以把本地端口映射成公网 HTTPS URL,适合测试和演示场景。不适合生产用途,因为稳定性和安全性都有限:
一台 VPS 能跑多少个 MCP Server?
一台 VPS 能跑多少个 MCP Server?
取决于 Server 的内存占用。一个轻量 Node.js MCP Server 空载大约 50-100MB 内存,1GB 内存的 VPS 跑 5-8 个没有问题。如果 Server 有 AI 推理或大量文件处理,按实际负载估算。
本地 MCP 转云端需要改多少代码?
本地 MCP 转云端需要改多少代码?
主要改 transport 初始化部分:把
StdioServerTransport 换成 StreamableHTTPServerTransport,加一个 Express HTTP 服务层。业务逻辑(工具定义、资源读取、提示词模板)一行不用改。