MCP(模型上下文协议)
把 AI 编程助手接入真实的外部系统——数据库、API、内部工具
🎯 什么是 MCP?
MCP(Model Context Protocol,模型上下文协议)是一套开放标准,用来把 AI 助手连接到外部工具和数据源。以往 AI 只能依赖训练数据和你手动展示给它的文件,而通过 MCP server,AI 可以获得实时能力——查询数据库、调用内部 API、搜索文档、读取工单系统里的问题——这些都变成了 AI 在对话中可以直接调用的工具。
可以把 MCP server 理解成插件:每一个都专注于一个系统,并暴露一小组工具/资源供 AI 交互使用。
💡 为什么重要
没有 MCP 的时候,"查一下 staging 环境当前的数据库表结构"或者"看一下 Jira 里这张工单"都需要你手动把数据复制粘贴进对话框。接入了合适的 MCP server 之后,AI 可以直接查询,基于实时、最新的数据进行推理。
📦 配置作用域
和 Claude Code 的其他配置一样,MCP server 也可以在三个层级注册:
| 作用域 | 文件 | 是否团队共享 | 典型用途 |
|---|---|---|---|
| 用户级(全局) | ~/.claude.json(user scope) | 否——个人专属 | 所有项目都会用到的服务(如你个人的 GitHub 账号、个人笔记工具) |
| 项目级 | 仓库根目录的 .mcp.json,提交到 git | 是 | 这个项目里每个同事都需要的服务(如项目数据库、内部 API 网关) |
| 本地级 | 项目作用域但不提交 | 否——个人覆盖 | 使用个人凭证或本地专属地址的服务 |
# 在项目作用域添加 MCP server(写入 .mcp.json,通过 git 共享)
claude mcp add --scope project my-db -- npx -y @some/mcp-server-db
# 在用户作用域添加 MCP server(个人专属,任何项目都能用)
claude mcp add --scope user github -- npx -y @modelcontextprotocol/server-github
# 列出已配置的 server
claude mcp list
# 移除某个 server
claude mcp remove my-db🧩 示例:项目级 .mcp.json
{
"mcpServers": {
"mysql_prod": {
"command": "npx",
"args": ["-y", "@some-org/mysql-mcp-server"],
"env": {
"MYSQL_HOST": "${MYSQL_PROD_HOST}",
"MYSQL_USER": "${MYSQL_PROD_USER}",
"MYSQL_PASSWORD": "${MYSQL_PROD_PASSWORD}"
}
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"]
}
}
}⚠️ 绝不提交敏感凭证
凡是会被提交到 git 的 .mcp.json,敏感信息一律用环境变量引用(${MYSQL_PROD_PASSWORD}),不要写死明文。个人专属的凭证应该放在 .env 文件或 shell 配置里,绝不放进被 git 跟踪的配置文件。
🔒 权限与安全
每一次 MCP 工具调用都会走和内置工具一样的权限体系。你可以:
- 默认要求每次调用都手动确认(新接入的 server 默认如此)
- 在
settings.json/settings.local.json里预先放行特定工具,例如把"mcp__github__create_issue"加入allow列表 - 在 server 层面就把数据库 MCP server 限制成只读查询——这是最安全的做法,不要只靠"提示词让它小心点"来防止误写
⚠️ 生产环境数据库
如果你把 MCP server 接到生产数据库,尽量在连接字符串层面使用只读数据库账号。不要指望 AI "会小心"——一定要在基础设施层面强制限制。
🚀 真实项目中常见的 MCP server
| Server | 用途 |
|---|---|
| Filesystem | 读写工作目录沙箱之外的文件 |
| GitHub / GitLab | 处理 CLI 没有 checkout 的仓库的 issue、PR、代码搜索 |
| 数据库(MySQL/Postgres 等) | 直接查询表结构和数据,不用手动粘贴 SQL 结果 |
| Slack | 读取/发送消息,用于状态同步或故障协同 |
| Web fetch / 浏览器 | 抓取并阅读文档页面、API 参考 |
| 内部 API 网关 | 封装公司内部服务的自定义 MCP server |
💡 多环境场景,统一命名模式
对于有 dev/test/UAT/prod 多套数据库的项目,通常会给每个环境分别注册一个 MCP server(比如 mysql、mysql_test、mysql_uat、mysql_prod),而不是用一个带环境参数的 server——这样在工具调用里就能一眼看出正在操作哪个环境,减少误操作生产库的风险。
🛠️ 自己写一个 MCP server
如果现有的 server 都覆盖不了某个内部系统,你可以自己写一个。大体上,一个 MCP server 需要:
- 声明一组工具(AI 可以调用的函数,附带参数的 JSON schema)
- 可选地声明资源(AI 可以浏览的只读数据)
- 以本地进程(stdio 传输)或远程服务(HTTP/SSE 传输)的形式运行
官方提供了 TypeScript 和 Python 的 SDK,把内部 API 或数据库封装成一个小型 MCP server 并不复杂,团队所有人都能在 .mcp.json 里注册使用。
🎉 效果
配置完成后,你的 AI 助手就能直接查询真实的 staging 数据库、开一个真实的 GitHub issue,或者查看某个内部服务的当前状态——都不需要你先手动抓取数据再粘贴进去。