Skip to main content
Glama
Sharan0402

Expense Tracker MCP Server

by Sharan0402

Expense Tracker MCP Server

A local Model Context Protocol (MCP) server that helps you track grocery and shopping expenses by parsing PDF receipts, automatically categorizing items, and storing them in a SQLite database for easy querying.

Features

  • PDF Receipt Parsing: Extract line items, prices, and metadata from PDF receipts

  • Smart Categorization: Hybrid approach using static rules + LLM fallback for item classification

  • SQLite Storage: Persistent local database for all your expense data

  • Query Tools: Ask questions like "When did I last buy milk?" or "How often do I buy bread?"

  • Multi-Store Support: Works with receipts from Walmart, Costco, Target, and more

Installation

Prerequisites

  • Python 3.11 or higher

  • uv (recommended) or pip

Step 1: Clone or Download

cd /Users/sharan/Desktop/expense_tracker_mcp

Step 2: Install Dependencies

Using uv (recommended):

uv sync

Using pip:

pip install -r requirements.txt

Step 3: Initialize Database

The database is automatically initialized when you first run the server. The SQLite database will be created at data/expenses.db.

Running Locally

To test the server locally:

python main.py

or with uv:

uv run main.py

The server will start and listen on stdin/stdout (MCP protocol).

Connecting to Claude Desktop

Step 1: Locate Claude Desktop Config

The configuration file is located at:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%/Claude/claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

Step 2: Add MCP Server Configuration

Edit the config file and add this entry to mcpServers:

{
  "mcpServers": {
    "expense-tracker": {
      "command": "uv",
      "args": [
        "--directory",
        "/Users/sharan/Desktop/expense_tracker_mcp",
        "run",
        "main.py"
      ]
    }
  }
}

Alternative (using python directly):

{
  "mcpServers": {
    "expense-tracker": {
      "command": "/Users/sharan/Desktop/expense_tracker_mcp/.venv/bin/python",
      "args": [
        "/Users/sharan/Desktop/expense_tracker_mcp/main.py"
      ]
    }
  }
}

Step 3: Restart Claude Desktop

After saving the config, restart Claude Desktop to load the MCP server.

Usage

Once connected to Claude Desktop, you can use these tools:

1. Import a Receipt

Upload a PDF receipt and the server will parse it:

Import this receipt: /path/to/walmart_receipt.pdf

Example Response:

{
  "status": "success",
  "receipt_id": 1,
  "store_name": "Walmart",
  "purchase_date": "2025-01-15",
  "total": 45.67,
  "items_count": 12,
  "item_types": {
    "milk": 1,
    "bread": 1,
    "eggs": 1,
    "veggies": 3,
    "snacks": 2,
    "beverages": 2,
    "meat": 2
  }
}

2. Query Item History

Ask when you last bought something:

When did I last buy milk?

or

Show me all my milk purchases in the last 6 months

Example Response:

{
  "item_type": "milk",
  "purchases": [
    {
      "date": "2025-01-15",
      "store": "Walmart",
      "item_name": "Organic Milk 2%",
      "quantity": 1.0,
      "price": 4.99
    },
    {
      "date": "2024-12-28",
      "store": "Costco",
      "item_name": "Kirkland Milk",
      "quantity": 2.0,
      "price": 6.99
    }
  ],
  "stats": {
    "total_purchases": 2,
    "last_purchase_date": "2025-01-15",
    "first_purchase_date": "2024-12-28",
    "average_days_between": 18.0,
    "total_spent": 11.98
  }
}

3. List All Categories

See all item types you've purchased:

What categories of items have I bought?

Example Response:

{
  "item_types": [
    {
      "item_type": "milk",
      "total_purchases": 12,
      "last_purchase_date": "2025-01-15",
      "total_spent": 59.88
    },
    {
      "item_type": "bread",
      "total_purchases": 8,
      "last_purchase_date": "2025-01-10",
      "total_spent": 27.92
    }
  ],
  "total_categories": 15
}

