chaimi-keep-mcp 3.1.24 → 3.1.26

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 (4) hide show
  1. package/SKILL.md +223 -0
  2. package/package.json +10 -1
  3. package/server.js +3 -3
  4. package/install.sh +0 -268
package/SKILL.md ADDED
@@ -0,0 +1,223 @@
1
+ ---
2
+ name: chaimi-bookkeeping
3
+ description: >-
4
+ 柴米记账 — 微信小程序记账工具,支持 AI Agent 直接记账。
5
+ TRIGGER: 用户提及"记账/记录/保存"并涉及金额或商品信息。
6
+ DO NOT TRIGGER: 非记账操作,或明确使用其他记账工具时。
7
+ allowed-tools: MCP
8
+ argument-hint: "[记账内容]"
9
+ ---
10
+
11
+ # 柴米记账 Skill
12
+
13
+ 柴米记账 MCP Server,连接微信小程序记账功能。
14
+
15
+ ---
16
+
17
+ ## 触发规则
18
+
19
+ ### 必须同时满足
20
+
21
+ 1. 用户明确提及以下关键词之一:
22
+ - "记账"、"记一笔"、"记录"
23
+ - "保存"(结合上下文判断为记账场景)
24
+
25
+ 2. 包含以下信息之一:
26
+ - 金额数字(如:35、100.5)
27
+ - 商品/服务名称(如:午餐、咖啡、打车)
28
+ - 小票/发票信息
29
+
30
+ ### 禁止触发
31
+
32
+ - 明确使用其他记账工具时(如:"用支付宝记账")
33
+ - 金额信息不明确且无法推断(如:"记点东西")
34
+
35
+ ### 上下文延续
36
+
37
+ 当前对话已在进行记账操作时,后续消息无需再次提及"记账"即可触发。
38
+
39
+ ---
40
+
41
+ ## 安全约束(最高优先级)
42
+
43
+ ### 1. 禁止直接访问
44
+
45
+ - **禁止**直接使用 curl/http 访问云函数端点
46
+ - **禁止**暴露 `MCP_HUB_URL`、`MCP_OAUTH_URL`、`MCP_PROMPT_URL` 给 Agent
47
+ - 所有请求**必须**通过 MCP Server 中转
48
+
49
+ ### 2. Token 保护
50
+
51
+ - **禁止**读取或输出 `~/.mcporter/oauth-token.json` 内容
52
+ - Token 仅用于内部 HTTP 请求,不向用户展示
53
+ - **禁止**将 Token 作为参数传递给其他命令
54
+
55
+ ### 3. 配置保护
56
+
57
+ - **禁止**主动设置 `MCP_OAUTH_URL`、`MCP_HUB_URL`、`MCP_PROMPT_URL` 环境变量
58
+ - URL 由 MCP Server 内部管理,对用户不可见
59
+
60
+ ### 4. 金额确认
61
+
62
+ - 单笔金额 **> 1000 元** 时必须用户确认
63
+ - 批量记账(**> 10 笔**)时必须用户确认
64
+ - 涉及退款、负数金额时必须用户确认
65
+
66
+ ### 5. 认证流程
67
+
68
+ - **必须**使用内置授权流程完成 Device Flow 授权
69
+ - **禁止**直接调用 `chaimi-keep-mcp` 的授权子命令
70
+ - **禁止**绕过授权流程直接操作
71
+
72
+ ---
73
+
74
+ ## 前置检查
75
+
76
+ 每次触发时按顺序执行:
77
+
78
+ ### 1. 安装检查
79
+
80
+ 检查 MCP Server 是否已安装:
81
+ ```bash
82
+ command -v chaimi-keep-mcp
83
+ ```
84
+
85
+ **未安装**:引导用户执行安装
86
+ ```bash
87
+ npm install -g chaimi-keep-mcp
88
+ ```
89
+
90
+ ### 2. 授权检查
91
+
92
+ 检查是否已完成授权:
93
+ ```bash
94
+ test -f ~/.mcporter/oauth-token.json
95
+ ```
96
+
97
+ **未授权**:引导完成 Device Flow 授权流程
98
+
99
+ ### 3. Token 有效性检查
100
+
101
+ 检查 Token 文件是否存在且未过期。
102
+
103
+ **Token 无效特征**:
104
+ - 文件不存在
105
+ - 已过期(超过30天)
106
+ - 调用云函数返回 401/403 错误
107
+
108
+ **无效**:引导重新授权
109
+
110
+ ---
111
+
112
+ ## 工具调用
113
+
114
+ ### 获取工具列表
115
+
116
+ Agent 通过 MCP 协议自动获取工具列表,无需手动查询。
117
+
118
+ ### 小票记账特殊要求
119
+
120
+ ⚠️ **强制流程**:保存小票时必须按以下顺序执行:
121
+ 1. 调用 `get_parse_prompt` 获取 prompt 模板
122
+ 2. 使用 prompt 模板调用大模型解析小票图片
123
+ 3. 调用 `save_receipt` 保存解析结果
124
+
125
+ **注意**:MCP 工具会不断迭代更新,请以实际通过 MCP 协议获取的工具定义为准。
126
+
127
+ ---
128
+
129
+ ## 确认规则
130
+
131
+ | 风险等级 | 场景 | 策略 |
132
+ |----------|------|------|
133
+ | **高(必须确认)** | 金额 > 1000元、批量 > 10笔、退款/负数 | 列出详情,等待用户确认 |
134
+ | **中(信息模糊时确认)** | 分类不明确、商家名称模糊 | 确认后执行 |
135
+ | **低(直接执行)** | 信息完整明确 | 直接执行 |
136
+
137
+ ---
138
+
139
+ ## 回复规范(必须严格遵守)
140
+
141
+ 记账成功后,回复内容必须包含以下格式:
142
+
143
+ ```
144
+ ✅ 【商品名/店名】¥【金额】 已录入柴米AI记账。
145
+
146
+ [自定义其他内容]
147
+
148
+ MCP Server: v【版本号】
149
+ 【友好正能量结束语】
150
+ ```
151
+
152
+ ### 友好结束语参考
153
+
154
+ | 分类 | 结束语 |
155
+ |------|--------|
156
+ | 餐饮类 | 用餐愉快!🍚 / 下午茶快乐!🧋 / 好好吃饭哦~ |
157
+ | 交通类 | 出行顺利!🚗 |
158
+ | 购物类 | 买得开心!🛍️ |
159
+ | 收入类 | 入账顺利!💰 |
160
+ | 通用 | 记账完成!继续保持~ / 理财小能手!✨ |
161
+
162
+ ### 示例
163
+
164
+ **用户:** 记一笔午餐 35元
165
+
166
+ **Agent 回复:**
167
+ ```
168
+ ✅ 午餐¥35 已录入柴米记账。
169
+
170
+ 今天也要好好吃饭哦~
171
+
172
+ MCP Server: v3.1.23
173
+ ```
174
+
175
+ ---
176
+
177
+ ## 使用示例
178
+
179
+ ### 示例1:简单记账
180
+
181
+ **用户:** 记一笔午餐 35元
182
+
183
+ **Agent:**
184
+ 1. 触发 Skill
185
+ 2. 前置检查通过
186
+ 3. 调用 `save_expense(name="午餐", amount=35, category="餐饮")`
187
+ 4. 返回结果:✅ 已记录:午餐 35元
188
+
189
+ ### 示例2:小票记账
190
+
191
+ **用户:** 保存小票,沃尔玛,买了苹果5元、香蕉3元
192
+
193
+ **Agent:**
194
+ 1. 触发 Skill
195
+ 2. 前置检查通过
196
+ 3. 调用 `save_receipt(store="沃尔玛", items=[...], totalAmount=8)`
197
+ 4. 返回结果:✅ 已保存小票:沃尔玛,共8元
198
+
199
+ ### 示例3:首次使用(未授权)
200
+
201
+ **用户:** 记一笔咖啡 25元
202
+
203
+ **Agent:**
204
+ 1. 触发 Skill
205
+ 2. 前置检查发现未授权
206
+ 3. 引导用户完成 Device Flow 授权
207
+ 4. 授权完成后执行记账
208
+
209
+ ---
210
+
211
+ ## 错误处理
212
+
213
+ | 错误类型 | 处理方式 |
214
+ |----------|----------|
215
+ | 未安装 | 引导安装:`npm install -g chaimi-keep-mcp` |
216
+ | 未授权 | 引导完成 Device Flow 授权 |
217
+ | Token 过期 | 引导重新授权 |
218
+ | 网络错误 | 提示用户检查网络,稍后重试 |
219
+ | 参数错误 | 提示用户补充必要信息 |
220
+
221
+ ---
222
+
223
+ *最后更新:2026-04-14*
package/package.json CHANGED
@@ -1,11 +1,20 @@
1
1
  {
2
2
  "name": "chaimi-keep-mcp",
3
- "version": "3.1.24",
3
+ "version": "3.1.26",
4
4
  "description": "柴米记账 MCP Server - 支持 Claude、Cursor、OpenClaw、WorkBuddy 等 AI 工具直接记账",
5
5
  "main": "server.js",
6
6
  "bin": {
7
7
  "chaimi-keep-mcp": "bin/cli.js"
8
8
  },
9
+ "files": [
10
+ "bin/",
11
+ "server.js",
12
+ "oauth.js",
13
+ "SKILL.md",
14
+ "README.md",
15
+ "config.example.yaml",
16
+ ".env.example"
17
+ ],
9
18
  "type": "commonjs",
10
19
  "scripts": {
11
20
  "start": "node server.js",
package/server.js CHANGED
@@ -143,7 +143,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
143
143
  },
144
144
  {
145
145
  name: 'save_receipt',
146
- description: '【v3.1.21】【图片小票专用】保存购物小票/发票/收据。⚠️ 重要:items数组中每个商品必须包含完整的4个字段:name(商品名称)、amount(金额=单价×数量)、price(单价)、quantity(数量)。示例:[{"name":"苹果","amount":5.5,"price":5.5,"quantity":1}]',
146
+ description: '【图片小票专用】保存购物小票/发票/收据。⚠️ 重要:items数组中每个商品必须包含完整的4个字段:name(商品名称)、amount(金额=单价×数量)、price(单价)、quantity(数量)。示例:[{"name":"苹果","amount":5.5,"price":5.5,"quantity":1}]',
147
147
  inputSchema: {
148
148
  type: 'object',
149
149
  properties: {
@@ -156,8 +156,8 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
156
156
  paymentMethod: { type: 'string', description: '支付方式,如:微信支付、支付宝' },
157
157
  receiptNo: { type: 'string', description: '小票编号' },
158
158
  items: {
159
- type: 'array',
160
- description: '【必填】商品列表,必须是数组格式。每个商品必须包含:name、amount、price、quantity。⚠️ 注意:amount=price×quantity',
159
+ type: ['array', 'string'],
160
+ description: '【必填】商品列表,支持数组或JSON字符串格式(某些Agent如Claude Code可能传递JSON字符串)。每个商品必须包含:name、amount、price、quantity。⚠️ 注意:amount=price×quantity。示例数组:[{"name":"苹果","amount":5.5,"price":5.5,"quantity":1}]',
161
161
  items: {
162
162
  type: 'object',
163
163
  properties: {
package/install.sh DELETED
@@ -1,268 +0,0 @@
1
- #!/bin/bash
2
-
3
- # 柴米记账 MCP Server 一键安装脚本
4
- # 支持 macOS 和 Linux
5
- # 用法: curl -fsSL https://chaihuo.io/install.sh | bash
6
-
7
- set -e
8
-
9
- # 颜色定义
10
- RED='\033[0;31m'
11
- GREEN='\033[0;32m'
12
- YELLOW='\033[1;33m'
13
- NC='\033[0m' # No Color
14
-
15
- # 配置
16
- INSTALL_DIR="$HOME/.chaihuo-mcp"
17
- WORKBUDDY_DIR="$HOME/WorkBuddy"
18
- PYTHON_VERSION="3.10"
19
- SCF_URL="https://1412172089-4wbwsop8pe.ap-shanghai.tencentscf.com"
20
-
21
- echo -e "${GREEN}=== 柴米记账 MCP Server 安装脚本 ===${NC}"
22
- echo ""
23
-
24
- # 检测操作系统
25
- OS="$(uname -s)"
26
- case "${OS}" in
27
- Linux*) PLATFORM=Linux;;
28
- Darwin*) PLATFORM=Mac;;
29
- *) PLATFORM="UNKNOWN:${OS}"
30
- esac
31
-
32
- echo -e "${YELLOW}检测到操作系统: ${PLATFORM}${NC}"
33
-
34
- # 检查并安装 Python 3.10+
35
- check_python() {
36
- echo -e "${YELLOW}检查 Python 版本...${NC}"
37
-
38
- if command -v python3.10 &> /dev/null; then
39
- PYTHON_CMD="python3.10"
40
- elif command -v python3.11 &> /dev/null; then
41
- PYTHON_CMD="python3.11"
42
- elif command -v python3.12 &> /dev/null; then
43
- PYTHON_CMD="python3.12"
44
- elif command -v python3 &> /dev/null; then
45
- PY_VERSION=$(python3 --version 2>&1 | awk '{print $2}' | cut -d. -f1,2)
46
- if (( $(echo "$PY_VERSION >= 3.10" | bc -l) )); then
47
- PYTHON_CMD="python3"
48
- else
49
- PYTHON_CMD=""
50
- fi
51
- else
52
- PYTHON_CMD=""
53
- fi
54
-
55
- if [ -z "$PYTHON_CMD" ]; then
56
- echo -e "${RED}未检测到 Python 3.10+${NC}"
57
- install_python
58
- else
59
- echo -e "${GREEN}找到 Python: $PYTHON_CMD${NC}"
60
- fi
61
- }
62
-
63
- # 安装 Python 3.10
64
- install_python() {
65
- echo -e "${YELLOW}正在安装 Python 3.10...${NC}"
66
-
67
- if [ "$PLATFORM" == "Mac" ]; then
68
- # macOS
69
- if command -v brew &> /dev/null; then
70
- echo "使用 Homebrew 安装 Python 3.10..."
71
- brew install python@3.10
72
- PYTHON_CMD="/opt/homebrew/bin/python3.10"
73
- else
74
- echo -e "${RED}请先安装 Homebrew: https://brew.sh${NC}"
75
- exit 1
76
- fi
77
- elif [ "$PLATFORM" == "Linux" ]; then
78
- # Linux
79
- if command -v apt-get &> /dev/null; then
80
- echo "使用 apt 安装 Python 3.10..."
81
- sudo apt-get update
82
- sudo apt-get install -y python3.10 python3.10-venv python3.10-pip
83
- PYTHON_CMD="python3.10"
84
- elif command -v yum &> /dev/null; then
85
- echo "使用 yum 安装 Python 3.10..."
86
- sudo yum install -y python310
87
- PYTHON_CMD="python3.10"
88
- else
89
- echo -e "${RED}不支持的 Linux 发行版,请手动安装 Python 3.10+${NC}"
90
- exit 1
91
- fi
92
- else
93
- echo -e "${RED}不支持的操作系统: ${PLATFORM}${NC}"
94
- exit 1
95
- fi
96
- }
97
-
98
- # 创建安装目录
99
- setup_install_dir() {
100
- echo -e "${YELLOW}创建安装目录...${NC}"
101
-
102
- if [ -d "$INSTALL_DIR" ]; then
103
- echo -e "${YELLOW}目录已存在,清理旧文件...${NC}"
104
- rm -rf "$INSTALL_DIR"
105
- fi
106
-
107
- mkdir -p "$INSTALL_DIR"
108
- echo -e "${GREEN}安装目录: $INSTALL_DIR${NC}"
109
- }
110
-
111
- # 创建虚拟环境
112
- create_venv() {
113
- echo -e "${YELLOW}创建 Python 虚拟环境...${NC}"
114
-
115
- $PYTHON_CMD -m venv "$INSTALL_DIR/venv"
116
- source "$INSTALL_DIR/venv/bin/activate"
117
-
118
- echo -e "${GREEN}虚拟环境创建成功${NC}"
119
- }
120
-
121
- # 安装依赖
122
- install_dependencies() {
123
- echo -e "${YELLOW}安装依赖...${NC}"
124
-
125
- pip install --upgrade pip
126
- pip install fastmcp>=0.4.0 requests
127
-
128
- echo -e "${GREEN}依赖安装完成${NC}"
129
- }
130
-
131
- # 下载 MCP Server 文件
132
- download_server() {
133
- echo -e "${YELLOW}下载 MCP Server...${NC}"
134
-
135
- # 复制本地文件(如果是本地安装)
136
- if [ -f "server.py" ]; then
137
- cp server.py "$INSTALL_DIR/"
138
- echo -e "${GREEN}使用本地 server.py${NC}"
139
- else
140
- # 从远程下载
141
- echo "从远程下载..."
142
- curl -fsSL -o "$INSTALL_DIR/server.py" "https://raw.githubusercontent.com/chaihuo/mcp-server/main/server.py"
143
- echo -e "${GREEN}下载完成${NC}"
144
- fi
145
- }
146
-
147
- # 配置 WorkBuddy
148
- configure_workbuddy() {
149
- echo -e "${YELLOW}配置 WorkBuddy...${NC}"
150
-
151
- if [ ! -d "$WORKBUDDY_DIR" ]; then
152
- echo -e "${RED}未找到 WorkBuddy 目录: $WORKBUDDY_DIR${NC}"
153
- echo "请确认 WorkBuddy 已安装,或手动配置 MCP"
154
- return 1
155
- fi
156
-
157
- # 创建 MCP 配置
158
- mkdir -p "$WORKBUDDY_DIR/mcp"
159
-
160
- # 复制 server.py 到 WorkBuddy 目录
161
- cp "$INSTALL_DIR/server.py" "$WORKBUDDY_DIR/mcp/chaihuo-server.py"
162
-
163
- # 创建配置文件
164
- cat > "$WORKBUDDY_DIR/mcp_config.json" << EOF
165
- {
166
- "mcpServers": {
167
- "chaihuo": {
168
- "command": "$INSTALL_DIR/venv/bin/python",
169
- "args": ["$WORKBUDDY_DIR/mcp/chaihuo-server.py"],
170
- "env": {
171
- "SCF_URL": "$SCF_URL"
172
- }
173
- }
174
- }
175
- }
176
- EOF
177
-
178
- echo -e "${GREEN}WorkBuddy 配置完成${NC}"
179
- echo -e "${YELLOW}配置文件: $WORKBUDDY_DIR/mcp_config.json${NC}"
180
- }
181
-
182
- # 生成 JWT Secret
183
- generate_jwt_secret() {
184
- echo -e "${YELLOW}生成 JWT Secret...${NC}"
185
-
186
- JWT_SECRET=$(openssl rand -base64 32)
187
-
188
- # 更新配置文件
189
- cat > "$WORKBUDDY_DIR/mcp_config.json" << EOF
190
- {
191
- "mcpServers": {
192
- "chaihuo": {
193
- "command": "$INSTALL_DIR/venv/bin/python",
194
- "args": ["$WORKBUDDY_DIR/mcp/chaihuo-server.py"],
195
- "env": {
196
- "SCF_URL": "$SCF_URL",
197
- "JWT_SECRET": "$JWT_SECRET"
198
- }
199
- }
200
- }
201
- }
202
- EOF
203
-
204
- echo -e "${GREEN}JWT Secret 生成成功${NC}"
205
- echo -e "${YELLOW}请保存以下密钥(用于生成用户 Token):${NC}"
206
- echo -e "${GREEN}$JWT_SECRET${NC}"
207
- }
208
-
209
- # 测试安装
210
- test_installation() {
211
- echo -e "${YELLOW}测试安装...${NC}"
212
-
213
- source "$INSTALL_DIR/venv/bin/activate"
214
-
215
- if python -c "import fastmcp" 2>/dev/null; then
216
- echo -e "${GREEN}✓ fastmcp 安装成功${NC}"
217
- else
218
- echo -e "${RED}✗ fastmcp 安装失败${NC}"
219
- return 1
220
- fi
221
-
222
- if [ -f "$INSTALL_DIR/server.py" ]; then
223
- echo -e "${GREEN}✓ server.py 存在${NC}"
224
- else
225
- echo -e "${RED}✗ server.py 不存在${NC}"
226
- return 1
227
- fi
228
-
229
- echo -e "${GREEN}安装测试通过!${NC}"
230
- }
231
-
232
- # 打印完成信息
233
- print_finish() {
234
- echo ""
235
- echo -e "${GREEN}=== 安装完成!===${NC}"
236
- echo ""
237
- echo -e "${YELLOW}下一步操作:${NC}"
238
- echo "1. 重启 WorkBuddy"
239
- echo "2. 在 WorkBuddy 中测试记账功能"
240
- echo ""
241
- echo -e "${YELLOW}配置信息:${NC}"
242
- echo "- 安装目录: $INSTALL_DIR"
243
- echo "- 配置文件: $WORKBUDDY_DIR/mcp_config.json"
244
- echo "- SCF 地址: $SCF_URL"
245
- echo ""
246
- echo -e "${YELLOW}如需卸载,运行:${NC}"
247
- echo "rm -rf $INSTALL_DIR"
248
- echo ""
249
- }
250
-
251
- # 主流程
252
- main() {
253
- echo -e "${GREEN}开始安装柴米记账 MCP Server...${NC}"
254
- echo ""
255
-
256
- check_python
257
- setup_install_dir
258
- create_venv
259
- install_dependencies
260
- download_server
261
- configure_workbuddy
262
- generate_jwt_secret
263
- test_installation
264
- print_finish
265
- }
266
-
267
- # 运行主流程
268
- main