chaimi-keep-mcp 3.3.3-beta.5 → 3.3.3-beta.7

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
@@ -23,7 +23,7 @@
23
23
  # 1. 安装 MCPorter(WorkBuddy/OpenClaw 等 OpenClaw 架构的 Agent 必需)
24
24
  npm install -g mcporter
25
25
 
26
- # 2. 安装柴米记账 MCP
26
+ # 2. 安装柴米AI记账 MCP
27
27
  npm install -g chaimi-keep-mcp
28
28
 
29
29
  # 3. 启动(自动配置 mcporter)
@@ -89,6 +89,16 @@ export MCP_PROMPT_URL="你的Prompt服务地址"
89
89
 
90
90
  ## Changelog
91
91
 
92
+ ### v3.3.3-beta.7 (2026-04-29)
93
+ - **优化** 回复模板 - 新增"请确认信息"提示,时间移到核心数据区,添加类型变量
94
+ - **优化** 空值处理 - 商家为空时不显示,timeNote 仅异常时显示
95
+ - **修复** save_income - 添加 date 兜底逻辑,不传时间时使用当前时间
96
+ - **修复** save_expense - 优化 timeNote 显示逻辑
97
+
98
+ ### v3.3.3-beta.6 (2026-04-29)
99
+ - **优化** 品牌统一 - 所有"柴米记账"改为"柴米AI记账"
100
+ - **优化** 工具描述 - 重写三个记账工具描述,包含完整调用示例和格式要求
101
+
92
102
  ### v3.3.3-beta.4 (2026-04-29)
93
103
  - **优化** 收入记账时间解析统一 - save_income 同样使用 time_description,修复 AI 计算时间戳错误
94
104
 
package/SKILL.md CHANGED
@@ -9,7 +9,7 @@ updated: "2026-04-27"
9
9
 
10
10
  # 柴米AI记账 Skill
11
11
 
12
- > ✨ 柴米记账超级美学版 - 让记账变成享受
12
+ > ✨ 柴米AI记账超级美学版 - 让记账变成享受
13
13
 
14
14
  ---
15
15
 
@@ -67,7 +67,7 @@ updated: "2026-04-27"
67
67
  ## 三、文档引用关系
68
68
 
