worksuite-mcp
Allows searching, reading, drafting, sending, and labeling emails in Gmail.
Allows reading schedules, creating and moving events, and checking free/busy in Google Calendar.
Provides tools to create and edit documents in Google Docs.
Enables searching files, reading content, uploading, sharing, and managing folders in Google Drive.
Allows creating and editing spreadsheets, reading and writing cells in Google Sheets.
Enables creating and editing presentations in Google Slides.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@worksuite-mcp summarize my unread emails"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Worksuite MCP
Connect Claude (or any MCP client) to your Google Workspace. Worksuite MCP is a polished, batteries-included Model Context Protocol server that gives your AI assistant full access to Gmail, Google Drive, Docs, Sheets, Slides, Calendar, Forms, Tasks, Chat and Contacts, all through your own Google account and your own OAuth app. Your data stays yours.
It wraps the excellent open-source
workspace-mcp engine and adds a clean
launcher, a self-healing startup, and the setup guide below so you can be talking
to your inbox and Drive in a few minutes.
What you can do once it is connected
Gmail - search, read, draft, send, and label email.
Drive - search files, read content, upload, share, and manage folders.
Docs / Sheets / Slides - create and edit documents, read and write cells, build decks.
Calendar - read your schedule, create and move events, check free/busy.
Tasks, Forms, Chat, Contacts - full read/write across the rest of Workspace.
Around 120 tools in total. You talk to your AI in plain language ("find the invoice from Acme and forward it to finance") and it uses these tools to do it.
Related MCP server: google-connections-mcp
Requirements
macOS or Linux
uv(providesuvx). Install it with:curl -LsSf https://astral.sh/uv/install.sh | shA Google account
An MCP client. These instructions use Claude Code, but any MCP client works.
Step 1 - Get the code
git clone https://github.com/chadvdwww-hash/worksuite-mcp.git
cd worksuite-mcp
chmod +x bin/worksuite-mcp.shStep 2 - Create your Google OAuth app
Worksuite MCP signs in as you, using your own Google Cloud OAuth client. You create it once. It takes about five minutes.
Open the Google Cloud Console and create (or pick) a project.
Enable the APIs you want under APIs & Services → Library. At minimum enable: Gmail API, Google Drive API, Google Docs API, Google Sheets API, Google Slides API, Google Calendar API. (Enable Tasks, Forms, Chat and People APIs too if you want those tools.)
Go to APIs & Services → OAuth consent screen:
User type: External.
Fill in the app name (e.g. "Worksuite MCP") and your email.
Under Test users, add the Google account you will sign in with. This is required while the app is in Testing mode, or Google blocks the login with
403 access_denied.
Go to APIs & Services → Credentials → Create credentials → OAuth client ID:
Application type: Desktop app (or Web application).
If you pick Web application, add this authorized redirect URI:
http://localhost:8000/oauth2callbackDownload the client secret JSON.
Heads up on token lifetime: while your OAuth app is in Testing mode, Google expires the refresh token after 7 days, so you re-authenticate roughly weekly. Publish the app (OAuth consent screen → Publish app) to make it permanent.
Step 3 - Point Worksuite MCP at your credentials
Tell the server where your downloaded client secret lives:
export GOOGLE_CLIENT_SECRET_PATH="/absolute/path/to/your/client_secret.json"(You can also set GOOGLE_OAUTH_CLIENT_ID and GOOGLE_OAUTH_CLIENT_SECRET
directly instead of a file. Either way, keep these secret. They are gitignored.)
Step 4 - Register it with Claude Code
claude mcp add worksuite-mcp -- /absolute/path/to/worksuite-mcp/bin/worksuite-mcp.shThen check it:
claude mcp list
# worksuite-mcp: .../bin/worksuite-mcp.sh - ✔ ConnectedStep 5 - Sign in to Google (first run)
The first time your AI calls a Workspace tool, Worksuite MCP opens a Google sign-in page in your browser. Approve the scopes (you may see an "unverified app" warning because it is your personal app; click through to continue). After that your credentials are cached and reused automatically.
That's it. Ask your assistant to "list my recent Drive files" or "summarise my unread email" to confirm it works.
Good to know (saves you an hour)
Port 8000 must be free. The OAuth sign-in flow listens on
localhost:8000(it can roam up to 8004). The launcher auto-reaps stale Worksuite/Workspace instances holding those ports before each start, so a crashed session won't block the next one. If sign-in still fails with "port in use", something else is on 8000:lsof -nP -iTCP:8000 -sTCP:LISTEN.File uploads are sandboxed. Tools that import a local file only read from
~/.workspace-mcp/attachments/by default. Either copy the file there first, or setALLOWED_FILE_DIRS=/your/dirand restart the server.Avoid dots in new document titles. When creating a Doc from a file, a name like
Cal.com Setupgets truncated toCal. UseCal-com Setupand rename afterward if needed.Where credentials live. Once you sign in, tokens are stored under
~/.google_workspace_mcp/credentials/. Delete that file to force a fresh login.
How it works
Worksuite MCP is a thin wrapper. It pins the upstream workspace-mcp package,
applies its own branding and startup banner, runs a port-reaper so a crashed run
never blocks the next, then hands off to the upstream server which does the
Google API heavy lifting. Upgrading the engine is a one-line version bump in
pyproject.toml.
your AI client <-- MCP --> Worksuite MCP launcher --> Google Workspace APIsCredits
Built on workspace-mcp by Taylor
Wilsdon and contributors. Licensed under the MIT License (see LICENSE).
Available Tools
122 toolsappend_table_rowsAppend Table RowsA
Appends rows to a structured table in a Google Sheet. The rows are added to the end of the table body, automatically extending the table range.
Use list_sheet_tables first to find the table ID.
Inputs: user_google_email (required), spreadsheet_id (required), table_id (required), values (required). Returns: result
batch_modify_gmail_message_labelsBatch Modify Gmail Message LabelsADestructive
Adds or removes labels from multiple Gmail messages in a single batch request.
Inputs: user_google_email (required), message_ids (required), add_label_ids, remove_label_ids. Returns: result
batch_update_docBatch Update DocADestructive
Executes multiple low-level document operations in a single atomic batch update.
For normal header/footer text, prefer update_doc_headers_footers. Only use create_header_footer here for advanced section-break layouts.
RECOMMENDED WORKFLOW FOR BUILDING DOCUMENTS:
To avoid index calculation errors, build documents in phases:
PHASE 1 - INSERT ALL CONTENT (use end_of_segment=true, no index math): Append text, section breaks, and page breaks sequentially. Each operation appends to the end of the body. No index needed. Example batch: [ {"type": "insert_text", "end_of_segment": true, "text": "Report Title\n"}, {"type": "insert_text", "end_of_segment": true, "text": "\nExecutive Summary\n"}, {"type": "insert_text", "end_of_segment": true, "text": "Revenue grew 15%.\n"}, {"type": "insert_section_break", "end_of_segment": true, "section_type": "NEXT_PAGE"}, {"type": "insert_text", "end_of_segment": true, "text": "Detailed Analysis\n"} ]
PHASE 2 - CREATE HEADERS/FOOTERS (if needed): For normal header/footer text, use update_doc_headers_footers (it auto-creates if missing and writes the content for you). Only include create_header_footer operations in a batch when you are intentionally managing advanced section-break-specific layouts.
Inputs: user_google_email (required), document_id (required), operations (required). Returns: result
batch_update_formBatch Update FormADestructive
Apply batch updates to a Google Form.
Supports adding, updating, and deleting form items, as well as updating form metadata and settings. This is the primary method for modifying form content after creation.
Inputs: user_google_email (required), form_id (required), requests (required). Returns: result
batch_update_presentationBatch Update PresentationCDestructive
Apply batch updates to a Google Slides presentation.
Inputs: user_google_email (required), presentation_id (required), requests (required). Returns: result
check_drive_file_public_accessCheck Drive File Public AccessARead-onlyIdempotent
Searches for a file by name and checks if it has public link sharing enabled.
Inputs: user_google_email (required), file_name (required), drive_id. Returns: result
copy_drive_fileCopy Drive FileB
Creates a copy of an existing Google Drive file.
This tool copies the template document to a new location with an optional new name. The copy maintains all formatting and content from the original file.
Inputs: user_google_email (required), file_id (required), new_name, parent_folder_id. Returns: result
create_calendarCreate CalendarA
Creates a new secondary Google Calendar.
Inputs: user_google_email (required), summary (required), description, timezone. Returns: result
create_docCreate DocA
Creates a new Google Doc and optionally inserts initial content.
After creation, the document body starts at index 1. A new empty doc has total length 2 (one section break at index 0, one newline at index 1).
To build a rich document after creation, use batch_update_doc with insert_text operations using end_of_segment=true to append content sequentially without calculating indices. Then call inspect_doc_structure to get exact positions before applying formatting in a separate batch call.
Inputs: user_google_email (required), title (required), content. Returns: result
create_drive_fileCreate Drive FileA
Creates a new file in Google Drive, supporting creation within shared drives. Accepts either direct content or a fileUrl to fetch the content from.
Inputs: user_google_email (required), file_name (required), content, folder_id, +2 more. Returns: result
create_drive_folderCreate Drive FolderA
Creates a new folder in Google Drive, supporting creation within shared drives.
Inputs: user_google_email (required), folder_name (required), parent_folder_id. Returns: result
create_formCreate FormB
Create a new form using the title given in the provided form message in the request.
Inputs: user_google_email (required), title (required), description, document_title. Returns: result
create_presentationCreate PresentationB
Create a new Google Slides presentation.
Inputs: user_google_email (required), title. Returns: result
create_reactionCreate ReactionA
Adds an emoji reaction to a Google Chat message.
Inputs: user_google_email (required), message_id (required), emoji_unicode (required). Returns: result
create_script_projectCreate Script ProjectB
Creates a new Apps Script project.
Inputs: user_google_email (required), title (required), parent_id. Returns: result
create_sheetCreate SheetB
Creates a new sheet or duplicates an existing sheet (user_google_email: str, spreadsheet_id: str, sheet_name: Optional[str] = None, source_sheet_name: Optional[str] = None, insert_sheet_index: Optional[int] = None).
Inputs: user_google_email (required), spreadsheet_id (required), sheet_name, source_sheet_name, +1 more. Returns: result
create_spreadsheetCreate SpreadsheetB
Creates a new Google Spreadsheet.
Inputs: user_google_email (required), title (required), sheet_names. Returns: result
create_table_with_dataCreate Table with DataA
Creates a table and populates it with data in one reliable operation.
CRITICAL: YOU MUST CALL inspect_doc_structure FIRST TO GET THE INDEX!
MANDATORY WORKFLOW - DO THESE STEPS IN ORDER:
Step 1: ALWAYS call inspect_doc_structure first Step 2: Use the 'total_length' value from inspect_doc_structure as your index Step 3: Format data as 2D list: [["col1", "col2"], ["row1col1", "row1col2"]] Step 4: Call this function with the correct index and data
EXAMPLE DATA FORMAT: table_data = [ ["Header1", "Header2", "Header3"], # Row 0 - headers ["Data1", "Data2", "Data3"], # Row 1 - first data row ["Data4", "Data5", "Data6"] # Row 2 - second data row ]
CRITICAL INDEX REQUIREMENTS:
NEVER use index values like 1, 2, 10 without calling inspect_doc_structure first
ALWAYS get index from inspect_doc_structure 'total_length' field
Index must be a valid insertion point in the document
DATA FORMAT REQUIREMENTS:
Must be 2D list of strings only
Each inner list = one table row
All rows MUST have same number of columns
Use empty strings "" for empty cells, never None
Use debug_table_structure after creation to verify results
Inputs: user_google_email (required), document_id (required), table_data (required), index (required), +2 more. Returns: result
create_versionCreate VersionA
Creates a new immutable version of a script project.
Versions capture a snapshot of the current script code. Once created, versions cannot be modified.
Inputs: user_google_email (required), script_id (required), description. Returns: result
debug_docs_runtime_infoDebug Docs Runtime InfoARead-onlyIdempotent
Return runtime/source information for diagnosing stale MCP server instances.
This is a temporary diagnostic tool intended to verify which code checkout the running MCP server has loaded.
Inputs: user_google_email (required). Returns: result
debug_table_structureDebug Table StructureARead-onlyIdempotent
ESSENTIAL DEBUGGING TOOL - Use this whenever tables don't work as expected.
USE THIS IMMEDIATELY WHEN:
Table population put data in wrong cells
You get "table not found" errors
Data appears concatenated in first cell
Need to understand existing table structure
Planning to use populate_existing_table
WHAT THIS SHOWS YOU:
Exact table dimensions (rows × columns)
Each cell's position coordinates (row,col)
Current content in each cell
Insertion indices for each cell
Table boundaries and ranges
HOW TO READ THE OUTPUT:
"dimensions": "2x3" = 2 rows, 3 columns
"position": "(0,0)" = first row, first column
"current_content": What's actually in each cell right now
"insertion_index": Where new text would be inserted in that cell
WORKFLOW INTEGRATION:
After creating table → Use this to verify structure
Before populating → Use this to plan your data format
After population fails → Use this to see what went wrong
When debugging → Compare your data array to actual table structure
Inputs: user_google_email (required), document_id (required), table_index. Returns: result
delete_script_projectDelete Script ProjectADestructive
Deletes an Apps Script project.
This permanently deletes the script project. The action cannot be undone.
Inputs: user_google_email (required), script_id (required). Returns: result
download_chat_attachmentDownload Chat AttachmentA
Downloads an attachment from a Google Chat message and saves it to local disk.
In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour).
Inputs: user_google_email (required), message_id (required), attachment_index. Returns: result
draft_gmail_messageDraft Gmail MessageA
Creates a draft email in the user's Gmail account. Supports both new drafts and reply drafts with optional attachments. Supports Gmail's "Send As" feature to draft from configured alias addresses.
Inputs: user_google_email (required), subject (required), body (required), body_format, +11 more. Returns: result
export_doc_to_pdfExport Doc to PDFA
Exports a Google Doc to PDF format and saves it to Google Drive.
Inputs: user_google_email (required), document_id (required), pdf_filename, folder_id. Returns: result
find_and_replace_docFind and Replace DocADestructive
Finds and replaces text throughout a Google Doc. No index calculation required.
This is the safest way to update specific text in a document because it does not require knowing any indices. Use this tool when you need to:
Replace placeholder text (e.g., {{TITLE}}) with real content
Update specific words or phrases throughout the document
Make targeted text changes without risk of index errors
For building documents from scratch, consider inserting text with unique placeholders via batch_update_doc, then using this tool to replace them.
Inputs: user_google_email (required), document_id (required), find_text (required), replace_text (required), +2 more. Returns: result
format_sheet_rangeFormat Sheet RangeA
Applies formatting to a range: colors, number formats, text wrapping, alignment, and text styling.
Colors accept hex strings (#RRGGBB). Number formats follow Sheets types (e.g., NUMBER, CURRENCY, DATE, PERCENT). If no sheet name is provided, the first sheet is used.
Inputs: user_google_email (required), spreadsheet_id (required), range_name (required), background_color, +9 more. Returns: result
generate_trigger_codeGenerate Trigger CodeARead-onlyIdempotent
Generates Apps Script code for creating triggers.
The Apps Script API cannot create triggers directly - they must be created from within Apps Script itself. This tool generates the code you need.
Inputs: trigger_type (required), function_name (required), schedule. Returns: result
get_contactGet ContactARead-onlyIdempotent
Get detailed information about a specific contact.
Inputs: user_google_email (required), contact_id (required). Returns: result
get_contact_groupGet Contact GroupARead-onlyIdempotent
Get details of a specific contact group including its members.
Inputs: user_google_email (required), group_id (required), max_members. Returns: result
get_doc_as_markdownGet Doc as MarkdownARead-onlyIdempotent
Reads a Google Doc and returns it as clean Markdown with optional comment context.
Unlike get_doc_content which returns plain text, this tool preserves document formatting as Markdown: headings, bold/italic/strikethrough, links, code spans, ordered/unordered lists with nesting, and tables.
When comments are included (the default), each comment's anchor text — the specific text the comment was attached to — is preserved, giving full context for the discussion.
Inputs: user_google_email (required), document_id (required), include_comments, comment_mode, +2 more. Returns: result
get_doc_contentGet Doc ContentARead-onlyIdempotent
Retrieves content of a Google Doc or a Drive file (like .docx) identified by document_id.
Native Google Docs: Fetches content via Docs API.
Office files (.docx, etc.) stored in Drive: Downloads via Drive API and extracts text.
Inputs: user_google_email (required), document_id (required), suggestions_view_mode. Returns: result
get_drive_file_contentGet Drive File ContentARead-onlyIdempotent
Retrieves the content of a specific Google Drive file by ID, supporting files in shared drives.
• Native Google Docs, Sheets, Slides → exported as text / CSV. • Office files (.docx, .xlsx, .pptx) → unzipped & parsed with std-lib to extract readable text. • PDFs → text extracted with pypdf when possible; scanned/image-only PDFs fall back to a download hint. • Images → returned as base64 with MIME metadata for multimodal clients. • Any other file → downloaded; tries UTF-8 decode, else notes binary.
Inputs: user_google_email (required), file_id (required). Returns: result
get_drive_file_download_urlGet Drive File Download URLARead-onlyIdempotent
Downloads a Google Drive file and saves it to local disk.
In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour).
For Google native files (Docs, Sheets, Slides), exports to a useful format:
Google Docs -> PDF (default) or DOCX if export_format='docx'
Google Sheets -> XLSX (default), PDF if export_format='pdf', or CSV if export_format='csv'
Google Slides -> PDF (default) or PPTX if export_format='pptx'
For other files, downloads the original file format.
Inputs: user_google_email (required), file_id (required), export_format. Returns: result
get_drive_file_permissionsGet Drive File PermissionsARead-onlyIdempotent
Gets detailed metadata about a Google Drive file including sharing permissions, parent folder IDs, ownership, and lifecycle timestamps.
Inputs: user_google_email (required), file_id (required). Returns: result
get_eventsGet EventsARead-onlyIdempotent
Retrieves events from a specified Google Calendar. Can retrieve a single event by ID or multiple events within a time range. You can also search for events by keyword by supplying the optional "query" param.
Inputs: user_google_email (required), calendar_id, event_id, time_min, +5 more. Returns: result
get_formGet FormCRead-onlyIdempotent
Get a form.
Inputs: user_google_email (required), form_id (required). Returns: result
get_form_responseGet Form ResponseBRead-onlyIdempotent
Get one response from the form.
Inputs: user_google_email (required), form_id (required), response_id (required). Returns: result
get_gmail_attachment_contentGet Gmail Attachment ContentA
Downloads an email attachment and saves it to local disk.
In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour). May re-fetch message metadata to resolve filename and MIME type.
Inputs: message_id (required), attachment_id (required), user_google_email (required), return_base64. Returns: result
get_gmail_message_contentGet Gmail Message ContentARead-onlyIdempotent
Retrieves the full content (subject, sender, recipients, body) of a specific Gmail message.
Inputs: message_id (required), user_google_email (required), body_format. Returns: result
get_gmail_messages_content_batchGet Gmail Messages Content BatchARead-onlyIdempotent
Retrieves the content of multiple Gmail messages in a single batch request. Supports up to 25 messages per batch to prevent SSL connection exhaustion.
Inputs: message_ids (required), user_google_email (required), format, body_format. Returns: result
get_gmail_thread_contentGet Gmail Thread ContentARead-onlyIdempotent
Retrieves the complete content of a Gmail conversation thread, including all messages.
Optionally also returns structured ownership analysis so a caller can determine who sent the last message and who owes whom a response without re-parsing the formatted string or making a second tool call.
Inputs: thread_id (required), user_google_email (required), body_format, include_analysis. Returns: result
get_gmail_threads_content_batchGet Gmail Threads Content BatchARead-onlyIdempotent
Retrieves the content of multiple Gmail threads in a single batch request. Supports up to 25 threads per batch to prevent SSL connection exhaustion.
Inputs: thread_ids (required), user_google_email (required), body_format. Returns: result
get_messagesGet MessagesBRead-onlyIdempotent
Retrieves messages from a Google Chat space.
Inputs: user_google_email (required), space_id (required), page_size, order_by, +1 more. Returns: result
get_pageGet PageARead-onlyIdempotent
Get details about a specific page (slide) in a presentation.
Inputs: user_google_email (required), presentation_id (required), page_object_id (required). Returns: result
get_page_thumbnailGet Page ThumbnailARead-onlyIdempotent
Generate a thumbnail URL for a specific page (slide) in a presentation.
Inputs: user_google_email (required), presentation_id (required), page_object_id (required), thumbnail_size. Returns: result
get_presentationGet PresentationBRead-onlyIdempotent
Get details about a Google Slides presentation.
Inputs: user_google_email (required), presentation_id (required). Returns: result
get_script_contentGet Script ContentBRead-onlyIdempotent
Retrieves content of a specific file within a project.
Inputs: user_google_email (required), script_id (required), file_name (required). Returns: result
get_script_metricsGet Script MetricsBRead-onlyIdempotent
Gets execution metrics for a script project.
Returns analytics data including active users, total executions, and failed executions over time.
Inputs: user_google_email (required), script_id (required), metrics_granularity. Returns: result
get_script_projectGet Script ProjectBRead-onlyIdempotent
Retrieves complete project details including all source files.
Inputs: user_google_email (required), script_id (required). Returns: result
get_search_engine_infoGet Search Engine InfoBRead-onlyIdempotent
Retrieves metadata about a Programmable Search Engine.
Inputs: user_google_email (required). Returns: result
get_spreadsheet_infoGet Spreadsheet InfoARead-onlyIdempotent
Gets information about a specific spreadsheet including its sheets.
Inputs: user_google_email (required), spreadsheet_id (required). Returns: result
get_taskGet TaskBRead-onlyIdempotent
Get details of a specific task.
Inputs: user_google_email (required), task_list_id (required), task_id (required). Returns: result
get_task_listGet Task ListBRead-onlyIdempotent
Get details of a specific task list.
Inputs: user_google_email (required), task_list_id (required). Returns: result
get_versionGet VersionBRead-onlyIdempotent
Gets details of a specific version.
Inputs: user_google_email (required), script_id (required), version_number (required). Returns: result
import_to_google_docImport to Google DocA
Imports a file (Markdown, DOCX, TXT, HTML, RTF, ODT) into Google Docs format with automatic conversion.
Google Drive automatically converts the source file to native Google Docs format, preserving formatting like headings, lists, bold, italic, etc. For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.
Inputs: user_google_email (required), file_name (required), content, file_path, +3 more. Returns: result
import_to_google_sheetsImport to Google SheetsA
Imports a spreadsheet (XLSX, XLS, ODS, CSV, TSV) into Google Sheets format with automatic conversion.
Google Drive automatically converts the source spreadsheet to native Google Sheets format, preserving rows, columns, sheets, and values. For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.
Inputs: user_google_email (required), file_name (required), content, file_path, +3 more. Returns: result
import_to_google_slidesImport to Google SlidesA
Imports a presentation (PPTX, PPT, ODP) into Google Slides format with automatic conversion.
Google Drive automatically converts the source presentation to native Google Slides format, preserving slides, layouts, text, and images. For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.
Inputs: user_google_email (required), file_name (required), file_path, file_url, +2 more. Returns: result
insert_doc_elementsInsert Doc ElementsC
Inserts structural elements like tables, lists, or page breaks into a Google Doc.
Inputs: user_google_email (required), document_id (required), element_type (required), index (required), +4 more. Returns: result
insert_doc_imageInsert Doc ImageA
Inserts an image into a Google Doc from Drive or a URL.
Inputs: user_google_email (required), document_id (required), image_source (required), index (required), +2 more. Returns: result
inspect_doc_structureInspect Doc StructureARead-onlyIdempotent
Essential tool for finding safe insertion points and understanding document structure.
USE THIS FOR:
Finding the correct index for table insertion
Understanding document layout before making changes
Locating existing tables and their positions
Getting document statistics and complexity info
Inspecting structure of specific tabs
CRITICAL FOR TABLE OPERATIONS: ALWAYS call this BEFORE creating tables to get a safe insertion index.
WHAT THE OUTPUT SHOWS:
total_elements: Number of document elements
total_length: Maximum safe index for insertion
tables: Number of existing tables
table_details: Position and dimensions of each table
headers / footers: Real segment IDs and previews for header/footer editing
tabs: List of available tabs in the document (if no tab_id specified)
WORKFLOW FOR TABLE INSERTION: Step 1: Call this function Step 2: Note the "total_length" value Step 3: Use an index < total_length for table insertion Step 4: Create your table
FORMATTING WORKFLOW: After inserting all text via batch_update_doc with end_of_segment=true, call this tool with detailed=true to get exact start_index and end_index for every paragraph. Use those indices directly in format_text and update_paragraph_style operations in a second batch_update_doc call.
HEADER/FOOTER WORKFLOW: For ordinary header/footer text, use update_doc_headers_footers. If you need low-level segment editing, call this tool first and use the real segment_id values returned under headers/footers. Do not invent IDs.
The detailed output includes elements[].start_index and elements[].end_index with text_preview for each paragraph, making it easy to identify which ranges to format.
Inputs: user_google_email (required), document_id (required), detailed, tab_id. Returns: result
list_calendarsList CalendarsARead-onlyIdempotent
Retrieves a list of calendars accessible to the authenticated user.
Inputs: user_google_email (required). Returns: result
list_contact_groupsList Contact GroupsARead-onlyIdempotent
List contact groups (labels) for the user.
Inputs: user_google_email (required), page_size, page_token. Returns: result
list_contactsList ContactsARead-onlyIdempotent
List contacts for the authenticated user.
Inputs: user_google_email (required), page_size, page_token, sort_order. Returns: result
list_deploymentsList DeploymentsARead-onlyIdempotent
Lists all deployments for a script project.
Inputs: user_google_email (required), script_id (required). Returns: result
list_docs_in_folderList Docs in FolderBRead-onlyIdempotent
Lists Google Docs within a specific Drive folder.
Returns: str: A formatted list of Google Docs in the specified folder.
Inputs: user_google_email (required), folder_id, page_size. Returns: result
list_document_commentsList Document CommentsBRead-onlyIdempotent
List all comments from a Google Document.
Inputs: user_google_email (required), document_id (required). Returns: result
list_drive_itemsList Drive ItemsARead-onlyIdempotent
Lists files/folders or shared drive containers, supporting shared drives.
If drive_id is specified, lists items within that shared drive. folder_id is then relative to that drive (or use drive_id as folder_id for root).
If drive_id is not specified, lists items from user's "My Drive" and accessible shared drives (if include_items_from_all_drives is True).
Set resource_type to "shared_drives" to list shared drive containers instead of folder contents.
Inputs: user_google_email (required), folder_id, page_size, page_token, +9 more. Returns: result
list_form_responsesList Form ResponsesBRead-onlyIdempotent
List a form's responses.
Inputs: user_google_email (required), form_id (required), page_size, page_token. Returns: result
list_gmail_filtersList Gmail FiltersARead-onlyIdempotent
Lists all Gmail filters configured in the user's mailbox.
Inputs: user_google_email (required). Returns: result
list_gmail_labelsList Gmail LabelsARead-onlyIdempotent
Lists all labels in the user's Gmail account.
Inputs: user_google_email (required). Returns: result
list_presentation_commentsList Presentation CommentsBRead-onlyIdempotent
List all comments from a Google Presentation.
Inputs: user_google_email (required), presentation_id (required). Returns: result
list_script_processesList Script ProcessesBRead-onlyIdempotent
Lists recent execution processes for user's scripts.
Inputs: user_google_email (required), page_size, script_id. Returns: result
list_script_projectsList Script ProjectsARead-onlyIdempotent
Lists Google Apps Script projects accessible to the user.
Uses Drive API to find Apps Script files.
Inputs: user_google_email (required), page_size, page_token. Returns: result
list_sheet_tablesList Sheet TablesARead-onlyIdempotent
Lists all structured tables in a spreadsheet with their IDs, names, ranges, and column details. Use this to find table IDs for append_table_rows.
Inputs: user_google_email (required), spreadsheet_id (required). Returns: result
list_spacesList SpacesBRead-onlyIdempotent
Lists Google Chat spaces (rooms and direct messages) accessible to the user.
Returns: str: A formatted list of Google Chat spaces accessible to the user.
Inputs: user_google_email (required), page_size, space_type. Returns: result
list_spreadsheet_commentsList Spreadsheet CommentsBRead-onlyIdempotent
List all comments from a Google Spreadsheet.
Inputs: user_google_email (required), spreadsheet_id (required). Returns: result
list_spreadsheetsList SpreadsheetsBRead-onlyIdempotent
Lists spreadsheets from Google Drive that the user has access to.
Inputs: user_google_email (required), max_results. Returns: result
list_task_listsList Task ListsBRead-onlyIdempotent
List all task lists for the user.
Inputs: user_google_email (required), max_results, page_token. Returns: result
list_tasksList TasksBRead-onlyIdempotent
List all tasks in a specific task list.
Inputs: user_google_email (required), task_list_id (required), max_results, page_token, +9 more. Returns: result
list_versionsList VersionsARead-onlyIdempotent
Lists all versions of a script project.
Versions are immutable snapshots of your script code. They are created when you deploy or explicitly create a version.
Inputs: user_google_email (required), script_id (required). Returns: result
manage_conditional_formattingManage Conditional FormattingADestructive
Manages conditional formatting rules on a Google Sheet. Supports adding, updating, and deleting conditional formatting rules via a single tool.
Inputs: user_google_email (required), spreadsheet_id (required), action (required), range_name, +7 more. Returns: result
manage_contactManage ContactADestructive
Create, update, or delete a contact. Consolidated tool replacing create_contact, update_contact, and delete_contact.
Inputs: user_google_email (required), action (required), contact_id, given_name, +22 more. Returns: result
manage_contact_groupManage Contact GroupADestructive
Create, update, delete a contact group, or modify its members. Consolidated tool replacing create_contact_group, update_contact_group, delete_contact_group, and modify_contact_group_members.
Inputs: user_google_email (required), action (required), group_id, name, +3 more. Returns: result
manage_contacts_batchManage Contacts BatchCDestructive
Batch create, update, or delete contacts. Consolidated tool replacing batch_create_contacts, batch_update_contacts, and batch_delete_contacts.
Inputs: user_google_email (required), action (required), contacts, updates, +2 more. Returns: result
manage_deploymentManage DeploymentCDestructive
Manages Apps Script deployments. Supports creating, updating, and deleting deployments.
Inputs: user_google_email (required), action (required), script_id (required), deployment_id, +2 more. Returns: result
manage_doc_tabManage Doc TabADestructive
Manage document tabs: create, rename, delete, or populate from Markdown.
Inputs: user_google_email (required), document_id (required), action (required), tab_id, +5 more. Returns: result
manage_document_commentManage Document CommentA
Manage comments on a Google Document.
Actions:
create: Create a new document-level comment. Requires comment_content. Note: The Drive API cannot anchor comments to specific text; only the Google Docs UI can do that.
reply: Reply to a comment. Requires comment_id and comment_content.
resolve: Resolve a comment. Requires comment_id.
Inputs: user_google_email (required), document_id (required), action (required), comment_content, +1 more. Returns: result
manage_drive_accessManage Drive AccessADestructive
Consolidated tool for managing Google Drive file and folder access permissions.
Supports granting, batch-granting, updating, revoking permissions, and transferring file ownership -- all through a single entry point.
Inputs: user_google_email (required), file_id (required), action (required), share_with, +10 more. Returns: result
manage_eventManage EventBDestructive
Manages calendar events. Supports creating, updating, deleting, and RSVP.
Inputs: user_google_email (required), action (required), summary, start_time, +21 more. Returns: result
manage_focus_timeManage Focus TimeADestructive
Manages Focus Time events on Google Calendar. These special events auto-decline meeting invitations and, by default, set the user's chat status to Do Not Disturb, helping protect blocks of uninterrupted work time.
Inputs: user_google_email (required), action (required), start_time, end_time, +12 more. Returns: result
manage_gmail_filterManage Gmail FilterBDestructive
Manages Gmail filters. Supports creating and deleting filters.
Inputs: user_google_email (required), action (required), criteria, filter_action, +1 more. Returns: result
manage_gmail_labelManage Gmail LabelADestructive
Manages Gmail labels: create, update, or delete labels.
Inputs: user_google_email (required), action (required), name, label_id, +2 more. Returns: result
manage_out_of_officeManage Out of OfficeADestructive
Manages Out of Office events on Google Calendar. These special events auto-decline meeting invitations and set the user's status to "Out of office" across Google Workspace.
Inputs: user_google_email (required), action (required), start_time, end_time, +10 more. Returns: result
manage_presentation_commentManage Presentation CommentA
Manage comments on a Google Presentation.
Actions:
create: Create a new comment. Requires comment_content. Note: The Drive API cannot anchor comments to arbitrary text; Slides comments are element-scoped via the API.
reply: Reply to a comment. Requires comment_id and comment_content.
resolve: Resolve a comment. Requires comment_id.
Inputs: user_google_email (required), presentation_id (required), action (required), comment_content, +1 more. Returns: result
manage_spreadsheet_commentManage Spreadsheet CommentA
Manage comments on a Google Spreadsheet.
Actions:
create: Create a new comment. Requires comment_content. Note: The Drive API cannot anchor comments to arbitrary text; Sheets comments are cell-scoped via the API.
reply: Reply to a comment. Requires comment_id and comment_content.
resolve: Resolve a comment. Requires comment_id.
Inputs: user_google_email (required), spreadsheet_id (required), action (required), comment_content, +1 more. Returns: result
manage_taskManage TaskADestructive
Manage tasks: create, update, delete, or move tasks within task lists.
Inputs: user_google_email (required), action (required), task_list_id (required), task_id, +7 more. Returns: result
manage_task_listManage Task ListBDestructive
Manage task lists: create, update, delete, or clear completed tasks.
Inputs: user_google_email (required), action (required), task_list_id, title. Returns: result
modify_doc_textModify Doc TextADestructive
Modifies text in a Google Doc - can insert/replace text and/or apply formatting in a single operation.
TIP: To append text to the end of the document without calculating indices, set end_of_segment=true. This avoids index calculation errors.
For ordinary header/footer text, prefer update_doc_headers_footers. Only pass segment_id when you already have a real header/footer/footnote segment ID from inspect_doc_structure output. Do not guess IDs such as "kix.header" or "kix.footer".
Inputs: user_google_email (required), document_id (required), start_index (required), end_index, +17 more. Returns: result
modify_gmail_message_labelsModify Gmail Message LabelsADestructive
Adds or removes labels from a Gmail message. To archive an email, remove the INBOX label. To delete an email, add the TRASH label.
Inputs: user_google_email (required), message_id (required), add_label_ids, remove_label_ids. Returns: result
modify_sheet_valuesModify Sheet ValuesBDestructive
Modifies values in a specific range of a Google Sheet - can write, update, or clear values.
Inputs: user_google_email (required), spreadsheet_id (required), range_name (required), values, +2 more. Returns: result
move_sheet_rowsMove Sheet RowsADestructive
Moves rows from one sheet to another within the same spreadsheet. The move is performed in a single batchUpdate (copyPaste followed by deleteDimension). Note: batchUpdate executes requests sequentially but does not roll back on partial failure — if the copy succeeds but the delete fails, rows may be duplicated. Formulas, data types, and formatting are preserved (unlike a values.get/append round-trip). Row numbers are 1-based (matching the spreadsheet UI).
Inputs: user_google_email (required), spreadsheet_id (required), source_sheet (required), start_row (required), +2 more. Returns: result
query_freebusyQuery FreebusyBRead-onlyIdempotent
Returns free/busy information for a set of calendars.
Inputs: user_google_email (required), time_min (required), time_max (required), calendar_ids, +2 more. Returns: result
read_sheet_valuesRead Sheet ValuesARead-onlyIdempotent
Reads values from a specific range in a Google Sheet.
Inputs: user_google_email (required), spreadsheet_id (required), range_name, include_hyperlinks, +2 more. Returns: result
resize_sheet_dimensionsResize Sheet DimensionsADestructive
Manages sheet-level dimension properties: resize columns/rows, auto-resize to fit content, freeze rows/columns, hide/unhide rows/columns, and insert/delete rows/columns.
Inputs: user_google_email (required), spreadsheet_id (required), sheet_name, column_sizes, +16 more. Returns: result
run_script_functionRun Script FunctionADestructive
Executes a function in a deployed script.
Inputs: user_google_email (required), script_id (required), function_name (required), parameters, +1 more. Returns: result
search_contactsSearch ContactsBRead-onlyIdempotent
Search contacts by name, email, phone number, or other fields.
Inputs: user_google_email (required), query (required), page_size. Returns: result
search_customSearch CustomCRead-onlyIdempotent
Performs a search using Google Custom Search JSON API.
Inputs: user_google_email (required), q (required), num, start, +9 more. Returns: result
search_docsSearch DocsBRead-onlyIdempotent
Searches for Google Docs by name using Drive API (mimeType filter).
Returns: str: A formatted list of Google Docs matching the search query.
Inputs: user_google_email (required), query (required), page_size. Returns: result
search_drive_filesSearch Drive FilesARead-onlyIdempotent
Searches for files and folders within a user's Google Drive, including shared drives.
Inputs: user_google_email (required), query (required), page_size, page_token, +6 more. Returns: result
search_gmail_messagesSearch Gmail MessagesARead-onlyIdempotent
Searches messages in a user's Gmail account based on a query. Returns both Message IDs and Thread IDs for each found message, along with Gmail web interface links for manual verification. Supports pagination via page_token parameter.
Inputs: query (required), user_google_email (required), page_size, page_token. Returns: result
search_messagesSearch MessagesARead-onlyIdempotent
Searches for messages in Google Chat spaces by text content and/or time range.
Inputs: user_google_email (required), query, space_id, page_size, +2 more. Returns: result
send_gmail_messageSend Gmail MessageA
Sends an email using the user's Gmail account. Supports both new emails and replies with optional attachments. Supports Gmail's "Send As" feature to send from configured alias addresses.
Inputs: user_google_email (required), to (required), subject (required), body (required), +10 more. Returns: result
send_messageSend MessageC
Sends a message to a Google Chat space.
Inputs: user_google_email (required), space_id (required), message_text (required), thread_key, +1 more. Returns: result
set_drive_file_permissionsSet Drive File PermissionsADestructive
Sets file-level sharing settings and controls link sharing for a Google Drive file or folder.
This is a high-level tool for the most common permission changes. Use this to toggle "anyone with the link" access or configure file-level sharing behavior. For managing individual user/group permissions, use share_drive_file or update_drive_permission instead.
Inputs: user_google_email (required), file_id (required), link_sharing, writers_can_share, +1 more. Returns: result
set_publish_settingsSet Publish SettingsB
Updates the publish settings of a form.
Inputs: user_google_email (required), form_id (required), publish_as_template, require_authentication. Returns: result
start_google_authStart Google AuthA
Manually initiate Google OAuth authentication flow.
NOTE: This is a legacy OAuth 2.0 tool and is disabled when OAuth 2.1 is enabled. The authentication system automatically handles credential checks and prompts for authentication when needed. Only use this tool if:
You need to re-authenticate with different credentials
You want to proactively authenticate before using other tools
The automatic authentication flow failed and you need to retry
In most cases, simply try calling the Google Workspace tool you need - it will automatically handle authentication if required.
Inputs: service_name (required), user_google_email. Returns: result
update_drive_fileUpdate Drive FileADestructive
Updates metadata, properties, and/or content of a Google Drive file.
Providing one of content, file_path, or file_url replaces the file's
content in place. The source is uploaded with its source MIME type so the Drive
API applies the same format conversion as import_to_google_doc (markdown headings,
tables, bold, etc.) while preserving the existing file ID, sharing, comments, and
links. Metadata and content can be updated in a single call.
Inputs: user_google_email (required), file_id (required), name, description, +12 more. Returns: result
update_paragraph_styleUpdate Paragraph StyleA
Apply paragraph-level formatting, heading styles, and/or list formatting to a range in a Google Doc.
This tool can apply named heading styles (H1-H6) for semantic document structure, create bulleted or numbered lists with nested indentation, and customize paragraph properties like alignment, spacing, and indentation. All operations can be applied in a single call.
Inputs: user_google_email (required), document_id (required), start_index (required), end_index (required), +21 more. Returns: result
update_script_contentUpdate Script ContentADestructive
Updates or creates files in a script project.
Inputs: user_google_email (required), script_id (required), files (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 122 tools
Tools are mostly distinct due to domain-specific prefixes (e.g., create_doc, create_sheet). However, some overlap exists between generic tools like get_doc_content and get_drive_file_content, or between multiple modify tools, which could cause minor confusion.
Naming conventions are mixed: verb_noun (create_doc), manage_ prefix (manage_contact), and domain-specific suffixes (list_sheet_tables). While readable, the lack of a consistent pattern (e.g., some use 'modify' vs 'update' vs 'set') reduces predictability.
With 122 tools, the surface is excessively large. While the server covers many Google services, many tools could be consolidated (e.g., separate comment tools per service). This volume increases complexity and selection difficulty for an agent.
The tool set covers major CRUD operations and advanced features across Docs, Sheets, Gmail, Drive, Calendar, and more. Minor gaps exist (e.g., no batch folder creation), and some redundancy (e.g., multiple text insertion tools), but overall it is comprehensive for the Google Workspace domain.
Related MCP Connectors
Use your apps from your AI: Gmail, Slack, Google Sheets, HubSpot and 2,300+ more on your accounts.
Gmail, Outlook, Drive, OneDrive and calendars for AI agents. Many accounts, one endpoint, audit log.
Permissioned access to Gmail, Drive and Calendar via the user's own Google account
Connect AI agents to 1000+ apps with managed authentication and tool-calling.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides comprehensive natural language control over Google Workspace services including Gmail, Drive, Calendar, Docs, Sheets, Slides, Forms, Tasks, and Chat. Features multi-user OAuth 2.1 support, flexible tool tiers, and seamless integration with AI assistants.843MIT
- FlicenseNot gradedqualityDmaintenanceProvides AI assistants with access to Google Workspace APIs including Sheets, Calendar, Gmail, Tasks, Drive, and Docs. Enables full CRUD operations and management of Google services through natural language.1-
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with Google Workspace services (Gmail, Drive, Docs, Tasks, Calendar) through OAuth 2.0 authentication, providing 25+ operations for business automation and productivity.1-
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage Gmail (list, search, send, label emails) and Google Calendar (list, create, update, delete events) via OAuth 2.0.19 npm-