Skip to main content
Glama
Aricode2005

ExpenseTracker

by Aricode2005

๐Ÿ’ฐ ExpenseIQ (MCP Server)

A production-grade Model Context Protocol (MCP) server for personal expense tracking โ€” powered by SQLite, designed for Claude Desktop, and ready for remote deployment.

Python 3.13+ MCP FastMCP

Live Server URL: https://expenseiq.fastmcp.app/mcp


โœจ Feature Highlights

Feature

Description

15 Tools

Add, list, edit, delete, search, summarize, trend, budget, breakdown โ€” plus editable categories

Fully Async

Non-blocking I/O using aiosqlite for high performance

Budget Tracking

Set monthly limits per category, get over-budget warnings with utilization %

Trend Analysis

Month-over-month spending trends for the last N months

CSV Export

Export filtered expenses as CSV โ€” paste directly into Google Sheets / Excel

Smart Search

Full-text search across notes and tags

Editable Categories

Pre-seeded with 100+ subcategories, fully editable via add_category / remove_category

Input Validation

Category, date, amount, and payment method validation on every operation

Currency: โ‚น INR

All responses include currency: "INR" for clarity

Prompt Templates

Built-in monthly_report prompt for structured expense analysis

Pagination

Large result sets with limit / offset support


Related MCP server: expense-mcp

๐Ÿ—๏ธ Architecture

graph LR
    A["Claude Desktop / MCP Inspector"] -->|MCP Protocol| B["FastMCP Server"]
    B --> C["main.py โ€” 12 Tools + 2 Resources + 1 Prompt"]
    C --> D["db.py โ€” SQLite"]
    C --> E["categories.json"]
    D --> F["expenses.db"]

๐Ÿš€ Quick Start

Prerequisites

  • Python 3.13+

  • uv โ€” fast Python package manager

  • Node.js / npx โ€” for MCP Inspector (optional)

  • Claude Desktop โ€” to use the server as an AI assistant

1. Clone & Install

git clone https://github.com/Aricode2005/expense-tracker-mcp.git
cd expense-tracker-mcp
uv sync

2. Test with MCP Inspector

npx @modelcontextprotocol/inspector uv run main.py

This opens a web UI where you can interactively call all 12 tools, read resources, and test prompts.

3. Install in Claude Desktop

Open your Claude Desktop config file:

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

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

Add this entry:

{
  "mcpServers": {
    "expense-tracker": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "C:\\Users\\aritr\\Downloads\\AgenticAI\\MCP\\epense_tracker-mcp",
        "main.py"
      ]
    }
  }
}

๐Ÿ’ก Replace the path with your actual project directory.

Restart Claude Desktop. You should see the ExpenseTracker server in the MCP tools panel (๐Ÿ”Œ icon).


๐Ÿ› ๏ธ Tool Reference

Core CRUD

Tool

Description

add_expense

Add expense with date, amount, category, subcategory, note, payment method, tags, recurring flag

get_expense

Fetch a single expense by ID

edit_expense

Update any field(s) of an existing expense

delete_expense

Delete an expense by ID (returns deleted record)

Tool

Description

list_expenses

List expenses in a date range with filters (category, amount range, payment method, tag) + pagination

search_expenses

Full-text search across notes and tags

Analytics

Tool

Description

summarize_expenses

Aggregate by category / subcategory / month / day with count, total, avg, min, max

get_monthly_trend

Month-over-month spending totals for the last N months

get_category_breakdown

Subcategory-level breakdown for a single category

Budgets

Tool

Description

set_budget

Set or update a monthly budget limit for a category

get_budget_status

Compare actual vs budget with utilization %, over-budget warnings

Export

Tool

Description

export_expenses

Export expenses as CSV text for spreadsheets

Resources

URI

Description

expense://categories

Full category โ†’ subcategory mapping (JSON)

expense://stats

Live dashboard: totals, this month, top categories

Prompts

Prompt

Description

monthly_report

Generates a structured monthly report with summaries, budgets, and trend analysis


๐Ÿ“‚ Project Structure

expense-tracker-mcp/
โ”œโ”€โ”€ main.py              # MCP server โ€” 12 tools, 2 resources, 1 prompt
โ”œโ”€โ”€ db.py                # Database schema, init, connection helpers
โ”œโ”€โ”€ categories.json      # 20 categories with 100+ subcategories
โ”œโ”€โ”€ pyproject.toml       # Project config (uv / pip)
โ”œโ”€โ”€ README.md            # You are here
โ””โ”€โ”€ src/
    โ””โ”€โ”€ epense_tracker_mcp/
        โ””โ”€โ”€ __init__.py  # Package entry point

๐Ÿ’ฌ Example Conversations with Claude

Once installed in Claude Desktop, try:

"Add an expense of โ‚น450 for groceries today, paid via UPI"

"Show me my spending for September 2026"

"Set a monthly budget of โ‚น5000 for food"

"Am I over budget this month?"

"What's my month-over-month spending trend?"

"Export this month's expenses as CSV"

"Search for expenses tagged 'client-x'"

"Break down my food spending by subcategory"


๐Ÿ—„๏ธ Database Schema

expenses table

Column

Type

Description

id

INTEGER PK

Auto-incrementing ID

date

TEXT

Date in YYYY-MM-DD format

amount

REAL

Amount in โ‚น INR (must be > 0)

category

TEXT

e.g. food, transport, health

subcategory

TEXT

e.g. groceries, cab_ride_hailing

note

TEXT

Free-text description

payment_method

TEXT

cash / upi / credit_card / debit_card / net_banking / wallet

is_recurring

INTEGER

0 or 1

tags

TEXT

Comma-separated tags

created_at

TEXT

ISO-8601 timestamp

updated_at

TEXT

ISO-8601 timestamp

budgets table

Column

Type

Description

id

INTEGER PK

Auto-incrementing ID

category

TEXT UNIQUE

One budget per category

monthly_limit

REAL

Monthly cap in โ‚น INR

created_at

TEXT

ISO-8601 timestamp


๐ŸŒ Remote Deployment

This server has three transport modes built in โ€” no Docker needed:

# Local (MCP Inspector / Claude Desktop)
python main.py

# Remote โ€” modern streamable-http (recommended)
python main.py --remote

# Remote โ€” legacy SSE
python main.py --sse

The PORT environment variable is respected (default: 8000).

Deploy to a Cloud Platform (Railway / Render / Fly.io)

  1. Push this repo to GitHub.

  2. Link the repo in your cloud platform.

  3. Set the Start Command to:

    python main.py --remote
  4. The platform injects PORT automatically โ€” the server binds to it.

Connect Claude Desktop to a Remote Server

Use npx to bridge the remote HTTP server into a local STDIO connection for Claude Desktop.

Add this to your claude_desktop_config.json:

{
  "mcpServers": {
    "expense-iq-remote": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/inspector",
        "mcp-remote",
        "https://expenseiq.fastmcp.app/mcp"
      ]
    }
  }
}

Note: The mcp-remote command from the inspector package acts as a bridge, allowing Claude Desktop (which expects local STDIO) to communicate with your cloud-hosted HTTP server.

Test Remote Mode Locally

# Terminal 1 โ€” start the server
python main.py --remote

# Terminal 2 โ€” connect MCP Inspector to it
npx @modelcontextprotocol/inspector
# Then set Transport Type to "Streamable HTTP"
# and URL to http://localhost:8000/mcp

๐Ÿ›ฃ๏ธ Roadmap

  • Remote Deployment โ€” Built-in SSE transport support

  • Fully Async โ€” Converted to aiosqlite

  • Editable Categories โ€” Categories managed in SQLite

  • Authentication โ€” API key / OAuth for multi-user support

  • Income Tracking โ€” Track income alongside expenses for net savings

  • Recurring Automation โ€” Auto-add recurring expenses monthly

  • Data Visualization โ€” Generate charts (spending pie, trend line) as image resources

  • Multi-currency โ€” Support USD, EUR with conversion rates

  • Receipt OCR โ€” Extract expense data from receipt images via MCP resources


๐Ÿงฐ Tech Stack

Technology

Purpose

Python 3.13

Runtime

FastMCP

MCP server framework (Async, SSE, STDIO)

SQLite (aiosqlite)

Embedded database (WAL mode, non-blocking)

Model Context Protocol

AI-tool communication standard

uv

Package management & script runner


๐Ÿ‘ค Author

Aritra Dutta โ€” GitHub ยท Email

Available Tools

12 tools
add_expenseAdd ExpenseC

Add a new expense to the tracker.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDate of expense in YYYY-MM-DD format (e.g. '2026-09-14').
noteNoOptional free-text description of the expense.
tagsNoOptional comma-separated tags for flexible filtering (e.g. 'work,client-x').
amountYesAmount spent in INR. Must be greater than 0.
categoryYesExpense category (e.g. 'food', 'transport'). Must match categories.json.
subcategoryNoOptional sub-category (e.g. 'groceries'). Must match categories.json.
is_recurringNoWhether this is a recurring expense (e.g. subscription, rent).
payment_methodNoOne of: cash, upi, credit_card, debit_card, net_banking, wallet.cash

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, but it only states that a new expense is added. It does not disclose side effects, validation rules, ID generation, duplicate handling, or whether recurring expenses update budgets.

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

Conciseness3/5

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

The description is a single short sentence with no filler, which is structurally clean. However, it is so terse that it omits useful context; it is under-specified rather than appropriately concise.

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

Completeness2/5

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

With 8 parameters, no annotations, and a mutation operation, the description is too minimal. It does not mention return behavior, validation constraints, or how this expense interacts with budgets and summaries, leaving an agent without enough context for correct invocation.

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?

Schema description coverage is 100%, so the input schema already documents all parameters. The description adds no parameter-level meaning, which matches the baseline of 3.

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 uses a clear verb ('Add') and resource ('a new expense'), making the operation's purpose immediately obvious. It does not explicitly differentiate itself from siblings, but the action is distinct enough from edit/delete/list that an agent can select it correctly.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as edit_expense or search_expenses. The description implies the creation use case but provides no context, prerequisites, or exclusions.

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

delete_expenseDelete ExpenseA

Delete an expense by its ID. Returns the deleted record for confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
expense_idYesID of the expense to delete.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden. It clearly signals a destructive operation via 'Delete' and discloses that the deleted record is returned for confirmation. It does not mention permissions or irreversibility, but the verb 'delete' makes the side effects clear enough and the return behavior adds useful detail.

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?

Two very short sentences front-load the core action and add a compact note on the confirmatory return. No filler, every word serves a 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?

For a one-parameter mutation with a full output schema, the description is sufficient. It states the operation and confirms the return payload. It could mention 404 behavior for missing IDs, but the output schema covers error information and the tool is simple enough that this absence does not meaningfully hurt invokability.

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?

Schema description coverage is 100%, with the expense_id field fully documented as 'ID of the expense to delete.' The description only reiterates 'by its ID' and adds no new meaning beyond the schema.

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 states the exact operation 'Delete an expense' with the resource identified by its ID, and notes the return value is the deleted record. This clearly differentiates it from sibling tools like get_expense, add_expense, or edit_expense, which perform different actions.

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?

Usage is implied: call it when you want to delete a specific expense and you have its expense_id. However, it does not explicitly contrast with alternatives (e.g., 'use edit_expense to modify instead') or state when not to delete, so guidance rests at the implied level.

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

edit_expenseEdit ExpenseA

Edit an existing expense. Only the fields you provide will be updated.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoNew date (YYYY-MM-DD). Leave empty to keep current.
noteNoNew note. Pass None to keep current.
tagsNoNew tags. Pass None to keep current.
amountNoNew amount in INR. Pass 0 to keep current.
categoryNoNew category. Leave empty to keep current.
expense_idYesID of the expense to edit.
subcategoryNoNew subcategory. Leave empty to keep current.
is_recurringNoNew recurring flag. Pass None to keep current.
payment_methodNoNew payment method. Leave empty to keep current.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden, and it does disclose the key non-obvious behavior: only provided fields are updated, so omitted fields remain untouched. It does not mention invalid-ID errors or permissions, but for an edit tool with an output schema the core mutation semantics are communicated.

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?

Two concise sentences, no filler, and the most important behavioral rule is front-loaded second. Every word earns its place, and it is easy to scan while still being specific.

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?

Given 9 parameters, 100% schema coverage, and an output schema, the description is sufficiently complete for making a correct call. It could mention what happens if expense_id does not exist, but that is margin error-handling detail rather than a missing usage requirement.

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 already documents all 9 parameters, including default sentinel semantics like 'Pass 0 to keep current' and 'Pass None to keep current.' The description adds no new parameter-level detail beyond the partial-update rule, so schema coverage does the heavy lifting and this stays at baseline.

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 tool edits an existing expense, which immediately separates it from add/list/delete/search siblings. The 'existing' qualifier also signals that this is a mutation of an already-created expense, and the sentence is action-first rather than tautological.

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

Usage Guidelines4/5

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

It tells the agent to use this tool when modifying an existing expense, and the partial-update note implicitly says 'do not pass fields you don't want changed.' However, it does not name alternatives or explicitly state when not to use it, so it is clear context but lacks exclusions.

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

export_expensesExport ExpensesA

Export expenses in a date range as CSV text (can be pasted into a spreadsheet).

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoOptional โ€” restrict to a single category.
end_dateYesEnd date (YYYY-MM-DD), inclusive.
start_dateYesStart date (YYYY-MM-DD).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

There are no annotations, so the description carries the full burden. It does disclose the output is CSV text and pasteable into a spreadsheet, which is useful behavioral context. However, it does not mention whether the export is read-only, whether headers are included, or how edge cases like empty results are handled.

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?

A single, front-loaded sentence that states the core action, scope, and output format. The spreadsheet note adds practical value without padding.

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?

The tool is simple, has full schema coverage, and an output schema is present, so return values do not need to be detailed. The description covers the essential purpose and output format, though it could briefly mention the optional category filter.

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?

Schema description coverage is 100%, so the schema already documents all parameters. The description reinforces the date-range concept but adds no new meaning beyond the schema, and it does not mention the optional category filter.

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 action (export), the resource (expenses), the scope (date range), and the output format (CSV text). This differentiates it from sibling tools like list_expenses or search_expenses, which do not imply a spreadsheet-ready export format.

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 the tool is for exporting data for spreadsheet use, but it does not explicitly state when to choose this over list_expenses, search_expenses, or summarize_expenses. No alternatives or exclusion criteria are mentioned.

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

get_budget_statusGet Budget StatusA

Compare actual spending vs budget for a given month (YYYY-MM). If month is empty, defaults to the current month.

ParametersJSON Schema
NameRequiredDescriptionDefault
monthNoMonth in YYYY-MM format (e.g. '2026-09'). Defaults to current month.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden, and it does disclose that empty month defaults to current month. However, it does not state whether this is read-only, what happens if no budget is set, or what data source the comparison relies on. It adds the default behavior but leaves other behavioral traits implicit.

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?

Two sentences convey the core action and the default handling with zero filler or redundancy. The primary purpose is front-loaded, and every sentence earns its place.

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?

Given the single optional parameter and the availability of an output schema, the description is almost sufficient for correct invocation. It covers the return-input behavior and default; a slight gap is that it does not orient the agent relative to related budget/summary siblings or mention preconditions, but the output schema fills the return-value gap.

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?

Schema description coverage is 100%, and the description's 'YYYY-MM' and current-month default duplicate what is already in the input schema. The description adds no extra meaning beyond schema, so the baseline 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 states a concrete verb and resource: 'Compare actual spending vs budget for a given month,' which clearly identifies the tool's function. It is distinct from siblings like get_expense, set_budget, and get_monthly_trend because it focuses specifically on budget-versus-actuals status for a month.

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 provides clear context about the input month and the default current-month behavior, but it does not explicitly tell the agent when to choose this tool over siblings such as summarize_expenses, get_monthly_trend, or get_category_breakdown. The when-not/exclusion guidance is implied rather than stated.

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

get_category_breakdownGet Category BreakdownA

Break down spending for a single category by its subcategories.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryYesThe category to break down (e.g. 'food').
end_dateYesEnd date (YYYY-MM-DD), inclusive.
start_dateYesStart date (YYYY-MM-DD).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior2/5

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

