A personal finance tracker that runs entirely through MCP, giving Claude direct access to SQLite or PostgreSQL to log expenses and income, set monthly budgets with automatic alerts at 80% threshold, and track savings goals with progress visualization. It exposes eleven tools covering CRUD operations on transactions, budget management, and goal tracking, plus three prompt templates for monthly reviews and budget suggestions. The confirmation flow for deletions uses Pydantic elicitation to prevent accidental data loss. Supports both stdio for local desktop clients and HTTP for remote setups. Useful if you want conversational expense tracking without switching to a spreadsheet or dedicated app, and you're comfortable with Claude writing directly to your financial database.
Personal Expense Tracker as an MCP Server — works with Claude Desktop, Cursor, nanobot, Windsurf, and any MCP-compatible client.
# with uv (recommended)
uv pip install git+https://github.com/justfsl50/expense-mcp.git
# with pip
pip install git+https://github.com/justfsl50/expense-mcp.git
# from source
git clone https://github.com/justfsl50/expense-mcp.git
cd expense-mcp
pip install -e .
Add to %APPDATA%\Claude\claude_desktop_config.json (Windows) or ~/Library/Application Support/Claude/claude_desktop_config.json (Mac):
{
"mcpServers": {
"expense-mcp": {
"command": "uv",
"args": ["run", "expense-mcp"],
"env": {
"DATABASE_URL": "sqlite:///expenses.db",
"CURRENCY": "₹",
"DEFAULT_USER": "me"
}
}
}
}
Same config — paste into MCP settings under the respective app.
{
"mcp": {
"servers": [{
"name": "expense-mcp",
"command": "uv run expense-mcp"
}]
}
}
python server.py http
# Server runs at http://127.0.0.1:8000/mcp
| Variable | Default | Description |
|---|---|---|
DATABASE_URL | sqlite:///expenses.db | SQLite or PostgreSQL URL |
CURRENCY | ₹ | Currency symbol |
DEFAULT_USER | default | User ID for multi-user setups |
PostgreSQL example:
DATABASE_URL=postgresql://user:pass@localhost:5432/expenses
| Tool | Description | Read-only |
|---|---|---|
expense_add | Save expense or income | ❌ |
expense_search | Filter by text, date, category, amount | ✅ |
expense_summary | today / week / month / year totals | ✅ |
expense_delete | Delete with Pydantic confirmation prompt | ❌ |
expense_insights | Spending patterns and top categories | ✅ |
budget_set | Set monthly category budget | ❌ |
budget_list | View budgets with usage % | ✅ |
goal_create | Create savings goal | ❌ |
goal_update | Add money toward goal | ❌ |
goal_list | View goals with progress bars | ✅ |
| URI | Description |
|---|---|
expense://summary/month | Current month summary |
expense://budgets/current | This month's budgets |
expense://goals/all | All savings goals |
| Prompt | Title | Description |
|---|---|---|
monthly_review | Monthly Review | Start a full month spending review |
budget_setup | Budget Setup | Auto-suggest budgets from history |
savings_plan | Savings Plan | Create a plan for a savings goal |
Just talk naturally in any MCP client:
"spent 500 on groceries"
"show food expenses this week"
"how much did I spend last month?"
"set food budget to 5000"
"am I within budget?"
"save 1000 toward my iPhone goal"
"give me spending insights"
"delete expense #12"
FastMCP + json_response=TrueAppContext dataclassDeclarativeBase, sessionmakerreadOnlyHint, destructiveHint, idempotentHintctx.info(), ctx.warning() in toolsexpenses — id, user_id, amount, category, description, type, date, source, created_at
budgets — id, user_id, category, amount, month
goals — id, user_id, name, target, saved, deadline
MIT — free to use, modify, and distribute.
DATABASE_URLSQLite or PostgreSQL database URL
CURRENCYCurrency symbol (default: ₹)
DEFAULT_USERUser ID for multi-user setups