使用说明
费用管理MCP服务器
使用FastMCP和PostgreSQL构建的云就绪多用户费用跟踪功能。
🎯 此MCP服务器的功能
这是一个 模型上下文协议(MCP)服务器 提供费用管理功能。它公开了人工智能助手(如克劳德)可以使用的4个工具:
- 添加详细费用(日期、金额、类别、商家、备注)
- 列出日期范围内的费用
- 按类别汇总支出
- 生成月度费用报告
关键设计原则: 此服务器是 能力边界 --它拥有支出数据和逻辑,仅此而已。
🧩 为什么选择MCP?
该项目使用 模型上下文协议 创建a 模块化、工具驱动的人工智能系统:
- 关注点分离:此服务器仅处理费用,其他功能(电子邮件、任务、日历)是单独的MCP服务器
- AI驱动接口:任何AI助手都可以使用这些工具,而无需自定义集成
- 可组合性:多个MCP服务器可以通过后端编排器协同工作
- 云原生:设计用于在FastMCP Cloud上运行,无本地依赖关系
MCP不是:
- 聊天机器人框架
- UI框架
- 单片后端
- 身份验证系统
MCP是:
- 向人工智能助手公开功能的协议
- 一种构建可组合、基于工具的系统的方法
- 能力逻辑和编排之间的界限
🛠️ 暴露的MCP工具
1. add_expense
为用户添加新费用。
输入:
{
"user_id": "user_123",
"date": "2025-01-15",
"amount": 45.50,
"category": "Food",
"merchant": "Starbucks",
"note": "Coffee meeting"
}
退货: 使用生成的UUID创建费用
2. list_expenses
列出日期范围内的费用。
输入:
{
"user_id": "user_123",
"start_date": "2025-01-01",
"end_date": "2025-01-31"
}
退货: 按日期排序的费用数组(最早的先到)
3. summarize_expenses
按类别汇总支出。
输入:
{
"user_id": "user_123",
"start_date": "2025-01-01",
"end_date": "2025-01-31"
}
退货:
[
{ "category": "Food", "total": 450.75 },
{ "category": "Transport", "total": 230.00 }
]
4. monthly_report
生成月度费用报告。
输入:
{
"user_id": "user_123",
"month": "2025-01"
}
退货: 总支出、类别细分、支出计数和自然语言摘要
🔒 多用户隔离
此服务器设计用于 多用户环境 具有严格的数据隔离:
- 每个查询都按以下条件过滤
user_id - 用户无法访问彼此的数据
- 无用户身份验证逻辑(由后端编排器处理)
user_id从呼叫系统注入并信任
数据库模式:
SELECT * FROM expenses
WHERE user_id = ? AND date BETWEEN ? AND ?
所有查询强制执行 user_id 在SQL级别进行过滤。
🏗️ 架构:模块化个人管理系统
此MCP服务器是 一个能力模块 在更大的个人管理器系统中:
┌─────────────────────────────────────────────┐
│ Backend Orchestrator │
│ (Authentication, Routing, Workflows) │
└──────────────┬──────────────────────────────┘
│
┌───────┴───────┬──────────┬──────────┐
│ │ │ │
┌───▼───┐ ┌────▼───┐ ┌───▼───┐ ┌───▼───┐
│Expense│ │ Email │ │ Task │ │ PKOS │
│ MCP │ │ MCP │ │ MCP │ │ MCP │
└───────┘ └────────┘ └───────┘ └───────┘
设计原则
-
每个功能都是一个单独的MCP服务器
- 费用跟踪=此服务器
- 电子邮件管理=单独的MCP服务器
- 任务管理=单独的MCP服务器
- 个人知识(PKOS)=单独的MCP服务器
-
MCP服务器是隔离的
- 每个都有自己的数据库模式
- 每个都公开了显式工具
- 无跨服务器依赖关系
-
后端编排器处理:
- 用户认证
- MCP服务器路由
- 多步骤工作流程
- 用户会话管理
-
AI助手通过编排器调用工具
- 用户:“上个月我在食物上花了多少钱?”
- 编排器:对用户进行身份验证→ 呼叫费用MCP
monthly_report - MCP:仅返回该用户的数据
🚀 添加新功能
向Personal Manager系统添加新功能时:
✅ 做: 创建新的MCP服务器
- 新功能=新的MCP服务器项目
- 遵循相同的结构(main.py、tools.py、models.py、db.py)
- 仅公开该功能的工具
❌ 不要: 修改此费用服务器
- 不要在此处添加电子邮件/任务/日历逻辑
- 不要创建跨能力依赖关系
- 不要合并MCP服务器
示例:添加任务管理
- 创建
task-mcp-server/(单独项目) - 露出工具:
add_task,list_tasks,complete_task - 为任务使用单独的数据库架构
- 作为单独的FastMCP云实例部署
- 后端编排器将与任务相关的查询路由到任务MCP
🗄️ 数据库模式
具有多用户隔离的PostgreSQL模式:
CREATE TABLE expenses (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id TEXT NOT NULL,
date DATE NOT NULL,
amount NUMERIC(10,2) NOT NULL CHECK (amount > 0),
category TEXT NOT NULL,
merchant TEXT,
note TEXT,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX idx_expenses_user_date ON expenses(user_id, date);
为什么选择PostgreSQL?
- 云托管(Supabase、Neon、Railway等)
- 财务数据的ACID合规性
- 使用NUMERIC进行货币强输入
- 高效的日期范围查询索引
🚀 部署
先决条件
-
PostgreSQL数据库 (建议使用云托管):
-
数据库设置:
psql $DATABASE_URL < schema.sql -
环境变量:
export DATABASE_URL="postgresql://user:password@host:port/database"
部署到FastMCP云
# Install dependencies
pip install -r requirements.txt
# Deploy to FastMCP Cloud
fastmcp deploy
FastMCP Cloud处理:
- HTTP传输自动
- 服务器生命周期管理
- 自动缩放
- 日志记录与监视
无需本地服务器 --这是为云部署而设计的。
🧪 本地测试(可选)
仅用于开发测试:
# Set environment variable
export DATABASE_URL="postgresql://localhost/expenses_dev"
# Create test database
createdb expenses_dev
psql expenses_dev < schema.sql
# Run server (for testing tools)
python main.py
注: 生产部署应使用FastMCP Cloud,而不是本地测试。
🔐 安全模型
此服务器的功能
- ✅ 验证user_id是否存在且非空
- ✅ 验证输入格式(日期、金额)
- ✅ 通过SQL WHERE子句强制数据隔离
- ✅ 优雅地处理数据库错误
- ✅ 使用参数化查询(SQL注入保护)
此服务器不做什么
- ❌ 用户身份验证(由后端处理)
- ❌ 授权检查(信任后端的user_id)
- ❌ 会话管理
- ❌ 速率限制(由FastMCP Cloud处理)
- ❌ API密钥验证
安全假设: 这 user_id 参数在到达此MCP服务器之前由受信任的后端编排器注入和验证。
📊 数据流示例
用户查询: “上个月我在杂货上花了多少钱?”
-
用户界面 (网络/移动应用程序)
- 用户通过OAuth/JWT进行身份验证
- 请求已发送到后端编排器
-
后端编排器
- 验证用户会话→ 提取物
user_id - 确定要调用哪个MCP服务器(MCP费用)
- 呼叫
summarize_expenses注射工具user_id
- 验证用户会话→ 提取物
-
MCP服务器费用 (此服务器)
- 收到:
{"user_id": "user_123", "start_date": "2024-12-01", "end_date": "2024-12-31"} - 查询:
SELECT category, SUM(amount) FROM expenses WHERE user_id = 'user_123' AND ... - 退货:
[{"category": "Groceries", "total": 450.75}]
- 收到:
-
后端编排器
- 为用户格式化响应
- 返回用户界面
-
用户界面
- 展示:“你上个月在杂货上花了450.75美元”
🧩 扩展点
此服务器设计用于 未经修改的扩展:
添加新的支出类别
- 无需更改代码
- 类别是自由格式的文本字段
- TODO:添加可选类别验证/标准化
增加经常性费用
- 选项A: 此服务器中的新MCP工具
- 选项B: 单独的“经常性费用”MCP服务器
- 推荐:选项B(遵循单一责任原则)
添加收据存储
- 不要添加到此服务器
- 创建单独的“文档存储”MCP服务器
- 费用MCP参考文档ID
添加预算跟踪
- 不要添加到此服务器
- 创建单独的“预算管理”MCP服务器
- 如果需要,预算MCP可以调用费用MCP工具
一般规则: 如果一个功能不是直接记录/查询费用,那么它属于一个单独的MCP服务器。
🤝 贡献
贡献时:
- 遵循规范 在
docs/phase-1-spec.md - 不添加功能 不在规范中(请创建新的MCP服务器)
- 保持数据隔离 --所有查询都必须按user_id筛选
- 无UI代码 --这只是一个工具服务器
- 无身份验证码 --user_id从外部注入
📚 相关文档
🎓 学习资源
MCP新手?
架构模式:
- 为什么模块化MCP服务器>单片API
- MCP如何实现AI优先的应用架构
- 构建可组合能力系统
📝 许可证
MIT许可证-有关详细信息,请参阅许可证文件
✨ 摘要
此MCP服务器演示:
✅ 单一责任 --仅限费用
✅ 多用户安全 --严格的数据隔离
✅ 云就绪 --FastMCP云部署
✅ 工具驱动 --人工智能助手调用显式工具
✅ 可组合 --更大模块化系统的一部分
✅ 生产级 --错误处理、验证、PostgreSQL
下一步:
- 部署到FastMCP云
- 连接后端编排器
- 构建附加功能MCP服务器(电子邮件、任务等)
- 创建调用编排器的用户界面
问题? 查看FastMCP文档或打开问题。