Skip to main content
Glama

Google Workspace MCP Server

Your own MCP server for full Google Workspace access from Claude Desktop or Claude Code.

Gmail (send + read) · Drive · Calendar · Docs · Sheets · Slides · Forms · Tasks · Contacts

Built with FastMCP. Uses your own Google Cloud OAuth credentials. You own everything.


Setup

1. Google Cloud Console (you do this in your browser)

  1. Go to https://console.cloud.google.com → Create a new project

  2. Enable these APIs (APIs & Services → Library):

    • Gmail, Calendar, Drive, Docs, Sheets, Slides, Forms, Tasks, People, Google Meet

  3. Set up OAuth consent screen (APIs & Services → OAuth consent screen):

    • Choose External, add your email as test user

    • Add all workspace scopes

  4. Create OAuth credentials (APIs & Services → Credentials → Create → OAuth Client ID → Desktop Application)

  5. Copy the Client ID and Client Secret

2. Install & Run

# Set your credentials
export GOOGLE_OAUTH_CLIENT_ID="your-client-id-here"
export GOOGLE_OAUTH_CLIENT_SECRET="your-client-secret-here"

# Run with uv (no install needed)
cd google-workspace-mcp
uv run server.py

3. Connect to Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "google_workspace": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/google-workspace-mcp", "server.py"],
      "env": {
        "GOOGLE_OAUTH_CLIENT_ID": "your-client-id",
        "GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret"
      }
    }
  }
}

4. Connect to Claude Code

claude mcp add google_workspace -- uv run --directory /path/to/google-workspace-mcp server.py

5. First authentication

First time you use any tool, a browser window opens for Google OAuth. Sign in, approve the permissions, done. Token is saved to ~/.gw-mcp/token.json and auto-refreshes.


Related MCP server: mcp-google-workspace

Tools (108 total)

Gmail (18)

  • gmail_search — search with Gmail query syntax

  • gmail_read_message — read full message content

  • gmail_read_thread — read all messages in a thread

  • gmail_send — send emails (plain text or HTML, CC/BCC, threading)

  • gmail_draft — create drafts

  • gmail_send_draft — send an existing draft

  • gmail_list_labels — list all labels

  • gmail_create_label — create new labels

  • gmail_delete_label — delete labels

  • gmail_modify_labels — archive, mark read/unread, star, etc

  • gmail_get_attachment — download attachments

  • gmail_trash — move to trash

  • gmail_untrash — restore from trash

  • gmail_list_filters — list email filters

  • gmail_create_filter — create filter rules

  • gmail_delete_filter — delete filters

  • gmail_get_vacation — get vacation responder settings

  • gmail_set_vacation — set vacation responder

Calendar (8)

  • calendar_list_calendars — list all calendars

  • calendar_get_events — get events with time range and search

  • calendar_create_event — create events with attendees + Google Meet links

  • calendar_update_event — update existing events

  • calendar_delete_event — delete events

  • calendar_freebusy — query free/busy availability

  • calendar_list_recurring_instances — list instances of recurring events

  • calendar_quick_add — create event from text string

Meet (7)

  • meet_create_space — create a meeting space

  • meet_get_space — get meeting space by name

  • meet_list_participants — list participants

  • meet_get_artifacts — get recordings, transcripts, and transcript entries

  • meet_end_conference — end an active conference

  • meet_list_conference_records — list past meetings

  • meet_list_participant_sessions — list participant sessions

Drive (15)

  • drive_search — search files

  • drive_read_file — read file content (Docs, Sheets, text files)

  • drive_create_file — create files (plain text or Google Docs)

  • drive_list_folder — list folder contents

  • drive_share_file — share files with users

  • drive_create_folder — create folders

  • drive_copy_file — copy files

  • drive_export — export to format (PDF, CSV, etc)

  • drive_add_comment — add comments to files

  • drive_list_comments — list file comments

  • drive_list_revisions — list file version history

  • drive_list_permissions — list file permissions

  • drive_delete_permission — revoke file access

  • drive_trash — move to trash

  • drive_untrash — restore from trash