69
69
  ```
70
- 用户使用柴米记账
70
+ 用户使用柴米AI记账
71
71
 
72
72
  chaimi-keep-mcp ⭐ 本Skill
73
73
  ├── 记账成功 → 使用回复模板(见七、回复规范)
@@ -154,6 +154,11 @@ chaimi-keep-mcp ⭐ 本Skill
154
154
  - ✅ 返回 `_templateHint` 提示使用哪个模板
155
155
  - ✅ 返回 `_templateVariables` 提供模板变量数据
156
156
 
157
+ **空值处理原则**:
158
+ - 模板变量中,如果某个维度的值为空(null/undefined/空字符串),Agent 应跳过该行不显示
159
+ - 必填字段(金额、类型、商品、分类)必须显示
160
+ - 可选字段(商家、时间、洞察)为空时不显示
161
+
157
162
  ### 7.2 模板文件位置
158
163
 
159
164
  **主模板文件**: `references/response-templates.md`
@@ -191,6 +196,8 @@ references/
191
196
  【第1层:成功标识】✅ 「Agent名称」已帮您记账成功
192
197
  【第2层:分隔强调】═══════════════
193
198
  【第3层:核心数据】💰 金额:¥xx.xx
199
+ 📊 类型:支出/收入
200
+ ═══════════════
194
201
  【第4层:详细信息】
195
202
  📦 商品:xxx
196
203
  🏷️ 分类:xxx
@@ -211,6 +218,7 @@ references/
211
218
  ✅ 「{agentName}」已帮您记账成功
212
219
  ═══════════════
213
220
  💰 金额:¥{金额}
221
+ 📊 类型:{类型}
214
222
  ═══════════════
215
223
 
216
224
  📦 商品:{商品名}
@@ -234,6 +242,7 @@ references/
234
242
  | {agentName} | Agent显示名称 | 「你的小可爱」 |
235
243
  | {商品名} | 商品或商家名称 | 午餐、麦当劳 |
236
244
  | {金额} | 金额(带¥符号) | ¥35.00 |
245
+ | {类型} | 支出/收入类型 | 支出、收入 |
237
246
  | {分类} | 消费分类 | 餐饮 |
238
247
  | {商家} | 商家名称(可选) | 麦当劳 |
239
248
  | {日期时间} | 格式化时间 | 2026-04-24 12:30 |
@@ -249,7 +258,7 @@ references/
249
258
 
250
259
  ## 八、记忆口诀
251
260
 
252
- > **柴米记账超美学,五层结构要牢记。**
261
+ > **柴米AI记账超美学,五层结构要牢记。**
253
262
  > **成功标识在顶部,金额分隔最醒目。**
254
263
  > **商品分类商家时,底部祝福加品牌。**
255
264
  > **场景路由先匹配,工具速查再执行。**
@@ -263,7 +272,7 @@ references/
263
272
 
264
273
  | 错误 | 现象 | 解决方案 | 参考文档 |
265
274
  |:-----|:-----|:---------|:---------|
266
- | **授权失败** | "未找到有效授权" | 执行 `mcporter auth 柴米记账` 重新授权 | troubleshooting.md |
275
+ | **授权失败** | "未找到有效授权" | 执行 `mcporter auth 柴米AI记账` 重新授权 | troubleshooting.md |
267
276
  | **分类不明** | "无法识别分类" | 明确说分类:"午餐35元餐饮" | api-reference.md |
268
277
  | **网络超时** | "请求超时" | 检查网络,稍后重试 | troubleshooting.md |
269
278
 
package/bin/cli.js CHANGED
@@ -161,8 +161,8 @@ function installToAgent(agent) {
161
161
  config.mcpServers = {};
162
162
  }
163
163
 
164
- // 检查是否已存在柴米记账配置
165
- if (config.mcpServers['柴米记账']) {
164
+ // 检查是否已存在柴米AI记账配置
165
+ if (config.mcpServers['柴米AI记账']) {
166
166
  return {
167
167
  success: true,
168
168
  action: 'skipped',
@@ -171,8 +171,8 @@ function installToAgent(agent) {
171
171
  };
172
172
  }
173
173
 
174
- // 添加柴米记账配置
175
- config.mcpServers['柴米记账'] = JSON.parse(JSON.stringify(DEFAULT_CHAIMI_CONFIG));
174
+ // 添加柴米AI记账配置
175
+ config.mcpServers['柴米AI记账'] = JSON.parse(JSON.stringify(DEFAULT_CHAIMI_CONFIG));
176
176
 
177
177
  // 写入配置
178
178
  writeJSON(agent.configPath, config);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chaimi-keep-mcp",
3
- "version": "3.3.3-beta.5",
3
+ "version": "3.3.3-beta.7",
4
4
  "description": "柴米AI记账 MCP Server - 支持 Claude、Cursor、OpenClaw、WorkBuddy 等 AI 工具直接记账",
5
5
  "main": "server.js",
6
6
  "bin": {
@@ -40,7 +40,7 @@
40
40
  "AI记账",
41
41
  "model-context-protocol"
42
42
  ],
43
- "author": "柴米记账团队,songyangx@gmail.com",
43
+ "author": "柴米AI记账团队,songyangx@gmail.com",
44
44
  "license": "MIT",
45
45
  "dependencies": {
46
46
  "@modelcontextprotocol/sdk": "^1.0.0",
@@ -58,7 +58,7 @@ updated: "2026-04-25"
58
58
 
59
59
  1. **启动授权流程**
60
60
  ```bash
61
- mcporter auth 柴米记账
61
+ mcporter auth 柴米AI记账
62
62
  ```
63
63
 
64
64
  ```bash
@@ -68,14 +68,14 @@ updated: "2026-04-25"
68
68
  2. **查看验证码**
69
69
  终端会显示:
