Skip to content

Google Workspace

google_workspace wraps the Google Drive, Sheets, Docs, Slides, Gmail, Calendar, and Meet REST APIs behind one connector. One instance = one Google account, authenticated via the Connect Account OAuth2 button — a single token grants access to all seven products.

This replaces the older code-only google_drive connector. The connector now ships 38 operations across 7 categories.

Sourceplugins/connector/google_workspace/
Keygoogle_workspace
Icon🗂️
Tierplugin — install with <app> plugin install google_workspace
Health check✅ — probes the token's granted scopes via Google tokeninfo and reports per-op availability
OAuth✅ — per-instance Google OAuth app credentials live on this row

This connector is no longer compiled into the wick binary. Install it as a plugin:

bash
<app> plugin install google_workspace

Existing credential rows and OAuth tokens are preserved on upgrade — the connector reappears automatically once the plugin is installed and enabled. See Connector Plugins for the full install flow.

Configs

The admin sets ClientID / ClientSecret (from a Google Cloud Console OAuth client); UserToken / RefreshToken are auto-filled when the operator clicks Connect Account and completes the Google consent screen. The connector requests offline access (access_type=offline, prompt=consent) so it obtains a refresh token and auto-renews the 1-hour access token.

New rows are Connect-ready by default. Google Workspace ships with DefaultAccess{EnableSSO: true, AllowOthersConnectSSO: true} so every freshly created instance row has the OAuth Connect Account flow already enabled — no manual Access Policy step required. Set ClientID and ClientSecret, then click Connect Account on the list page or the detail page.

FieldTypeRequiredNotes
ClientIDstringOAuth Client ID from Google Cloud Console. Required to activate the Connect Account button.
ClientSecretsecretOAuth Client Secret. Used in the token-exchange step.
UserTokensecretAccess token — auto-filled via Connect Account.
RefreshTokensecretRefresh token for auto-renewal — auto-filled via Connect Account.

OAuth scopes requested

The Connect Account flow asks for all of the scopes below; the health check verifies which were actually granted and enables ops accordingly:

ScopeEnables
https://www.googleapis.com/auth/driveAll Drive ops + Workspace file creation (create_doc / create_sheet / create_slides).
https://www.googleapis.com/auth/spreadsheetsAll sheets_* ops.
https://www.googleapis.com/auth/documentsAll docs_* ops.
https://www.googleapis.com/auth/presentationsAll slides_* ops.
https://www.googleapis.com/auth/gmail.modifygmail_list_messages, gmail_get_message, gmail_modify_labels.
https://www.googleapis.com/auth/gmail.sendgmail_send, gmail_reply.
https://www.googleapis.com/auth/gmail.composegmail_create_draft.
https://www.googleapis.com/auth/calendarAll calendar_* ops (full read/write).
https://www.googleapis.com/auth/meetings.space.createdAll meet_* ops. Lets meet_create_space create links and is a superset of meetings.space.readonly for the read ops.
https://www.googleapis.com/auth/userinfo.emailIdentifies the connected account (per-user token mapping).

The health check treats a write scope as a superset of its read-only variant. Read-only ops are satisfied by either the read-only or full scope.

Existing connected accounts must re-click Connect Account to grant the new Gmail, Calendar, and Meet scopes added in v0.22.0. Until re-consent, ops requiring those scopes are flagged as needs scope: … in the health check and will not execute.

Operations — Drive

Read

OpInputWhat it does
list_filesfolder_id, page_size, order_byList files/folders. Returns ID, name, MIME type, modified time, size, web view link. Empty folder_id lists My Drive root.
search_filesquery, page_sizeSearch using Drive query syntax (e.g. name contains 'report'). First page only.
get_file_infofile_idMetadata for one file/folder: name, MIME type, size, owner email, sharing state, parent IDs, web view link.
get_file_contentfile_idRead text content. Docs → plain text, Sheets → CSV, Slides → plain text, other files → raw bytes (first 100 KB).

Write (destructive)

OpInputWhat it does
upload_filename, content, folder_id, mime_typeUpload a new file from plain-text content. Returns ID + web view link. Default MIME type text/plain.
create_foldername, parent_folder_idCreate a folder. Returns ID + web view link.
delete_filefile_idMove a file/folder to trash (reversible within 30 days via the Drive UI — not a permanent delete).
share_filefile_id, email, roleGrant access by email. Role: reader, writer, or commenter. Returns the permission ID.
create_docname, folder_id, contentCreate a Google Doc, optionally with initial plain-text body. Returns ID + web view link.
create_sheetname, folder_id, csv_dataCreate a Google Sheet, optionally pre-populated from a CSV string. Returns ID + web view link.
create_slidesname, folder_id, first_slide_textCreate a Google Slides deck, optionally setting the first slide's title. Returns ID + web view link.

Operations — Sheets (Sheets API v4)

OpInputWhat it does
sheets_read_rangefile_id, rangeRead cell values from an A1 range (e.g. Sheet1!A1:C10). Returns rows as a JSON array + row count.
sheets_append_rowsfile_id, range, csv_dataAppend CSV rows after the last existing row in the table. Does not overwrite.
sheets_update_rangefile_id, range, csv_dataOverwrite an A1 range with CSV data. Existing values in the range are replaced.
sheets_clear_rangefile_id, rangeClear values from an A1 range. Formatting is preserved; only values are removed.

Operations — Docs (Docs API v1)

OpInputWhat it does
docs_append_textfile_id, textAppend plain text at the end of the document.
docs_replace_textfile_id, find, replace, match_caseFind-and-replace all occurrences throughout the doc. Case-insensitive by default. Returns the number of replacements.

Operations — Slides (Slides API v1)

OpInputWhat it does
slides_get_contentfile_idGet every slide's index, title, and body text, plus the deck title and slide count.
slides_add_slidefile_id, title, body, layout, insert_at_indexAdd a slide with optional title/body. Layout: TITLE_AND_BODY (default), BLANK, or TITLE_ONLY. insert_at_index 0-based; default appends. Returns the new slide ID + index.
slides_duplicate_slidefile_id, slide_indexDuplicate a slide by 0-based index. The copy is inserted immediately after the original.

Operations — Gmail

All Gmail ops require at least one Gmail scope (see scopes table). gmail_send, gmail_create_draft, gmail_reply, and gmail_modify_labels are marked destructive — they are enabled by default like every op, the destructive flag just makes the LLM confirm before executing (and an admin can disable any of them per row).

Read

OpInputWhat it does
gmail_list_messagesquery, max_resultsSearch the mailbox using Gmail query syntax (e.g. from:alice@abc.com is:unread newer_than:7d). Returns id, thread_id, from, to, subject, date, snippet. Leave query empty to list the whole mailbox. Default max_results: 20 (max 100).
gmail_get_messagemessage_idRead a single message in full: headers (from, to, cc, subject, date), labels, and the plain-text body.

Write (destructive)

OpInputWhat it does
gmail_sendto, cc, subject, bodySend a new plain-text email. to is a comma-separated list. Returns the sent message ID and thread ID. This delivers mail immediately — it is not a draft.
gmail_create_draftto, cc, subject, bodyCreate a draft without sending. Returns the draft ID and message ID. The user can review and send it later from Gmail.
gmail_replymessage_id, bodyReply to an existing message within its thread. Re: prefix and threading headers are set automatically; reply goes to the original sender. Returns the sent message ID.
gmail_modify_labelsmessage_id, add_labels, remove_labelsAdd and/or remove labels on a message. System labels: UNREAD, STARRED, IMPORTANT, INBOX, SPAM, TRASH. Remove UNREAD to mark read; remove INBOX to archive. At least one of add_labels or remove_labels is required. Returns the message's current label set.

Operations — Calendar

All Calendar ops require the calendar scope. Create/update/delete/RSVP ops are marked destructive (LLM confirms before executing; enabled by default, disable per row if you want).

Read

OpInputWhat it does
calendar_list_calendars(none)List all calendars on the account. Returns id, summary, description, primary flag, and access role. Use a calendar id with the other Calendar ops.
calendar_list_eventscalendar_id, time_min, time_max, query, max_resultsList events in a calendar within an optional time window. time_min / time_max are RFC3339 strings. Returns id, summary, start, end, attendees, and meet_link for each. Default calendar: primary. Default max_results: 50 (max 250).
calendar_get_eventcalendar_id, event_idRead a single event in full: summary, description, location, start/end, attendees with RSVP status, and Meet link if any.

Write (destructive)

OpInputWhat it does
calendar_create_eventcalendar_id, summary, description, location, start, end, attendees, add_meetCreate a calendar event. start / end are RFC3339 (or a date string for all-day events). Set add_meet=true to attach a Google Meet video link (returned in meet_link). attendees is comma-separated emails. Returns the created event.
calendar_update_eventcalendar_id, event_id, summary, description, location, start, end, attendeesPatch an existing event. Only non-empty fields are applied. Replaces the full attendee list if attendees is provided. Attendees are notified of changes. Returns the updated event.
calendar_delete_eventcalendar_id, event_idCancel and delete an event. Attendees are notified of the cancellation. Not reversible via this connector.
calendar_respond_eventcalendar_id, event_id, responseSet your RSVP on an event you were invited to. response: accepted, declined, or tentative. Returns the event ID and your new response status.

Operations — Meet

All Meet ops require the meetings.space.created scope (a superset of meetings.space.readonly). One op writes (meet_create_space); the rest are read-only. To attach a Meet link to a scheduled meeting with invitees, use calendar_create_event with add_meet=true instead.

Write (destructive)

OpInputWhat it does
meet_create_spaceaccess_typeCreate a standalone Meet space not tied to any calendar event. Returns meeting_uri (the shareable link) and meeting_code. access_type controls who can join: TRUSTED (org + invited, default), OPEN (anyone with the link), RESTRICTED (invited only). Marked destructive (LLM confirms before executing).

Read

OpInputWhat it does
meet_get_spacespaceGet a Meet space's config and active conference by resource name (e.g. spaces/abc), meeting code, or full Meet URL. Returns meeting_uri, meeting_code, access_type, and the active conference record if a call is live.
meet_list_conference_recordsfilter, page_sizeList past meetings (conference records), optionally filtered by Meet filter syntax (e.g. space.meeting_code="abc-defg-hij" or start_time>="2026-06-01T00:00:00Z"). Returns name, start_time, end_time, and space per record. Default page_size: 25 (max 100). Use a record name with the recordings / transcripts ops.
meet_list_recordingsconference_recordList recordings for a conference record. Returns name, state, start/end time, and the Drive file id of each recording (when available).
meet_list_transcriptsconference_recordList transcripts for a conference record. Returns name, state, start/end time, and the Google Docs document id of each transcript (when available).

Quirks worth knowing

  • One token, seven APIs. The health check (Test Integration) reflects which APIs are usable based on the scopes actually granted on the consent screen. If a scope is missing for a given op, the op reports needs scope: … and will not run. Re-run Connect Account to widen scopes.
  • Existing accounts need re-consent. Accounts connected before v0.22.0 lack the Gmail, Calendar, and Meet scopes. Click Connect Account again on the connector row to re-run the consent screen.
  • create_sheet / sheets_append_rows / sheets_update_range take CSV strings (one row per line; quoted fields and embedded newlines are handled). They do not accept JSON arrays.
  • list_files, search_files, and gmail_list_messages return first page only. For deeper pagination, loop in your workflow or call httprest against the API directly.
  • delete_file trashes, it does not permanently delete — the owner can restore within 30 days.
  • calendar_delete_event is not reversible via this connector (unlike Drive trash).
  • IDs are Google resource IDs (the long string in a Drive/Docs/Sheets/Slides URL, or the opaque ID from a list op). Resolve names to IDs with a list or search op first.
  • calendar_create_event with add_meet=true uses the Calendar conferenceData API to attach a Meet link. The meet_link field in the response contains the generated meet.google.com URL.
  • Two ways to get a Meet link. meet_create_space returns a standalone link with no event behind it — good for an ad-hoc "send me a link now". calendar_create_event with add_meet=true returns a link bound to a scheduled event with a time and invitees who get an email. Pick based on whether the meeting needs a calendar entry.

See also

  • Connector Module — module contract, file layout, wick:"..." tag grammar.
  • MCP for LLMswick_list / wick_get / wick_execute flow.
  • HTTP / REST — fallback for any Google API call wick hasn't typed yet.
  • Encrypted Fields — how the secret-tagged token fields are stored and round-tripped.
Built with ❤️ by a developer, for developers.