Provides Claude Desktop with read-only access to personal finance data stored in Tiller Money Google Sheets.
Server has 3 well-defined tools with strong descriptions and comprehensive parameter documentation. All tools have clear input schemas with type definitions and parameter descriptions. Tool names follow verb_noun pattern (get_accounts, get_transactions, get_categories). Descriptions are detailed (200-500+ chars) and include usage examples. However, output schemas are not formally documented in JSON Schema format, descriptions reference return fields but no structured schema object is provided. Error handling exists but is generic (returns JSON with error/message fields without recovery guidance). Parameters have good descriptions but lack formal constraint declarations (enums, min/max for numeric fields). No tool annotations (readOnlyHint, etc.) are present.
Get all active financial accounts from Tiller Money. This tool retrieves basic account information. Hidden/closed accounts are automatically excluded and cannot be accessed. Args: account_type: Optional filter by account type. Case-insensitive. Examples: "Credit Cards", "Retirement", "Savings" If not specified, returns all active account types. Returns: JSON string containing array of account objects. Each account includes: - display_name: Account name with masked number (e.g., "CREDIT CARD (-XXXX)") - account_type: Type/group of account (e.g., "Credit Cards", "Retirement") - account_number: Last 4 digits extracted from display_name (e.g., "-XXXX") - is_hidden: Always false (hidden accounts are excluded) Examples: get_accounts() # Returns all active accounts get_accounts(account_type="Credit Cards") # Returns only credit card accounts get_accounts(account_type="retirement") # Case-insensitive, returns retirement accounts
Get all categories from Tiller Money with optional monthly budget information. This tool retrieves the complete category hierarchy used in Tiller Money for organizing transactions. Args: include_monthly_budgets: If True, include monthly budget amounts for each category (January-December). Default: False. Set to True to see budget data, False for faster results with just category names. Returns: JSON array of category objects. Each category includes: - category: Category name (primary key) - group: Category group/classification (e.g., "Groceries", "Dining", "Utilities") - type: Category type ("Expense", "Income", or "Transfer") - monthly_budgets: (only if include_monthly_budgets=True) Dictionary of monthly budgets by month name with amount and amount_str fields Examples: get_categories() # Get all categories without budgets get_categories(include_monthly_budgets=True) # Get categories with monthly budgets get_categories(include_monthly_budgets=false) # Explicit: no budgets (same as default)
Output schemas not formally documented. Tool descriptions reference return fields (e.g., 'Each account includes: display_name, account_type, account_number, is_hidden') but no JSON Schema object is provided to the MCP client. LLMs cannot plan downstream tool chains without knowing the exact output structure.
Error handling is generic and does not provide recovery guidance. Errors return {error, message} JSON but do not guide the agent on next steps (e.g., 'Ensure TILLER_SHEET_ID is set' is a fix, not a recovery action for the agent). No categorization of errors as retryable vs. user-fixable.
Parameters lack formal constraints. Date parameters (start_date, end_date) specify format in description ('MM/DD/YYYY format') but no regex pattern or JSON Schema format constraint. min_amount and max_amount are strings but accept numeric values, no validation described. No enum constraints for account_type filtering.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | D | 58 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 21 | - | v1 |
Get transactions from Tiller Money with optional filtering. Args: start_date: Filter by date >= this (MM/DD/YYYY format). Optional. end_date: Filter by date <= this (MM/DD/YYYY format). Optional. account: Filter by account number (partial match, case-insensitive). Optional. Example: "XXXX" or "-XXXX" to match account ending in XXXX. category: Filter by category name (partial match, case-insensitive). Optional. Example: "Groceries" matches "Groceries & Food" min_amount: Filter transactions >= this amount (inclusive). Optional. Supports negative values (expenses are negative). Example: "0" for income only, "-100" for expenses >= -$100 max_amount: Filter transactions <= this amount (inclusive). Optional. Supports negative values (expenses are negative). Example: "-100" for large expenses, "50" for small transactions description: Search transaction descriptions (partial match, case-insensitive). Optional. Searches both Description and Full Description fields. Example: "starbucks" finds all Starbucks transactions limit: Maximum transactions to return (default 100) offset: Skip first N transactions (for pagination, default 0) Returns: JSON array of transaction objects sorted by date (most recent first). Each transaction includes: date, description, category, amount, amount_str, account, account_number, institution, month, week, transaction_id, check_number, and full_description. Examples: get_transactions() # Get 100 most recent transactions get_transactions(limit=20) # Get 20 most recent get_transactions(start_date="12/01/2025", end_date="12/20/2025") get_transactions(account="XXXX", limit=50) # All transactions for account -XXXX get_transactions(limit=100, offset=100) # Pagination: next 100 # Advanced filtering examples get_transactions(category="Groceries", min_amount="100") # Grocery transactions over $100 get_transactions( start_date="12/01/2025", end_date="12/31/2025", category="Dining", min_amount="20", max_amount="50" ) # Dining expenses between $20-$50 in December get_transactions(min_amount="0") # List all income transactions get_transactions(description="starbucks") # Find all Starbucks purchases get_transactions(category="Shopping", max_amount="-200") # Large shopping expenses
Tool annotations (toolAnnotations) are absent. get_accounts, get_transactions, and get_categories should declare readOnlyHint=true to signal to clients that these are safe read-only operations with no side effects.
Pagination guidance in get_transactions is incomplete. Tool accepts limit (default 50) and offset parameters, but description does not specify a maximum result cap or warn about context window costs when limit is large. No next_cursor or total_count returned for robust pagination state management.