MCP server for querying and manipulating financial data in Banktivity (macOS finance app). Provides tools for managing accounts, transactions, categories, tags, templates, import rules, scheduled transactions, and more.
This server has 33 tools with consistent naming (verb_noun pattern: get_, list_, create_, update_, delete_) and comprehensive descriptions. However, critical gaps emerge in schema completeness, parameter documentation, and output structure. All 33 tools have descriptions (10 - 100+ chars, well within the 10 - 1024 baseline), but parameter descriptions are present but often generic. Input schemas are visible in the tool definitions, declaring types (string, number, boolean) but lacking comprehensive validation constraints (enums, min/max, patterns). Output schemas are NOT documented, the code returns JSON via ToolHelpers but does not declare the structure of response fields. Error handling is present (errorResponse, successResponse) but lacks recovery guidance or categorization (retryable vs. user-fixable). The server accepts both IDs and human-readable names (account_id OR account_name, category_id OR category_name) which follows the natural-identifiers pattern well. However, no tool declares which fields will be in its response, forcing LLMs to rely on trial-and-error. The schema ruleset is applied consistently across tools, but consistency alone does not compensate for incomplete specifications.
Add a new line item to an existing transaction
Recategorize all transactions matching a payee pattern. Supports dry_run mode to preview changes.
Create a new income or expense category
Create a new import rule to automatically categorize imported transactions based on a regex pattern
Create a new scheduled/recurring transaction
Delete an import rule
Delete a line item from a transaction
No output schemas documented. Tools return JSON via ToolHelpers.jsonResponse() but response field names, types, and structure are not declared in the tool definitions. LLMs cannot predict which fields are present or how to extract values for chaining.
Parameter descriptions are present but lack validation constraints. No enum declarations for category type ('income' vs 'expense'), no min/max for numeric fields (limit, days), no patterns for date strings. Validation is left to runtime, forcing the LLM to retry on invalid input.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 71 | 2026-07-28+ | v2 |
Delete a scheduled transaction
Dump the Core Data model schema showing all entity names, attributes, and relationships. Use this to discover property names for querying.
Export the entire vault as RDF/Turtle (.ttl). Returns the Turtle content as text, or writes to a file if output_path is provided.
Get the current balance for a specific account
Get a category by ID or name/path (e.g., 'Insurance:Life')
Get the full category hierarchy as a tree structure
Get a specific import rule by ID
Get income breakdown by income category
Get a specific line item by ID
Calculate current net worth (assets minus liabilities)
Aggregate view: for each distinct payee, show which categories were used and how often. Surfaces inconsistencies and uncategorized counts.
Get a specific scheduled transaction by ID
Get spending breakdown by expense category
Get a summary of the Banktivity database including account counts and transaction totals
Find transactions without any category assigned. Useful for finding transactions that need categorization.
List all accounts in Banktivity with their types and current balances
List income/expense categories with optional type filter
List all import rules (patterns to match and categorize imported transactions)
List all scheduled/recurring transactions
Test which import rules match a given transaction description
Change or assign a category on a single transaction
List transactions with their current category for review. Useful for spotting miscategorized transactions.
Given a merchant name, suggest categories based on import rules and historical transaction patterns.
Update an existing import rule
Update a line item's account, amount, or memo
Update an existing scheduled transaction
Destructive tools (delete_import_rule, delete_line_item, delete_scheduled_transaction) do not implement dry-run or confirmation patterns. No recovery guidance in error responses. Agents cannot preview the impact before execution.
Error responses use generic ToolHelpers.errorResponse(message) with no categorization (retryable vs. user-fixable vs. fatal). No recovery guidance. LLMs cannot determine whether to retry, ask the user, or give up.
No pagination support visible. Tools like list_accounts, list_categories, list_import_rules, list_scheduled_transactions accept no limit or offset parameters. Large result sets will blow context windows.
No rate limiting or timeout declarations visible. Tools calling local CoreData should be fast, but external operations (export_turtle to RDF) could hang. No guidance on expected latency or retry strategy.