内容
# Revit MCP - 使用自然语言处理与Revit文档进行交互
<img width="1919" height="1079" alt="image (1)" src="https://github.com/user-attachments/assets/42e33413-81c9-488c-bb5f-b65bdcd17a66" />
一款为 **Autodesk Revit 自动化** 而构建的桌面AI助手,使用 **WPF (.NET 8)**、**Google Gemini API** 和自定义的 **.NET MCP 服务器**。
该应用程序允许用户输入类似以下的自然语言提示:
- “获取墙体 954726 的长度”
- “列出 1 层的所有房间”
- “获取 2 层的楼面面积”
- “打开此Revit文件,读取后关闭”
Gemini 作为推理引擎,决定调用哪些工具并自动执行多步骤工作流程 — 打开 Revit,提取数据,关闭文档,无需人工干预。
---
## 解决方案结构
```
Revit MCP/
├── UI/ # WPF 桌面应用程序 (.NET 8)
├── RevitMCP.AI/ # Gemini AI 协调层 (.NET 8)
├── RevitMCP.Server/ # .NET MCP 服务器 (.NET 8)
└── RevitMCP.Addin/ # Revit 加载项 (.NET Framework 4.8)
```
---
## 架构
### 1. WPF 桌面 UI (`UI`)
使用以下技术构建的现代化桌面界面:
- 提示输入 + 发送按钮
- `.rvt` 文件路径选择器(浏览对话框)
- 状态栏(思考中... / 完成 / 错误)
- 响应显示面板
- MVVM 模式 (`MainViewModel`, `BaseViewModel`, `RelayCommand`)
- 整个过程中使用 `async/await` — UI 从未被阻塞
### 2. AI 推理层 (`RevitMCP.AI`)
处理完整的 Gemini 工具使用循环:
- 将用户提示、文件路径和 MCP 工具模式发送到 Gemini
- 从 Gemini 接收 `tool_use` 响应
- 通过 `McpClientService` 调用 MCP 服务器(MCP 协议 via stdio)
- 将 `tool_result` 发送回 Gemini
- 循环直到 Gemini 返回最终文本答案
- 将答案返回到 WPF UI
**关键文件:**
- `GeminiService.cs` — 主要协调、工具循环、对话历史
- `McpClientService.cs` — 使用 `ModelContextProtocol` 1.3.0 的 MCP 客户端
- `AppConfig.cs` — 从 `appsettings.json` 读取 Gemini API 密钥
- `Models/GeminiRequest.cs` — 请求形状,包括 `thoughtSignature` 支持
- `Models/GeminiResponse.cs` — 响应形状
- `Models/ToolDefinition.cs` — 发送到 Gemini 的 MCP 工具模式
**模型:** `gemini-2.5-flash` via Google AI Studio API
### 3. .NET MCP 服务器 (`RevitMCP.Server`)
本地控制台进程:
- 由 `McpClientService` 启动为子进程
- 通过 **stdio** (MCP 协议)与 Gemini 层通信
- 通过 `[McpServerTool]` 属性公开 Revit 工具
- 通过 **命名管道** (`RevitMCPPipe`) 将工具调用转发到 Revit 加载项
**公开工具:**
- `open_revit_document(file_path)` — 打开 `.rvt` 文件
- `get_wall_length(wall_id)` — 返回墙体长度(米)
- `get_floor_area(level_name)` — 返回楼面面积(平方米)
- `list_rooms_by_level(level_name)` — 列出所有房间及其面积
- `close_revit_document()` — 关闭打开的文档
**关键文件:**
- `Program.cs` — MCP 服务器主机,带有 stdio 传输
- `Tools/RevitDocumentTools.cs` — 打开/关闭工具
- `Tools/RevitQueryTools.cs` — 几何和查询工具
- `Pipe/RevitPipeClient.cs` — 带有重试逻辑的命名管道客户端
### 4. Revit 加载项 (`RevitMCP.Addin`)
一个 `.NET Framework 4.8` Revit 加载项:
- 当 Revit 2024 启动时自动加载(通过 `.addin` 清单)
- 启动时启动命名管道服务器 (`RevitMCPPipe`)
- 监听来自 MCP 服务器的 JSON 命令
- 通过 `IExternalEventHandler` 在 Revit 主线程上执行 Revit DB API 调用
- 通过管道将实际的 Revit 数据作为 JSON 返回
**关键文件:**
- `App.cs` — `IExternalApplication` 入口点
- `PipeServer/RevitPipeServer.cs` — 命名管道服务器 + 命令路由器
- `Commands/RevitDataExtractor.cs` — Revit DB API 查询(墙体、楼板、房间)
**清单位置:**
```
C:\ProgramData\Autodesk\Revit\Addins\2024\RevitMCP.addin
```
```
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<RevitAddIns>
<AddIn Type="Application">
<Assembly>dll_path</Assembly>
<AddInId>guid</AddInId>
<FullClassName>Namespace.classname</FullClassName>
<Name>REVIT_MCP</Name>
<Text>REVIT_MCP</Text>
<VendorId>Rushikesh</VendorId>
<VendorDescription>www.ru5hikesh.com</VendorDescription>
<AllowLoadIntoExistingSession>1</AllowLoadIntoExistingSession>
</AddIn>
</RevitAddIns>
```
---
## 完整请求流程
```
用户在 WPF UI 中输入提示
↓
GeminiService.SendPromptAsync()
↓ HTTPS
Google Gemini API (gemini-2.5-flash)
↓ tool_use: open_revit_document
McpClientService.CallToolAsync()
↓ stdio (MCP 协议)
RevitMCP.Server.exe
↓ 命名管道 (RevitMCPPipe)
RevitMCP.Addin (在 Revit.exe 内)
↓ Revit DB API
实际的 Revit 数据 (.rvt 文件)
↑ JSON 结果
通过管道返回 → MCP 服务器 → Gemini
↑ tool_result
Gemini 推理,调用更多工具(如果需要)
↑ 最终文本答案
在 WPF UI 中显示 ResponseText
```
---
## 通信边界
| 边界 | 协议 | 原因 |
|---|---|---|
| UI → AI 层 | 直接 C# 方法调用 | 相同进程 |
| AI 层 → Gemini | HTTPS (REST) | 云 API |
| AI 层 → MCP 服务器 | stdio (MCP 协议) | 父/子进程 |
| MCP 服务器 → Revit 加载项 | 命名管道 | 两个独立进程 |
| 加载项 → Revit DB API | 进程内 | 相同运行时 |
---
## 为什么有两个运行时边界?
Revit 加载项必须是 **.NET Framework 4.8** — Revit 只加载 Framework 程序集。其他所有内容都是 **.NET 8**。命名管道是跨越此运行时边界的唯一干净方法。
---
## 先决条件
- 已安装 Autodesk Revit 2024
- .NET 8 SDK
- .NET Framework 4.8
- Google Gemini API 密钥(来自 [aistudio.google.com](https://aistudio.google.com) 的免费层)
---
## 设置
**1. 添加 Gemini API 密钥**
在 `RevitMCP.AI/appsettings.json` 中:
```json
{
"GeminiApiKey": "your_key_here"
}
```
**2. 放置加载项清单**
复制 `RevitMCP.addin` 到:
```
C:\ProgramData\Autodesk\Revit\Addins\2024\
```
**3. 构建解决方案**
构建所有 4 个项目。确保 `RevitMCP.Server.exe` 最终位于与 `UI.exe` 相同的输出文件夹中。
**4. 运行**
1. 打开 Revit 2024 — 加载项自动加载
2. 在 Revit 中打开任意 `.rvt` 文件
3. 运行 UI (`UI.exe`)
4. 浏览到您的 `.rvt` 文件
5. 输入提示并点击发送
---
## 技术栈
| 层 | 技术 |
|---|---|
| 桌面 UI | WPF, .NET 8, MVVM |
| AI 推理 | Google Gemini API (`gemini-2.5-flash`) |
| 工具协议 | Model Context Protocol (MCP) 1.3.0 |
| MCP 服务器 | .NET 8 控制台,`ModelContextProtocol` NuGet |
| Revit 集成 | .NET Framework 4.8, Revit DB API |
| 日志记录 | Serilog |
| 进程间通信 | 命名管道 (`System.IO.Pipes`) |
---
## 目标
通过普通英文命令使 Revit 数据提取可访问 — 无需手动点击,无需脚本,无需用户具备 Revit API 知识。