UNPKG

expense-log-mcp

Version:

A MCP server that provides tools for logging expenses.

64 lines (63 loc) 2.62 kB
import { z } from "zod"; import prisma from "../db.js"; import { successResponse, errorResponse, getErrorMessage } from "./utils.js"; const getExpensesParameters = z.object({ ledgerId: z.string(), categoryIds: z.array(z.string()).optional(), payer: z.string().optional(), startDate: z.string().optional(), endDate: z.string().optional(), }); export const getExpenses = { name: "getExpenses", description: "Retrieves expenses from a specific ledger, with optional filters for category IDs, payer, and a date range.", parameters: getExpensesParameters, execute: async ({ ledgerId, categoryIds, payer, startDate, endDate }) => { try { const where = {}; where.ledgerId = ledgerId; if (categoryIds && categoryIds.length > 0) { where.categoryId = { in: categoryIds }; } if (payer) { where.payer = payer; } if (!startDate && !endDate) { const now = new Date(); startDate = new Date(now.getFullYear(), now.getMonth(), 1).toISOString(); endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0).toISOString(); } where.createdAt = {}; if (startDate) { where.createdAt.gte = new Date(startDate); } if (endDate) { where.createdAt.lte = new Date(endDate); } const expenses = await prisma.expense.findMany({ where }); // Fetch category names const categories = await prisma.expenseCategory.findMany(); const categoryMap = new Map(); categories.forEach(category => { categoryMap.set(category.id, category.name); }); const groupedExpenses = expenses.reduce((acc, expense) => { const payer = expense.payer; const categoryId = expense.categoryId; const categoryName = categoryMap.get(categoryId) || 'Unknown Category'; if (!acc[payer]) { acc[payer] = {}; } if (!acc[payer][categoryName]) { acc[payer][categoryName] = 0; } acc[payer][categoryName] += expense.amount; return acc; }, {}); return successResponse("Expenses retrieved and grouped by payer and category successfully.", groupedExpenses); } catch (e) { return errorResponse("DATABSAE_ERROR", getErrorMessage(e)); } } };