Function Call与MCP:给AI插上连接现实的翅膀
想象一下,如果AI只能依靠训练时学到的知识,就像一个与世隔绝的学者,知识再渊博也无法了解外面的世界正在发生什么。这就是早期大模型的困境------直到Function Call和MCP的出现。
从"知道一切"到"能获取一切"
当我们问AI"今天北京天气怎么样?"时,我们希望得到的是此时此刻的真实天气,而不是模型训练时学到的历史数据。这就是传统大模型的局限性:
- 🤖 LLM是提前训练好的,不了解新知识或新服务
- 🔒 缺乏足够的上下文时容易"胡说八道"(hallucination)
- ⏰ 无法获取实时信息,如天气、新闻、股票等
Function Call 和MCP就是为了解决这些问题而生的技术,它们让AI能够突破自身限制,与外部世界连接。
Function Call:AI的"第一次触网"
什么是Function Call?
Function Call是一种让大语言模型能够调用外部函数或API的技术。它就像是给AI装上了一双可以操作外部世界的手:
为什么AI需要Function Call?
- 获取实时信息:查询天气、新闻、股票等最新数据
- 执行精确计算:进行复杂数学计算或数据分析
- 与外部系统交互:操作数据库、发送邮件、控制设备等
- 增强可靠性:减少模型"编造"信息的可能性
Function Call实战:查询天气
让我们通过一个具体例子看看Function Call是如何工作的:
javascript
import OpenAI from 'openai'; // 导入OpenAI库
const client = new OpenAI({
apiKey: 'sk-5kq7', // API密钥
baseURL: 'https://api.302.ai/v1' // API基础地址
})
// 定义获取天气的函数
const getWeather = async (city) => {
// 实际项目中这里会调用真实天气API
return {
city,
temp: '28',
condition: 'Sunny'
}
}
async function main() {
// 第一步:AI分析是否需要调用函数
const resp = await client.chat.completions.create({
model: "gpt-4o",
messages: [
{
role: "user",
content: "今天北京天气怎么样?"
}
],
// 告诉AI可用的工具列表
tools: [
{
type: 'function',
function: {
name: "getWeather", // 函数名
description: "获取某个城市的天气", // 函数描述
parameters: { // 参数定义
type: "object",
properties: {
city: {
type: "string"
}
},
required: ["city"] // 必需参数
}
}
}
]
});
// 检查AI是否想调用函数
const toolCall = resp.choices[0].message.tool_calls?.[0];
if (toolCall?.function.name === "getWeather") {
// 解析AI生成的参数
const args = JSON.parse(toolCall.function.arguments);
// 实际执行函数获取天气数据
const weather = await getWeather(args.city);
// 第二步:将结果返回给AI继续处理
const secondResp = await client.chat.completions.create({
model: 'gpt-4o',
messages: [
{
role: 'user',
content: '北京天气'
},
resp.choices[0].message, // AI的函数调用请求
{
role: 'tool', // 工具执行结果
tool_call_id: toolCall.id, // 调用ID
content: JSON.stringify(weather) // 天气数据
}
]
})
// 最终AI生成的回答
console.log(secondResp.choices[0].message.content)
}
}
main();
代码详解:
- 初始化客户端:创建OpenAI客户端实例,配置API密钥和地址
- 定义工具函数:实现具体的业务逻辑(如获取天气)
- 第一次API调用:AI分析用户问题,决定是否需要调用函数
- 解析AI响应:检查AI是否生成了函数调用请求
- 执行函数:运行实际函数获取结果
- 第二次API调用:将函数结果返回给AI生成最终回答
- 输出结果:展示AI生成的最终响应
这个过程就像是一个聪明的助手:你先告诉它有什么工具可用,它自己决定什么时候使用这些工具,使用后再向你汇报结果。
MCP:Function Call的"升级版"
为什么需要MCP?
随着Function Call的广泛应用,一些问题逐渐浮现:
- 🔧 每个项目都需要自定义函数调用逻辑
- 🤝 不同系统间的集成成本高
- 🛡️ 安全性和权限控制复杂
- 🔌 缺乏统一的标准和协议
这就引出了MCP(Model Context Protocol)------一个标准化LLM与外部资源交互的协议。
MCP是什么?
MCP是一个开放协议,定义了LLM如何与外部工具、数据源和服务进行交互。可以把它想象成AI世界的USB协议:
就像USB为各种外设提供了统一连接标准一样,MCP为AI和各种外部资源提供了标准化交互方式。
MCP的核心组件
- MCP Server:提供特定功能的服务端(如天气服务、数据库查询等)
- MCP Client:与LLM交互的客户端(如Cursor、Claude等AI应用)
- Transport:服务器与客户端之间的通信层
- LLM:大语言模型本身
MCP实战:创建时间服务
让我们创建一个简单的MCP服务器,提供时间查询功能:
javascript
// mcp-server.js
// 导入MCP服务端核心类,用于创建和管理MCP服务器
// MCP服务器统一管理工具调用与上下文,实现大模型与外部工具间标准化、高效、安全的交互。
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
// 导入基于标准输入输出的传输层,实现进程间通信
// 大模型运行的主进程(如AI应用)与通过StdioServerTransport启动的MCP工具服务器进程之间的通信。
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
// 导入调用工具请求和响应的数据结构类型定义,确保通信数据格式规范
import {
CallToolRequestSchema,
CallToolResultSchema,
} from "@modelcontextprotocol/sdk/types.js";
// 1. 创建 MCP Server
const server = new Server(
{
name: "demo-mcp-server", // 服务器名称,用于标识当前MCP服务
version: "1.0.0",// 服务器版本,便于版本管理和兼容性控制
},
{
capabilities: {
tools: {}, // 可以动态注册工具
},
}
);
// 2. 注册一个工具(比如:获取当前时间)
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "getTime") {
return {
content: [
{
type: "text",
text: `当前时间是: ${new Date().toISOString()}`,
},
],
};
}
throw new Error("未知工具: " + request.params.name);
});
// 3. 启动 MCP Server
// StdioServerTransport 是通信桥梁(运输层)
const transport = new StdioServerTransport();
// server.connect(transport) 是将 MCP 服务器连接到该桥梁
server.connect(transport);
代码详解:
- 导入必要模块:引入MCP SDK提供的服务器、传输层和类型定义
- 创建服务器实例:配置服务器名称和版本信息
- 注册工具处理器:定义服务器提供的工具和对应的处理逻辑
- 启动服务器:建立通信传输层并启动服务
这个MCP服务器提供了一个getTime
工具,当AI需要获取当前时间时,就会调用这个工具。
配置MCP客户端
创建好MCP服务器后,需要在AI客户端中配置连接。以Cursor编辑器为例,需要修改设置文件:
json
{
"mcpServers": {
"time-mcp": {
"autoApprove": [],
"disabled": false,
"timeout": 60,
"type": "stdio",
"command": "node",
"args": [
"C:/Users/hh/Desktop/lesson_si/interview/ai/mcp/demo/index.mjs"//本地MCP服务器的路径
],
"env": {}
},
"amap-maps": {
"disabled": false,
"timeout": 60,
"type": "stdio",
"command": "npx.cmd",
"args": [
"-y",
"@amap/amap-maps-mcp-server"
],
"env": {
"AMAP_MAPS_API_KEY": "你自己的密钥"
}
}
}
}
配置详解:
- time-mcp:自定义时间服务配置
- amap-maps:高德地图服务配置(需要API密钥)
- stdio传输:使用标准输入输出进行进程间通信
- 超时设置:配置请求超时时间防止无限等待

