Function Calling、MCP 与 Agent Skills 关系详解

目录

  1. 核心概念
  2. Function Calling
  3. MCP (Model Context Protocol)
  4. Agent Skills
  5. 三者关系对比
  6. 使用场景与选择

核心概念

概念 层级 作用 类比
Function Calling 底层能力 让AI识别并调用函数 人的"手"(执行动作)
MCP 中间协议 标准化工具连接方式 USB接口标准
Agent Skills 上层封装 预构建的复杂任务模块 专业工具套装

一句话总结

Function Calling 是基础能力,MCP 是连接标准,Agent Skills 是封装好的功能模块。


Function Calling

定义

Function Calling(函数调用)是大型语言模型(LLM)的原生能力,允许模型在生成回复时识别需要调用的外部函数,并生成符合函数签名的参数。

核心功能

  • 意图识别:判断用户请求是否需要调用工具
  • 参数提取:从用户输入中提取函数所需的参数
  • 结果处理:将函数执行结果整合到回复中

工作流程

用户输入 → LLM分析 → 识别需调用函数 → 生成参数 → 调用函数 → 返回结果 → LLM整合回复

代码示例(OpenAI)

import openai

# 定义函数
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取指定城市的天气",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "城市名称"}
                },
                "required": ["city"]
            }
        }
    }
]

# LLM 判断是否调用
response = openai.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "北京天气怎么样?"}],
    tools=tools
)

# 如果 LLM 决定调用,会返回函数调用信息
if response.choices[0].message.tool_calls:
    tool_call = response.choices[0].message.tool_calls[0]
    # 执行实际函数
    result = get_weather(**json.loads(tool_call.function.arguments))

局限性

  • 紧耦合:每个AI应用需要单独实现工具连接
  • 标准不一:不同厂商的Function Calling格式略有差异
  • 维护复杂:工具增加或修改需要更新代码

MCP (Model Context Protocol)

定义

MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 推出的开放协议标准,用于标准化AI模型与外部工具、数据源之间的连接方式。

核心功能

  • 标准化接口:统一的工具发现、调用和数据交换格式
  • 解耦架构:AI应用与工具实现分离
  • 动态发现:运行时动态发现和加载可用工具
  • 上下文管理:管理工具和资源的上下文信息

架构组成

┌─────────────────┐
│   AI 客户端      │ ← Claude、ChatGPT 等
│  (MCP Client)   │
└────────┬────────┘
         │ MCP 协议
         ▼
┌─────────────────┐
│   MCP 服务器     │ ← 工具提供商实现
│  (MCP Server)   │
└────────┬────────┘
         │
    ┌────┴────┐
    ▼         ▼
┌───────┐ ┌───────┐
│ 工具A  │ │ 工具B  │ ← 具体功能实现
└───────┘ └───────┘

两种实现方式

1. Python (FastMCP)
from fastmcp import FastMCP

# 创建 MCP 服务器
mcp = FastMCP("我的工具集")

@mcp.tool()
def calculate(expression: str) -> str:
    """计算数学表达式"""
    return str(eval(expression))

@mcp.tool()
def get_current_time() -> str:
    """获取当前时间"""
    from datetime import datetime
    return datetime.now().isoformat()

if __name__ == "__main__":
    mcp.run(transport='stdio')
2. Node.js/TypeScript (MCP SDK)
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

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

// 注册工具
server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [
      {
        name: "calculate",
        description: "计算数学表达式",
        inputSchema: {
          type: "object",
          properties: {
            expression: { type: "string" }
          },
          required: ["expression"]
        }
      }
    ]
  };
});

// 处理工具调用
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name === "calculate") {
    const { expression } = request.params.arguments;
    return {
      content: [{ type: "text", text: String(eval(expression)) }]
    };
  }
});

// 启动服务器
const transport = new StdioServerTransport();
await server.connect(transport);

优势

  • 一次编写,到处使用:MCP Server 可被任何支持 MCP 的客户端使用
  • 生态共享:社区可以共享和复用 MCP 服务器
  • 降低集成成本:AI应用只需实现 MCP Client 即可连接所有 MCP Server

Agent Skills

定义

Agent Skills(代理技能)是预构建的、高层次的工具模块,封装了完成特定复杂任务所需的全部逻辑、提示词、工具调用链和错误处理。

核心功能

  • 任务封装:将复杂任务封装为单一可调用的技能
  • 最佳实践:内置经过验证的工作流程和提示词
  • 组合能力:技能可以组合使用完成更复杂的任务
  • 开箱即用:无需了解底层实现即可使用

与 MCP 的区别

维度 MCP Agent Skills
层级 协议/基础设施 应用/功能层
关注点 如何连接工具 如何完成特定任务
使用者 开发者 终端用户/Agent
内容 工具定义和接口 完整任务解决方案
示例 文件系统访问API “分析代码并生成文档”

Agent Skills 示例

# skill.yaml - 技能定义文件
name: code-reviewer
version: 1.0.0
description: 自动代码审查技能

# 所需的工具(通过 MCP 获取)
required_tools:
  - filesystem  # MCP 服务器
  - git         # MCP 服务器

# 执行流程
workflow:
  1. 读取代码文件
  2. 静态分析检查
  3. 生成审查报告
  4. 提供改进建议

# 内置的提示词模板
prompts:
  review: |
    你是一位资深代码审查专家。请审查以下代码:
    
    {code}
    
    关注:安全性、性能、可读性、最佳实践

使用方式

# 加载并使用技能
from opencode import load_skill

# 加载代码审查技能
code_reviewer = load_skill("code-reviewer")

# 直接使用
result = code_reviewer.review(file_path="src/main.py")

三者关系对比

