MCP Servers:把 Claude Code 从本地编辑器变成万能控制台

Claude Code 默认只能操作本地文件。直到我给它接了一个 MCP Server,它第一次能直接查我的 Postgres、调内部 API、甚至操作 Notion 数据库。这篇聊聊 MCP 是什么、怎么配、以及一个我踩过的重要坑。

Summary: Claude Code 默认只能操作本地文件。直到我给它接了一个 MCP Server,它第一次能直接查我的 Postgres、调内部 API、甚至操作 Notion 数据库。这篇聊聊 MCP 是什么、怎么配、以及一个我踩过的重要坑。


我有段时间一直觉得 Claude Code 少了点什么。

它能读代码、能改代码、能跑测试。但遇到一个很常见的问题——"帮我查一下用户表里有多少条注册数据超过三十天的记录"——Claude Code 就歇菜了。

它跟我说:"我无法直接访问数据库。"

我心里冒出来的第一个念头是:那你还有什么用?

后来我才意识到,这不是 Claude Code 的问题,是我没给它接"外挂"。而MCP Servers 就是这个外挂系统。

MCP 是什么

MCP(Model Context Protocol)是 Anthropic 推出的一个开放协议。说白了,它让 AI 工具能"插上"各种外部能力,比如查数据库、调 API、读写文件系统、操作消息队列。

Claude Code 原生支持 MCP。配好之后,Claude 在对话里就可以直接调用你定义好的工具,就像调用它自己的内置工具一样。

举个例子。我配了一个 psql MCP server 之后:

你:查一下用户表里超过三十天未登录的用户有多少

Claude:我查了一下,共有 12,847 条记录符合条件。

它真的去跑了一个 SQL 查询,然后把结果读回来告诉我。我这边不需要打开终端、不需要手动跑 psql——Claude Code 全干了。

一个真实的踩坑场景

上个月我在重构一个导出模块。需求是把用户数据导出成 CSV,然后上传到 S3。

问题来了。这个模块依赖两张表的数据——用户主表和订单表,需要关联查询。而且我需要确认 S3 的 bucket 名称和权限配置。以前我做这件事的流程是:

  1. 打开终端,psql -c "SELECT ..." 查数据
  2. 打开浏览器,登录 AWS console 确认 bucket 名称
  3. 把数据复制到 Excel 里做关联
  4. 把关联结果写回 CSV
  5. 打开另一个终端,aws s3 cp 上传

五个步骤,两三个工具来回切。更关键的是,步骤 3 和 4 是最容易出错的地方——手动复制粘贴大表数据,列对齐错了都不知道。

配好 MCP Server 之后,我只需要一句话:

帮我查一下过去七天下单但还没发货的用户,把 userId、email、orderId 导出到 s3://bucket/exports/ 目录下

Claude Code 自动做了以下事情:
1. 通过 psql MCP server 查了用户表和订单表的关联结果
2. 把结果写成本地 CSV 文件
3. 通过 aws-s3 MCP server 上传到指定路径
4. 把 S3 的 object URL 返回给我

我一个人没动,它全干了。

具体怎么配

MCP Server 的配置在 ~/.claude.json 里。结构长这样:

{
  "mcpServers": {
    "psql": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {
        "POSTGRES_CONNECTION_STRING": "postgresql://user:pass@localhost:5432/mydb"
      }
    },
    "aws-s3": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-s3"],
      "env": {
        "AWS_REGION": "ap-northeast-1",
        "AWS_PROFILE": "default"
      }
    }
  }
}

mcpServers 是一个键值对。键是你在对话里引用的名字(比如 psql),值是 server 的启动配置。

每个 server 需要两个东西:
- command:启动这个 server 的可执行文件
- args:传给这个命令的参数

需要环境变量就加 env

配完之后怎么用

重启 Claude Code 之后,新配的 server 会自动加载。你不需要做任何额外操作——Claude 会根据你的描述自动判断用哪个 server。

比如我说"帮我查一下数据库",Claude 会发现 psql server 可用,自动调用它。

如果你想确认哪些 server 已加载,可以问 Claude:

你当前有哪些 MCP tools 可用?

Claude 会把所有 server 提供的工具列出来。

找到适合你的 MCP Server

MCP Servers 官方仓库 里已经有很多开箱即用的 server。我日常在用的几个:

数据库相关:
- @modelcontextprotocol/server-postgres — PostgreSQL
- @modelcontextprotocol/server-mysql — MySQL
- @modelcontextprotocol/server-sqlite — SQLite

云服务相关:
- @modelcontextprotocol/server-s3 — AWS S3
- @modelcontextprotocol/server-github — GitHub API

办公协作:
- @modelcontextprotocol/server-slack — Slack 消息
- @modelcontextprotocol/server-notion — Notion 数据库

开发工具:
- @modelcontextprotocol/server-filesystem — 受限的文件系统访问
- @modelcontextprotocol/server-git — Git 操作

