- Add CalendarConfig to schema with OAuth2 credentials support - Implement CalendarTool with list_events, create_event, and check_availability actions - Add email parser utility for extracting meeting information from emails - Register calendar tool in agent loop (auto-loaded when enabled) - Add calendar skill documentation - Update AGENTS.md with calendar integration instructions - Add CALENDAR_SETUP.md with complete setup guide - Add Google Calendar API dependencies to pyproject.toml - Support time parsing for 'today', 'tomorrow', and various time formats (12/24-hour, am/pm) - Ensure timezone-aware datetime handling for Google Calendar API compatibility
230 lines
7.0 KiB
Markdown
230 lines
7.0 KiB
Markdown
# Google Calendar Integration Setup
|
|
|
|
This guide explains how to set up Google Calendar integration for nanobot.
|
|
|
|
## Features
|
|
|
|
- **List upcoming events** from your Google Calendar
|
|
- **Create calendar events** programmatically
|
|
- **Check availability** for time slots
|
|
- **Automatic scheduling from emails** - when an email mentions a meeting, nanobot can automatically schedule it
|
|
|
|
## Prerequisites
|
|
|
|
1. Google account with Calendar access
|
|
2. Google Cloud Project with Calendar API enabled
|
|
3. OAuth2 credentials (Desktop app type)
|
|
|
|
## Setup Steps
|
|
|
|
### 1. Enable Google Calendar API
|
|
|
|
1. Go to [Google Cloud Console](https://console.cloud.google.com/)
|
|
2. Create a new project or select an existing one
|
|
3. Enable the **Google Calendar API**:
|
|
- Navigate to "APIs & Services" > "Library"
|
|
- Search for "Google Calendar API"
|
|
- Click "Enable"
|
|
|
|
### 2. Configure OAuth Consent Screen
|
|
|
|
**IMPORTANT:** This step is required before creating credentials.
|
|
|
|
1. Go to "APIs & Services" > "OAuth consent screen"
|
|
2. Choose **"External"** user type (unless you have a Google Workspace account)
|
|
3. Fill in required fields:
|
|
- **App name**: "nanobot" (or any name)
|
|
- **User support email**: Your email address
|
|
- **Developer contact information**: Your email address
|
|
4. Click "Save and Continue"
|
|
5. **Add Scopes:**
|
|
- Click "Add or Remove Scopes"
|
|
- Search for and add: `https://www.googleapis.com/auth/calendar`
|
|
- Click "Update" then "Save and Continue"
|
|
6. **Add Test Users (CRITICAL):**
|
|
- Click "Add Users"
|
|
- Add your email address (`adayear2025@gmail.com`)
|
|
- Click "Add" then "Save and Continue"
|
|
7. Review and go back to dashboard
|
|
|
|
### 3. Create OAuth2 Credentials
|
|
|
|
1. Go to "APIs & Services" > "Credentials"
|
|
2. Click "Create Credentials" > "OAuth client ID"
|
|
3. Select:
|
|
- **Application type**: **Desktop app**
|
|
- **Name**: "nanobot" (or any name)
|
|
4. Click "Create"
|
|
5. **Download the credentials JSON file** - click "Download JSON"
|
|
6. Save it as `credentials.json` and copy to your server at `~/.nanobot/credentials.json`
|
|
|
|
### 3. Configure nanobot
|
|
|
|
Set environment variables or add to your `.env` file:
|
|
|
|
```bash
|
|
# Enable calendar functionality
|
|
export NANOBOT_TOOLS__CALENDAR__ENABLED=true
|
|
|
|
# Path to OAuth2 credentials JSON file
|
|
export NANOBOT_TOOLS__CALENDAR__CREDENTIALS_FILE=/path/to/credentials.json
|
|
|
|
# Optional: Custom token storage location (default: ~/.nanobot/calendar_token.json)
|
|
export NANOBOT_TOOLS__CALENDAR__TOKEN_FILE=~/.nanobot/calendar_token.json
|
|
|
|
# Optional: Calendar ID (default: "primary")
|
|
export NANOBOT_TOOLS__CALENDAR__CALENDAR_ID=primary
|
|
|
|
# Optional: Auto-schedule meetings from emails (default: true)
|
|
export NANOBOT_TOOLS__CALENDAR__AUTO_SCHEDULE_FROM_EMAIL=true
|
|
```
|
|
|
|
### 4. First-Time Authorization
|
|
|
|
**You don't need to manually get or copy any token** - the OAuth flow handles everything automatically.
|
|
|
|
On first run, when nanobot tries to use the calendar tool, it will:
|
|
|
|
1. **Automatically open a browser window** for Google OAuth authorization
|
|
2. **You sign in** to your Google account in the browser
|
|
3. **Grant calendar access** by clicking "Allow"
|
|
4. **Automatically save the token** to `~/.nanobot/calendar_token.json` for future use
|
|
|
|
**Important:**
|
|
- The token is **automatically generated and saved** - you don't need to copy it from anywhere
|
|
- This happens **automatically** the first time you use a calendar command
|
|
- After the first authorization, you won't need to do this again (the token is reused)
|
|
- The token file is created automatically at `~/.nanobot/calendar_token.json`
|
|
|
|
**Example first run:**
|
|
```bash
|
|
# First time using calendar - triggers OAuth flow
|
|
python3 -m nanobot.cli.commands agent -m "What's on my calendar?"
|
|
|
|
# Browser opens automatically → Sign in → Grant access → Token saved
|
|
# Future runs use the saved token automatically
|
|
```
|
|
|
|
**Note for remote/headless servers:**
|
|
If you're running nanobot on a remote server without a display, you have two options:
|
|
|
|
1. **Run OAuth on your local machine first:**
|
|
- Run nanobot locally once to complete OAuth
|
|
- Copy the generated `~/.nanobot/calendar_token.json` to your remote server
|
|
- The token will work on the remote server
|
|
|
|
2. **Use SSH port forwarding:**
|
|
- The OAuth flow uses a local web server
|
|
- You may need to set up port forwarding or use a different OAuth flow method
|
|
|
|
## Usage Examples
|
|
|
|
### List Upcoming Events
|
|
|
|
```
|
|
User: "What's on my calendar?"
|
|
Agent: [Uses calendar tool to list events]
|
|
```
|
|
|
|
### Create an Event
|
|
|
|
```
|
|
User: "Schedule a meeting tomorrow at 2pm"
|
|
Agent: [Creates calendar event]
|
|
```
|
|
|
|
### Automatic Email Scheduling
|
|
|
|
When an email mentions a meeting:
|
|
|
|
```
|
|
Email: "Hi, let's have a meeting tomorrow at 2pm in Conference Room A"
|
|
Agent: [Automatically extracts meeting info and creates calendar event]
|
|
Agent: "I've scheduled a meeting for tomorrow at 2pm in Conference Room A"
|
|
```
|
|
|
|
## Calendar Tool API
|
|
|
|
The calendar tool supports three actions:
|
|
|
|
### 1. List Events
|
|
|
|
```python
|
|
calendar(
|
|
action="list_events",
|
|
max_results=10, # Optional, default: 10
|
|
time_min="2024-01-15T00:00:00Z" # Optional, defaults to now
|
|
)
|
|
```
|
|
|
|
### 2. Create Event
|
|
|
|
```python
|
|
calendar(
|
|
action="create_event",
|
|
title="Team Meeting",
|
|
start_time="tomorrow 2pm", # or "2024-01-15T14:00:00"
|
|
end_time="tomorrow 3pm", # Optional, defaults to 1 hour after start
|
|
description="Discuss project progress", # Optional
|
|
location="Conference Room A", # Optional
|
|
attendees=["colleague@example.com"] # Optional list
|
|
)
|
|
```
|
|
|
|
**Time formats:**
|
|
- Relative: `"tomorrow 2pm"`, `"in 1 hour"`, `"in 2 days"`
|
|
- ISO format: `"2024-01-15T14:00:00"`
|
|
|
|
### 3. Check Availability
|
|
|
|
```python
|
|
calendar(
|
|
action="check_availability",
|
|
start_time="2024-01-15T14:00:00",
|
|
end_time="2024-01-15T15:00:00"
|
|
)
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### "Error: Could not authenticate with Google Calendar"
|
|
|
|
- Ensure `credentials_file` path is correct
|
|
- Check that the credentials JSON file is valid
|
|
- Run nanobot once to complete OAuth flow
|
|
|
|
### "Error accessing Google Calendar API"
|
|
|
|
- Verify Calendar API is enabled in Google Cloud Console
|
|
- Check that OAuth consent screen is configured
|
|
- Ensure your email is added as a test user (if app is in testing mode)
|
|
|
|
### Token Expired
|
|
|
|
The tool automatically refreshes expired tokens. If refresh fails:
|
|
1. Delete `~/.nanobot/calendar_token.json`
|
|
2. Run nanobot again to re-authorize
|
|
|
|
## Security Notes
|
|
|
|
- Keep your `credentials.json` file secure (don't commit to git)
|
|
- The `calendar_token.json` file contains sensitive access tokens
|
|
- Use file permissions: `chmod 600 ~/.nanobot/calendar_token.json`
|
|
- Consider using environment variables or a secrets manager for production
|
|
|
|
## Integration with Email Channel
|
|
|
|
When `auto_schedule_from_email` is enabled, nanobot will:
|
|
|
|
1. Monitor incoming emails
|
|
2. Detect meeting-related keywords (meeting, appointment, call, etc.)
|
|
3. Extract meeting details (time, location, attendees)
|
|
4. Automatically create calendar events
|
|
5. Confirm with the user
|
|
|
|
This works best when:
|
|
- Emails contain clear time references ("tomorrow at 2pm", "next Monday")
|
|
- Meeting details are in the email body or subject
|
|
- The agent has access to the email channel
|
|
|