Keep My Books Organized for Month-End SKILL.md
Keep QuickBooks and Stripe records organized for month-end close. Use for reconciliation, overdue invoices, uncategorized expenses, approval-gated invoice chaser drafts, P&L workbooks or decks, and dispute-to-ledger exceptions. Requires authorized QuickBooks and Stripe connections; it does not file taxes or move money.
---
name: financial-account-manager
description: Keep QuickBooks and Stripe records organized for month-end close. Use for reconciliation, overdue invoices, uncategorized expenses, approval-gated invoice chaser drafts, P&L workbooks or decks, and dispute-to-ledger exceptions. Requires authorized QuickBooks and Stripe connections; it does not file taxes or move money.
category: Keep finances organized
type: bundled
requires:
pythonpath:
- scripts
mcp:
- quickbooks
- stripe
connectors:
- mcp: quickbooks
auth:
type: oauth
credential: QuickBooks Online OAuth app and company authorization
login: https://developer.intuit.com/app/developer/dashboard
- mcp: stripe
url: https://mcp.stripe.com
auth:
type: oauth
credential: Stripe account OAuth
login: https://dashboard.stripe.com/
setup:
- "Install Intuit's official local QuickBooks Online MCP as server id quickbooks; disable its write, update, and delete tool groups for review-only workflows."
- "Create an Intuit OAuth app, authorize the exact QuickBooks company, and verify sandbox versus production, realm id, timezone, currency, and accounting method."
- "Connect Stripe's official hosted MCP at https://mcp.stripe.com as server id stripe, then authorize the matching account and verify live mode versus sandbox."
- "Optional: bind Google Workspace for Gmail drafts; QuickBooks and Stripe remain required for the core reconciliation workflows."
---
# Financial Account Manager
Reconcile the books without blurring accounting records, payment-processor activity, and agent suggestions. QuickBooks is the source of truth for the ledger, invoices, expenses, and financial statements. Stripe is supplementary evidence for payments, fees, refunds, payouts, and disputes. Gmail is optional and creates drafts only.
## 1. Establish the accounting context
1. Run `list_integrations` before claiming any source is available. QuickBooks and Stripe are MCP connections; Gmail is part of the direct Google Workspace integration and can exist without a Google MCP server.
2. Use Intuit's official `intuit/quickbooks-online-mcp-server` as server id `quickbooks`. It is a local stdio server, not a hosted endpoint. Do not substitute a third-party QuickBooks gateway.
3. Use Stripe's official hosted server at `https://mcp.stripe.com` as server id `stripe`. Its normal connection flow is browser-assisted OAuth; never ask the user to paste a Stripe secret key into chat.
4. Confirm the QuickBooks company/realm, sandbox or production, report basis (cash or accrual), home currency, timezone, and reporting dates. Confirm the Stripe account or organization and live mode or sandbox. If any identity or mode is ambiguous, stop and ask.
5. Default both systems to read-only. Intuit's server exposes broad CRUD tools, so review-only installs must set `QUICKBOOKS_DISABLE_WRITE=true`, `QUICKBOOKS_DISABLE_UPDATE=true`, and `QUICKBOOKS_DISABLE_DELETE=true`. Never enable or call Stripe write tools for these workflows.
6. Treat customer names, emails, invoices, transactions, and financial statements as sensitive. Retrieve only the fields and periods needed, keep raw data in memory when possible, and never write secrets or unrequested raw exports into the workspace.
If either required MCP is unavailable, name the missing connection and finish only the parts whose sources are actually available. Never fabricate balances or silently replace live financial data with web search.
## 2. Normalize live tool capabilities
Inspect each connected server's advertised schemas before calling it. Tool names may evolve.
For QuickBooks, map the available reads for company information, preferences, chart of accounts, invoices, customers, payments, purchases/expenses, vendors, profit and loss, aged receivables, and transaction details. Prefer the official report tools when they provide the requested view, then use bounded entity reads to explain exceptions.
For Stripe, use the live read schema—commonly `get_stripe_account_info`, `stripe_api_search`, `stripe_api_details`, and `stripe_api_read`—to find the narrowest read endpoint. Do not call an invented endpoint or a general write tool.
Before calculating:
- set one `as of` timestamp and one timezone;
- state company/account identity, environment, currency treatment, and accounting method;
- paginate or narrow any truncated result;
- keep currencies separate unless an authorized conversion source and rate date are supplied;
- treat missing values as missing, not zero;
- distinguish transaction date, due date, settlement/availability date, payout date, and bookkeeping date.
Read `references/workflows.md` for the exact evidence, calculations, output contracts, and golden-prompt acceptance criteria.
## 3. Outstanding invoices and aging
For "What's outstanding this month?" or similar:
1. Confirm whether "outstanding" means all open receivables as of the report date or invoices due within the named month. If unstated, report all open invoices as of today and separately flag those due this month.
2. Reconcile the QuickBooks aged-receivables report with bounded open-invoice, payment, credit-memo, and customer reads. Do not use the original invoice total when a current open balance is available.
3. Feed normalized open balances to `build_aging_report` from the bundled `aging_report` module through `run_code`. Use the helper's fixed buckets: Current, 1–30, 31–60, 61–90, 91+, and Due date unknown.
4. Return totals by currency, overdue totals, the highest-impact invoices, payments/credits that need review, and explicit data gaps. Never combine currencies into one number.
5. If the user asks to chase invoices, prepare the aging report first, then follow the Gmail draft workflow below.
## 4. Expense categorization review
For "Categorize last week's uncategorized expenses" or similar:
1. Resolve the exact calendar window in the QuickBooks company timezone and identify the actual uncategorized/suspense accounts used by that company.
2. Fetch only uncategorized purchases, expenses, bills, and relevant split lines in scope. Inspect the chart of accounts and a bounded history of the same vendor/payee and memo patterns.
3. Propose an account/category, confidence, and evidence for each line. Use high confidence only for a stable exact precedent; show medium/low confidence and alternatives when evidence conflicts.
4. Flag rather than guess personal expenses, fixed assets, loan principal/interest, owner distributions, sales tax/VAT, reimbursables, payroll, intercompany items, and ambiguous splits.
5. Return a review table with original account, proposed account, amount/currency, evidence, confidence, and tax/split questions. This prompt authorizes recommendations, not bookkeeping changes.
6. Apply changes only after the user explicitly requests application, the official QuickBooks server has the necessary update tool enabled, and you preview the exact record/line/account changes for approval immediately before the mutation. Verify each returned record afterward.
Never invent an account, tax treatment, or deductible-business-purpose claim. Recommend accountant review when policy or jurisdiction determines the answer.
## 5. Monthly financial summary and deck
For "Monthly financial summary as a deck" or similar:
1. Confirm the month, cash/accrual basis, currency, and comparison. If unstated, use the most recently completed calendar month and compare it with the immediately preceding month on the same basis.
2. Retrieve QuickBooks P&L data plus the smallest supporting detail needed to explain material changes. Stripe data can corroborate processor activity, but it must not replace the QuickBooks P&L or be labeled as revenue.
3. Normalize only leaf account rows, each carrying the positive magnitude QuickBooks reports, then call `build_pnl_summary` from the bundled `pnl_summary` module through `run_code`. The helper deterministically calculates category totals, gross profit, operating income, net income, variances, and percentage changes.
4. Load `xlsx-report` and create the auditable workbook first: source context, assumptions, P&L comparison, material drivers, reconciliation exceptions, and data gaps.
5. Load `pptx-deck` and build a concise deck from the verified workbook: headline, revenue/gross-profit picture, operating expenses, net-income bridge, cash/processor observations, exceptions, and next actions.
6. Clearly label cash versus accrual, partial periods, one-off items, non-comparable categories, missing prior-period data, and any management inference. Preserve source timestamps and the workbook path in the deck notes or appendix.
Do not describe Stripe gross payment volume as GAAP/IFRS revenue, treat payouts as sales, or infer cash flow from a P&L.
## 6. Stripe disputes, refunds, and reconciliation
For "Any Stripe disputes to reconcile?" or similar:
1. Read open, won, lost, and recently closed disputes for the requested period, along with their charge, refund, balance-transaction, fee, and payout evidence when available.
2. In QuickBooks, look for explicit Stripe IDs or documented processor references first. Compare the appropriate payment, refund receipt/credit memo, deposit, and fee records—not merely same-day amounts.
3. Classify every item as verified match, timing difference, amount/currency mismatch, missing QuickBooks entry, ambiguous candidate, or needs investigation. Exact amount/date similarity alone is only a candidate, never proof.
4. Show dispute status, amount/currency, important dates, Stripe reference, QuickBooks evidence, accounting impact to review, and the next owner/action.
5. Keep processor fees, refunds, disputes, and net payouts separate. Account for multi-currency settlement and payout batching before declaring a mismatch.
6. Do not create refunds, accept disputes, upload evidence, or post journal entries from this workflow.
## 7. Gmail invoice-chase drafts
Use the direct Gmail integration, not a Google MCP server.
1. Start from verified overdue balances and an unambiguous billing contact. Skip missing or ambiguous recipients.
2. Ground each draft in the invoice number, current open balance/currency, due date, and verified payment status. Never invent a promise, late fee, threat, bank detail, or prior conversation.
3. Deduplicate recipients and keep one clear call to action. Exclude internal notes and unrelated account history.
4. Preview recipient, subject, and body, then obtain explicit approval before creating Gmail drafts.
5. Creating a draft never authorizes sending. Never send from this workflow. Verify each created draft by its returned identifier; if Gmail is unavailable, return labeled copy-ready text without claiming creation.
## 8. Completion checks
Before reporting success:
- every figure names its system, company/account, environment, period, basis, currency policy, and `as of` time;
- QuickBooks remains the ledger/reporting source of truth and Stripe remains supplementary reconciliation evidence;
- aging uses current open balances and deterministic buckets;
- category recommendations show evidence/confidence and were not applied without approval;
- workbook and deck figures reconcile to the same normalized P&L input;
- dispute/refund matches rely on identifiers or are labeled candidates;
- Gmail content was previewed, approval-gated, and never sent;
- no connection, record mutation, draft, artifact, or verification is claimed unless it actually succeeded.
Redeep