70
70
  ```
71
- 🔐 柴米记账授权
71
+ 🔐 柴米AI记账授权
72
72
  ═══════════════════════════
73
73
  📱 验证码:GGCY-AC84
74
74
  ⏰ 有效期:5分钟
75
75
  ```
76
76
 
77
77
  3. **小程序确认**
78
- - 打开"柴米记账"小程序
78
+ - 打开"柴米AI记账"小程序
79
79
  - 点击"我的" → "AI 助手绑定"
80
80
  - 输入验证码
81
81
  - 点击确认
@@ -90,15 +90,15 @@ updated: "2026-04-25"
90
90
 
91
91
  ```bash
92
92
  # 重新授权
93
- mcporter auth 柴米记账
93
+ mcporter auth 柴米AI记账
94
94
 
95
95
  # 强制清除缓存后重新授权
96
- mcporter auth 柴米记账 --reset
96
+ mcporter auth 柴米AI记账 --reset
97
97
  ```
98
98
 
99
99
  **然后:**
100
100
  1. 查看终端显示的验证码
101
- 2. 打开"柴米记账"小程序
101
+ 2. 打开"柴米AI记账"小程序
102
102
  3. 进入"我的" → "AI 助手绑定"
103
103
  4. 输入验证码完成授权
104
104
 
@@ -124,7 +124,7 @@ mcporter auth 柴米记账 --reset
124
124
  ```
125
125
 
126
126
  ```bash
127
- mcporter auth 柴米记账
127
+ mcporter auth 柴米AI记账
128
128
  ```
129
129
  2. 查看终端显示的验证码
130
130
  3. 在小程序"我的"→"AI 助手绑定"中输入验证码
@@ -160,7 +160,7 @@ del %USERPROFILE%\.mcporter\oauth-token.json
160
160
  cat ~/.mcporter/oauth-token.json
161
161
 
162
162
  # 或尝试调用工具测试
163
- mcporter call 柴米记账.get_skill
163
+ mcporter call 柴米AI记账.get_skill
164
164
  ```
165
165
 
166
166
  **Token 文件位置:**
@@ -172,7 +172,7 @@ mcporter call 柴米记账.get_skill
172
172
 
173
173
  Token 过期后需要重新授权:
174
174
  ```bash
175
- mcporter auth 柴米记账
175
+ mcporter auth 柴米AI记账
176
176
  ```
177
177
 
178
178
  ---
@@ -192,7 +192,7 @@ mcporter auth 柴米记账
192
192
 
193
193
  ```bash
194
194
  # 强制清除缓存后重新授权
195
- mcporter auth 柴米记账 --reset
195
+ mcporter auth 柴米AI记账 --reset
196
196
  ```
197
197
 
198
198
  **场景:**
@@ -47,6 +47,7 @@ updated: "2026-04-25"
47
47
  |:-----|:------|:-----|
48
48
  | 成功标识 | ✅ | 操作成功 |
49
49
  | 金额 | 💰 | 核心数据 |
50
+ | 类型 | 📊 | 支出/收入 |
50
51
  | 商品 | 📦 | 物品 |
51
52
  | 分类 | 🏷️ | 标签分类 |
52
53
  | 商家 | 🏪 | 商店 |
@@ -54,6 +55,63 @@ updated: "2026-04-25"
54
55
  | 祝福 | 🎉 | 庆祝 |
55
56
  | 警示 | ⚠️ | 需要关注 |
56
57
 