Docs (9)

  • docs_create — create new docs

  • docs_read — read doc content

  • docs_insert_text — insert text at position

  • docs_find_replace — find and replace

  • docs_append_text — append to end

  • docs_insert_table — insert tables

  • docs_insert_image — insert images

  • docs_format_text — format text (bold, italic, color, font)

  • docs_insert_bullets — insert bullet lists

  • docs_insert_page_break — insert page breaks

Sheets (12)

  • sheets_read — read cell ranges

  • sheets_write — write values

  • sheets_append — append rows

  • sheets_create — create spreadsheets

  • sheets_clear — clear ranges

  • sheets_get_info — get spreadsheet metadata

  • sheets_batch_update — batch update cells

  • sheets_add_sheet — add new sheet/tab

  • sheets_delete_sheet — delete sheet/tab

  • sheets_merge_cells — merge cells

  • sheets_add_chart — add charts

  • sheets_add_conditional_format — add conditional formatting

  • sheets_add_named_range — add named ranges

Tasks (8)

  • tasks_list_tasklists — list task lists

  • tasks_list — list tasks

  • tasks_create — create tasks (with subtask support)

  • tasks_update — update tasks

  • tasks_delete — delete tasks

  • tasks_create_tasklist — create task lists

  • tasks_move — move/reorder tasks

  • tasks_clear_completed — clear completed tasks

Contacts (11)

  • contacts_search — search by name/email/phone

  • contacts_list — list all contacts

  • contacts_create — create contacts

  • contacts_update — update contacts

  • contacts_delete — delete contacts

  • contacts_list_groups — list contact groups

  • contacts_create_group — create contact group

  • contacts_modify_group_members — add/remove group members

  • contacts_batch_create — batch create contacts

  • contacts_batch_delete — batch delete contacts

  • contacts_get_photo — get contact photo

Slides (10)

  • slides_create — create presentations

  • slides_read — read slide content

  • slides_add_slide — add slides with layouts

  • slides_add_text — add text to slides

  • slides_insert_shape — insert shapes

  • slides_insert_image — insert images

  • slides_insert_table — insert tables

  • slides_insert_video — insert videos

  • slides_format_text — format text

  • slides_get_thumbnail — get slide thumbnail

Forms (8)

  • forms_create — create forms

  • forms_read — read form structure

  • forms_list_responses — list form responses

  • forms_add_question — add questions

  • forms_update_question — update questions

  • forms_delete_question — delete questions

  • forms_move_question — reorder questions

  • forms_update_settings — update form settings


Build It Yourself Prompt

Want to rebuild this from scratch using Claude? Paste this into Claude Code Desktop:

Build me a Python MCP server using FastMCP at ~/Desktop/google-workspace-mcp/. It should give me full access to Google Workspace with these tools:

Gmail (18): search, read message, read thread, send (with CC/BCC, HTML, threading for replies), create draft, send draft, list labels, create label, delete label, modify labels (archive, star, mark read/unread), get attachment, trash, untrash, list filters, create filter, delete filter, get vacation responder, set vacation responder

Calendar (8): list calendars, get events (with time range + search), create event (with attendees, timezone, Google Meet link generation), update event, delete event, query free/busy, list recurring event instances, quick add from text string

Meet (7): create meeting space, get meeting space, list participants, get artifacts (recordings + transcripts), end active conference, list conference records, list participant sessions

Drive (15): search files, read file content (export Google Docs/Sheets/Slides to text), create file (plain text or Google Doc), list folder, share file, create folder, copy file, export to format, add comment, list comments, list revisions, list permissions, delete permission, trash, untrash

Docs (9): create, read, insert text at position, find and replace, append text, insert table, insert image, format text (bold/italic/color/font), insert bullet list, insert page break

Sheets (12): read ranges, write values, append rows, create spreadsheet, clear ranges, get spreadsheet metadata, batch update cells, add sheet/tab, delete sheet/tab, merge cells, add chart, add conditional formatting, add named range

Tasks (8): list task lists, list tasks, create task (with subtask support), update task, delete task, create task list, move/reorder task, clear completed tasks

Contacts (11): search by name/email/phone, list all, create, update, delete, list contact groups, create group, modify group members, batch create, batch delete, get contact photo

Slides (10): create presentation, read slide content, add slide with layout, add text to slide, insert shape, insert image, insert table, insert video, format text, get slide thumbnail

Forms (8): create form, read form structure, list responses, add question, update question, delete question, move/reorder question, update form settings

Requirements:

  • Separate file per service (tools_gmail.py, tools_calendar.py, tools_meet.py, tools_drive.py, tools_docs.py, tools_sheets.py, tools_tasks.py, tools_contacts.py, tools_slides.py, tools_forms.py) plus auth.py and server.py

  • auth.py handles Google OAuth2: reads GOOGLE_OAUTH_CLIENT_ID and GOOGLE_OAUTH_CLIENT_SECRET from env vars, opens browser on first use, saves token to ~/.gw-mcp/token.json, auto-refreshes

  • Use google-api-python-client and google-auth-oauthlib

  • pyproject.toml with uv, entry point gw-mcp = "server:main"

  • .gitignore for .venv, pycache, .env, token.json, credentials.json

  • README with setup instructions for Google Cloud Console, running with uv, and adding to Claude Desktop + Claude Code configs

Available Tools

108 tools
calendar_create_eventB

Create a calendar event. Use RFC3339 datetimes for timed events or YYYY-MM-DD for all-day. Set add_google_meet=True to auto-generate a Google Meet link.

Inputs: end (required), start (required), summary (required), location, +5 more. Returns: result

calendar_delete_eventC

Delete a calendar event.

Inputs: event_id (required), calendar_id. Returns: result

calendar_freebusyB

Query free/busy info for calendars. Returns busy time blocks.

Inputs: time_max (required), time_min (required), timezone, calendars. Returns: result

calendar_get_eventsA

Get calendar events. Filter by time range (RFC3339 format) and/or text search.

Inputs: query, time_max, time_min, calendar_id, +1 more. Returns: result

calendar_list_calendarsA

List all calendars the user has access to.

Inputs: no named parameters. Returns: result

calendar_list_recurring_instancesC

List instances of a recurring event.

Inputs: event_id (required), time_max, time_min, calendar_id, +1 more. Returns: result

calendar_quick_addB

Create an event from natural language (e.g. 'Lunch with John tomorrow at noon').

Inputs: text (required), calendar_id. Returns: result

calendar_update_eventB

Update an existing calendar event. Only provided fields are changed.

Inputs: event_id (required), end, start, summary, +4 more. Returns: result

contacts_batch_createB

Create multiple contacts at once. Each dict: {givenName, familyName, email, phone, organization, title}.

Inputs: contacts (required). Returns: result

contacts_batch_deleteB

Delete multiple contacts at once.

Inputs: resource_names (required). Returns: result

contacts_createC

Create a new contact with name, email, phone, organization, and title.

Inputs: given_name (required), email, phone, title, +2 more. Returns: result

contacts_create_groupB

Create a new contact group.

Inputs: name (required). Returns: result

contacts_deleteB

Delete a contact by resource name.

Inputs: resource_name (required). Returns: result

contacts_get_photoA

Get the photo URL for a contact.

Inputs: resource_name (required). Returns: result

contacts_listC

List all contacts sorted by last name.

Inputs: max_results. Returns: result

contacts_list_groupsB

List all contact groups (labels).

Inputs: max_results. Returns: result

contacts_modify_group_membersB

Add or remove contacts from a contact group.

Inputs: group_resource_name (required), add_contacts, remove_contacts. Returns: result

contacts_updateA

Update a contact. Resource name from contacts_search/contacts_list (e.g. 'people/c123').

Inputs: resource_name (required), email, phone, title, +3 more. Returns: result

docs_append_textC

Append text to the end of a Google Doc.

Inputs: text (required), document_id (required). Returns: result

docs_createA

Create a new Google Doc with optional initial text content.

Inputs: title (required), body_text. Returns: result

docs_find_replaceB

Find and replace text in a Google Doc.

Inputs: find_text (required), document_id (required), replace_text (required), match_case. Returns: result

docs_format_textB

Apply formatting (bold, italic, underline, font size, color) to a text range in a Google Doc.

Inputs: end_index (required), document_id (required), start_index (required), bold, +5 more. Returns: result

docs_insert_bulletsC

Apply bullet or numbered list formatting to paragraphs in a Google Doc.

Inputs: end_index (required), document_id (required), start_index (required), bullet_type. Returns: result

docs_insert_imageB

Insert an image into a Google Doc from a URL.

Inputs: image_uri (required), document_id (required), index, width_pt, +1 more. Returns: result

docs_insert_page_breakC

Insert a page break in a Google Doc.

Inputs: index (required), document_id (required). Returns: result

docs_insert_tableB

Insert a table into a Google Doc.

Inputs: rows (required), columns (required), document_id (required), index. Returns: result

docs_insert_textA

Insert text at a specific position in a Google Doc. Index 1 = beginning.

Inputs: text (required), document_id (required), index. Returns: result

docs_readA

Read the full text content of a Google Doc.

Inputs: document_id (required). Returns: result

drive_add_commentC

Add a comment to a Drive file.

Inputs: content (required), file_id (required). Returns: result

drive_copy_fileC

Copy a file in Google Drive.

Inputs: file_id (required), name, folder_id. Returns: result

drive_create_fileC

Create a new file in Drive. Set as_google_doc=True to create a Google Doc.

Inputs: name (required), content, folder_id, mime_type, +1 more. Returns: result

drive_create_folderC

Create a folder in Google Drive.

Inputs: name (required), parent_id. Returns: result

drive_delete_permissionB

Remove a sharing permission from a file.

Inputs: file_id (required), permission_id (required). Returns: result

drive_exportA

Export a Google Workspace file to a format (PDF, DOCX, CSV, XLSX, PPTX, PNG, etc).

Inputs: file_id (required), mime_type (required). Returns: result

drive_list_commentsB

List comments on a Drive file.

Inputs: file_id (required), max_results. Returns: result

drive_list_folderB

List contents of a Drive folder.

Inputs: folder_id, max_results. Returns: result

drive_list_permissionsB

List sharing permissions on a file.

Inputs: file_id (required). Returns: result

drive_list_revisionsB

List file revisions (version history).

Inputs: file_id (required). Returns: result

drive_read_fileA

Read the text content of a Drive file (Google Docs/Sheets/Slides exported, or raw text files).

Inputs: file_id (required). Returns: result

drive_share_fileB

Share a Drive file. Roles: 'reader', 'writer', 'commenter'.

Inputs: email (required), file_id (required), role, send_notification. Returns: result

drive_trashA

Move a file to the trash.

Inputs: file_id (required). Returns: result

drive_untrashC

Restore a file from the trash.

Inputs: file_id (required). Returns: result

forms_add_questionC

Add a question to a form. Types: TEXT, PARAGRAPH, RADIO, CHECKBOX, DROP_DOWN, SCALE.

Inputs: title (required), form_id (required), index, options, +3 more. Returns: result

forms_createB

Create a new Google Form.

Inputs: title (required), description. Returns: result

forms_delete_questionC

Delete a question from a form by its 0-based index.

Inputs: form_id (required), item_index (required). Returns: result

forms_list_responsesC

List all responses submitted to a Google Form.

Inputs: form_id (required), max_results. Returns: result

forms_move_questionB

Move/reorder a question in a form.

Inputs: form_id (required), to_index (required), from_index (required). Returns: result

forms_readB

Read a form's structure, questions, and settings.

Inputs: form_id (required). Returns: result

forms_update_questionC

Update an existing question in a form.

Inputs: form_id (required), item_index (required), title, required. Returns: result

forms_update_settingsB

Update form settings (make it a quiz, change description).

Inputs: form_id (required), is_quiz, description. Returns: result

gmail_create_filterB

Create a Gmail filter. criteria: {from, to, subject, query, hasAttachment}. action: {addLabelIds, removeLabelIds, forward}.

Inputs: action (required), criteria (required). Returns: result

gmail_create_labelC

Create a new Gmail label.

Inputs: name (required). Returns: result

gmail_delete_filterC

Delete a Gmail filter.

Inputs: filter_id (required). Returns: result

gmail_delete_labelC

Delete a Gmail label.

Inputs: label_id (required). Returns: result

gmail_draftA

Create a Gmail draft. All fields are optional for work-in-progress drafts.

Inputs: cc, to, bcc, body, +3 more. Returns: result

gmail_get_attachmentB

Download a Gmail attachment and return its base64 data.

Inputs: message_id (required), attachment_id (required). Returns: result

gmail_get_vacationA

