append_table_rows
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.
Work a whole Google Workspace account from an agent — mail, Drive, Calendar, Docs, Sheets, Slides, Chat, Forms, Tasks, Contacts and Apps Script.
LABSCO SUMMARY
What it takes off you is the seam between products: the agent finds the thread in Gmail, opens the sheet it points at, writes the summary into a Doc and puts the follow-up on the calendar without a different connector for each step. The tool tiers are what make that practical rather than expensive.
One server across twelve Google Workspace services, with 120-plus tools behind it, OAuth 2.1 multi-user auth, three progressive tool tiers, a read-only mode and a full CLI. It runs locally over stdio for older clients and remotely over streamable HTTP.
core, extended, complete — plus --tools to pick services, --read-only, per-service --permissions, and --disabled-tools to subtract individual onesuvx, and an OAuth client from your own Google Cloud project with the APIs enabled for the services you plan to use — GOOGLE_OAUTH_CLIENT_ID and GOOGLE_OAUTH_CLIENT_SECRET. Launch as uvx workspace-mcp --tool-tier core, which is the setting that keeps 120 tools from filling the context window. For Claude Desktop and web the recommended path is HTTP mode added as a Connector; OAuth 2.1 with PKCE also requires HTTP transport, plus MCP_ENABLE_OAUTH21=true and a redirect URI. The server sends nothing anywhere except Google's APIs, using your own credentials, with no telemetry unless you configure tracing. Local file reads default to the managed attachment directory, and .env* files and credential stores such as ~/.ssh/ and ~/.aws/ stay blocked even if ALLOWED_FILE_DIRS is widened.
One command plus credentials — uvx workspace-mcp, then supply credentials
USE CASES
Find the thread, read what it settled, and write it into a Doc with the structure a reader expects. Two products, one conversation, no copy-paste between them.
Query free/busy across the calendars involved rather than opening each one. Out of Office and Focus Time blocks are visible too, which is usually why the slot that looked free was not.
Write the values into the sheet, format the ranges, and add the conditional rules that make the numbers legible. The output is a spreadsheet rather than a table pasted into a message.
Build and publish the form, then read its responses back and write them where they are useful. Forms coverage is unusual, and it is what makes this an end-to-end job rather than half of one.
Search Drive, then grant or revoke permissions on what you find. Faster than clicking through a share dialog per file, and easier to check afterwards.
Start on the core tier, or name just the services you use with --tools. Add --read-only when the job is reading, and subtract individual tools you would rather an agent never saw.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
append_table_rowsAppends 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.
batch_modify_gmail_message_labelsAdds or removes labels from multiple Gmail messages in a single batch request.
batch_update_docExecutes 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.
PHASE 3 - INSPECT STRUCTURE: Call inspect_doc_structure with detailed=true to get exact start_index and end_index for every paragraph and element.
PHASE 4 - APPLY FORMATTING (separate batch using indices from Phase 3): Use the real indices from inspect_doc_structure output: [ {"type": "update_paragraph_style", "start_index": 1, "end_index": 15, "heading_level": 1, "alignment": "CENTER"}, {"type": "format_text", "start_index": 1, "end_index": 15, "bold": true, "font_size": 24}, {"type": "create_bullet_list", "start_index": 50, "end_index": 120, "list_type": "ORDERED"} ]
ALTERNATIVE - FIND_REPLACE PATTERN (no indices needed at all): Insert text with unique placeholders, then use find_replace: [ {"type": "insert_text", "end_of_segment": true, "text": "{{TITLE}}\n{{BODY}}\n"}, {"type": "find_replace", "find_text": "{{TITLE}}", "replace_text": "Quarterly Report"}, {"type": "find_replace", "find_text": "{{BODY}}", "replace_text": "The results show..."} ]
WARNING - AVOID THIS ANTI-PATTERN: Do NOT pre-compute sequential indices for multiple insert_text operations. Each insertion shifts all subsequent indices and manual calculation is error-prone. Use end_of_segment=true instead, which always appends to the current end. BAD: [{"type":"insert_text","index":1,"text":"Hello\n"}, {"type":"insert_text","index":8,"text":"World\n"}] <- index 8 may be wrong GOOD: [{"type":"insert_text","end_of_segment":true,"text":"Hello\n"}, {"type":"insert_text","end_of_segment":true,"text":"World\n"}]
Args: user_google_email: User's Google email address document_id: ID of the document to update operations: List of operation dicts. Each operation MUST have a 'type' field. All operations accept an optional 'tab_id' to target a specific tab.
Supported operation types and their parameters:
insert_text - required: text (str) PREFERRED: end_of_segment (bool) - set true to append at end of body without calculating an index. Safest way to build documents sequentially. optional: index (int), tab_id, segment_id delete_text - required: start_index (int), end_index (int) optional: tab_id, segment_id replace_text - required: start_index (int), end_index (int), text (str) optional: tab_id, segment_id format_text - required: start_index (int), end_index (int) optional: bold, italic, underline, strikethrough, font_size, font_family, font_weight, text_color, background_color, link_url, clear_link, baseline_offset, small_caps, tab_id, segment_id update_paragraph_style
Example - Safe document building (no index calculation needed): [ {"type": "insert_text", "end_of_segment": true, "text": "Quarterly Report\n\n"}, {"type": "insert_text", "end_of_segment": true, "text": "Executive Summary\n"}, {"type": "insert_text", "end_of_segment": true, "text": "Revenue grew 15% YoY.\n"} ]
Example - Formatting (use exact indices from inspect_doc_structure output): [ {"type": "format_text", "start_index": 1, "end_index": 19, "bold": true, "font_size": 24}, {"type": "update_paragraph_style", "start_index": 1, "end_index": 19, "heading_level": 1, "alignment": "CENTER"}, {"type": "update_paragraph_style", "start_index": 20, "end_index": 39, "heading_level": 2} ]
Example - Using find_replace (zero index risk): [ {"type": "find_replace", "find_text": "{{DATE}}", "replace_text": "March 2026"}, {"type": "find_replace", "find_text": "{{AUTHOR}}", "replace_text": "Jane Smith"} ]
Example - Insert table at end of document: [{"type": "insert_table", "end_of_segment": true, "rows": 3, "columns": 4}]
Example - Headers, footers, and document style: [ {"type": "create_header_footer", "section_type": "header"}, {"type": "create_header_footer", "section_type": "footer"}, {"type": "update_document_style", "margin_top": 72, "margin_bottom": 72} ]
Returns: str: Confirmation message with batch results and document length for chaining
batch_update_formApply 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.
batch_update_presentationApply batch updates to a Google Slides presentation.
check_drive_file_public_accessSearches for a file by name and checks if it has public link sharing enabled.
copy_drive_fileCreates 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.
create_calendarCreates a new secondary Google Calendar.
create_docCreates 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.
create_drive_fileCreates a new file in Google Drive, supporting creation within shared drives. Accepts direct text content, inline base64 bytes, or a fileUrl to fetch content from.
create_drive_folderCreates a new folder in Google Drive, supporting creation within shared drives.
create_formCreate a new form using the title given in the provided form message in the request.
create_presentationCreate a new Google Slides presentation.
create_reactionAdds an emoji reaction to a Google Chat message.
create_script_projectCreates a new Apps Script project.
create_sheetCreates 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).
create_spreadsheetCreates a new Google Spreadsheet.
create_table_with_dataCreates 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:
DATA FORMAT REQUIREMENTS:
Args: user_google_email: User's Google email address document_id: ID of the document to update table_data: 2D list of strings - EXACT format: [["col1", "col2"], ["row1col1", "row1col2"]] index: Document position (MANDATORY: get from inspect_doc_structure 'total_length') bold_headers: Whether to make first row bold (default: true) tab_id: Optional tab ID to create the table in a specific tab header_rows: Number of leading rows to mark as a repeating header that reappears after each page break. Must be between 0 and the number of table rows (default: 0 = none)
Returns: str: Confirmation with table details and link
create_versionCreates a new immutable version of a script project.
Versions capture a snapshot of the current script code. Once created, versions cannot be modified.
debug_docs_runtime_infoReturn 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.
debug_table_structureESSENTIAL DEBUGGING TOOL - Use this whenever tables don't work as expected.
USE THIS IMMEDIATELY WHEN:
WHAT THIS SHOWS YOU:
HOW TO READ THE OUTPUT:
WORKFLOW INTEGRATION:
Args: user_google_email: User's Google email address document_id: ID of the document to inspect table_index: Which table to debug (0 = first table, 1 = second table, etc.)
Returns: str: Detailed JSON structure showing table layout, cell positions, and current content
delete_script_projectDeletes an Apps Script project.
This permanently deletes the script project. The action cannot be undone.
download_chat_attachmentDownloads 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).
draft_gmail_messageCreates 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.
export_doc_to_pdfExports a Google Doc to PDF format and saves it to Google Drive.
find_and_replace_docFinds 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:
For building documents from scratch, consider inserting text with unique placeholders via batch_update_doc, then using this tool to replace them.
format_sheet_rangeApplies 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.
generate_trigger_codeGenerates 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.
get_contactGet detailed information about a specific contact.
get_contact_groupGet details of a specific contact group including its members.
get_doc_as_markdownReads 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.
get_doc_contentRetrieves content of a Google Doc or a Drive file (like .docx) identified by document_id.
get_drive_file_contentRetrieves the content of a specific Google Drive file by ID, supporting files in shared drives.
get_drive_file_download_urlDownloads 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:
For other files, downloads the original file format.
get_drive_file_permissionsGets detailed metadata about a Google Drive file including sharing permissions, parent folder IDs, ownership, and lifecycle timestamps.
get_drive_shareable_linkGets the shareable link for a Google Drive file or folder.
get_eventsRetrieves 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.
get_formGet a form.
get_form_responseGet one response from the form.
get_gmail_attachment_contentDownloads 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.
get_gmail_message_contentRetrieves the full content (subject, sender, recipients, body) of a specific Gmail message.
Bodies are returned inline and truncated at 20,000 characters. Set full=True to get the complete, untruncated message instead: it is exported to disk and the response carries a short-lived download URL (HTTP transport) or file path (stdio transport) rather than the body, so large messages never stream through the model context. Stateless deployments have no file storage, so there full=True returns the untruncated body inline.
get_gmail_messages_content_batchRetrieves the content of multiple Gmail messages in a single batch request. Supports up to 25 messages per batch to prevent SSL connection exhaustion.
get_gmail_thread_contentRetrieves 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.
get_gmail_threads_content_batchRetrieves the content of multiple Gmail threads in a single batch request. Supports up to 25 threads per batch to prevent SSL connection exhaustion.
get_messagesRetrieves messages from a Google Chat space.
get_pageGet details about a specific page (slide) in a presentation.
get_page_thumbnailGenerate a thumbnail URL for a specific page (slide) in a presentation.
get_presentationGet details about a Google Slides presentation.
get_script_contentRetrieves content of a specific file within a project.
get_script_metricsGets execution metrics for a script project.
Returns analytics data including active users, total executions, and failed executions over time.
get_script_projectRetrieves complete project details including all source files.
get_search_engine_infoRetrieves metadata about a Programmable Search Engine.
get_spreadsheet_infoGets information about a specific spreadsheet including its sheets.
get_taskGet details of a specific task.
get_task_listGet details of a specific task list.
get_versionGets details of a specific version.
import_to_google_docImports 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.
import_to_google_sheetsImports 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.
import_to_google_slidesImports 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.
insert_doc_elementsInserts structural elements like tables, lists, or page breaks into a Google Doc.
insert_doc_imageInserts an image into a Google Doc from Drive or a URL.
inspect_doc_structureEssential tool for finding safe insertion points and understanding document structure.
USE THIS FOR:
CRITICAL FOR TABLE OPERATIONS: ALWAYS call this BEFORE creating tables to get a safe insertion index.
WHAT THE OUTPUT SHOWS:
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.
Args: user_google_email: User's Google email address document_id: ID of the document to inspect detailed: Whether to return detailed structure information tab_id: Optional ID of the tab to inspect. If not provided, inspects main document.
Returns: str: JSON string containing document structure and safe insertion indices
list_calendarsRetrieves a list of calendars accessible to the authenticated user.
list_contact_groupsList contact groups (labels) for the user.
list_contactsList contacts for the authenticated user.
list_deploymentsLists all deployments for a script project.
list_docs_in_folderLists Google Docs within a specific Drive folder.
Returns: str: A formatted list of Google Docs in the specified folder.
list_document_commentsList all comments from a Google Document (optional max_comments to limit results).
list_drive_itemsLists 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.
list_form_responsesList a form's responses.
list_gmail_filtersLists all Gmail filters configured in the user's mailbox.
list_gmail_labelsLists all labels in the user's Gmail account.
list_presentation_commentsList all comments from a Google Presentation (optional max_comments to limit results).
list_script_processesLists recent execution processes for user's scripts.
list_script_projectsLists Google Apps Script projects accessible to the user.
Uses Drive API to find Apps Script files.
list_sheet_tablesLists all structured tables in a spreadsheet with their IDs, names, ranges, and column details. Use this to find table IDs for append_table_rows.
list_spacesLists Google Chat spaces (rooms and direct messages) accessible to the user.
Returns: str: A formatted list of Google Chat spaces accessible to the user.
list_spreadsheet_commentsList all comments from a Google Spreadsheet (optional max_comments to limit results).
list_spreadsheetsLists spreadsheets from Google Drive that the user has access to.
list_task_listsList all task lists for the user.
list_tasksList all tasks in a specific task list.
list_versionsLists 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.
manage_conditional_formattingManages conditional formatting rules on a Google Sheet. Supports adding, updating, and deleting conditional formatting rules via a single tool.
manage_contactCreate, update, or delete a contact. Consolidated tool replacing create_contact, update_contact, and delete_contact.
manage_contact_groupCreate, 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.
manage_contacts_batchBatch create, update, or delete contacts. Consolidated tool replacing batch_create_contacts, batch_update_contacts, and batch_delete_contacts.
manage_deploymentManages Apps Script deployments. Supports creating, updating, and deleting deployments.
manage_doc_tabManage document tabs: create, rename, delete, or populate from Markdown.
manage_document_commentManage comments on a Google Document.
Actions:
manage_drive_accessConsolidated 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.
manage_eventManages calendar events. Supports creating, updating, deleting, and RSVP.
manage_focus_timeManages 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.
manage_gmail_filterManages Gmail filters. Supports creating and deleting filters.
manage_gmail_labelManages Gmail labels: create, update, or delete labels.
manage_out_of_officeManages 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.
manage_presentation_commentManage comments on a Google Presentation.
Actions:
manage_spreadsheet_commentManage comments on a Google Spreadsheet.
Actions:
manage_taskManage tasks: create, update, delete, or move tasks within task lists.
manage_task_listManage task lists: create, update, delete, or clear completed tasks.
modify_doc_textModifies 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".
modify_gmail_message_labelsAdds or removes labels from a Gmail message. To archive an email, remove the INBOX label. To delete an email, add the TRASH label.
modify_sheet_valuesModifies values in a specific range of a Google Sheet - can write, update, or clear values.
move_sheet_rowsMoves 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).
query_freebusyReturns free/busy information for a set of calendars.
read_sheet_valuesReads values from a specific range in a Google Sheet.
resize_sheet_dimensionsManages sheet-level dimension properties: resize columns/rows, auto-resize to fit content, freeze rows/columns, hide/unhide rows/columns, and insert/delete rows/columns.
run_script_functionExecutes a function in a deployed script.
search_contactsSearch contacts by name, email, phone number, or other fields.
search_customPerforms a search using Google Custom Search JSON API.
search_docsSearches for Google Docs by name using Drive API (mimeType filter).
Returns: str: A formatted list of Google Docs matching the search query.
search_drive_filesSearches for files and folders within a user's Google Drive, including shared drives.
search_gmail_messagesSearches 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.
search_messagesSearches for messages in Google Chat spaces by text content and/or time range.
send_gmail_messageSends an email using the user's Gmail account. Supports new emails, replies, and forwards, with optional attachments. Supports Gmail's "Send As" feature to send from configured alias addresses.
To forward an existing message, pass forward_message_id. The original subject, body (quoted with a "Forwarded message" header), and attachments are carried over. In forward mode, body (if any) is prepended as a note and subject is optional. Threading, reply, and signature options do not apply when forwarding.
send_messageSends a message to a Google Chat space.
set_drive_file_permissionsSets 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.
set_publish_settingsUpdates the publish settings of a form.
start_google_authManually 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:
In most cases, simply try calling the Google Workspace tool you need - it will automatically handle authentication if required.
update_doc_headers_footersSafely creates or updates header/footer text in a Google Doc.
This is the default tool for header/footer content. Do NOT use batch_update_doc with create_header_footer just to set header/footer text; that low-level operation is only for advanced section-break workflows and can fail when the default header/footer already exists.
This tool handles both creation and update in one call:
You do NOT need to create a header/footer separately before calling this tool. Simply call it with the desired content and it will work whether the header/footer exists or not.
Args: user_google_email: User's Google email address document_id: ID of the document to update section_type: Type of section to create or update ("header" or "footer") content: Text content for the header/footer header_footer_type: Type of header/footer ("DEFAULT", "FIRST_PAGE_ONLY", "EVEN_PAGE")
Returns: str: Confirmation message with update details
update_drive_fileUpdates 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.
update_paragraph_styleApply 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.
update_script_contentUpdate or create files in a script project.
By default this merges the supplied files into the existing project by file name, leaving other files untouched. Set merge=False to replace the entire project: any existing file omitted from files is permanently deleted.
BEFORE YOU INSTALL
122 tools when we connected.
CONTEXT COST
Rated by the size of the 122 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
uvx workspace-mcpStart the server in HTTP mode, in its own terminal:
uvx workspace-mcp --transport streamable-http --tool-tier coreThen add it to Claude Code:
claude mcp add --transport http workspace-mcp http://localhost:8000/mcpThe configuration on this page does not set GOOGLE_OAUTH_CLIENT_ID and GOOGLE_OAUTH_CLIENT_SECRET; the project's instructions set them with an export line. That line reaches only programs started from the same terminal, so to supply them, start your client or the server from that terminal.