Google Workspace MCP Server - Control Gmail, Calendar, Docs, Sheets, Slides, Chat, Forms & Drive
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| USER_GOOGLE_EMAIL | No | Optional default user email for single-user authentication flows. If set, LLMs need not prompt for an email. | |
| MCP_ENABLE_OAUTH21 | No | Set to true to enable OAuth 2.1 support (requires streamable-http transport). Cannot be used with clients that do not support the new OAuth 2.1 Client to Server flow. | false |
| WORKSPACE_MCP_PORT | No | Port the server listens on. Also affects server_url and OAUTH_REDIRECT_URI. | 8000 |
| GOOGLE_CLIENT_SECRETS | No | Legacy alias for GOOGLE_CLIENT_SECRET_PATH (maintained for backward compatibility). | |
| GOOGLE_OAUTH_CLIENT_ID | No | Google OAuth 2.0 Client ID used for authenticating with Workspace services. | |
| WORKSPACE_MCP_BASE_URI | No | Base URI for the server. Also affects server_url used for Gemini native function calling and the OAUTH_REDIRECT_URI. | http://localhost |
| GOOGLE_CLIENT_SECRET_PATH | No | Path to a client_secret.json file containing OAuth credentials (alternative to environment variables). | client_secret.json |
| GOOGLE_OAUTH_REDIRECT_URI | No | Optional redirect URI for OAuth callbacks. Overrides the default if set. | http://localhost:8000/oauth2callback |
| GOOGLE_OAUTH_CLIENT_SECRET | No | Google OAuth 2.0 Client Secret paired with GOOGLE_OAUTH_CLIENT_ID. | |
| OAUTHLIB_INSECURE_TRANSPORT | No | Development only – allows OAuth to work without HTTPS | 1 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": true
} |
| resources | {
"subscribe": false,
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| start_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:
In most cases, simply try calling the Google Workspace tool you need - it will automatically handle authentication if required. |
| search_gmail_messagesA | 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. |
| get_gmail_message_contentA | Retrieves the full content (subject, sender, recipients, body) of a specific Gmail message. Set page_offset=0 to read the complete rendered body, excluding attachments and attached messages, as JSON pages of at most page_size characters. Follow next_offset until complete=true, passing body_sha256 as expected_sha256 and keeping body_format and include_links unchanged. Bodies are returned inline and truncated at 20,000 characters. Set full=True to get the complete, untruncated message instead: it is exported to storage 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 without GCS staging have no storage, so there full=True returns the untruncated body inline; with GCS staging configured it returns a signed download URL like any other HTTP deployment. |
| get_gmail_messages_content_batchA | Retrieves 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_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. |
| send_gmail_messageA | Sends 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. THIS TOOL SENDS IMMEDIATELY AND CANNOT SCHEDULE. Gmail's REST API exposes no send-time parameter; Schedule send is a web-UI feature with no API equivalent, so no argument to this tool can defer delivery. Never tell a user a message was scheduled. For "prepare now, deliver later", create a draft with draft_gmail_message. An external scheduler must retain the message data to create and send a new message via send_gmail_message at the chosen time, or call users.drafts.send with the draft ID returned by draft_gmail_message. Alternatively, let the user schedule that draft in the Gmail UI. |
| draft_gmail_messageA | Creates a draft email in the user's Gmail account. Supports new, reply, and forward drafts with optional attachments. Supports Gmail's "Send As" feature to draft from configured alias addresses. To save a forward as a draft for review, 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, subject is optional, and threading, reply, and signature options do not apply. SCHEDULED SEND IS NOT AVAILABLE. Gmail's REST API exposes no send-time parameter; the Schedule send feature is web-UI only, and a message cannot be placed in the Scheduled folder through the API. Do not claim a message was scheduled. To deliver at a chosen time, create a draft with draft_gmail_message. An external scheduler must retain the message data to create and send a new message via send_gmail_message then, or call users.drafts.send with the draft ID returned by draft_gmail_message. Alternatively, let the user schedule the draft in the Gmail UI. |
| get_gmail_thread_contentA | 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. |
| get_gmail_threads_content_batchA | Retrieves the content of multiple Gmail threads in a single batch request. Supports up to 25 threads per batch to prevent SSL connection exhaustion. |
| list_gmail_labelsB | Lists labels in the user's Gmail account. |
| manage_gmail_labelA | Manages Gmail labels: create, update, or delete labels. |
| list_gmail_filtersA | Lists all Gmail filters configured in the user's mailbox. |
| manage_gmail_filterA | Manages Gmail filters: create, delete, update, and apply to existing mail.
|
| modify_gmail_message_labelsA | Adds or removes labels from a Gmail message. To archive an email, remove the INBOX label. To delete an email, add the TRASH label. |
| batch_modify_gmail_message_labelsA | Adds or removes labels on many Gmail messages, or on every message of whole conversations via thread_ids. message_ids are sent in one users.messages.batchModify call (Gmail accepts up to 1000 ids per call). That endpoint returns no per-message result and silently ignores ids it does not recognise, so by default the messages are read back afterwards to report which ids actually changed. thread_ids are modified one at a time with users.threads.modify, e.g. archive a conversation with remove_label_ids=["INBOX"] or mark it read with remove_label_ids=["UNREAD"]. Each thread reports its own outcome. message_ids and thread_ids can be combined; at least one is required, as is at least one of add_label_ids or remove_label_ids. |
| search_drive_filesB | Searches for files and folders within a user's Google Drive, including shared drives. |
| get_drive_file_contentA | 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 (PNG, JPEG, GIF, WebP) → returned as MCP image content after the metadata header. SVG → returned as its markup; raster images it embeds as base64 are attached as image content, numbered to match their place in the markup. BMP and TIFF → base64 text, or a download hint when over the default page size. • Any other file → downloaded; tries UTF-8 decode, else notes binary. |
| get_drive_file_download_urlA | 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). In stateless mode (no file storage), returns the file itself as an embedded resource, up to WORKSPACE_MCP_STATELESS_INLINE_MAX_BYTES (default 10 MiB, and never more than WORKSPACE_MCP_MAX_FILE_BYTES when that is set). For Google native files (Docs, Sheets, Slides, Drawings), exports to a useful format:
For other files, downloads the original file format. |
| list_drive_itemsA | Lists files/folders or shared drive containers, supporting shared drives.
If |
| create_drive_folderA | Creates a new folder in Google Drive, supporting creation within shared drives. |
| create_drive_fileA | Creates 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. Where local file access is disabled it can instead return an upload URL for the caller to PUT file bytes to. This stores the supplied bytes without converting them to Google Docs, Sheets, or Slides. Use the matching import_to_google_* tool for Google-native conversion. |
| import_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. Binary sources may be passed directly as base64_content. On a local server a file on disk can also be passed by path (preferred for batch operations, so callers do not need to load full file contents into their context). |
| import_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. Binary sources may be passed directly as base64_content. On a local server a file on disk can also be passed by path (preferred for batch operations, so callers do not need to load full file contents into their context). |
| import_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. Binary sources may be passed directly as base64_content. On a local server a file on disk can also be passed by path (preferred for batch operations, so callers do not need to load full file contents into their context). |
| get_drive_file_permissionsA | Gets detailed metadata about a Google Drive file including sharing permissions, parent folder IDs, ownership, and lifecycle timestamps. |
| check_drive_file_public_accessA | Searches for a file by name and checks if it has public link sharing enabled. |
| update_drive_fileA | Updates metadata, properties, and/or content of a Google Drive file. Providing new content (inline as
Drive shortcuts are handled according to the kind of update: supported resource-local metadata changes (rename, move, trash, star, description, and custom properties) apply to the supplied shortcut, while content replacement follows the shortcut and updates its target. To avoid applying metadata to the wrong resource, a shortcut call cannot combine content with resource-local metadata. Update the shortcut metadata and target content in separate calls. |
| get_drive_shareable_linkA | Gets the shareable link for a Google Drive file or folder. |
| manage_drive_accessB | 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. |
| copy_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. |
| set_drive_file_permissionsA | 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. |
| list_calendarsA | Retrieves a list of calendars accessible to the authenticated user. |
| get_eventsA | 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. |
| manage_eventC | Manages calendar events. Supports creating, updating, deleting, and RSVP. |
| manage_out_of_officeA | 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. |
| manage_focus_timeA | 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. |
| query_freebusyB | Returns free/busy information for a set of calendars. |
| create_calendarA | Creates a new secondary Google Calendar. |
| search_docsB | Searches for Google Docs by name using Drive API (mimeType filter). |
| get_doc_contentA | Retrieves content of a Google Doc or a Drive file (like .docx) identified by document_id.
By default, native Google Docs text is index-aligned with the document: empty paragraphs are preserved and every non-text element that occupies an index (inline object, page break, footnote reference, ...) is rendered as one U+FFFC placeholder per index. The document body starts at index 1, so an offset n into the text that follows "--- CONTENT ---" is document index n + 1, and that index can be passed straight to format_text or delete_text. Tables and multi-tab documents interleave separators, so alignment holds up to the first table or tab header. Set preserve_context=True for readable link destinations, internal targets, smart-chip values, table boundaries, headers, footers, footnotes, and object context exposed by the Docs API. This output is plain text, not Markdown, and its offsets must not be used as document editing indices. Comments, revision history, exact visual layout, and chip details hidden by the API are not included. Use get_doc_as_markdown for formatting or comments. |
| list_docs_in_folderC | Lists Google Docs within a specific Drive folder. |
| create_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. |
| modify_doc_textA | 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. HEADING MODE: Pass heading instead of start_index to edit the body below a heading, up to the next heading of equal or shallower level. text is rendered as Markdown and replaces that body; end_of_segment=true appends instead. Formatting parameters without text format the whole body. 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". |
| find_and_replace_docA | 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:
For building documents from scratch, consider inserting text with unique placeholders via batch_update_doc, then using this tool to replace them. |
| insert_doc_elementsC | Inserts structural elements like tables, lists, or page breaks into a Google Doc. |
| insert_doc_imageA | Inserts an image into a Google Doc from Drive or a URL. |
| update_doc_headers_footersA | Safely 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. |
| batch_update_docA | 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. |
| inspect_doc_structureA | Essential 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:
Paragraph statistics cover top-level body paragraphs and appear at the top level in basic mode or under "statistics" in detailed mode. Ranges can include required empty paragraphs. Before cleanup, use detailed=true to check adjacent elements, formatting, and object anchors. Preserve the final newline and newlines before tables, tables of contents, or section breaks. If the body ends with an empty paragraph, that paragraph's range has end == total_length; truncation may omit that range. 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. SUB-PARAGRAPH FORMATTING: text_preview is truncated to 100 characters by default. To compute the index of a token inside a longer paragraph, pass preview_chars=0 or None for untruncated text, then add the token's UTF-16 offset within that text to the paragraph's start_index (non-BMP characters such as emoji occupy two UTF-16 units). |
| create_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:
DATA FORMAT REQUIREMENTS:
|
| debug_table_structureA | ESSENTIAL 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:
|
| export_doc_to_pdfA | Exports a Google Doc to PDF format and saves it to Google Drive. |
| update_paragraph_styleC | 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. |
| get_doc_as_markdownA | 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. |
| manage_doc_tabB | Manage document tabs: create, rename, delete, or populate from Markdown. |
| list_document_commentsA | List all comments from a Google Document (optional max_comments to limit results). |
| manage_document_commentC | Manage comments on a Google Document. |
| list_spreadsheetsB | Lists spreadsheets from Google Drive that the user has access to. |
| get_spreadsheet_infoA | Gets information about a specific spreadsheet including its sheets. |
| read_sheet_valuesB | Reads values from a specific range in a Google Sheet, one line per row: the sheet row number, then the row's cells separated by tabs. |
| modify_sheet_valuesB | Modifies values in a specific range of a Google Sheet - can write, update, or clear values, or insert Smart Chips (Drive files/folders or People). |
| format_sheet_rangeB | Applies formatting to a range: colors, number formats, text wrapping, alignment, text styling, cell merging/unmerging, borders, and dropdown lists. 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. |
| manage_conditional_formattingA | Manages conditional formatting rules on a Google Sheet. Supports adding, updating, and deleting conditional formatting rules via a single tool. |
| create_spreadsheetC | Creates a new Google Spreadsheet. |
| create_sheetC | 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). |
| list_sheet_tablesA | 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. |
| append_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. |
| manage_sheet_tabA | Manages an existing sheet tab: rename, delete, hide, unhide, reorder, or style (tab color and gridlines). Use create_sheet to add a tab, and resize_sheet_dimensions for row and column level changes. This tool operates on the tab itself. |
| resize_sheet_dimensionsA | 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. Every row number and column letter refers to the sheet as it was before the call, even when one call both inserts and deletes. Deletes are applied before inserts, and an insert position inside a deleted span lands where that span was. |
| move_sheet_rowsA | 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). |
| manage_named_rangeA | Manages the lifecycle of named ranges in a Google Sheet: list, create, update, or delete. |
| list_spreadsheet_commentsA | List all comments from a Google Spreadsheet (optional max_comments to limit results). |
| manage_spreadsheet_commentC | Manage comments on a Google Spreadsheet. |
| list_spacesB | Lists Google Chat spaces (rooms and direct messages) accessible to the user. |
| get_messagesC | Retrieves messages from a Google Chat space. |
| send_messageA | Sends a message to a Google Chat space, or edits a message already sent there. |
| search_messagesA | Searches for messages in Google Chat spaces by text content and/or time range. |
| create_reactionA | Adds an emoji reaction to a Google Chat message. |
| download_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). |
| create_formB | Create a new form using the title given in the provided form message in the request. |
| get_formC | Get a form. |
| set_publish_settingsB | Updates the publish settings of a form. |
| get_form_responseB | Get one response from the form. |
| list_form_responsesA | List a form's responses. |
| batch_update_formA | 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. |
| create_presentationB | Create a new Google Slides presentation. |
| get_presentationC | Get details about a Google Slides presentation. |
| batch_update_presentationC | Apply batch updates to a Google Slides presentation. |
| get_pageC | Get details about a specific page (slide) in a presentation. |
| render_page_to_imageB | Render a slide (or any page, including notes pages) to an image and return it as image content, for looking at a slide's layout and visuals. |
| list_presentation_commentsA | List all comments from a Google Presentation (optional max_comments to limit results). |
| manage_presentation_commentC | Manage comments on a Google Presentation. |
| list_task_listsA | List all task lists for the user. |
| get_task_listB | Get details of a specific task list. |
| manage_task_listB | Manage task lists: create, update, delete, or clear completed tasks. |
| list_tasksA | List all tasks in a specific task list. |
| get_taskB | Get details of a specific task. |
| manage_taskA | Manage tasks: create, update, delete, or move tasks within task lists. |
| list_contactsA | List contacts for the authenticated user, optionally as a full or incremental sync. |
| get_contactA | Get detailed information about a specific contact. |
| search_contactsB | Search contacts by name, email, phone number, or other fields. |
| manage_contactB | Create, update, or delete a contact. Consolidated tool replacing create_contact, update_contact, and delete_contact. |
| list_contact_groupsB | List contact groups (labels) for the user. |
| get_contact_groupA | Get details of a specific contact group including its members. |
| manage_contacts_batchB | Batch create, update, or delete contacts. Consolidated tool replacing batch_create_contacts, batch_update_contacts, and batch_delete_contacts. |
| manage_contact_groupA | 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. |
| search_customA | Performs a search using Google Custom Search JSON API. |
| get_search_engine_infoB | Retrieves metadata about a Programmable Search Engine. |
| get_script_projectA | Read Apps Script projects and their source files. |
| manage_script_contentA | Update the source files of an Apps Script project. |
| run_script_functionC | Executes a function in a deployed script. |
| manage_deploymentB | Create, update, or delete Apps Script deployments. |
| list_script_deploymentsC | List deployments for an Apps Script project. |
| manage_script_projectC | Create or delete an Apps Script project. |
| manage_script_versionA | Create immutable version snapshots of a script project. Versions capture a snapshot of the current script code; once created they cannot be modified. |
| get_script_versionC | List or retrieve immutable version snapshots of a script project. |
| get_script_activityA | Read execution activity for scripts: recent processes or aggregate metrics. |
| generate_trigger_codeA | 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.
To list or remove existing triggers without opening the editor, use
|
| manage_script_triggerA | List or delete the current user's installable triggers on a script project. The Apps Script REST API has no triggers resource, so in dev_mode both actions
provision (or refresh) a small helper file and run it via the Execution
API - the only way to inspect or change trigger state without opening the
editor. Neither action is read-only: the helper file may be written into the
project on first use. To create a trigger, use |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 119 tools
Tools are mostly grouped by Google product, but several areas have overlapping boundaries, especially Docs editing (modify_doc_text, batch_update_doc, find_and_replace_doc, update_paragraph_style) and Drive permissions (manage_drive_access, set_drive_file_permissions, get_drive_shareable_link). Detailed descriptions help, but with 119 tools the risk of selecting the wrong editing or permission tool remains significant.
Names overwhelmingly use snake_case with predictable verb prefixes such as get_, list_, create_, manage_, search_, and update_. There are a few descriptive outliers like start_google_auth, format_sheet_range, and check_drive_file_public_access, but the overall pattern is readable and consistent.
The server covers a very broad Google Workspace surface, but 119 tools is far beyond a practical, well-scoped MCP tool set and creates substantial context and selection overhead. Even if many tools are justified by product breadth, the count is too heavy for reliable agent use.
Coverage is unusually comprehensive across Gmail, Calendar, Drive, Docs, Sheets, Slides, Chat, Forms, Contacts, Tasks, and Apps Script, with most core lifecycles represented. Minor gaps remain, such as limited shared-drive administration, calendar deletion/update, and some Gmail settings operations, but agents can generally work around them.