@atlisp/mcp 1.0.16 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +196 -139
- package/package.json +1 -1
- package/src/atlisp-mcp.js +6 -0
- package/src/cad-worker.js +26 -0
- package/src/cad.js +10 -0
- package/src/cli.js +7 -2
- package/src/constants.js +1 -1
- package/src/handlers/cad-handlers.js +10 -0
package/README.md
CHANGED
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
# @lisp MCP Server
|
|
2
2
|
|
|
3
|
-
MCP (Model Context Protocol) Server for @lisp on CAD - 为 CAD 环境提供 @lisp 包管理服务的 MCP
|
|
4
|
-
|
|
5
|
-
同时为 AI AGENT 操控 cad 提供调用工具和通道。
|
|
3
|
+
MCP (Model Context Protocol) Server for @lisp on CAD - 为 CAD 环境提供 @lisp 包管理服务的 MCP 服务器,同时为 AI AGENT 操控 CAD 提供调用工具和通道。
|
|
6
4
|
|
|
7
5
|
## 功能特性
|
|
8
6
|
|
|
9
7
|
- 连接 AutoCAD/ZWCAD/GStarCAD/BricsCAD
|
|
10
|
-
- 执行 AutoLISP
|
|
11
|
-
-
|
|
12
|
-
- 通过 MCP 协议提供标准化接口
|
|
8
|
+
- 执行 AutoLISP 代码,支持绘图、查询、标注
|
|
9
|
+
- AI Agent 可通过 MCP 协议控制 CAD 绘图
|
|
13
10
|
- 管理 @lisp 包(列出、搜索、安装)
|
|
14
|
-
-
|
|
15
|
-
- CAD 无文档时自动处理
|
|
11
|
+
- CAD 未运行自动启动
|
|
16
12
|
|
|
13
|
+
---
|
|
17
14
|
|
|
18
|
-
##
|
|
15
|
+
## 一、安装
|
|
19
16
|
|
|
20
17
|
### Windows (PowerShell)
|
|
21
18
|
|
|
@@ -23,71 +20,44 @@ MCP (Model Context Protocol) Server for @lisp on CAD - 为 CAD 环境提供 @lis
|
|
|
23
20
|
iwr -useb https://atlisp.cn/install.ps1 | iex
|
|
24
21
|
```
|
|
25
22
|
|
|
26
|
-
|
|
23
|
+
安装脚本会自动:
|
|
24
|
+
- 安装 Node.js(如未安装)
|
|
25
|
+
- 全局安装 `@atlisp/mcp` 包
|
|
26
|
+
- 创建命令 `atlisp-mcp`
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
### 验证安装
|
|
29
|
+
|
|
30
|
+
```powershell
|
|
31
|
+
atlisp-mcp --version
|
|
30
32
|
```
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
---
|
|
33
35
|
|
|
34
|
-
|
|
36
|
+
## 二、配置 AI Agent (WorkBuddy / Claude Desktop)
|
|
35
37
|
|
|
36
|
-
|
|
38
|
+
### WorkBuddy 配置
|
|
37
39
|
|
|
38
|
-
|
|
40
|
+
在 `~/.workbuddy/.mcp.json` 中添加:
|
|
39
41
|
|
|
40
42
|
```json
|
|
41
43
|
{
|
|
42
|
-
"
|
|
44
|
+
"mcpServers": {
|
|
43
45
|
"atlisp-mcp": {
|
|
44
|
-
"
|
|
45
|
-
"args": [],
|
|
46
|
-
"env": {
|
|
47
|
-
"TRANSPORT": "stdio"
|
|
48
|
-
}
|
|
46
|
+
"url": "http://localhost:8110/mcp"
|
|
49
47
|
}
|
|
50
48
|
}
|
|
51
49
|
}
|
|
52
50
|
```
|
|
53
51
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
在配置文件中添加:
|
|
57
|
-
|
|
58
|
-
```yaml
|
|
59
|
-
mcp_servers:
|
|
60
|
-
atlisp-mcp:
|
|
61
|
-
command: atlisp-mcp
|
|
62
|
-
env:
|
|
63
|
-
TRANSPORT: stdio
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
#### Hermes (Claude 独立版)
|
|
52
|
+
### Claude Desktop 配置
|
|
67
53
|
|
|
68
|
-
在
|
|
69
|
-
|
|
70
|
-
```json
|
|
71
|
-
{
|
|
72
|
-
"name": "atlisp-mcp",
|
|
73
|
-
"command": "atlisp-mcp",
|
|
74
|
-
"args": [],
|
|
75
|
-
"env": {
|
|
76
|
-
"TRANSPORT": "stdio"
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
#### Cline / Cursor / Windsurf
|
|
82
|
-
|
|
83
|
-
在这些 IDE 的 MCP 设置中添加:
|
|
54
|
+
在 `~/AppData/Roaming/Claude/claude_desktop_config.json` 中添加:
|
|
84
55
|
|
|
85
56
|
```json
|
|
86
57
|
{
|
|
87
58
|
"mcpServers": {
|
|
88
59
|
"atlisp-mcp": {
|
|
89
60
|
"command": "atlisp-mcp",
|
|
90
|
-
"args": [],
|
|
91
61
|
"env": {
|
|
92
62
|
"TRANSPORT": "stdio"
|
|
93
63
|
}
|
|
@@ -96,144 +66,231 @@ mcp_servers:
|
|
|
96
66
|
}
|
|
97
67
|
```
|
|
98
68
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
如果 agent 不支持 stdio,可以改用 HTTP 模式:
|
|
69
|
+
### 其他 AI Agent (Cline / Cursor / Windsurf)
|
|
102
70
|
|
|
103
71
|
```json
|
|
104
72
|
{
|
|
105
73
|
"mcpServers": {
|
|
106
74
|
"atlisp-mcp": {
|
|
107
|
-
"
|
|
75
|
+
"command": "atlisp-mcp",
|
|
76
|
+
"args": [],
|
|
77
|
+
"env": {
|
|
78
|
+
"TRANSPORT": "stdio"
|
|
79
|
+
}
|
|
108
80
|
}
|
|
109
81
|
}
|
|
110
82
|
}
|
|
111
83
|
```
|
|
112
84
|
|
|
113
|
-
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 三、启动服务
|
|
88
|
+
|
|
89
|
+
### HTTP 模式(默认,端口 8110)
|
|
114
90
|
|
|
115
|
-
**同时支持HTTP 和studio模式**:
|
|
116
91
|
```bash
|
|
117
92
|
atlisp-mcp
|
|
118
93
|
```
|
|
119
|
-
### 环境变量
|
|
120
94
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
| `HOST` | `0.0.0.0` | HTTP 模式监听地址 |
|
|
126
|
-
| `MESSAGE_TIMEOUT` | `60000` | 消息超时(毫秒) |
|
|
127
|
-
| `BUSY_RETRIES` | `10` | CAD 忙碌时重试次数 |
|
|
128
|
-
| `BUSY_DELAY` | `500` | CAD 忙碌重试间隔(毫秒) |
|
|
129
|
-
| `MCP_API_KEY` | (无) | API Key 认证(可选) |
|
|
95
|
+
服务启动后输出:
|
|
96
|
+
```
|
|
97
|
+
@lisp MCP Server 启动 - http://0.0.0.0:8110 - Streamable HTTP
|
|
98
|
+
```
|
|
130
99
|
|
|
131
|
-
###
|
|
100
|
+
### stdio 模式(AI Agent 直接调用)
|
|
132
101
|
|
|
133
102
|
```bash
|
|
134
|
-
|
|
103
|
+
atlisp-mcp
|
|
104
|
+
# 环境变量
|
|
105
|
+
TRANSPORT=stdio
|
|
135
106
|
```
|
|
136
107
|
|
|
137
|
-
测试覆盖 54 个用例,包括:
|
|
138
|
-
- 工具定义完整性
|
|
139
|
-
- 连接/断开 CAD
|
|
140
|
-
- 执行 LISP 代码
|
|
141
|
-
- 包管理操作
|
|
142
|
-
- 错误处理
|
|
143
|
-
|
|
144
|
-
## API
|
|
145
|
-
|
|
146
108
|
### 健康检查
|
|
147
109
|
|
|
148
110
|
```bash
|
|
149
111
|
curl http://localhost:8110/health
|
|
150
112
|
```
|
|
151
113
|
|
|
152
|
-
|
|
114
|
+
返回 `{"status":"ok","cad":"connected"}` 表示服务正常。
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 四、连接 CAD
|
|
119
|
+
|
|
120
|
+
### 前置条件
|
|
121
|
+
|
|
122
|
+
- Windows 系统
|
|
123
|
+
- CAD 软件已安装(AutoCAD / ZWCAD / GStarCAD / BricsCAD)
|
|
124
|
+
- CAD 已启动(或配置为自动启动)
|
|
125
|
+
|
|
126
|
+
### 连接方式
|
|
127
|
+
|
|
128
|
+
使用 MCP 工具 `connect_cad` 连接 CAD:
|
|
129
|
+
|
|
153
130
|
```json
|
|
154
|
-
{
|
|
131
|
+
{
|
|
132
|
+
"name": "connect_cad",
|
|
133
|
+
"arguments": {}
|
|
134
|
+
}
|
|
155
135
|
```
|
|
156
136
|
|
|
157
|
-
|
|
137
|
+
**自动行为**:
|
|
138
|
+
- 如果 CAD 已运行,连接现有实例
|
|
139
|
+
- 如果 CAD 未运行,通过 COM 自动创建新实例
|
|
158
140
|
|
|
159
|
-
|
|
141
|
+
连接成功返回: `已连接到 AutoCAD 2021`
|
|
160
142
|
|
|
161
|
-
|
|
143
|
+
---
|
|
162
144
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
| `eval_lisp` | 在 CAD 中执行 AutoLISP 代码(不返回结果) | `code`: 字符串 |
|
|
167
|
-
| `eval_lisp_with_result` | 在 CAD 中执行 AutoLISP 代码并返回结果 | `code`: 字符串 |
|
|
168
|
-
| `get_cad_info` | 获取当前 CAD 信息 | 无 |
|
|
169
|
-
| `list_packages` | 列出已安装的 @lisp 包 | 无 |
|
|
170
|
-
| `search_packages` | 搜索 @lisp 包 | `query`: 搜索关键词 |
|
|
171
|
-
| `install_package` | 安装 @lisp 包到 CAD | `packageName`: 包名称 |
|
|
172
|
-
| `get_platform_info` | 获取 CAD 平台信息 | 无 |
|
|
173
|
-
| `get_file_extensions` | 获取指定平台的文件扩展名 | `platform`: 平台名称 |
|
|
174
|
-
| `get_install_code` | 获取 @lisp 安装代码 | 无 |
|
|
175
|
-
| `at_command` | 执行 @lisp 命令 | `command`: 命令 |
|
|
176
|
-
| `new_document` | 在 CAD 中新建空白文档 | 无 |
|
|
177
|
-
| `install_atlisp` | 在 CAD 中安装 @lisp | 无 |
|
|
145
|
+
## 五、绘图示例
|
|
146
|
+
|
|
147
|
+
### 1. 画直线
|
|
178
148
|
|
|
179
|
-
|
|
149
|
+
```json
|
|
150
|
+
{
|
|
151
|
+
"name": "eval_lisp",
|
|
152
|
+
"arguments": {
|
|
153
|
+
"code": "(command \"_.LINE\" \"0,0\" \"100,100\" \"\")"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
180
157
|
|
|
181
|
-
|
|
182
|
-
- **ZWCAD** (文件扩展名: `.zelx`, `.vls`)
|
|
183
|
-
- **GStarCAD** (文件扩展名: `.des`)
|
|
184
|
-
- **BricsCAD** (文件扩展名: `.des`)
|
|
158
|
+
### 2. 画矩形
|
|
185
159
|
|
|
186
|
-
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"name": "eval_lisp",
|
|
163
|
+
"arguments": {
|
|
164
|
+
"code": "(command \"_.RECTANG\" \"0,0\" \"100,100\")"
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
187
168
|
|
|
188
|
-
|
|
189
|
-
2. .NET 代码通过 COM 互操作连接 CAD 应用程序
|
|
190
|
-
3. 支持获取活动 CAD 实例或启动新实例
|
|
191
|
-
4. 通过 `SendCommand` 方法向 CAD 发送 LISP 代码
|
|
192
|
-
5. 执行命令前自动检测 CAD 状态(IsQuiescent)
|
|
193
|
-
6. CAD 忙碌时自动等待(最多 10 次重试)
|
|
194
|
-
7. CAD 无打开文档时返回错误
|
|
169
|
+
### 3. 画圆
|
|
195
170
|
|
|
196
|
-
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"name": "eval_lisp",
|
|
174
|
+
"arguments": {
|
|
175
|
+
"code": "(command \"_.CIRCLE\" \"50,50\" \"25\")"
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
197
179
|
|
|
198
|
-
###
|
|
180
|
+
### 4. 写文字
|
|
199
181
|
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"name": "eval_lisp",
|
|
185
|
+
"arguments": {
|
|
186
|
+
"code": "(entmake (list (cons 0 \"TEXT\") (cons 10 (list 0 0 0)) (cons 40 5) (cons 1 \"标题\")))"
|
|
187
|
+
}
|
|
188
|
+
}
|
|
204
189
|
```
|
|
205
190
|
|
|
206
|
-
###
|
|
191
|
+
### 5. 获取查询结果
|
|
207
192
|
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
193
|
+
```json
|
|
194
|
+
{
|
|
195
|
+
"name": "eval_lisp_with_result",
|
|
196
|
+
"arguments": {
|
|
197
|
+
"code": "(getvar \"acadver\")"
|
|
198
|
+
}
|
|
199
|
+
}
|
|
212
200
|
```
|
|
213
201
|
|
|
214
|
-
|
|
202
|
+
返回 CAD 版本号,如 "AC1027"
|
|
215
203
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
204
|
+
### 6. 统计图形数量
|
|
205
|
+
|
|
206
|
+
```json
|
|
207
|
+
{
|
|
208
|
+
"name": "eval_lisp_with_result",
|
|
209
|
+
"arguments": {
|
|
210
|
+
"code": "(sslength (ssget \"_X\"))"
|
|
211
|
+
}
|
|
212
|
+
}
|
|
220
213
|
```
|
|
221
214
|
|
|
222
|
-
###
|
|
215
|
+
### 7. 切换 CAD 到前台
|
|
223
216
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
217
|
+
当 CAD 在后台运行时,唤醒到前台:
|
|
218
|
+
|
|
219
|
+
```json
|
|
220
|
+
{
|
|
221
|
+
"name": "bring_to_front",
|
|
222
|
+
"arguments": {}
|
|
223
|
+
}
|
|
228
224
|
```
|
|
229
225
|
|
|
230
|
-
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## 六、可用工具列表
|
|
229
|
+
|
|
230
|
+
| 工具名称 | 描述 | 参数 |
|
|
231
|
+
|---------|------|------|
|
|
232
|
+
| `connect_cad` | 连接到 CAD | 无 |
|
|
233
|
+
| `eval_lisp` | 执行 LISP 代码(无返回值) | `code`: LISP 代码 |
|
|
234
|
+
| `eval_lisp_with_result` | 执行 LISP 并返回结果 | `code`: LISP 代码 |
|
|
235
|
+
| `get_cad_info` | 获取 CAD 信息 | 无 |
|
|
236
|
+
| `list_packages` | 列出已安装的包 | 无 |
|
|
237
|
+
| `search_packages` | 搜索包 | `query`: 关键词 |
|
|
238
|
+
| `install_package` | 安装包 | `packageName`: 包名 |
|
|
239
|
+
| `get_platform_info` | 获取平台信息 | 无 |
|
|
240
|
+
| `get_file_extensions` | 获取文件扩展名 | `platform`: 平台名 |
|
|
241
|
+
| `get_install_code` | 获取安装代码 | 无 |
|
|
242
|
+
| `at_command` | 执行 @lisp 命令 | `command`: 命令 |
|
|
243
|
+
| `new_document` | 新建空白文档 | 无 |
|
|
244
|
+
| `bring_to_front` | 切换 CAD 到前台 | 无 |
|
|
245
|
+
| `install_atlisp` | 安装 @lisp | 无 |
|
|
246
|
+
| `get_function_usage` | 获取函数用法 | `name`: 函数名 |
|
|
247
|
+
| `list_functions` | 列出所有函数 | 无 |
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## 七、环境变量
|
|
252
|
+
|
|
253
|
+
| 变量 | 默认值 | 说明 |
|
|
254
|
+
|------|--------|------|
|
|
255
|
+
| `TRANSPORT` | `http` | 传输模式:`http` 或 `stdio` |
|
|
256
|
+
| `PORT` | `8110` | HTTP 模式监听端口 |
|
|
257
|
+
| `HOST` | `0.0.0.0` | HTTP 模式监听地址 |
|
|
258
|
+
| `MESSAGE_TIMEOUT` | `60000` | 消息超时(毫秒) |
|
|
259
|
+
| `MCP_API_KEY` | (无) | API Key 认证(可选) |
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 八、支持平台
|
|
264
|
+
|
|
265
|
+
- **AutoCAD** (扩展名: `.fas`, `.vlx`)
|
|
266
|
+
- **ZWCAD** (扩展名: `.zelx`, `.vls`)
|
|
267
|
+
- **GStarCAD** (扩展名: `.des`)
|
|
268
|
+
- **BricsCAD** (扩展名: `.des`)
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## 九、工作原理
|
|
273
|
+
|
|
274
|
+
1. MCP Server 通过 `edge-js` 调用 .NET 代码
|
|
275
|
+
2. .NET 通过 COM 互操作连接 CAD 应用程序
|
|
276
|
+
3. 支持获取运行中的 CAD 或自动启动
|
|
277
|
+
4. 通过 `SendCommand` 向 CAD 发送 LISP 代码
|
|
278
|
+
5. 执行前自动检测 CAD 状态(IsQuiescent)
|
|
279
|
+
6. CAD 忙碌时自动等待(最多 10 次重试)
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## 十、故障排除
|
|
284
|
+
|
|
285
|
+
| 问题 | 解决方案 |
|
|
286
|
+
|------|---------|
|
|
287
|
+
| 连接失败 | 确保 CAD 已启动并启用 COM 接口 |
|
|
288
|
+
| 工具调用超时 | CAD 可能繁忙,稍后重试 |
|
|
289
|
+
| 中文乱码 | 使用 `vl-princ-to-string` 处理 |
|
|
290
|
+
| 括号错误 | MCP Server 会自动检查并提示 |
|
|
231
291
|
|
|
232
|
-
|
|
233
|
-
- 需要安装对应的 CAD 软件
|
|
234
|
-
- CAD 必须正在运行或可被启动
|
|
235
|
-
- 某些操作可能需要以管理员权限运行
|
|
292
|
+
---
|
|
236
293
|
|
|
237
294
|
## 许可证
|
|
238
295
|
|
|
239
|
-
ISC
|
|
296
|
+
ISC
|
package/package.json
CHANGED
package/src/atlisp-mcp.js
CHANGED
|
@@ -50,6 +50,7 @@ const TOOL_HANDLERS = {
|
|
|
50
50
|
get_install_code: () => ({ content: [{ type: 'text', text: `复制以下代码到 CAD 命令行安装 @lisp:\n\n(progn(vl-load-com)(setq s strcat h "http" o(vlax-create-object (s"win"h".win"h"request.5.1"))v vlax-invoke e eval r read)(v o'open "get" (s h"://atlisp.""cn/@"):vlax-true)(v o'send)(v o'WaitforResponse 1000)(e(r(vlax-get-property o'ResponseText))))` }] }),
|
|
51
51
|
at_command: (a) => cadHandlers.atCommand(a.command),
|
|
52
52
|
new_document: () => cadHandlers.newDocument(),
|
|
53
|
+
bring_to_front: () => cadHandlers.bringToFront(),
|
|
53
54
|
install_atlisp: () => cadHandlers.installAtlisp(),
|
|
54
55
|
get_function_usage: (a) => functionHandlers.getFunctionUsage(a.name, a.package),
|
|
55
56
|
list_functions: (a) => functionHandlers.listFunctions(a.package),
|
|
@@ -140,6 +141,11 @@ export const tools = [
|
|
|
140
141
|
description: '在 CAD 中新建空白文档',
|
|
141
142
|
inputSchema: { type: 'object', properties: {} }
|
|
142
143
|
},
|
|
144
|
+
{
|
|
145
|
+
name: 'bring_to_front',
|
|
146
|
+
description: '将 CAD 窗口切换到前台(从后台运行状态唤醒)',
|
|
147
|
+
inputSchema: { type: 'object', properties: {} }
|
|
148
|
+
},
|
|
143
149
|
{
|
|
144
150
|
name: 'install_atlisp',
|
|
145
151
|
description: '在 CAD 中安装 @lisp',
|
package/src/cad-worker.js
CHANGED
|
@@ -295,6 +295,24 @@ const cadNewDoc = edge.func(function() {/*
|
|
|
295
295
|
}
|
|
296
296
|
*/});
|
|
297
297
|
|
|
298
|
+
const cadBringToFront = edge.func(function() {/*
|
|
299
|
+
async (input) => {
|
|
300
|
+
try {
|
|
301
|
+
string platform = input.ToString();
|
|
302
|
+
string progId = platform + ".Application";
|
|
303
|
+
dynamic cad = System.Runtime.InteropServices.Marshal.GetActiveObject(progId);
|
|
304
|
+
if (cad != null) {
|
|
305
|
+
cad.Visible = true;
|
|
306
|
+
return new { success = true };
|
|
307
|
+
}
|
|
308
|
+
} catch (Exception ex) {
|
|
309
|
+
System.Diagnostics.Debug.WriteLine("cadBringToFront error: " + ex.Message);
|
|
310
|
+
return new { success = false, error = ex.Message };
|
|
311
|
+
}
|
|
312
|
+
return new { success = false, error = "CAD not found" };
|
|
313
|
+
}
|
|
314
|
+
*/});
|
|
315
|
+
|
|
298
316
|
async function waitForIdle(platform) {
|
|
299
317
|
let retries = BUSY_RETRIES;
|
|
300
318
|
while (retries > 0) {
|
|
@@ -380,6 +398,14 @@ async function handleMessage(msg) {
|
|
|
380
398
|
});
|
|
381
399
|
});
|
|
382
400
|
}
|
|
401
|
+
if (msg.type === 'bringToFront') {
|
|
402
|
+
return new Promise((resolve, reject) => {
|
|
403
|
+
cadBringToFront(msg.platform || 'AutoCAD', (e, r) => {
|
|
404
|
+
if (e) reject(e);
|
|
405
|
+
else resolve(r);
|
|
406
|
+
});
|
|
407
|
+
});
|
|
408
|
+
}
|
|
383
409
|
if (msg.type === 'send') {
|
|
384
410
|
const docCheck = await new Promise((resolve, reject) => {
|
|
385
411
|
cadHasDoc(msg.platform || 'AutoCAD', (e, r) => {
|
package/src/cad.js
CHANGED
|
@@ -187,6 +187,16 @@ class CadConnection {
|
|
|
187
187
|
return false;
|
|
188
188
|
}
|
|
189
189
|
}
|
|
190
|
+
|
|
191
|
+
async bringToFront() {
|
|
192
|
+
if (!this.connected) throw new Error('未连接 CAD');
|
|
193
|
+
try {
|
|
194
|
+
const result = await sendMessage({ type: 'bringToFront', platform: _platform });
|
|
195
|
+
return result && result.success;
|
|
196
|
+
} catch (e) {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
190
200
|
|
|
191
201
|
async getInfo() {
|
|
192
202
|
if (!this.connected) return 'CAD 未连接';
|
package/src/cli.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { spawn } from 'child_process';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
|
+
import { SERVER_VERSION } from './constants.js';
|
|
5
6
|
|
|
6
7
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
8
|
const serverPath = path.join(__dirname, 'atlisp-mcp.js');
|
|
@@ -10,7 +11,10 @@ const args = process.argv.slice(2);
|
|
|
10
11
|
const env = { ...process.env };
|
|
11
12
|
|
|
12
13
|
for (let i = 0; i < args.length; i++) {
|
|
13
|
-
if (args[i] === '--
|
|
14
|
+
if (args[i] === '--version' || args[i] === '-v') {
|
|
15
|
+
console.log(`atlisp-mcp v${SERVER_VERSION}`);
|
|
16
|
+
process.exit(0);
|
|
17
|
+
} else if (args[i] === '--transport' && args[i + 1]) {
|
|
14
18
|
env.TRANSPORT = args[i + 1];
|
|
15
19
|
i++;
|
|
16
20
|
} else if (args[i] === '--port' && args[i + 1]) {
|
|
@@ -23,11 +27,12 @@ for (let i = 0; i < args.length; i++) {
|
|
|
23
27
|
env.TRANSPORT = 'stdio';
|
|
24
28
|
} else if (args[i] === '--help' || args[i] === '-h') {
|
|
25
29
|
console.log(`
|
|
26
|
-
@lisp MCP Server
|
|
30
|
+
@lisp MCP Server v${SERVER_VERSION}
|
|
27
31
|
|
|
28
32
|
Usage: atlisp-mcp [options]
|
|
29
33
|
|
|
30
34
|
Options:
|
|
35
|
+
-v, --version Show version number
|
|
31
36
|
--transport <type> Transport type: http or stdio (default: http)
|
|
32
37
|
--port <port> HTTP port (default: 8110)
|
|
33
38
|
--host <host> HTTP host (default: 0.0.0.0)
|
package/src/constants.js
CHANGED
|
@@ -7,7 +7,7 @@ export const FILE_EXTENSIONS = {
|
|
|
7
7
|
|
|
8
8
|
export const PROTOCOL_VERSION = '2024-11-05';
|
|
9
9
|
export const SERVER_NAME = 'atlisp-mcp-server';
|
|
10
|
-
export const SERVER_VERSION = '1.0.
|
|
10
|
+
export const SERVER_VERSION = '1.0.18';
|
|
11
11
|
|
|
12
12
|
export const MOCK_PACKAGES = [
|
|
13
13
|
{ name: 'base', description: '基础函数库', version: '1.0.0' },
|
|
@@ -60,6 +60,16 @@ export async function newDocument() {
|
|
|
60
60
|
return { content: [{ type: 'text', text: '新建文档失败' }], isError: true };
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
+
export async function bringToFront() {
|
|
64
|
+
if (!cad.connected) { await cad.connect(); }
|
|
65
|
+
if (!cad.connected) return { content: [{ type: 'text', text: '未连接 CAD' }], isError: true };
|
|
66
|
+
const result = await cad.bringToFront();
|
|
67
|
+
if (result) {
|
|
68
|
+
return { content: [{ type: 'text', text: '已将 CAD 窗口切换到前台' }] };
|
|
69
|
+
}
|
|
70
|
+
return { content: [{ type: 'text', text: '切换前台失败' }], isError: true };
|
|
71
|
+
}
|
|
72
|
+
|
|
63
73
|
export async function installAtlisp() {
|
|
64
74
|
if (!cad.connected) { await cad.connect(); }
|
|
65
75
|
if (!cad.connected) return { content: [{ type: 'text', text: '未连接 CAD' }], isError: true };
|