chaimi-keep-mcp 3.3.0-beta.8 → 3.3.2-beta.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 +12 -0
- package/SKILL.md +59 -44
- package/oauth.js +4 -2
- package/package.json +1 -1
- package/server.js +6 -6
package/README.md
CHANGED
|
@@ -89,6 +89,12 @@ export MCP_PROMPT_URL="你的Prompt服务地址"
|
|
|
89
89
|
|
|
90
90
|
## Changelog
|
|
91
91
|
|
|
92
|
+
### v3.3.2-beta.0 (2026-04-26)
|
|
93
|
+
- **修复** agent-name.json 和 device-code.json 文件写入 0 字节问题
|
|
94
|
+
- 将异步 `fs.writeFile()` 改为同步 `fs.writeFileSync()`
|
|
95
|
+
- 根本原因:授权成功后从 `process.exit(0)` 改为 `return`,导致异步写入未完成
|
|
96
|
+
- 使用同步写入确保文件立即写入完成
|
|
97
|
+
|
|
92
98
|
### v3.1.47-beta.5 (2026-04-22)
|
|
93
99
|
- **修复** 输入长度限制 - 添加硬性长度检查,防止超大字符串攻击
|
|
94
100
|
- **修复** 错误信息泄露 - 生产环境只显示友好提示,不暴露内部错误
|
|
@@ -148,6 +154,12 @@ AI 会自动调用 `save_income` 工具记录收入。
|
|
|
148
154
|
|
|
149
155
|
## 更新日志
|
|
150
156
|
|
|
157
|
+
### v3.3.2-beta.0 (2026-04-26)
|
|
158
|
+
- **修复** agent-name.json 和 device-code.json 文件写入 0 字节问题
|
|
159
|
+
- 将异步 `fs.writeFile()` 改为同步 `fs.writeFileSync()`
|
|
160
|
+
- 根本原因:授权成功后从 `process.exit(0)` 改为 `return`,导致异步写入未完成
|
|
161
|
+
- 使用同步写入确保文件立即写入完成
|
|
162
|
+
|
|
151
163
|
### v3.1.49-beta.2 (2026-04-24)
|
|
152
164
|
- **新增** period 参数支持
|
|
153
165
|
- getStatistics: 支持 this_week/last_week/this_month/last_month 周期筛选
|
package/SKILL.md
CHANGED
|
@@ -83,61 +83,83 @@ chaimi-keep-mcp ⭐ 本Skill
|
|
|
83
83
|
|
|
84
84
|
根据用户意图,快速匹配工具和参考文档:
|
|
85
85
|
|
|
86
|
-
| 用户意图 | 关键词示例 | 推荐工具 | 参考文档 | 回复模板 |
|
|
87
|
-
|
|
88
|
-
| **文字记账** | "午餐35元" | save_expense | - | 标准成功模板 |
|
|
89
|
-
| **收入记账** | "工资5000" | save_income | - | 标准成功模板 |
|
|
90
|
-
| **小票记账** | "小票识别" | save_receipt | - | 高金额模板 |
|
|
91
|
-
| **查询记录** | "这周花了多少" | get_expenses | api-reference.md | 查询结果模板 |
|
|
92
|
-
| **消费统计** | "月度统计" | get_statistics | api-reference.md | 统计分析模板 |
|
|
93
|
-
| **智能洞察** | "分析消费习惯" | get_insights | advanced-features.md | 洞察分析模板 |
|
|
94
|
-
| **深度分析** | "详细分析" | export_data | advanced-features.md | 分析模板 |
|
|
95
|
-
| **授权问题** | "无法记账" | - | troubleshooting.md | 错误提示模板 |
|
|
96
|
-
| **回复格式** | "回复格式" | - | response-templates.md | - |
|
|
86
|
+
| 用户意图 | 关键词示例 | 前置步骤 | 推荐工具 | 参考文档 | 回复模板 |
|
|
87
|
+
|---------|-----------|---------|---------|---------|---------|
|
|
88
|
+
| **文字记账** | "午餐35元" | get_text_parse_prompt → AI解析 | save_expense | - | 标准成功模板 |
|
|
89
|
+
| **收入记账** | "工资5000" | get_text_parse_prompt → AI解析 | save_income | - | 标准成功模板 |
|
|
90
|
+
| **小票记账** | "小票识别" | **get_parse_prompt → AI解析** ⭐ | save_receipt | - | 高金额模板 |
|
|
91
|
+
| **查询记录** | "这周花了多少" | - | get_expenses | api-reference.md | 查询结果模板 |
|
|
92
|
+
| **消费统计** | "月度统计" | - | get_statistics | api-reference.md | 统计分析模板 |
|
|
93
|
+
| **智能洞察** | "分析消费习惯" | - | get_insights | advanced-features.md | 洞察分析模板 |
|
|
94
|
+
| **深度分析** | "详细分析" | - | export_data | advanced-features.md | 分析模板 |
|
|
95
|
+
| **授权问题** | "无法记账" | - | - | troubleshooting.md | 错误提示模板 |
|
|
96
|
+
| **回复格式** | "回复格式" | - | - | response-templates.md | - |
|
|
97
97
|
|
|
98
98
|
---
|
|
99
99
|
|
|
100
100
|
## 五、工具速查表
|
|
101
101
|
|
|
102
102
|
**设计原则:** Agent一眼看到所有工具,按功能分类
|
|
103
|
-
-
|
|
103
|
+
- **记账工具**:⚠️ 小票记账必须先调用 `get_parse_prompt`,不可跳过!
|
|
104
104
|
- **查询分析工具**:详细参数见 api-reference.md
|
|
105
105
|
|
|
106
|
-
| 分类 | 工具名 | 功能一句话 | 典型场景 |
|
|
107
|
-
|
|
108
|
-
| **记账** | save_expense | 支出记账 | "午餐35元" |
|
|
109
|
-
| | save_income | 收入记账 | "工资5000" |
|
|
110
|
-
| | save_receipt | 小票图片记账 | 上传小票照片 |
|
|
111
|
-
| **查询** | get_expenses | 查询消费记录 | "这周花了多少" |
|
|
112
|
-
| | get_statistics | 消费统计分析 | "月度统计" |
|
|
113
|
-
| | get_receipt_list | 查询小票列表 | "查看小票记录" |
|
|
114
|
-
| **分析** | get_insights | AI消费洞察 | "分析消费习惯" |
|
|
115
|
-
| | export_data | 导出完整数据 | 深度分析 |
|
|
116
|
-
| **辅助** | get_skill | 【必须】获取Skill文档 | 记账前调用 |
|
|
117
|
-
| | get_text_parse_prompt | 获取文字解析模板 |
|
|
118
|
-
| | get_parse_prompt |
|
|
119
|
-
| | submit_feedback | 提交反馈 | 问题反馈 |
|
|
106
|
+
| 分类 | 工具名 | 前置要求 | 功能一句话 | 典型场景 |
|
|
107
|
+
|:-----|:-------|:---------|:-----------|:---------|
|
|
108
|
+
| **记账** | save_expense | 先 get_text_parse_prompt | 支出记账 | "午餐35元" |
|
|
109
|
+
| | save_income | 先 get_text_parse_prompt | 收入记账 | "工资5000" |
|
|
110
|
+
| | save_receipt | **先 get_parse_prompt** ⭐ | 小票图片记账 | 上传小票照片 |
|
|
111
|
+
| **查询** | get_expenses | - | 查询消费记录 | "这周花了多少" |
|
|
112
|
+
| | get_statistics | - | 消费统计分析 | "月度统计" |
|
|
113
|
+
| | get_receipt_list | - | 查询小票列表 | "查看小票记录" |
|
|
114
|
+
| **分析** | get_insights | - | AI消费洞察 | "分析消费习惯" |
|
|
115
|
+
| | export_data | - | 导出完整数据 | 深度分析 |
|
|
116
|
+
| **辅助** | get_skill | - | 【必须】获取Skill文档 | 记账前调用 |
|
|
117
|
+
| | get_text_parse_prompt | - | 获取文字解析模板 | 文字记账前置 |
|
|
118
|
+
| | get_parse_prompt | - | **获取小票解析模板** | 小票记账前置 ⭐ |
|
|
119
|
+
| | submit_feedback | - | 提交反馈 | 问题反馈 |
|
|
120
|
+
|
|
121
|
+
**⚠️ 重要**:save_receipt 必须前置调用 get_parse_prompt,否则会导致 weight 和 marketPrice 计算错误!
|
|
120
122
|
|
|
121
123
|
---
|
|
122
124
|
|
|
123
125
|
## 六、快速开始
|
|
124
126
|
|
|
125
|
-
###
|
|
127
|
+
### 记账流程(按类型区分)
|
|
128
|
+
|
|
129
|
+
#### A. 文字记账
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
第1步:获取文字解析模板
|
|
133
|
+
↓ 调用 get_text_parse_prompt 获取Prompt
|
|
134
|
+
第2步:AI解析文字
|
|
135
|
+
↓ 使用Prompt + 用户输入调用AI
|
|
136
|
+
第3步:保存数据
|
|
137
|
+
↓ 调用 save_expense 或 save_income
|
|
138
|
+
↓ 返回美学回复
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
#### B. 小票图片记账(复杂)
|
|
126
142
|
|
|
127
143
|
```
|
|
128
|
-
第1
|
|
129
|
-
↓
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
第
|
|
133
|
-
↓
|
|
144
|
+
第1步:获取小票解析模板 ⭐关键
|
|
145
|
+
↓ 调用 get_parse_prompt(type: 'parseReceipt')
|
|
146
|
+
↓ 获取Prompt模板和字段规范
|
|
147
|
+
|
|
148
|
+
第2步:AI解析图片 ⭐关键
|
|
149
|
+
↓ 使用Prompt模板 + 小票图片调用AI
|
|
150
|
+
↓ 获取解析后的商品列表(items)
|
|
151
|
+
|
|
152
|
+
第3步:保存数据
|
|
153
|
+
↓ 调用 save_receipt(items: 步骤2的结果)
|
|
134
154
|
↓ 返回美学回复
|
|
135
155
|
```
|
|
136
156
|
|
|
157
|
+
**重要提示**:小票记账必须执行第1、2步!跳过会导致数据格式错误!
|
|
158
|
+
|
|
137
159
|
### 首次使用必做
|
|
138
160
|
|
|
139
|
-
1.
|
|
140
|
-
2.
|
|
161
|
+
1. **安装 MCP Server** → 参考 README.md 安装指引
|
|
162
|
+
2. **完成授权** → 首次使用时会自动显示授权码,在"柴米AI记账"小程序中输入即可完成授权
|
|
141
163
|
3. **开始记账** → "午餐35元"
|
|
142
164
|
|
|
143
165
|
---
|
|
@@ -186,14 +208,7 @@ chaimi-keep-mcp ⭐ 本Skill
|
|
|
186
208
|
───────────────
|
|
187
209
|
```
|
|
188
210
|
|
|
189
|
-
### 7.3
|
|
190
|
-
|
|
191
|
-
```markdown
|
|
192
|
-
✅ 已记录:{商品名} ¥{金额} · {分类}
|
|
193
|
-
{正能量祝福语}
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### 7.4 高金额模板(>1000元)
|
|
211
|
+
### 7.3 高金额模板(>1000元)
|
|
197
212
|
|
|
198
213
|
```markdown
|
|
199
214
|
⚠️ 大额消费确认
|
|
@@ -213,7 +228,7 @@ chaimi-keep-mcp ⭐ 本Skill
|
|
|
213
228
|
───────────────
|
|
214
229
|
```
|
|
215
230
|
|
|
216
|
-
### 7.
|
|
231
|
+
### 7.4 变量说明
|
|
217
232
|
|
|
218
233
|
| 变量 | 说明 | 示例 |
|
|
219
234
|
|:-----|:-----|:-----|
|
package/oauth.js
CHANGED
|
@@ -497,7 +497,8 @@ class FileTokenStorage extends TokenStorage {
|
|
|
497
497
|
agentName: agentName || '柴米AI助手',
|
|
498
498
|
updatedAt: new Date().toISOString()
|
|
499
499
|
};
|
|
500
|
-
|
|
500
|
+
// 使用同步写入,确保立即完成(避免进程继续运行时文件未写入完成)
|
|
501
|
+
require('fs').writeFileSync(agentNamePath, JSON.stringify(data, null, 2), { mode: 0o600 });
|
|
501
502
|
console.error('✅ Agent 名称已保存:', agentNamePath);
|
|
502
503
|
} catch (err) {
|
|
503
504
|
console.error('❌ 保存 Agent 名称失败:', err.message);
|
|
@@ -524,7 +525,8 @@ class FileTokenStorage extends TokenStorage {
|
|
|
524
525
|
deviceCode,
|
|
525
526
|
updatedAt: new Date().toISOString()
|
|
526
527
|
};
|
|
527
|
-
|
|
528
|
+
// 使用同步写入,确保立即完成(避免进程继续运行时文件未写入完成)
|
|
529
|
+
require('fs').writeFileSync(deviceCodePath, JSON.stringify(data, null, 2), { mode: 0o600 });
|
|
528
530
|
} catch (err) {
|
|
529
531
|
// 忽略错误
|
|
530
532
|
}
|
package/package.json
CHANGED
package/server.js
CHANGED
|
@@ -998,10 +998,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
998
998
|
// 【新增】获取 Agent 名称
|
|
999
999
|
const agentName = await getAgentName();
|
|
1000
1000
|
|
|
1001
|
-
// 按 SKILL
|
|
1001
|
+
// 按 SKILL 规范格式:华丽版回复模板
|
|
1002
1002
|
const displayStoreText = displayStore ? `【${displayStore}】` : '';
|
|
1003
1003
|
const dateStr = result.data?.date ? new Date(result.data.date).toLocaleDateString('zh-CN') : new Date().toLocaleDateString('zh-CN');
|
|
1004
|
-
userMessage =
|
|
1004
|
+
userMessage = `═══════════════════════════════════════\n✅ 「${agentName}」已帮您录入「柴米AI记账」\n═══════════════════════════════════════\n📦 商品/店名:${displayName}${displayStoreText}\n💰 金额:¥${displayAmount}\n📊 收支类型:支出\n🏷️ 分类:${result.data?.categoryName || displayCategory}\n📅 时间:${dateStr}\n═══════════════════════════════════════\n✅ ${friendlyEnding}${insightsText}${achievementsText}\n═══════════════════════════════════════\nchaimi-keep-mcp: v${MCP_VERSION}`;
|
|
1005
1005
|
|
|
1006
1006
|
if (!processedArgs.agentType || !processedArgs.apiProvider) {
|
|
1007
1007
|
userMessage += '\n\n💡 提示:传递agentType和apiProvider参数可解锁小程序记录来源统计功能,示例:agentType="openclaw", apiProvider="doubao"';
|
|
@@ -1243,9 +1243,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1243
1243
|
// 【新增】获取 Agent 名称
|
|
1244
1244
|
const agentName = await getAgentName();
|
|
1245
1245
|
|
|
1246
|
-
// 按 SKILL
|
|
1246
|
+
// 按 SKILL 规范格式:华丽版回复模板
|
|
1247
1247
|
const dateStr = result.data?.date ? new Date(result.data.date).toLocaleDateString('zh-CN') : new Date().toLocaleDateString('zh-CN');
|
|
1248
|
-
userMessage =
|
|
1248
|
+
userMessage = `═══════════════════════════════════════\n✅ 「${agentName}」已帮您录入「柴米AI记账」\n═══════════════════════════════════════\n🏪 商家:${storeName}\n💰 金额:¥${totalAmount}\n📊 收支类型:支出\n🏷️ 分类:${result.data?.storeCategory || category}\n📦 商品数量:${itemCount}件\n📅 时间:${dateStr}\n═══════════════════════════════════════\n✅ ${friendlyEnding}${insightsText}${achievementsText}\n═══════════════════════════════════════\nchaimi-keep-mcp: v${MCP_VERSION}`;
|
|
1249
1249
|
|
|
1250
1250
|
if (!processedArgs.agentType || !processedArgs.apiProvider) {
|
|
1251
1251
|
userMessage += '\n\n💡 提示:传递agentType和apiProvider参数可解锁小程序记录来源统计功能,示例:agentType="openclaw", apiProvider="doubao"';
|
|
@@ -1473,9 +1473,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1473
1473
|
// 【新增】获取 Agent 名称
|
|
1474
1474
|
const agentName = await getAgentName();
|
|
1475
1475
|
|
|
1476
|
-
// 按 SKILL
|
|
1476
|
+
// 按 SKILL 规范格式:华丽版回复模板
|
|
1477
1477
|
const dateStr = result.data?.date ? new Date(result.data.date).toLocaleDateString('zh-CN') : new Date().toLocaleDateString('zh-CN');
|
|
1478
|
-
userMessage =
|
|
1478
|
+
userMessage = `═══════════════════════════════════════\n✅ 「${agentName}」已帮您录入「柴米AI记账」\n═══════════════════════════════════════\n💰 金额:¥${displayAmount}\n📊 收支类型:收入\n📦 来源:${displayName}${displayStoreText}\n🏷️ 分类:${result.data?.categoryName || displayCategory}\n📅 时间:${dateStr}\n═══════════════════════════════════════\n✅ 入账顺利!💰\n═══════════════════════════════════════\nchaimi-keep-mcp: v${MCP_VERSION}`;
|
|
1479
1479
|
}
|
|
1480
1480
|
break;
|
|
1481
1481
|
}
|