chaimi-bookkeeping-mcp 2.2.7 → 2.3.0
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 +6 -0
- package/package.json +1 -1
- package/server.js +24 -4
package/README.md
CHANGED
|
@@ -141,6 +141,12 @@ AI 会自动调用 `save_income` 工具记录收入。
|
|
|
141
141
|
|
|
142
142
|
## 更新日志
|
|
143
143
|
|
|
144
|
+
### v2.3.0 (2026-04-08)
|
|
145
|
+
- **修复** `save_receipt` 的 `items` 参数解析 bug,支持 JSON 字符串自动转换
|
|
146
|
+
- **优化** `source` 字段规范:`save_expense`→`mcp_txt_expense`、`save_income`→`mcp_txt_income`、`save_receipt`→`mcp_receipt`
|
|
147
|
+
- **新增** `mcp_version` 字段追踪,便于版本监控
|
|
148
|
+
- **注释** `quick_book` 工具(暂时下线,待优化后重新开放)
|
|
149
|
+
|
|
144
150
|
### v2.2.0 (2026-04-05)
|
|
145
151
|
- **新增收入记账功能** (`save_income`)
|
|
146
152
|
- 支持工资、奖金、红包、投资收益等收入类型
|
package/package.json
CHANGED
package/server.js
CHANGED
|
@@ -24,7 +24,6 @@ const fs = require('fs');
|
|
|
24
24
|
|
|
25
25
|
// 读取 package.json 获取版本
|
|
26
26
|
const packageJson = JSON.parse(fs.readFileSync(path.join(__dirname, 'package.json'), 'utf8'));
|
|
27
|
-
const CURRENT_VERSION = packageJson.version;
|
|
28
27
|
const MCP_VERSION = packageJson.version;
|
|
29
28
|
console.log('柴米记账 MCP Server 版本:', MCP_VERSION);
|
|
30
29
|
|
|
@@ -86,6 +85,7 @@ const server = new Server(
|
|
|
86
85
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
87
86
|
return {
|
|
88
87
|
tools: [
|
|
88
|
+
/*
|
|
89
89
|
{
|
|
90
90
|
name: 'quick_book',
|
|
91
91
|
description: '【推荐首选】极简快捷记账 - 自动识别支出/收入,智能匹配分类。仅需 name 和 amount 两个参数,其他自动补全。输入如:"午餐 30 元"、"工资 8000 元"、"木屋烧烤 35 元"',
|
|
@@ -105,6 +105,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
105
105
|
required: ['name', 'amount'],
|
|
106
106
|
},
|
|
107
107
|
},
|
|
108
|
+
*/
|
|
108
109
|
{
|
|
109
110
|
name: 'save_expense',
|
|
110
111
|
description: '保存单商品消费记录(AI文字记账)',
|
|
@@ -142,7 +143,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
142
143
|
receiptNo: { type: 'string', description: '小票编号' },
|
|
143
144
|
items: {
|
|
144
145
|
type: 'array',
|
|
145
|
-
description: '
|
|
146
|
+
description: '商品列表(必须是数组格式,如:[{"name":"苹果","amount":5.5,"price":5.5,"quantity":1}],不要传JSON字符串)',
|
|
146
147
|
items: {
|
|
147
148
|
type: 'object',
|
|
148
149
|
properties: {
|
|
@@ -398,6 +399,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
398
399
|
|
|
399
400
|
// 根据工具类型选择处理流程
|
|
400
401
|
switch (name) {
|
|
402
|
+
/*
|
|
401
403
|
case 'quick_book': {
|
|
402
404
|
// 极简快捷记账:自动识别支出/收入,智能匹配分类
|
|
403
405
|
console.log('处理极简快捷记账...');
|
|
@@ -451,6 +453,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
451
453
|
}
|
|
452
454
|
break;
|
|
453
455
|
}
|
|
456
|
+
*/
|
|
454
457
|
|
|
455
458
|
case 'save_expense': {
|
|
456
459
|
// 步骤1:校验数据完整性
|
|
@@ -691,12 +694,26 @@ function convertParams(toolName, args) {
|
|
|
691
694
|
agentType: args.agentType || '',
|
|
692
695
|
apiProvider: args.apiProvider || '',
|
|
693
696
|
mcp_version: args.mcp_version || MCP_VERSION,
|
|
697
|
+
source: 'mcp_txt_expense',
|
|
694
698
|
};
|
|
695
699
|
}
|
|
696
700
|
|
|
697
|
-
case 'save_receipt':
|
|
701
|
+
case 'save_receipt': {
|
|
702
|
+
// 处理 items 可能是 JSON 字符串的情况
|
|
703
|
+
let items = args.items;
|
|
704
|
+
if (typeof items === 'string') {
|
|
705
|
+
try {
|
|
706
|
+
items = JSON.parse(items);
|
|
707
|
+
} catch (e) {
|
|
708
|
+
throw new Error('items 参数格式错误:必须是数组或 JSON 数组字符串');
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
if (!Array.isArray(items)) {
|
|
712
|
+
throw new Error('items 参数必须是数组');
|
|
713
|
+
}
|
|
714
|
+
|
|
698
715
|
return {
|
|
699
|
-
items:
|
|
716
|
+
items: items.map((item, index) => {
|
|
700
717
|
const weight = sanitizeString(item.weight, 50);
|
|
701
718
|
const amount = validateAmount(item.amount);
|
|
702
719
|
// 优先使用传入的 marketPrice,如果没有则自动计算
|
|
@@ -733,7 +750,9 @@ function convertParams(toolName, args) {
|
|
|
733
750
|
agentType: args.agentType || '',
|
|
734
751
|
apiProvider: args.apiProvider || '',
|
|
735
752
|
mcp_version: args.mcp_version || MCP_VERSION,
|
|
753
|
+
source: 'mcp_receipt',
|
|
736
754
|
};
|
|
755
|
+
}
|
|
737
756
|
|
|
738
757
|
case 'get_expenses':
|
|
739
758
|
return {
|
|
@@ -760,6 +779,7 @@ function convertParams(toolName, args) {
|
|
|
760
779
|
agentType: args.agentType || '',
|
|
761
780
|
apiProvider: args.apiProvider || '',
|
|
762
781
|
mcp_version: args.mcp_version || MCP_VERSION,
|
|
782
|
+
source: 'mcp_txt_income',
|
|
763
783
|
};
|
|
764
784
|
|
|
765
785
|
default:
|