个人助理工具包

一个本地托管的个人生产力工具集成服务,通过Claude Desktop连接日历、任务、提醒、邮件和天气,提供智能化的每日简报。

  • by anuraagburman
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 anuraagburman/personal-assistant-toolkit

使用说明

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:

  1. Download a credentials JSON for each account from Google Cloud Console (same project is fine — you can use the same OAuth app)
  2. Rename each file: credentials-personal.json, credentials-work.json, credentials-side.json, etc.
  3. Place them in the project root
  4. 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

  1. Go to console.cloud.google.com — sign in with your Google account
  2. Create a new project named personal-assistant-toolkit
  3. In the search bar, search for and enable these three APIs:
    • Google Calendar API
    • Gmail API
    • Google Tasks API
  4. 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
  5. Go to Credentials → + Create Credentials → OAuth 2.0 Client ID
    • Application type: Desktop app
    • Name: personal-assistant-toolkit
    • Click Create → Download JSON
  6. Rename the downloaded file to credentials-personal.json
  7. Move it into the personal-assistant-toolkit folder

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

  1. Press Cmd + Space, type TextEdit, open it
  2. Go to File → Open → paste this path: ~/Library/Application Support/Claude/claude_desktop_config.json
  3. 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 (type whoami in Terminal to see it)
  • YOUR_LATITUDE / YOUR_LONGITUDE → from Step 7
  1. 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 build and check for errors
  • Verify the path in claude_desktop_config.json is the full absolute path (no ~ shortcut)
  • Fully quit Claude Desktop with Cmd+Q and reopen

Google auth error or token expired

  • Delete .tokens/google-personal.json and re-run npm 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_LAT and WEATHER_LON in claude_desktop_config.json and 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.