读完可判断MCP与函数调用分工,按步骤接入工具、配置权限并完成最小评测,避开上下文污染、安全坑和选型误区。
作者:进学斋 · 观山书院
全文约3835字 · 阅读约需13分钟
背景:工具生态从单点函数走向可复用上下文通道
过去做 Agent,很多团队先把模型接上内部函数,解决能不能查一次数据的问题。真正进入多端使用后,痛点变成同一套查询、检索、工单、文件能力要在 IDE、聊天端、协作系统和多 Agent 之间复用。据公开资料,MCP 被描述为在宿主应用、客户端与外部数据源或工具服务器之间传递上下文的开放协议,目标之一正是减少重复适配。
从落地形态看,常见 Server 包括本地工具服务器、知识检索服务器、研发流程服务器等。它的价值并不主要在提升模型单次推理能力,而在提供一条可复用的连接通道,让工具发现、权限边界、结果回传和上下文管理更容易标准化。
对已有 Function Calling 经验的开发者来说,关键判断不是要不要全面替换函数调用,而是哪些能力值得协议化:只在单一应用内稳定调用的函数可保留 FC,跨端共享、跨 Agent 复用、需要独立沙箱运行的工具更适合评估 MCP。

配图·静湖云烟
机制:Server、Client、Tool 与 Resource 的边界
角色拆分:谁负责发现、谁负责执行
在一个典型链路中,宿主负责呈现结果、调度模型和管理用户交互;客户端负责连接服务器、获取工具清单并发起调用;服务器负责暴露能力,如工具、资源和可选提示。据公开资料,模型通常不直接执行副作用动作,而是提出调用意图,由宿主或客户端路由到对应 Server,再把结果返回给模型。
host = 呈现与调度 client = 连接与请求 server = 暴露 tools resources prompts model = 生成调用意图,不直接执行副作用
这个边界决定了工程关注点:模型负责选择工具和填写参数,连接层负责发现和传输,Server 负责真正访问数据或动作接口。若把执行、鉴权、审批和上下文裁剪混在模型提示里,系统稳定性会很快下降。
Tool 与 Resource:动作与读取要分开
Tool 更像做什么,例如查询知识库、创建工单、更新文档、检索文件。Resource 更像读什么,例如文档片段、表数据、代码片段、配置内容。接入时若把执行动作和普通文本来源混在一起,容易出现高风险操作被当成可自由引用的上下文,权限模型会失真。
建议在 Server 层直接区分读写:只读 Resource 提供结构化摘要、引用位置和最小字段;写操作 Tool 要求显式确认、审计字段和幂等参数。模型拿到的结果应足够支撑下一步决策,但不等于把所有原始数据全量塞进上下文。
安全模型:不能假设协议自动保护
MCP 连接链路至少包括握手、工具列表、执行参数、结果返回和宿主展示。任一环节都可能成为攻击面:恶意工具描述可能诱导模型选择,超大结果可能污染上下文,第三方 Server 可能返回不可信文本,写操作可能被误触发。行业实践强调,安全边界必须由宿主、网关和 Server 共同实现,而不是依赖协议本身自动生效。
更稳妥的工程做法是:默认只读,写操作审批;外部 Server 先本地隔离测试;工具列表按 Agent 最小化;调用日志记录参数摘要、返回摘要和拒绝原因;长输出必须截断并保留来源引用。若 Server 运行在不可信环境,应加入网络隔离、命令白名单和超时控制。

