a-calc 3.0.0-beta.20250123.12 → 3.0.0-beta.20250123.3
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/browser/index.js +1 -1
- package/cjs/index.js +1 -1
- package/es/index.js +1 -1
- package/mcp-server/README.md +2 -65
- package/mcp-server/src/index.js +66 -380
- package/package.json +127 -127
package/mcp-server/src/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
1
|
+
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
4
4
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
@@ -7,8 +7,6 @@ import {
|
|
|
7
7
|
ListToolsRequestSchema,
|
|
8
8
|
ListResourcesRequestSchema,
|
|
9
9
|
ReadResourceRequestSchema,
|
|
10
|
-
ListPromptsRequestSchema,
|
|
11
|
-
GetPromptRequestSchema,
|
|
12
10
|
} from "@modelcontextprotocol/sdk/types.js";
|
|
13
11
|
|
|
14
12
|
import {
|
|
@@ -41,59 +39,27 @@ import {
|
|
|
41
39
|
const TOOLS = [
|
|
42
40
|
{
|
|
43
41
|
name: "calc",
|
|
44
|
-
description:
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
✅ 正确:const total = calc_sum("price * qty", items) // 使用 calc_sum
|
|
57
|
-
|
|
58
|
-
3. 购物车等场景:
|
|
59
|
-
❌ 错误:cart.forEach(item => total = calc(\`\${total} + \${item.price} * \${item.quantity}\`))
|
|
60
|
-
✅ 正确:calc_sum("price * quantity | =2", cart)
|
|
61
|
-
|
|
62
|
-
4. 对象字段传递:
|
|
63
|
-
❌ 错误:calc("price * qty", {price: item.price, qty: item.qty}) // 冗余
|
|
64
|
-
✅ 正确:calc("price * qty", item) // 简洁优雅
|
|
65
|
-
|
|
66
|
-
核心优势:
|
|
67
|
-
- ✅ 解决 0.1 + 0.2 = 0.30000000000000004 的精度问题
|
|
68
|
-
- ✅ 金融计算、价格计算、统计分析等场景必用
|
|
69
|
-
- ✅ 支持复杂表达式、变量替换、条件判断
|
|
70
|
-
- ✅ 内置格式化:千分位、小数位、百分比、科学计数法
|
|
71
|
-
|
|
72
|
-
适用场景(必须使用):
|
|
73
|
-
1. 任何涉及小数的加减乘除运算
|
|
74
|
-
2. 金融计算、价格计算、折扣计算
|
|
75
|
-
3. 百分比计算、比率计算
|
|
76
|
-
4. 需要格式化输出的数值(千分位、保留小数等)
|
|
77
|
-
5. 带单位的计算(如 "100元 + 50元")
|
|
78
|
-
6. 条件判断和比较运算
|
|
79
|
-
|
|
80
|
-
快速示例:
|
|
81
|
-
- calc("0.1 + 0.2") → "0.3" (精确!)
|
|
82
|
-
- calc("price * qty | =2", {price: 99.9, qty: 3}) → "299.70"
|
|
83
|
-
- calc("1234567 | ,") → "1,234,567" (千分位)
|
|
84
|
-
- calc("score >= 60 ? '及格' : '不及格'", {score: 75}) → "及格"
|
|
85
|
-
|
|
86
|
-
变量注入最佳实践:
|
|
87
|
-
- 如果对象已有所需字段,直接传入:calc("price * qty", item)
|
|
88
|
-
- 如果需要多个独立变量,使用简写:calc("a + b", {a, b})
|
|
89
|
-
- 避免冗余:❌ calc("price * qty", {price: item.price, qty: item.qty})
|
|
42
|
+
description: `a-calc 核心计算函数 - 支持表达式计算、变量填充、格式化
|
|
43
|
+
|
|
44
|
+
功能特点:
|
|
45
|
+
- 高精度计算,避免 JavaScript 浮点数精度问题
|
|
46
|
+
- 支持运算符: + - * / % ** //
|
|
47
|
+
- 支持变量填充和单位计算
|
|
48
|
+
- 支持条件表达式: a > b ? x : y
|
|
49
|
+
- 支持比较运算: > < >= <= == !=
|
|
50
|
+
- 支持逻辑运算: && || !
|
|
51
|
+
- 支持链式比较: 1 < x < 10
|
|
52
|
+
- 支持内置数学函数: sqrt, sin, cos, pow, max, min 等
|
|
53
|
+
- 支持丰富的格式化选项
|
|
90
54
|
|
|
91
|
-
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
-
|
|
55
|
+
使用示例:
|
|
56
|
+
- calc("0.1 + 0.2") → "0.3"
|
|
57
|
+
- calc("a + b", {a: 1, b: 2}) → "3"
|
|
58
|
+
- calc("10 / 3 | =2") → "3.33"
|
|
59
|
+
- calc("1000000 | ,") → "1,000,000"
|
|
60
|
+
- calc("100元 + 50元", {_unit: true}) → "150元"
|
|
61
|
+
- calc("score >= 60 ? '及格' : '不及格'", {score: 75}) → "及格"
|
|
62
|
+
- calc("sqrt(16) + pow(2, 3)") → "12"`,
|
|
97
63
|
inputSchema: {
|
|
98
64
|
type: "object",
|
|
99
65
|
properties: {
|
|
@@ -135,29 +101,20 @@ const TOOLS = [
|
|
|
135
101
|
},
|
|
136
102
|
{
|
|
137
103
|
name: "fmt",
|
|
138
|
-
description:
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
-
|
|
144
|
-
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
-
|
|
148
|
-
-
|
|
149
|
-
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
- ,: 千分位分隔 (如 , → "1,234,567")
|
|
153
|
-
- %: 百分比 (如 %=2 → "12.34%")
|
|
154
|
-
- !e: 科学计数法 (如 !e=2 → "1.23e+8")
|
|
155
|
-
- +: 显示正号 (如 + → "+100")
|
|
156
|
-
- !n: 返回数字类型
|
|
157
|
-
- !v: 交易量缩写 (如 !v → "1.23M")
|
|
158
|
-
- !t:us/eu/indian/cn4: 千分位预设
|
|
159
|
-
|
|
160
|
-
快速示例:
|
|
104
|
+
description: `a-calc 专用格式化函数 - 跳过表达式解析,性能更优
|
|
105
|
+
|
|
106
|
+
格式化规则:
|
|
107
|
+
- 小数位: =N(精确N位), <=N(最多N位), >=N(至少N位)
|
|
108
|
+
- 舍入: ~-(截断), ~+(进位), ~5(四舍五入), ~6(银行家舍入)
|
|
109
|
+
- 千分位: , (如 1,234,567)
|
|
110
|
+
- 百分比: % (如 12.34%)
|
|
111
|
+
- 科学计数: !e (如 1.23e+8)
|
|
112
|
+
- 正负号: + (如 +100)
|
|
113
|
+
- 返回数字: !n (返回 number 类型而非 string)
|
|
114
|
+
- 交易量缩写: !v (如 1.23M, 1.23万)
|
|
115
|
+
- 千分位预设: !t:us, !t:eu, !t:indian, !t:cn4
|
|
116
|
+
|
|
117
|
+
使用示例:
|
|
161
118
|
- fmt(100, "=2") → "100.00"
|
|
162
119
|
- fmt(1234567, ",") → "1,234,567"
|
|
163
120
|
- fmt(0.1234, "%=2") → "12.34%"
|
|
@@ -186,55 +143,16 @@ const TOOLS = [
|
|
|
186
143
|
},
|
|
187
144
|
{
|
|
188
145
|
name: "calc_sum",
|
|
189
|
-
description:
|
|
190
|
-
|
|
191
|
-
⚠️ 使用场景:处理数组数据、批量计算、统计汇总时使用
|
|
192
|
-
|
|
193
|
-
🚨 这是处理数组数据的正确方式!不要用 forEach 累加!
|
|
194
|
-
|
|
195
|
-
典型应用场景:
|
|
196
|
-
1. 计算订单总价:多个商品的 price * quantity 求和
|
|
197
|
-
2. 统计销售额:多条销售记录的金额汇总
|
|
198
|
-
3. 报表数据汇总:批量计算并求和
|
|
199
|
-
4. 购物车总价计算
|
|
200
|
-
|
|
201
|
-
编码规范对比(必读!):
|
|
202
|
-
|
|
203
|
-
❌ 错误写法(不要这样做):
|
|
204
|
-
\`\`\`javascript
|
|
205
|
-
// 购物车总价 - 错误示例
|
|
206
|
-
let total = '0'
|
|
207
|
-
cart.forEach(item => {
|
|
208
|
-
total = calc(\`\${total} + \${item.price} * \${item.quantity}\`)
|
|
209
|
-
})
|
|
210
|
-
\`\`\`
|
|
211
|
-
问题:使用模板字符串拼接、forEach 累加,代码不清晰、性能差
|
|
146
|
+
description: `a-calc 聚合计算函数 - 对数组数据进行批量计算并求和
|
|
212
147
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
// 单个商品小计 - 直接传入对象(最优雅)
|
|
219
|
-
const itemTotal = calc("price * quantity | =2", item)
|
|
220
|
-
\`\`\`
|
|
221
|
-
优势:代码简洁、性能好、自动处理精度
|
|
222
|
-
|
|
223
|
-
🎯 最佳实践:
|
|
224
|
-
- 对象已有所需字段 → 直接传入:calc("a + b", obj)
|
|
225
|
-
- 需要多个独立变量 → 使用简写:calc("a + b", {a, b})
|
|
226
|
-
- 避免冗余写法 → ❌ calc("a + b", {a: obj.a, b: obj.b})
|
|
148
|
+
适用场景:
|
|
149
|
+
- 计算订单总价
|
|
150
|
+
- 统计销售额
|
|
151
|
+
- 汇总报表数据
|
|
227
152
|
|
|
228
|
-
|
|
153
|
+
使用示例:
|
|
229
154
|
- calc_sum("a + b", [{a:1,b:2}, {a:3,b:4}]) → "10"
|
|
230
|
-
- calc_sum("price * qty", [{price:99.9,qty:2}, {price:49.9,qty:
|
|
231
|
-
- calc_sum("price * qty * 0.9 | =2", orders) → 计算所有订单9折后总价
|
|
232
|
-
|
|
233
|
-
优势:
|
|
234
|
-
- 自动处理精度问题
|
|
235
|
-
- 支持复杂表达式
|
|
236
|
-
- 支持格式化输出
|
|
237
|
-
- 性能优于手动累加`,
|
|
155
|
+
- calc_sum("price * qty | =2", [{price:99.9,qty:2}, {price:49.9,qty:1}]) → "249.70"`,
|
|
238
156
|
inputSchema: {
|
|
239
157
|
type: "object",
|
|
240
158
|
properties: {
|
|
@@ -379,24 +297,6 @@ const itemTotal = calc("price * quantity | =2", item)
|
|
|
379
297
|
required: ["topic"],
|
|
380
298
|
},
|
|
381
299
|
},
|
|
382
|
-
{
|
|
383
|
-
name: "debug_info",
|
|
384
|
-
description: `🔍 调试工具 - 获取 MCP 服务器的运行环境信息
|
|
385
|
-
|
|
386
|
-
返回信息:
|
|
387
|
-
- cwd: 当前工作目录 (process.cwd())
|
|
388
|
-
- __dirname: 脚本所在目录
|
|
389
|
-
- __filename: 脚本文件路径
|
|
390
|
-
- node_version: Node.js 版本
|
|
391
|
-
- platform: 操作系统平台
|
|
392
|
-
- env: 相关环境变量
|
|
393
|
-
|
|
394
|
-
用途:调试 MCP 服务器配置问题`,
|
|
395
|
-
inputSchema: {
|
|
396
|
-
type: "object",
|
|
397
|
-
properties: {},
|
|
398
|
-
},
|
|
399
|
-
},
|
|
400
300
|
];
|
|
401
301
|
|
|
402
302
|
// ==================== Resources 定义 ====================
|
|
@@ -760,27 +660,35 @@ calc("(age >= 18 && hasLicense) ? 'can drive' : 'cannot drive'", {
|
|
|
760
660
|
|
|
761
661
|
### 价格计算
|
|
762
662
|
\`\`\`javascript
|
|
763
|
-
// 含税价格
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
663
|
+
// 含税价格
|
|
664
|
+
calc("price * (1 + taxRate) | =2", {price: 100, taxRate: 0.13}) // "113.00"
|
|
665
|
+
|
|
666
|
+
// 折扣价格
|
|
667
|
+
calc("price * discount | =2", {price: 199.9, discount: 0.8}) // "159.92"
|
|
668
|
+
|
|
669
|
+
// 订单总价
|
|
670
|
+
calc("price * qty + shipping | =2,", {
|
|
671
|
+
price: 99.9,
|
|
672
|
+
qty: 3,
|
|
673
|
+
shipping: 15
|
|
674
|
+
}) // "314.70"
|
|
774
675
|
\`\`\`
|
|
775
676
|
|
|
776
677
|
### 利率计算
|
|
777
678
|
\`\`\`javascript
|
|
778
|
-
// 单利
|
|
779
|
-
|
|
780
|
-
|
|
679
|
+
// 单利
|
|
680
|
+
calc("principal * rate * time | =2", {
|
|
681
|
+
principal: 10000,
|
|
682
|
+
rate: 0.05,
|
|
683
|
+
time: 2
|
|
684
|
+
}) // "1000.00"
|
|
781
685
|
|
|
782
686
|
// 复利
|
|
783
|
-
calc("principal * pow(1 + rate, time) - principal | =2",
|
|
687
|
+
calc("principal * pow(1 + rate, time) - principal | =2", {
|
|
688
|
+
principal: 10000,
|
|
689
|
+
rate: 0.05,
|
|
690
|
+
time: 2
|
|
691
|
+
}) // "1025.00"
|
|
784
692
|
\`\`\`
|
|
785
693
|
|
|
786
694
|
## 电商场景
|
|
@@ -798,8 +706,7 @@ calc_sum("price * qty | =2", items) // "548.50"
|
|
|
798
706
|
|
|
799
707
|
### 优惠券计算
|
|
800
708
|
\`\`\`javascript
|
|
801
|
-
|
|
802
|
-
calc("total > 200 ? total * 0.9 : total | =2", cart) // "225.00"
|
|
709
|
+
calc("total > 200 ? total * 0.9 : total | =2", {total: 250}) // "225.00"
|
|
803
710
|
\`\`\`
|
|
804
711
|
|
|
805
712
|
## 数据格式化
|
|
@@ -868,170 +775,6 @@ cmul(99.9, 3) // 单价 * 数量
|
|
|
868
775
|
`
|
|
869
776
|
};
|
|
870
777
|
|
|
871
|
-
// ==================== Prompts 定义 ====================
|
|
872
|
-
|
|
873
|
-
const PROMPTS = [
|
|
874
|
-
{
|
|
875
|
-
name: "a-calc",
|
|
876
|
-
description: "强制在所有数值计算中使用 a-calc(推荐)",
|
|
877
|
-
arguments: [],
|
|
878
|
-
},
|
|
879
|
-
];
|
|
880
|
-
|
|
881
|
-
const PROMPT_CONTENTS = {
|
|
882
|
-
"a-calc": {
|
|
883
|
-
messages: [
|
|
884
|
-
{
|
|
885
|
-
role: "user",
|
|
886
|
-
content: {
|
|
887
|
-
type: "text",
|
|
888
|
-
text: `# 数值计算强制规则
|
|
889
|
-
|
|
890
|
-
⚠️ **重要:在本次对话中,所有数值计算必须使用 a-calc MCP 工具!**
|
|
891
|
-
|
|
892
|
-
## 强制使用场景
|
|
893
|
-
|
|
894
|
-
### 1. 任何涉及小数的运算(必须使用)
|
|
895
|
-
- ✅ 使用 calc("0.1 + 0.2")
|
|
896
|
-
- ❌ 不要直接计算 0.1 + 0.2
|
|
897
|
-
|
|
898
|
-
### 2. 价格和金额计算(必须使用)
|
|
899
|
-
- ✅ 使用 calc("price * qty | =2", item) // 直接传入对象
|
|
900
|
-
- ❌ 不要使用 JavaScript 的 * 运算符
|
|
901
|
-
|
|
902
|
-
### 3. 百分比和折扣计算(必须使用)
|
|
903
|
-
- ✅ 使用 calc("price * 0.9 | =2", product) // 直接传入对象
|
|
904
|
-
- ❌ 不要直接计算
|
|
905
|
-
|
|
906
|
-
### 4. 需要格式化的数值(必须使用)
|
|
907
|
-
- ✅ 使用 fmt(1234567, ",") 或 calc("value | ,", data)
|
|
908
|
-
- ❌ 不要使用 toLocaleString()
|
|
909
|
-
|
|
910
|
-
### 5. 批量数据计算(必须使用)
|
|
911
|
-
- ✅ 使用 calc_sum("price * qty", items)
|
|
912
|
-
- ❌ 不要使用 reduce() 或 forEach() 手动累加
|
|
913
|
-
|
|
914
|
-
## 可以不使用的场景
|
|
915
|
-
|
|
916
|
-
只有以下情况可以不使用 a-calc:
|
|
917
|
-
- 简单的整数加减:1 + 1, 10 - 5
|
|
918
|
-
- 数组长度、索引等非计算场景
|
|
919
|
-
|
|
920
|
-
## 为什么必须使用 a-calc?
|
|
921
|
-
|
|
922
|
-
JavaScript 的浮点数精度问题:
|
|
923
|
-
- 0.1 + 0.2 = 0.30000000000000004 ❌
|
|
924
|
-
- 0.3 - 0.1 = 0.19999999999999998 ❌
|
|
925
|
-
- 99.9 * 3 = 299.70000000000005 ❌
|
|
926
|
-
|
|
927
|
-
使用 a-calc 后:
|
|
928
|
-
- calc("0.1 + 0.2") = "0.3" ✅
|
|
929
|
-
- calc("0.3 - 0.1") = "0.2" ✅
|
|
930
|
-
- calc("99.9 * 3") = "299.7" ✅
|
|
931
|
-
|
|
932
|
-
## 编码规范和最佳实践
|
|
933
|
-
|
|
934
|
-
### ❌ 错误写法 1:使用模板字符串拼接
|
|
935
|
-
\`\`\`javascript
|
|
936
|
-
// 不要这样写!
|
|
937
|
-
let total = '0'
|
|
938
|
-
cart.forEach(item => {
|
|
939
|
-
total = calc(\`\${total} + \${item.price} * \${item.quantity}\`)
|
|
940
|
-
})
|
|
941
|
-
\`\`\`
|
|
942
|
-
**问题**:代码不清晰、难以维护、性能差
|
|
943
|
-
|
|
944
|
-
### ❌ 错误写法 2:重复写字段名(冗余)
|
|
945
|
-
\`\`\`javascript
|
|
946
|
-
// 不要这样写!
|
|
947
|
-
const itemTotal = calc("price * qty | =2", {
|
|
948
|
-
price: item.price,
|
|
949
|
-
qty: item.qty
|
|
950
|
-
})
|
|
951
|
-
\`\`\`
|
|
952
|
-
**问题**:代码冗余、不简洁、重复劳动
|
|
953
|
-
|
|
954
|
-
### ✅ 正确写法 1:使用 calc_sum(批量计算)
|
|
955
|
-
\`\`\`javascript
|
|
956
|
-
const total = calc_sum("price * qty | =2", cart)
|
|
957
|
-
\`\`\`
|
|
958
|
-
|
|
959
|
-
### ✅ 正确写法 2:直接传入对象(最优雅)
|
|
960
|
-
\`\`\`javascript
|
|
961
|
-
// 对象已有所需字段,直接传入
|
|
962
|
-
const itemTotal = calc("price * qty | =2", item)
|
|
963
|
-
\`\`\`
|
|
964
|
-
|
|
965
|
-
### ✅ 正确写法 3:使用变量简写
|
|
966
|
-
\`\`\`javascript
|
|
967
|
-
// 多个独立变量,使用简写
|
|
968
|
-
const result = calc("a + b", {a, b})
|
|
969
|
-
\`\`\`
|
|
970
|
-
|
|
971
|
-
### ✅ 正确写法 4:数组映射
|
|
972
|
-
\`\`\`javascript
|
|
973
|
-
// 对每个对象进行计算
|
|
974
|
-
const results = items.map(item => calc("price * qty | =2", item))
|
|
975
|
-
\`\`\`
|
|
976
|
-
|
|
977
|
-
### 完整示例:购物车计算
|
|
978
|
-
|
|
979
|
-
\`\`\`javascript
|
|
980
|
-
import { calc, calc_sum, fmt } from 'a-calc'
|
|
981
|
-
|
|
982
|
-
// ❌ 错误:使用模板字符串累加
|
|
983
|
-
const wrongTotal = () => {
|
|
984
|
-
let total = '0'
|
|
985
|
-
cart.forEach(item => {
|
|
986
|
-
total = calc(\`\${total} + \${item.price} * \${item.quantity}\`)
|
|
987
|
-
})
|
|
988
|
-
return total
|
|
989
|
-
}
|
|
990
|
-
|
|
991
|
-
// ✅ 正确:使用 calc_sum
|
|
992
|
-
const correctTotal = () => {
|
|
993
|
-
return calc_sum("price * quantity | =2", cart)
|
|
994
|
-
}
|
|
995
|
-
|
|
996
|
-
// ✅ 正确:单个商品小计(直接传入 item 对象)
|
|
997
|
-
const itemSubtotal = (item) => {
|
|
998
|
-
return calc("price * quantity | =2", item)
|
|
999
|
-
}
|
|
1000
|
-
|
|
1001
|
-
// ✅ 正确:应用折扣(直接传入对象)
|
|
1002
|
-
const applyDiscount = (order) => {
|
|
1003
|
-
return calc("total * (1 - discountRate) | =2", order)
|
|
1004
|
-
}
|
|
1005
|
-
|
|
1006
|
-
// ✅ 正确:含税价格(直接传入对象)
|
|
1007
|
-
const withTax = (order) => {
|
|
1008
|
-
return calc("subtotal * (1 + taxRate) | =2", order)
|
|
1009
|
-
}
|
|
1010
|
-
\`\`\`
|
|
1011
|
-
|
|
1012
|
-
## 核心原则
|
|
1013
|
-
|
|
1014
|
-
1. **批量计算用 calc_sum** - 不要用 forEach 累加
|
|
1015
|
-
2. **变量用第二参数注入** - 不要用模板字符串拼接
|
|
1016
|
-
3. **保持表达式简洁** - 一次计算完成,不要分步累加
|
|
1017
|
-
4. **使用格式化** - 用 \`| =2\` 保留小数位
|
|
1018
|
-
|
|
1019
|
-
## 实施要求
|
|
1020
|
-
|
|
1021
|
-
在编写代码时:
|
|
1022
|
-
1. 遇到数值计算,立即考虑是否需要使用 a-calc
|
|
1023
|
-
2. 涉及小数、金额、价格的,必须使用 a-calc
|
|
1024
|
-
3. 优先使用 calc_sum 处理数组数据
|
|
1025
|
-
4. 使用第二参数注入变量,不要用模板字符串
|
|
1026
|
-
5. 在代码注释中说明为什么使用 a-calc
|
|
1027
|
-
|
|
1028
|
-
请确认你理解并将严格遵守这些规则。`,
|
|
1029
|
-
},
|
|
1030
|
-
},
|
|
1031
|
-
],
|
|
1032
|
-
},
|
|
1033
|
-
};
|
|
1034
|
-
|
|
1035
778
|
// ==================== Server Setup ====================
|
|
1036
779
|
|
|
1037
780
|
const server = new Server(
|
|
@@ -1043,7 +786,6 @@ const server = new Server(
|
|
|
1043
786
|
capabilities: {
|
|
1044
787
|
tools: {},
|
|
1045
788
|
resources: {},
|
|
1046
|
-
prompts: {},
|
|
1047
789
|
},
|
|
1048
790
|
}
|
|
1049
791
|
);
|
|
@@ -1247,31 +989,6 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1247
989
|
};
|
|
1248
990
|
}
|
|
1249
991
|
|
|
1250
|
-
case "debug_info": {
|
|
1251
|
-
const debugInfo = {
|
|
1252
|
-
cwd: process.cwd(),
|
|
1253
|
-
__dirname: import.meta.url,
|
|
1254
|
-
node_version: process.version,
|
|
1255
|
-
platform: process.platform,
|
|
1256
|
-
arch: process.arch,
|
|
1257
|
-
env: {
|
|
1258
|
-
HOME: process.env.HOME,
|
|
1259
|
-
USERPROFILE: process.env.USERPROFILE,
|
|
1260
|
-
PATH: process.env.PATH?.split(process.platform === 'win32' ? ';' : ':').slice(0, 5).join('\n '),
|
|
1261
|
-
NODE_ENV: process.env.NODE_ENV,
|
|
1262
|
-
},
|
|
1263
|
-
};
|
|
1264
|
-
|
|
1265
|
-
return {
|
|
1266
|
-
content: [
|
|
1267
|
-
{
|
|
1268
|
-
type: "text",
|
|
1269
|
-
text: JSON.stringify(debugInfo, null, 2),
|
|
1270
|
-
},
|
|
1271
|
-
],
|
|
1272
|
-
};
|
|
1273
|
-
}
|
|
1274
|
-
|
|
1275
992
|
default:
|
|
1276
993
|
throw new Error(`Unknown tool: ${name}`);
|
|
1277
994
|
}
|
|
@@ -1315,43 +1032,12 @@ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
|
1315
1032
|
throw new Error(`Resource not found: ${uri}`);
|
|
1316
1033
|
});
|
|
1317
1034
|
|
|
1318
|
-
// ==================== Prompt Handlers ====================
|
|
1319
|
-
|
|
1320
|
-
server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
1321
|
-
return { prompts: PROMPTS };
|
|
1322
|
-
});
|
|
1323
|
-
|
|
1324
|
-
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
1325
|
-
const { name } = request.params;
|
|
1326
|
-
|
|
1327
|
-
if (PROMPT_CONTENTS[name]) {
|
|
1328
|
-
return PROMPT_CONTENTS[name];
|
|
1329
|
-
}
|
|
1330
|
-
|
|
1331
|
-
throw new Error(`Prompt not found: ${name}`);
|
|
1332
|
-
});
|
|
1333
|
-
|
|
1334
1035
|
// ==================== Start Server ====================
|
|
1335
1036
|
|
|
1336
1037
|
async function main() {
|
|
1337
|
-
// 解析命令行参数
|
|
1338
|
-
const args = process.argv.slice(2);
|
|
1339
|
-
const cwdIndex = args.indexOf('--cwd');
|
|
1340
|
-
|
|
1341
|
-
if (cwdIndex !== -1 && args[cwdIndex + 1]) {
|
|
1342
|
-
const targetCwd = args[cwdIndex + 1];
|
|
1343
|
-
try {
|
|
1344
|
-
process.chdir(targetCwd);
|
|
1345
|
-
console.error(`Changed working directory to: ${process.cwd()}`);
|
|
1346
|
-
} catch (error) {
|
|
1347
|
-
console.error(`Failed to change directory to ${targetCwd}:`, error.message);
|
|
1348
|
-
}
|
|
1349
|
-
}
|
|
1350
|
-
|
|
1351
1038
|
const transport = new StdioServerTransport();
|
|
1352
1039
|
await server.connect(transport);
|
|
1353
1040
|
console.error("a-calc MCP Server running on stdio");
|
|
1354
|
-
console.error(`Working directory: ${process.cwd()}`);
|
|
1355
1041
|
}
|
|
1356
1042
|
|
|
1357
1043
|
main().catch((error) => {
|