ExpenseTracker
ExpenseIQ is an MCP server for personal expense tracking that lets you manage expenses, analyze spending, set budgets, and export data.
Add expenses with date, amount, category, subcategory, note, payment method, tags, and recurring flag
List expenses by date range with filters like category, subcategory, payment method, amount range, tag, and pagination
Get, edit, and delete expenses by ID
Search expenses by note and tags
Summarize expenses grouped by category, subcategory, month, or day with totals and averages
View monthly trends across the last N months
Get category breakdowns by subcategory
Set and monitor monthly budgets per category with over-budget utilization status
Export expenses as CSV for spreadsheets
Read resources like category mappings and live spending stats
Use the monthly report prompt for structured analysis
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ExpenseTrackerWhat's my budget status for this month?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
๐ฐ 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.
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 |
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 |
Input Validation | Category, date, amount, and payment method validation on every operation |
Currency: โน INR | All responses include |
Prompt Templates | Built-in |
Pagination | Large result sets with |
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 sync2. Test with MCP Inspector
npx @modelcontextprotocol/inspector uv run main.pyThis 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.jsonmacOS:
~/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 with date, amount, category, subcategory, note, payment method, tags, recurring flag |
| Fetch a single expense by ID |
| Update any field(s) of an existing expense |
| Delete an expense by ID (returns deleted record) |
Query & Search
Tool | Description |
| List expenses in a date range with filters (category, amount range, payment method, tag) + pagination |
| Full-text search across notes and tags |
Analytics
Tool | Description |
| Aggregate by category / subcategory / month / day with count, total, avg, min, max |
| Month-over-month spending totals for the last N months |
| Subcategory-level breakdown for a single category |
Budgets
Tool | Description |
| Set or update a monthly budget limit for a category |
| Compare actual vs budget with utilization %, over-budget warnings |
Export
Tool | Description |
| Export expenses as CSV text for spreadsheets |
Resources
URI | Description |
| Full category โ subcategory mapping (JSON) |
| Live dashboard: totals, this month, top categories |
Prompts
Prompt | Description |
| 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 |
| INTEGER PK | Auto-incrementing ID |
| TEXT | Date in YYYY-MM-DD format |
| REAL | Amount in โน INR (must be > 0) |
| TEXT | e.g. food, transport, health |
| TEXT | e.g. groceries, cab_ride_hailing |
| TEXT | Free-text description |
| TEXT | cash / upi / credit_card / debit_card / net_banking / wallet |
| INTEGER | 0 or 1 |
| TEXT | Comma-separated tags |
| TEXT | ISO-8601 timestamp |
| TEXT | ISO-8601 timestamp |
budgets table
Column | Type | Description |
| INTEGER PK | Auto-incrementing ID |
| TEXT UNIQUE | One budget per category |
| REAL | Monthly cap in โน INR |
| 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 --sseThe PORT environment variable is respected (default: 8000).
Deploy to a Cloud Platform (Railway / Render / Fly.io)
Push this repo to GitHub.
Link the repo in your cloud platform.
Set the Start Command to:
python main.py --remoteThe platform injects
PORTautomatically โ 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-remotecommand 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
aiosqliteEditable 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
Available Tools
12 toolsadd_expenseAdd ExpenseC
Add a new expense to the tracker.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date of expense in YYYY-MM-DD format (e.g. '2026-09-14'). | |
| note | No | Optional free-text description of the expense. | |
| tags | No | Optional comma-separated tags for flexible filtering (e.g. 'work,client-x'). | |
| amount | Yes | Amount spent in INR. Must be greater than 0. | |
| category | Yes | Expense category (e.g. 'food', 'transport'). Must match categories.json. | |
| subcategory | No | Optional sub-category (e.g. 'groceries'). Must match categories.json. | |
| is_recurring | No | Whether this is a recurring expense (e.g. subscription, rent). | |
| payment_method | No | One of: cash, upi, credit_card, debit_card, net_banking, wallet. | cash |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| expense_id | Yes | ID of the expense to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | New date (YYYY-MM-DD). Leave empty to keep current. | |
| note | No | New note. Pass None to keep current. | |
| tags | No | New tags. Pass None to keep current. | |
| amount | No | New amount in INR. Pass 0 to keep current. | |
| category | No | New category. Leave empty to keep current. | |
| expense_id | Yes | ID of the expense to edit. | |
| subcategory | No | New subcategory. Leave empty to keep current. | |
| is_recurring | No | New recurring flag. Pass None to keep current. | |
| payment_method | No | New payment method. Leave empty to keep current. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Optional โ restrict to a single category. | |
| end_date | Yes | End date (YYYY-MM-DD), inclusive. | |
| start_date | Yes | Start date (YYYY-MM-DD). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| month | No | Month in YYYY-MM format (e.g. '2026-09'). Defaults to current month. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| category | Yes | The category to break down (e.g. 'food'). | |
| end_date | Yes | End date (YYYY-MM-DD), inclusive. | |
| start_date | Yes | Start date (YYYY-MM-DD). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| expense_id | Yes | The unique ID of the expense. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| months | No | Number of past months to include (default 6). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Optional โ filter expenses that contain this tag. | |
| limit | No | Max rows to return (default 50). | |
| offset | No | Pagination offset (default 0). | |
| category | No | Optional โ filter by category. | |
| end_date | Yes | End date (YYYY-MM-DD), inclusive. | |
| max_amount | No | Optional โ maximum amount (inclusive, 0 = no upper limit). | |
| min_amount | No | Optional โ minimum amount (inclusive). | |
| start_date | Yes | Start date (YYYY-MM-DD). | |
| subcategory | No | Optional โ filter by subcategory. | |
| payment_method | No | Optional โ filter by payment method. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20). | |
| query | Yes | Search term to look for in the 'note' and 'tags' fields. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| category | Yes | The expense category (must exist in categories.json). | |
| monthly_limit | Yes | Monthly spending limit in INR. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Optional โ restrict to a single category. | |
| end_date | Yes | End date (YYYY-MM-DD), inclusive. | |
| group_by | No | Grouping dimension: 'category' (default), 'subcategory', 'month', 'day'. | category |
| start_date | Yes | Start date (YYYY-MM-DD). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
12 tool updates
v0.1.0- First observed
add_expense - First observed
delete_expense - First observed
edit_expense - First observed
export_expenses - First observed
get_budget_status - First observed
get_category_breakdown - First observed
get_expense - First observed
get_monthly_trend - First observed
list_expenses - First observed
search_expenses - First observed
set_budget - First observed
summarize_expenses
TDQS
Scored across 12 tools
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.
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.
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.
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
Related MCP Connectors
Personal finance for AI agents โ onboard, import statements, categorize & budget over MCP.
- ManiloOAuthapp.manilo
Log, query, and edit expenses, budgets, and accounts in Manilo from any MCP-compatible AI assistant.
- ManiloOAuthapp.ledgy.api
Log, query, and edit expenses, budgets, and accounts in Manilo (formerly Ledgy) from any MCP-compatible AI assistant.
Log, query, and edit expenses, budgets, and accounts in Ledgy from any MCP-compatible AI assistant.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables 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.-
- AlicenseAqualityDmaintenancePersonal expense tracker MCP server that enables tracking expenses, income, budgets, and savings goals through natural language.1013 PyPI1MIT
- AlicenseBqualityAmaintenanceEnables local tracking of personal expenses by adding, listing, summarizing, updating, and deleting expense records stored in a CSV file through an MCP client.5MIT
- FlicenseNot gradedqualityBmaintenanceEnables 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.-