函数调用与上下文协议
什么是函数调用 function calling?
一种机制,允许大语言模型 LLM 直接调用预定义函数的能力,允许模型生成参数并整合结果。
解决大模型两大缺陷:
- 没有最新信息,不具备时效性。
- 没有真正的逻辑,本质上是概率学。
eg:向 LLM 发送以下提示:“特斯拉当前的股价是多少?”
得到的答案要么是“幻觉”,要么是“我没有实时数据,无法告诉你”。
FC 的特点:
- 极快(无网络延迟)
- 固定模式(输入输出明确)
- 不依赖记忆(单次调用)
什么是模型上下文协议 MCP ?
MCP,全称为 Model Context Protocol,是一个开源的协议标准。
为什么需要 MCP ?
为了整个 AI 行业的生态发展,作为一种标准出现是必然需求,解决了三个关键问题:
- 数据孤岛:让 AI 可以链接万物
- 开发低效:解决为每个 LLM 写 Function Call 的问题,一次编写所有大模型可用
- 生态碎片化:作为一种标准让不同厂商可以即插即用
- 支持复杂工作流与状态管理:Function Calling 难以维护多轮对话的中间状态(eg:用户查询航班后需手动传递航班号预定)
| 维度 | 传统模式 | MCP 模式 | 变革价值 |
|---|---|---|---|
| 集成成本 | 每次对接新工具需定制开发 | 一次开发,全网复用 | 开发效率提升 10倍 |
| 功能范围 | 单一工具调用 | 多工具协同执行复杂任务链 | AI 从”助手”升级为”执行者” |
| 生态开放性 | 封闭式 API 被厂商卡 | 开源协议,社区共建工具库 | 催生 “AI 应用商店” 模式 |
| 安全可控性 | API 密钥暴露风险 | 数据不离域,权限分级管控 | 满足企业级合规需求 |
MCP 的三种形态分别是什么?
- stdio
- SSE
- StreamableHttp
MCP 架构和执行流程?
架构分为以下 3 部分:
- 客户端:大模型应用(DeepSeek、ChatGPT)发起请求
- 服务器:中间层,连接具体工具(数据库、设计软件)
- 资源:具体的数据或工具(Excel文件、网页 API)
运行流程:
-
初始化与工具列表获取:
- 用户首先启动 MCPClient,完成初始化操作。
- MCPClient 向 MCPServer 发送 GET /tools/list 请求,获取可用工具的元数据。
- MCPServer 返回包含工具名称、功能描述、参数要求等信息的 工具列表JSON,供客户端后续构建提示词使用。
-
用户输入与提示词构建:
- 用户通过 MCPClient 输入自然语言请求(如“查询服务器状态”“生成文件报告”等)。
- MCPClient 将用户请求与初始化阶段获取的 工具列表 结合,生成包含任务目标和工具能力的提示词(Prompt),传递给 LLMService(大语言模型服务层)。
-
工具传递方式选择(二选一):
- 使用 Function Call(函数调用)直接携带工具列表信息。LLMService 通过 LLM_API 调用大语言模型时,在请求中直接携带 工具schema(结构化工具定义,如参数格式、调用格式),告知模型可用工具的调用方式。
- 在系统提示词(System Prompt)中包含工具列表。LLMService 将工具列表以自然语言描述形式嵌入 系统提示词(System Prompt),让模型在理解用户需求时知晓可用工具的功能边界。
-
LLM判断与响应:
- 无需工具:LLM直接将处理结果通过 MCP Client 回复给用户;
- 需要工具:
- 获取命令模板: MCP Client 根据模型指定的工具名称,在初始化时保存的工具配置中取出对应的 命令模板(如Shell命令格式、API调用参数模板)。
- 生成与执行命令: MCP Client 将用户输入参数与命令模板结合,通过 ToolService(工具执行服务)生成完整可执行命令,并提交给 本地系统 执行。
- 结果处理:本地系统 返回原始执行结果(如命令输出文本、API返回数据),ToolService 将其转换为结构化结果(JSON),反馈给 MCP Client。
- 二次调用模型生成最终回复:MCPClient 将结构化结果与用户原始问题一并提交给 LLMService,通过 LLM_API 调用模型,将技术化的执行结果转化为自然语言描述(如将“服务器CPU使用率80%”转化为“当前服务器CPU负载较高,建议检查进程”)。
-
工具命令生成与执行: 若需要工具, MCP Client 根据 LLM 提供的参数格式,以及 MCP Server 配置的命令模板进行拼接,生成完整的可执行命令,并在本地环境(Local_Env)中执行该命令。
-
结果处理与输出: 本地环境执行命令后,将结果返回给 MCP Client。MCP Client 将执行结果提交给 LLM,由 LLM 对技术化的执行结果进行处理,最终以人性化的语言形式输出给用户。

