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 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('║ 柴米记账 MCP Server v2.1.0 ║');
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
- deviceCodeRes.interval * 1000 || 5000
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
- process.stdout.write('.');
336
+ const elapsedSeconds = attempts * (interval / 1000);
337
+ process.stdout.write(`\r 等待中... ${elapsedSeconds}秒(请在小程完成授权)`);
336
338
  continue;
337
339
  }
338
340
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chaimi-bookkeeping-mcp",
3
- "version": "2.2.7",
3
+ "version": "2.3.2",
4
4
  "description": "柴米记账 MCP Server - 支持 Claude、Cursor、OpenClaw、WorkBuddy 等 AI 工具直接记账",
5
5
  "main": "server.js",
6
6
  "bin": {
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: args.items.map((item, index) => {
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: