Skip to main content
Glama
saini-vikramjit

Expense Tracker MCP

Expense Tracker MCP

A Model Context Protocol (MCP) server for tracking expenses with SQLite persistence.

Installation

Prerequisites

  • Python 3.13 or higher

  • Node.js (for MCP Inspector)

  • uv (Python package manager)

Setup

  1. Create a virtual environment:

python -m venv venv
  1. Activate the virtual environment:

.\venv\Scripts\Activate.ps1
  1. Install uv:

pip install uv
  1. Initialize the project:

uv init .
  1. Install dependencies:

uv add fastmcp --active

Related MCP server: Expense Tracker MCP

Usage

Running the MCP Server

To run the MCP server:

uv run main.py

The server will automatically create a SQLite database (expenses.db) in the project root on first run.

Testing with MCP Inspector

To test the server using the MCP Inspector:

npx @modelcontextprotocol/inspector uv run main.py

This will start the MCP Inspector web interface at http://127.0.0.1:6274.

Available Resources

The MCP server provides the following resources:

expense://categories

Returns the predefined expense categories and their sub-categories.

Categories available:

  • Food: Groceries, Restaurant, Coffee, Vegetables, Snacks

  • Health: Pharmacy, Doctor, Fitness, Insurance

  • Entertainment: Streaming, Movies, Games, Events

  • Transport: Metro, Auto, Taxi, Fuel, Bus

  • Shopping: Clothing, Electronics, Home, Gifts

  • Utilities: Electricity, Internet, Water, Gas, Phone

This resource can be used to get the valid categories and sub-categories for expense tracking.

Available Tools

The MCP server provides the following tools for expense management:

add_expense

Add a new expense record to the database.

Parameters:

  • amount (float): The amount spent

  • category (str): The expense category (e.g., "Food", "Transport")

  • date (str, optional): The expense date as YYYY-MM-DD. Defaults to today

  • sub_category (str, optional): An optional sub-category (e.g., "Groceries")

  • note (str, optional): An optional free-text note

Returns: The newly created expense record with its assigned ID

list_expenses

List expense records with optional filtering.

Parameters:

  • start_date (str, optional): Only include expenses on or after this date (YYYY-MM-DD)

  • end_date (str, optional): Only include expenses on or before this date (YYYY-MM-DD)

  • category (str, optional): Only include expenses matching this category exactly

  • sub_category (str, optional): Only include expenses matching this sub-category exactly

  • limit (int, optional): Maximum number of records to return, most recent first

Returns: A list of matching expense records

edit_expense

Edit an existing expense record. Only provided fields are updated.

Parameters:

  • expense_id (int): The ID of the expense to edit

  • date (str, optional): New date as YYYY-MM-DD

  • amount (float, optional): New amount

  • category (str, optional): New category

  • sub_category (str, optional): New sub-category

  • note (str, optional): New note

Returns: The updated expense record

delete_expense

Delete an expense record by ID.

Parameters:

  • expense_id (int): The ID of the expense to delete

Returns: A confirmation dict with the deleted ID

summarize_expenses

Summarize expenses with totals, optionally filtered and grouped.

Parameters:

  • start_date (str, optional): Only include expenses on or after this date (YYYY-MM-DD)

  • end_date (str, optional): Only include expenses on or before this date (YYYY-MM-DD)

  • category (str, optional): Only include expenses matching this category exactly

  • group_by (str): How to group the breakdown: "category", "sub_category", or "date". Defaults to "category"

Returns: A dict with overall total, count of matching expenses, and a breakdown list grouped by the requested field

Project Structure

expense-tracker-mcp/
├── main.py                 # Entry point for the MCP server
├── src/
│   └── expense_tracker_mcp/
│       ├── __init__.py
│       ├── server.py       # MCP server implementation with expense tools
│       └── db.py           # SQLite database persistence layer
├── pyproject.toml          # Project configuration
├── expenses.db             # SQLite database (auto-created, gitignored)
└── README.md               # This file

