expenselm-mcp-server
OfficialClick 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., "@expenselm-mcp-serverwhat did I spend on travel 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.
ExpenseLM MCP Server
Introduction
MCP server for ExpenseLM.
ExpenseLM is an easy to use, GenAI powered Expense Management application. From expense recording to expense insights and advice, ExpenseLM puts you in control of your money like never before. MCP server enables access to your expense data with your favorite AI Agent.
mcp-name: io.github.clarenceh/expenselm-mcp-server
Related MCP server: Expense_Tracker_MCP
Installation
Prerequisites
uv
Python 3.9+
ExpenseLM API key (Instructions)
Setup MCP Client
Claude Desktop (Mac)
Add the following MCP server in your Claude Desktop configuration.
Config file (create if not exists): ~/Library/Application Support/Claude/claude_desktop_config.json
Add the following into your config file (replace the value of EXPENSELM_API_KEY with your own key).
{
"mcpServers": {
"expenselm": {
"command": "uvx",
"args": [
"expenselm-mcp-server"
],
"env": {
"EXPENSELM_API_KEY": "Replace with your ExpenseLM API Key",
"MCP_TIMEOUT": "200000"
}
}
}
}Claude Desktop (Windows)
Add the following MCP server in your Claude Desktop configuration.
Config file (create if not exists): %AppData%\Claude\claude_desktop_config.json (e.g. C:\Users[YourUsername]\AppData\Roaming\Claude\claude_desktop_config.json)
Add the following into your config file (replace the value of EXPENSELM_API_KEY with your own key).
{
"mcpServers": {
"expenselm": {
"command": "uv",
"args": [
"tool",
"run",
"expenselm-mcp-server"
],
"env": {
"EXPENSELM_API_KEY": "Replace with your ExpenseLM API Key",
"MCP_TIMEOUT": "200000"
}
}
}
}Perplexity Desktop (Mac)
In Perplexity Desktop for Mac, navigate to "Settings" -> "Connectors". Click "Add Connector".
Enter ExpenseLM MCP Server configuration like the below screenshot. Replace the environment variable "EXPENSELM_API_KEY" with your own key.

