chaimi-bookkeeping-mcp 2.1.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/.env +6 -0
- package/.env.backup +5 -0
- package/.env.example +26 -0
- package/.env.test +4 -0
- package/.env.test-oauth +6 -0
- package/=0.4.0 +0 -0
- package/README.md +120 -0
- package/SKILL.md +134 -0
- package/bin/cli.js +21 -0
- package/config.yaml +18 -0
- package/install.sh +268 -0
- package/oauth.js +426 -0
- package/package.json +42 -0
- package/requirements.txt +13 -0
- package/server.js +606 -0
- package/server.py +763 -0
package/.env
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# OAuth 测试配置(临时,用于测试 OAuth 流程)
|
|
2
|
+
# 注意:没有 MCP_TOKEN,强制使用 OAuth 授权
|
|
3
|
+
|
|
4
|
+
MCP_OAUTH_URL=https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpOAuth
|
|
5
|
+
MCP_HUB_URL=https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpHub-mcp
|
|
6
|
+
MCP_PROMPT_URL=https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpPrompt
|
package/.env.backup
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# /Users/solinxia/aider.git/caihuo_record_list/mcp-server-local/.env
|
|
2
|
+
|
|
3
|
+
MCP_HUB_URL=https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpHub-mcp
|
|
4
|
+
MCP_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvcGVuaWQiOiJvaEM1eDNUdjRHLUxnVVdoWkJXWkhRNUg0UzRBIiwiaWF0IjoxNzc1MTEyNTc5LCJleHAiOjE3Nzc3MDQ1Nzl9.qmGS6eK9mwhFU7e---NlA7QvbcuRZqDsibkgYh74rGU
|
|
5
|
+
MCP_OPENID=ohC5x3Tv4G-LgUWhZBWZHQ5H4S4A
|
package/.env.example
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# 柴米记账 MCP Server 环境变量配置
|
|
2
|
+
# OAuth 2.0 Device Flow 认证(行业标准方案)
|
|
3
|
+
|
|
4
|
+
# ========================================
|
|
5
|
+
# 必需配置
|
|
6
|
+
# ========================================
|
|
7
|
+
|
|
8
|
+
# OAuth 云函数地址
|
|
9
|
+
# 首次启动会自动引导完成授权,Token 存储在 ~/.mcporter/oauth-token.json
|
|
10
|
+
MCP_OAUTH_URL=https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpOAuth
|
|
11
|
+
|
|
12
|
+
# mcpHub 云函数地址
|
|
13
|
+
MCP_HUB_URL=https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpHub-mcp
|
|
14
|
+
|
|
15
|
+
# mcpPrompt 云函数地址
|
|
16
|
+
MCP_PROMPT_URL=https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpPrompt
|
|
17
|
+
|
|
18
|
+
# ========================================
|
|
19
|
+
# 可选配置
|
|
20
|
+
# ========================================
|
|
21
|
+
|
|
22
|
+
# AI API Key(用于本地解析)
|
|
23
|
+
AI_API_KEY=
|
|
24
|
+
|
|
25
|
+
# AI 提供商(openai/anthropic/deepseek)
|
|
26
|
+
AI_PROVIDER=deepseek
|
package/.env.test
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# 测试环境配置
|
|
2
|
+
MCP_OAUTH_URL=https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpOAuth
|
|
3
|
+
MCP_HUB_URL=https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpHub-mcp
|
|
4
|
+
MCP_PROMPT_URL=https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpPrompt
|
package/.env.test-oauth
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# OAuth 测试配置(临时,用于测试 OAuth 流程)
|
|
2
|
+
# 注意:没有 MCP_TOKEN,强制使用 OAuth 授权
|
|
3
|
+
|
|
4
|
+
MCP_OAUTH_URL=https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpOAuth
|
|
5
|
+
MCP_HUB_URL=https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpHub-mcp
|
|
6
|
+
MCP_PROMPT_URL=https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpPrompt
|
package/=0.4.0
ADDED
|
File without changes
|
package/README.md
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# 柴米记账 MCP Server
|
|
2
|
+
|
|
3
|
+
通过 Claude、Cursor、OpenClaw、WorkBuddy 等 AI 工具直接记账。
|
|
4
|
+
|
|
5
|
+
## 系统要求
|
|
6
|
+
|
|
7
|
+
- Node.js >= 18.0.0
|
|
8
|
+
- macOS / Windows / Linux
|
|
9
|
+
- 微信(已安装"柴米记账"小程序)
|
|
10
|
+
|
|
11
|
+
## 快速安装
|
|
12
|
+
|
|
13
|
+
### 方式一:npm 全局安装(推荐)
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# 安装
|
|
17
|
+
npm install -g chaimi-bookkeeping-mcp
|
|
18
|
+
|
|
19
|
+
# 启动(自动配置 mcporter)
|
|
20
|
+
chaimi-bookkeeping-mcp
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 方式二:手动下载安装
|
|
24
|
+
|
|
25
|
+
1. 从 GitHub Releases 下载安装包
|
|
26
|
+
2. 解压后进入目录
|
|
27
|
+
3. 安装依赖:`npm install`
|
|
28
|
+
4. 手动配置 `~/.mcporter/mcporter.json`
|
|
29
|
+
|
|
30
|
+
## 首次使用
|
|
31
|
+
|
|
32
|
+
### 1. 触发授权
|
|
33
|
+
|
|
34
|
+
在 WorkBuddy/OpenClaw/Claude 中输入:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
帮我记一笔午餐35元
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 2. 获取验证码
|
|
41
|
+
|
|
42
|
+
MCP Server 会显示:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
╔════════════════════════════════════════════════════════╗
|
|
46
|
+
║ 柴米记账 MCP Server - 首次使用需要授权 ║
|
|
47
|
+
╠════════════════════════════════════════════════════════╣
|
|
48
|
+
║ ║
|
|
49
|
+
║ 请在微信中打开以下链接完成授权: ║
|
|
50
|
+
║ ║
|
|
51
|
+
║ https://mcp.chaihuo.com/auth?code=ABCD-EFGH ║
|
|
52
|
+
║ ║
|
|
53
|
+
║ 或手动输入验证码:ABCD-EFGH ║
|
|
54
|
+
║ ║
|
|
55
|
+
║ 1. 打开"柴米记账"小程序 ║
|
|
56
|
+
║ 2. 点击"我的" → "🤖 Agent 授权" ║
|
|
57
|
+
║ 3. 输入上述验证码 ║
|
|
58
|
+
║ ║
|
|
59
|
+
╚════════════════════════════════════════════════════════╝
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 3. 小程序授权
|
|
63
|
+
|
|
64
|
+
- **PC 端用户**:点击链接自动唤起微信授权
|
|
65
|
+
- **手机端用户**:打开小程序 → 我的 → Agent 授权 → 输入验证码
|
|
66
|
+
|
|
67
|
+
### 4. 完成
|
|
68
|
+
|
|
69
|
+
授权成功后,AI 会自动完成记账。
|
|
70
|
+
|
|
71
|
+
## 配置说明
|
|
72
|
+
|
|
73
|
+
如果使用手动安装,需要配置 `~/.mcporter/mcporter.json`:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"mcpServers": {
|
|
78
|
+
"柴米记账": {
|
|
79
|
+
"command": "chaimi-bookkeeping-mcp",
|
|
80
|
+
"env": {
|
|
81
|
+
"MCP_OAUTH_URL": "https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpOAuth",
|
|
82
|
+
"MCP_HUB_URL": "https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpHub-mcp",
|
|
83
|
+
"MCP_PROMPT_URL": "https://cloud1-2gfe5jhjef06b85d-1412172089.ap-shanghai.app.tcloudbase.com/mcpPrompt"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## 常见问题
|
|
91
|
+
|
|
92
|
+
**Q: 提示 "command not found: chaimi-bookkeeping-mcp"**
|
|
93
|
+
|
|
94
|
+
A: npm 全局安装后需要重启终端,或检查 npm 全局路径是否加入环境变量。
|
|
95
|
+
|
|
96
|
+
**Q: 验证码无效**
|
|
97
|
+
|
|
98
|
+
A: 验证码 30 分钟内有效,过期需要重新获取。
|
|
99
|
+
|
|
100
|
+
**Q: 需要每次都授权吗**
|
|
101
|
+
|
|
102
|
+
A: 不需要。Token 会自动刷新,除非超过 30 天未使用。
|
|
103
|
+
|
|
104
|
+
**Q: 如何更新到最新版本**
|
|
105
|
+
|
|
106
|
+
A: `npm update -g chaimi-bookkeeping-mcp`
|
|
107
|
+
|
|
108
|
+
## 技术支持
|
|
109
|
+
|
|
110
|
+
- 微信:xxxxx
|
|
111
|
+
- 邮箱:support@chaihuo.com
|
|
112
|
+
- GitHub Issues: https://github.com/yourusername/chaimi-bookkeeping-mcp/issues
|
|
113
|
+
|
|
114
|
+
## 更新日志
|
|
115
|
+
|
|
116
|
+
### v2.1.0 (2026-04-03)
|
|
117
|
+
- 升级 OAuth 2.0 Device Flow 认证
|
|
118
|
+
- 支持 npm 全局安装
|
|
119
|
+
- 支持多种 AI 工具(Claude、Cursor、OpenClaw、WorkBuddy)
|
|
120
|
+
- 自动 Token 刷新
|
package/SKILL.md
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# 柴米记账 Skill
|
|
2
|
+
|
|
3
|
+
## 简介
|
|
4
|
+
|
|
5
|
+
柴米记账是一款智能记账工具,支持通过自然语言快速记录消费。本 Skill 让 WorkBuddy 能够自动识别记账意图,调用 MCP 工具完成记账。
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
本 Skill 文件随 MCP Server 一起提供,位于 `mcp-server-local/SKILL.md`。
|
|
10
|
+
|
|
11
|
+
将本 Skill 复制到 WorkBuddy 的 skills 目录:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# 全局安装(推荐)
|
|
15
|
+
mkdir -p ~/.workbuddy/skills/柴米记账/
|
|
16
|
+
cp /path/to/caihuo_record_list/mcp-server-local/SKILL.md ~/.workbuddy/skills/柴米记账/
|
|
17
|
+
|
|
18
|
+
# 或项目级安装
|
|
19
|
+
mkdir -p ./.workbuddy/skills/柴米记账/
|
|
20
|
+
cp /path/to/caihuo_record_list/mcp-server-local/SKILL.md ./.workbuddy/skills/柴米记账/
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 触发条件
|
|
24
|
+
|
|
25
|
+
当用户输入包含以下关键词时,自动触发本 Skill:
|
|
26
|
+
|
|
27
|
+
- 记账、花了、买了、消费、支出、付款
|
|
28
|
+
- 吃饭、购物、交通、娱乐、医疗、教育
|
|
29
|
+
- 元、块、钱、¥、$
|
|
30
|
+
- 超市、餐厅、商场、医院、学校
|
|
31
|
+
|
|
32
|
+
## 操作规范
|
|
33
|
+
|
|
34
|
+
### 1. 单商品记账
|
|
35
|
+
|
|
36
|
+
**用户示例:**
|
|
37
|
+
- "中午吃了碗面,25元"
|
|
38
|
+
- "买了杯咖啡35"
|
|
39
|
+
- "打车花了50块"
|
|
40
|
+
|
|
41
|
+
**调用工具:** `chaihuo.save_expense`
|
|
42
|
+
|
|
43
|
+
**参数提取:**
|
|
44
|
+
| 参数 | 提取规则 | 示例 |
|
|
45
|
+
|------|---------|------|
|
|
46
|
+
| name | 商品/服务名称 | "牛肉面"、"咖啡"、"打车" |
|
|
47
|
+
| amount | 金额数字 | 25、35、50 |
|
|
48
|
+
| category | 智能分类(见下表) | "餐饮"、"交通" |
|
|
49
|
+
| store | 商家名称(如有) | "星巴克"、"滴滴" |
|
|
50
|
+
|
|
51
|
+
**智能分类规则:**
|
|
52
|
+
| 关键词 | 分类 |
|
|
53
|
+
|--------|------|
|
|
54
|
+
| 吃、饭、面、咖啡、奶茶、餐厅 | 餐饮 |
|
|
55
|
+
| 打车、滴滴、地铁、公交、加油 | 交通 |
|
|
56
|
+
| 超市、买菜、水果、零食 | 食品 |
|
|
57
|
+
| 衣服、鞋、包、化妆品、购物 | 购物 |
|
|
58
|
+
| 电影、游戏、KTV、娱乐 | 娱乐 |
|
|
59
|
+
| 药、医院、看病、体检 | 医疗 |
|
|
60
|
+
| 书、课程、学费、培训 | 教育 |
|
|
61
|
+
| 其他 | 其他 |
|
|
62
|
+
|
|
63
|
+
### 2. 小票记账
|
|
64
|
+
|
|
65
|
+
**用户示例:**
|
|
66
|
+
- "在沃尔玛买了牛奶30,面包15,鸡蛋20"
|
|
67
|
+
- "晚餐:小炒肉45,米饭5,可乐8"
|
|
68
|
+
|
|
69
|
+
**调用工具:** `chaihuo.save_receipt`
|
|
70
|
+
|
|
71
|
+
**参数提取:**
|
|
72
|
+
| 参数 | 提取规则 |
|
|
73
|
+
|------|---------|
|
|
74
|
+
| store | 商家名称(第一句提到) |
|
|
75
|
+
| items | 商品列表,每个包含 name 和 amount |
|
|
76
|
+
| totalAmount | 自动计算总和 |
|
|
77
|
+
|
|
78
|
+
**商品解析示例:**
|
|
79
|
+
用户:"在沃尔玛买了牛奶30,面包15"
|
|
80
|
+
→ items: [
|
|
81
|
+
{ name: "牛奶", amount: 30 },
|
|
82
|
+
{ name: "面包", amount: 15 }
|
|
83
|
+
]
|
|
84
|
+
→ totalAmount: 45
|
|
85
|
+
|
|
86
|
+
## 回复格式
|
|
87
|
+
|
|
88
|
+
**成功时,只输出:**
|
|
89
|
+
```
|
|
90
|
+
✅ [商品名] ¥[金额] 已录入柴米记账
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**示例:**
|
|
94
|
+
- ✅ 牛肉面 ¥25 已录入柴米记账
|
|
95
|
+
- ✅ 咖啡 ¥35 已录入柴米记账
|
|
96
|
+
- ✅ 小票(3件商品)¥58 已录入柴米记账
|
|
97
|
+
|
|
98
|
+
**失败时,输出:**
|
|
99
|
+
```
|
|
100
|
+
❌ 记账失败:[错误原因]
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 注意事项
|
|
104
|
+
|
|
105
|
+
1. **不要暴露技术细节**:不显示 MCP 工具名、参数、JSON 等
|
|
106
|
+
2. **自动分类**:根据关键词智能判断分类,不确定时用"其他"
|
|
107
|
+
3. **金额识别**:支持"元"、"块"、"¥"等格式
|
|
108
|
+
4. **多商品**:一句话多个商品时,优先使用小票记账
|
|
109
|
+
|
|
110
|
+
## 配置要求
|
|
111
|
+
|
|
112
|
+
需要提前配置柴米记账 MCP Server:
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"mcpServers": {
|
|
117
|
+
"chaihuo": {
|
|
118
|
+
"command": "node",
|
|
119
|
+
"args": ["/path/to/caihuo_record_list/mcp-server-local/server.js"],
|
|
120
|
+
"env": {
|
|
121
|
+
"MCP_HUB_URL": "https://xxx.ap-shanghai.app.tcloudbase.com/mcpHub-mcp",
|
|
122
|
+
"MCP_TOKEN": "your-token",
|
|
123
|
+
"MCP_OPENID": "your-openid"
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Token 获取方式:微信小程序「柴米记账」→ 我的 → 桌面端记账 → 生成 Token
|
|
131
|
+
|
|
132
|
+
## 版本
|
|
133
|
+
|
|
134
|
+
- v1.0.0 - 支持单商品记账和小票记账
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 柴米记账 MCP Server CLI 入口
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const { spawn } = require('child_process');
|
|
9
|
+
|
|
10
|
+
// 获取 server.js 的绝对路径
|
|
11
|
+
const serverPath = path.join(__dirname, '..', 'server.js');
|
|
12
|
+
|
|
13
|
+
// 启动 server.js
|
|
14
|
+
const child = spawn('node', [serverPath], {
|
|
15
|
+
stdio: 'inherit',
|
|
16
|
+
env: process.env
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
child.on('exit', (code) => {
|
|
20
|
+
process.exit(code);
|
|
21
|
+
});
|
package/config.yaml
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# 柴米记账 MCP Server 配置文件
|
|
2
|
+
# 请从小程序获取Token并填入下方
|
|
3
|
+
|
|
4
|
+
chaihuo:
|
|
5
|
+
# JWT Token(从小程序调用 mcpAuth 云函数获取)
|
|
6
|
+
# 示例:token: "eyJhbGciOiJIUzI1NiIs..."
|
|
7
|
+
token: ""
|
|
8
|
+
|
|
9
|
+
# SCF函数URL(部署后获取)
|
|
10
|
+
# 示例:base_url: "https://mcpServer-xxx.gz.apigw.tencentcs.com"
|
|
11
|
+
base_url: ""
|
|
12
|
+
|
|
13
|
+
token: "FFeSVyBPLdnGNqaOP2NykCCyPU8ZLSKC6d5R2wkrwKo=" # ← 替换为从 mcpAuth 获取的 token
|
|
14
|
+
base_url: "https://1412172089-4wbwsop8pe.ap-shanghai.tencentscf.com" # ← 替换为 mcpServer 的 HTTP 触发地址
|
|
15
|
+
|
|
16
|
+
# 其他配置保持不变
|
|
17
|
+
port: 3000
|
|
18
|
+
nvironment: "production"
|
package/install.sh
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
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
|