UNPKG

@baruchiro/actual-mcp

Version:

Actual Budget MCP server exposing API functionality

46 lines (45 loc) 2.88 kB
import { formatAmount } from "../../utils.js"; export class MonthlySummaryReportGenerator { generate(data) { const { start, end, accountId, accountName, sortedMonths, avgIncome, avgExpenses, avgInvestments, avgTraditionalSavings, avgTotalSavings, avgTraditionalSavingsRate, avgTotalSavingsRate, } = data; let markdown = `# Monthly Financial Summary\n\n`; markdown += `Period: ${start} to ${end}\n\n`; if (accountId) { markdown += `Account: ${accountName || accountId}\n\n`; } else { markdown += `Accounts: All on-budget accounts\n\n`; } // Add summary table markdown += `## Monthly Breakdown\n\n`; markdown += `| Month | Income | Regular Expenses | Investments | Traditional Savings | Total Savings | Total Savings Rate |\n`; markdown += `| ----- | ------ | ---------------- | ----------- | ------------------- | ------------- | ------------------ |\n`; sortedMonths.forEach((month) => { const monthName = new Date(month.year, month.month - 1, 1).toLocaleString("default", { month: "long" }); const income = formatAmount(month.income); const expenses = formatAmount(month.expenses); const investments = formatAmount(month.investments); const traditionalSavings = month.income - month.expenses; const totalSavings = traditionalSavings + month.investments; const savingsFormatted = formatAmount(traditionalSavings); const totalSavingsFormatted = formatAmount(totalSavings); const savingsRate = month.income > 0 ? ((totalSavings / month.income) * 100).toFixed(1) + "%" : "N/A"; markdown += `| ${monthName} ${month.year} | ${income} | ${expenses} | ${investments} | ${savingsFormatted} | ${totalSavingsFormatted} | ${savingsRate} |\n`; }); // Add averages markdown += `\n## Averages\n\n`; markdown += `Average Monthly Income: ${formatAmount(avgIncome)}\n`; markdown += `Average Monthly Regular Expenses: ${formatAmount(avgExpenses)}\n`; markdown += `Average Monthly Investments: ${formatAmount(avgInvestments)}\n`; markdown += `Average Monthly Traditional Savings: ${formatAmount(avgTraditionalSavings)}\n`; markdown += `Average Monthly Total Savings: ${formatAmount(avgTotalSavings)}\n`; markdown += `Average Traditional Savings Rate: ${avgTraditionalSavingsRate.toFixed(1)}%\n`; markdown += `Average Total Savings Rate: ${avgTotalSavingsRate.toFixed(1)}%\n`; markdown += `\n## Definitions\n\n`; markdown += `* **Traditional Savings**: Income minus regular expenses (excluding investments)\n`; markdown += `* **Total Savings**: Traditional savings plus investments\n`; return markdown; } }