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.
Files changed (3) hide show
  1. package/README.md +6 -0
  2. package/package.json +1 -1
  3. 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chaimi-bookkeeping-mcp",
3
- "version": "2.2.7",
3
+ "version": "2.3.0",
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: