chaimi-keep-mcp 3.1.24 → 3.1.25
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/SKILL.md +232 -0
- package/package.json +10 -1
- package/server.js +3 -3
- package/install.sh +0 -268
package/SKILL.md
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
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
|
+
## 相关文档
|
|
224
|
+
|
|
225
|
+
- [MCP Server 源码](../../../../../mcp-server-local/)
|
|
226
|
+
- [授权机制设计](./【MCP】授权机制设计-v3.2.0.md)
|
|
227
|
+
- [安装使用指南](../../03-部署运维/【MCP】WorkBuddy安装使用指南v3.31.md)
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
*最后更新:2026-04-13*
|
|
232
|
+
*历史版本:通过 Git 查看*
|
package/package.json
CHANGED
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chaimi-keep-mcp",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.25",
|
|
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: '
|
|
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: '
|
|
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
|