AboutWorkTimelineProjectsContact
← Back to all projects
LiveOpen SourceMIT

Personal Assistant Toolkit

Building the infrastructure AI actually runs on

Problem

AI assistants are powerful but context-blind. They have no access to your calendar, tasks, email, or reminders unless you manually paste everything in. Could you build the infrastructure layer that makes AI genuinely useful for daily workflows?

7
MCP Tools
20-30 min
Daily Time Saved

What I Learned

This was the first project where the output wasn't an app or a website. It was an MCP server: the protocol layer that lets AI tools connect to real data sources. Building it meant writing tool definitions that Claude Desktop calls at runtime, designing OAuth2 authentication flows for multi-account Google access, handling macOS system APIs (Swift/EventKit) when the obvious approach (AppleScript) silently failed, and implementing input validation and rate limiting before any tool was written.

Stack

TypeScript (strict)Node.js 18+MCP SDKGoogle OAuth2Google Calendar APIGoogle Tasks APIGmail APIOpen-MeteoSwift / EventKitZodClaude Desktop

Deep Dive

Key product decisions

Why local-first, not cloud?

All personal data stays on the user's machine. A hosted version would be easier to onboard but would require storing OAuth tokens server-side. For a tool handling sensitive personal data, that's a trust ask most users won't accept.

Why MCP, not a standalone app?

Claude Desktop is already the interface. Building a separate dashboard would fragment attention and require a UI layer. MCP lets Claude reason about the data, not just display it. One conversation replaces six apps.

Why de-scope Apple Notes and WhatsApp?

Notes are freeform and deeply personal. WhatsApp has strong user expectations around message privacy. Both carry more risk than value in Phase 1. Deliberate scope decision, documented before build started.

Why multi-account Google from day one?

Most professionals have a personal and a work Gmail. Treating multi-account as Phase 2 would mean retrofitting the entire data model later. The server auto-discovers all authenticated accounts at runtime.

Why Swift/EventKit over AppleScript?

AppleScript's Reminders bridge silently hangs on large reminder lists. No error, no timeout. EventKit accesses the database directly via macOS framework. The first approach failed in testing; the pivot happened in the same session.

Why security-first build order?

Input validation (Zod schemas), rate limiting, and secure token storage were built before any tool was written. Retrofitting security into existing code is how vulnerabilities ship. Building it first meant every tool inherited the guardrails automatically.

Links