With no annotations, the description carries the burden of behavioral disclosure. It only states that spending is broken down by subcategory, leaving out details like whether inactive subcategories are included, whether the result is sorted, or whether aggregation is always performed. This is a minimal disclosure for a tool that produces grouped output.

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?

A single, front-loaded sentence with no redundant phrasing. Every word adds meaning, and the key scope ('single category', 'subcategories') is placed immediately.

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?

The description is concise but sufficient given the simple operation, complete parameter schema, and presence of an output schema. It lacks only deeper behavioral specifics, but an agent has enough to invoke the tool correctly for a straightforward aggregation.

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?

Schema description coverage is 100%, so parameters are already documented ('The category to break down', date formats, inclusive end date). The description does not add parameter-level detail beyond clarifying the category's role, which matches the baseline.

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 uses a specific verb ('Break down') and names the resource ('spending for a single category by its subcategories'), which immediately distinguishes it from sibling tools like summarize_expenses or list_expenses. The phrase 'single category' clarifies the scope without ambiguity.

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

Usage Guidelines4/5

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

The description makes the use case clear: use it when you need a subcategory-level breakdown of one category's spending. It does not explicitly name alternatives or state when not to use it, but the context is strong enough for an agent to route correctly.

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

get_expenseGet ExpenseA

Fetch a single expense by its ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
expense_idYesThe unique ID of the expense.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the behavioral burden. 'Fetch' unambiguously indicates a read-only, non-mutating operation, which is useful. However, it does not disclose error behavior, permission requirements, or what happens when the ID is not found.

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 front-loaded sentence with no filler. It states the verb, target, and scope immediately and concisely.

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?

For a one-parameter read operation with an output schema present, the description plus schema are largely sufficient for an agent to select and invoke the tool correctly. Minor gaps remain around not-found behavior and explicit differentiation from list_expenses, but these are not critical at this complexity level.

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 sole parameter is already fully documented in the schema as an integer `expense_id`. The description's 'by its ID' is consistent but adds no new semantic detail beyond the schema, so the high-coverage baseline of 3 applies.

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 uses a specific verb ('Fetch') and resource ('a single expense') with an explicit ID-based scope. This clearly distinguishes it from sibling tools like list_expenses or search_expenses.

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

Usage Guidelines4/5

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

The phrase 'by its ID' clearly signals when to use this tool: when retrieving one known expense. It implies the tool is not for listing or searching, but it does not explicitly name alternatives or exclusion conditions.

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

get_monthly_trendGet Monthly TrendB

Show month-over-month spending totals for the last N months.

ParametersJSON Schema
NameRequiredDescriptionDefault
monthsNoNumber of past months to include (default 6).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description itself must convey the operation's behavior; it does indicate this is an aggregated, read-only monthly comparison rather than a transaction-level mutation. It does not clarify edge cases such as whether the current month is included or how month boundaries are calculated.

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 one tightly worded sentence that leads with the action and outcome, with no filler or repetition of the parameter schema. Every word contributes to 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?

For a simple read-only tool with one optional parameter and an output schema, the description plus schema is largely sufficient for invocation. It is missing only explicit sibling differentiation and boundary caveats, which are useful but not essential to calling it correctly.

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?

Schema coverage is 100% and the months parameter already has a type, default, and description. The description's 'N months' adds little beyond the schema, so the baseline 3 is appropriate.

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 uses a specific verb ('Show') and names a concrete resource ('month-over-month spending totals') with a timeframe, so an agent understands what the tool does. It does not explicitly contrast with siblings such as summarize_expenses or get_category_breakdown, so it only partially earns the top score.

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

Usage Guidelines2/5

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

No guidance is given about when to prefer this tool over alternatives like summarize_expenses or list_expenses, nor does it state any exclusions. The intended use is implied by the name and description, but not explicitly routed.

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

list_expensesList ExpensesB