你不需要一次全装上。用到一个装一个。

自己写一个

官方仓库覆盖了大部分常见场景。但如果你有特殊需求,自己写一个也不难。

一个 MCP Server 就是一个 STDIO 服务器,接收 JSON-RPC 请求,返回结果。Claude 会帮你生成初始化代码。

在项目根目录下:

/mcp

Claude Code 会问你几个问题:
1. Server 叫什么名字?
2. 提供哪些工具?
3. 每个工具的参数和返回格式是什么?

它会帮你生成一个完整的 MCP Server 项目结构。我写过最复杂的一个大概花了半小时,是一个用来查询内部客服系统的 MCP Server。

Tricks

Trick 1:多个 database 用 server 别名区分

如果你的项目同时连 Postgres(主库)和 Postgres(分析库),配两个 server:

{
  "mcpServers": {
    "psql-main": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {
        "POSTGRES_CONNECTION_STRING": "postgresql://user:pass@localhost:5432/production"
      }
    },
    "psql-analytics": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {
        "POSTGRES_CONNECTION_STRING": "postgresql://analytics:pass@localhost:5432/analytics"
      }
    }
  }
}

对话的时候 Claude 会自动根据查询内容选库。如果你说"查主库的用户数据",它会用 psql-main;说"查分析库的日活"会用 psql-analytics

Trick 2:敏感信息用环境变量注入,不要硬编码

刚才的例子里我把 connection string 直接写在了 ~/.claude.json 里。这是演示用的写法。真实场景里,密码不要明文写进配置文件。

更好的做法是用 .env 文件 + dotenv 加载:

{
  "mcpServers": {
    "psql": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {
        "POSTGRES_CONNECTION_STRING": "${POSTGRES_URL}"
      }
    }
  }
}

然后在系统环境变量里设置 POSTGRES_URL。这样即使 ~/.claude.json 被不小心泄露,数据库密码也不会跟着出去。

Trick 3:用 server 做"只读"的权限控制

有一个场景我特别推荐 MCP——让 Claude 能查数据,但不能改数据。

我在分析库上配了一个只读账号,connection string 用的是 SELECT 权限。这样无论 Claude 怎么查,都不会误删数据。

想加写入权限的时候再切一个有写权限的 server 别名。安全感和便利性两不误。

注意事项 / 踩坑

坑一:MCP Server 的 token 消耗会被计入你的 session

MCP 工具调用和 Claude Code 的内置工具调用一样,都要消耗 token。每次 Claude 调用一个 MCP server,请求和响应都会进入上下文。

我见过一个 case:Claude 通过 MCP 查了一张大表,把整个结果集(上万行)塞进了上下文。一次查询花掉了几万 token。

所以如果你的 MCP server 返回大量数据,最好在 server 端做分页或聚合,不要把全量数据丢给 Claude。

坑二:第三方 server 的代码质量参差不齐

官方仓库里的 server 质量参差不齐。有些写得很好,输入验证、错误处理都到位。有些就一个 hello world 的水平,遇到异常直接 crash。

我的建议:用一个新 server 之前,先看一下它的源码,确认它不会把你的数据库搞崩、不会在异常情况下泄露敏感数据。

尤其是涉及到数据库写入或删除操作的 server,更要谨慎。

坑三:connection string 不要用 root 账号

这是数据库的基本安全原则,但在 MCP 的场景下容易被忽略。

Claude 拿到了 root 权限的 connection string,理论上它有能力 DROP TABLE。不是 Claude 会故意搞破坏,而是它可能在调试的时候不小心执行了一条危险命令。

给我的教训:MCP server 的数据库账号,遵循最小权限原则。 能只读就别给写,能给 schema 就别给 superuser。

坑四:server 启动失败会静默降级

你配了一个 MCP server,但 npx 装依赖的时候出错了,或者 command 路径不对。Claude Code 不会报错——它只是默默跳过这个 server,继续用其他能力。

结果是:你以为配好了,其实没生效。Claude 不会"查数据库",因为它根本没连上。

判断 server 是否正常加载的方法:

你当前有哪些 MCP tools?

如果列表里没有你刚配的 server,说明启动出问题了。去检查一下 ~/.claude.json 的 JSON 格式有没有问题,commandargs 是不是正确。

一个反直觉的事实

我最早对 MCP 的理解是"给 Claude 加工具"。用了一段时间之后我发现——MCP 真正改变的是 Claude 的工作边界。

以前 Claude Code 是一个"能在本地文件系统上移动的 AI"。有了 MCP 之后,它是一个"能调用外部系统完成端到端任务的 AI"。

前者能帮你改代码。后者能帮你从"查数据→分析→写报告→发通知"整个链路全搞定。

这不是工具数量的差异,是工作流形态的改变。

下篇聊聊 Subagents,那个让 Claude Code 能同时分身干几件事的机制。

评论

此博客中的热门博文

我写了半年 prompt,这是我发现的最好的技巧