Features

  • Full expense tracking via MCP protocol

  • SQLite database for persistent storage

  • Add, list, edit, and delete expenses

  • Filter expenses by date, category, and sub-category

  • Summarize expenses with customizable groupings

  • Predefined expense categories and sub-categories

  • FastMCP integration for easy server setup

  • Compatible with MCP Inspector for testing

Data Storage

Expenses are stored in a SQLite database (expenses.db) with the following schema:

  • id: Primary key (auto-increment)

  • date: Expense date (YYYY-MM-DD format)

  • amount: Amount spent

  • category: Expense category

  • sub_category: Optional sub-category

  • note: Optional free-text note

The database is automatically created on first run and is excluded from version control via .gitignore.

License

MIT

Available Tools

2 tools
addA

Add two numbers together.

ParametersJSON Schema
NameRequiredDescriptionDefault
aYesThe first number.
bYesThe second number.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. 'Add two numbers together' clearly implies a pure, deterministic, side-effect-free arithmetic operation. It does not mention potential precision or rounding behavior, but the openly simple scope makes this a minor omission.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is six words long, front-loaded with the action verb, and contains zero filler. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter arithmetic tool, the description combined with full parameter schemas and an output schema is complete. The agent has everything needed to invoke add correctly and infer what the tool will do.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully describes both parameters ('The first number' and 'The second number'), so schema coverage is 100%. The description adds no additional parameter-level meaning, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the operation ('Add') and the resource ('two numbers'), making it immediately obvious what the tool does. It also inherently distinguishes itself from the sibling tool 'multiply' by describing addition rather than multiplication.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies that the tool should be used when the desired operation is addition, but it does not explicitly mention when not to use it or name the sibling 'multiply'. For a simple two-tool arithmetic context this is sufficient, but there is no explicit routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

multiplyA

Multiply two numbers together.

ParametersJSON Schema
NameRequiredDescriptionDefault
aYesThe first number.
bYesThe second number.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description must stand alone. It describes the basic behavior but does not disclose any edge cases or result details. For such a simple pure operation this is minimally sufficient, but it is not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single clear sentence with no fluff. It is perfectly sized for the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With simple required parameters, full schema coverage, and an output schema present, the description is enough to safely invoke the tool. Some additional edge-case context would be needed for a very complex tool, but it isn't necessary here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema describes both 'a' and 'b' with 100% coverage, so the tool description correctly matches the schema. The description itself adds no meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the operation: 'Multiply two numbers together.' This is a specific verb and resource, and the operation is distinct from the sibling tool 'add' even though it does not explicitly mention it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use guidance or alternative comparison is provided. However, the implied usage is straightforward: an agent would invoke this when a product of two numbers is required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv0.1.0
    • First observedadd
    • First observedmultiply

TDQS

A3.6/5.0

Scored across 2 tools

Disambiguation5/5

Add and multiply are mathematically distinct operations with no behavioral overlap. An agent would never confuse which tool to call for a given arithmetic operation.

Naming Consistency5/5

Both tools use a simple, consistent single-verb naming pattern in lowercase. This is predictable and easy to remember.

Tool Count1/5

Two tools can be appropriate for a narrow utility, but for an 'Expense Tracker MCP' this count is far too small. The tools do not align with the server's stated purpose of expense tracking at all.

Completeness1/5

The expense tracking domain requires operations like adding expenses, listing entries, editing, and deleting. The provided add and multiply tools cover none of this domain, leaving the server severely incomplete.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables users to track personal expenses through natural language interactions with comprehensive category support and financial summaries. Provides both local and remote MCP server options with SQLite storage for fast expense management operations.
    -
  • F
    license
    B
    quality
    D
    maintenance
    A Model Context Protocol server designed for tracking and managing personal or business expenses. It enables users to log financial transactions and organize expenditure data through integrated tools.
    4
    -
  • A
    license
    A
    quality
    D
    maintenance
    Personal expense tracker MCP server that enables tracking expenses, income, budgets, and savings goals through natural language.
    10
    1
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    A Model Context Protocol (MCP) server for tracking personal expenses. This server provides tools to add, list, and summarize expenses, utilizing a local SQLite database for storage.
    3
    -