简介:当AI客户端与业务系统的组合从几对膨胀到上百对,点对点定制连接器的维护成本会迅速失控。本文站在C#开发者视角,系统对比传统定制集成与模型上下文协议(MCP)标准化集成在架构拓扑、接入成本、安全边界、演进维护等维度的差异,并进一步拆解MCP中Tools、Resources、Prompts三种能力原语的控制方与适用场景,帮助读者形成清晰的选型判断与迁移清单。
假设有十个AI客户端要接入二十个业务系统,按传统做法就是两百对定制连接器:每一对都要单独开发、单独鉴权、单独处理协议差异和字段映射。客户端侧的改动不会自动惠及服务端,服务端的升级也不会自动惠及客户端,任何一端演进都会放大成跨团队的联调工作。
这正是模型上下文协议(Model Context Protocol,下文简称MCP)要终结的问题。截至2026年10月,MCP规范已迭代到2026-07-28版本,官方C# SDK同步进入2.x阶段,从工具注册、参数校验到宿主对接,整体工程体验都比早期版本清爽不少。对C#开发者来说,现在的问题已经不是“要不要了解MCP”,而是“哪些场景该用MCP、哪些场景定制连接器仍然够用、两者如何取舍与迁移”。
本文对比的两个对象是:
需要说明:MCP只约束AI客户端与业务系统之间的交互方式,与模型服务本身解耦。无论AI应用部署在自有环境,还是运行在百度智能云等云平台的模型服务之上,协议层的选择都可以独立进行,二者并不冲突。
2.1 方案A:点对点定制集成
每个“客户端×系统”组合单独开发连接器,接口形态、鉴权方式、字段结构由两端自行约定。它极度贴合单一场景、起步快,但连接数量随两端规模相乘增长,属于典型的“局部最优、全局脆弱”结构。
2.2 方案B:MCP标准化集成
MCP把集成问题从N×M降为N+M:每个业务系统只暴露一个MCP服务器,每个AI客户端只维护一个MCP客户端,两边各实现一次即可互通。这与编辑器领域“语言服务协议”的设计思路如出一辙:编辑器不必为每种编程语言单独开发插件,语言服务也不必为每种编辑器单独适配,双方共同面向一个标准协议即可。
MCP规范定义了三个角色:
| 角色 | 是什么 | 典型例子 |
|---|---|---|
| Host(宿主) | 用户直接使用的AI应用 | 桌面AI助手、内置AI能力的代码编辑器、通用AI对话应用 |
| Client(客户端) | 宿主内部负责连接服务器的连接器 | 编辑器内置AI助手中的MCP连接组件 |
| Server(服务器) | 开发者编写的程序,对外暴露工具与数据 | 本文讨论的核心构建物 |
2.3 一次典型调用的完整链路
get_book_status(bookId: 1001);有一个关键点值得反复提醒:模型从始至终不直接接触数据库、不直接调用内部API。它只能请求宿主去调用服务器暴露的、带严格Schema定义的工具。工具是模型唯一能触达的世界入口,安全边界应当在工具设计阶段就划清楚。
3.1 目标一致。 两者本质上都是“把业务能力翻译成模型可理解的接口”,让AI应用安全地使用业务系统的数据与动作,差异只在实现路径。
3.2 通信形态相似。 都采用请求/响应式消息交互(MCP基于JSON-RPC),都需要对参数与返回值做结构化描述,调用链路都遵循“模型决策—连接器转发—服务端执行—结果回传”的基本模式。
3.3 安全责任相同。 无论选哪种方案,鉴权、授权、审计、限流、错误处理都不会因为换协议而消失,都必须在服务端认真设计;协议只是提供了收敛这些能力的更优位置。
3.4 都需要Schema思维。 把方法签名、参数类型、取值约束显式化,是两种方案稳定运行的前提。
4.1 架构拓扑与连接数。 方案A的连接数是N×M,10个客户端×20个系统即200对;方案B是N+M,只需30次实现。差异随规模超线性放大:当客户端与系统各自翻倍时,方案A的连接数变为四倍,方案B只变为两倍。
4.2 新增接入的边际成本。 方案A中每接入一个新客户端,要为全部存量系统重写适配;每新增一个系统,要为所有客户端各写一遍。方案B中新客户端实现一次MCP客户端、新系统实现一次MCP服务器,即可与存量两端互通,边际成本接近常数。
4.3 能力表达的标准化程度。 方案A中每个连接器的接口形态由开发者自由发挥,模型侧看到的“工具描述”格式不一,宿主要逐一适配。方案B把能力统一为三类标准原语(见第五节),描述格式、能力发现机制、调用方式都由规范约束。
4.4 安全边界与可控性。 方案A的连接器散落在各客户端侧,权限逻辑重复实现且口径容易漂移。方案B把入口收敛到服务器侧:Schema校验、身份认证、最小权限、审计日志都在一处实现,一次加固全局生效。这正是“模型不碰库、只碰工具”的架构基础。
4.5 演进与维护。 方案A的接口约定缺少统一版本化机制,兼容性靠人工约定。方案B有正式的规范版本(如2026-07-28版本)与配套SDK大版本(官方C# SDK已进入2.x),升级路径与废弃策略有章可循。
4.6 生态兼容与复用。 按MCP实现的服务器可以被任何兼容宿主复用:今天接入某编辑器内置AI助手,明天接入某桌面AI助手,服务器代码无需改动。定制连接器则天然绑定特定客户端的扩展机制。
4.7 团队协作与职责划分。 MCP让“业务能力提供方”(写服务器)与“AI体验建设方”(宿主与客户端)解耦,两个团队只需对齐协议版本;方案A中两端团队被成对的联调工作长期捆绑。
对比总表:
| 维度 | 方案A:点对点定制集成 | 方案B:MCP标准化集成 |
|---|---|---|
| 连接数 | N×M | N+M |
| 新增一端的成本 | 与对端规模成正比 | 常数级(各实现一次) |
| 能力描述 | 各自定义 | 三类标准原语+统一Schema |
| 安全边界 | 分散在各连接器 | 收敛在服务器侧 |
| 版本演进 | 人工约定 | 规范版本化+SDK升级路径 |
| 复用性 | 绑定特定客户端 | 任何兼容宿主可复用 |
| 成本结构 | 重复开发+长期联调人力 | 一次性协议学习+服务器建设 |
| 适用阶段 | 小规模试点、单组合 | 多客户端多系统、长期演进 |
选定MCP之后,C#开发者面对的第二个选型问题是:一个业务能力应该暴露成哪种原语?三者的区别核心在于“谁来决定何时使用“。
| 能力类型 | 控制方 | 典型用途 | 不适合做什么 |
|---|---|---|---|
| Tools(工具) | 模型 | 执行查询、创建工单、调用API | 用户固定触发的既定流程 |
| Resources(资源) | 应用或用户 | 将文件、Schema、记录作为上下文注入对话 | 需要产生副作用的写操作 |
| Prompts(提示模板) | 用户 | 斜杠命令式工作流,如“审查这次代码变更” | 需要模型临场决定的动态调用 |
5.1 Tools:模型主导的“动作”。 适用于查询类(查订单、查库存、查状态)、动作类(创建工单、提交审批)与外部API调用。设计要点:描述必须精准,因为模型完全依赖描述来判断何时调用;写操作要有确认机制与幂等设计;参数Schema要严格,服务端要做二次校验。
5.2 Resources:应用或用户主导的“上下文”。 适用于把需求文档、数据库Schema、业务记录注入对话作为背景知识。它不由模型“决定调用”,而是应用或用户主动挂载。当一个信息只是背景而非待执行动作时,优先用Resources而非包装成工具——这能减少模型误调用,也减少不必要的请求往返。
5.3 Prompts:用户主导的“流程”。 适用于把高频、固定的操作序列固化为一键触发的模板,例如代码审查、报告生成。由用户显式触发,行为最可预期,也最利于流程标准化。
一个实用的判断口诀:动作给Tools,背景给Resources,流程给Prompts。
以一个图书状态查询为例(伪代码,具体注册方式以所用SDK文档为准):
// 伪代码:将业务查询注册为MCP工具[Tool(Name = "get_book_status", Description = "按图书编号查询图书当前状态")]public BookStatus GetBookStatus([Param(Name = "bookId", Description = "图书唯一编号", Required = true)] int bookId){// 1. 校验参数与调用方权限(最小权限原则)// 2. 执行业务查询——数据库与内部服务的访问只发生在这里// 3. 返回结构化结果,供模型继续推理return _bookService.Query(bookId);}
无论SDK采用特性标注、流式注册还是手动注册,思路一致:声明工具名、面向模型的自然语言描述、参数Schema,再绑定到普通C#方法。官方C# SDK进入2.x后,这类样板代码已明显精简,开发者可以把精力集中在工具粒度与安全设计上。
MCP与点对点定制集成的差异,本质是“集成逻辑放在哪、由谁维护、能否复用”的差异。定制集成以灵活性换取连接数与维护成本的失控风险;MCP以一次性的协议学习与服务器改造,换取N+M的线性扩展、收敛的安全边界与跨宿主复用能力。对C#开发者而言,随着规范演进到2026-07-28版本、官方SDK进入2.x,落地成本已明显降低。真正的决策点不在“协议好不好”,而在自身的规模预期、安全收敛需求与团队能力结构——据此条件化选择、必要时混合使用,才是务实的答案。