使用说明
Personal Assistant Toolkit
One conversation. Every signal from your day. No app switching.
A locally-hosted Model Context Protocol (MCP) server that connects Claude Desktop to your personal productivity stack — calendar, tasks, reminders, email, and weather — and synthesises them into a single, intelligent daily briefing.
Built by Anuraag Burman — AI Product Manager, Singapore · MIT License · macOS
What it does
Most people start their day by opening 6–8 apps just to understand what's ahead. Personal Assistant Toolkit eliminates that. Ask one question in Claude Desktop — it pulls from every source simultaneously and returns a structured briefing in seconds.
You: "Good morning. What does my day look like?"
→ Weather • Schedule • Tasks • Reminders • Email
What it connects to
| # | Source | What it provides |
|---|---|---|
| 1 | Weather | Current conditions, forecast, UV index, alerts |
| 2 | Google Calendar | Meetings, holidays, shared calendars — across all linked accounts |
| 3 | Google Tasks | Pending tasks, due dates, overdue items, mark complete — all accounts |
| 4 | Gmail | Unread + important emails, grouped by category — all accounts |
| 5 | Apple Reminders | Reminders due today + overdue last 30 days, all lists |
Your data is entirely your own. This toolkit connects to your Google account using credentials you create yourself. The repo contains zero personal information — no emails, no calendar events, no tokens, no credentials. Anyone who downloads this repo gets only the code, nothing else.
Multiple Google accounts are fully supported. Add as many accounts as you like (personal, work, side projects) — Calendar, Tasks, and Gmail are all fetched and merged automatically.
What you can ask
"Good morning. What does my day look like?"
"Any important emails I haven't read?"
"What tasks and reminders are due today?"
"Any overdue items I've been putting off?"
"Should I bring an umbrella today?"
"Mark the Ikea task as done."
What a briefing looks like
Weather: 30°C, feels like 34°C. Partly cloudy. UV peaks at 9 — apply sunscreen.
High 34 / Low 25. Sunrise 07:08 · Sunset 19:15.
Schedule: 10:00 – Call with Tanmay
19:30 – Massage at Natureland, Liat Towers
22:00 – AI session (Google Meet · 1 pending RSVP)
Tasks: Due today: Visit Ikea (get steamer) · Water plants — Pachira and Fern
Reminders: Overdue (3): Review eval starter kit · Check MCF · Cancel swiggyone
Due today: Check stich
Email: No important unread in the last 24h.
Requirements
| Requirement | Notes |
|---|---|
| macOS 14 (Sonoma) or later | Required for Swift/EventKit (Apple Reminders) |
| Claude Desktop | Paid plan required for MCP tools |
| Node.js 18+ | node --version to check; download from nodejs.org |
| Xcode Command Line Tools | For Swift; install with xcode-select --install |
| A Google account | For Calendar, Tasks, Gmail |
Multiple Google accounts
This is a first-class feature. You can connect as many Google accounts as you like. All their calendars, tasks, and emails are fetched simultaneously and merged — each item tagged with its source account.
To add a second (or third) account:
- Download a credentials JSON for each account from Google Cloud Console (same project is fine — you can use the same OAuth app)
- Rename each file:
credentials-personal.json,credentials-work.json,credentials-side.json, etc. - Place them in the project root
- Run the auth flow for each:
npm run auth:personal # connects anuraag@gmail.com
npm run auth:google -- --account=work # connects anuraag@company.com
npm run auth:google -- --account=side # connects anuraag@sideproject.com
That's it. The toolkit auto-discovers all authenticated accounts on every run — no config changes needed.
Setup
Pick your path based on your comfort level with the terminal.
Path A — Not a developer (step by step)
This path is for you if you've never run commands in Terminal before.
Step 1 — Install Node.js
Go to nodejs.org → click LTS → run the installer. Done.
Step 2 — Download this project
Click the green Code button at the top of this page → Download ZIP → unzip it → move the folder to /Users/YOUR_NAME/ (your home folder).
Step 3 — Open Terminal
Press Cmd + Space, type Terminal, press Enter.
Step 4 — Install and build
Type these commands one at a time, pressing Enter after each. Wait for each to finish.
cd ~/personal-assistant-toolkit
npm install
npm run build
Step 5 — Set up Google credentials
- Go to console.cloud.google.com — sign in with your Google account
- Create a new project named
personal-assistant-toolkit - In the search bar, search for and enable these three APIs:
- Google Calendar API
- Gmail API
- Google Tasks API
- Go to APIs & Services → OAuth consent screen
- Audience: choose External → click Create
- App name:
Personal Assistant Toolkit - User support email: your Gmail
- Developer contact: your Gmail
- Click Save and Continue (twice more, skipping Scopes)
- Add your Gmail as a Test user → Save
- Go to Credentials → + Create Credentials → OAuth 2.0 Client ID
- Application type: Desktop app
- Name:
personal-assistant-toolkit - Click Create → Download JSON
- Rename the downloaded file to
credentials-personal.json - Move it into the
personal-assistant-toolkitfolder
Step 6 — Connect your Google account (one-time)
In Terminal:
npm run auth:personal
A browser window opens. Sign in with your Google account → click Allow → you'll see "Authenticated!" → close the tab.
You only do this once. The token is saved securely on your Mac. Claude Desktop reuses it automatically every time — you will never be asked again unless you revoke access yourself in your Google account settings.
Step 7 — Find your coordinates
Google your city name + "coordinates" (e.g. "Singapore coordinates"). You'll get two numbers like 1.3521, 103.8198 — note these down.
Common cities:
| City | Latitude | Longitude |
|---|---|---|
| Singapore | 1.3521 | 103.8198 |
| London | 51.5074 | -0.1278 |
| New York | 40.7128 | -74.0060 |
| Mumbai | 19.0760 | 72.8777 |
| Sydney | -33.8688 | 151.2093 |
| Dubai | 25.2048 | 55.2708 |
Step 8 — Configure Claude Desktop
- Press
Cmd + Space, typeTextEdit, open it - Go to File → Open → paste this path:
~/Library/Application Support/Claude/claude_desktop_config.json - Replace the entire file contents with (fill in your details):
{
"mcpServers": {
"personal-assistant-toolkit": {
"command": "/usr/local/bin/node",
"args": ["/Users/YOUR_NAME/personal-assistant-toolkit/dist/index.js"],
"env": {
"WEATHER_LAT": "YOUR_LATITUDE",
"WEATHER_LON": "YOUR_LONGITUDE"
}
}
}
}
Replace:
YOUR_NAME→ your Mac username (typewhoamiin Terminal to see it)YOUR_LATITUDE/YOUR_LONGITUDE→ from Step 7
- Save the file (Cmd+S)
Step 9 — Grant Reminders permission (one-time)
The first time Claude reads your Apple Reminders, macOS will show a permission dialog. Click Allow.
This is a one-time prompt. Once you click Allow, the permission is saved permanently in macOS. You will never be asked again unless you manually revoke it in System Settings → Privacy & Security → Reminders.
Step 10 — Restart Claude Desktop and test
Quit Claude Desktop (Cmd + Q) and reopen it. Then ask:
What does my day look like?
Path B — Developer
Prerequisites: Node.js 18+, macOS 14+, Claude Desktop
git clone https://github.com/anuraagburman/personal-assistant-toolkit.git
cd personal-assistant-toolkit
npm install
npm run build
Set up Google OAuth credentials (see Path A, Step 5 — same process), place credentials-personal.json in the project root, then:
npm run auth:personal
Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"personal-assistant-toolkit": {
"command": "/usr/local/bin/node",
"args": ["/absolute/path/to/personal-assistant-toolkit/dist/index.js"],
"env": {
"WEATHER_LAT": "1.3521",
"WEATHER_LON": "103.8198"
}
}
}
}
Run pwd inside the project folder to get the absolute path.
Restart Claude Desktop. Validate:
ping → pong
What's the weather today? → live weather data
How permissions work
| Permission | When you're asked | How long it lasts |
|---|---|---|
| Google OAuth (Calendar, Tasks, Gmail) | Once, when you run npm run auth:personal |
Permanent — token auto-refreshes silently. Only expires if you manually revoke in Google account settings |
| macOS Reminders | Once, first time Claude reads reminders | Permanent — stored in macOS Privacy & Security settings |
| Weather | Never — no account needed | Always works (uses Open-Meteo, a free public API) |
Bottom line: set up once, use forever.
Privacy & security
- All data is fetched locally on your Mac — nothing goes through any third-party server
- Google API calls go directly from your Mac to Google's servers (same as using the apps)
- Weather uses Open-Meteo — free, no account, no personal data sent
- Apple Reminders are read via Swift/EventKit — data never leaves your machine
- OAuth tokens are stored in
.tokens/— excluded from git via.gitignore, readable only by your user account - Apple Notes and WhatsApp are not connected by design — too much sensitive information
| Protection | How it works |
|---|---|
| Read-only by default | Cannot send messages, delete events, or modify data (except marking tasks complete) |
| Input validation | Every tool call is validated with Zod schemas before any API is called |
| Rate limiting | Each tool has a per-minute call limit to prevent runaway loops |
| Secure token storage | Tokens stored with restricted file permissions — only your user can read them |
| Minimal OAuth scopes | Calendar read-only, Gmail metadata only (no email body), Tasks read+write |
Architecture
Claude Desktop (MCP Client)
│ JSON-RPC over stdio (local)
▼
Personal Assistant Toolkit MCP Server (Node.js + TypeScript)
│
├── Input Validation (Zod) → Rate Limiter → Tool Handler
│
├── Google APIs — Calendar, Tasks, Gmail
├── Swift/EventKit — Apple Reminders (local, no app bridge)
└── Open-Meteo API — Weather (no auth)
Project structure
personal-assistant-toolkit/
├── README.md
├── package.json
├── tsconfig.json
├── .gitignore
├── scripts/
│ └── auth-personal.ts # Google OAuth2 setup
├── src/
│ ├── index.ts # MCP server entry point
│ ├── security/
│ │ ├── rate-limiter.ts
│ │ ├── input-validator.ts
│ │ └── token-manager.ts
│ └── tools/
│ ├── weather.ts # Open-Meteo
│ ├── calendar.ts # Google Calendar
│ ├── tasks.ts # Google Tasks
│ ├── gmail.ts # Gmail
│ └── reminders.ts # Apple Reminders (Swift/EventKit)
└── dist/ # Compiled output (auto-generated, not committed)
Troubleshooting
The hammer icon doesn't appear in Claude Desktop
- Run
npm run buildand check for errors - Verify the path in
claude_desktop_config.jsonis the full absolute path (no~shortcut) - Fully quit Claude Desktop with
Cmd+Qand reopen
Google auth error or token expired
- Delete
.tokens/google-personal.jsonand re-runnpm run auth:personal
Apple Reminders returns nothing
- Go to System Settings → Privacy & Security → Reminders → ensure access is enabled
- Ensure Xcode Command Line Tools are installed:
xcode-select --install
Weather shows wrong location
- Update
WEATHER_LATandWEATHER_LONinclaude_desktop_config.jsonand restart Claude Desktop
Check MCP server logs
cat ~/Library/Logs/Claude/mcp*.log
License
MIT — free to use, modify, and distribute.
Built by Anuraag Burman. If this saves you 20 minutes a day, it's done its job.