List expenses within an inclusive date range, with optional filters.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOptional โ€” filter expenses that contain this tag.
limitNoMax rows to return (default 50).
offsetNoPagination offset (default 0).
categoryNoOptional โ€” filter by category.
end_dateYesEnd date (YYYY-MM-DD), inclusive.
max_amountNoOptional โ€” maximum amount (inclusive, 0 = no upper limit).
min_amountNoOptional โ€” minimum amount (inclusive).
start_dateYesStart date (YYYY-MM-DD).
subcategoryNoOptional โ€” filter by subcategory.
payment_methodNoOptional โ€” filter by payment method.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It conveys that the operation is a read-only listing and that the date range is inclusive, which is useful. However, it omits important behavioral traits such as default sort order, pagination behavior, and how filters interact, leaving operational uncertainty.

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, front-loaded sentence with no wasted words. It states the action, scope, and existence of optional filters efficiently, earning its place without padding.

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

Completeness3/5

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

Given the 100% schema coverage, an output schema, and a simple list operation, the description plus schema is sufficient to construct a valid call. However, it is thin on operational context such as default limits, sorting, and how this tool is meant to be used relative to the sibling search_expenses, so it is only minimally viable.

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 already documents all 10 parameters with 100% coverage, so the baseline is 3. The description adds no parameter-specific meaning beyond calling some filters 'optional', and the schema already conveys the same information more precisely.

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 uses a specific verb ('list') with a clear resource ('expenses') and adds a date-range scope, making the core purpose immediately understandable. It distinguishes itself from single-record tools like get_expense, but it does not differentiate from the sibling search_expenses, whose name suggests overlapping list/search behavior.

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

Usage Guidelines2/5

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

The description gives a basic context (listing by date range with optional filters) but provides no guidance on when to prefer this tool over siblings like search_expenses or summarize_expenses. There are no exclusions, prerequisites, or alternative routing cues, leaving the agent to guess.

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

search_expensesSearch ExpensesA

Full-text search across expense notes and tags.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default 20).
queryYesSearch term to look for in the 'note' and 'tags' fields.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the search scope (notes and tags) but does not disclose whether the search is case-insensitive, whether full-text implies partial matches, whether it returns only accessible expenses, or whether it is entirely read-only (though 'search' implies it). The description repeats the schema's parameter semantics without adding behavioral context like pagination, ordering, or potential rate limits.

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?

A single, upfront, and well-structured sentence that conveys the tool's core function in seven words. Every word earns its place; there is no fluff or redundancy.

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

Completeness3/5

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

Given the tool's relative simplicity and the presence of an output schema (which defines the return shape), the description is adequate in scoping the tool, but it omits behavioral details that as a result quality (e.g., whether it matches partial words, case sensitivity) and any note about performance or limits. It also does not link to any alternative of supporting the description is borderline acceptable but has clear gaps.

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?

Schema description coverage is 100%, so both parameters are already documented with meanings. The description's phrase 'across expense notes and tags' adds nothing beyond the query parameter's description ('Search term to look for in the 'note' and 'tags' fields'), so it does not enhance parameter understanding. Baseline 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 identifies the specific action (full-text search), resource (expenses), and scope (notes and tags). It clearly distinguishes from sibling tools like list_expenses, which presumably lists all expenses, since search is explicitly full-text. The meaning is unambiguous.

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 tool is clearly meant for full-text searching of expenses, so its use is implied by the description. However, there is no explicit guidance on when to choose it over list_expenses or other expense retrieval tools, and no mention that it's for finding expenses when you don't know the expense ID. The description implies the use case but does not provide boundaries or alternatives.

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

set_budgetSet BudgetB

Set or update the monthly budget for a category.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryYesThe expense category (must exist in categories.json).
monthly_limitYesMonthly spending limit in INR.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description must carry behavioral transparency. It says 'Set or update' but doesn't disclose that it overwrites an existing budget for the category, what happens if the category doesn't exist, or any side effects (e.g., audit logs, validation rules). The schema mentions category existence but not the tool's behavior, leaving a meaningful gap.

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, direct sentence with no filler. It is appropriately brief for a 2-parameter setter tool and presents the core action and scope immediately.

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

Completeness3/5

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

