Skip to main content
Glama
anjudevchaudhary0

Expense Tracker MCP

Expense Tracker MCP

A local MCP server that lets an LLM (Claude Desktop, the FastMCP Inspector, or any MCP client) track your expenses and credits in a SQLite database on your machine.

Built with FastMCP.

Features

  • Add, list, update, and delete expenses

  • Track credits (money received) separately from expenses

  • Category / subcategory enforcement — the LLM can only use categories and subcategories you've defined, so entries stay clean and consistent

  • Per-category expense summary

  • Running balance (total credited − total spent)

  • All data stored locally in SQLite — nothing leaves your machine

Related MCP server: ExpenseTracker MCP Server

Project structure

expence-tracker-mcp/
├── server.py                              # entry point used by Claude Desktop / fastmcp CLI
├── src/expence_tracker_mcp/
│   ├── __init__.py                        # server: tools, resource, DB logic
│   ├── category.json                      # editable category → subcategory map
│   └── expenses.db                        # SQLite DB (auto-created on first run, gitignored)
├── pyproject.toml
└── uv.lock

Requirements

  • Python >= 3.13

  • uv

Setup

git clone <this-repo>
cd expence-tracker-mcp
uv sync

uv sync creates a .venv and installs fastmcp and its dependencies.

Running the server standalone

uv run server.py

Running the MCP Inspector (debugger)

Use this to interactively call the tools/resource in a browser before wiring it up to an LLM client.

uv run fastmcp dev inspector server.py

This prints a local URL (with an auth token) — open it in your browser, click Connect, then try the tools from the Tools tab.

Connecting to Claude Desktop

Add an entry to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "ExpenseTracker": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/absolute/path/to/expence-tracker-mcp",
        "fastmcp",
        "run",
        "server.py"
      ]
    }
  }
}

Replace the path with the absolute path to this project on your machine, then fully quit and reopen Claude Desktop (Cmd+Q, not just close the window) to pick up the change.

Tools

Tool

Description

add_expense(date, amount, category, subcategory, note="")

Add a new expense. category and subcategory are required and must come from category.json (see below).

list_expenses(category="", start_date="", end_date="")

List expenses, optionally filtered by category and/or date range (YYYY-MM-DD).

update_expense(id, date="", amount=None, category="", subcategory="", note="")

Update an existing expense. Only the fields you pass are changed.

delete_expense(id)

Delete an expense by id.

add_credit(date, amount, source="", note="")

Add credit (money received) to the tracker.

list_credits(start_date="", end_date="")

List credits, optionally filtered by date range.

summarize_expenses(start_date="", end_date="")

Totals grouped by category, plus overall total_spent.

get_balance()

Returns { total_credited, total_spent, balance }.

Every write tool returns {"status": "ok", ...} on success or {"status": "error", "message": "..."} on failure (e.g. invalid category, record not found) instead of raising — so the calling LLM can see what went wrong and retry.

Resource

Resource

Description

data://categories

The full category → subcategory map from category.json. The LLM is instructed (via the resource description) to always pick category/subcategory from here.

Customizing categories

Edit src/expence_tracker_mcp/category.json — it's read fresh on every tool call, so changes take effect immediately without restarting the server:

{
  "food": ["dining out", "snacks"],
  "travel": ["cab", "flight", "train", "fuel"],
  "rent": ["house rent", "office rent"],
  "groceries": []
}
  • A category must be a top-level key in this file, or add_expense / update_expense will reject it.

  • subcategory is required on add_expense.

  • If a category's subcategory list is non-empty, the subcategory must be one of those exact values.

  • If a category's subcategory list is empty (e.g. "groceries": []), any non-blank subcategory text is accepted — useful for categories too varied to enumerate.

This enforcement happens server-side in add_expense/update_expense, so invalid entries are rejected even if the LLM ignores the data://categories resource.

Database

SQLite database at src/expence_tracker_mcp/expenses.db, auto-created on first run with two tables:

CREATE TABLE expenses(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    date TEXT NOT NULL,
    amount REAL NOT NULL,
    category TEXT NOT NULL,
    subcategory TEXT DEFAULT '',
    note TEXT DEFAULT ''
);

CREATE TABLE credits(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    date TEXT NOT NULL,
    amount REAL NOT NULL,
    source TEXT DEFAULT '',
    note TEXT DEFAULT ''
);

The .db file is gitignored — each machine gets its own local data.

Inspecting the server

Check tool/resource counts without starting a full client:

uv run fastmcp inspect server.py

Available Tools

8 tools
add_creditAdd CreditC

Add credit (money received) to the tracker.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
noteNo
amountYes
sourceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden, but it only states that an add operation occurs. It does not disclose side effects such as whether the balance is affected, whether amounts must be positive, whether records can be duplicated, or any permissions required.

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

Conciseness4/5

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

The single sentence is efficient and free of filler, stating the action and the domain ('tracker') in a few words. It is appropriately compact, though the brevity leaves substantive detail to other dimensions.

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

Completeness2/5

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

The definition is adequate for a trivial add operation but incomplete for an agent: four parameters have 0% schema coverage, no annotations exist, and no guidance is given about parameter semantics or alternatives. An output schema exists, but the description still does not provide enough context for reliable invocation.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must explain the parameters, but it mentions none by name. 'Money received' hints that amount is an inflow and source is where it came from, yet date format, note semantics, and source behavior remain undocumented.

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

Purpose4/5

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

The description uses a specific verb ('Add') and resource ('credit') and clarifies that credit means 'money received,' which separates it from add_expense. It does not explicitly name or contrast sibling tools, but the parenthetical makes the core purpose unambiguous.

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

Usage Guidelines3/5

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

The phrase 'money received' implies the tool is for recording incoming funds, so an agent can infer when to use it versus add_expense or list_credits. However, it gives no explicit guidance about when not to use it or which alternative to prefer.

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

add_expenseAdd ExpenseA

Add a new expense. category and subcategory are required and must come from the data://categories resource. If a category's subcategory list is empty, any descriptive subcategory text is acceptable, but it must not be left blank.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
noteNo
amountYes
categoryYes
subcategoryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the full transparency burden. It clearly indicates the mutating behavior ('Add a new expense') and adds a significant constraint about category/subcategory sourcing. However, it does not mention validation failure behavior, permissions, reversibility, or other side effects beyond the act of adding.

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

Conciseness5/5

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

The description is three sentences with no filler: the first states the action, and the next two deliver the key sourcing constraints. It 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.

Completeness3/5

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

For a simple create tool with an output schema, the description covers the most non-obvious aspect (category/subcategory sourcing) but omits date and amount expectations and gives no sibling-tool routing. It is adequate but leaves clear gaps an agent must resolve elsewhere.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It adds meaningful semantics for category and subcategory, including the empty-subcategory rule, but it provides no guidance on date format, amount constraints, or note semantics, leaving some required parameters underspecified.

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

Purpose5/5

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

The description opens with 'Add a new expense,' a specific verb-resource pair that clearly identifies the tool's function. It also differentiates it from siblings like add_credit and the expense list/update/delete tools by naming the resource type.

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

Usage Guidelines3/5

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

The description provides useful input-level guidance, especially that category and subcategory must come from data://categories, but it does not explicitly say when to prefer add_expense over alternatives like add_credit, nor does it state exclusions or when not to use the tool.

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

delete_expenseDelete ExpenseB

Delete an expense by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It discloses the destructive nature ('Delete') but does not mention irreversibility, cascading effects, authorization requirements, or what happens if the id does not exist. The output schema exists but the description does not clarify the response behavior.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no wasted words. It is appropriately sized for a simple delete operation.

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

Completeness3/5

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

For a simple delete tool with one parameter and an output schema, the description is nearly adequate. However, with no annotations, it lacks behavioral context such as irreversibility and error handling, which an agent would benefit from knowing before invoking a destructive operation.

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

Parameters3/5

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

Schema description coverage is 0%, but the single parameter 'id' is self-explanatory as an integer identifier. The description adds minimal meaning beyond the schema by specifying that deletion is by id, but it does not explain id semantics (e.g., expense id vs. other ids).

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

Purpose4/5

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

The description states a specific verb ('Delete') and resource ('expense') with a clear identifier ('by id'). It is unambiguous and distinguishes from siblings like add_expense, update_expense, and list_expenses, though it does not explicitly name them.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. The description implies usage (delete when you have an expense id) but does not state exclusions or mention related tools like update_expense or list_expenses.

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

get_balanceGet BalanceA