配图·山谷柔绿
对比表:Function Calling 与 MCP 的六维取舍
Function Calling 和 MCP 不是替代关系。前者更适合模型调用应用内函数,后者更像为多宿主、多客户端、多工具生态提供标准化连接通道。下表用于判断迁移边界。
| 维度 | Function Calling | MCP | 选型提示 |
|---|
| 定位 | 模型如何调用应用内函数 | 工具与上下文如何被多个宿主标准化发现 | 单一应用稳定函数优先 FC |
| 工具发现 | 通常由应用代码注册函数 schema | 客户端向 Server 获取能力清单 | 跨端复用工具时考虑 MCP |
| 上下文管理 | 开发者手工裁剪返回结果 | Server 可定义资源形态,但仍需宿主治理 | 两种都需要摘要与截断 |
| 执行位置 | 多在同一应用或网关内 | 可在本地、私有服务器或第三方 Server | 高风险动作需要沙箱和审批 |
| 权限边界 | 鉴权多在应用内部完成 | 还要处理 Server 信任、客户端权限和跨域边界 | 私有数据优先本地 Server |
| 生态复用 | 换宿主需重新封装 | 同一 Server 可被多个宿主接入 | 工具数量多、端多时收益更明显 |
简单判断:如果任务只在一个 App 内完成,函数参数稳定、鉴权链路单一,继续用 Function Calling 更轻;如果同一工具需要被编辑器、聊天端、多 Agent 或不同团队复用,MCP 更值得投入。
实操步骤:用一个真实任务验证 MCP
Step 1:选高价值低风险任务
不要一开始接入删文件、改配置、发通知、写数据库等高风险动作。最小验证应选一个能产生业务价值但失败后果可控的任务,例如知识库检索、工单查询、只读数据库查询、代码仓库摘要。目标不是证明协议万能,而是验证发现、连接、返回、日志和权限是否能形成闭环。
建议从 Server 侧准备三类示例:一个只读 Resource,例如文档摘要;一个只读 Tool,例如查询工单;一个写操作 Tool,但默认关闭。这样同一轮评测既能测检索质量,也能测审批策略。
Step 2:跑通最小链路
先不追求复杂编排,只跑最短路径:启动或注册 Server 到列出 Tools 与 Resources 到选择只读 Tool 到发起一次真实查询到检查返回结构、延迟、错误码到在宿主端固化系统提示,说明哪些工具只能读、哪些需要确认。
start local server; client list capabilities; host select tool query_ticket_readonly; model emit params ticket_id scope; server return structured result; host write audit log
检查时重点看四件事:工具描述是否能让模型选对;参数 schema 是否能拦截缺参;返回是否结构化;失败是否能映射为可提示错误。若只是能跑通一次,不代表可用。
Step 3:建立最小评测集
上线前至少准备十类正例和五类负例。正例覆盖不同表述、不同数据范围、多轮引用;负例覆盖缺参数、越权请求、超长返回、工具冲突和不可用 Server。统计成功率、失败原因、是否产生上下文污染、是否需要二次确认。
☐ 正例:用户用口语问工单,模型能选 Tool 并填对 ID。
☐ 正例:用户问文档,模型能读 Resource 并引用片段。
☐ 负例:缺 ticket_id 时,模型应追问而不是猜。
☐ 负例:要求写操作时,必须触发审批。
☐ 负例:返回超长日志时,宿主必须截断。
☐ 负例:Server 不可用时,给出明确错误。
☐ 负例:多个相似 Tool 时,能按权限选择最小集合。
评测不要只看回答是否像人,更要看链路是否安全:有没有执行不该执行的动作,有没有把外部文本当系统指令,有没有丢失审计。
Step 4:设置上线门禁
门禁应从默认策略开始:只读优先,写操作必须审批;外部 Server 先本地隔离测试,再进入生产;所有返回都设最大字符或 token 限制;日志保留调用参数、结果摘要、拒绝原因和耗时,但不保存不必要的敏感全文。对第三方 Server 要加白名单、签名或网关校验。
更严格的团队可把发布拆成三级:实验环境允许只读;灰度环境开放低风险写操作,必须人工确认;生产环境仅允许经过审计的 Tool,资源全量开放但动作最小化。若没有这套门禁,工具越多,事故面越大。
坑与选型路径:工具越多,门禁越重要
坑一:工具数量失控
很多 Agent 初期效果变差,不是模型太弱,而是工具太多且描述相似。一次对话挂载几十个查询工具,模型会在相近名称之间摇摆。解决方式是按领域分组,每个 Agent 只挂载当前任务需要的最小工具集,并在系统提示中声明禁用边界。
坑二:上下文污染
Server 返回大段原始日志或长文档,会把上下文挤占,诱发错误推理。行业实践通常要求返回结构化摘要、引用、关键字段和分页信息,而不是直接灌全文。宿主还应对外部结果做不可信标记,避免其中的文本被当作高优先级指令。
决策路径
任务只在一个 App 内完成且函数稳定,选 Function Calling;同一工具需要被编辑器、聊天端、多 Agent 复用,考虑 MCP;私有数据高敏感,先做本地只读 MCP Server;第三方工具跨云接入,先过网关、白名单和审计,再进入生产。
如果团队已经有稳定 Function Calling,不建议推倒重来。更合理的路径是:先选一个跨端复用能力迁移为 MCP Server,验证权限和评测;再把知识检索、代码索引、工单读取逐步协议化;最后把写操作、批量任务和高风险工具单独纳入审批层。
收束:今天就能做的三步
第一步,今天选一个只读 MCP Server 或本地 Server 跑通最小闭环,不接入写操作。第二步,准备十条正例和五条负例,把缺参数、越权、超长返回、Server 不可用纳入发布评测。第三步,按 Function Calling 与 MCP 的六维表判断哪些能力值得协议化,避免无脑堆工具。
工具生态的竞争最后会落到工程细节:能否稳定发现、能否安全执行、能否可审计回看。对开发者来说,真正有用的不是再增加一个工具开关,而是建立一套能上生产的最小协议接入与评测门禁。