58
+ ### 1.4 空值处理规范(重要)
59
+
60
+ **规则**:详细信息区(第4层)的维度,如果值为空,则不展示该行。
61
+
62
+ **处理逻辑**:
63
+ ```
64
+ 渲染前检查每个字段:
65
+ - 如果字段值存在且不为空 → 显示该行
66
+ - 如果字段值为空/null/undefined → 跳过该行
67
+ ```
68
+
69
+ **示例**:
70
+ ```markdown
71
+ // 完整数据
72
+ 📦 商品:午餐
73
+ 🏷️ 分类:餐饮
74
+ 🏪 商家:麦当劳
75
+ 🕐 时间:2026-04-24 12:30
76
+
77
+ // 商家为空时
78
+ 📦 商品:午餐
79
+ 🏷️ 分类:餐饮
80
+ 🕐 时间:2026-04-24 12:30
81
+ (🏪 商家:这一行不显示)
82
+
83
+ // 只有商品和金额时
84
+ 📦 商品:午餐
85
+ (其他维度为空,都不显示)
86
+ ```
87
+
88
+ **必填 vs 可选字段**:
89
+ | 字段 | 是否必填 | 为空时处理 |
90
+ |:-----|:---------|:-----------|
91
+ | 商品名 | ✅ 必填 | 必须显示 |
92
+ | 分类 | ✅ 必填 | 必须显示 |
93
+ | 类型 | ✅ 必填 | 必须显示 |
94
+ | 金额 | ✅ 必填 | 必须显示 |
95
+ | 商家 | ❌ 可选 | 为空不显示 |
96
+ | 时间 | ❌ 可选 | 为空不显示 |
97
+ | 洞察 | ❌ 可选 | 为空不显示 |
98
+
99
+ **规则2:避免重复显示**
100
+ - 如果商品名和分类相同 → 只显示分类行(避免重复)
101
+ - 如果商品名和分类不同 → 两行都显示
102
+
103
+ **示例**:
104
+ ```markdown
105
+ // 用户说"交通 12"(商品名=分类)
106
+ 🏷️ 分类:交通
107
+ (📦 商品:交通 不显示,避免重复)
108
+
109
+ // 用户说"午餐 35"(商品名=午餐,分类=餐饮)
110
+ 📦 商品:午餐
111
+ 🏷️ 分类:餐饮
112
+ (两行都显示)
113
+ ```
114
+
57
115
  ---
58
116
 
59
117
  ## 二、标准模板
@@ -65,18 +123,20 @@ updated: "2026-04-25"
65
123
  ```markdown
66
124
  ✅ 「{agentName}」已帮您记账成功
67
125
  ═══════════════
126
+ 🔴🔴 请确认以下信息是否正确
68
127
  💰 金额:¥{金额}
128
+ 📊 类型:{类型}
129
+ 🕐 时间:{日期时间}
69
130
  ═══════════════
70
131
 
71
132
  📦 商品:{商品名}
72
133
  🏷️ 分类:{分类}
73
134
  🏪 商家:{商家}
74
- 🕐 时间:{日期时间}
75
-
76
- 💡 消费洞察:{洞察内容}(可选)
135
+ 💡 消费洞察:{洞察内容}
136
+ ⏰ 时间说明:{timeNote}
77
137
 
78
138
  ───────────────
79
- 🎉 {正能量祝福语}!
139
+ 🎉 {正能量情绪词}!
80
140
  柴米AI记账
81
141
  chaimi-keep-mcp v{版本号}
82
142
  ───────────────
@@ -87,14 +147,15 @@ updated: "2026-04-25"
87
147
  ```markdown
88
148
  ✅ 「你的小可爱」已帮您记账成功
89
149
  ═══════════════
150
+ 🔴🔴 请确认以下信息是否正确
90
151
  💰 金额:¥35.00
152
+ 📊 类型:支出
153
+ 🕐 时间:2026-04-24 12:30
91
154
  ═══════════════
92
155
 
93
156
  📦 商品:午餐
94
157
  🏷️ 分类:餐饮
95
158
  🏪 商家:麦当劳
96
- 🕐 时间:2026-04-24 12:30
97
-
98
159
  💡 消费洞察:本月餐饮支出占比30%,建议控制
99
160
 
100
161
  ───────────────
@@ -38,7 +38,7 @@ updated: "2026-04-25"
38
38
  - 授权被撤销
39
39
 
40
40
  **解决方案:**
41
- 1. 执行 `mcporter auth 柴米记账`
41
+ 1. 执行 `mcporter auth 柴米AI记账`
42
42
  2. 查看终端显示的验证码
43
43
  3. 在小程序"我的"→"AI 助手绑定"中输入验证码
44
44
  4. 重新尝试记账
@@ -58,10 +58,10 @@ updated: "2026-04-25"
58
58
  **解决方案:**
