בס״ד

CONNECTIONS — the one place every data source lives

docs/CONNECTIONS.md · last changed (pre-VM history) · rendered from GitHub master

CONNECTIONS — the one place every data source lives

Last updated: 2026-06-01 (Mon) · Session 40 cont. Purpose: Sam's ask — "build a special place that holds links to my Airbnb calendar, Gmail, calendars, email… so whenever you need to pull from it, it's real, live, actual, and you can make changes." This is that registry: every source, how it's connected, what I can read/write, and its live-link location. If a connection isn't here, it's not wired — add it here.

The secret links themselves do NOT live in this doc (it's in git). They live in the gitignored command-inbox/.connections.json (local-only) and/or the ops-api Worker env. This doc is the MAP; that file is the KEYRING.

✅ 2026-06-01 — ops-api deployed (wrangler login fixed the auth). Now LIVE:
- Airbnb calendars (9312 + 9332) — wired through Worker GET /calendar (reads the iCal secrets), aggregated + rendering in the cockpit "Today" hero. 9332 booked Jun 17–21; 9312 booked Jun 25–29 + Nov 23–28.
- OpenAI voice — routing live; blocked only on OpenAI billing (account hit insufficient_quota — add credits at platform.openai.com → Billing, then it's instant).
- Plaid = production now (was sandbox). Link a real bank via /link.html → live cash in the cockpit.
✅ 2026-06-01 PM update:
- OpenAI voice is LIVE — billing added; /voice/speak returns provider:openai. Bot speaks in the real voice now.
- Google Calendar = the consolidation hub, already connected for me (MCP). It aggregates personal (ztreitel@), business (sam@ — has davening + auto-created card events), FAMILY/SKYLIGHT (the "Sam - Family & Life" calendar IS the Skylight bridge), Mildred, Hebcal. I read + write it live. So "Google / phone / Skylight / family" = one hub — no separate Skylight integration needed.
- /calendar now takes ANY feed via the ICAL_FEEDS secret (JSON [{src,url}]) — Google/TripIt/phone all drop in with no code change.
- To light these up in the PORTAL: paste each calendar's Secret iCal URL (Google → Settings → [calendar] → Integrate calendar → Secret address in iCal format) into ical_feeds in the keyring; I push them to ICAL_FEEDS. TripIt: its Settings → Calendar feed .ics. Rocket Money: no iCal/API — forward its email digests or go manual (separate, non-calendar).


Two layers (this is the key mental model)

  1. Agent layer — what I (Claude in a session) can already touch live. These are MCP connections in the session. I can pull + act on them now for briefings, analysis, drafting, and changes.
  2. Portal/Worker layer — what the portal/cockpit/bot can show + write live. The browser can't use my MCPs; it goes through the ops-api Cloudflare Worker (ops-api.sam-0f0.workers.dev). For a source to be live in the portal, the Worker needs an endpoint for it.

The registry

Source Holds Connected via R/W Status Live link / where it lives
Google Calendar (primary / "regular" / Gmail cal) events, all-day, schedule MCP (agent layer) ✅ Read + Write 🟢 LIVE for me (I can read + create/move/delete events now) · 🟡 not in the portal yet MCP Google_Calendar
Business Gmail (sam@hookstreetcapital.com) mail, drafts, labels MCP (claude.ai) ✅ Read + Write 🟢 LIVE for me MCP Gmail
Personal Gmail (ztreitel@gmail.com) mail local MCP gmail-personal Read 🟢 LIVE for me ~/.gmail-mcp/ (local, off-repo)
Google Drive files, sheets MCP ✅ Read + Write 🟢 LIVE for me MCP Google_Drive
Cards / Tasks / Open loops the Action_Queue ops-api /inbox → command-inbox ✅ Read + Write 🟢 LIVE (portal + bot + me) /inbox (QUEUE_JSON, ACTION, DONE, DEFER, PROOF…)
Grocery list items ops-api /inbox Read + Write 🟢 LIVE /inbox (GLIST, GROCERY, BOUGHT)
Cash / bank balances account balances (9 institutions) ops-api /plaid Read 🟢 LIVE production (Jun 2026) /plaid/balances (KV-cached, cron-warmed 6:30a/5p ET)
Bank liabilities (APRs, mortgage/HELOC detail) card APRs/mins, mortgage rates/escrow ops-api /plaid/liabilities Read 🟡 endpoint LIVE but all 9 items 400liabilities product never enabled at link time; fix = re-link 5/3 + USALLIANCE via link.html (card #606) /plaid/liabilities
MIS / portfolio positions, signals ops-api /mis + MIS v2 GAS ✅ Read 🟢 LIVE /mis/peek, /mis/brief, /mis/tile, /mis/notify
MIS quotes — full universe (237) real-time Schwab quotes, every ticker ops-api /mis/quotes → v2 fn=watchlist (misV2SchwabQuotes_) ✅ Read 🟢 LIVE (Jul 1) — one-pass Schwab via the already-authed v2 app; Finnhub gap-fills BRK.B/BTCUSD /mis/quotes?syms= · ?all · ?refresh=1
Price history → D1 daily closes per ticker ops-api crons (17:00+22:00 ET) → D1 price_history Read 🟢 LIVE (Jul 1) — first rows night of Jul 1 /mis/history?sym=&days=
Hospitable (STR PMS) properties, reservations w/ REAL guest names, status, platform ops-api /hospitable/* (PAT in vault) ✅ Read (API also supports message SEND — not wired yet) 🟢 LIVE (Jul 1) — feeds str.html + Mildred board; ⚠️ trial→paid decision on the Jul-2 call; MCP server exists (mcp.hospitable.com) — evaluate post-call /hospitable/reservations?days= (≤180)
BOS v3 obligations (money sheet) due_next_7 + needs-you + monthly totals v1 sheet web app fn=obligations (token) → morning brief ✅ Read 🟢 LIVE (Jul 1) — first web-app deploy @1; feeds the 6:30a brief Worker secrets V3_OBL_URL/TOKEN
Schwab → MIS (acct 898, ACTIVE) live holdings + trades Schwab cloud-auth ✅ (re-auth DONE 2026-06) Read 🟢 LIVE-LINKED — Sam trades here; new trades reflect on a fn=portrecon re-pull (cached snapshot lags until refreshed). ⚠️ TBC w/ MIS: auto-refresh vs manual. MIS fn=portrecon
Fidelity → MIS (accts 600 GROWTH · 5692 · 4073 · 5378) holdings manual CSV export Read 🔴 NOT live-linked — holdings come from Sam's CSV load (last = Jun-4). Sam WANTS Fidelity live-connected (it's the bigger account) — wanted wire, lower priority than today's fires. load via fn=loadholdings
Telegram (you in your pocket) 2-way messages command-inbox bot ✅ Read + Write 🟢 LIVE bot token in Script Properties
Airbnb calendar — 9312 bookings/availability iCal feed → Worker /calendar Read 🟢 LIVE (iCal secret on the Worker) reads in the cockpit "Today" hero + Mildred bookings
Airbnb calendar — 9332 bookings/availability iCal feed → Worker /calendar Read 🟢 LIVE (iCal secret on the Worker) reads in the cockpit "Today" hero + Mildred bookings
Skylight (family calendar) family events TBD (no clean API) Read 🔴 RESEARCH — likely needs an export/iCal or screen-scrape; figure out method TBD
Voice (bot speaks/listens) TTS/STT ops-api /voice n/a 🟢 LIVE — OpenAI TTS out (verified Jun 1) + CF Whisper in (free) /voice/speak, /voice/transcribe

What I need FROM YOU (drop into command-inbox/.connections.json)

  1. Airbnb iCal URLs (one per listing): Airbnb → Listing → Availability → Connect to another website → Export calendar → copy the .ics URL. Do this for 9312 and 9332.
  2. Google Calendar secret iCal (optional — I can already read it via MCP, but the portal needs a feed): Google Calendar → Settings → your calendar → Integrate calendar → Secret address in iCal format.
  3. Skylight: tell me how you currently view it (app? web?) — I'll research the export path.

~~The ONE unblock~~ — RESOLVED (kept for history; updated 2026-07-01)

The old blocker here (ops-api Worker deploy gated on wrangler auth) is DEAD: deploy-safety was solved Jul 1 (secrets wrangler-owned, npx wrangler deploy is routine, /health secrets_ok guards every push), /calendar is live, Plaid is production, voice is OpenAI-out. Remaining known connection gaps live in the table above (Plaid liabilities flag, Fidelity live-link, Skylight) — this table is the registry: keep it current on every new wire-up, or it manufactures false gaps (find-it-first sweep, Jul 1, caught 4 missing live rows).

What's already TRUE today (not "shooting the wind")

Related: WORKSPACE_AUDIT.md (systems map) · telegram-voice skill (voice) · project_plaid_production_watcher (cash) · ops-api wrangler.toml.

Source trail · docs/CONNECTIONS.md @ master · rendered 2026-07-02 7:23 PM EDT by scripts/build-docs.py · the .md in the repo is the truth; this page is the phone-readable view