expense-log-mcp
Version:
A MCP server that provides tools for logging expenses.
64 lines (63 loc) • 2.62 kB
JavaScript
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));
}
}
};