本文档介绍 NeuroSpec 的系统架构设计。
NeuroSpec 采用双进程架构:
┌─────────────────────────────────────────────────────────────┐
│ AI 编程工具 (Windsurf/Cursor) │
│ │
│ ┌──────────────────┐ │
│ │ MCP Client │◄────── MCP Protocol (stdio) ───────┐ │
│ └──────────────────┘ │ │
└────────────────────────────────────────────────────────────┼─┘
│
┌────────────────────────────────────────────────────────────┼─┐
│ NeuroSpec-MCP (进程1) │ │
│ │ │
│ ┌──────────────────┐ ┌─────────────────────┐ │ │
│ │ MCP Server │───►│ Tool Dispatcher │ │ │
│ │ (rmcp) │ └─────────────────────┘ │ │
│ └──────────────────┘ │ │ │
│ │ HTTP (localhost:15177) │
└─────────────────────────────────────┼──────────────────────┼─┘
│ │
┌─────────────────────────────────────▼──────────────────────┼─┐
│ NeuroSpec GUI (进程2) │ │
│ │ │
│ ┌──────────────────┐ ┌─────────────────────┐ │ │
│ │ Daemon Server │◄───│ Tauri Backend │ │ │
│ │ (Axum HTTP) │ │ (Rust) │ │ │
│ └──────────────────┘ └─────────────────────┘ │ │
│ │ │ │ │
│ ┌────────▼────────┐ ┌─────────▼───────────┐ │ │
│ │ Popup Handler │ │ Vue 3 Frontend │ │ │
│ │ (弹窗管理) │◄──►│ (WebView) │ │ │
│ └─────────────────┘ └─────────────────────┘ │ │
└────────────────────────────────────────────────────────────┴─┘
- MCP 协议限制:MCP 使用 stdio 通信,需要独立进程
- GUI 独立性:GUI 应用需要持续运行以显示弹窗
- 解耦设计:MCP 服务器无状态,GUI 有状态
负责实现 MCP 协议,处理工具调用。
mcp/
├── mod.rs # 模块入口
├── server.rs # MCP 服务器实现
├── dispatcher.rs # 工具分发器
├── tool_registry.rs # 工具注册表
├── handlers/ # 请求处理
│ ├── popup.rs # 弹窗处理
│ └── response.rs # 响应解析
├── tools/ # MCP 工具实现
│ ├── interaction/ # interact 工具
│ ├── memory/ # memory 工具
│ ├── acemcp/ # search 工具
│ └── unified_store/ # 统一存储
└── types.rs # 类型定义
HTTP 服务,桥接 MCP 和 GUI。
daemon/
├── server.rs # Axum HTTP 服务器
├── routes.rs # 路由处理
├── client.rs # HTTP 客户端
├── popup_handler.rs # 弹窗响应处理
└── types.rs # 请求/响应类型
Tauri 命令和 UI 逻辑。
ui/
├── commands.rs # Tauri 命令
├── agents_commands.rs # AGENTS.md 相关
├── tray.rs # 系统托盘
└── exit_handler.rs # 退出处理
用户界面实现。
frontend/
├── components/
│ ├── popup/ # 弹窗组件
│ │ ├── McpPopup.vue
│ │ ├── PopupContent.vue
│ │ └── PopupInput.vue
│ └── tabs/ # 标签页
├── composables/ # 组合式函数
│ ├── useMcpHandler.ts
│ ├── useMemory.ts
│ └── useSystemStatus.ts
├── views/
│ └── MainLayout.vue
└── types/
└── popup.d.ts
IDE ─── stdio ───► NeuroSpec-MCP
│
│ JSON-RPC 2.0
▼
┌─────────────────┐
│ Tool Dispatcher │
└─────────────────┘
│ │ │
┌──────────┘ │ └──────────┐
▼ ▼ ▼
[interact] [memory] [search]
NeuroSpec-MCP ─── HTTP POST ───► Daemon Server
│
│ Tauri Event
▼
┌─────────────┐
│ Vue Frontend │
└─────────────┘
│
│ invoke()
▼
┌─────────────┐
│ Popup Handler│
└─────────────┘
│
│ oneshot channel
▼
[Response to MCP]
1. IDE 调用 interact 工具
└── MCP Server 接收 JSON-RPC 请求
2. Dispatcher 路由到 InteractionTool
└── 创建 PopupRequest
3. DaemonClient 发送 HTTP 请求
└── POST http://127.0.0.1:15177/mcp/execute
4. Daemon 处理请求
├── 创建 oneshot channel
├── 存储到 PENDING_RESPONSES
└── 发送 Tauri 事件 "mcp-popup-request"
5. Vue 前端显示弹窗
└── 用户交互
6. 用户提交响应
└── invoke('handle_mcp_popup_response')
7. Popup Handler 处理响应
├── 从 PENDING_RESPONSES 获取 sender
└── 通过 oneshot channel 发送响应
8. Daemon 返回 HTTP 响应
└── DaemonClient 接收
9. MCP 返回工具结果
└── IDE 接收 JSON-RPC 响应
┌─────────────────────────────────────────────────┐
│ Memory System │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ recall │───►│ Store │◄───│ remember │ │
│ └──────────┘ │ │ └──────────┘ │
│ │ JSON │ │
│ │ Files │ │
│ └──────────┘ │
│ │ │
│ ~/.neurospec-memory/ │
│ └── {project_hash}/ │
│ └── memories.json │
└─────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ Search System │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ search │───►│ Tantivy │◄───│ Indexer │ │
│ └──────────┘ │ Index │ └──────────┘ │
│ └──────────┘ ▲ │
│ │ │
│ ┌─────────┴──────┐ │
│ │ File Watcher │ │
│ │ (增量更新) │ │
│ └────────────────┘ │
│ │
│ %LOCALAPPDATA%/neurospec/ │
│ └── search_index/ │
└─────────────────────────────────────────────────┘
| 技术 | 用途 |
|---|---|
| Rust | 主开发语言 |
| Tauri | 桌面应用框架 |
| Axum | HTTP 服务框架 |
| rmcp | MCP 协议实现 |
| Tantivy | 全文搜索引擎 |
| Tree-sitter | 代码解析 |
| Tokio | 异步运行时 |
| 技术 | 用途 |
|---|---|
| Vue 3 | UI 框架 |
| TypeScript | 类型安全 |
| Vite | 构建工具 |
| UnoCSS | 原子化 CSS |
| Iconify | 图标库 |
| 数据类型 | 存储方式 |
|---|---|
| 配置 | JSON 文件 |
| 记忆 | JSON 文件 |
| 搜索索引 | Tantivy 索引 |
| 交互历史 | JSON 文件 |
- 在
mcp/tools/创建新模块 - 实现工具逻辑
- 在
tool_registry.rs注册工具 - 在
dispatcher.rs添加路由
- 在
frontend/components/创建组件 - 在
ui/commands.rs添加 Tauri 命令 - 在
frontend/composables/创建组合式函数
- MCP 响应延迟:< 100ms(不含用户交互)
- 搜索延迟:< 50ms(索引就绪后)
- 内存占用:~100MB(取决于索引大小)
- 索引构建:~1000 文件/秒
如有架构相关问题,欢迎提交 Issue 讨论!