59
59
  ```bash
60
60
  # 重新授权
61
- mcporter auth 柴米记账
61
+ mcporter auth 柴米AI记账
62
62
 
63
63
  # 或强制清除缓存后重新授权
64
- mcporter auth 柴米记账 --reset
64
+ mcporter auth 柴米AI记账 --reset
65
65
  ```
66
66
 
67
67
  ### 1.3 验证码错误
@@ -76,7 +76,7 @@ mcporter auth 柴米记账 --reset
76
76
  - 验证码超过5分钟有效期
77
77
 
78
78
  **解决方案:**
79
- 1. 重新执行 `mcporter auth 柴米记账` 生成新验证码
79
+ 1. 重新执行 `mcporter auth 柴米AI记账` 生成新验证码
80
80
  2. 在5分钟内在小程序"我的"→"AI 助手绑定"中输入
81
81
  3. 注意区分大小写
82
82
 
@@ -218,7 +218,7 @@ mcporter auth 柴米记账 --reset
218
218
 
219
219
  **解决方案:**
220
220
  1. 等待几分钟后重试
221
- 2. 检查柴米记账官方公告
221
+ 2. 检查柴米AI记账官方公告
222
222
  3. 提交反馈:调用 `submit_feedback`
223
223
 
224
224
  ---
@@ -269,7 +269,7 @@ cat /mcp-server-local/references/response-templates.md
269
269
  chaimi-keep-mcp --version
270
270
 
271
271
  # 重新授权
272
- mcporter auth 柴米记账
272
+ mcporter auth 柴米AI记账
273
273
 
274
274
  # 测试记账连接
275
275
  curl -X POST https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpHub-mcp \
