Audit junk fees, project annual costs and draft dispute letters. Free.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Project the cumulative cost of a fee list over 1-30 years by straight multiplication of each recurring fee's annualized amount, with one-time fees counted once (no compounding or inflation), with a per-fee breakdown. Use for 'what will these cost me over N years'. It does not flag fees: use audit_fees to find problem charges, benchmark_fees for typical ranges.
Non-empty list of fees to project, each {name, amount, frequency, category?}; category is accepted but not used here
Number of years to project, integer 1-30; default 1
Project the cumulative cost of a fee list over 1-30 years by straight multiplication of each recurring fee's annualized amount, with one-time fees counted once (no compounding or inflation), with a per-fee breakdown. Use for 'what will these cost me over N years'. It does not flag fees: use audit_fees to find problem charges, benchmark_fees for typical ranges.
| Argument | Type | Description |
|---|---|---|
| fees* | array | Non-empty list of fees to project, each {name, amount, frequency, category?}; category is accepted but not used here |
| years | integer | Number of years to project, integer 1-30; default 1 |
{
"type": "object",
"required": [
"fees"
],
"properties": {
"fees": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"amount",
"frequency"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Fee label as it appears on the statement, e.g. 'Overdraft fee' or 'Netflix'"
},
"amount": {
"type": "number",
"description": "Amount per charge in USD, greater than 0, e.g. 38 or 15.99 (for monthly fees, the monthly amount)",
"exclusiveMinimum": 0
},
"category": {
"type": "string",
"description": "Optional benchmark category key (case-insensitive; spaces/hyphens become underscores). One of: bank_overdraft, bank_monthly_maintenance, atm_out_of_network, late_payment, gym_membership_monthly, streaming_monthly, airline_checked_bag, airline_seat_fee, ticket_convenience, rental_application, subscription_app_monthly, delivery_fee, airline_change_fee, hotel_resort_fee. Unknown keys are ignored for benchmarking and listed in audit_fees' note."
},
"frequency": {
"enum": [
"monthly",
"annual",
"one-time"
],
"type": "string",
"description": "How often the fee is charged: 'monthly' (x12 per year), 'annual' or 'one-time'"
}
}
},
"minItems": 1,
"description": "Non-empty list of fees to project, each {name, amount, frequency, category?}; category is accepted but not used here"
},
"years": {
"type": "integer",
"maximum": 30,
"minimum": 1,
"description": "Number of years to project, integer 1-30; default 1"
}
}
}Audit a list of fees: annualize each one (monthly x12), total the yearly cost and monthly average, and flag charges above the typical US range for their category, duplicate names and one-time fees of $30+ worth disputing. Use when the user lists fees to review. For a multi-year projection use annual_cost; for typical ranges alone use benchmark_fees.
| Argument | Type | Description |
|---|---|---|
| fees* | array | Non-empty list of fees to audit, each {name, amount, frequency, category?} |
{
"type": "object",
"required": [
"fees"
],
"properties": {
"fees": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"amount",
"frequency"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Fee label as it appears on the statement, e.g. 'Overdraft fee' or 'Netflix'"
},
"amount": {
"type": "number",
"description": "Amount per charge in USD, greater than 0, e.g. 38 or 15.99 (for monthly fees, the monthly amount)",
"exclusiveMinimum": 0
},
"category": {
"type": "string",
"description": "Optional benchmark category key (case-insensitive; spaces/hyphens become underscores). One of: bank_overdraft, bank_monthly_maintenance, atm_out_of_network, late_payment, gym_membership_monthly, streaming_monthly, airline_checked_bag, airline_seat_fee, ticket_convenience, rental_application, subscription_app_monthly, delivery_fee, airline_change_fee, hotel_resort_fee. Unknown keys are ignored for benchmarking and listed in audit_fees' note."
},
"frequency": {
"enum": [
"monthly",
"annual",
"one-time"
],
"type": "string",
"description": "How often the fee is charged: 'monthly' (x12 per year), 'annual' or 'one-time'"
}
}
},
"minItems": 1,
"description": "Non-empty list of fees to audit, each {name, amount, frequency, category?}"
}
}
}Look up typical US consumer fee ranges (min/max per charge, USD) for one category such as bank_overdraft, or the full 14-category table when category is omitted. Use to answer 'is this fee normal?' questions. To check a user's own list of fees against these ranges, use audit_fees.
| Argument | Type | Description |
|---|---|---|
| category | string | Category key (case-insensitive; spaces/hyphens become underscores), one of: bank_overdraft, bank_monthly_maintenance, atm_out_of_network, late_payment, gym_membership_monthly, streaming_monthly, airline_checked_bag, airline_seat_fee, ticket_convenience, rental_application, subscription_app_monthly, delivery_fee, airline_change_fee, hotel_resort_fee. Omit to get the full table; an unknown key returns an error listing valid keys. |
{
"type": "object",
"properties": {
"category": {
"type": "string",
"description": "Category key (case-insensitive; spaces/hyphens become underscores), one of: bank_overdraft, bank_monthly_maintenance, atm_out_of_network, late_payment, gym_membership_monthly, streaming_monthly, airline_checked_bag, airline_seat_fee, ticket_convenience, rental_application, subscription_app_monthly, delivery_fee, airline_change_fee, hotel_resort_fee. Omit to get the full table; an unknown key returns an error listing valid keys."
}
}
}Draft (text only; nothing is sent) a firm, polite letter asking a company to reverse or refund one specific fee, with grounds, a 14-day written-response request, an escalation path and sending tips. Use once the user has picked a fee to contest. To find which fees are worth disputing first, use audit_fees.
| Argument | Type | Description |
|---|---|---|
| amount* | number | Fee amount in USD, greater than 0, e.g. 38 |
| reason | string | Optional grounds for the dispute; default cites an undisclosed/unexpected charge and asks for a courtesy reversal |
| company* | string | Company or bank that charged the fee, e.g. 'First National Bank' |
| fee_name* | string | Name of the fee being disputed, e.g. 'Overdraft fee' |
| your_name* | string | Account holder's full name, used in From and to sign the letter |
| date_charged | string | Optional date the fee was charged, free text, e.g. 2026-09-14 |
| requested_action | string | What to ask the company to do, e.g. 'waive' or 'refund'; default 'reverse or refund' |
| account_reference | string | Optional account or reference number; prefer a masked form like '****1234' |
{
"type": "object",
"required": [
"fee_name",
"amount",
"company",
"your_name"
],
"properties": {
"amount": {
"type": "number",
"description": "Fee amount in USD, greater than 0, e.g. 38",
"exclusiveMinimum": 0
},
"reason": {
"type": "string",
"description": "Optional grounds for the dispute; default cites an undisclosed/unexpected charge and asks for a courtesy reversal"
},
"company": {
"type": "string",
"description": "Company or bank that charged the fee, e.g. 'First National Bank'"
},
"fee_name": {
"type": "string",
"description": "Name of the fee being disputed, e.g. 'Overdraft fee'"
},
"your_name": {
"type": "string",
"description": "Account holder's full name, used in From and to sign the letter"
},
"date_charged": {
"type": "string",
"description": "Optional date the fee was charged, free text, e.g. 2026-09-14"
},
"requested_action": {
"type": "string",
"description": "What to ask the company to do, e.g. 'waive' or 'refund'; default 'reverse or refund'"
},
"account_reference": {
"type": "string",
"description": "Optional account or reference number; prefer a masked form like '****1234'"
}
}
}