Expense Tracker Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Expense Tracker Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A Model Context Protocol (MCP) server for tracking and managing personal expenses. Built with Python and FastMCP, this server provides tools for adding, viewing, filtering, and summarizing expenses stored in a SQLite database.
cd expense-tracker-mcp uv syncThe server uses stdio transport for MCP communication:
uv run python server.py#### 1. add_expense
Add a new expense to the tracker.
Parameters:
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
name | string | Yes | - | Name/description of the expense |
price | integer | Yes | - | Price amount (in smallest currency unit) |
category | string | Yes | - | Main category (e.g., "Food", "Clothing") |
sub_category | string | No | "" | Sub-category (e.g., "Beverages", "Men's Wear") |
date_added | string | No | auto | ISO format date (e.g., "2026-03-14T19:30:00") |
Example:
add_expense("Grocery Shopping", 5000, "Food", "Groceries")
add_expense("Movie Ticket", 1200, "Entertainment", "Movies", "2026-03-10T18:00:00")#### 2. read_expenses
Retrieve all recorded expenses.
Parameters: None
Returns: List of expense objects
Example Response:
[
{
"Name": "Grocery Shopping",
"Price": 5000,
"Category": "Food",
"SubCategory": "Groceries",
"DateAdded": "2026-03-14T19:30:00"
},
{
"Name": "Movie Ticket",
"Price": 1200,
"Category": "Entertainment",
"SubCategory": "Movies",
"DateAdded": "2026-03-10T18:00:00"
}
]#### 3. filter_by_category
Get all expenses belonging to a specific category.
Parameters:
| Name | Type | Description |
|---|---|---|
category | string | Category name to filter by |
Example:
filter_by_category("Food")Example Response:
[
{
"Name": "Grocery Shopping",
"Price": 5000,
"Category": "Food",
"SubCategory": "Groceries",
"DateAdded": "2026-03-14T19:30:00"
}
]#### 4. summarize_expenses
Calculate total expenses within a date range.
Parameters:
| Name | Type | Description |
|---|---|---|
start_date | string | Start date in ISO format (e.g., "2026-03-01") |
end_date | string | End date in ISO format (e.g., "2026-03-31") |
Example:
summarize_expenses("2026-03-01", "2026-03-31")Example Response:
{
"StartDate": "2026-03-01",
"EndDate": "2026-03-31",
"TotalExpenses": 6200,
"ExpenseCount": 2
}Expenses are stored in a SQLite database (expense_data.db) with the following schema:
CREATE TABLE expenses (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price INTEGER NOT NULL,
category TEXT NOT NULL,
sub_category TEXT,
date_added TEXT NOT NULL
);expense-tracker-mcp/
├── server.py # Main MCP server implementation
├── expense_data.db # SQLite database (auto-created)
├── expense_data.json # Legacy JSON file (not used)
├── pyproject.toml # Project configuration
├── uv.lock # Dependency lock file
├── .python-version # Python version (3.10)
└── README.md # This file[project]
name = "expense-tracker-mcp"
version = "0.1.0"
requires-python = ">=3.10"
dependencies = [
"fastmcp>=3.1.0",
]This server is designed to work with MCP-compatible clients. Configure your MCP client to connect to this server:
Example Claude Desktop Config:
{
"mcpServers": {
"expense-tracker": {
"command": "uv",
"args": ["run", "python", "server.py"],
"cwd": "/path/to/expense-tracker-mcp"
}
}
}Manual testing can be done using Python:
uv run python -c "
from server import add_expense, read_expenses, filter_by_category, summarize_expenses
# Test adding expenses
add_expense('Test Item', 100, 'Test Category')
# View all expenses
print(read_expenses())
# Filter by category
print(filter_by_category('Test Category'))
# Summarize expenses
print(summarize_expenses('2026-01-01', '2026-12-31'))
"To add new tools to the server:
@server.tool decoratorExample:
@server.tool
def my_new_tool(param1: str, param2: int) -> dict:
"""Description of what this tool does"""
conn = get_connection()
# ... implementation ...
conn.close()
return resultMIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.