Skip to main content
Glama
K37VIN

local-expense-tracker

by K37VIN
README.md
# Expense Tracker -- Local MCP Server

A simple **local MCP (Model Context Protocol) server** for tracking personal expenses using **SQLite**.
This server exposes expense-related tools (add, list, summarize) that can be consumed by MCP-compatible clients such as **Claude Desktop**, **Cursor**, or other LLM hosts.

No HTTP server.
No frontend.
Just a clean local tool backend for LLMs.

---

## Features

- **Add expense entries** with date, amount, category, subcategory, and notes
- **List expenses** within a date range
- **Summarize expenses** by category
- **Local SQLite database** (auto-created)
- **Categories exposed** as an MCP resource (`expense://categories`)
- **Zero configuration** beyond Python

---

## Project Structure

```
expense_tracker/
│
├── server.py          # MCP server code
├── categories.json    # Expense categories (editable at runtime)
└── expenses.db        # SQLite database (auto-created)
```

---

### Requirements

---

- Python **3.9+**

- [`uv`](https://github.com/astral-sh/uv) (recommended)

- `fastmcp`

---

### Setup

---

### 1\. Install `uv` (once)

```
pip install uv

```

Verify installation:

```
uv --version

```

### 2\. Create a virtual environment

From the project directory:

```
uv venv

```

**Activate it:**

- **Windows:** `.venv\Scripts\activate`

- **macOS / Linux:** `source .venv/bin/activate`

### 3\. Install dependencies

```
uv pip install fastmcp

```

---

### Running the MCP Server

---

Start the server using:

```
uv run python server.py

```

_Note: You will see no output. This is expected behavior as the server runs silently and waits for a compatible client (like Claude) to connect._

To stop the server: `CTRL + C`

### Database Behavior

- The `expenses.db` file is automatically created on first run.

- Tables are created using `CREATE TABLE IF NOT EXISTS`.

- No manual database setup is required.

---

### Available MCP Tools

---

#### `add_expense`

Adds a new expense entry to the database.

- **date**: string (format: `YYYY-MM-DD`)

- **amount**: number

- **category**: string

- **subcategory**: string (optional)

- **note**: string (optional)

#### `list_expenses`

Lists all expenses within a given date range.

- **start_date**: string (`YYYY-MM-DD`)

- **end_date**: string (`YYYY-MM-DD`)

#### `summarize`

Summarizes expenses by category.

- **start_date**: string (`YYYY-MM-DD`)

- **end_date**: string (`YYYY-MM-DD`)

- **category**: string (optional)

---

### MCP Resources

---

#### `expense://categories`

Returns the contents of `categories.json`. The file is read fresh on every request, allowing category updates without restarting the server.

---

### Using with Claude Desktop

---

Add the server to your `claude_desktop_config.json` (found in `%APPDATA%\Claude` on Windows or `~/Library/Application Support/Claude` on macOS):

```
{
  "mcpServers": {
    "expense-tracker": {
      "command": "uv",
      "args": [
        "run",
        "--path",
        "C:/absolute/path/to/expense_tracker",
        "python",
        "server.py"
      ]
    }
  }
}

```

_Note: Ensure you use absolute paths and forward slashes `/` even on Windows._

---

### License

---

MIT License --- free to use, modify, and distribute.