Expense Tracker MCP
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., "@Expense Tracker MCPhow much did I spend on dining last 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.
Expense Tracker MCP
A powerful FastMCP server for tracking expenses with full CRUD, budgets, recurring expenses, and reporting capabilities.
Quick Start
Local Development:
# Install dependencies
uv sync
# Run server
uv run python main.py
# Test with inspector
uv run fastmcp inspector main.py:mcpHorizon Deployment: See HORIZON_SETUP.md for step-by-step instructions.
Related MCP server: Trackor
Features
Core:
✅ Add, update, delete, and list expenses
✅ Categorized expenses with subcategories
✅ Case-insensitive category matching with fuzzy suggestions
Advanced:
✅ Monthly budgets with spending alerts
✅ Recurring expenses (auto-generate monthly)
✅ CSV export with filtering
✅ Monthly trend reports
API:
🛠️ 14 Tools - Full expense management
📖 3 Resources - Recent, summary, categories
💬 2 Prompts - Weekly report, categorize expense
Directory Structure
data/ → Database (expenses.db)
config/ → Configuration (categories.json)
exports/ → Generated CSV files
logs/ → Application logsSee DIRECTORY_STRUCTURE.md for details.
Tools
Tool | Purpose |
| Add new expense |
| Get expense by ID |
| Update expense |
| Delete expense |
| List all expenses |
| Summary by category |
| Set category budget |
| Check budget usage |
| Add recurring item |
| List recurring items |
| Generate due items |
| Export to CSV |
| Monthly analytics |
Environment Variables
EXPENSE_TRACKER_DB_PATH=/path/to/expenses.db # Database location
EXPENSE_TRACKER_CONFIG_PATH=/path/to/categories.json # Config locationTechnology Stack
Python 3.12+
FastMCP 3.4.7+ - MCP server framework
aiosqlite - Async SQLite
asyncio - Async I/O
Deployment
Local: uv run python main.py
Docker:
docker build -t expense-tracker .
docker run -v expense_data:/data expense-trackerHorizon: See HORIZON_SETUP.md
License
MIT
Available Tools
13 toolsadd_expenseC
Add a new expense to the tracker.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | ||
| category | Yes | ||
| description | Yes | ||
| subcategory | No | ||
| expense_date | No |
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 burden of behavioral disclosure, but it only states that an expense is added. It does not mention validation, required fields, idempotency, date handling, or any side effects beyond the creation itself, which is thin for a write operation.
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 words. It is concise and easy to parse, though the phrase 'to the tracker' adds little substance and the description could have used the space to communicate more useful details.
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 tool with no annotations, five parameters, and zero schema descriptions, the description is incomplete. It omits what the required fields represent, how dates should be formatted, and how this creation compares to recurring expense creation; an output schema does not compensate for these calling-semantics 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 0%, and the description provides no compensation by explaining the meaning of amount, category, subcategory, or expense_date. The agent gets no additional semantic value beyond the parameter names in 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 clearly states a specific verb and resource: 'Add a new expense to the tracker.' However, it does not explicitly distinguish this from the sibling add_recurring_expense, leaving whether this is a one-time or recurring expense to be inferred from the tool name rather than the description.
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 no indication of when to use this tool versus update_expense or add_recurring_expense. There are no preconditions, exclusions, or alternative routing, so an agent must rely entirely on tool names to make the correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_recurring_expenseC
Add a recurring monthly expense.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | ||
| category | Yes | ||
| description | Yes | ||
| subcategory | No | ||
| day_of_month | No |
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 the full behavioral burden, but says only 'Add' without disclosing side effects, interaction with generate_due_recurring_expenses, or defaults such as day_of_month=1. It confirms a create operation but nothing else.
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 fluff, which is structurally clean, but it is under-specified rather than efficiently complete.
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 5-parameter creation tool with no annotations and no parameter documentation, the description is far from complete; it does not explain what a recurring expense is, how scheduling works, or what the output schema contains.
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 0% and the description mentions no parameters, leaving the meaning of fields like category, day_of_month, and subcategory entirely undocumented.
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?
States a clear verb 'Add' and resource 'recurring monthly expense' with a frequency qualifier, distinguishing it from the sibling add_expense for one-time expenses. It does not explicitly name the sibling, so it stops short of full differentiation.
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?
Provides no guidance on when to use this tool versus add_expense or list_recurring_expenses, and no mention of prerequisites or scenarios. Usage is only implied by the word 'recurring'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_budget_statusC
Check spending against budget for a category/month.
| Name | Required | Description | Default |
|---|---|---|---|
| month | No | ||
| category | No |
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 burden of behavioral disclosure. It implies a read-only comparison ('Check spending against budget'), but does not explain what happens when no category or month is provided, how missing budgets are handled, or whether this aggregates expense data on the fly.
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 conveys the core purpose efficiently, though it sacrifices some useful detail for brevity.
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 output schema exists, so return values may be covered elsewhere, but the description still lacks key context: optional parameters with defaults of null mean an agent has no guidance on how the tool behaves when invoked with zero, one, or both filters. It also does not distinguish this tool from monthly_report or summarize_expenses, leaving meaningful invocation ambiguity.
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 0%, so the description must add meaning to the parameters. It does reference both 'category' and 'month', which maps directly to the two schema properties, adding some context beyond bare string names. However, it does not clarify formats, optionality behavior, or whether both parameters should be supplied together.
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 identifies the action ('Check spending against budget') and the resource scope (budget for a category/month). It is distinct enough from sibling tools like set_budget or list_expenses, though it does not explicitly name alternatives or contrast itself with them.
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 siblings such as monthly_report, summarize_expenses, or set_budget. The description implies it is for checking budget status, but it never states prerequisites, when this should be preferred, or when another tool would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_expenseB
Delete an expense.
| Name | Required | Description | Default |
|---|---|---|---|
| expense_id | Yes |
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 burden of behavioral disclosure. It only says 'Delete an expense' and does not mention whether deletion is permanent, reversible, cascading, or restricted by permissions. An agent cannot infer the consequences of calling this tool beyond the basic destructive action implied by the word 'delete'.
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?
'Delete an expense.' is extremely concise and contains no filler or redundant wording. It is appropriately sized for a simple tool and the core action is front-loaded and immediately clear.
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 destructive operation with no annotations, the description is incomplete. It does not mention irreversibility, side effects, permissions, or any caveats about what happens to related data. Although the tool has only one parameter and an output schema exists, the lack of behavioral and usage context makes the definition insufficient for safe and 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?
The schema description coverage is 0%, and the description does not mention expense_id or its meaning. The schema does define expense_id as a required integer, but the description adds no helpful context about what the ID refers to, how to obtain it, or any constraints. Because the coverage is low, the description should compensate, but it does not.
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 specific verb 'Delete' and the resource 'an expense', which clearly distinguishes this tool from siblings like add_expense, update_expense, get_expense, and list_expenses. Even though it is terse, an agent can immediately understand what this tool does and how it differs from related operations.
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 no guidance on when to use this tool versus alternatives, such as when an expense should be permanently removed versus updated or archived. It also provides no exclusions, prerequisites, or conditions that should be checked before calling delete_expense.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_expenses_csvB
Export expenses to a CSV file.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | ||
| end_date | No | ||
| start_date | No |
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. It states the core action and result (exports to CSV), which is helpful, but it does not disclose whether the export is scoped to all expenses by default, how filters affect the output, or what the returned CSV/output schema represents. No contradictions with annotations exist because none are provided.
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 conveys the core operation without filler. Every word earns its place, and the format is immediately scannable.
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 tool with three optional parameters and no annotations, the description is minimally sufficient but leaves gaps: it never states that category/start_date/end_date filter the export, nor what columns or date format the CSV uses. The presence of an output schema helps, but the description alone would not fully prepare an agent to use the filters 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 description coverage is 0%, so the description must compensate. It does not: category, start_date, and end_date are never mentioned. The parameter names are self-explanatory and the schema shows defaults of null, but no format, filtering rule, or inclusive/exclusive behavior is documented.
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 ('export') with a clear resource ('expenses') and output format ('CSV file'). This unambiguously distinguishes it from sibling tools like list_expenses or summarize_expenses, which present data in other forms.
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 on when to use this tool versus alternatives such as monthly_report, list_expenses, or summarize_expenses. It also doesn't explain that the optional parameters act as filters or mention any prerequisites. The only implied context is the tool name itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_due_recurring_expensesB
Generate expenses for recurring items that are due.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 of behavioral disclosure. 'Generate' may imply creating expense records, but the description does not say whether this is a persistent write operation, whether it is idempotent, or whether it affects the recurring expense definitions. This is a significant gap for a tool that likely mutates state.
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 wasted words. It communicates the core action and condition efficiently.
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 zero parameters and an output schema present, the description is minimally adequate. However, the lack of annotation coverage and the missing clarification of side effects or execution semantics leave an agent with incomplete context for a generation/mutation tool.
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 tool has zero parameters, so the baseline of 4 applies. The description does not need to explain parameter semantics because there are none to document.
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 names a specific action (generate), a resource (expenses), and a clear qualifier (recurring items that are due). This distinguishes it from generic expense tools, though it does not explicitly call out sibling tools.
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 'due' condition implies when the tool should be used, but there is no explicit guidance about when not to use it or how it differs from alternatives like add_expense or add_recurring_expense. Usage context is implied, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expenseA
Get a single expense by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| expense_id | Yes |
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. 'Get' clearly indicates a non-mutating read operation, but the description does not mention behavior for missing IDs, permissions, or error cases. This is acceptable for a simple getter but leaves some ambiguity.
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 filler or redundancy. Every word contributes to understanding the tool's core behavior.
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 getter with an output schema, the description is nearly complete. It covers what the tool does and how the parameter is used. It could mention not-found behavior, but the output schema likely handles return-value documentation, so nothing critical is missing.
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 0%, but the description does add meaning by identifying the parameter as the lookup key for a single expense. However, the parameter name 'expense_id' is already self-descriptive, and the description adds minimal detail 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 uses a specific verb ('Get'), a concrete resource ('expense'), and a precise selection mechanism ('by ID'). It clearly distinguishes this tool from broader tools like list_expenses or summarize_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 'single expense by ID' clearly implies the tool is for retrieving one specific expense when its ID is known. It doesn't explicitly name alternatives or exclusion conditions, but the singular 'by ID' provides enough context to select it over list-style siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_expensesA
List all expenses or filter by category.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It accurately states the core behavior (list with optional filter), but omits details such as whether recurring expenses are included, ordering or pagination behavior, and any read-only assurances.
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 sentence that front-loads the main action and contains no filler. It is minimally sized yet sufficiently informative for a simple list tool.
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 list tool with an output schema, the description is adequate but leaves gaps: no mention of pagination, sorting, whether recurring expenses are included, or when to use alternatives like summarize_expenses or export_expenses_csv.
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 has no description for 'category' (0% coverage). The description adds meaning by explaining that category is a filter and that omitting it lists all expenses, compensating for the schema gap. It does not specify allowed category values or format.
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 verb ('List') and resource ('expenses'), and notes the optional category filter. It is clear, though it does not explicitly distinguish from sibling tools like list_recurring_expenses or export_expenses_csv.
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 retrieving expense records, optionally filtered by category, but provides no explicit guidance on when to prefer this over list_recurring_expenses, summarize_expenses, or export_expenses_csv, and no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recurring_expensesC
List all recurring expenses.
| Name | Required | Description | Default |
|---|---|---|---|
| active_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It says 'all recurring expenses' but the schema shows an active_only parameter that defaults to true, implying inactive recurring expenses are excluded unless the caller opts out. This filtering behavior is not disclosed, nor is any pagination or ordering.
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 concise sentence with no filler or redundant phrasing. It front-loads the core action and resource, though it is too sparse to be fully helpful.
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 tool with one optional parameter, no annotations, and sibling tools covering recurring expenses, the description should explain the active_only default and how this list differs from alternatives. An output schema exists, so return-value details are less necessary, but the semantic gap around filtering and default behavior remains significant.
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 0%, so the description must compensate for the undocumented parameter. It does not mention active_only at all or explain how the default affects results. The parameter name and type are self-explanatory to some degree, but the description adds no semantic value and even conflicts with the default behavior.
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 clear verb ('List') and a specific resource ('recurring expenses'), and it distinguishes the tool from the general 'list_expenses' sibling by the recurring-expense scope. The word 'all' gives a sense of scope, though it is slightly undercut by the active_only default.
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 no guidance on when to use this tool versus alternatives such as generate_due_recurring_expenses or list_expenses. There is no mention of filtering, scheduling contexts, or situations where another tool would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monthly_reportC
Generate a monthly expense report.
| Name | Required | Description | Default |
|---|---|---|---|
| months | No |
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 must carry the behavioral disclosure burden. It does not state whether this is read-only, what format the report takes, what data is included, or whether it has side effects like file generation or email delivery.
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 short, focused sentence with no filler or redundancy. It is front-loaded with the action and object, though it sacrifices useful detail for brevity.
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 a single optional parameter, no annotations, and multiple closely related sibling tools, this description is too thin. An agent cannot confidently decide when to call this versus summarize_expenses or export_expenses_csv, nor understand how 'months' shapes the report. The existence of an output schema helps, but not enough.
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 coverage is 0% and the description never mentions the 'months' parameter. The agent is left to infer that it controls the reporting period, and the default of 6 is only visible in the schema, not explained in context.
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 clear action and object: 'Generate a monthly expense report.' It is not vague or tautological, but it does not differentiate itself from sibling tools like summarize_expenses or export_expenses_csv, which could overlap in purpose.
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 on when to use this tool versus alternatives such as summarize_expenses or list_expenses. The word 'monthly' implies a cadence, but there is no explicit context, prerequisites, or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_budgetA
Set or update a budget for a category.
| Name | Required | Description | Default |
|---|---|---|---|
| category | Yes | ||
| monthly_limit | Yes |
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 present, so the description carries the disclosure burden. 'Set or update' reveals upsert semantics and signals a write operation, which is genuinely useful. It does not mention side effects, validation rules, or permissions, but the core mutating behavior is transparent.
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 compact sentence with no filler. The verb and target are front-loaded, and every word serves the core message, making it highly scannable for an agent.
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: two scalar required parameters and no nested objects, and an output schema exists so return values need not be described. However, the missing parameter semantics and the lack of behavioral detail beyond 'set or update' make this only minimally adequate for correct invocation in a broader domain.
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 0%, so the description must compensate by explaining parameter meaning. It names 'category' but never describes 'monthly_limit' as the recurring budget amount or cap, leaving half the parameters under-specified. The parameter name and type make the intended meaning partly recoverable, but the description itself adds little.
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 verb pair, 'set or update', and a specific resource, 'budget for a category', making the operation unmistakable. It also differentiates from the sibling check_budget_status through its write-oriented verb, even without naming that sibling.
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 the tool: whenever the user wants to create or modify a category budget. However, it provides no explicit guidance about alternatives, such as using check_budget_status for read-only status checks, so usage 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.
summarize_expensesB
Summarize expenses by category with optional date range and category filter.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | ||
| end_date | No | ||
| start_date | No |
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 burden of behavioral disclosure. It states the aggregation intent ('summarize by category') but does not describe how dates are handled, whether results are counts or totals, or any other behavioral traits. This is minimal context beyond the tool name.
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 concise sentence with the core action front-loaded. It wastes no words, though it may be too sparse to carry all necessary context on its own.
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 relatively simple with three optional parameters and an output schema present, so the description is minimally viable. However, missing date format details and lack of usage guidance relative to sibling reporting tools leave meaningful 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 0%, so the description must compensate, but it only reiterates that filters are optional. It does not specify date format, how 'category' matches the data, or the meaning of null/default values. This is better than no parameter insight but still incomplete.
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 ('summarize') and resource ('expenses'), and clearly identifies the grouping dimension ('by category') and optional filters. It is distinct enough from list_expenses, though it does not explicitly differentiate itself from monthly_report.
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 usage by naming optional date range and category filter, but it does not state when to prefer this tool over siblings like list_expenses, monthly_report, or export_expenses_csv. No exclusion or alternative guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_expenseC
Update an existing expense.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | ||
| category | No | ||
| expense_id | Yes | ||
| description | No | ||
| subcategory | No | ||
| expense_date | No |
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 must disclose behavior on its own. It only states that an update occurs; it does not say whether unspecified fields are preserved or reset, how invalid IDs are handled, or whether permissions are required. This is a significant gap for a mutation tool.
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 single sentence is terse, but this is under-specification rather than effective conciseness. There is ample room to add key usage details without becoming verbose.
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 tool with six parameters, an output schema, and no annotations, this description is far from complete. It does not specify what fields can be modified, whether partial updates are supported, or what the response contains; the presence of an output schema does not compensate for missing input and behavior context.
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 0% and the description names none of the six parameters. The agent must rely entirely on the raw schema, with no clarification of the required expense_id, optional fields, or default-to-null behavior. The description adds no value 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 names the action 'update' and the resource 'existing expense', and the qualifier 'existing' distinguishes it from add_expense. However, it is essentially a restatement of the tool name and provides no details on scope or which fields are affected.
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 use this tool versus siblings such as add_expense or delete_expense. The only implied context is that the expense must already exist; there are no exclusions or alternative routing.
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.
13 tool updates
v0.1.0- First observed
add_expense - First observed
add_recurring_expense - First observed
check_budget_status - First observed
delete_expense - First observed
export_expenses_csv - First observed
generate_due_recurring_expenses - First observed
get_expense - First observed
list_expenses - First observed
list_recurring_expenses - First observed
monthly_report - First observed
set_budget - First observed
summarize_expenses - First observed
update_expense
TDQS
Scored across 13 tools
Most tools target a clear, distinct action: CRUD operations on expenses, recurring expenses, budgets, and reporting. Some overlap exists between monthly_report and summarize_expenses, as both provide aggregated views, but their descriptions sufficiently clarify the monthly vs. customizable category/date scope.
The majority of tools follow a consistent verb_noun snake_case pattern (add_expense, get_expense, list_expenses, set_budget). The main deviation is monthly_report, which is a noun phrase rather than a verb-led name, making the set slightly less uniform but still predictable.
Thirteen tools is appropriate for an expense tracker covering core CRUD, recurring expenses, budgets, reporting, and export. Each tool addresses a meaningful aspect of the domain without excessive duplication or unnecessary surface area.
Expense CRUD is complete, with solid support for recurring expense generation, budgets, summaries, and export. Minor gaps exist: recurring expenses can be added and listed but not updated or deleted, and there is no explicit budget deletion, though these are workable limitations.
Maintenance
Related MCP Connectors
Personal finance by conversation: expenses, receipts, statement import, budgets, net worth.
- ManiloOAuthapp.ledgy.api
Log, query, and edit expenses, budgets, and accounts in Manilo (formerly Ledgy) from any MCP-compatible AI assistant.
- ManiloOAuthapp.manilo
Log, query, and edit expenses, budgets, and accounts in Manilo from any MCP-compatible AI assistant.
Log expenses, receipts and mileage from chat: auto-categorise, split VAT, summarise, export, rebill.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to manage personal expenses through natural language conversations. Supports adding, searching, and analyzing transactions with automatic categorization and financial insights.3MIT
- FlicenseNot gradedqualityDmaintenanceEnables users to track and manage personal expenses through natural language, including adding entries, filtering by date/category, viewing statistics, and exporting data in JSON or CSV format.3-
- FlicenseNot gradedqualityDmaintenanceEnables users to track expenses by adding, listing, and summarizing them with category support through natural language.-
- FlicenseNot gradedqualityDmaintenanceEnables AI-driven expense tracking and budget management, including adding expenses, setting budgets, analyzing trends, forecasting, and managing savings goals via natural language.-