MCP 和 Function Calling 分别是什么,两者有何关系?一文带你快速了解(附实例)
目录
二、方案一:Function Calling:模型API原生能力
3.3 快速介绍实际使用(以Mysql MCP server为例)
一、背景:大模型需要动手干活
让大模型“动手干活”是 AI 应用开发的核心。大模型只能输出文本,无法直接操作外部系统。为了让模型‘动手干活’,业界主要有两种方案:
-
Function Calling(2023 年 OpenAI 首创):让模型在回复中夹带标准化函数调用指令,实现工具调用
-
MCP(2024 年 Anthropic 提出):定义通用标准协议,实现模型与外部工具服务器的独立通信
二、方案一:Function Calling:模型API原生能力
2.1 核心定义
Function Calling 是大模型原生的 API 能力:开发者预先定义工具函数信息后发送给模型,模型识别用户意图后,输出结构化调用指令。业务程序解析指令并执行对应工具,最后模型结合用户提问与工具返回结果,汇总生成最终答案。
标准返回示例:
{
// 要调用的工具函数名称
"function": "query_weather",
// 函数所需入参:城市名称
"arguments": {"city": "北京"}
}
2.2 核心特点
|
特点 |
详细说明 |
|---|---|
|
轻量便捷 |
无需额外部署服务,仅需在模型 API 请求中配置参数,开箱即用 |
|
响应快速 |
单次 API 请求内完成意图识别、参数解析、调用指令生成,链路极短 |
|
模型原生 |
由模型厂商原生实现,随模型版本迭代自动优化升级,无需开发者改造 |
|
存在绑定限制 |
函数签名每次请求都需带入,工具数量过多会造成 Token 溢出、上下文过载 |
2.3 快速了解实际应用(以查询天气为例)
整体流程概览:
用户提问:“今天北京天气怎么样?”
↓
【大模型】识别意图 → 判断需要调用 get_weather 工具
↓
【输出调用指令】{"name":"get_weather", "arguments":{"city":"北京","date":"2026-06-12"}}
↓
【业务代码】执行 WeatherTools.getWeather("北京", "2026-06-12")
↓
【调用真实天气 API】(或返回模拟数据)→ 获得结果:“北京 2026-06-12 天气:晴...”
↓
【大模型】将工具返回结果组织成自然语言
↓
最终回答:“今天北京天气晴朗,温度 18~28℃,湿度 45%,风力 2 级。”
核心函数展示(以java➕LainChain4j为例):
@Component
public class WeatherTools {
/**
* 定义一个可供大模型调用的工具函数。
* @Tool 注解告诉 LangChain4j:这是一个工具,大模型可根据用户意图决定是否调用
* name : 工具的唯一标识,大模型在生成调用指令时会使用这个名字
* value : 工具的功能描述,帮助大模型理解在什么场景下使用该工具
*/
@Tool(name = "get_weather", value = "获取指定城市和日期的天气信息")
public String getWeather(
@P(value = "城市名称,如北京、上海") String city,
@P(value = "日期,格式 yyyy-MM-dd") String date) {
// 调用真实天气 API(示例为模拟返回)
return callWeatherAPI(city, date);
}
private String callWeatherAPI(String city, String date) {
// 实际项目中替换为 HTTP 请求(如高德、和风天气等)
return String.format("%s %s 天气:晴,温度18~28℃,湿度45%%,风力2级", city, date);
}
}
三、方案二:MCP:标准化协议
3.1 核心定义
MCP(Model Context Protocol,模型上下文协议)是一套与大模型完全解耦的开源标准协议。它搭建了标准化的工具调用架构,彻底解决工具复用、跨模型适配、安全管控等问题。整体分为三层架构:
-
MCP Server:工具能力载体,封装数据库查询、CRM 调用、本地文件读写等具体业务能力
-
MCP Client:嵌入 AI 宿主(Claude Desktop、Cursor、自研 AI 应用),负责与服务端通信、指令转发
-
Host 运行环境:统一管理安全策略、权限校验、操作审计、流量管控
基于 MCP,大模型无需感知工具具体实现逻辑,仅需通过标准协议调用 MCP Server 暴露的能力。
3.2 核心特点
|
特点 |
详细说明 |
|---|---|
|
彻底解耦 |
工具实现与大模型完全分离,更换模型无需重写、适配工具逻辑 |
|
可审计、高安全 |
三层架构隔离,可在宿主层实现精细化权限校验、全链路操作日志审计 |
|
动态注册 |
支持运行时新增、更新工具,无需修改模型请求参数、无需重启服务 |
|
生态统一 |
所有兼容 MCP 协议的工具,可被任意 MCP 宿主、任意主流大模型调用 |
3.3 快速介绍实际使用(以Mysql MCP server为例)
一、理解 MCP Server 的安装逻辑
MCP Server 本质上是一个独立运行的程序,它通过标准输入输出(stdio) 与 Claude Code 通信。安装一个 MCP Server 只需要做两件事:
-
告诉 Claude Code 怎么启动这个程序(配置
command和args) -
告诉这个程序怎么连接外部资源(配置环境变量
env)
通信流程:
Claude Code 启动 → 拉起 MCP Server 进程 → Server 连接外部资源(如 MySQL)
↑ ↓
←──────── stdio 通信 ─────── 返回结果
二、环境准备
在安装 MySQL MCP Server 之前,确认以下环境已就绪:
| 依赖 | 最低版本 | 验证命令 | 说明 |
|---|---|---|---|
| Node.js | >= 18 | node -v |
MCP Server 的运行环境 |
| Claude Code | 最新版 | claude --version |
前两节已完成安装 |
| MySQL | 5.7+(推荐 8.0+) | mysql --version |
要连接的目标数据库 |
逐一检查:
# 1. 检查 Node.js
node -v
# 期望输出:v18.x.x 或更高
# 2. 检查 Claude Code
claude --version
# 期望输出:版本号
# 3. 检查 MySQL 是否运行
mysql -u root -p -e "SELECT VERSION();"
# 期望输出:MySQL 版本号
三、安装 MySQL MCP Server
我们使用 @pickstar-2002/mysql-mcp 这个社区维护的 MCP Server,它提供了 15 个数据库操作工具。
第一步:命令行添加(推荐,最快捷)
在终端中直接运行:
# claude mcp add:向 Claude Code 添加一个 MCP Server 配置
claude mcp add mysql-mcp \ # mysql-mcp:给这个 MCP Server 起一个名字(可自定义)
-e MYSQL_HOST=localhost \ # 环境变量:MySQL 主机地址
-e MYSQL_PORT=3306 \ # 环境变量:MySQL 端口号
-e MYSQL_USER=root \ # 环境变量:MySQL 用户名
-e MYSQL_PASSWORD=123456 \ # 环境变量:MySQL 密码(生产请勿明文,可用环境变量替换)
-- \ # 分隔符:前面是 claude mcp add 的参数,后面是要执行的启动命令
npx @pickstar-2002/mysql-mcp@latest # 启动命令:使用 npx 下载并运行 mysql-mcp Server
注意:把 your_password 和 your_database 替换为你实际的 MySQL 密码和数据库名。指定作用域:
第二步;指定作用域
# 仅当前项目生效(默认)
claude mcp add mysql-mcp -s local ...
# 当前用户所有项目生效
claude mcp add mysql-mcp -s user ...
# 项目共享(写入 .mcp.json,可提交到 Git,注意不要提交密码)
claude mcp add mysql-mcp -s project ...
第三步:验证 MCP 连接
配置完成后,必须重启 Claude Code 才能加载新的 MCP Server:
# 如果正在 Claude Code 会话中,先退出 /exit # 重新启动 claude
在 Claude Code 中输入:
/mcp

