简介:MCP(模型上下文协议)是一套规范大模型与外部工具、数据源连接方式的开放协议。本文从架构视角揭示其本质——“控制权反转的RPC”,系统解析其定义、核心组成、工作原理、典型场景与安全边界,帮助开发者理解MCP的能力与风险,避免将内部接口直接暴露给不可控的模型决策。
MCP(Model Context Protocol,模型上下文协议)是一套开放协议规范,用于标准化大语言模型与外部世界——工具、数据源、业务系统——之间的连接方式。它以JSON-RPC 2.0作为消息格式,定义了能力发现、工具调用、资源读取等交互原语,使模型可以在运行时动态获知“我能调用什么”,并按照统一格式发起调用。
可以用一个公式理解它的定位:MCP = 统一的工具描述格式 + 统一的调用消息协议 + 统一的能力发现机制。
从三个视角分别理解这个概念:
在MCP出现之前,让大模型使用外部工具的主流做法是为每个模型单独定义函数签名,再由应用代码把模型的输出解析成具体请求。这带来三个普遍问题:
MCP把这三件事标准化:统一的工具描述(名称、用途说明、JSON Schema参数结构)、统一的发现接口、统一的调用接口。于是集成关系从“网状”收敛为“星型”——模型侧与工具侧各自面向协议编程一次,即可互相联通。这是MCP最直接的工程价值。
协议层面有三个核心原语:
以“用户让助手查询数据库”为例,完整流程如下:
一段典型的请求示意如下:
{"jsonrpc":"2.0","method":"tools/call","params":{"name":"database_query","arguments":{"sql":"DELETE FROM users WHERE id = 'U123'"}},"id":1}
从协议视角看,这条消息完全合法:JSON-RPC格式正确、方法名正确、参数结构清晰。但从架构视角看,它暴露了MCP最关键的特性——协议只负责把模型生成的意图原样搬运到后端,它本身不做参数语义校验(这条语句是查询还是删除?是否符合业务预期?)、不做权限校验(当前身份是否有权执行删除?)、也不做业务上下文一致性验证(这次操作与流程状态是否兼容?)。
在经典微服务体系里,无论调用链多复杂,控制权始终掌握在确定性代码手中。即便是长事务编排、工作流引擎这类复杂场景,每一步决策仍然是可审计、可回放、可测试的代码路径:条件是显式分支,参数是结构化校验过的输入。
MCP引入之后,三个关键要素同时改变:
| 要素 | 传统RPC体系 | MCP体系 |
|---|---|---|
| 调用发起者 | 应用代码 | 模型 |
| 调用决策依据 | 显式条件分支 | 概率推断 |
| 调用参数来源 | 结构化、已校验输入 | 自然语言解析结果 |
这是典型的控制反转,但与传统框架中“控制权交给框架”不同,MCP把控制权交给了一个不可预测的概率模型。直接后果是:同样的输入不保证同样的调用序列(不可重放)、边界行为无法用穷举测试覆盖(不可穷尽测试)、错误调用可能在形式上“看起来合法”(形式合法但语义危险)。
因此,一旦后端服务默认信任服务端转发来的请求,整个系统就发生了一个危险的等价变换:你以为自己在“给模型接工具”,实际上是在把内部接口暴露给一个不可控的决策者。这个认知,是MCP安全治理的起点。
工程落地时,通常将服务端部署于企业内网或云环境,并借助容器平台、身份认证、日志服务、监控告警等通用云能力类目(如百度智能云提供的对应产品类别)构建可观测、可管控的接入层。
MCP是一套标准化“模型—工具”连接方式的开放协议,它统一了能力发现与调用格式,把碎片化集成收敛为标准适配。但其架构本质是控制权反转的RPC:调用发起者从确定性代码变成概率模型,调用条件从显式分支变成推断,参数从结构化输入变成自然语言解析结果。理解这一点才能正确划定信任边界——MCP解决“连通性”问题,而“安全性、可控性、可审计性”必须由接入层、网关层与后端服务共同补齐。把MCP当作标准化的连接协议来用,而不是当作可以裸信的转发管道,是每个接入方应有的工程姿态。