> **Building with AI coding agents?** If you're using an AI coding agent, install the official Scalekit plugin. It gives your agent full awareness of the Scalekit API — reducing hallucinations and enabling faster, more accurate code generation.
>
> - **Claude Code**: `/plugin marketplace add scalekit-inc/claude-code-authstack` then `/plugin install <auth-type>@scalekit-auth-stack`
> - **GitHub Copilot CLI**: `copilot plugin marketplace add scalekit-inc/github-copilot-authstack` then `copilot plugin install <auth-type>@scalekit-auth-stack`
> - **Codex**: run the bash installer, restart, then open Plugin Directory and enable `<auth-type>`
> - **Skills CLI** (Windsurf, Cline, 40+ agents): `npx skills add scalekit-inc/skills --list` then `--skill <skill-name>`
>
> `<auth-type>` / `<skill-name>`: `agentkit`, `full-stack-auth`, `mcp-auth`, `modular-sso`, `modular-scim` — [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Google Calendar

**Authentication:** OAuth 2.0
**Categories:** Communication
## What you can do

Connect this agent connector to let your agent:

- **Update update** — Update an existing event in a connected Google Calendar account
- **List list** — List events from a connected Google Calendar account with filtering options
- **Get get** — Retrieve a specific calendar event by its ID using optional filtering and list parameters
- **Delete delete** — Delete an event from a connected Google Calendar account
- **Create create** — Create a new event in a connected Google Calendar account

## Authentication

This connector uses **OAuth 2.0**. Scalekit acts as the OAuth client: it redirects your user to Google Calendar, obtains an access token, and automatically refreshes it before it expires. Your agent code never handles tokens directly — you only pass a `connectionName` and a user `identifier`.

You supply your Google Calendar **Connected App** credentials (Client ID + Secret) once per environment in the Scalekit dashboard.

Before calling this connector from your code, create the Google Calendar connection in **AgentKit** > **Connections** and copy the exact **Connection name** from that connection into your code. The value in code must match the dashboard exactly.

## Set up the connector

Register your Scalekit environment with the Google Calendar connector so Scalekit handles the authentication flow and token lifecycle for you. The connection name you create will be used to identify and invoke the connection programmatically. Then complete the configuration in your application as follows:

> caution
>
> Google applications using scopes that permit access to certain user data must complete a verification process.

1. ### Set up auth redirects

    - In [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** > **Connections** > **Create Connection**. Find **Google Calendar** and click **Create**. Click **Use your own credentials** and copy the redirect URI. It looks like `https:///sso/v1/oauth//callback`.

      > Image: Copy redirect URI from Scalekit dashboard

    - Navigate to [Google Cloud Console](https://console.cloud.google.com/projectselector2/home/dashboard?supportedpurview=project) → **APIs & Services** → **Credentials**. Select **+ Create Credentials**, then **OAuth client ID**. Choose **Web application** from the Application type menu.

      > Image: Select Web Application in Google OAuth settings

    - Under **Authorized redirect URIs**, click **+ Add URI**, paste the redirect URI, and click **Create**.

      > Image: Add authorized redirect URI in Google Cloud Console

2. ### Enable the Google Calendar API

    - In [Google Cloud Console](https://console.cloud.google.com/projectselector2/home/dashboard?supportedpurview=project), go to **APIs & Services** → **Library**. Search for "Google Calendar API" and click **Enable**.

3. ### Get client credentials

    - Google provides your Client ID and Client Secret after you create the OAuth client ID in step 1.

4. ### Add credentials in Scalekit

    - In [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** > **Connections** and open the connection you created.
    - Copy the **Connection name** shown on that connection and use that exact value in your code as `connection_name` or `connectionName`. It may be something like `meeting-prep-agent-googlecalendar`, not `googlecalendar`.
    - Enter your credentials:
      - Client ID (from above)
      - Client Secret (from above)
      - Permissions (scopes — see [Google API Scopes reference](https://developers.google.com/identity/protocols/oauth2/scopes))

      > Image: Add credentials in Scalekit dashboard
    - Click **Save**.

## Code examples

Connect a user's Google Calendar account and make API calls on their behalf — Scalekit handles OAuth and token management automatically.

Before running this code, create the Google Calendar connection in **AgentKit** > **Connections** in the Scalekit dashboard and copy its exact **Connection name** into the `connection_name` or `connectionName` variable below.

## Discover tool names

Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for this Google Calendar connection first.

  ### Node.js

```typescript

const connectionName = 'meeting-prep-agent-googlecalendar'; // copy the exact Connection name from AgentKit > Connections
const identifier = 'user_123'; // your unique user identifier

const scalekit = new ScalekitClient(
  process.env.SCALEKIT_ENV_URL,
  process.env.SCALEKIT_CLIENT_ID,
  process.env.SCALEKIT_CLIENT_SECRET
);

const { tools } = await scalekit.tools.listScopedTools(identifier, {
  filter: { connectionNames: [connectionName] },
  pageSize: 100,
});

for (const scopedTool of tools) {
  console.log('Available tool:', scopedTool.tool?.definition?.name);
}
```

  ### Python

```python

from dotenv import load_dotenv
from google.protobuf.json_format import MessageToDict
from scalekit.v1.tools.tools_pb2 import ScopedToolFilter

load_dotenv()

connection_name = "meeting-prep-agent-googlecalendar"  # copy the exact Connection name from AgentKit > Connections
identifier = "user_123"  # your unique user identifier

scalekit_client = scalekit.client.ScalekitClient(
    client_id=os.getenv("SCALEKIT_CLIENT_ID"),
    client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
    env_url=os.getenv("SCALEKIT_ENV_URL"),
)
actions = scalekit_client.actions

scoped_response, _ = actions.tools.list_scoped_tools(
    identifier=identifier,
    filter=ScopedToolFilter(connection_names=[connection_name]),
    page_size=100,
)

for scoped_tool in scoped_response.tools:
    definition = MessageToDict(scoped_tool.tool).get("definition", {})
    print("Available tool:", definition.get("name"))
```

## Execute tools

After the Google Calendar connected account is active, call the exact tool name and read the tool payload from `response.data`. For `googlecalendar_list_events`, the events array is inside `response.data["events"]`; the top-level response object is only the SDK wrapper.

  ### Node.js

```typescript
const accountResponse = await actions.getOrCreateConnectedAccount({
  connectionName,
  identifier,
});
const connectedAccountId = accountResponse.connectedAccount?.id;

if (!connectedAccountId) {
  throw new Error('Authorize the Google Calendar connection before listing events.');
}

const response = await actions.executeTool({
  toolName: 'googlecalendar_list_events',
  connectedAccountId,
  toolInput: {
    calendar_id: 'primary',
    max_results: 10,
  },
});

const events = Array.isArray(response.data?.events) ? response.data.events : [];
const nextPageToken =
  typeof response.data?.next_page_token === 'string' ? response.data.next_page_token : '';

console.log('Events returned:', events.length);
console.log('Next page token:', nextPageToken);
```

  ### Python

```python
account_response = actions.get_or_create_connected_account(
    connection_name=connection_name,
    identifier=identifier,
)
connected_account = account_response.connected_account

if not connected_account.id:
    raise RuntimeError("Authorize the Google Calendar connection before listing events.")

response = actions.execute_tool(
    tool_name="googlecalendar_list_events",
    connected_account_id=connected_account.id,
    tool_input={
        "calendar_id": "primary",
        "max_results": 10,
    },
)

data = response.data or {}
events = data.get("events", [])
next_page_token = data.get("next_page_token", "")

print("Events returned:", len(events))
print("Next page token:", next_page_token)
```

## Proxy API Calls

  ### Node.js

```typescript

const connectionName = 'meeting-prep-agent-googlecalendar'; // copy the exact Connection name from AgentKit > Connections
const identifier = 'user_123'; // your unique user identifier

// Get your credentials from app.scalekit.com → Developers → Settings → API Credentials
const scalekit = new ScalekitClient(
  process.env.SCALEKIT_ENV_URL,
  process.env.SCALEKIT_CLIENT_ID,
  process.env.SCALEKIT_CLIENT_SECRET
);
const actions = scalekit.actions;

// Create or fetch the connected account first
const response = await actions.getOrCreateConnectedAccount({
  connectionName,
  identifier,
});
const connectedAccount = response.connectedAccount;

if (connectedAccount?.status !== ConnectorStatus.ACTIVE) {
  const { link } = await actions.getAuthorizationLink({
    connectionName,
    identifier,
  });
  console.log('🔗 Authorize Google Calendar:', link); // present this link to your user for authorization, or click it yourself for testing
  process.stdout.write('Press Enter after authorizing...');
  await new Promise(r => process.stdin.once('data', r));
}

// Make a request via Scalekit proxy
const result = await actions.request({
  connectionName,
  identifier,
  path: '/calendar/v3/users/me/calendarList',
  method: 'GET',
});
console.log(result);
```

  ### Python

```python

from dotenv import load_dotenv
load_dotenv()

connection_name = "meeting-prep-agent-googlecalendar"  # copy the exact Connection name from AgentKit > Connections
identifier = "user_123"  # your unique user identifier

# Get your credentials from app.scalekit.com → Developers → Settings → API Credentials
scalekit_client = scalekit.client.ScalekitClient(
    client_id=os.getenv("SCALEKIT_CLIENT_ID"),
    client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
    env_url=os.getenv("SCALEKIT_ENV_URL"),
)
actions = scalekit_client.actions

# Create or fetch the connected account first
response = actions.get_or_create_connected_account(
    connection_name=connection_name,
    identifier=identifier
)
connected_account = response.connected_account

if connected_account.status != "ACTIVE":
    link_response = actions.get_authorization_link(
        connection_name=connection_name,
        identifier=identifier
    )
    # present this link to your user for authorization, or click it yourself for testing
    print("🔗 Authorize Google Calendar:", link_response.link)
    input("Press Enter after authorizing...")

# Make a request via Scalekit proxy
result = actions.request(
    connection_name=connection_name,
    identifier=identifier,
    path="/calendar/v3/users/me/calendarList",
    method="GET"
)
print(result)
```

## Tool list

Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first.

## Tool list

### `googlecalendar_create_event`

Create a new event in a connected Google Calendar account. Supports meeting links, recurrence, attendees, and more.

Parameters:

- `start_datetime` (`string`, required): Event start time in RFC3339 format
- `summary` (`string`, required): Event title/summary
- `attendees_emails` (`array`, optional): Attendee email addresses
- `calendar_id` (`string`, optional): Calendar ID to create the event in
- `create_meeting_room` (`boolean`, optional): Generate a Google Meet link for this event
- `description` (`string`, optional): Optional event description
- `event_duration_hour` (`integer`, optional): Duration of event in hours
- `event_duration_minutes` (`integer`, optional): Duration of event in minutes
- `event_type` (`string`, optional): Event type for display purposes
- `guests_can_invite_others` (`boolean`, optional): Allow guests to invite others
- `guests_can_modify` (`boolean`, optional): Allow guests to modify the event
- `guests_can_see_other_guests` (`boolean`, optional): Allow guests to see each other
- `location` (`string`, optional): Location of the event
- `recurrence` (`array`, optional): Recurrence rules (iCalendar RRULE format)
- `schema_version` (`string`, optional): Optional schema version to use for tool execution
- `send_updates` (`boolean`, optional): Send update notifications to attendees
- `timezone` (`string`, optional): Timezone for the event (IANA time zone identifier)
- `tool_version` (`string`, optional): Optional tool version to use for execution
- `transparency` (`string`, optional): Calendar transparency (free/busy)
- `visibility` (`string`, optional): Visibility of the event

### `googlecalendar_delete_event`

Delete an event from a connected Google Calendar account. Requires the calendar ID and event ID.

Parameters:

- `event_id` (`string`, required): The ID of the calendar event to delete
- `calendar_id` (`string`, optional): The ID of the calendar from which the event should be deleted
- `schema_version` (`string`, optional): Optional schema version to use for tool execution
- `tool_version` (`string`, optional): Optional tool version to use for execution

### `googlecalendar_get_event_by_id`

Retrieve a specific calendar event by its ID using optional filtering and list parameters.

Parameters:

- `event_id` (`string`, required): The unique identifier of the calendar event to fetch
- `calendar_id` (`string`, optional): The calendar ID to search in
- `event_types` (`array`, optional): Filter by Google event types
- `query` (`string`, optional): Free text search query
- `schema_version` (`string`, optional): Optional schema version to use for tool execution
- `show_deleted` (`boolean`, optional): Include deleted events in results
- `single_events` (`boolean`, optional): Expand recurring events into instances
- `time_max` (`string`, optional): Upper bound for event start time (RFC3339)
- `time_min` (`string`, optional): Lower bound for event start time (RFC3339)
- `tool_version` (`string`, optional): Optional tool version to use for execution
- `updated_min` (`string`, optional): Filter events updated after this time (RFC3339)

### `googlecalendar_list_calendars`

List all accessible Google Calendar calendars for the authenticated user. Supports filters and pagination.

Parameters:

- `max_results` (`integer`, optional): Maximum number of calendars to fetch
- `min_access_role` (`string`, optional): Minimum access role to include in results
- `page_token` (`string`, optional): Token to retrieve the next page of results
- `schema_version` (`string`, optional): Optional schema version to use for tool execution
- `show_deleted` (`boolean`, optional): Include deleted calendars in the list
- `show_hidden` (`boolean`, optional): Include calendars that are hidden from the calendar list
- `sync_token` (`string`, optional): Token to get updates since the last sync
- `tool_version` (`string`, optional): Optional tool version to use for execution

### `googlecalendar_list_events`

List events from a connected Google Calendar account with filtering options. Requires a valid Google Calendar OAuth2 connection.

Parameters:

- `calendar_id` (`string`, optional): Calendar ID to list events from
- `max_results` (`integer`, optional): Maximum number of events to fetch
- `order_by` (`string`, optional): Order of events in the result
- `page_token` (`string`, optional): Page token for pagination
- `query` (`string`, optional): Free text search query
- `schema_version` (`string`, optional): Optional schema version to use for tool execution
- `single_events` (`boolean`, optional): Expand recurring events into single events
- `time_max` (`string`, optional): Upper bound for event start time (RFC3339 timestamp)
- `time_min` (`string`, optional): Lower bound for event start time (RFC3339 timestamp)
- `tool_version` (`string`, optional): Optional tool version to use for execution

### `googlecalendar_update_event`

Update an existing event in a connected Google Calendar account. Only provided fields will be updated. Supports updating time, attendees, location, meeting links, and more.

Parameters:

- `calendar_id` (`string`, required): Calendar ID containing the event
- `event_id` (`string`, required): The ID of the calendar event to update
- `attendees_emails` (`array`, optional): Attendee email addresses
- `create_meeting_room` (`boolean`, optional): Generate a Google Meet link for this event
- `description` (`string`, optional): Optional event description
- `end_datetime` (`string`, optional): Event end time in RFC3339 format
- `event_duration_hour` (`integer`, optional): Duration of event in hours
- `event_duration_minutes` (`integer`, optional): Duration of event in minutes
- `event_type` (`string`, optional): Event type for display purposes
- `guests_can_invite_others` (`boolean`, optional): Allow guests to invite others
- `guests_can_modify` (`boolean`, optional): Allow guests to modify the event
- `guests_can_see_other_guests` (`boolean`, optional): Allow guests to see each other
- `location` (`string`, optional): Location of the event
- `recurrence` (`array`, optional): Recurrence rules (iCalendar RRULE format)
- `schema_version` (`string`, optional): Optional schema version to use for tool execution
- `send_updates` (`boolean`, optional): Send update notifications to attendees
- `start_datetime` (`string`, optional): Event start time in RFC3339 format
- `summary` (`string`, optional): Event title/summary
- `timezone` (`string`, optional): Timezone for the event (IANA time zone identifier)
- `tool_version` (`string`, optional): Optional tool version to use for execution
- `transparency` (`string`, optional): Calendar transparency (free/busy)
- `visibility` (`string`, optional): Visibility of the event


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
