智能编码进化论

给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,完整的扩展组件图就清晰了:

维度SkillsMCP
类比内部工具箱(查手册)外线电话(直接对话外部系统)
提供什么知识、流程、参考资料工具、数据访问、外部操作
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接口文档读资料Skillsendpoint列表、请求格式、错误码
查询数据库做操作MCP执行SQL、返回结果
代码审查清单读资料Skills审查要点、风险分类
创建GitHub Issue做操作MCP调用API创建Issue
数据库规范+查询读+做Skills + MCPSkills写"必须带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即可。

三种方式对比

维度stdioHTTPSSE
运行位置本地进程远程服务器远程服务器
配置复杂度低中中(已弃用)
网络要求不需要需要需要
资源占用每个服务器一个进程无本地进程无本地进程
适用场景本地工具、数据库云服务、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(工具搜索)是Claude Code的延迟加载机制。默认开启。

工作原理:

  1. 会话启动时,只加载工具的名称,不加载完整schema。
  2. AI需要用工具时,通过内部的 ToolSearch 工具搜索相关工具。
  3. 只有实际用到的工具,完整的参数schema才进入上下文。

效果:连10个MCP服务器,上下文消耗和连1个差不多——因为大部分工具根本不会被调用。

通过环境变量 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服务器连不上。

排查路径:

  1. 检查服务器状态:在Claude Code内输入 /mcp,看哪些服务器显示连接失败。
  2. 检查网络:HTTP服务器需要能访问目标URL。公司内网可能需要代理。
  3. 调整超时:默认超时可能不够。设置 MCP_TIMEOUT 环境变量:MCP_TIMEOUT=10000 claude(10秒)。
  4. stdio服务器检查命令路径:npx 是否在PATH中?命令是否需要全局安装?
  5. 查看日志: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配工具箱:Skills技能实战

下一篇:给AI招帮手:Subagent深度定制


本文内容仅供学习交流,所述方法需结合实际场景灵活运用。 AI工具输出结果仅供参考,关键业务决策请结合人工判断。

本文由AI辅助创作,经人工审核编辑后发布。

本文首发于微信公众号「羲和Lab」,公众号内可留言交流

阅读公众号原文