Get current Gmail vacation/auto-reply settings.

Inputs: no named parameters. Returns: result

gmail_list_filtersA

List all Gmail filters.

Inputs: no named parameters. Returns: result

gmail_list_labelsA

List all Gmail labels (system and user-created).

Inputs: no named parameters. Returns: result

gmail_modify_labelsA

Modify labels on a message. Use to archive (remove INBOX), mark read (remove UNREAD), star (add STARRED), etc.

Inputs: message_id (required), add_labels, remove_labels. Returns: result

gmail_read_messageB

Read the full content of a Gmail message by its ID.

Inputs: message_id (required). Returns: result

gmail_read_threadA

Read all messages in a Gmail thread by its thread ID.

Inputs: thread_id (required). Returns: result

gmail_sendB

Send an email. Supports plain text and HTML, CC/BCC, and threading for replies.

Inputs: to (required), body (required), subject (required), cc, +4 more. Returns: result

gmail_send_draftB

Send an existing Gmail draft.

Inputs: draft_id (required). Returns: result

gmail_set_vacationC

Set Gmail vacation/auto-reply responder.

Inputs: enable (required), body, html, subject, +4 more. Returns: result

gmail_trashB

Move a Gmail message to the trash.

Inputs: message_id (required). Returns: result

gmail_untrashB

Remove a Gmail message from the trash.

Inputs: message_id (required). Returns: result

meet_create_spaceA

Create a new Google Meet meeting space. Returns meeting URI and code.

Inputs: no named parameters. Returns: result

meet_end_conferenceB

End an active conference in a meeting space.

Inputs: space_name (required). Returns: result

meet_get_artifactsA

Get recordings, transcripts, and transcript entries for a conference record.

Inputs: conference_record_name (required). Returns: result

meet_get_spaceA

Get details about a Google Meet meeting space by its resource name (e.g. 'spaces/abc-defg-hij').

Inputs: space_name (required). Returns: result

meet_list_conference_recordsB

List past conference records (meeting history).

Inputs: max_results. Returns: result

meet_list_participantsA

List participants and their sessions for a conference record (e.g. 'conferenceRecords/abc-defg-hij').

Inputs: conference_record_name (required). Returns: result

meet_list_participant_sessionsB

List sessions for a specific participant in a conference.

Inputs: participant_name (required), conference_record_name (required). Returns: result

sheets_add_chartC

Add a chart. Types: BAR, LINE, AREA, COLUMN, SCATTER, COMBO, STEPPED_AREA.

Inputs: sheet_id (required), chart_type (required), data_range (required), spreadsheet_id (required), +1 more. Returns: result

sheets_add_conditional_formatC

Add conditional formatting. rule_type: NUMBER_GREATER, TEXT_CONTAINS, CUSTOM_FORMULA, BLANK, etc.

Inputs: values (required), end_col (required), end_row (required), sheet_id (required), +5 more. Returns: result

sheets_add_named_rangeC

Create a named range in a spreadsheet.

Inputs: name (required), end_col (required), end_row (required), sheet_id (required), +3 more. Returns: result

sheets_add_sheetB

Add a new sheet/tab to a spreadsheet.

Inputs: title (required), spreadsheet_id (required). Returns: result

sheets_appendB

Append rows to a Google Sheet after existing data.

Inputs: range (required), values (required), spreadsheet_id (required). Returns: result

sheets_batch_updateA

Write to multiple ranges in one request. data: [{"range": "A1", "values": [[...]]}].

Inputs: data (required), spreadsheet_id (required). Returns: result

sheets_clearB

Clear values from a range in a Google Sheet.

Inputs: range (required), spreadsheet_id (required). Returns: result

sheets_createA

Create a new Google Spreadsheet with optional custom sheet/tab names.

Inputs: title (required), sheet_names. Returns: result

sheets_delete_sheetA

Delete a sheet/tab (by numeric sheet ID, not name).

Inputs: sheet_id (required), spreadsheet_id (required). Returns: result

sheets_get_infoA

Get spreadsheet metadata — title, sheets/tabs, row and column counts.

Inputs: spreadsheet_id (required). Returns: result

sheets_merge_cellsB

Merge cells in a sheet. Indices are 0-based, end is exclusive.

