内容
# 量化生活
> 将你的Claude订阅转化为个人生活追踪器。与Claude对话,观察你的数据出现在仪表盘上。
**实时演示:** https://quant-frontend.pages.dev
---
## 为什么我创建了这个项目
自从我18岁开始,我就一直在追踪时间、热量和开支——了解自己的身体、资金和时间状况实在太美妙了。
在全职工作两年后,摩擦力变得太大。我经常会失败,至少有50%的时间——不是因为我不够关心,而是因为每天晚上要同时操作三个独立的应用:
- **Lifesum** 用于记录热量
- **Wallet by BudgetBakers** 用于记录开支
- **Toggl Track** 用于记录时间
三个订阅。三种不同的习惯需要维持。摩擦力大到让我放弃。
我想要一个地方。一个习惯。一款应用。
---
## 它是如何工作的
核心输入是一句话,而不是表单。
你不需要打开应用并填写字段,而是告诉Claude你今天做了什么:
> _"早餐吃了燕麦粥,午餐吃了鸡肉饭。买了一本书,花了₹180元,还有周 groceries 花了₹1200元。工作从9点到6点,健身房从7点到8点,之后看Netflix。"_
MCP服务器从那里处理一切——解析叙述、估计宏量营养素、分类开支、计算时间持续时间——并将结构化数据直接推送到Cloudflare D1数据库。React仪表盘在刷新时立即反映数据。
您也可以使用语音转文本(例如Wispr Flow)直接口述一天的活动。
### 架构
```
Claude Desktop / Claude.ai
│ MCP over Streamable HTTP
│ Authorization: Bearer <api_key>
▼
┌─────────────────────────────────────┐
│ Cloudflare Worker (Hono) │
│ │
│ POST /mcp ← MCP tools │ api_key auth → resolves userId
│ POST /api/auth/sync ← first login │ Clerk JWT auth
│ POST /api/query/* ← dashboard │ Clerk JWT auth
│ │
│ Routes → Repos → DAL → Drizzle/D1 │
└─────────────┬───────────────────────┘
│
Cloudflare D1 (SQLite)
users, api_keys,
food_logs, expense_logs, time_logs
▲
│ REST POST /api/query/*
┌─────────────┴───────────────────────┐
│ Cloudflare Pages (React + Vite) │
│ Clerk · TanStack Query · Recharts │
└─────────────────────────────────────┘
```
### MCP工具(共9个)
| 工具 | 功能 |
| ------------------------- | --------------------------------------------------------------- |
| `log_meal` | 批量插入餐食项目;LLM估算宏量营养素 |
| `get_food_summary` | 日期范围内的每日总量和每餐明细 |
| `log_expense` | 记录单个开支,含类别和支付方式 |
| `get_expense_summary` | 按日和类别分组的总金额 |
| `log_time` | 记录活动,含开始和结束时间(跨 midnight 安全) |
| `get_time_summary` | 每桶分钟数 + 完整活动列表 |
| `get_today` | 返回今日日期 — 防止LLM日期幻觉 |
| `list_buckets` | 返回有效的时间桶名称 |
| `list_expense_categories` | 返回有效的开支类别名称 |
### 认证
- **仪表盘(REST):** 通过Clerk使用Google OAuth。JWT在Worker边缘使用`verifyToken`从`@clerk/backend`验证。
- **MCP(Claude Desktop):** 个人API密钥在首次登录时自动生成,并在设置页面显示。
---
## 为什么使用MCP而不是内置LLM调用?
我的第一反应是在应用中嵌入LLM API调用——调用API,解析响应,保存到数据库。然后我意识到:我已经每月支付20美元给Claude。为什么还要额外支付API费用?
通过构建MCP服务器,我将已有的Claude订阅转化为计算层。Claude负责解析和推理;我的服务器只需接收结构化的工具调用并写入数据库。
---
## 入门指南
### 先决条件
- [Cloudflare账户](https://dash.cloudflare.com)(免费层可用)
- [Clerk账户](https://clerk.com)(免费层可用)
- Node.js
- Wrangler CLI:`npm i -g wrangler`
### 后端
```bash
cd mcp-server
npm install
# 创建D1数据库
wrangler d1 create quant-db
# 将database_id粘贴到wrangler.jsonc中
# 设置密钥
wrangler secret put CLERK_SECRET_KEY
# 运行迁移
npm run db:migrate:local # 本地开发
npm run db:migrate # 生产环境
# 开发服务器
npm run dev
# 部署
npm run deploy
```
### 前端
```bash
cd frontend
npm install
# 创建.env.local文件:
# VITE_CLERK_PUBLISHABLE_KEY=pk_...
# VITE_API_URL=https://quant-backend.<your-subdomain>.workers.dev
npm run dev # 本地开发
npm run build # 生产环境构建
npm run deploy # 部署到Cloudflare Pages
```
### 连接到Claude Desktop
1. 在https://quant-frontend.pages.dev登录 — 您的API密钥将自动生成。
2. 进入**设置**并复制您的MCP服务器URL和API密钥。
3. 添加到Claude Desktop配置(`claude_desktop_config.json`):
```json
{
"mcpServers": {
"quant": {
"url": "https://quant-backend.<your-subdomain>.workers.dev/mcp",
"headers": {
"Authorization": "Bearer <your-api-key>"
}
}
}
}
```
4. 重启Claude Desktop。9个工具将自动出现。
---
## 数据库架构
```
users — clerk_user_id(唯一), email
api_keys — 一个用户一个,十六进制令牌,可撤销
food_logs — 每条记录一个食物项目(按查询时间按日期 + meal_type分组)
expense_logs — 金额,类别(int枚举),描述,支付方式
time_logs — 桶(int枚举),活动,开始时间,结束时间(完整ISO日期时间)
```
所有枚举列在数据库中存储整数(Drizzle中的`.$type<IntEnum>()`)并在应用程序层转换为人类可读的标签。
---
## 下一步计划
- 任务跟踪 — 取代我的Todoist订阅
- 围绕[12周年计划](https://12weekyear.com)框架构建习惯跟踪器
目标:一个用于所有自我提升的仪表盘。