费用日志服务

一个基于SSE的MCP服务器,提供记录、删除、查询和分组费用的工具。

  • by evanxd
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 evanxd/expense-log-mcp

使用说明

MCP费用日志

基于SSE的MCP服务器,提供记录费用的工具。

✨ 特性

  • 将新的支出记入分类账。
  • 删除费用记录。
  • 检索所有可用支出类别的列表。
  • 按付款人和类别检索和分组费用。
  • 检索费用记录。

🚀 入门指南

先决条件

安装和设置

  1. 克隆存储库:

    git clone https://github.com/evanxd/expense-log-mcp.git
    
  2. 安装依赖项:

    npm install
    
  3. 设置数据库:

    • 创建一个 .env 项目根目录中的文件。
    • 将PostgreSQL连接字符串添加到 .env 文件:
      DB_USER="postgres"
      DB_HOST="localhost"
      DB_PORT="5432"
      DB_DATABASE="postgres"
      DB_PASSWORD="YOUR_DB_PASSWORD"
      DATABASE_URL="postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_DATABASE}?schema=public"
      
    • 将服务器配置添加到您的 .env 文件:
      MCP_SECRET_KEY="YOUR_SECRET_KEY" # A strong, unique key for authenticating with the MCP server
      PORT="8080" # The port the MCP server will listen on (default is 8080)
      
    • 应用数据库架构:
      npx prisma db push
      
    • 为数据库添加初始类别种子:
      npm run db:seed
      
  4. 构建并启动服务器:

    npm run build && npm start
    

    此命令编译TypeScript代码,然后启动服务器,服务器将侦听指定对象上的传入请求 PORT (默认为8080)。

  5. 配置您的MCP主机(例如Gemini CLI):

    • 将以下配置添加到Gemini CLI设置中(通常在 ~/.gemini-cli/config.json 或类似,具体取决于您的操作系统):
    "mcpServers": {
      "expense-log-mcp": {
        "url": "http://localhost:8080/sse",
        "headers": {
          "Authorization": "Bearer YOUR_SECRET_KEY"
        }
      }
    }
    

    重要提示: 替换 YOUR_SECRET_KEY 与实际 MCP_SECRET_KEY 你在你的 .env 文件。此命令告诉Gemini CLI如何连接到本地运行的Expense Log MCP服务器并对其进行身份验证。

🛠️ 工具

服务器公开了以下工具:

addExpense

添加新的支出记录。

参数:

名称 类型 描述
ledgerId string 要添加费用的分类账的ID
categoryId string 费用类别的ID。
messageId string 消息的唯一ID,以防止重复。
description string 费用的描述。
amount number 费用金额。
payer string 付款人的姓名。

退货:

已添加确认费用的JSON字符串,例如:

{
  "success": true,
  "code": "OK",
  "message": "Expense added successfully.",
  "data": {
    "expenseId": "clx...456"
  }
}

deleteExpense

删除费用记录。

参数:

名称 类型 描述
ledgerId string 费用所属分类账的ID
messageId string 要删除的费用的唯一消息ID。

退货:

一个JSON字符串,确认费用已被删除,并包括已删除费用的详细信息,例如:

{
  "success": true,
  "code": "OK",
  "message": "Expense deleted successfully.",
  "data": {
    "id": "clx...123",
    "description": "Lunch",
    "amount": 15.75,
    "createdAt": "Sun Sep 07 2025"
  }
}

getExpense

检索单个支出的详细信息。

参数:

名称 类型 描述
ledgerId string 费用所属分类账的ID
messageId string 要删除的费用的唯一消息ID。

退货:

一个JSON字符串,确认已检索到费用,并包括费用的详细信息,例如:

{
  "success": true,
  "code": "OK",
  "message": "Expense retrieved successfully.",
  "data": {
    "id": "clx...123",
    "description": "Lunch",
    "amount": 110,
    "payer": "payer1",
    "createdAt": "2025-09-07T00:00:00.000Z",
    "updatedAt": "2025-09-07T00:00:00.000Z"
  }
}

getExpenseCategories

检索所有费用类别的列表。

参数:

没有。

退货:

包含费用类别列表的JSON字符串,例如:

{
  "success": true,
  "code": "OK",
  "message": "Expense categories retrieved successfully.",
  "data": [
    {
      "expenseCategoryId": "clx...1",
      "expenseCategoryName": "Transportation"
    },
    {
      "expenseCategoryId": "clx...2",
      "expenseCategoryName": "Utilities"
    }
  ]
}

getGroupedExpenses

按付款人和类别名称检索和分组费用,返回每个类别的总金额, 具有类别ID、付款人和日期范围的可选过滤器。

参数:

名称 类型 描述
ledgerId string 要从中检索费用的分类账的ID。
categoryIds string[] 可选。要筛选的类别ID数组
payer string 可选。要筛选的付款人的名称
startDate string 可选。过滤费用的开始日期(ISO 8601格式)。
endDate string 可选。过滤费用的结束日期(ISO 8601格式)。

退货:

包含分组费用的JSON字符串,例如:

{
  "success": true,
  "code": "OK",
  "message": "Grouped expenses retrieved successfully.",
  "data": {
    "Payer1": {
      "expenseCategories": {
        "Entertainment": 100,
        "Transportation": 50
      },
      "totalAmount": 150
    },
    "Payer2": {
      "expenseCategories": {
        "Dining/Snacks": 75
      },
      "totalAmount": 75
    }
  }
}

🗄️ 数据库模式

此项目使用Prisma来管理数据库架构。架构在中定义 prisma/schema.prisma 包括以下型号:

  • Ledger:代表一系列费用。
  • ExpenseCategory:表示支出的类别。
  • Expense:表示单个支出记录。添加了一个独特的约束 ledgerId 和 messageId 以防止重复支出。

所有型号包括 createdAt 和 updatedAt 时间戳。ID是通过以下方式生成的 cuid().

🙌 贡献

欢迎投稿!请随时提交拉取请求。

📄 许可证

该项目根据 MIT许可证.