Get total credited, total spent, and remaining balance.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the transparency burden away from structured fields. It communicates that the tool returns three aggregate values and is read-only in nature ('Get'), but it does not disclose the scope of the totals, the exact meaning of 'remaining balance', or whether any side effects exist.

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

Conciseness5/5

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

The description is a single, 10-word sentence with no filler. It front-loads the verb and resource and packs the key output fields into an efficient list.

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

Completeness4/5

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

For a simple zero-parameter getter with an output schema, the description is largely complete: it names the returned values and no input is required. It loses one point for not clarifying the aggregation scope and for leaving the distinction from summarize_expenses unstated.

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

Parameters4/5

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

The tool has zero parameters and the schema is fully described, so the baseline is high. The description adds useful context about the computed output but doesn't need to clarify any parameter behavior because there are no parameters.

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

Purpose4/5

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

The description uses the specific verb 'Get' and identifies a clear resource, 'balance', listing the exact returned aggregates (credited, spent, remaining). This makes the tool's purpose obvious, though it does not explicitly differentiate it from the sibling summarize_expenses or list_* tools.

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

Usage Guidelines2/5

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

There is no guidance on when to call this tool instead of list_expenses, list_credits, summarize_expenses, or the mutation tools. The intended context is only implied by the name and description, leaving selection decisions to inference.

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

list_creditsList CreditsB

List credits, optionally filtered by date range (YYYY-MM-DD).

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. 'List' implies a read-only operation, and the date-range note adds some behavior context, but the description does not disclose whether unfiltered calls return all credits, how results are ordered, or any response characteristics beyond what the output schema already provides.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no filler. Every word contributes meaning, and the optional date-range behavior is stated immediately after the core purpose.

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

Completeness3/5

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

For a simple two-parameter list tool with an output schema, the description covers the essential call shape. It is incomplete in that it lacks usage guidance and behavior details, but the low complexity and presence of an output schema reduce the burden on the description.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It adds the date format (YYYY-MM-DD) and clarifies that filtering is optional, which helps interpret start_date and end_date. However, it does not explain the exact meaning of each parameter, such as whether the range is inclusive or what an empty default represents.

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

Purpose4/5

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

The description states a clear verb-resource pair: 'List credits' with an optional date range. It is specific enough to distinguish from the sibling tools at a basic level, though it does not explicitly differentiate itself from related list tools like list_expenses.

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

Usage Guidelines2/5

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

The description gives no guidance on when to use this tool versus alternatives such as list_expenses, add_credit, or summarize_expenses. It mentions the optional date filter but does not explain in what scenarios filtering would be appropriate or how it relates to other credit/expense tools.

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

list_expensesList ExpensesA

List expenses, optionally filtered by category and/or date range (YYYY-MM-DD).

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNo
end_dateNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden of behavioral disclosure. It does disclose that filtering by category and/or date range is optional and specifies the date format YYYY-MM-DD. However, it does not mention default behavior when no filters are supplied, ordering, pagination, or whether date bounds are inclusive. This is adequate for a simple read operation but leaves some behavioral gaps.

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

Conciseness5/5

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

The description is a single, focused sentence with no wasted words. The primary action is front-loaded, and the optional filtering and date format are presented clearly and compactly.

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

Completeness4/5

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

For a simple read-only list tool with three optional parameters and an output schema present, the description is mostly complete. It explains the filtering capabilities and date format, and the output schema presumably covers return values. It lacks only a note about default results when no filters are applied, which is a minor gap given the tool's simplicity.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It mentions category and date range, which maps to the three parameters, and adds the date format YYYY-MM-DD. Still, it does not individually define each parameter or clarify whether start_date and end_date are both required for a range, though their semantics are reasonably inferable from their names.

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

Purpose5/5

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

The description begins with a specific verb and resource: 'List expenses'. It also states the optional filters (category and date range) and the date format, making the tool's purpose immediately clear. It is distinguishable from siblings like list_credits and summarize_expenses because it targets expenses specifically and is a list operation.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives such as summarize_expenses for aggregation or get_balance for balances. It does not mention exclusions, prerequisites, or cases where a sibling should be preferred. The usage context is only implied by the verb 'List'.

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

summarize_expensesSummarize ExpensesB

Summarize expenses by category, optionally filtered by date range (YYYY-MM-DD).

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does not explicitly state that this is a read-only query, what the summary output contains, or how empty or unfiltered results behave.

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