什么是 MCP Client ?
一个 LLM 的遥控器,负责向 Server 发送指令并接受结果。充当翻译官的角色,把自然语言指令转换成 Server 能理解的请求格式。 它主要做三件事:
- 构建请求:根据用户输入或 LLM 的需求构建出符合 MCP 协议的消息
- 与 Server 通信:与 Server 建立连接并发送请求
- 接受到 Server 返回的结果后解读这些信息并反馈给用户或者 LLM

什么是 MCP Server ?
一个工具箱,里面装满了各种工具(如爬虫、文件读写、数据库查询),但它不会主动使用这些工具,它允许大语言模型以一种标准化的方式调用。 它主要做三件事:
- 提供工具:核心价值
- 处理请求:收到 client 的请求后负责解析并根据请求内容执行相应的操作
- 返回结果:完成操作后把结果返回给 client
什么是 MCP Host ?
承载 MCP Server 的底层基础设施,负责提供协议运行所需的计算、存储与安全环境。一个 Host 托管多个 Server 实现资源隔离与多租户支持。 它使 Server 能专注业务逻辑,而无需关心底层运维复杂性,Host 层的设计质量直接决定整个系统的稳定性上限。 它主要做五件事:
- 资源供给与隔离:为每个 MCP Server 实例分配独立资源
- 生命周期管理:启动、停止、热更新
- 网络与安全沙箱:
- 防火墙规则(限制 Server 的出口 IP)
- TLS 终端卸载(由 Host 统一处理加密)
- 防止 Server 逃逸攻击(如 gVisor 容器隔离)
graph LR Client -->|HTTPS| Host Host -->|解密 & 协议检查| Server Server -->|内部通信| Tool[业务工具]
- 监控与自愈:
- 监控CPU/内存利用率(阈值超限自动扩容)
- 监控QPS/延迟(异常流量自动熔断)
- Server 崩溃时自动重启
- 检测到内存泄漏时重建实例
- 跨 Server 协调:全局配额控制、跨工具事务、工具依赖管理都在 Host 层协调实现
- 混合云桥接:统一管理部署在公有云 + 私有云 + 边缘端的 MCP Server
MCP Client → 调用服务(如 Agent 请求天气接口)
↓
MCP Server → 处理协议(路由到天气API + 管理会话)
↓
MCP Host → 提供资源(CPU/内存/网络隔离)
↓
External Tools → 实际执行(天气API)
基于 AI 编写 MCP Server
### 需求
基于提供的 MCP 相关资料,帮我构建一个 MCP Server,需求如下:
- 提供一个获取当前时间的工具
- 接收时区作为参数(可选)
- 编写清晰的注释和说明
- 要求功能简洁、只包含关键功能
- 使用 TypeScript 编写
请参考下面四个资料:
### [参考资料 1] MCP 基础介绍
- 粘贴 https://modelcontextprotocol.io/introduction 里的内容。
### [参考资料 2] MCP 核心架构
- 粘贴 https://modelcontextprotocol.io/docs/concepts/architecture 里的内容。
### [参考资料 3] MCP Server 开发指引
- 粘贴 https://modelcontextprotocol.io/quickstart/server 里的内容。
### [参考资料 4] MCP Typescript SDK 文档
- 粘贴 https://github.com/modelcontextprotocol/typescript-sdk/blob/main/README.md 里的内容。
通讯协议 STDIO(标准输入输出)和 SSE(服务器推送事件)有什么区别?
-
STDIO 协议是「面对面对话」把 MCP Server 也就是这个 Python 程序下载到本机并且本机运行,AI 客户端与 MCP Server 使用 STDIO 也就是操作系统的标准输入输出通道进行交互,无需网络连接。AI 客户端与 MCP Server 的距离更近一些。
-
SSE 协议是「电话热线」把 MCP Server 也就是这个 Python 程序单独部署,AI 客户端与 MCP Server 使用 SSE 协议进行远程调用。AI 客户端与 MCP Server 的距离更远一些。
Function Calling 和 MCP Server 和 Agent 和 Workflow 有什么区别?
| 维度 | Function Calling | MCP Server | Agent | Workflow |
|---|---|---|---|---|
| 本质定位 | 模型内置的轻量级工具调用接口(内部触发) | 标准化的外部工具通信协议层(双向通信) | 自主决策的任务执行实体(规划+工具调度) | 任务编排引擎(多节点调度与状态管理) |
| 协议性质 | 厂商私有(如OpenAI/Anthropic自定义格式) | 开放标准(JSON-RPC 2.0等) | 无固定协议(可集成FC/MCP/自定义逻辑) | 依赖 DSL/YAML (Prefect/Airflow) |
| 架构设计 | 集成于模型内部,直接生成函数调用指令 | 分层架构(客户端-服务端解耦) | 多模块协同(规划器+工具库+记忆模块) | 有向无环图(DAG)驱动节点依赖 |
| 上下文管理 | 需开发者手动维护多轮对话状态 | 原生支持跨轮次参数传递与状态存储 | 主动维护任务链状态(自动记忆/回溯关键信息) | 全局状态跟踪(节点间数据持久化) |
| 安全机制 | 依赖业务层实现权限控制 | 内置会话加密、权限分级等企业级安全管控 | 沙箱隔离+运行时监控(防越权/死循环) | 权限分级+审计日志 |
| 使用场景 | 简单同步任务(天气查询、计算器、知识库问答) | 复杂异步工作流(跨系统数据聚合、多步骤决策) | 长周期目标导向任务(旅行规划) | 流程化作业(订单处理/报告生成) |
四者关系本质是:
能力(FC)→ 连接(MCP)→ 思考(Agent)→ 行动(Workflow)
graph LR
A[用户请求] --> B(Workflow引擎)
B --> C{任务类型}
C -->|简单反射| D[Function Calling]
C -->|复杂工具| E[MCP Server]
C -->|决策任务| F[Agent]
F -->|调用| D & E
D --> G[本地函数]
E --> H[外部工具]
F --> I[记忆库]
B --> J[输出结果]
Function Calling = 神经末梢反射 → 特性:快速、无意识、局部的
MCP Server = 工具握柄 → 特性:标准化、安全、可扩展的
Agent = 大脑 → 特性:决策、规划、自主的
Workflow = 神经中枢 → 特性:编排、状态化、流程驱动的
决策树
graph TD
A{任务类型} -->|简单同步| B[Function Calling]
A -->|多工具调用| C[MCP Server]
A -->|多步骤决策| D[Agent]
A -->|流程自动化| E[Workflow]
D --> F{需固定流程?}
F -->|是| G[Workflow + Agent]
F -->|否| H[独立Agent + MCP]
C --> I{工具是否异构?}
I -->|是| J[MCP + 开放协议]
I -->|否| K[FC + 私有协议]
一个「对比 iPhone 15 在京东和天猫的月销量,并分析价格趋势」的需求分析实例:
技术分工:
| 组件 | 职责 |
|---|---|
| Workflow | 编排流程:竞品抓取 → 数据清洗 → 趋势分析 → 报告生成 |
| Agent 群 | - 抓取Agent:控制爬虫 - 清洗Agent:过滤无效数据 - 分析Agent:调用统计模型 |
| MCP | 封装: - 京东数据API → jd.get_product_sales(item_id) - 天猫数据API → tmall.query_sales(item_id) |
执行流程如图:
sequenceDiagram
Workflow->>抓取Agent: 启动京东数据抓取
抓取Agent->>MCP: 调用 jd.get_product_sales("iPhone15")
MCP-->>抓取Agent: 返回JSON{ sales: 12000, price: 5999 }
抓取Agent->>Workflow: 提交数据
Workflow->>清洗Agent: 清洗天猫数据
清洗Agent->>MCP: 调用 tmall.query_sales("iPhone15")
MCP-->>清洗Agent: 返回JSON{ sales: 15000, price: 5899 }
清洗Agent->>分析Agent: 传递清洗后数据
分析Agent->>Workflow: 生成趋势报告