Inputs: end_col (required), end_row (required), sheet_id (required), start_col (required), +3 more. Returns: result

sheets_readA

Read values from a Google Sheet. Use A1 notation for ranges (e.g. 'Sheet1!A1:D10').

Inputs: spreadsheet_id (required), range. Returns: result

sheets_writeC

Write values to a Google Sheet. Values is a 2D array like [['Name','Age'],['Alice',30]].

Inputs: range (required), values (required), spreadsheet_id (required). Returns: result

slides_add_slideB

Add a slide. Layouts: BLANK, CAPTION_ONLY, TITLE, TITLE_AND_BODY, TITLE_AND_TWO_COLUMNS.

Inputs: presentation_id (required), layout, insertion_index. Returns: result

slides_add_textA

Add text to a slide. Creates a new text box if shape_id is empty.

Inputs: text (required), slide_id (required), presentation_id (required), shape_id. Returns: result

slides_createC

Create a new Google Slides presentation.

Inputs: title (required). Returns: result

slides_format_textB

Format text within a shape on a slide (bold, italic, size, color).

Inputs: shape_id (required), end_index (required), start_index (required), presentation_id (required), +5 more. Returns: result

slides_get_thumbnailC

Get a thumbnail image URL for a slide.

Inputs: slide_id (required), presentation_id (required). Returns: result

slides_insert_imageC

Insert an image onto a slide from a URL.

Inputs: slide_id (required), image_url (required), presentation_id (required), x_pt, +3 more. Returns: result

slides_insert_shapeB

Insert a shape (RECTANGLE, ELLIPSE, TRIANGLE, STAR, ARROW_EAST, etc) onto a slide.

Inputs: slide_id (required), presentation_id (required), x_pt, y_pt, +3 more. Returns: result

slides_insert_tableC

Insert a table onto a slide.

Inputs: rows (required), columns (required), slide_id (required), presentation_id (required), +4 more. Returns: result

slides_insert_videoC

Insert a YouTube video onto a slide. video_id is the YouTube video ID.

Inputs: slide_id (required), video_id (required), presentation_id (required), x_pt, +3 more. Returns: result

slides_readB

Read a presentation's metadata and text content from all slides.

Inputs: presentation_id (required). Returns: result

tasks_clear_completedB

Clear all completed tasks from a task list.

Inputs: tasklist_id. Returns: result

tasks_createA

Create a new task. Set parent for subtasks. Due date in RFC3339 format.

Inputs: title (required), due, notes, parent, +1 more. Returns: result

tasks_create_tasklistB

Create a new task list.

Inputs: title (required). Returns: result

tasks_deleteC

Delete a task.

Inputs: task_id (required), tasklist_id. Returns: result

tasks_listB

List tasks in a task list. Use '@default' for the primary list.

Inputs: max_results, tasklist_id, show_completed. Returns: result

tasks_list_tasklistsA

List all Google Tasks task lists.

Inputs: no named parameters. Returns: result

tasks_moveA

Move/reorder a task. Set parent to make it a subtask, previous to position after another task.

Inputs: task_id (required), parent, previous, tasklist_id. Returns: result

tasks_updateC

Update a task. Status can be 'needsAction' or 'completed'.

Inputs: task_id (required), due, notes, title, +2 more. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 108 tools

    Disambiguation5/5

    Every tool follows a clear 'service_action' pattern and targets a distinct resource operation (e.g., Gmail search vs send vs draft). No overlapping tools exist; even within large services like Sheets, each action has a unique purpose.

    Naming Consistency5/5

    All tools use snake_case with consistent Google-service prefixes (gmail_, drive_, docs_, sheets_, etc.) followed by a descriptive action verb. The naming is uniform and predictable across all 108 tools.

    Tool Count1/5

    108 tools is an extreme count, far exceeding the 50+ threshold for 'extreme mismatch'. Even for a multi-service Google Workspace integration, this volume overwhelms agents and makes tool selection impractical.

    Completeness5/5

    Each service has broad CRUD/lifecycle coverage: Gmail covers send/read/labels/filters/vacation; Drive covers search/read/create/permissions/trash; Sheets covers read/write/format/charts; and Calendar covers events/freebusy/recurring. No obvious missing operations for typical workflows.

    Related MCP Connectors

    Related MCP Servers