给AI接外线:用MCP协议直连数据库与云服务
约 26 分钟驭光者首发于微信公众号「羲和Lab」

Skills是内部工具箱,MCP是外线电话——让AI直接对话数据库、API和云服务
阅读时长约12分钟 | 教程型 | 智能编码进化论 05/10
导读
上一篇我们给AI配了工具箱(Skills),让它能按需加载参考资料和工作流程。但工具箱有个限制——里面装的都是"纸上知识":API文档、审查清单、部署步骤。AI读完文档,还是得让你手动查数据库、手动发消息、手动操作外部系统。
MCP(Model Context Protocol)就是那根"外线电话线"。接上之后,AI能直接查询数据库、创建GitHub Issue、发送Slack消息、控制浏览器——不需要你做中间人。
本章讲清楚:MCP是什么、怎么配置三种类型的连接、怎么选scope、认证怎么做、企业怎么管控,以及连接出问题时怎么排查。
一、MCP是什么:从内部工具到外线电话
Skills和MCP的分工
上一篇讲Skills时,我们说它是"按需加载的工具箱"。现在加上MCP,完整的扩展组件图就清晰了:
| 维度 | Skills | MCP |
|---|---|---|
| 类比 | 内部工具箱(查手册) | 外线电话(直接对话外部系统) |
| 提供什么 | 知识、流程、参考资料 | 工具、数据访问、外部操作 |
| AI能做什么 | 读文档、参考规范 | 查数据库、发消息、操作浏览器 |
| 上下文成本 | 加载时有 | 连接时有,Tool Search后按需 |
一句话总结:Skills让AI"知道怎么做",MCP让AI"真的能做"。
值得一提的是,MCP全称"Model Context Protocol"——注意"Context"这个词。MCP的设计目标不只是调用外部API,而是将外部信息注入AI的上下文。这和Skills的 ! 语法(动态注入命令输出)是同一个设计思路——用外部数据丰富AI的"视野"。Skills从本地文件系统注入,MCP从网络服务注入,手段不同,目标一致。
Skills还是MCP?选择策略
这是实践中被问得最多的问题:"我该用Skills还是MCP?"答案取决于你让AI做什么——读还是做。
判断标准很简单:AI需要"读资料"还是"做操作"?
| 场景 | AI需要什么 | 用什么 | 举例 |
|---|---|---|---|
| API接口文档 | 读资料 | Skills | endpoint列表、请求格式、错误码 |
| 查询数据库 | 做操作 | MCP | 执行SQL、返回结果 |
| 代码审查清单 | 读资料 | Skills | 审查要点、风险分类 |
| 创建GitHub Issue | 做操作 | MCP | 调用API创建Issue |
| 数据库规范+查询 | 读+做 | Skills + MCP | Skills写"必须带LIMIT",MCP执行查询 |
三种常见误区:
误区一:"用Skill写个数据库查询模板,AI就能查数据库了。" 不行。Skill只能提供知识(SQL模板、表结构),不能建立连接。AI读完Skill后还是得让你手动执行SQL。需要MCP才能让AI真正连上数据库。
误区二:"接了MCP就不需要Skills了。" 错。MCP只提供"能力"——AI能查数据库了。但"查什么、怎么查安全"——这些知识需要Skills来教。没有Skills的MCP,就像给实习生一个数据库账号但不告诉他规则——很可能写出 DELETE FROM users 这种危险操作。
误区三:"两个都接上就够了,不用管配合。" 缺了一步。MCP和Skills需要配对设计:MCP提供连接,Skills定义使用规范。第七节的实战案例展示了完整的配对方案。
一句话决策:需要AI"读"东西 → Skills;需要AI"做"事情 → MCP;需要AI"做对"事情 → Skills + MCP。最佳实践是配对设计:MCP提供连接和工具,Skills定义使用规范和安全边界。两者配对的完整案例见第七节。
举个具体例子。你在Skills里写了数据库表结构文档——AI知道users表有哪些字段。但查数据?还是得你手动打开数据库客户端,执行SQL,把结果贴回来。接上MCP后,AI直接执行查询拿到结果。再配上Skills里的"查询必须带LIMIT"规范,AI就能安全、正确地操作数据库了。
什么时候该接MCP
三个信号,说明你需要MCP了:
信号一:你频繁在Claude Code和浏览器之间切换。 一会儿问AI写SQL,一会儿切到数据库客户端执行,再把结果贴回来——这说明AI需要一个数据库连接。
信号二:你经常复制外部数据给AI。 从GitHub复制Issue内容、从Slack复制消息、从Jira复制需求描述——这些都是MCP可以自动化的。
信号三:AI的操作需要人类当中间人。 AI说"帮我创建一个Issue",你说"好的我来创建"——为什么不直接让AI创建?
MCP的三大能力
MCP服务器不只是"调用API"这么简单。它提供三种能力:
Tools(工具):可调用的函数。比如查数据库、创建Issue、发送消息。这是最常用的能力。
Resources(资源):可引用的数据。用 @server:protocol://path 语法引用。比如 @github:issue://123 引用一个GitHub Issue的内容。
Prompts(提示词):MCP服务器暴露的预定义提示词,变成Claude Code里的slash command。比如 /mcp__github__list_prs 列出所有PR。
其中Tools最常用,也最值得关注。下面我们重点讲Tools的配置和使用。
二、配置实战:三种传输方式
MCP服务器和Claude Code之间有三种通信方式,对应不同的场景。
第一种:stdio——本地进程
stdio是最简单的方式。Claude Code启动一个本地进程,通过标准输入输出通信。
适用场景:本地安装的工具、npm包、Python脚本。
# 添加一个PostgreSQL数据库连接
claude mcp add --transport stdio db \
-- npx -y @bytebase/dbhub \
--dsn "postgresql://readonly:pass@localhost:5432/mydb"
# 添加Playwright浏览器控制
claude mcp add --transport stdio playwright \
-- npx -y @playwright/mcp@latest
# 添加带环境变量的服务器
claude mcp add --transport stdio \
--env AIRTABLE_API_KEY=your_key \
airtable -- npx -y airtable-mcp-server
参数顺序注意:所有选项(--transport、--env、--scope)必须放在服务器名称之前。-- 是分隔符——前面的参数属于 claude mcp add 命令,后面的参数会原样传给MCP服务器进程。漏掉 -- 或放错位置,命令会解析失败。
对应的.mcp.json配置:
{
"mcpServers": {
"db": {
"command": "npx",
"args": ["-y", "@bytebase/dbhub", "--dsn", "postgresql://readonly:pass@localhost:5432/mydb"]
}
}
}
stdio方式的优点是配置简单,不需要网络。缺点是每个MCP服务器都是独立进程,占用本地资源。配置完成后,启动Claude Code,AI就能直接查询数据库或控制浏览器了。
第二种:HTTP——远程服务器(推荐)
HTTP是连接远程MCP服务器的推荐方式。配置语法和stdio类似,但多了URL和请求头:
# GitHub(带认证头)
claude mcp add --transport http github \
https://api.githubcopilot.com/mcp/ \
--header "Authorization: Bearer YOUR_GITHUB_PAT"
# Sentry——无需额外认证,直接连接
claude mcp add --transport http sentry \
https://mcp.sentry.dev/mcp
对应 .mcp.json 配置,只需指定 type: "http" 和 url:
{
"mcpServers": {
"github": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/",
"headers": {
"Authorization": "Bearer YOUR_GITHUB_PAT"
}
}
}
}
HTTP方式的优势在于零本地资源占用——没有本地进程,所有通信走网络。配置写入后,AI就"知道"这个服务的存在了。但它在哪个项目能用?这就是下一节要讲的Scope。
环境变量展开是HTTP配置的实用特性。把敏感信息放在环境变量中,配置文件只引用变量名:
${VAR}展开为环境变量值${VAR:-default}提供默认值(变量不存在时使用)- 支持展开的字段:
command、args、env、url、headers
这样 .mcp.json 可以安全提交到git,实际Token通过环境变量注入。
第三种:SSE——旧版远程连接(已弃用)
SSE(Server-Sent Events)是早期的远程连接方式,推荐使用HTTP替代。如果你在维护使用SSE的旧系统,参考官方文档迁移到HTTP。新项目直接用HTTP即可。
三种方式对比
| 维度 | stdio | HTTP | SSE |
|---|---|---|---|
| 运行位置 | 本地进程 | 远程服务器 | 远程服务器 |
| 配置复杂度 | 低 | 中 | 中(已弃用) |
| 网络要求 | 不需要 | 需要 | 需要 |
| 资源占用 | 每个服务器一个进程 | 无本地进程 | 无本地进程 |
| 适用场景 | 本地工具、数据库 | 云服务、API | 旧系统兼容 |
| 认证方式 | 环境变量 | OAuth/请求头 | OAuth/请求头 |
管理命令速查
claude mcp list # 列出所有已配置的服务器
claude mcp get github # 查看某个服务器的详细信息
claude mcp remove github # 移除某个服务器
/mcp # 在Claude Code内查看连接状态
claude mcp reset-project-choices # 重置项目级服务器的审批状态
三、Scope选择:谁能用这个连接
MCP服务器的配置存放在不同位置,决定了谁能在哪里使用。
三种Scope
| Scope | 存放位置 | 谁能用 | 场景 |
|---|---|---|---|
| Local | ~/.claude.json | 只有你,只在当前项目 | 含敏感凭据的实验性连接 |
| Project | 项目根目录 .mcp.json | 团队所有人(通过git共享) | 项目通用的数据库、API |
| User | ~/.claude.json | 只有你,所有项目 | 个人工具(如GitHub、Slack) |
指定Scope:
claude mcp add --transport http stripe https://mcp.stripe.com # 默认local
claude mcp add --transport http paypal --scope project https://mcp.paypal.com/mcp # 写入.mcp.json
claude mcp add --transport http hubspot --scope user https://mcp.hubspot.com/anthropic # 所有项目
一条命令,差别只在 --scope 参数。
选择Scope的决策树
这个连接包含敏感凭据吗? 是 → Local或User,不要提交到git。
这个连接是项目专属的吗? 是 → Project scope,写进 .mcp.json,团队共享。
你在多个项目都用这个工具吗? 是 → User scope,一次配置,处处可用。
你只是在实验? 是 → Local scope,实验完了再调整。
最常用的是Project scope——数据库连接、API端点这些跟着项目走,团队共享最合理。个人工具(GitHub PAT、Slack Token)放User scope,避免敏感信息进入git。
优先级规则
同名服务器的优先级(从高到低):Local > Project > User > Plugin > claude.ai连接器。高优先级的覆盖低优先级的。
比如你在Project的 .mcp.json 配了一个 db 服务器,同时在Local也配了一个 db——Local的生效。
四、认证:安全地连接外部服务
OAuth认证流程
很多第三方服务需要OAuth认证。Claude Code内置了OAuth支持:
第一步:添加服务器
claude mcp add --transport http sentry \
https://mcp.sentry.dev/mcp
第二步:在Claude Code内完成认证
启动Claude Code,输入 /mcp,看到服务器列表。Sentry旁边会显示需要认证。点击后会打开浏览器,完成OAuth登录流程。
第三步:自动刷新
认证完成后,Token安全存储在系统钥匙串(macOS)或凭据文件中,自动刷新。
固定回调端口(预注册的redirect URI场景):
claude mcp add --transport http \
--callback-port 8080 \
my-server https://mcp.example.com/mcp
预配置OAuth凭据(服务不支持动态客户端注册时):
claude mcp add --transport http \
--client-id your-client-id \
--client-secret \
--callback-port 8080 \
my-server https://mcp.example.com/mcp
Client Secret不会写入配置文件,存储在系统钥匙串中。
非OAuth认证:动态请求头
有些内部服务用Kerberos、短时Token等非标准认证方式。Claude Code支持 headersHelper——每次连接前执行脚本获取认证头:
{
"mcpServers": {
"internal-api": {
"type": "http",
"url": "https://mcp.internal.example.com",
"headersHelper": "/opt/bin/get-mcp-auth-headers.sh"
}
}
}
脚本要求:输出JSON格式的请求头到stdout,10秒超时,每次连接重新执行。
环境变量管理敏感信息
最实用的做法是把Token和Key放在环境变量中,配置文件只引用变量名:
{
"mcpServers": {
"db": {
"command": "npx",
"args": ["-y", "@bytebase/dbhub"],
"env": {
"DATABASE_URL": "${DB_URL}"
}
}
}
}
.mcp.json 安全提交到git,实际值通过环境变量注入。Claude Code会在加载配置时自动展开 ${VAR} 和 ${VAR:-default}。
五、性能优化:Tool Search延迟加载
问题:工具太多,上下文爆了
一个MCP服务器可能暴露几十个工具。连上5个服务器,每次会话启动就要加载上百个工具的完整schema——上下文消耗很大。
解法:Tool Search
Tool Search(工具搜索)是Claude Code的延迟加载机制。默认开启。
工作原理:
- 会话启动时,只加载工具的名称,不加载完整schema。
- AI需要用工具时,通过内部的
ToolSearch工具搜索相关工具。 - 只有实际用到的工具,完整的参数schema才进入上下文。
效果:连10个MCP服务器,上下文消耗和连1个差不多——因为大部分工具根本不会被调用。
配置Tool Search
通过环境变量 ENABLE_TOOL_SEARCH 控制:
| 值 | 行为 |
|---|---|
| 不设置 | 默认延迟加载。Vertex AI或非官方API自动降级为全量加载 |
true | 强制延迟加载 |
auto | 阈值模式:工具数接近上下文窗口10%时延迟加载 |
auto:5 | 自定义阈值百分比 |
false | 全量加载 |
# 自定义阈值
ENABLE_TOOL_SEARCH=auto:5 claude
# 关闭延迟加载(调试用)
ENABLE_TOOL_SEARCH=false claude
强制加载特定服务器或工具:
{
"mcpServers": {
"core-tools": {
"type": "http",
"url": "https://mcp.example.com/mcp",
"alwaysLoad": true
}
}
}
服务器级设 alwaysLoad: true,工具级在 _meta 中标记:
{
"name": "get_schema",
"_meta": {
"anthropic/alwaysLoad": true
}
}
注意:Tool Search要求模型支持
tool_reference块。Claude Sonnet 4及以上、Opus 4及以上支持,Haiku不支持。在Vertex AI上,需要Sonnet 4.5+或Opus 4.5+才支持。不支持的模型会自动降级为全量加载。
六、企业管控:IT团队的安全策略
本节面向团队TL和技术负责人。如果你是个人开发者,可以跳过本节,直接阅读第七节的实战案例。当然,了解企业管控的机制也有助于你理解为什么有些MCP服务器在公司环境里连不上。
企业环境中,IT部门需要管控AI能连接哪些外部服务。Claude Code提供两种管控方式:手动部署配置文件(endpoint-managed)和Claude.ai管理界面下发(server-managed,无需MDM基础设施)。
方式一:独占式管控(managed-mcp.json)
在系统级路径放置 managed-mcp.json,完全控制允许的MCP服务器:
- macOS:
/Library/Application Support/ClaudeCode/managed-mcp.json - Linux:
/etc/claude-code/managed-mcp.json
{
"mcpServers": {
"github": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/"
},
"company-db": {
"type": "stdio",
"command": "/usr/local/bin/company-db-server",
"env": {
"DB_URL": "postgresql://readonly@internal.company.com/analytics"
}
}
}
}
部署后,用户只能使用文件中列出的服务器,不能自行添加。适合严格管控的企业环境。
方式二:策略式管控(白名单/黑名单)
在managed settings中配置 allowedMcpServers 和 deniedMcpServers,更灵活:
{
"allowedMcpServers": [
{ "serverName": "github" },
{ "serverName": "sentry" },
{ "serverCommand": ["npx", "-y", "@modelcontextprotocol/server-filesystem"] },
{ "serverUrl": "https://mcp.company.com/*" }
],
"deniedMcpServers": [
{ "serverName": "dangerous-server" },
{ "serverUrl": "https://*.untrusted.com/*" }
]
}
三种匹配方式:
serverName:精确匹配服务器名称serverCommand:精确匹配命令+参数(stdio方式)serverUrl:URL模式匹配,支持*通配符
规则:deniedMcpServers 优先于 allowedMcpServers。先检查黑名单,再检查白名单。
两种方式可以组合使用:managed-mcp.json定义允许的服务器,白名单进一步限制范围。
七、实战案例:一个项目的完整MCP配置
假设你有一个Node.js + PostgreSQL项目,需要连接数据库、GitHub和Sentry。下面是完整的配置方案。
项目级配置(.mcp.json,提交到git):
{
"mcpServers": {
"db": {
"command": "npx",
"args": ["-y", "@bytebase/dbhub"],
"env": {
"DATABASE_URL": "${DB_URL:-postgresql://dev:dev@localhost:5432/default}"
}
},
"github": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/"
},
"sentry": {
"type": "http",
"url": "https://mcp.sentry.dev/mcp"
}
}
}
开发者本地(环境变量,不提交git):
# .env.local(加入.gitignore)
export DB_URL="postgresql://dev:dev@localhost:5432/mydb"
export GITHUB_PAT="ghp_xxxxx"
效果:
- 团队成员clone项目后,MCP配置自动生效
- 数据库连接使用本地环境变量,每个人的开发库互不干扰
- GitHub和Sentry通过OAuth认证,无需共享Token
db服务器默认连接dev:dev@localhost:5432/default,新成员零配置就能用
搭配Skills使用(.claude/skills/db-guide/SKILL.md):
---
description: 数据库查询规范和表结构参考
---
## 数据库规范
- 查询必须带 LIMIT,默认100条
- 禁止 DELETE 不带 WHERE
- 只读账号,不支持 DDL
## 表结构
@db:schema://users
@db:schema://orders
MCP提供数据库连接能力,Skills教AI怎么正确使用——这就是"MCP + Skills"的组合拳。上一篇提到的"Skills + MCP"化学反应,到这里就成了完整的实战方案。
八、避坑指南
坑一:MCP服务器连接超时
启动Claude Code后,MCP服务器连不上。
排查路径:
- 检查服务器状态:在Claude Code内输入
/mcp,看哪些服务器显示连接失败。 - 检查网络:HTTP服务器需要能访问目标URL。公司内网可能需要代理。
- 调整超时:默认超时可能不够。设置
MCP_TIMEOUT环境变量:MCP_TIMEOUT=10000 claude(10秒)。 - stdio服务器检查命令路径:
npx是否在PATH中?命令是否需要全局安装? - 查看日志:Claude Code启动时会输出MCP连接日志,注意错误信息。
坑二:工具输出太大,上下文溢出
MCP工具返回的数据量很大(比如查询一个10万行的表),导致上下文窗口爆满。
解法:
- 默认上限25,000 tokens。调大:
MAX_MCP_OUTPUT_TOKENS=50000 claude - MCP服务器作者可以在工具的
_meta中设置anthropic/maxResultSizeChars(最大500,000字符) - 最佳实践:在Skills中教AI加
LIMIT,从源头控制数据量
坑三:项目中途断连
会话进行中,之前能用的MCP工具突然报错。
原因:MCP连接可能静默断开,特别是HTTP服务器在网络不稳定时。
解法:输入 /mcp 检查连接状态。Claude Code会自动重连(指数退避,最多5次,从1秒开始翻倍)。如果重连失败,重启Claude Code。
坑四:Project scope服务器没生效
你在 .mcp.json 里配了服务器,但Claude Code没加载。
原因:Project scope的服务器首次使用需要审批。Claude Code会弹确认框,你可能错过了。
解法:claude mcp reset-project-choices 重置审批状态,下次启动会重新询问。
坑五:环境变量未展开
配置中 ${API_KEY} 没有被替换,原样传给了服务器。
排查:确认环境变量已设置(echo $API_KEY)。如果变量不存在且没有默认值(:-default),配置解析会失败。检查变量名拼写。
结语
四篇文章下来,我们的AI"员工"越来越能干了:CLAUDE.md让它了解公司规矩,结构化任务让它听懂指令,Skills让它拥有专业工具箱,现在MCP让它能直接操作外部系统。
五个关键要点:
MCP是AI的外线电话——接通后,AI不再需要你当中间人,能直接查询数据库、创建Issue、发送消息。
三种传输方式按场景选择——本地工具用stdio,云服务用HTTP,SSE已弃用。
Scope决定谁能用——项目通用的放Project scope(.mcp.json),个人工具放User scope,含敏感凭据的放Local scope。
Tool Search让连接轻量化——延迟加载工具schema,连10个服务器和连1个差不多。
MCP + Skills是终极组合——MCP提供能力,Skills教AI怎么正确使用。
下一篇,我们给AI招帮手——Subagent深度定制。如果说MCP是给AI接通了外线电话,Subagent就是给它配了一支专业团队,安全审查、性能优化、代码风格检查可以同时进行。
互动话题
你的项目里,第一个想接的MCP服务器是什么?是数据库查询、GitHub集成,还是Slack消息通知?来评论区分享你的MCP连接计划。
智能编码进化论 | 第5篇/共10篇
下一篇:给AI招帮手:Subagent深度定制
本文内容仅供学习交流,所述方法需结合实际场景灵活运用。 AI工具输出结果仅供参考,关键业务决策请结合人工判断。
本文由AI辅助创作,经人工审核编辑后发布。
本文首发于微信公众号「羲和Lab」,公众号内可留言交流
阅读公众号原文