费用追踪工具

一个基于FastMCP框架的简单文件费用追踪应用,用于记录、管理和查询费用数据。

  • by yaniv-11
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 yaniv-11/.MCP-Expense-Tracker

使用说明

ExpenseTracker (FastMCP) 💸 翻译为中文是:“支出追踪器(快速多条件计划)💸”

📝 描述

这个项目是一个基于文件的简单费用追踪应用程序,使用……构建(注:原文在此处截断,未给出具体构建技术或语言,因此翻译也相应保留了这种开放性) fastmcp 框架。它使用SQLite数据库(expenses.db用于存储、管理和查询费用数据。它提供了多个“工具”(函数),这些工具可以通过FastMCP环境被调用,以实现费用的添加、列出、更新、删除、过滤和汇总。


✨ 特点/功能

  • 添加费用: 记录新的支出,包括日期、金额、类别、子类别和备注。
  • 列出费用: 检索指定日期范围内的所有费用列表。
  • 更新与删除: 通过唯一ID修改或删除现有的费用条目。
  • 详细视图: 通过ID获取单个费用的所有详细信息。
  • 过滤: 按类别和/或子类别筛选费用列表。
  • 总结: 获取在指定日期范围内按类别划分的总支出概要。
  • 品类管理: 从外部加载费用类别 categories.json 文件。

🛠️ 要求

  • Python 3.x
  • fastmcp: pip install fastmcp
  • sqlite3 (包含在Python标准库中)

🚀 设置与安装

  1. 获取代码: 克隆仓库或将代码保存为 main.py。

  2. 安装依赖项: 唯一的外部依赖是 fastmcp。

    pip install fastmcp
    
  3. 创建 categories.json: 在与……相同的目录中 main.py,你 必须 创建一个名为(指定名称)的文件 categories.json此文件定义了您支出的有效类别和子类别。

    示例 categories.json:

    {
      "Food": [
        "Groceries",
        "Restaurants",
        "Coffee",
        "Takeaway"
      ],
      "Transport": [
        "Gas",
        "Public Transit",
        "Taxi",
        "Repairs"
      ],
      "Housing": [
        "Rent",
        "Utilities",
        "Insurance"
      ],
      "Entertainment": [
        "Movies",
        "Subscriptions"
      ]
    }
    
  4. 运行应用程序:

    python main.py
    

    这将启动FastMCP服务。脚本将自动创建 expenses.db 如果在相同目录下不存在,则创建 SQLite 数据库文件。


🗄️ 数据库模式

该应用程序使用一个SQLite数据库文件(expenses.db) 使用单个表: expenses。

| 列 | 类型 | 约束 | 描述 | | 分隔符 | 分隔符 | 分隔符 | 分隔符 | | id | INTEGER | PRIMARY KEY AUTOINCREMENT | 费用的唯一标识符。 | | date | TEXT | NOT NULL 费用日期(例如,“YYYY-MM-DD”)。 | | amount | REAL | NOT NULL 该费用的金额。 | | category | TEXT | NOT NULL | 主要类别(例如,“食品”)。 | | subcategory | TEXT | DEFAULT '' 可选的子类别(例如,“杂货”)。 | | note | TEXT | DEFAULT '' | 用于该费用的可选文本说明。 |


🤖 API / 工具参考

FastMCP应用程序提供了以下工具和资源。

add_expense

向数据库中添加一条新的费用记录。

  • 工具名称: add_expense
  • 参数:
    • date (str): 费用日期(格式为 YYYY-MM-DD)。
    • amount (float): 费用金额。
    • category (str):主要类别。
    • subcategory (字符串,可选):子类别。默认值为 ""。
    • note (字符串, 可选): 一个描述性注释。默认值为 ""。
  • 返回值: 一个包含状态和(其他信息)的字典 id 新产生的费用。
    • 成功: {"status": "ok", "id": 123}

list_expenses

列出指定日期范围内的所有费用条目,按ID排序。

  • 工具名称: list_expenses
  • 参数:
    • start_date (str): 日期范围的开始(格式 YYYY-MM-DD)。
    • end_date (str): 日期范围的结束(格式为 YYYY-MM-DD)。
  • 返回值: 一个字典列表,其中每个字典代表一项支出。
    • 示例: [{"id": 1, "date": "2024-10-25", "amount": 12.50, ...}, ...]

delete_expense

通过唯一ID删除单条费用记录。

  • 工具名称: delete_expense
  • 参数:
    • expense_id (int): 要删除的费用的ID。
  • 返回值: 一个状态字典。
    • 成功: {"status": "ok", "deleted": 1}
    • 错误(未找到): {"status": "error", "message": "No expense found with id 404"}

update_expense

更新现有费用条目的一个或多个字段。

  • 工具名称: update_expense
  • 参数:
    • expense_id (int): 要更新的费用的ID。
    • date (字符串,可选):新日期。
    • amount (float, 可选): 新的金额。
    • category (字符串,可选):新类别。
    • subcategory (str, 可选):新的子类别。
    • note (字符串,可选):新音符。
  • 返回值: 一个状态字典。
    • 成功: {"status": "ok", "updated": 1}
    • 错误(未找到): {"status": "error", "message": "No expense found with id 404"}
    • 错误(无字段): {"status": "error", "message": "No fields to update."}

get_expense

通过ID获取单条费用的所有详细信息。

  • 工具名称: get_expense
  • 参数:
    • expense_id (int):要检索的费用的ID。
  • 返回值: 一个包含所有费用字段的字典,或者一条错误消息。
    • 成功: {"id": 1, "date": "2024-10-25", "amount": 12.50, ...}
    • 错误(未找到): {"status": "error", "message": "No expense found with id 404"}

filter_expenses

按类别和/或子类别过滤费用,按日期排序。

  • 工具名称: filter_expenses
  • 参数:
    • category (字符串,可选):用于过滤的类别。
    • subcategory (str, 可选):用于过滤的子类别。
  • 返回值: 符合标准的费用字典列表。

summarize

计算在指定日期范围内,按类别分组的费用总和。

  • 工具名称: summarize
  • 参数:
    • start_date (str): 日期范围的开始(格式 YYYY-MM-DD)。
    • end_date (str): 日期范围的结束(格式 YYYY-MM-DD)。
    • category (字符串,可选):如果提供,则仅对此特定类别进行汇总。
  • 返回值: 一个字典列表,每个字典都包含一个 category 以及它的 total_amount。
    • 示例: [{"category": "Food", "total_amount": 350.75}, {"category": "Transport", "total_amount": 120.00}]

categories (资源)

一个只读资源,提供以下内容: categories.json 文件。

  • 资源URI: expense://categories
  • MIME 类型: application/json
  • 返回: 其原始的JSON字符串内容为 categories.json 文件。