配置完成后,AI就可以使用这些外部工具了。比如用户可以问:"帮我规划从公司到机场的路线",AI就会通过高德地图MCP获取实时路径规划。

Function Call vs MCP:如何选择?
特性 | Function Call | MCP |
---|---|---|
协议标准 | 厂商特定(如OpenAI) | 开放标准 |
集成复杂度 | 相对简单 | 需要设置服务器 |
可复用性 | 项目特定 | 跨项目通用 |
安全性 | 依赖实现 | 内置权限控制 |
适用场景 | 简单定制需求 | 复杂企业应用 |
选择建议:
- 🚀 初学者或简单项目:从Function Call开始
- 🏢 企业级复杂应用:选择MCP更合适
- 🔄 需要跨平台复用工具:MCP是更好选择
- ⚡ 快速原型开发:Function Call更轻量
总结:AI的未来是连接的世界
Function Call和MCP代表了AI发展的重要方向:从孤立的知识系统转变为能够与真实世界交互的智能代理。它们解决了大模型的根本限制:
- 实时性:获取最新信息,不再受训练数据时间戳限制
- 精确性:通过专业工具执行准确计算和操作
- 安全性:可控地访问外部系统,减少幻觉现象
- 扩展性:不断集成新工具和能力,避免模型重新训练
随着这些技术的发展,我们正在走向一个AI真正成为"万能助手"的时代------它不再只是回答问题,而是能够帮我们实际做事:订机票、查天气、分析数据、控制智能家居...
这就像是给AI装上了连接现实世界的翅膀,让它从知识的图书馆飞向了无限可能的天空。
现在,当你再次问AI"今天天气怎么样?"时,背后可能正发生着一场精彩的技术舞蹈:AI分析你的需求→调用天气MCP服务→获取实时数据→生成友好回答。这一切在几秒内完成,你却只看到了最终的那一句:"今天北京晴,28°C,适合出行哦!" 🌞
参考资料: