Metadata-Version: 2.4
Name: honest-calendar-mcp
Version: 0.1.0
Summary: Local MCP server for Google Calendar — read, create, update events with your Google account directly.
Project-URL: Homepage, https://github.com/bartosz-kuc/honest-calendar-mcp
Project-URL: Repository, https://github.com/bartosz-kuc/honest-calendar-mcp
Project-URL: Issues, https://github.com/bartosz-kuc/honest-calendar-mcp/issues
Author-email: Bartosz Kuć <firma@bartosza.pl>
License-Expression: MIT
License-File: LICENSE
Keywords: calendar,google,google-calendar,mcp,scheduling
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.10
Requires-Dist: google-api-python-client>=2.0.0
Requires-Dist: google-auth-oauthlib>=1.0.0
Requires-Dist: google-auth>=2.0.0
Requires-Dist: mcp>=1.0.0
Description-Content-Type: text/markdown

# honest-calendar-mcp

Local Google Calendar MCP server. Your calendar data never leaves your machine except to Google. No third party in the middle.

Companion project to [honest-gmail-mcp](https://github.com/bartosz-kuc/honest-gmail-mcp).

## Why

Most Calendar integrations for AI assistants route your event data through a hosted service that sees everything: meetings, attendees, locations, private descriptions. This one doesn't.

**Data flow:** `You ↔ this server (on your Mac) ↔ Google Calendar API`. That's it.

**You can read the entire server** — one file, ~250 lines of Python — and confirm exactly what it can and cannot do.

## Features

Six tools exposed over MCP:

- `list_calendars` — all calendars available on this account
- `list_events` — events in a calendar within a time range, with optional free-text search
- `get_event` — full details of a single event
- `create_event` — new event (timed or all-day), with attendees, description, location, timezone
- `update_event` — partial patch of an existing event
- `delete_event` — delete an event

All tools that send invites accept a `send_updates` parameter (`none` by default — no email is sent unless you explicitly ask for it).

## Requirements

- Python 3.10+
- A Google account you want to give it access to
- A one-time setup in Google Cloud Console (~10 min, can reuse the OAuth client from honest-gmail-mcp if you already set that up)

## Setup

### 1. Clone + install

```bash
git clone https://github.com/bartosz-kuc/honest-calendar-mcp.git
cd honest-calendar-mcp
python3 -m venv venv
./venv/bin/pip install -r requirements.txt
```

### 2. Get Google OAuth credentials

Same process as honest-gmail-mcp — a Desktop-app OAuth client from your own Google Cloud project. If you already have a project set up, just enable the Calendar API on it:

1. https://console.cloud.google.com/ (signed in with the account you want to authorize)
2. Select existing project (or create new one)
3. **APIs & Services → Library** → search **Google Calendar API** → **Enable**
4. Reuse existing OAuth consent screen / client, OR create new — Desktop app type
5. Save `credentials.json` in this repo's root directory

### 3. First run (does the OAuth dance)

```bash
./venv/bin/python server.py
```

Browser opens → sign in → **Allow**. Token saved locally as `token.json`. Press Ctrl+C after.

### 4. Register with your MCP client

**Claude Code:**

```bash
claude mcp add calendar-personal /absolute/path/to/venv/bin/python /absolute/path/to/server.py
```

**Claude Desktop:** edit `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "calendar-personal": {
      "command": "/absolute/path/to/venv/bin/python",
      "args": ["/absolute/path/to/server.py"]
    }
  }
}
```

## Example usage

> "What's on my calendar tomorrow?"

AI calls `list_events` with tomorrow's time range → gets back events with summary, start, end, attendees.

> "Book a 1h call with alice@example.com next Thursday at 15:00."

AI calls `create_event` with summary, start, end, attendees, `send_updates: "all"` if you want Alice invited.

## Data flow (detail)

```
Your AI client (Claude Code / Claude Desktop)
         ↕  MCP protocol over stdio (local process pipe)
This server (Python, on your machine)
         ↕  HTTPS to googleapis.com
Google Calendar API
```

No cloud middle. No telemetry. `credentials.json` and `token.json` stay on your disk and are `.gitignore`d.

## Security notes

- **You own the OAuth client.** Nobody else can revoke, rotate, or misuse it.
- **Revoke anytime** at https://myaccount.google.com/permissions.
- **Scope requested:** `calendar` (full read/write on all your calendars). Google does not offer read-only + write-only splits for the standard Calendar scope; the write-heavy nature of a calendar-editing tool needs full scope.
- **No secrets in git.** `.gitignore` blocks `credentials.json`, `token.json`, and virtualenvs.
- **send_updates defaults to "none"** — the AI cannot accidentally spam attendees. You must explicitly ask for updates to be sent.

## Author

**Bartosz Kuć** — Warsaw-based developer, JDG owner running skanfirmy.pl.

- Site: https://skanfirmy.pl
- GitHub: https://github.com/bartosz-kuc

- Email: firma@bartosza.pl

## Consulting

Available for consulting on Polish tax and business integrations (KSeF, GUS/NFZ/GIOŚ APIs, mBank data), MCP server design, and AI-assisted tooling for JDGs and small teams. Reach out via email.

## License

MIT — see [LICENSE](LICENSE).
