接上一台服务器 — 两种线路和一次打招呼
这一章讲三件事: 连一台服务器有哪两条线路、各自什么时候用; 双方来回的报文长什么样;以及连上之后为什么还要专门打一次招呼。
它在全书链条里的位置: 这是第一章真正动手的内容,也是全书的地基—— 第 05 到 08 章讲的每一件事,都发生在这一章建起来的那条连接上。 同时它也是被 2026 年那次改动动得最狠的一章(本章最后一节会先提个醒)。
1. 服务器不一定跟你在同一台机器上,于是有两条线路
这一节回答:为什么连一台服务器需要先做一个选择。
你可能默认「连服务器 = 连一个网址」。在 MCP 里通常不是。
绝大多数 MCP 服务器是跟你的宿主应用跑在同一台机器上的一个小程序: 你从网上下载它、装在本地、由你的程序自己把它启动起来。 书里说得很明白:大多数商业化的宿主应用,都指望用户自己安装和运行服务器1。
但也有另一种情况:你在做一个平台或框架给别人用,你没法保证服务器和应用装在同一台机器上; 或者有的公司把自己的 MCP 服务器架在自己的网络上、对外开放2。这时候就得走网络。
于是有两条线路。选哪条,只取决于一件事:服务器在不在本机。
| 本机线路 | 远程线路 | |
|---|---|---|
| 服务器在哪 | 跟宿主应用同一台机 器 | 别人的机器上 |
| 谁把它启动的 | 你的客户端亲手启动 | 别人早就开好了 |
| 连接靠什么 | 那个程序的输入输出 | 一个网址 |
| 书里的评价 | 写起来最省事,当时最常用的一种1 | 平台开发和托管工具的场景2 |
| 安全上要注意 | (第 10 章讲) | 必须额外做两件事(第 10 章讲) |
2. 本机线路:客户端亲手把服务器启动起来
这一节是本章主走查的第 1 步。 我们接一台计算器服务器—— 书里从这里一直用到第 06 章的那台,它提供加、减、乘、除四个工具3。
你要交出去的三样东西
要启动一台本机服务器,你的客户端需要知道三件事4。其中第三件叫环境变量——操作系统在启动一个程序时塞给它的一组「名字 = 值」:程序跑起来之后读得到,但它们不写在代码里。
下面表里的开关名
--debug和那个环境变量的值,是我们为演示编的,不是书里的数值; 书里给的参数例子是["server.py", "--port", "8080"]。 三样东西各是什么,以及「一股脑传全部环境变量不推荐」这条,都是书里的。
| 交什么 | 这台计算器的例子 | 说明 |
|---|---|---|
| 用什么命令 | python | 通常是 python 或 node(有的装法是 npx) |
| 跟哪些参数 | ["calculator_server.py", "--debug"] | 至少要有服务器文件的路径;后面跟它自己的开关 |
| 一份环境变量 | {"CALC_PRECISION": "8"} | 见下 |
第三样要单独说一句:密钥、口令、数据库地址这类不该进代码的东西,通常就放在环境变量里。
配套还有一个约定俗成的做法:把这些「名字 = 值」写进一个叫 .env 的文件里,
程序启动时读进来5。这个文件千万不能提交到代码仓库——
书里在这里插了一条警告,而这条警告正是第 10 章的起点。
还有一 个更省事、也更危险的写法:把你自己这台机器上所有的环境变量一股脑传过去。 书里明写不推荐,理由是「这可能把敏感信息暴露给服务器」4。 (为什么这句话比它看起来严重得多,第 10 章讲。)
客户端做的第一件事:把它跑起来
把这三样交给客户端之后,连接的第一步是:客户端执行那行命令, 于是本机上多出来一个正在运行的程序。
这种「由另一个程序启动、并归它管」的程序,叫子程序—— 你的客户端是它的家长:客户端退出的时候,要负责把它也关掉。
启动之后,客户端手里拿到的是两根管子:一根往里写、一根从里读。 这正是这条线路名字的由来——标准输入输出(每个命令行程序天生就有的 「从哪儿读输入、往哪儿写输出」这两条通道),行话简称 stdio6。
你的宿主应用
│
│ ① 执行:python calculator_server.py --debug
▼
┌─────────────────────────┐
│ 子程序:计算器服务器 │
│ │
│ ← 往它的输入里写请求 │
│ → 从它的输出里读回复 │
└─────────────────────────┘
图说:两根管子就是全部的通信手段。没有端口,没有网络,
别的程序也插不进来——这是这条线路天然的一个好处。