The tool is simple and has an output schema, but since it's a mutation tool with no annotations, the description doesn't explain the actual mutation path (create vs update), error handling when the category is missing, or what the tool returns. It's adequate but incomplete, missing what the agent needs to anticipate a failed or unexpected call.

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 description covers both parameters clearly (category existence, monthly limit in INR) at 100% coverage. The description adds only 'monthly budget' rephrasing, but no new meaning or caveats beyond the schema. Baseline 3 is appropriate.

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 states a specific action ('Set or update'), a resource ('monthly budget'), and its scope ('for a category'). It distinguishes itself from sibling tools that operate on expenses or retrieve budget status, though it doesn't name an alternative explicitly.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus siblings like get_budget_status or edit_expense. The description simply states the action without defining the conditions or pre-requisites, such as needing an existing category or how this differs from editing expense records.

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

summarize_expensesSummarize ExpensesA

Aggregate spending over a date range. Group by category, subcategory, month, or day.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoOptional โ€” restrict to a single category.
end_dateYesEnd date (YYYY-MM-DD), inclusive.
group_byNoGrouping dimension: 'category' (default), 'subcategory', 'month', 'day'.category
start_dateYesStart date (YYYY-MM-DD).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It clearly states the aggregation behavior and grouping options, but doesn't disclose whether the result includes totals, counts, or both, or whether the output is a flat list or nested structure. The output schema exists and may cover this, but the description itself doesn't add behavioral context beyond the grouping dimensions.

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?

Two sentences with no filler. The core action and the key options are front-loaded. Every word earns its place.

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?

For an aggregation tool with a 100% schema-covered parameter set and an output schema present, the description is largely complete. It could mention whether the aggregation includes all categories by default or requires explicit selection, but the schema's default for group_by and the optional category parameter cover most of that. The output schema likely explains the return shape.

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?

Schema description coverage is 100%, so the schema already documents all parameters. The description adds the grouping dimension context ('Group by category, subcategory, month, or day') which reinforces the group_by parameter, but doesn't add meaning beyond what the schema provides. Baseline 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 uses a specific verb ('Aggregate') and resource ('spending over a date range'), and explicitly lists grouping dimensions. It clearly distinguishes this from sibling tools like list_expenses (which would list individual expenses) and get_category_breakdown (which is category-specific).

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

Usage Guidelines4/5

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

The description implies when to use this tool: when you need aggregated spending totals over a date range, rather than individual expense records. It doesn't explicitly name alternatives or exclusions, but the grouping options and aggregation language make the use case clear. Sibling names like list_expenses and get_category_breakdown provide additional context.

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. 12 tool updatesv0.1.0
    • First observedadd_expense
    • First observeddelete_expense
    • First observededit_expense
    • First observedexport_expenses
    • First observedget_budget_status
    • First observedget_category_breakdown
    • First observedget_expense
    • First observedget_monthly_trend
    • First observedlist_expenses
    • First observedsearch_expenses
    • First observedset_budget
    • First observedsummarize_expenses

TDQS

A3.7/5.0

Scored across 12 tools

Disambiguation4/5

Tools are mostly distinct: CRUD operations, search, export, and analytical aggregates. However, summarize_expenses, get_monthly_trend, and get_category_breakdown overlap in aggregation capabilities, though each targets a specific dimension (generic grouping vs. time trend vs. subcategory breakdown). Descriptions help disambiguate but slight confusion is possible.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern in snake_case (e.g., get_expense, add_expense, list_expenses, set_budget). No mixed conventions or vague verbs; naming is predictable and uniform.

Tool Count5/5

12 tools is well-scoped for an expense tracker covering full CRUD plus search, export, and analytical summaries. Each tool has a clear purpose and none are redundant.

Completeness5/5

The surface covers the full expense lifecycle (add, get, list, edit, delete) and adds search, export, budget management, and multiple aggregation views. No obvious gaps for the stated domain; it feels complete and self-sufficient.

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.
    -
  • A
    license
    A
    quality
    D
    maintenance
    Personal expense tracker MCP server that enables tracking expenses, income, budgets, and savings goals through natural language.
    10
    13 PyPI
    1
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables local tracking of personal expenses by adding, listing, summarizing, updating, and deleting expense records stored in a CSV file through an MCP client.
    5
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables managing and analyzing personal expenses through MCP tools, including adding expense records, listing expenses within date ranges, and summarizing spending by category, with expense categories exposed as an MCP resource.
    -