你会看到 mysql-mcp 出现在可用 MCP 列表中。
四、测试应用
在 Claude Code 中输入自然语言指令:
帮我在本地数据库中创建一个叫 MCP_MYSQL 的数据库,创建一个员工表,并且添加一些数据。
Claude Code 会通过 MCP Server 自动执行 SQL 操作,并返回执行结果。


四:核心区别
| 对比维度 | Function Calling | MCP |
|---|---|---|
| 技术层级 | 模型 API 层的专属能力 | 通用协议层的行业标准 |
| 跨模型兼容 | 各厂商格式不互通,更换模型需重写工具 | 全兼容,一套工具适配所有 MCP 宿主 |
| 动态工具更新 | 不支持,新增工具需修改请求参数 | 支持运行时动态注册、更新、下线工具 |
| 安全审计能力 | 依赖模型厂商,审计粒度粗 | 宿主层自主可控,支持操作级精细化审计 |
| 开发成本 | 极低,少量代码即可实现 | 中等,需独立开发、部署 MCP Server |
一句话总结:Function Calling 解决「模型怎么看懂指令、生成调用」,MCP 解决「工具怎么标准化、安全高效执行。
五、生产环境
生产环境的好方案 不一定非要二选一,而是双层协同架构,各司其职、互补短板。
5.1 标准协同架构链路
5.2 为什么需要协同?
-
缺少 Function Calling:意图识别不准、参数传错,大模型不知道该调哪个工具、怎么传参。
-
缺少 MCP:切换模型就要重写全部工具适配逻辑,且难以统一权限管控与运维审计。
5.3 实战案例演示
用户提问 → Function Calling层(识别物流查询意图,输出带订单号的标准调用指令)
→ MCP客户端(匹配物流MCP服务,路由转发请求)
→ MCP Server(查询库返回物流数据:{"status": "已发货", "location": "上海中转站"})
→ 大模型整合信息 → 输出自然语言回复
六、场景化选型推荐
| 业务场景 | 推荐方案 |
|---|---|
| 小型 Demo、仅 3 个以内工具、单模型、无敏感数据 | 纯 Function Calling |
| Cursor 等软件本地文件读写插件 | 纯 MCP |
| 多 AI 产品共用一套工具 | 纯 MCP |
| 涉及隐私 / 支付 / 内网库,需权限审计 | MCP + Function Calling |
| CRM、企业内部业务系统操作 | MCP + Function Calling |
| 企业 Agent,工具超 10 个、海量工具调度 | MCP + Function Calling |
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)