在 AI 智能体技术飞速发展的今天,我们正见证着一场从"只会聊天的 LLM"向"能干活的智能体"的范式转移。这一转型的核心挑战在于:LLM 如何安全、高效地与外部世界连接?

本文将深入剖析业界最受关注的解决方案——模型上下文协议(Model Context Protocol, MCP),并探讨它与**智能体技能(Agent Skills)**之间的协作关系。


一、MCP 是什么?AI 界的"USB-C"标准

问题的由来

在 MCP 出现之前,将 AI 连接到数据库、API 或企业系统通常需要:

  • 为每个数据源编写定制化的集成代码
  • 针对不同 AI 应用重复开发相同的连接器
  • 维护大量脆弱的"胶水代码"

MCP 的核心理念:建立一个开放标准,让 AI 应用与外部数据源之间的对接变得像插 USB-C 接口一样简单——一次开发,到处使用

架构设计:三层分工明确

MCP 采用经典的客户端-服务器架构,包含三个核心角色:

┌─────────────────────────────────────────┐
│   宿主 (Host)                           │
│   如: Claude Desktop、VS Code           │
│   ┌───────────────────────────────┐    │
│   │  MCP 客户端 (Client)          │    │
│   │  负责协议通信                 │    │
│   └───────────┬───────────────────┘    │
└───────────────┼─────────────────────────┘
                │ JSON-RPC 2.0
    ┌───────────▼───────────┐
    │  MCP 服务器 (Server)  │
    │  ┌─────────────────┐  │
    │  │ 工具 (Tools)    │  │
    │  │ 资源 (Resources)│  │
    │  │ 提示词 (Prompts)│  │
    │  └─────────────────┘  │
    └───────────────────────┘

实际交互流程示例

  1. 用户在 VS Code 中询问:“查询用户表结构”
  2. LLM 识别需要调用 MCP 工具 execute_sql
  3. MCP客户端向 MCP 服务器发送 JSON-RPC 请求
  4. MCP服务器执行 SQL 查询并返回 JSON 格式结果
  5. MCP客户端收到后返回到LLM上下文中
  6. LLM 基于返回数据生成自然语言回复

⚠️注意:MCP服务器只与MCP客户端进行交互。


二、三大核心原语:构建能力的基础模块

MCP 服务器通过三类原语(Primitives)向 AI 暴露能力:

1. 工具(Tools)- LLM 的"执行手"

  • 控制权:由 LLM 决定何时调用
  • 特性:可以对外部系统进行操作(写数据库、发邮件、执行代码)
  • 类比:REST API 的 POST 请求

代码示例(Python):

# 目前已经有了专门的类来实现MCP服务,如FASTMCP
@mcp.tool()
def execute_sql(query: str) -> str:
    """在生产数据库上执行只读 SQL 查询
    
    Args:
        query: 标准 SQL 语句(必须包含 LIMIT 子句)
    """
    # 安全检查
    if "LIMIT" not in query.upper():
        raise ValueError("查询必须包含 LIMIT 以防止全表扫描")
    
    return database.execute(query)

2. 资源(Resources)- 知识的"信息源"

  • 控制权:由应用程序管理访问权限
  • 特性只读数据,不产生副作用
  • 类比:REST API 的 GET 请求

