google-workspace-mcp-server
MCP server for Google Workspace APIs - Docs, Sheets, Drive, Gmail, and Calendar
Versions
1.4.3latest1.4.21.4.11.4.01.3.0+ show 4 moreshow less
1.2.01.1.11.1.01.0.0Tools 34
calendar_list_calendars List all calendars accessible to the user. Args: - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: List of calendars with their IDs, names, and access roles.
calendar_list_events List events from a calendar within an optional time range. Args: - calendar_id (string): Calendar ID (default: 'primary' for main calendar) - time_min (string, optional): Start of time range in ISO 8601 format (e.g., '2024-01-01T00:00:00Z') - time_max (string, optional): End of time range in ISO 8601 format - max_results (number): Maximum events to return, 1-250 (default: 10) - query (string, optional): Free text search to filter events - single_events (boolean): Expand recurring events into instances (default: true) - order_by ('startTime' | 'updated'): Sort order (default: 'startTime') - page_token (string, optional): Token for pagination - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: List of events with title, time, location, and attendees. Examples: - Today's events: time_min="2024-01-15T00:00:00Z", time_max="2024-01-16T00:00:00Z" - Search meetings: query="standup" - Next 7 days: time_min=(now), time_max=(now + 7 days)
calendar_get_event Get detailed information about a specific calendar event. Args: - calendar_id (string): Calendar ID (default: 'primary') - event_id (string): The event ID to retrieve - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Full event details including description, attendees, and conference info.
calendar_freebusy_query Check availability (free/busy times) for one or more calendars within a time range. This is useful for finding available meeting times across multiple people. It only returns busy time blocks (not event details) for privacy. Args: - time_min (string): Start of the time range (ISO 8601 format, e.g., '2024-01-15T00:00:00Z') - time_max (string): End of the time range (ISO 8601 format, e.g., '2024-01-22T00:00:00Z') - calendar_ids (string[]): Array of calendar IDs or email addresses to check (e.g., ['primary', 'colleague@company.com']) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: For each calendar, a list of busy time blocks within the range. Requirements for checking other people's calendars: - Same Google Workspace organization, OR - They have shared their calendar with you, OR - Their calendar is public Examples: - Check your availability: calendar_ids=["primary"], time_min="2024-01-15T09:00:00Z", time_max="2024-01-15T18:00:00Z" - Check team availability: calendar_ids=["alice@company.com", "bob@company.com"]
gmail_list_messages List messages from Gmail with optional search filters. Args: - query (string, optional): Gmail search query (e.g., 'from:boss@company.com is:unread', 'subject:invoice after:2024/01/01') - max_results (number): Maximum messages to return, 1-100 (default: 10) - label_ids (string[]): Filter by labels like 'INBOX', 'UNREAD', 'STARRED', 'SENT' - page_token (string, optional): Token for pagination - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: List of message summaries with ID, subject, from, date, and snippet. Examples: - Unread emails: query="is:unread" - From specific sender: query="from:notifications@github.com" - Recent with attachment: query="has:attachment newer_than:7d"
gmail_get_message Get the full content of a specific Gmail message. Args: - message_id (string): The message ID to retrieve - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Full message content including headers and body text.
gmail_list_threads List conversation threads from Gmail. Args: - query (string, optional): Gmail search query to filter threads - max_results (number): Maximum threads to return, 1-100 (default: 10) - label_ids (string[]): Filter by labels - page_token (string, optional): Token for pagination - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: List of threads with message count and snippet.
gmail_get_thread Get all messages in a conversation thread. Args: - thread_id (string): The thread ID to retrieve - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: All messages in the thread with full content.
gmail_list_labels List all labels (folders) in Gmail. Args: - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: List of all labels with their IDs and types.
gmail_create_draft Create a new email draft in Gmail. The draft is saved but NOT sent automatically. Args: - to (string[]): Array of recipient email addresses (required) - subject (string): Email subject line - body (string): Email body content (plain text or HTML depending on content_type) - content_type (string, optional): MIME content type - "text/plain" (default) or "text/html" - cc (string[], optional): Array of CC recipient email addresses - bcc (string[], optional): Array of BCC recipient email addresses - reply_to_message_id (string, optional): Message ID to reply to (for creating reply drafts) Returns: { "draftId": string, "messageId": string, "threadId": string } Examples: - Simple draft: to=["bob@example.com"], subject="Hello", body="Hi Bob!" - Reply draft: to=["bob@example.com"], subject="Re: Meeting", body="Sounds good!", reply_to_message_id="abc123"
gmail_list_attachments List all attachments in a specific Gmail message. Args: - message_id (string): The ID of the message to list attachments from - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: { "attachments": [ { "attachmentId": string, "filename": string, "mimeType": string, "size": number } ] }
gmail_get_attachment Download an attachment from a Gmail message. Args: - message_id (string): The ID of the message containing the attachment - attachment_id (string): The ID of the attachment to download (from gmail_list_attachments) - filename (string, optional): Filename for the attachment (for display purposes) Returns: The attachment content. For images, returns the image directly. For other files, provides download info. Examples: - Download attachment: message_id="abc123", attachment_id="xyz789"
docs_get_document Retrieve the content of a Google Doc by its ID. Args: - document_id (string): The ID of the Google Doc (found in the URL after /d/) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Document title, content, and metadata. For JSON format: { "documentId": string, "title": string, "textContent": string, "revisionId": string } Examples: - Get doc content: document_id="1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"
docs_create_document Create a new Google Doc with an optional initial body. Args: - title (string): The title for the new document - body_content (string, optional): Initial text content for the document body Returns: { "documentId": string, "title": string, "revisionId": string } Examples: - Create empty doc: title="Meeting Notes" - Create with content: title="Draft", body_content="Hello World"
docs_batch_update Apply batch updates to a Google Doc (insert/update/delete text, formatting, images, tables). Args: - document_id (string): The ID of the Google Doc to update - requests (array): Array of batch update request objects Common request types: - insertText: { insertText: { location: { index: 1 }, text: "Hello" } } - deleteContentRange: { deleteContentRange: { range: { startIndex: 1, endIndex: 10 } } } - updateTextStyle: { updateTextStyle: { range: {...}, textStyle: {...}, fields: "bold" } } - insertInlineImage: { insertInlineImage: { location: {...}, uri: "https://..." } } - insertTable: { insertTable: { rows: 3, columns: 3, location: {...} } } See Google Docs API batchUpdate documentation for full request schema. Returns: { "documentId": string, "replies": array, "writeControl": object }
sheets_get_spreadsheet Retrieve metadata and optionally cell data from a Google Spreadsheet. Args: - spreadsheet_id (string): The ID of the Google Spreadsheet (found in the URL after /d/) - include_grid_data (boolean): Whether to include cell data (default: false) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Spreadsheet title, sheets info, and metadata. For JSON format: { "spreadsheetId": string, "title": string, "locale": string, "sheets": [{ "sheetId": number, "title": string, "rowCount": number, "columnCount": number }], "spreadsheetUrl": string } Examples: - Get spreadsheet info: spreadsheet_id="1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"
sheets_get_values Read cell values from a specific range in a Google Spreadsheet. Args: - spreadsheet_id (string): The ID of the Google Spreadsheet - range (string): The A1 notation range to read (e.g., 'Sheet1!A1:D10' or 'A1:D10') - major_dimension ('ROWS' | 'COLUMNS'): Return data by rows or columns (default: 'ROWS') - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: For JSON format: { "range": string, "majorDimension": string, "values": [[cell values...], ...] } Examples: - Read range: spreadsheet_id="...", range="Sheet1!A1:D10" - Read specific column: spreadsheet_id="...", range="Sheet1!A:A"
sheets_batch_get_values Read cell values from multiple ranges in a Google Spreadsheet in a single request. Args: - spreadsheet_id (string): The ID of the Google Spreadsheet - ranges (string[]): Array of A1 notation ranges to read (e.g., ['Sheet1!A1:D10', 'Sheet2!A1:B5']) - major_dimension ('ROWS' | 'COLUMNS'): Return data by rows or columns (default: 'ROWS') - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: For JSON format: { "spreadsheetId": string, "valueRanges": [{ "range": string, "values": [[...]] }, ...] } Examples: - Read multiple ranges: ranges=["Sheet1!A1:D10", "Sheet2!A:B"]
sheets_update_values Write cell values to a specific range in a Google Spreadsheet. Args: - spreadsheet_id (string): The ID of the Google Spreadsheet - range (string): The A1 notation range to update (e.g., 'Sheet1!A1:D10') - values (array): 2D array of values to write (rows of cells) - value_input_option ('RAW' | 'USER_ENTERED'): How to interpret input (default: 'USER_ENTERED') - 'RAW': Values are stored as-is - 'USER_ENTERED': Values are parsed as if typed by user (formulas, dates work) Returns: { "spreadsheetId": string, "updatedRange": string, "updatedRows": number, "updatedColumns": number, "updatedCells": number } Examples: - Write data: range="Sheet1!A1", values=[["Name", "Age"], ["Alice", 30]] - Write formula: range="Sheet1!C1", values=[["=SUM(A1:B1)"]]
sheets_append_values Append rows of data to the end of a table in a Google Spreadsheet. Args: - spreadsheet_id (string): The ID of the Google Spreadsheet - range (string): The A1 notation range defining the table to append to (e.g., 'Sheet1!A:D') - values (array): 2D array of values to append (rows of cells) - value_input_option ('RAW' | 'USER_ENTERED'): How to interpret input (default: 'USER_ENTERED') - insert_data_option ('OVERWRITE' | 'INSERT_ROWS'): How to insert data (default: 'INSERT_ROWS') Returns: { "spreadsheetId": string, "tableRange": string, "updates": { "updatedRange": string, "updatedRows": number, "updatedCells": number } } Examples: - Append rows: range="Sheet1!A:D", values=[["Alice", 30, "Engineer", "NYC"]]
sheets_create_spreadsheet Create a new Google Spreadsheet with optional sheet names. Args: - title (string): The title for the new spreadsheet - sheet_titles (string[], optional): Array of sheet names to create Returns: { "spreadsheetId": string, "title": string, "spreadsheetUrl": string, "sheets": [{ "sheetId": number, "title": string }] } Examples: - Create basic: title="My Spreadsheet" - With sheets: title="Budget", sheet_titles=["Income", "Expenses", "Summary"]
sheets_batch_update Apply batch updates to a Google Spreadsheet (formatting, charts, filters, conditional formatting, etc.). Args: - spreadsheet_id (string): The ID of the Google Spreadsheet to update - requests (array): Array of batch update request objects Common request types: - updateCells: Update cell data and formatting - addSheet: Add a new sheet - deleteSheet: Delete a sheet - updateSheetProperties: Rename sheet, change grid size - mergeCells: Merge cell ranges - addConditionalFormatRule: Add conditional formatting - addChart: Add a chart - setDataValidation: Add data validation rules - addFilterView: Add filter views - repeatCell: Apply formatting to a range See Google Sheets API batchUpdate documentation for full request schema. Returns: { "spreadsheetId": string, "replies": array } Examples: - Add sheet: requests=[{ "addSheet": { "properties": { "title": "NewSheet" } } }] - Bold range: requests=[{ "repeatCell": { "range": {...}, "cell": { "userEnteredFormat": { "textFormat": { "bold": true } } }, "fields": "userEnteredFormat.textFormat.bold" } }]
sheets_clear_values Clear cell values from a specific range in a Google Spreadsheet (keeps formatting). Args: - spreadsheet_id (string): The ID of the Google Spreadsheet - range (string): The A1 notation range to clear (e.g., 'Sheet1!A1:D10') Returns: { "spreadsheetId": string, "clearedRange": string } Examples: - Clear range: range="Sheet1!A1:D10" - Clear entire sheet: range="Sheet1"
sheets_duplicate_sheet Duplicate a sheet within the same spreadsheet. Args: - spreadsheet_id (string): The ID of the Google Spreadsheet - sheet_id (number): The ID of the sheet to duplicate (use sheets_get_spreadsheet to find sheet IDs) - new_sheet_name (string, optional): Name for the new sheet (defaults to 'Copy of [original name]') Returns: { "sheetId": number, "title": string, "index": number } Examples: - Duplicate sheet: spreadsheet_id="...", sheet_id=0 - Duplicate with new name: spreadsheet_id="...", sheet_id=0, new_sheet_name="January Data"
sheets_create_pivot_table Create a pivot table from spreadsheet data with full Google Sheets UI feature support. Args: - spreadsheet_id (string): The ID of the Google Spreadsheet - source_range (string): A1 notation range (e.g., 'Sheet1!A1:E100', 'Sales!A:F') - destination_sheet_id (number, optional): Sheet ID for pivot (default: creates new sheet) - destination_sheet_name (string): Name for new sheet (default: 'Pivot Table') - rows/columns (array): Groupings (at least one row OR column required) - source_column: Column letter ('A') or index (0) - label: Custom display name - show_totals: Show subtotals (default: true) - sort_order: 'ASCENDING' or 'DESCENDING' - sort_by_value: { value_index: 0 } - Sort by aggregated value instead of alphabetically - group_rule: Bucketing options (pick one): - { date_time: { type: 'MONTH' } } - Group dates (YEAR, QUARTER, MONTH, DAY_OF_WEEK, etc.) - { histogram: { interval: 100, start: 0, end: 1000 } } - Numeric buckets - { manual: { groups: [{ group_name: 'West', items: ['CA', 'WA', 'OR'] }] } } - group_limit: Max groups to display - values (array, required): Aggregations - source_column: Column to aggregate (or use formula) - formula: Custom formula like '=Revenue/Quantity' (use with summarize_function: 'CUSTOM') - summarize_function: SUM, COUNT, COUNTA, COUNTUNIQUE, AVERAGE, MAX, MIN, MEDIAN, PRODUCT, STDEV, STDEVP, VAR, VARP, CUSTOM - name: Display name - calculated_display_type: 'PERCENT_OF_ROW_TOTAL', 'PERCENT_OF_COLUMN_TOTAL', 'PERCENT_OF_GRAND_TOTAL' - filters (array, optional): Filter source data - source_column: Column to filter - visible_values: ['Active', 'Pending'] - Show only these values - condition: { type: 'NUMBER_GREATER', values: [100] } - Filter by condition - value_layout: 'HORIZONTAL' or 'VERTICAL' (default: 'HORIZONTAL') Examples: - Date grouped: rows=[{source_column: "A", group_rule: {date_time: {type: "MONTH"}}}], values=[{source_column: "E", summarize_function: "SUM"}] - Sorted by value: rows=[{source_column: "A", sort_by_value: {value_index: 0}, sort_order: "DESCENDING"}], values=[{source_column: "E", summarize_function: "SUM"}] - Filtered: filters=[{source_column: "B", visible_values: ["Active"]}], rows=[{source_column: "A"}], values=[{source_column: "E", summarize_function: "SUM"}] - Percentage: values=[{source_column: "E", summarize_function: "SUM", calculated_display_type: "PERCENT_OF_GRAND_TOTAL"}]
drive_list_comments List comments on a Google Doc. Args: - file_id (string): The ID of the Google Doc - include_deleted (boolean): Include deleted comments (default: false) - page_size (number): Max comments to return, 1-100 (default: 20) - page_token (string, optional): Pagination token for next page - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: For JSON format: { "comments": [ { "id": string, "content": string, "author": string, "createdTime": string, "resolved": boolean, "quotedFileContent": string, "replies": [{ "id", "content", "author", "createdTime" }] } ], "next_page_token": string | null }
drive_create_comment Add a comment to a Google Doc. Can be anchored to specific text or unanchored. Args: - file_id (string): The ID of the Google Doc - content (string): The text content of the comment - quoted_text (string, optional): Text to anchor the comment to (for anchored comments) Returns: { "id": string, "content": string, "author": string, "createdTime": string } Examples: - Unanchored: file_id="...", content="Please review this section" - Anchored: file_id="...", content="Typo here", quoted_text="teh"
drive_reply_to_comment Reply to an existing comment on a Google Doc. Args: - file_id (string): The ID of the Google Doc - comment_id (string): The ID of the comment to reply to - content (string): The text content of the reply Returns: { "id": string, "content": string, "author": string, "createdTime": string }
drive_resolve_comment Mark a comment as resolved on a Google Doc. Args: - file_id (string): The ID of the Google Doc - comment_id (string): The ID of the comment to resolve Returns: { "id": string, "resolved": true }
drive_delete_comment Delete a comment from a Google Doc. Args: - file_id (string): The ID of the Google Doc - comment_id (string): The ID of the comment to delete Returns: { "deleted": true, "comment_id": string } Note: This action cannot be undone.
drive_list_files List files in your Google Drive. Args: - page_size (number): Max files to return, 1-100 (default: 20) - page_token (string, optional): Pagination token for next page - order_by (string): Sort order (default: 'modifiedTime desc') - mime_type ('all' | 'documents' | 'spreadsheets' | 'presentations' | 'folders'): Filter by type (default: 'all') - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: For JSON format: { "files": [ { "id": string, "name": string, "mimeType": string, "createdTime": string, "modifiedTime": string, "size": string, "webViewLink": string, "owners": string[] } ], "next_page_token": string | null }
drive_search_files Search for files in your Google Drive by name or content. Args: - query (string): Search query - searches file names and content - page_size (number): Max files to return, 1-100 (default: 20) - page_token (string, optional): Pagination token for next page - mime_type ('all' | 'documents' | 'spreadsheets' | 'presentations' | 'folders'): Filter by type (default: 'all') - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: For JSON format: { "files": [ { "id": string, "name": string, "mimeType": string, "createdTime": string, "modifiedTime": string, "size": string, "webViewLink": string, "owners": string[] } ], "next_page_token": string | null } Examples: - Search by name: query="budget 2024" - Search spreadsheets: query="sales", mime_type="spreadsheets"
drive_get_file Download and return the content of a file from Google Drive. Supports PDFs, images, and other binary files. Args: - file_id (string): The ID of the file to download (found in the URL after /d/) Returns: The file content. For PDFs and images, returns the binary content that Claude can read directly. Examples: - Get PDF: file_id="1Q3BmlH3_sII1VGf0-GYXSiLGTZstM-l1" - From URL https://drive.google.com/file/d/ABC123/view -> file_id="ABC123"
drive_copy_file Create a copy of a file in Google Drive. Args: - file_id (string): The ID of the file to copy - name (string, optional): New name for the copied file (defaults to 'Copy of [original name]') - parent_folder_id (string, optional): ID of the folder to copy the file into (defaults to same location as original) Returns: { "id": string, "name": string, "mimeType": string, "webViewLink": string } Examples: - Copy file: file_id="1abc123" - Copy with new name: file_id="1abc123", name="Budget 2025" - Copy to folder: file_id="1abc123", parent_folder_id="0xyz789"
Permissions 2
filesystem low env_vars low