chaimi-bookkeeping-mcp 2.2.7 → 2.3.2
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/bin/cli.js +5 -1
- package/oauth.js +4 -2
- 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/bin/cli.js
CHANGED
|
@@ -10,6 +10,10 @@ const fs = require('fs');
|
|
|
10
10
|
const os = require('os');
|
|
11
11
|
const { spawn } = require('child_process');
|
|
12
12
|
|
|
13
|
+
// 读取 package.json 获取版本
|
|
14
|
+
const packageJson = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8'));
|
|
15
|
+
const CURRENT_VERSION = packageJson.version;
|
|
16
|
+
|
|
13
17
|
// 获取 server.js 的绝对路径
|
|
14
18
|
const serverPath = path.join(__dirname, '..', 'server.js');
|
|
15
19
|
|
|
@@ -183,7 +187,7 @@ function configureAllAgents() {
|
|
|
183
187
|
function showWelcome() {
|
|
184
188
|
console.log('╔════════════════════════════════════════════════════════╗');
|
|
185
189
|
console.log('║ ║');
|
|
186
|
-
console.log(
|
|
190
|
+
console.log(`║ 柴米记账 MCP Server v${CURRENT_VERSION} ║`);
|
|
187
191
|
console.log('║ ║');
|
|
188
192
|
console.log('║ 支持: OpenClaw | WorkBuddy | Claude | Cursor ║');
|
|
189
193
|
console.log('║ ║');
|
package/oauth.js
CHANGED
|
@@ -101,10 +101,11 @@ class OAuthManager {
|
|
|
101
101
|
console.log('');
|
|
102
102
|
console.log('⏳ 等待用户授权,请勿关闭窗口...');
|
|
103
103
|
console.log(' (请在手机微信中完成授权操作)');
|
|
104
|
+
console.log(' 授权完成后会自动继续,无需手动告知');
|
|
104
105
|
console.log('');
|
|
105
106
|
const token = await this.pollForToken(
|
|
106
107
|
deviceCodeRes.deviceCode,
|
|
107
|
-
|
|
108
|
+
2000 // 固定2秒轮询,更快响应
|
|
108
109
|
);
|
|
109
110
|
|
|
110
111
|
// 4. 存储 Token
|
|
@@ -332,7 +333,8 @@ class OAuthManager {
|
|
|
332
333
|
// 处理错误
|
|
333
334
|
if (result.error === 'authorization_pending') {
|
|
334
335
|
// 仍在等待授权,继续轮询
|
|
335
|
-
|
|
336
|
+
const elapsedSeconds = attempts * (interval / 1000);
|
|
337
|
+
process.stdout.write(`\r 等待中... ${elapsedSeconds}秒(请在小程完成授权)`);
|
|
336
338
|
continue;
|
|
337
339
|
}
|
|
338
340
|
|
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:
|