典型用途

  • 本地文件内容(file:///path/to/doc.md
  • 实时日志流(logs://production/errors
  • 数据库表结构(schema://users

3. 提示词(Prompts)- 工作流的"模板引擎"

  • 控制权:由用户选择和触发
  • 特性:预设的指令框架,确保任务执行一致性

使用场景

# 提示词:代码审查助手

请按以下标准审查代码:
1. 安全性:检查 SQL 注入、XSS 等漏洞
2. 性能:识别 N+1 查询、内存泄漏
3. 可维护性:评估命名规范、注释完整性

[用户代码将插入此处]

三、传输协议深度解析

MCP 服务器支持多种传输机制以适应不同部署场景:

stdio(标准输入输出)

适用场景:用于本地部署MCP服务,然后通过stdio协议进行本地自调用。如Claude Desktop与本地自己部署的MCP服务的调用。

关键限制

# ❌ 错误示例 - 会破坏 JSON-RPC 通信
print("正在查询数据库...")  

# ✅ 正确示例 - 使用标准错误输出调试
import sys
print("DEBUG: 查询参数=" + query, file=sys.stderr)

原因:stdio 模式下,标准输出(stdout)专用于传输 JSON-RPC 消息,print()等方法会将信息存储到stdin中从而破坏了传输的 JSON-RPC。任何非协议数据都会导致连接崩溃。

HTTP + SSE

组合优势

  • HTTP POST:客户端向远程MCP服务器发送指令,可以对MCP服务进行操作(如插入数据到数据库等)
  • SSE(服务器发送事件):MCP服务器完成操作后推送实时更新(如进度条)到MCP客户端。

四、性能优化:渐进式上下文加载

Token 消耗控制策略

假设场景:接入 100 个 MCP 服务,每个服务提供 10 个工具。

传统做法(不可行)

  • 将所有工具的完整文档一次性加载到上下文
  • 估算 Token 消耗:100 × 10 × 50 = 50,000 tokens

MCP 的分层加载机制

  1. 初始化阶段 - 仅传输元数据
{
  "name": "execute_sql",
  "description": "执行只读 SQL 查询",
  "inputSchema": {
    "type": "object",
    "properties": {
      "query": {"type": "string"}
    }
  }
}
  1. 调用阶段 - 按需加载详细数据
  • LLM 根据元数据判断是否需要调用工具
  • 仅当工具被触发时,实际数据才进入上下文

这里的设计思想类似于agent skill

Token 节省:初始阶段仅消耗约 5,000 tokens(减少 90%)


五、MCP 与 Agent Skills:策略与执行的完美配合

许多开发者混淆两者的定位。实际上,它们是互补关系:

对比矩阵

维度 Agent Skills MCP
本质 知识与工作流(SOP) 连接能力
表现形式 Markdown 文档 代码服务器
作用对象 指导 LLM 的决策逻辑 提供 LLM 的执行手段
类比 企业操作手册 API 接口

skill 仅仅会将skill中定义的信息加载到模型上下文中(当需要的时候),并不具备调用外部接口的能力。

协作示例:数据库审计智能体

Skill 文档database-audit-skill.md):

# 数据库审计技能

## 核心原则
1. 所有查询必须包含 `LIMIT` 子句(最大 1000)
2. 禁止使用 `SELECT *`,必须明确列名
3. 敏感字段(如密码)需脱敏处理

## 工作流程
1. 解析用户需求 → 生成 SQL
2. 调用 MCP 工具(audit_query)执行查询
3. 格式化结果并标注风险点

MCP 服务器(执行层):

@mcp.tool()
def audit_query(sql: str) -> dict:
    """执行审计查询并返回风险评分"""
    # Skill 的策略在这里被强制执行
    validate_sql_safety(sql)  # 检查 LIMIT、SELECT * 等
    result = execute_with_monitoring(sql)
    return {
        "data": mask_sensitive_fields(result),
        "risk_score": calculate_risk(sql)
    }

协作逻辑

  • Skill 定义了"什么是安全的查询"(策略层)
  • MCP 提供了"如何执行查询"的能力(执行层)
  • LLM 先阅读 Skill 学习最佳实践,再通过 MCP 调用工具

六、实战部署:快速上手

场景 1:为 Claude Desktop 添加 GitHub 集成

步骤

  1. 安装官方 MCP 服务器:
npm install -g @modelcontextprotocol/server-github
  1. 配置 claude_desktop_config.json
{
  "mcpServers": {
    "github": {
      "command": "mcp-server-github",
      "env": {
        "GITHUB_TOKEN": "your_token_here"
      }
    }
  }
}
  1. 重启 Claude Desktop,测试查询:
"列出我的仓库中最近打开的 Issues"

场景 2:自定义 MCP 服务器(天气查询)

完整代码(TypeScript):

import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

const server = new Server({
  name: "weather-server",
  version: "1.0.0"
}, {
  capabilities: {
    tools: {}
  }
});

server.setRequestHandler("tools/list", async () => ({
  tools: [{
    name: "get_weather",
    description: "获取指定城市的天气",
    inputSchema: {
      type: "object",
      properties: {
        city: { type: "string" }
      },
      required: ["city"]
    }
  }]
}));

server.setRequestHandler("tools/call", async (request) => {
  if (request.params.name === "get_weather") {
    const weather = await fetchWeather(request.params.arguments.city);
    return { content: [{ type: "text", text: JSON.stringify(weather) }] };
  }
});

const transport = new StdioServerTransport();
await server.connect(transport);

七、生态现状与未来展望

MCP Registry:生态系统的催化剂

类似于 npm、PyPI,Anthropic 推出了 MCP Registry,提供官方验证的服务器:

热门集成

  • 生产力:Google Drive、Slack、Notion
  • 开发工具:GitHub、GitLab、Sentry
  • 数据库:PostgreSQL、MongoDB、Snowflake
  • 监控:Prometheus、Datadog

未来趋势

  1. 企业级功能增强

    • 细粒度权限控制(RBAC)
    • 审计日志与合规性支持
    • 多租户隔离
  2. 工具链完善

    • 可视化配置工具
    • 性能监控仪表板
    • 自动化测试框架
  3. 跨模型兼容性

    • OpenAI GPTs 支持 MCP
    • 开源模型(Llama、Mistral)原生集成

总结

MCP 的诞生标志着 AI 生态系统迈向标准化与模块化时代。它不仅打破了模型的知识截止日期限制,更让企业能够以安全、可控的方式授权 AI 访问私有数据。

核心洞察

  • MCP 提供"手"(执行能力)
  • Agent Skills 提供"脑"(决策逻辑)
  • 两者结合才能构建真正强大的智能体

未来,构建企业级 AI 应用可能只需三步:

  1. 从 MCP Registry 挑选标准服务器
  2. 编写定制化的 Agent Skills
  3. 通过配置文件完成集成

下一步行动
如果你想深入实践,推荐从以下方向入手:

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