从"单兵作战"到"集团军协同":CAD 二次开发中的协议抉择
在 C# 驱动的 CAD 二次开发领域,我们正站在一个关键的十字路口。过去,开发者们习惯于将几何算法、数据解析和业务逻辑硬编码在 DLL 中,通过传统的 API 暴露给主程序。然而,随着大语言模型(LLM)的介入,传统的"函数调用"模式正在被重构。当你的 CAD 插件需要理解自然语言指令,甚至自主完成复杂的装配体审核任务时,如何连接 AI 能力成为了首要难题。
目前,业界主要涌现出两种主流协议标准:由 Anthropic 主导的 MCP (Model Context Protocol)和由谷歌推动的 A2A(Agent-to-Agent Protocol)。很多团队在技术选型时容易陷入误区,要么盲目跟风 MCP,试图用它解决所有协作问题;要么过度设计,用 A2A 去处理简单的文件读取。事实上,这两者并非竞争关系,而是分别解决了 AI 技术栈中不同层次的问题。在 CAD 二次开发的实际场景中,厘清它们的边界,是构建稳定、高效智能系统的前提。
场景复盘:一个复杂装配体的审核困境
为了直观展示两者的差异,我们设定一个典型的工业场景:某大型机械装备的装配体审核。
在这个任务中,系统需要完成以下工作:
- 读取本地图纸 :加载一个包含数千个零件的
.dwg或.step文件。 - 几何分析:识别出所有壁厚小于 2mm 的薄壁特征,并检测潜在的干涉区域。
- 多专业协同:将结构风险发送给"结构专家 Agent",将材料成本数据发送给"成本估算 Agent"。
- 综合报告:汇总各方意见,生成一份包含修改建议的自然语言报告。
面对这个需求,如果只有一种协议,我们会怎么做?如果混合使用,又该如何架构?让我们分别推演。
路径一:MCP 模式------让大模型拥有"几何慧眼"
如果你的核心痛点是让单个 AI 模型能够安全、标准化地访问本地 CAD 数据和几何工具,那么 MCP 是首选。
在 MCP 架构中,你的 C# CAD 插件不再仅仅是一个绘图工具,它摇身一变成为 MCP Server。这个服务器负责暴露具体的"工具(Tools)"和"资源(Resources)"。
核心实现逻辑
在 C# 环境中,你需要构建一个遵循 JSON-RPC 2.0 标准的服务端。对于上述场景,MCP Server 会定义如下能力:
- Resources (资源):指向本地文件系统。例如,定义一个 URI 模板
file://./projects/{project_id}/assemblies/*.step。当模型请求读取该资源时,MCP Server 负责权限校验并将文件内容(或提取后的文本元数据)返回给模型。这解决了"数据孤岛"问题,让模型能"看"到本地图纸。 - Tools (工具):这是 MCP 的精髓。你将原本散落在 C# 类库中的几何算法封装为标准工具。
get_thin_walls(model_path, threshold): 调用底层的几何内核(如 OpenCascade 或自研 BVH 加速模块),返回薄壁面列表。check_interference(part_a, part_b): 执行布尔运算,返回干涉体积和位置。
工作流程演示
- 连接建立:你的 C# 插件启动 MCP Server,监听本地 Socket 或 Stdio。IDE 中的 AI 助手(作为 MCP Client)连接到它。
- 能力协商 :AI 助手询问:"你能做什么?"Server 返回工具列表,包括
get_thin_walls的详细参数定义。 - 任务执行 :用户提问:"检查当前装配体是否有薄壁风险。"
- AI 模型分析意图,决定调用
get_thin_walls工具。 - 它构造标准的 JSON-RPC 请求发送给 C# 插件。
- C# 插件执行原生代码,遍历 B-Rep 数据,计算厚度,返回结构化 JSON 结果。
- AI 模型基于返回数据,生成自然语言回答:"发现 3 处薄壁风险,位于支架连接处..."
- AI 模型分析意图,决定调用
优劣评估
优势 在于集成深度高、延迟低 。MCP 本质上是将外部工具"内化"为模型的能力延伸。对于需要高频调用底层几何算法、实时渲染数据或本地文件操作的场景,MCP 提供了类似 USB 接口般的即插即用体验。在 C# 中,利用现有的 System.Text.Json 和 Socket 库即可快速搭建 Server,无需复杂的网络编排。
局限 在于协作范围受限。MCP 主要是"Client-Server"模式,即"一个模型 + 一堆工具"。如果任务需要多个独立的 AI 智能体(比如一个专门懂成本的 Agent 和一个专门懂结构的 Agent)互相商量,MCP 就显得力不从心。它擅长让一个大脑控制双手,但不擅长让两个大脑对话。
路径二:A2A 模式------构建多 Agent 协同网络
当任务升级为跨域协作,例如需要协调"结构设计"、"成本核算"和"工艺评审"三个不同领域的 AI 智能体共同完成审核时,A2A 协议便登场了。
A2A 的核心目标是解决Agent 之间的互操作性 。在这个模式下,你的 C# 程序可能不再直接暴露几何工具给大模型,而是作为一个Remote Agent (远程智能体)或者Client(协调者)存在。
核心对象与机制
A2A 协议定义了一套完整的社交礼仪,主要包含四个核心对象,这在 C# 实现中需要映射为具体的类或数据结构:
- Agent Card(智能体名片):这是入口。你的"结构审核 Agent"需要发布一个 JSON 格式的名片,声明自己的能力(Skills),例如"我可以分析 STEP 文件并输出应力集中点"。其他 Agent 通过 HTTP GET 请求获取这张名片,从而知道该找谁帮忙。
- Task (任务):协作的基本单元。任务有明确的生命周期状态(
submitted,working,completed,failed)。在装配体审核中,主协调 Agent 会创建一个 Task,指派给结构 Agent。 - Message(消息):Agent 间沟通的载体。支持流式传输(SSE),这意味着在漫长的几何计算过程中,结构 Agent 可以实时向主 Agent 推送进度:"正在分析第 500 个零件..."。
- Artifact(成果):任务的最终产出,可以是文本报告、修正后的图纸文件链接或多模态数据。
工作流程演示
- 能力发现:主协调 Agent(可能是基于 LangGraph 或 AutoGen 构建的 Python 服务)通过查询目录,发现了部署在 C# 环境中的"结构审核 Agent"发布的 Agent Card。
- 任务分发:主 Agent 创建一个 Task,内容为"审核装配体 A 的结构安全性",并通过 HTTP POST 发送给结构 Agent。
- 异步协作 :
- 结构 Agent 接收任务,状态变更为
working。 - 它在内部可能依然调用了 MCP 来获取几何数据(注意:A2A 和 MCP 可以嵌套使用!),执行复杂的有限元分析。
- 分析完成后,它生成一个 Artifact(包含风险报告的文件),并将 Task 状态更新为
completed。
- 结构 Agent 接收任务,状态变更为
- 链式反应:主 Agent 拿到结构报告后,立即创建另一个 Task 发送给"成本 Agent",询问"这些风险点的修复会增加多少成本?"。
- 最终汇总:所有子任务完成后,主 Agent 整合信息,向用户交付最终方案。
优劣评估
优势 在于解耦与扩展性。A2A 允许不同语言(C#、Python、Go)、不同框架(Semantic Kernel、LangChain)开发的 Agent 无缝协作。每个 Agent 都是黑盒,只要遵循 A2A 协议,内部如何实现(是用 C# 写的几何内核还是调用的云端 API)对外透明。这对于大型企业的遗留系统集成尤为友好,旧的 C# CAD 插件只需包裹一层 A2A 接口,即可融入新的 AI 生态。
挑战 在于复杂度与延迟。相比 MCP 的直接调用,A2A 引入了网络通信、状态管理和任务编排的开销。在 C# 中实现完整的 A2A Server(处理 HTTP、SSE、JSON-RPC、状态机)比实现 MCP Server 要繁琐得多。此外,多轮交互带来的延迟累积,在实时性要求极高的操作(如鼠标拖拽时的实时反馈)中可能成为瓶颈。
深度对比:C# 开发者的选型指南
在实际工程中,我们往往不需要非此即彼,而是要根据交互层级来决定。以下是针对 CAD 二次开发场景的详细对比维度:
| 维度 | MCP (Model Context Protocol) | A2A (Agent-to-Agent Protocol) |
|---|---|---|
| 核心定位 | 模型与工具的连接器 (USB 接口) | 智能体之间的协作网 (外交协议) |
| 适用场景 | 单个 LLM 需要访问本地文件、数据库、几何算法库 | 多个独立 Agent 需要分工协作、长流程任务编排 |
| 通信模式 | 请求 - 响应 (Request-Response),同步为主 | 任务驱动 (Task-Based),支持异步、流式、推送 |
| C# 集成难度 | 低。仅需实现 JSON-RPC 解析和工具路由,逻辑集中在本地方法调用。 | 中高。需处理 HTTP Server、SSE 流、任务状态机、Agent Card 管理。 |
| 数据流向 | 双向:模型 <-> 本地资源/工具 | 多向:Agent <-> Agent <-> User |
| 典型用例 | "读取当前打开的 DWG 文件并统计图元数量" | "协调设计 Agent 和工艺 Agent 共同优化装配体" |
| 依赖关系 | 强依赖 Host (如 IDE、桌面客户端) 的支持 | 相对独立,基于标准 Web 协议,易于跨部署 |
避坑指南:不要为了用协议而用协议
在实际落地中,开发者最容易犯的错误是过度抽象。
误区一:用 A2A 做简单工具调用 。 如果你只是想让 AI 读取一个本地 DXF 文件,千万不要搭建一套 A2A 服务。这不仅增加了网络开销,还引入了不必要的状态管理复杂性。此时,一个轻量级的 MCP Server 甚至直接的 Function Calling 才是正解。在 C# 中,直接暴露一个 ReadDxf 方法给模型,效率最高。
误区二:用 MCP 强行模拟多 Agent 协作。 有些团队试图在一个巨大的 MCP Server 里塞入所有逻辑,让单个模型去模拟"结构专家"和"成本专家"的角色切换。这在简单场景下可行,但在复杂任务中,单个模型的上下文窗口容易爆炸,且难以维持不同角色的专业一致性。此时,应拆分为多个独立的 Agent,通过 A2A 进行任务分发。
误区三:忽视 C# 环境的特殊性。 CAD 软件通常运行在严格的单线程公寓(STA)模式下,尤其是涉及 UI 交互时。无论是 MCP 还是 A2A,在处理异步网络请求时,都必须小心线程切换问题。
- 对于 MCP :确保 JSON-RPC 的请求处理线程不直接阻塞 UI 线程,几何计算应在后台线程进行,结果通过
SynchronizationContext回传。 - 对于 A2A:HTTP Listener 的回调同样需要注意线程亲和性。如果 A2A 任务触发了 CAD 界面的刷新(如高亮显示干涉区域),务必 marshal 回主线程。
融合架构:未来的最佳实践
最理想的 CAD 智能系统,往往是 MCP 与 A2A 的混合体。
想象这样一个架构:
- 顶层协调者:一个基于 A2A 协议的 Orchestrator Agent(可能是 Python 编写),负责理解用户的宏观意图,拆解任务。
- 专业执行者 :
- 结构审核 Agent (C# 编写):通过 A2A 接收任务。在其内部,它作为一个 MCP Server,向内置的或外部的 LLM 暴露
AnalyzeStress、GetGeometry等本地高精度工具。 - 数据查询 Agent:通过 A2A 接收任务,内部通过 MCP 连接企业的 PLM 数据库。
- 结构审核 Agent (C# 编写):通过 A2A 接收任务。在其内部,它作为一个 MCP Server,向内置的或外部的 LLM 暴露
- 交互界面:CAD 插件本身作为 A2A 的 Client,同时也作为 MCP 的 Host,为用户提供统一的入口。
在这种模式下,A2A 解决了"谁来干"的调度问题,而 MCP 解决了"怎么干"的工具执行问题。C# 开发者可以利用其在桌面端和几何内核方面的深厚积累,将核心的几何算法封装为 MCP Tools,再将整个插件包装为 A2A Node。
结语
技术选型的本质是对业务场景的深刻理解。在 CAD 二次开发与 AI 融合的浪潮中,MCP 和 A2A 不是互斥的选项,而是互补的基石。
当你需要让大模型"伸手"触摸本地的几何数据时,请选择 MCP ,它能让你的 C# 代码像原生函数一样被 AI 调用,高效且直接。当你需要组建一支由不同专长 AI 构成的"工程团队"来攻克复杂难题时,请拥抱 A2A,它将赋予你的系统跨语言、跨平台的协同智慧。
避免盲目跟风,回归场景本源。只有将合适的协议用在合适的层级,才能构建出既稳定可靠,又具备高度智能的下一代 CAD 辅助系统。对于 C# 开发者而言,这不仅是引入新库的过程,更是重新思考软件架构、将封闭的几何内核开放为智能生态节点的契机。