Publish new version
Available Tools
10 toolsdownload_expense_receipt_imageA
Download an expense receipt image from the backend API.
Args: expense_id: The ID of the expense to download the receipt image for thumbnail: Whether to download the thumbnail version (default: False)
Returns: dict containing the image data (base64 encoded), content type, and metadata
| Name | Required | Description | Default |
|---|---|---|---|
| thumbnail | No | ||
| 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. It does detail the return format (base64 image data, content type, metadata) and the thumbnail default, which is useful. However, it doesn't mention that this is a read-only operation, any required permissions, or potential failure modes, leaving some important behavior undisclosed.
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 well-organized with a front-loaded purpose sentence followed by structured Args and Returns sections. It is concise and stays on topic, though the Returns section may partially duplicate what an output schema already provides.
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 simple nature of the tool (two parameters, one required, output schema present), the description covers all essential aspects: purpose, parameter meanings, and return value. It lacks explicit usage and edge-case behavior, but for this complexity level the completeness is strong.
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 fully compensates by clearly explaining both parameters: expense_id as the expense identifier and thumbnail as a boolean flag with its default value. This gives an agent everything needed to fill the parameters correctly.
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 opens with a clear, specific verb and resource: 'Download an expense receipt image from the backend API.' This distinctly separates it from the get_* summary tools and the save_expense_receipt_image sibling, making the tool's purpose immediately identifiable.
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 usage context is implied by the verb 'download' versus the 'save' sibling, but no explicit guidance is given about when to choose this tool over alternatives like get_expense_by_id or save_expense_receipt_image. There are no exclusions or conditions stated, so an agent must infer usage from the name and description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expense_by_idA
Get an expense record by id.
Args: id: The id of the expense.
Returns: ExpenseImageData: The expense record.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| image | No | The expense image |
| expense | No | The extracted expense data |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the transparency burden. It discloses the operation (get), the return type (ExpenseImageData), and implies a read-only action, but it does not mention behavior such as not-found errors, authentication requirements, or potential side effects.
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 compact and well-organized with Args and Returns sections. There is no filler, though the Returns line is minimal and could be more informative.
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 one-parameter getter with an output schema, the description is mostly sufficient: it states the purpose, the parameter, and the return type. It lacks explicit usage guidance and error behavior, but these are minor for this tool's simplicity.
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 description only restates the parameter with 'id: The id of the expense,' which adds little beyond the schema's name and type. With 0% schema description coverage, the description fails to provide meaningful context such as id format, source, or validation rules.
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: 'Get an expense record by id.' This distinguishes it from sibling tools that list expenses or summarize them, and the single-parameter design reinforces the 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?
Usage is implied by the phrase 'by id'—use this when you have a specific expense id and need the full record. However, there is no explicit mention of when not to use it or how it compares to sibling tools like get_latest_expenses or summaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expense_count_by_periodA
Get expense count for the provided period.
Example usage: When user want to perform analytics for a period, first use this method to get the count of total expenses first. Then can use the get_latest_expenses tool to fetch the expenses by page to get all records.
Args: from_date (required): The start date for filtering. Format is YYYY-MM-DD. to_date (required): The end date for filtering. Format is YYYY-MM-DD.
Returns: int: The count of expense reocrds for the period.
| Name | Required | Description | Default |
|---|---|---|---|
| to_date | Yes | ||
| from_date | Yes |
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 must carry the disclosure burden. It discloses the return type (int) and the required date format, but it does not explicitly state read-only behavior, date-boundary inclusivity, timezone handling, or error behavior. This is adequate for a simple count query but not fully 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 well organized with a purpose statement, example usage, args, and returns. It is front-loaded with the main purpose and the example workflow earns its place, though there is a minor typo and slight redundancy in 'count of total expenses first.'
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 only two required parameters and a simple integer return, the description is reasonably complete: it covers what the tool returns, the arguments, and a practical workflow with a sibling tool. It does not mention edge cases or explicitly address subscription-specific alternatives, but these are not critical for this tool's simple scope.
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 provides only type and titles for from_date and to_date with 0% description coverage. The tool description adds meaningful semantics by calling them 'start date for filtering' and 'end date for filtering' and specifying the exact format YYYY-MM-DD. This goes well beyond the schema, though it leaves date inclusivity or timezone unspecified.
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: 'Get expense count for the provided period.' It also explains that the result is the count of total expense records, which distinguishes it from tools that return summaries, receipts, or individual 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?
It gives a concrete workflow: use this tool first to get the count, then use get_latest_expenses to fetch records by page. This is clear context for when to call it, though it does not explicitly contrast it with subscription-specific count or summary tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expense_summary_by_category_by_currencyA
Get expense summary by category and currency for the provided period.
Args: from_date (required): The start date for filtering. Format is YYYY-MM-DD. to_date (required): The end date for filtering. Format is YYYY-MM-DD.
Returns: list[CategoryCurAmtStatItem]: The expense summary by category and currency.
| Name | Required | Description | Default |
|---|---|---|---|
| to_date | Yes | ||
| from_date | Yes |
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 behavioral burden. It does disclose that the operation filters by from_date/to_date and returns a list of CategoryCurAmtStatItem objects. However, it does not explicitly state read-only status, authentication requirements, date boundary inclusivity, currency conversion behavior, or empty/error results. Acceptable for a simple getter, but not fully 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 compact and front-loaded with a one-sentence functional summary, followed by clean Args and Returns sections. Every sentence contributes useful information, and there is no redundant filler or restatement of obvious details. The structure makes the essential invocation details 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 two-parameter tool with an output schema present, the description provides the necessary invocation details: required dates and their formats. It is slightly incomplete in that it does not offer selection guidance among sibling summary tools or clarify behavior around date bounds or grouping edge cases, but nothing essential for calling it correctly 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?
The input schema only provides string types and titles, with 0% schema description coverage. The description fully compensates by naming both parameters, marking both as required, specifying the YYYY-MM-DD format, and explaining their filtering roles. This gives the agent exactly the semantic information needed to construct a valid call.
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 opens with a clear, specific verb and resource: 'Get expense summary by category and currency for the provided period.' The category/currency grouping is explicit and distinguishes this tool from siblings that group by month or subscription. The purpose is immediately understandable and 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 description implies the tool should be used when an expense summary by category, currency, and date range is needed. However, it does not mention when not to use it or point to any of the related sibling tools as alternatives. The usage context is clear but entirely implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expense_summary_by_month_by_currencyA
Get expense summary by month and currency for the provided period.
Args: from_date (required): The start date for filtering. Format is YYYY-MM-DD. to_date (required): The end date for filtering. Format is YYYY-MM-DD.
Returns: list[MonthCurAmtStatItem]: The expense summary by month and currency. For month, the format is YYYY-MM.
| Name | Required | Description | Default |
|---|---|---|---|
| to_date | Yes | ||
| from_date | Yes |
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, and it does disclose the return type (list of MonthCurAmtStatItem), the month format (YYYY-MM), and the date formats for parameters. It does not mention inclusivity of dates or empty-result behavior, but for a read-only summary tool this is reasonably 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 compact and front-loaded with the core purpose, followed by concise parameter and return information. No filler sentences exist; every element contributes to correct invocation.
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 two-parameter summary tool, the description covers the date range, required parameters, grouping, return type, and output date format. It lacks only non-essential details such as date inclusivity, ordering, or handling of empty results, so it is nearly complete.
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%, yet the description fully compensates by documenting both parameters with their required status, filtering role, and exact YYYY-MM-DD format. This adds meaningful semantics beyond the bare schema titles.
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 that the tool gets expense summaries aggregated by month and currency over a date range. This verb+resource+grouping is specific and distinguishes it from sibling summary tools like get_expense_summary_by_category_by_currency and get_expense_summary_by_subscription_by_currency.
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 for period-based monthly/currency summaries, but it does not explicitly state when to choose this tool over the sibling summary tools. No exclusions or alternative routing are provided, so the usage context is only inferred from the name and grouping description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expense_summary_by_subscription_by_currencyA
Get expense summary by subscription and currency for the provided period.
Args: from_date (required): The start date for filtering. Format is YYYY-MM-DD. to_date (required): The end date for filtering. Format is YYYY-MM-DD.
Returns: list[SubscriptionCurAmtStatItem]: The expense summary by subscription and currency.
| Name | Required | Description | Default |
|---|---|---|---|
| to_date | Yes | ||
| from_date | Yes |
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 behavioral burden. It discloses that the tool returns a list of SubscriptionCurAmtStatItem and requires start/end dates in YYYY-MM-DD format, which is useful. However, it does not mention inclusivity of dates, timezone handling, ordering, empty results, or any aggregation details beyond the summary wording.
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 compact and well-structured with a one-line purpose, an Args section, and a Returns section. Every sentence serves a clear function and no filler or repetition exists.
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 low-complexity tool with two required parameters, an output schema, and clear date formats, the description is largely complete. It could add a note about date-boundary behavior or timezone assumptions, but nothing critical is missing for selecting and invoking the tool 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 add meaning to the two parameters. It clearly defines from_date and to_date as required start/end filters with explicit YYYY-MM-DD format, which goes well beyond the bare schema titles.
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 and resource: 'Get expense summary by subscription and currency for the provided period.' It clearly distinguishes this tool from sibling summaries by month or category, so an agent can identify its unique purpose immediately.
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 clear context that this is for fetching a date-filtered expense summary grouped by subscription and currency. It does not explicitly name alternatives or exclusion criteria, but the period-based context and grouping dimensions make the intended use obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latest_expensesB
Get the latest expense records.
Also for searching expenses by the provided criterias.
Args: skip (int): The number of records to skip. Default is 0. limit (int): The maximum number of records to return. Default is 10. from_date (Optional[date]): The start date for filtering. Default is None. Format is YYYY-MM-DD. to_date (Optional[date]): The end date for filtering. Default is None. Format is YYYY-MM-DD. text_input (Optional[str]): The text for semantic search. Default is None.
Returns: list[ExpenseRecord]: The latest expense records.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | ||
| limit | No | ||
| to_date | No | ||
| from_date | No | ||
| text_input | 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 does reveal useful traits: 'latest' ordering, date-range filtering, pagination via skip/limit, and semantic search via text_input. However, it does not explicitly state that the operation is read-only, describe the sort direction, or clarify behavior when no filters 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?
The description is well-structured with an opening summary, an Args section, and a Returns section. It is reasonably concise, though the phrase 'by the provided criterias' is grammatically awkward and slightly vague. Overall, each section 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?
The output schema covers the return type, and the description documents all parameters. However, it lacks sibling differentiation, explicit ordering semantics, and any note about whether this endpoint includes or excludes subscription expenses. For a tool with five optional parameters and no annotations, the description 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.
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 lists all five parameters with types, defaults, and adds meaningful detail beyond the schema, such as YYYY-MM-DD date format and the semantic-search meaning of text_input. Skip and limit are not deeply explained, but their names and defaults make their purpose clear.
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: 'Get the latest expense records.' It also mentions searching by criteria, which broadens the purpose. However, it does not explicitly differentiate from the sibling get_latest_subscription_expenses, leaving some ambiguity about whether this covers all expenses or only non-subscription ones.
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 alternatives such as get_expense_by_id or get_latest_subscription_expenses. The description does not state exclusions, prerequisites, or which sibling to choose for subscription-specific queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latest_subscription_expensesA
Get the latest expense records related to regular subscriptions.
Args: skip (int): The number of records to skip. Default is 0. limit (int): The maximum number of records to return. Default is 10. from_date (Optional[date]): The start date for filtering. Default is None. Format is YYYY-MM-DD. to_date (Optional[date]): The end date for filtering. Default is None. Format is YYYY-MM-DD. text_input (Optional[str]): The text for semantic search. Default is None.
Returns: list[ExpenseRecord]: The latest subscription expense records.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | ||
| limit | No | ||
| to_date | No | ||
| from_date | No | ||
| text_input | 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 does explain that the tool returns a list of expense records and supports optional date filtering, pagination via skip/limit, and semantic text search. However, it does not clarify result ordering, how semantic search interacts with filters, or whether the operation is read-only beyond the verb 'Get' implying it.
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 concise and front-loaded with the core purpose, followed by compact Args and Returns sections. Each parameter line adds value, especially given the empty schema descriptions. It is slightly formulaic but contains no filler or redundant explanation.
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 largely complete for a straightforward filtered read tool: all parameters are explained, defaults are given, and the return type is stated. It lacks only richer context such as result ordering, the relationship to subscription-specific filters, or when to prefer sibling tools, but the essential calling information is present.
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 provides no parameter descriptions, so the description is essential. It meaningfully documents all five parameters, including skip, limit, from_date, to_date, and text_input, with defaults and the date format YYYY-MM-DD. This fully compensates for the 0% schema description coverage.
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 begins with a specific verb and resource: 'Get the latest expense records related to regular subscriptions.' This clearly differentiates it from the sibling get_latest_expenses, which appears to cover all expenses, by adding the subscription scope. The purpose is immediately understandable without relying solely on the tool name.
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 explicit guidance about when to choose this tool over alternatives such as get_latest_expenses or the summary tools. The subscription scope implies when it might be appropriate, but the description does not state exclusions, preconditions, or alternative selection criteria. An agent must infer usage from the name and summary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_subscription_expense_count_by_periodA
Get subscription based expense count for the provided period.
Example usage: When user want to perform analytics of subscription based expenses for a period, first use this method to get the count of total subscription based expenses first. Then can use the get_latest_subscription_expenses tool to fetch the expenses by page to get all records.
Args: from_date (required): The start date for filtering. Format is YYYY-MM-DD. to_date (required): The end date for filtering. Format is YYYY-MM-DD.
Returns: int: The count of subscription based expense reocrds for the period.
| Name | Required | Description | Default |
|---|---|---|---|
| to_date | Yes | ||
| from_date | Yes |
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 burden of explaining behavior. It does state the date format, required arguments, and that it returns an integer count. However, it does not disclose edge cases such as date inclusivity, timezone handling, or behavior when no records exist. These are meaningful gaps, though not fatal for a simple count 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 description is well-structured with purpose, example usage, arguments, and returns. The example is slightly verbose and partially repeats the main idea, but the opening sentence is clear, and each section serves a functional 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 two-parameter count tool, the description provides essential call details: date range, format, integer return, and a recommended follow-up tool. It lacks explicit error or edge-case handling, but it is sufficient for an agent to select and call the tool correctly in the intended workflow.
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 only provides property titles with no descriptions, so the description compensates fully. It explains from_date as 'the start date for filtering' and to_date as 'the end date for filtering', and specifies the YYYY-MM-DD format, giving the agent the semantic information needed to invoke the tool correctly.
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: 'Get subscription based expense count for the provided period.' The 'subscription based' qualifier distinguishes it from the sibling get_expense_count_by_period, and the resource and date-scope are immediately understandable.
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 example usage explicitly describes a workflow: use this tool first to get the count, then use get_latest_subscription_expenses to page through records. This provides concrete context and names an alternative tool. It does not explicitly enumerate when not to use it or contrast with the non-subscription count sibling, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_expense_receipt_imageA
Download and save an expense receipt image to a local file.
Args: expense_id: The ID of the expense to download the receipt image for save_path: Local file path where the image should be saved thumbnail: Whether to download the thumbnail version (default: False)
Returns: dict containing success status and file information
| Name | Required | Description | Default |
|---|---|---|---|
| save_path | Yes | ||
| thumbnail | No | ||
| 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, the description carries the full disclosure burden. It clearly states the write effect (saving to a local file), the optional thumbnail behavior, and the return shape. However, it does not disclose potential file overwrites, directory creation, required permissions, or failure behavior, which are relevant side effects for a file-writing 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 description is a front-loaded one-sentence summary followed by a compact Args/Returns block. Every sentence provides necessary information with no redundancy or filler, making it easy to parse quickly.
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 three-parameter download/save tool, the description covers all parameters and the return type, and an output schema exists to formalize results. The main gaps are the lack of distinction from the near-identical sibling tool and missing detail on file-overwrite behavior, keeping it just short of fully complete.
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 0% description coverage, providing only titles and types. The description's Args section fully defines each parameter—expense_id, save_path, and thumbnail—and documents the default for thumbnail, completely compensating for the schema gap.
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 opens with a specific action — 'Download and save an expense receipt image to a local file' — identifying both the resource and the destination. However, it does not explicitly differentiate this from the sibling download_expense_receipt_image, so the agent must infer the distinction from the save_path parameter.
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 over download_expense_receipt_image or the expense query siblings. It only states what the tool does, without mentioning when to prefer it or alternatives, leaving the choice entirely to the agent.
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.
10 tool updates
v0.3.1- First observed
download_expense_receipt_image - First observed
get_expense_by_id - First observed
get_expense_count_by_period - First observed
get_expense_summary_by_category_by_currency - First observed
get_expense_summary_by_month_by_currency - First observed
get_expense_summary_by_subscription_by_currency - First observed
get_latest_expenses - First observed
get_latest_subscription_expenses - First observed
get_subscription_expense_count_by_period - First observed
save_expense_receipt_image
TDQS
Scored across 10 tools
Most tools are clearly separated by resource and action: expense list/by-id, subscription expenses, summary dimensions, counts, and receipts. The only real ambiguity is between download_expense_receipt_image and save_expense_receipt_image, which differ mainly in whether the image is returned as data or written to a local file.
All names consistently use snake_case with a clear verb (get, download, save) followed by the object and modifiers. Patterns like get_expense_summary_by_*_by_currency and get_*_expense_count_by_period make the toolset predictable and easy to navigate.
Ten tools is well-scoped for an expense retrieval and analytics server. Each tool covers a distinct retrieval, summary, count, or receipt operation, with no redundant or filler tools.
The server covers the apparent read-only analytics domain thoroughly: listing/searching/paginating expenses, by-id lookup, subscription expenses, monthly/category/subscription summaries, per-period counts, and receipt image retrieval/saving. The count + pagination flow is explicitly supported, so there are no dead ends.
Maintenance
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Corporate travel booking and expense management for TripGain, exposed as an MCP server.
The Ramp MCP server enables users to securely connect Ramp with AI assistants like ChatGPT and Claude to query financial data and take actions using natural language. It transforms Ramp's developer API into a SQL interface that LLMs can query, allowing admins to analyze spend trends, identify cost savings, and run complex SQL analyses on comprehensive datasets (transactions, purchase orders, vendors, users), while all users can manage cards, view transactions, request reimbursements, and get expense policy answers.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceA lightweight MCP server that lets LLM clients track, query, and summarize personal expenses using a local SQLite database.-
- AlicenseNot gradedqualityBmaintenanceA production-grade MCP server for personal finance management, enabling AI agents to add, update, search expenses, manage budgets and credit cards, and generate financial reports.2MIT
- FlicenseNot gradedqualityCmaintenanceAI-powered expense tracking MCP server that connects LLM clients to PostgreSQL for natural language expense management.-
- FlicenseNot gradedqualityBmaintenanceAn MCP server for managing SAP Concur expense reports, allowing AI agents to create and update expenses, attach receipts and attendees, and read report data, while leaving submission and approval to humans.-