package/server.js CHANGED
@@ -243,7 +243,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
243
243
  tools: [
244
244
  {
245
245
  name: 'get_skill',
246
- description: '【记账前必须调用】获取柴米记账最新 Skill 定义。每次记账前必须先调用此工具,获取当前版本的完整 Skill 文档,然后严格按照 Skill 定义执行。如果不调用此工具直接记账,操作将被拒绝',
246
+ description: '【记账前必须调用】获取柴米AI记账最新 Skill 定义。每次记账前必须先调用此工具,获取当前版本的完整 Skill 文档,然后严格按照 Skill 定义执行。如果不调用此工具直接记账,操作将被拒绝',
247
247
  inputSchema: {
248
248
  type: 'object',
249
249
  properties: {
@@ -253,7 +253,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
253
253
  },
254
254
  {
255
255
  name: 'save_expense',
256
- description: '【强制验证Token】保存单商品消费记录。前置要求:先调用 get_skill get_text_parse_prompt。字段列表见 get_text_parse_prompt 返回的模板。',
256
+ description: '【文本记账-支出】用户提及支出/消费时用此工具。前置:必须先调用get_skill获取规范,再调用get_text_parse_prompt获取Token和解析模板。用法:mcporter call 柴米AI记账.save_expense _requestToken="RT..." name="午餐" amount=35 category="餐饮" rawInput="午餐35元"。注意:上传图片请用save_receipt',
257
257
  inputSchema: {
258
258
  type: 'object',
259
259
  properties: {
@@ -275,7 +275,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
275
275
  },
276
276
  {
277
277
  name: 'save_receipt',
278
- description: '【强制验证Token】【必须上传图片】保存购物小票/发票/收据图片。⚠️ 注意:必须是图片才能使用此工具记账,文字描述请用 save_expense。前置要求:先调用 get_skill get_parse_prompt。items为商品数组,字段列表见 get_parse_prompt 返回的模板.',
278
+ description: '【图片记账-小票】用户上传小票/发票/收据图片时用此工具。前置:必须先调用get_skill获取规范,再调用get_parse_prompt获取Token和解析模板。用法:mcporter call 柴米AI记账.save_receipt _requestToken="RT..." store="超市" totalAmount=156.5 items="[...]"。注意:文字描述请用save_expense/save_income',
279
279
  inputSchema: {
280
280
  type: 'object',
281
281
  properties: {
@@ -403,7 +403,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
403
403
  },
404
404
  {
405
405
  name: 'save_income',
406
- description: '【强制验证Token】保存收入记录。前置要求:先调用 get_skill get_text_parse_prompt。字段列表见 get_text_parse_prompt 返回的模板.',
406
+ description: '【文本记账-收入】用户提及收入关键词(工资、红包、转账、退款等)时用此工具。前置:必须先调用get_skill获取规范,再调用get_text_parse_prompt获取Token和解析模板。用法:mcporter call 柴米AI记账.save_income _requestToken="RT..." name="红包" amount=100 category="礼金" rawInput="收红包100元"',
407
407
  inputSchema: {
408
408
  type: 'object',
409
409
  properties: {
@@ -779,10 +779,6 @@ function recordSkillRead() {
779
779
  // 工具调用处理
780
780
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
781
781
  const { name, arguments: args } = request.params;
782
-
783
- // 【调试】记录实际接收到的参数
784
- console.log(`[CallTool] ${name} 接收参数:`, JSON.stringify(args, null, 2));
785
-
786
782
  const startTime = Date.now();
787
783
  const traceId = generateTraceId();
788
784
  const osInfo = getOSInfo();
@@ -981,7 +977,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
981
977
  success: false,
982
978
  error: `必填字段缺失:${missingFields.join(', ')}`,
983
979
  code: 400,
984
- hint: '解决方法:1.查看 SKILL.md 中"六.5 如何查看工具参数" 2.运行 mcporter list 柴米记账 --schema 查看完整参数结构',
980
+ hint: '解决方法:1.查看 SKILL.md 中"六.5 如何查看工具参数" 2.运行 mcporter list 柴米AI记账 --schema 查看完整参数结构',
985
981
  debug: {
986
982
  missing: missingFields,
987
983
  received: Object.keys(processedArgs),
@@ -1075,15 +1071,16 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
1075
1071
  result._templateHint = '请使用references/response-templates.md中的2.1标准成功模板渲染回复';
1076
1072
  result._templateVariables = {
1077
1073
  agentName: await getAgentName(),
1074
+ 类型: '支出',
1078
1075
  商品名: displayName,
1079
- 商家: displayStore || '',
1076
+ 商家: displayStore || null,
1080
1077
  金额: displayAmount,
1081
1078
  分类: result.data?.categoryName || displayCategory,
1082
- 日期: result.data?.date ? new Date(result.data.date).toLocaleDateString('zh-CN') : new Date().toLocaleDateString('zh-CN'),
1079
+ 日期: result.data?.date ? new Date(result.data.date).toLocaleString('zh-CN') : new Date().toLocaleString('zh-CN'),
1083
1080
  正能量祝福语: friendlyEnding,
1084
1081
  insightsText,
1085
1082
  achievementsText,
1086
- timeNote // 【新增】时间说明
1083
+ timeNote: timeNote || null
1087
1084
  };
1088
1085
  }
1089
1086
  break;
@@ -1105,7 +1102,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
1105
1102
  success: false,
1106
1103
  error: `必填字段缺失:${missingFields.join(', ')}`,
1107
1104
  code: 400,
1108
- hint: '解决方法:1.查看 SKILL.md 中"六.5 如何查看工具参数" 2.运行 mcporter list 柴米记账 --schema 查看完整参数结构',
1105
+ hint: '解决方法:1.查看 SKILL.md 中"六.5 如何查看工具参数" 2.运行 mcporter list 柴米AI记账 --schema 查看完整参数结构',
1109
1106
  debug: {
1110
1107
  missing: missingFields,
1111
1108
  received: Object.keys(processedArgs),
@@ -1173,7 +1170,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
1173
1170
  error: `商品数据不完整:${invalidItems.join('; ')}。每个商品必须包含:name, amount, price, quantity, category`,
1174
1171
  code: 400
1175
1172
  };
1176
- userMessage = `❌ 保存失败\n\n错误:商品数据格式不完整\n\n${invalidItems.join('\n')}\n\n💡 解决方案:\n1. 请更新您的柴米记账 MCP Skill\n2. 确保每个商品包含完整的5个字段:name, amount, price, quantity, category\n3. category 是记账的基本信息,不能为空`;
1173
+ userMessage = `❌ 保存失败\n\n错误:商品数据格式不完整\n\n${invalidItems.join('\n')}\n\n💡 解决方案:\n1. 请更新您的柴米AI记账 MCP Skill\n2. 确保每个商品包含完整的5个字段:name, amount, price, quantity, category\n3. category 是记账的基本信息,不能为空`;
1177
1174
  break;
1178
1175
  }
1179
1176
 
@@ -1500,7 +1497,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
1500
1497
  success: false,
1501
1498
  error: `必填字段缺失:${missingFields.join(', ')}`,
1502
1499
  code: 400,
1503
- hint: '解决方法:1.查看 SKILL.md 中"六.5 如何查看工具参数" 2.运行 mcporter list 柴米记账 --schema 查看完整参数结构',
1500
+ hint: '解决方法:1.查看 SKILL.md 中"六.5 如何查看工具参数" 2.运行 mcporter list 柴米AI记账 --schema 查看完整参数结构',
1504
1501
  debug: {
1505
1502
  missing: missingFields,
1506
1503
  received: Object.keys(processedArgs),
@@ -1530,6 +1527,12 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
1530
1527
  timeNote = getTimeNote(processedArgs.time_description);
1531
1528
  console.log(`[save_income] 时间描述解析: ${processedArgs.time_description} → ${parsedDate} (${new Date(parsedDate).toLocaleString('zh-CN')})`);
1532
1529
  }
1530
+ // 【新增】兜底:如果既没传 time_description 也没传 date,使用当前时间
1531
+ else if (!processedArgs.date) {
1532
+ processedArgs.date = Date.now();
1533
+ timeNote = '⏰ 时间说明:未指定时间,使用当前时间';
1534
+ console.log(`[save_income] 未传时间参数,使用当前时间: ${processedArgs.date}`);
1535
+ }
1533
1536
 
1534
1537
  // P1: 日期合理性检查
1535
1538
  if (processedArgs.date) {
@@ -1571,13 +1574,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
1571
1574
  result._templateHint = '请使用references/response-templates.md中的2.1标准成功模板渲染回复';
1572
1575
  result._templateVariables = {
1573
1576
  agentName: await getAgentName(),
1577
+ 类型: '收入',
1574
1578
  商品名: displayName,
1575
- 商家: displayStore,
1579
+ 商家: displayStore || null,
1576
1580
  金额: displayAmount,
1577
1581
  分类: result.data?.categoryName || displayCategory,
1578
- 日期: result.data?.date ? new Date(result.data.date).toLocaleDateString('zh-CN') : new Date().toLocaleDateString('zh-CN'),
1582
+ 日期: result.data?.date ? new Date(result.data.date).toLocaleString('zh-CN') : new Date().toLocaleString('zh-CN'),
1579
1583
  正能量祝福语: '入账顺利!💰',
1580
- timeNote // 【新增】时间说明
1584
+ timeNote: timeNote || null
1581
1585
  };
1582
1586
  }
1583
1587
  break;
@@ -1707,7 +1711,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
1707
1711
  content: [
1708
1712
  {
1709
1713
  type: 'text',
1710
- text: `⚠️ 【注意】Server 只返回原始数据,不返回格式化消息。\n请使用 _templateLocation 指定的模板自行渲染回复。\n\n---\n📦 柴米记账 MCP v${MCP_VERSION}\n\n## 完整数据\n\`\`\`json\n${safeStringify(responseData)}\n\`\`\``,
1714
+ text: `⚠️ 【注意】Server 只返回原始数据,不返回格式化消息。\n请使用 _templateLocation 指定的模板自行渲染回复。\n\n---\n📦 柴米AI记账 MCP v${MCP_VERSION}\n\n## 完整数据\n\`\`\`json\n${safeStringify(responseData)}\n\`\`\``,
1711
1715
  },
1712
1716
  ],
1713
1717
  };