Supported Item Categories

The categorizer recognizes these item types out of the box:

Dairy: milk, oatmilk, eggs, cheese, yogurt, butter

Grains: bread, rice, lentils, pasta, cereal

Produce: veggies, fruits, potatoes

Proteins: meat, fish

Snacks & Beverages: snacks, beverages

Pantry: oil, spices, sauce

Household: cleaning, paper

Fallback: other (for unrecognized items)

Adding New Categories

Edit expense_tracker/categorizer.py and add patterns to the ITEM_TYPE_MAPPINGS dictionary:

ITEM_TYPE_MAPPINGS = {
    # ... existing categories ...
    "tofu": ["tofu", "bean curd", "soy protein"],
}

Database Schema

The SQLite database (data/expenses.db) contains two main tables:

receipts

  • id: Auto-increment primary key

  • store_name: Store name (e.g., "Walmart")

  • purchase_date: ISO format date (YYYY-MM-DD)

  • subtotal: Subtotal amount (nullable)

  • tax: Tax amount (nullable)

  • total: Total amount (required)

  • created_at: Timestamp

items

  • id: Auto-increment primary key

  • receipt_id: Foreign key to receipts table

  • item_name_raw: Original item name from receipt

  • item_type: Normalized category

  • quantity: Item quantity (default: 1.0)

  • unit_price: Price per unit (nullable)

  • line_total: Total price for this line

  • created_at: Timestamp

How It Works

1. PDF Parsing

Uses pdfplumber to extract text from PDF files, then applies regex patterns to identify:

  • Store name (Walmart, Costco, Target, etc.)

  • Purchase date (multiple date formats supported)

  • Line items with quantities and prices

  • Totals (subtotal, tax, total)

2. Item Categorization

Hybrid approach:

  1. Static Rules (fast, deterministic)

    • Checks item name against pre-defined patterns

    • Handles common grocery items with keyword matching

    • ~90% accuracy for typical grocery items

  2. LLM Fallback (smart, adaptive)

    • Uses Claude via FastMCP's Context.sample() for unknown items

    • Provides better accuracy for unusual or new items

    • Automatically adapts to items not in static mappings

3. Database Storage

All data is stored in a local SQLite database with proper indexing for fast queries:

  • Indexes on purchase_date, store_name, item_type

  • Foreign key constraints for data integrity

  • Support for aggregate queries and statistics

Troubleshooting

Server not appearing in Claude Desktop

  1. Check that the path in claude_desktop_config.json is correct

  2. Restart Claude Desktop completely

  3. Check Claude Desktop logs for errors

PDF parsing errors

  • Ensure the PDF is text-based (not a scanned image)

  • Try opening the PDF in a viewer to verify it contains selectable text

  • Check that the file path is absolute, not relative

Database locked errors

  • Close any other tools accessing data/expenses.db

  • Make sure only one instance of the server is running

Development

Running Tests

pytest tests/

Adding New Features

The modular architecture makes it easy to extend:

  • New categorization rules: Edit expense_tracker/categorizer.py

  • New receipt formats: Update patterns in expense_tracker/pdf_parser.py

  • New MCP tools: Add tool functions to main.py with @mcp.tool decorator

  • Database changes: Modify schema in expense_tracker/database.py

License

MIT License - feel free to use and modify for your needs.

Contributing

Contributions welcome! Areas for improvement:

  • Support for more receipt formats

  • Better item categorization rules

  • Export to CSV/Excel functionality

  • Visualization dashboards

  • Multi-user support

Support

For issues or questions:


Built with

Install Server
A
security – no known vulnerabilities
F
license - not found
A
quality - confirmed to work

Resources

Looking for Admin?

Admins can modify the Dockerfile, update the server description, and track usage metrics. If you are the server author, to access the admin panel.

Appeared in Searches

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Sharan0402/expense-tracker-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server