配置有两种写法:命令行一条命令搞定,或者写进 .mcp.json。后者才是能进版本库、团队共用的形式。 演示里四份配置只过了一份。问题集中在两处:密钥明文、缺启动命令——都写得很像对的。
上一节选定了传输方式,这一节把它落成配置。 配置本身不难,难的是「放哪儿」——四个作用域,放错了不是不生效,就是把自己或团队的密钥泄出去。
一、两种写法
命令行:一次一条,落在用户级配置里。试的时候用,快,不用建文件。 .mcp.json:项目根一个文件,跟着仓库走。团队共用、能评审、能回滚。 差别不在功能,在「谁能看见、能不能审」。团队要用的东西必须能进版本库,否则没法评审。
所以试的时候用命令行,定了就搬进 .mcp.json——这个顺序比反过来省事。
二、四份配置逐个检查
演示里四份:一份干净的 stdio、一份带密码的、一份 HTTP 带 token 的、一份只有 args 没有 command 的。 结果只过了一份。另外三份的问题:两份密钥明文,一份缺启动命令。 缺 command 那份最典型:服务器根本起不来,但配置里「写了好几个字段」,看起来很像是对的。
而它报出来的现象是「连不上」,不是「配置错了」——这就是为什么这类错查起来慢。
三、密钥明文是最常见的一条
把密码写进 .mcp.json,文件一进版本库,密码就跟着进了历史。后面删掉也没用,历史里还在。 正确做法是用环境变量占位:配置文件里写变量名,真实值由运行环境提供。 这一条不复杂,但每年都有人栽在上面,因为「先跑通再说」的时候最顺手。
更麻烦的是它不会报错:密钥明文写着,功能一切正常,直到某天有人翻了仓库历史。
四、配置的位置与作用域
用户级:跟着人走,所有项目都有。放个人常用的小工具。 项目级:进版本库,团队共用。放这个项目要的服务器。 项目本地:不进版本库。放本机特有路径、个人密钥。
企业级:统一下发。放合规网关、审计这类必须统一的东西。 一条实用约定:能进版本库的放项目级,带密钥的放项目本地。前者让别人省事,后者让自己安全。
五、为什么作用域要分四层
因为「谁需要看见」和「谁能改」是两件事。用户级别人看不见,项目级谁都能改。 分层的目的是让默认行为正确:不确定放哪儿的时候,选最小的那一层。 放小了顶多是自己多配一次;放大了是所有人都被影响,还可能把密钥带进历史。
这和记忆层的规矩是同一条:范围越大放得越靠上,但靠上的内容必须真的通用。
六、动手 Demo:四份 MCP 配置,三份有毛病
配置有两种写法:命令行一条命令搞定,或者写进 .mcp.json。后者才是能进版本库、团队共用的形式。 这里把四份真实形态的配置拿出来逐个检查。
CFG = [(u"mini-notes", u"stdio", [u"command", u"args"], True),
(u"pg", u"stdio", [u"command", u"args", u"env"], False)]
ok = sum(1 for _n, _t, _k, clean in CFG if clean)
实跑输出:
--------------------------------------------------------------------
四份 MCP 配置,三份有毛病
--------------------------------------------------------------------
配置有两种写法:命令行一条命令搞定,或者写进 .mcp.json。后者才是能进版本库、团队共用的形式。
① 两种写法的区别
--------------------------------------------------------------------
| 形式 | 落在哪 | 适合 |
|---|---|---|
| 命令行 | 一次一条,写进用户级配置 | 试的时候用 |
| .mcp.json | 项目根一个文件,进版本库 | 团队共用 |
② 四份配置逐个检查
--------------------------------------------------------------------
| 名字 | 类型 | 字段数 | 结论 |
|---|---|---|---|
| mini-notes | stdio | 2 个字段 | 通过 |
| pg | stdio | 3 个字段 | 密钥明文 |
| todo | http | 2 个字段 | 密钥明文 |
| broken | stdio | 1 个字段 | 缺 command |
四份里 1 份通过。
另外三份的问题:一份缺启动命令(只有 args 没有 command,服务器根本起不来),
两份把密钥明文写进了配置。
③ 密钥明文是最常见的一条
--------------------------------------------------------------------
把密码写进 .mcp.json,一旦这个文件进了版本库,密码就跟着进了历史。删掉也没用——历史里还在。
正确做法是用环境变量占位:配置文件里写变量名,真实值由运行环境提供。
这一条不复杂,但每年都有人栽在上面,因为「先跑通再说」的时候最顺手。
④ 配置的位置与作用域
--------------------------------------------------------------------
| 位置 | 范围 | 放什么 |
|---|---|---|
| 用户级 | 跟着人走,所有项目都有 | 个人常用的小工具 |
| 项目级 | 进版本库,团队共用 | 这个项目要的服务器 |
| 项目本地 | 不进版本库 | 本机特有路径、个人密钥 |
| 企业级 | 统一下发 | 合规网关、审计 |
! 一条实用约定:能进版本库的放项目级,带密钥的放项目本地。前者让别人省事,后者让自己安全。
①两种写法的差别不在功能,在「谁能看见、能不能审」:命令行落在用户级配置里, 点 mcp.json 跟着仓库走。团队要用的东西必须能进版本库。 ②四份里只过了一份。 另外三份的问题:一份缺启动命令(只有 args 没有 command,服务器根本起不来), 两份把密钥明文写进了配置。 ③密钥明文这条最坑的是它不报错:功能一切正常,直到某天有人翻了仓库历史。 正确做法是用环境变量占位,配置里只写变量名。 ④四个作用域:用户级放个人小工具、项目级放团队共用的、项目本地放本机路径和个人密钥、 企业级放合规网关和审计。 一条实用约定:能进版本库的放项目级,带密钥的放项目本地。前者让别人省事,后者让自己安全。
30 秒实验
- 把那份缺 command 的补上启动命令,重跑一遍。它还会被拦吗? 为什么「补上就过」这件事不能说明它原来没问题?
- 给两份密钥明文的改成环境变量占位,重跑一遍。现在就全过了吗? 还有哪一条检查是这套规则查不出来的?
- 把项目级的配置挪到用户级,重跑一遍。检查能通过,但团队里其他人会怎样?
常见误区
- 把密码、token 直接写进 .mcp.json。文件一进版本库,密码就进了历史,删掉也没用。
- 配了 args 忘了 command。服务器根本起不来,而现象只是「连不上」。
- 团队共用的服务器只配在自己机器上。别人拉下代码还得问你怎么配。
- 本机特有路径写进项目级配置。别人拉下来一跑就是错的路径。
- 把不确定的东西放用户级。作用域放大了,所有人都被影响。
自测三问(点开对答案)
1. 命令行配置和 .mcp.json 该分别在什么时候用? —— 试的时候用命令行,快;定了就搬进 .mcp.json,能进版本库、能评审、能回滚。 2. 密钥为什么不能写进 .mcp.json? —— 文件进版本库后密钥就进了历史,后面删掉也没用。应该用环境变量占位,配置里只写变量名。 3. 四个作用域分别放什么? —— 用户级放个人小工具、项目级放团队共用的、项目本地放本机路径和个人密钥、 企业级放合规网关和审计。配置会写了,下一节拿数据库练手:把「查一下有多少条订单」包成两个工具。
- ☐ (本篇完,下一篇 6.5 实战一:连接数据库)
相关笔记
- 传输方式:选哪种传输
- 实战一:连数据库实战
- Claude Code 橙皮书 · 索引
- 🐎 Claude Code 实战 · 索引