Conciseness5/5

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

The description is a single efficient sentence, front-loaded with the action and resource, with no filler or repetition of the tool name.

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

Completeness3/5

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

The core purpose is clear and the output schema covers return-value structure, but the lack of usage routing and behavioral transparency leaves meaningful gaps for a tool with no annotations. It is adequate but not fully complete.

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

Parameters4/5

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 meaningfully identifies the two parameters as an optional date range and specifies the YYYY-MM-DD format. It stops short of explaining endpoint edge cases like inclusivity or whether both dates must be provided together.

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

Purpose4/5

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

The description states a specific verb and resource: 'Summarize expenses by category'. This makes the aggregation intent clear and separates it from the itemized expense/credit sibling tools, though it does not explicitly name an alternative tool.

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

Usage Guidelines2/5

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

No guidance is given about when to use this tool versus list_expenses or get_balance. The optional date-range note describes how to filter, but does not provide tool-selection context, exclusions, or alternatives.

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

update_expenseUpdate ExpenseA

Update an existing expense. Only provided fields are changed. category and subcategory must come from the data://categories resource.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
dateNo
noteNo
amountNo
categoryNo
subcategoryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose that only provided fields are changed (partial update), which is valuable. However, it doesn't mention side effects, like whether the update is idempotent or if missing fields are reset to defaults, which the schema defaults might imply. It also doesn't describe error behavior or authentication needs, but that may be out of scope.

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

Conciseness5/5

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

The description is two sentences with no fluff. It front-loads the main purpose and immediately clarifies the partial update behavior and the constraint. Every word earns its place.

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

Completeness3/5

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

The tool has 6 parameters and an output schema, but no annotations. The description covers the partial update and one constraint, but lacks details on the effect of default values when fields are omitted (e.g., does omitting 'date' reset it to empty string?), which is crucial for correct usage. It also doesn't mention the output format, but the output schema exists, so that's covered. The main gap is parameter behavior nuances.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate, but it only mentions the category/subcategory constraint. It doesn't explain the id parameter beyond being required, nor the semantics of date, note, amount, or the null allowed for amount. However, the schema itself provides type and default information, which helps. The description adds a critical constraint for category/subcategory, giving some value.

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

Purpose4/5

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

The description clearly states it updates an existing expense, which is a specific verb and resource. It partially distinguishes from siblings like add_expense and delete_expense, but not explicitly. The mention of partial update (only provided fields) adds important behavioral nuance.

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

Usage Guidelines3/5

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

It doesn't explicitly say when to use this tool versus alternatives, but the description implies it is for modifying existing expenses, which differentiates from adding or deleting. The constraint on category and subcategory from data://categories is useful but not a full usage guideline. It lacks exclusions or conditions for when not to use it.

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

Tool Schema Changelog

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

  1. 8 tool updatesv0.1.0
    • First observedadd_credit
    • First observedadd_expense
    • First observeddelete_expense
    • First observedget_balance
    • First observedlist_credits
    • First observedlist_expenses
    • First observedsummarize_expenses
    • First observedupdate_expense

TDQS

A3.7/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct resource and action: expenses have add/list/update/delete, credits have add/list, and summarize/get_balance provide reporting. There is no meaningful overlap or ambiguity between tools.

Naming Consistency5/5

All tools follow a clear verb_noun snake_case pattern. List operations use plural nouns (list_expenses, list_credits) while singular entity operations use singular nouns, which is a predictable and consistent convention.

Tool Count5/5

Eight tools is well-scoped for an expense tracker: full CRUD for expenses, credit tracking, and balance/summary reporting. Each tool earns its place without redundancy or bloat.

Completeness4/5

Expenses have complete CRUD coverage and reporting is solid, but credits only support add and list with no update or delete. This is a minor gap that agents can work around by re-adding corrected credits, but it is a slight lifecycle gap.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    C
    quality
    D
    maintenance
    Enables personal expense management with SQLite storage, allowing users to add, update, delete, list, and summarize expenses by category through natural language interactions.
    5
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to manage personal expenses by adding, querying, and summarizing expense data through a SQLite database and configurable categories.
    1
    GPL 3.0
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables management of expenses via SQLite database, including adding, listing, updating, deleting, filtering, and summing expenses through natural language.
    -