层次结构图

┌─────────────────────────────────────────────────────────────┐
│                    应用层 (Application)                      │
│  ┌─────────────────────────────────────────────────────────┐│
│  │              Agent Skills (代理技能)                     ││
│  │  ┌─────────────────┐  ┌─────────────────┐              ││
│  │  │  代码审查技能    │  │  文档生成技能    │  ...        ││
│  │  └─────────────────┘  └─────────────────┘              ││
│  └─────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────┤
│                    协议层 (Protocol)                         │
│  ┌─────────────────────────────────────────────────────────┐│
│  │              MCP (模型上下文协议)                        ││
│  │  ┌──────────┐ ┌──────────┐ ┌──────────┐                ││
│  │  │ MCP Server│ │ MCP Server│ │ MCP Server│  ...        ││
│  │  │ - 文件系统│ │ - Git    │ │ - 数据库 │                ││
│  │  └──────────┘ └──────────┘ └──────────┘                ││
│  └─────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────┤
│                    能力层 (Capability)                       │
│  ┌─────────────────────────────────────────────────────────┐│
│  │              Function Calling (函数调用)                 ││
│  │         LLM 原生能力:识别、参数、调用、整合              ││
│  └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘

关系详解

1. Function Calling 是基础
  • 是什么:LLM 的原生能力
  • 作用:让AI"知道"什么时候该调用工具,以及如何调用
  • 类比:就像人的神经系统,负责传递信号和控制动作
2. MCP 是标准化层
  • 是什么:基于 Function Calling 构建的协议标准
  • 作用:统一工具的接口规范,让工具可以被任何AI应用使用
  • 类比:就像 USB 接口标准,不同厂商的设备都可以即插即用
  • 依赖:底层使用 Function Calling 与 LLM 交互
3. Agent Skills 是应用层封装
  • 是什么:基于 MCP 构建的高级功能模块
  • 作用:将复杂任务打包成开箱即用的技能
  • 类比:就像 Photoshop 的"动作"(Action),一键完成复杂操作
  • 依赖:使用 MCP 协议调用底层工具

数据流示例

用户:请审查这段代码并提供改进建议

Agent Skills (code-reviewer)
    ↓ 分解任务
    ├─ 1. 读取代码文件 ──────→ MCP Server (filesystem)
    │                           ↓ 调用
    │                      Function Calling
    │                           ↓
    │                      执行文件读取
    │                           ↓
    │                      返回文件内容
    │                           ↓
    ├─ 2. 分析代码 ─────────→ LLM 推理
    │                           ↓
    ├─ 3. 生成审查报告 ─────→ 整合结果
    │                           ↓
    └─ 4. 返回给用户

最终输出:详细的代码审查报告

使用场景与选择

场景决策树

你需要什么?
│
├─► 只是让AI能调用我的函数?
│   └─→ 使用 Function Calling(原生API调用)
│
├─► 希望我的工具能被多个AI应用使用?
│   └─→ 实现 MCP Server(遵循MCP协议)
│
├─► 想要一个开箱即用的复杂任务解决方案?
│   └─→ 使用 Agent Skills(或创建自己的技能)
│
└─► 构建一个企业级AI应用平台?
    └─→ 三者结合:Function Calling + MCP + 自定义Skills

具体场景

场景 推荐方案 理由
快速原型开发 Function Calling 简单直接,无需额外依赖
构建工具生态 MCP Server 一次开发,多客户端使用
复杂任务自动化 Agent Skills 封装完整流程,减少开发量
企业级AI平台 三者结合 灵活性与标准化兼顾
跨平台工具复用 MCP 避免重复造轮子

实际案例:代码审查系统

# 架构示例:使用三者的完整系统

# 1. Function Calling 层(LLM 原生能力)
#    - 由 OpenAI/Claude SDK 提供
#    - 自动处理工具调用识别和参数生成

# 2. MCP 层(工具标准化)
#    - filesystem-mcp-server: 读取代码文件
#    - git-mcp-server: 获取提交历史
#    - static-analysis-mcp-server: 代码分析

# 3. Agent Skills 层(业务逻辑)
@skill(name="comprehensive-code-review")
class ComprehensiveCodeReview:
    """综合代码审查技能"""
    
    required_mcp_servers = [
        "filesystem",
        "git", 
        "static-analysis"
    ]
    
    def execute(self, repo_path: str):
        # 步骤1: 获取文件列表 (通过 MCP)
        files = mcp.filesystem.list_files(repo_path)
        
        # 步骤2: 静态分析 (通过 MCP)
        analysis = mcp.static_analysis.analyze(files)
        
        # 步骤3: LLM 生成审查意见 (Function Calling)
        review = llm.generate_review(analysis)
        
        # 步骤4: 格式化输出
        return self.format_report(review)

# 使用
reviewer = load_skill("comprehensive-code-review")
report = reviewer.execute("./my-project")

总结

核心要点

  1. Function Calling 是 AI 模型的"本能",让它能够使用工具
  2. MCP 是工具界的"通用语言",让工具能够被任何 AI 应用理解和使用
  3. Agent Skills 是"智能积木",封装复杂任务供用户直接使用

发展趋势

  • 标准化:MCP 正在逐渐成为行业标准,类似 HTTP 之于 Web
  • 生态化:MCP Server 和 Agent Skills 的社区生态正在快速发展
  • 低代码:未来会有更多可视化工具来编排 Skills,无需编写代码

学习路径建议

  1. 入门:先理解并练习 Function Calling,掌握基本原理
  2. 进阶:学习 MCP 协议,尝试编写自己的 MCP Server
  3. 精通:设计和封装 Agent Skills,构建完整的 AI 应用解决方案

参考资源

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