skills/mortgage-statement/SKILL.md
Process incoming Rocket Mortgage billing statements. Copies PDF from Dropbox Downloads to the Payments folder, extracts payment data, updates the Google Sheet tracker, adds Dropbox shareable link, and deletes the original. Use when a mortgage statement arrives or is mentioned in Downloads.
npx skillsauth add abhiroopb/synthetic-mind mortgage-statementInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Process a Rocket Mortgage billing statement PDF and update the mortgage tracker spreadsheet.
Dropbox/Downloads/ — the statement PDF (e.g., "Client Mortgage Statement.pdf")Dropbox/Documents/2424 Tulare Ave/Mortgage/Payments/YYYY-MM-DD.pdf
C:\Users\basua\Dropbox1hu0tTq4xCq_O6HrHaDV8dWLi9gGUBQoEbg2xHC3jlvUMortgage (Refi) (sheetId: 37179790)c:\Users\basua\.agents\skills\gdrive\gdrive-cli.py (run via uv run gdrive-cli.py from that directory)~/.config/gdrive-skill/credentials.json| Col | Header | Type | Notes |
|-----|--------|------|-------|
| A | No. | Static | Payment number |
| B | Date | Static | Payment date (1-Mon-YYYY) |
| C | Paid to | Static | "Rocket Mortgage" |
| D | Principal | Enter | From "Next Payment Breakdown" |
| E | Interest | Enter | From "Next Payment Breakdown" |
| F | Taxes and Insurance | Enter | Usually $0.00 |
| G | Insurance | Enter | Usually $0.00 |
| H | Total | Formula | =sum(D:G) — do NOT overwrite |
| I | Link | Enter | Rich text hyperlink to Dropbox (see below) |
| J | Cumulative Principal | Formula | =J_prev+D — do NOT overwrite |
| K | Est. Home Value | Enter | Zillow Zestimate for 2424 Tulare Ave, El Cerrito CA |
| L | Home Equity | Formula | =K-$Q$6+J — do NOT overwrite |
The statement's Due Date determines which row to update:
A60:B70 to find the matching rowExtract from the Dropbox MCP get_file_content response or read the local PDF:
Look up the current Zestimate for 2424 Tulare Ave, El Cerrito, CA 94530 on Zillow.
Use web_search or read_web_page on https://www.zillow.com/homes/2424-Tulare-Ave-El-Cerrito-CA-94530_rb/.
Search Dropbox Downloads for the mortgage statement PDF.
Use Dropbox MCP get_file_content to read the PDF and extract:
cmd /c copy "C:\Users\basua\Dropbox\Downloads\<original filename>.pdf" "C:\Users\basua\Dropbox\Documents\2424 Tulare Ave\Mortgage\Payments\YYYY-MM-DD.pdf"
The file must sync to Dropbox cloud before getting a shareable link.
get_file_metadata using path /Documents/2424 Tulare Ave/Mortgage/Payments/YYYY-MM-DD.pdfns:8206295520python -c "import time; time.sleep(N)" (max ~240s per call to avoid timeout)Use Dropbox MCP get_file_content on the synced file. The response includes a content_link field.
Look up the current Zestimate value.
For D, E, F, G, K columns — use the gdrive CLI via a Python script to avoid PowerShell escaping:
import subprocess, json, os
os.chdir(r"c:\Users\basua\.agents\skills\gdrive")
SPREADSHEET_ID = "1hu0tTq4xCq_O6HrHaDV8dWLi9gGUBQoEbg2xHC3jlvU"
ROW = 64 # adjust to correct row
# Write payment values
result = subprocess.run(
["uv", "run", "gdrive-cli.py", "sheets", "write",
SPREADSHEET_ID,
"--range", f"'Mortgage (Refi)'!D{ROW}:G{ROW}",
"--values", json.dumps([[1306.08, 1289.33, 0, 0]])],
capture_output=True, text=True
)
# Write Zestimate
result2 = subprocess.run(
["uv", "run", "gdrive-cli.py", "sheets", "write",
SPREADSHEET_ID,
"--range", f"'Mortgage (Refi)'!K{ROW}",
"--values", json.dumps([[1108100]])],
capture_output=True, text=True
)
For I column (hyperlink) — the Link column uses rich text hyperlinks (NOT =HYPERLINK() formulas). Use the Google Sheets batchUpdate API directly:
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
TOKEN_PATH = os.path.join(os.path.expanduser("~"), ".config", "gdrive-skill", "credentials.json")
with open(TOKEN_PATH) as f:
token_data = json.load(f)
creds = Credentials(
token=token_data.get("token"),
refresh_token=token_data.get("refresh_token"),
token_uri=token_data.get("token_uri"),
client_id=token_data.get("client_id"),
client_secret=token_data.get("client_secret"),
scopes=token_data.get("scopes"),
)
service = build("sheets", "v4", credentials=creds)
request_body = {
"requests": [{
"updateCells": {
"rows": [{
"values": [{
"userEnteredValue": {"stringValue": "Link"},
"textFormatRuns": [{
"startIndex": 0,
"format": {"link": {"uri": DROPBOX_LINK}}
}]
}]
}],
"range": {
"sheetId": 37179790,
"startRowIndex": ROW - 1, # 0-based
"endRowIndex": ROW,
"startColumnIndex": 8, # Column I
"endColumnIndex": 9,
},
"fields": "userEnteredValue,textFormatRuns"
}
}]
}
service.spreadsheets().batchUpdate(
spreadsheetId=SPREADSHEET_ID, body=request_body
).execute()
Read back the updated row to confirm all values are correct:
uv run gdrive-cli.py sheets read <SPREADSHEET_ID> --range "'Mortgage (Refi)'!A<ROW>:L<ROW>"
cmd /c del "C:\Users\basua\Dropbox\Downloads\<original filename>.pdf"
--values arguments.testing
Track TV shows and movies with Trakt.tv. Search, get watchlist, history, up-next, recommendations, trending, calendar, ratings, stats, add/remove from watchlist, mark watched, rate, and check in. Use when asked about what to watch, TV shows, movies, watch history, or Trakt.
development
Send and receive SMS messages via Twilio API. Used for text message notifications, forwarding important alerts, and two-way SMS communication.
documentation
Organizes files in the local Downloads folder into proper folders. Use when asked to organize, sort, or file downloaded documents.
tools
Book and manage appointments on Sutter Health MyHealth Online portal. Uses browser automation via Playwright MCP to interact with the patient portal.