io.github.taylorwilsdon/workspace-mcp
PYPI · WORKSPACE-MCP · SCANNED SEP 20
Google Workspace MCP server for Gmail, Drive, Calendar, Docs, Sheets, Slides, Forms, Tasks, Chat.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security50
- Malware scan not yet available for this package.Unverified
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs setuptools.build_meta at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
- 4 of 58 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency10
- Repository check failed: no source repository is declared. See how to fix → View diagnostics → Fail
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: no license is declared. See how to fix → Fail
- Actively maintained (last published 1 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability64
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 26154 tokens (~212/item across 123 items; 123 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management83
- Stability observed for 25 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage98
- 99% of tools have a non-trivial description (not blank, and not just the tool's name).Partial
- 93% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 123 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the io.github.taylorwilsdon/workspace-mcp server?
io.github.taylorwilsdon/workspace-mcp runs locally as a PyPI package, launched with uvx workspace-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · workspace-mcp
claude mcp add taylorwilsdon-workspace-mcp -- uvx workspace-mcp
{
"mcpServers": {
"taylorwilsdon-workspace-mcp": {
"command": "uvx",
"args": [
"workspace-mcp"
]
}
}
} {
"servers": {
"taylorwilsdon-workspace-mcp": {
"command": "uvx",
"args": [
"workspace-mcp"
]
}
}
} codex mcp add taylorwilsdon-workspace-mcp -- uvx workspace-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"taylorwilsdon-workspace-mcp": {
"type": "local",
"command": [
"uvx",
"workspace-mcp"
],
"enabled": true
}
}
} openclaw mcp add taylorwilsdon-workspace-mcp --command uvx --arg workspace-mcp
mcp_servers:
taylorwilsdon-workspace-mcp:
command: "uvx"
args: ["workspace-mcp"] {
"McpServers": {
"taylorwilsdon-workspace-mcp": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"workspace-mcp"
]
}
}
} assistant mcp add taylorwilsdon-workspace-mcp -t stdio -c uvx -a workspace-mcp
{
"mcpServers": {
"taylorwilsdon-workspace-mcp": {
"command": "uvx",
"args": [
"workspace-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 19 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 −18
- Malware scan: pass → unverified ▼ security
- Stability: pass → 0.77 functional
- 17 Sept 26 0
- Stability: 0.97 → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Malware scan: pass → unverified ▼ security
- Stability: 0.97 → pass security
- Schema quality: 191 → 212 ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 99 → unverified ▼ functional
- Schema quality: Schema quality not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet. functional
- Package version: 1.25.0 → 1.27.0 functional
- 16 Sept 26 +15
- Malware scan: unverified → pass ▲ security
- 15 Sept 26 −14
- Malware scan: pass → unverified ▼ security
- 14 Sept 26 +15
- Malware scan: unverified → pass ▲ security
- 13 Sept 26 −2
- Stability: pass → 0.87 functional
- 12 Sept 26 +1
- Stability: 0.97 → pass security
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed pypi/workspace-mcp@1.27.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | setuptools.build_meta |
Background: Why install scripts are a supply-chain risk →
Dependencies 58 packages
| Packages resolved | 58 |
|---|---|
| Stale | 3 |
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
manage_sheet_tab Manage Sheet Tab ~156
Manages the lifecycle of an existing sheet tab: rename, delete, hide, unhide or reorder. Use create_sheet to add a tab, and resize_sheet_dimensions for row and column level changes. This tool operates on the tab itself.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | One of "rename", "delete", "hide", "unhide", "reorder" |
| new_index | – | – | New zero-based position, required for action="reorder" |
| new_name | – | – | New title, required for action="rename" |
| sheet_name | string | yes | Title of the existing tab to act on |
| spreadsheet_id | string | yes | ID of the spreadsheet |
| user_google_email | string | yes | User's Google email address |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
manage_spreadsheet_comment Manage Spreadsheet Comment ~121
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.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| comment_content | – | – | – |
| comment_id | – | – | – |
| spreadsheet_id | string | yes | – |
| user_google_email | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
manage_task Manage Task ~287
Manage tasks: create, update, delete, or move tasks within task lists.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | The action to perform. Must be one of: "create", "update", "delete", "move". |
| destination_task_list | – | – | Destination task list ID (for moving between lists). Used by "move" action. |
| due | – | – | Due date in RFC 3339 format (e.g., "2024-12-31T23:59:59Z"). Used by "create" and "update" actions. |
| notes | – | – | Notes/description for the task. Used by "create" and "update" actions. |
| parent | – | – | Parent task ID (for subtasks). Used by "create" and "move" actions. |
| previous | – | – | Previous sibling task ID (for positioning). Used by "create" and "move" actions. |
| status | – | – | Task status ("needsAction" or "completed"). Used by "update" action. |
| task_id | – | – | The ID of the task. Required for "update", "delete", and "move" actions. |
| task_list_id | string | yes | The ID of the task list. Required for all actions. |
| title | – | – | The title of the task. Required for "create", optional for "update". |
| user_google_email | string | yes | The user's Google email address. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
manage_task_list Manage Task List ~119
Manage task lists: create, update, delete, or clear completed tasks.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | The action to perform. Must be one of: "create", "update", "delete", "clear_completed". |
| task_list_id | – | – | The ID of the task list. Required for "update", "delete", and "clear_completed" actions. |
| title | – | – | The title for the task list. Required for "create" and "update" actions. |
| user_google_email | string | yes | The user's Google email address. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
modify_doc_text Modify Doc Text ~523
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".
| Name | Type | Req | Description |
|---|---|---|---|
| background_color | string | – | Background/highlight color (#RRGGBB) |
| baseline_offset | string | – | One of NONE, SUPERSCRIPT, SUBSCRIPT |
| bold | boolean | – | Whether to make text bold (True/False/None to leave unchanged) |
| clear_link | boolean | – | Remove hyperlink from the target range |
| document_id | string | yes | ID of the document to update |
| end_index | integer | – | End position for text replacement/formatting (if not provided with text, text is inserted) |
| end_of_segment | boolean | – | Insert text at the end of the targeted segment instead of start_index |
| font_family | string | – | Font family name (e.g., "Arial", "Times New Roman") |
| font_size | number | – | Font size in points |
| font_weight | integer | – | Font weight (100-900 in steps of 100; requires font_family) |
| italic | boolean | – | Whether to make text italic (True/False/None to leave unchanged) |
| link_url | string | – | Hyperlink URL (http/https) |
| segment_id | string | – | Optional header/footer/footnote segment ID to target |
| small_caps | boolean | – | Whether to apply small caps |
| start_index | integer | yes | Start position for operation using Docs API indices from inspect_doc_structure. For the main body, 0 is also accepted as an alias for the first writable position. |
| strikethrough | boolean | – | Whether to strike through text (True/False/None to leave unchanged) |
| tab_id | string | – | Optional document tab ID to target |
| text | string | – | New text to insert or replace with (optional - can format existing text without changing it) |
| text_color | string | – | Foreground text color (#RRGGBB) |
| underline | boolean | – | Whether to underline text (True/False/None to leave unchanged) |
| user_google_email | string | yes | User's Google email address |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
modify_gmail_message_labels Modify Gmail Message Labels ~109
Adds or removes labels from a Gmail message. To archive an email, remove the INBOX label. To delete an email, add the TRASH label.
| Name | Type | Req | Description |
|---|---|---|---|
| add_label_ids | array | – | List of label IDs to add to the message. |
| message_id | string | yes | The ID of the message to modify. |
| remove_label_ids | array | – | List of label IDs to remove from the message. |
| user_google_email | string | yes | The user's Google email address. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
modify_sheet_values Modify Sheet Values ~173
Modifies values in a specific range of a Google Sheet - can write, update, or clear values.
| Name | Type | Req | Description |
|---|---|---|---|
| clear_values | boolean | – | If True, clears the range instead of writing values. Defaults to False. |
| range_name | string | yes | The range to modify (e.g., "Sheet1!A1:D10", "A1:D10"). Required. |
| spreadsheet_id | string | yes | The ID of the spreadsheet. Required. |
| user_google_email | string | yes | The user's Google email address. Required. |
| value_input_option | string | – | How to interpret input values ("RAW" or "USER_ENTERED"). Defaults to "USER_ENTERED". |
| values | – | – | 2D array of values to write/update. Can be a JSON string or Python list. Required unless clear_values=True. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
move_sheet_rows Move Sheet Rows ~213
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).
| Name | Type | Req | Description |
|---|---|---|---|
| destination_sheet | string | yes | Name of the sheet to move rows to. Required. |
| end_row | integer | yes | Last row to move (1-based, inclusive). Required. |
| source_sheet | string | yes | Name of the sheet to move rows from. Required. |
| spreadsheet_id | string | yes | The ID of the spreadsheet. Required. |
| start_row | integer | yes | First row to move (1-based, inclusive). Required. |
| user_google_email | string | yes | The user's Google email address. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
query_freebusy Query Freebusy ~245
Returns free/busy information for a set of calendars.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar_expansion_max | – | – | Maximum number of calendars for which FreeBusy information is to be provided. Optional. Maximum value is 50. |
| calendar_ids | – | – | List of calendar identifiers to query. If not provided, queries the primary calendar. Use 'primary' for the user's primary calendar or specific calendar IDs obtained from `list_calendars`. |
| group_expansion_max | – | – | Maximum number of calendar identifiers to be provided for a single group. Optional. An error is returned for a group with more members than this value. Maximum value is 100. |
| time_max | string | yes | The end of the interval for the query in RFC3339 format (e.g., '2024-05-12T18:00:00Z' or '2024-05-12'). |
| time_min | string | yes | The start of the interval for the query in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). |
| user_google_email | string | yes | The user's Google email address. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
read_sheet_values Read Sheet Values ~224
Reads values from a specific range in a Google Sheet.
| Name | Type | Req | Description |
|---|---|---|---|
| include_formulas | boolean | – | If True, also fetch raw formula strings for cells that contain formulas. Useful for identifying cross-sheet references before writing back to a range. Defaults to False to avoid an extra API request. |
| include_hyperlinks | boolean | – | If True, also fetch hyperlink metadata for the range. Defaults to False to avoid expensive includeGridData requests. |
| include_notes | boolean | – | If True, also fetch cell notes for the range. Defaults to False to avoid expensive includeGridData requests. |
| range_name | string | – | The range to read (e.g., "Sheet1!A1:D10", "A1:D10"). Defaults to "A1:Z1000". Open-ended or oversized ranges are clamped to at most 1000 rows before the Sheets API request to bound memory use. |
| spreadsheet_id | string | yes | The ID of the spreadsheet. Required. |
| user_google_email | string | yes | The user's Google email address. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
resize_sheet_dimensions Resize Sheet Dimensions ~561
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.
| Name | Type | Req | Description |
|---|---|---|---|
| auto_resize_columns | – | – | List of column letters to auto-resize to fit content. Example: ["A", "B"]. |
| auto_resize_rows | – | – | List of 1-based row numbers to auto-resize to fit content. Example: [1, 2]. |
| column_sizes | – | – | Dict mapping column letters to pixel widths. Example: {"A": 200, "C": 300}. Can be a JSON string or Python dict. |
| delete_columns | – | – | List of column letters to delete. Example: ["E", "F"]. |
| delete_row_range | – | – | Contiguous range of rows to delete, as "start:end" (1-based, inclusive). Example: "5:10" deletes rows 5 through 10. More efficient than delete_rows for large contiguous ranges. |
| delete_rows | – | – | List of 1-based row numbers to delete. Example: [5, 6]. Best for non-contiguous rows. |
| frozen_column_count | – | – | Number of columns to freeze from the left. Use 0 to unfreeze all columns. |
| frozen_row_count | – | – | Number of rows to freeze from the top. Use 0 to unfreeze all rows. |
| hide_columns | – | – | List of column letters to hide. Example: ["C", "D"]. |
| hide_rows | – | – | List of 1-based row numbers to hide. Example: [3, 4]. |
| insert_columns | – | – | Number of columns to insert. |
| insert_columns_at | – | – | Column letter to insert before (e.g. "C"). Appends to the end if omitted. |
| insert_rows | – | – | Number of rows to insert. |
| insert_rows_at | – | – | 1-based row number to insert before. Appends to the end of the sheet if omitted. |
| row_sizes | – | – | Dict mapping 1-based row numbers to pixel heights. Example: {"1": 40, "3": 60}. Can be a JSON string or Python dict. |
| sheet_name | – | – | Sheet name to target. Defaults to the first sheet if not provided. |
| spreadsheet_id | string | yes | The ID of the spreadsheet. Required. |
| unhide_columns | – | – | List of column letters to unhide. Example: ["C", "D"]. |
| unhide_rows | – | – | List of 1-based row numbers to unhide. Example: [3, 4]. |
| user_google_email | string | yes | The user's Google email address. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
run_script_function Run Script Function ~123
Executes a function in a deployed script.
| Name | Type | Req | Description |
|---|---|---|---|
| deployment_id | – | – | Optional API Executable deployment ID. When supplied, skips the automatic deployment lookup. When omitted, the versioned API Executable deployment with the highest version number is used. |
| dev_mode | boolean | – | Whether to run latest code vs deployed version |
| function_name | string | yes | Name of function to execute |
| parameters | – | – | Optional list of parameters to pass |
| script_id | string | yes | The script project ID |
| user_google_email | string | yes | User's email address |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
search_contacts Search Contacts ~81
Search contacts by name, email, phone number, or other fields.
| Name | Type | Req | Description |
|---|---|---|---|
| page_size | integer | – | Maximum number of results to return (default: 30, max: 30). |
| query | string | yes | Search query string (searches names, emails, phone numbers). |
| user_google_email | string | yes | The user's Google email address. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
search_custom Search Custom ~275
Performs a search using Google Custom Search JSON API.
| Name | Type | Req | Description |
|---|---|---|---|
| country | – | – | Country code for results (e.g., "countryUS"). |
| date_restrict | – | – | Restrict results by date (e.g., "d5" for past 5 days, "m3" for past 3 months). |
| file_type | – | – | Filter by file type (e.g., "pdf", "doc"). |
| language | – | – | Language code for results (e.g., "lang_en"). |
| num | integer | – | Number of results to return (1-10). Defaults to 10. |
| q | string | yes | The search query. Required. |
| safe | string | – | Safe search level. Defaults to "off". |
| search_type | – | – | Search for images if set to "image". |
| site_search | – | – | Restrict search to a specific site/domain. |
| site_search_filter | – | – | Exclude ("e") or include ("i") site_search results. |
| sites | – | – | List of sites/domains to restrict search to (e.g., ["example.com", "docs.example.com"]). When provided, results are limited to these sites. |
| start | integer | – | The index of the first result to return (1-based). Defaults to 1. |
| user_google_email | string | yes | The user's Google email address. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
search_docs Search Docs ~62
Searches for Google Docs by name using Drive API (mimeType filter). Returns: str: A formatted list of Google Docs matching the search query.
| Name | Type | Req | Description |
|---|---|---|---|
| page_size | integer | – | – |
| query | string | yes | – |
| user_google_email | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
search_drive_files Search Drive Files ~592
Searches for files and folders within a user's Google Drive, including shared drives.
| Name | Type | Req | Description |
|---|---|---|---|
| corpora | – | – | Bodies of items to query (e.g., 'user', 'domain', 'drive', 'allDrives'). If 'drive_id' is specified and 'corpora' is None, it defaults to 'drive'. Otherwise,… |
| detailed | boolean | – | Whether to include size, modified time, and link in results. Defaults to True. |
| drive_id | – | – | ID of the shared drive to search. If None, behavior depends on `corpora` and `include_items_from_all_drives`. |
| file_type | – | – | Restrict results to a specific file type. Accepts a friendly name ('folder', 'document'/'doc', 'spreadsheet'/'sheet', 'presentation'/'slides', 'form', 'd… |
| include_items_from_all_drives | boolean | – | Whether shared drive items should be included in results. Defaults to True. This is effective when not specifying a `drive_id`. |
| include_trashed | boolean | – | Whether to include files in the trash. Defaults to False, matching the Drive web UI and `list_drive_items`. Ignored when `query` already contains its own `tras… |
| order_by | – | – | Sort order. Comma-separated list of sort keys with optional 'desc' modifier. Valid keys: 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name… |
| page_size | integer | – | The maximum number of files to return. Defaults to 10. |
| page_token | – | – | Page token from a previous response's nextPageToken to retrieve the next page of results. |
| query | string | yes | The search query string. Supports Google Drive search operators. NOTE: Owner-based queries ('user@example.com' in owners) DO NOT WORK in Shared Drives because files are owned by the… |
| user_google_email | string | yes | The user's Google email address. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
search_gmail_messages Search Gmail Messages ~189
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.
| Name | Type | Req | Description |
|---|---|---|---|
| include_headers | boolean | – | If True, also fetch each message's metadata and include Subject, From, and Date per result. Costs one metadata get per result, grouped into HTTP batches of up to 10, plus retries for transient failur… |
| page_size | integer | – | The maximum number of messages to return. Defaults to 10. |
| page_token | – | – | Token for retrieving the next page of results. Use the next_page_token from a previous response. |
| query | string | yes | The search query. Supports standard Gmail search operators. |
| user_google_email | string | yes | The user's Google email address. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
search_messages Search Messages ~191
Searches for messages in Google Chat spaces by text content and/or time range.
| Name | Type | Req | Description |
|---|---|---|---|
| max_spaces | integer | – | Maximum number of spaces to search when space_id is not provided (default 10). |
| page_size | integer | – | Maximum number of messages to return per space. |
| query | – | – | Optional text to search for. If omitted, only time_filter is applied. |
| space_id | – | – | Optional space to restrict the search to. |
| time_filter | – | – | Optional filter using Chat API createTime syntax. Examples: 'createTime > "2026-03-18T00:00:00-03:00"' 'createTime > "2026-03-18T00:00:00-03:00" AND createTime < "2026-… |
| user_google_email | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
send_gmail_message Send Gmail Message ~980
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.
| Name | Type | Req | Description |
|---|---|---|---|
| attachments | – | – | Optional list of attachments. Each can have: "url" (fetch from URL — works with MCP attachment URLs from get_drive_file_download_url / get_gmail_attachment_content), OR "path" (file path, auto-encode… |
| bcc | – | – | Optional BCC email address. |
| body | – | – | Email body content (plain text or HTML). Required when sending. When forwarding, this is an optional note prepended above the quoted original. |
| body_format | string | – | Format of the body content (and of the prepended note when forwarding). Use 'plain' for plaintext or 'html' for HTML content. |
| cc | – | – | Optional CC email address. |
| forward_message_id | – | – | Set to a Gmail message ID to forward that message instead of composing a new one. The original subject, body, and (optionally) attachments are carried over; 'body' becomes an optional note prepended… |
| from_email | – | – | Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the authenticated user's email. |
| from_name | – | – | Optional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'. |
| in_reply_to | – | – | Optional RFC Message-ID to explicitly reply to a specific message (e.g., '<message123@gmail.com>'). Omit to reply to the latest eligible message in thread_id. |
| include_forwarded_attachments | boolean | – | When forwarding, whether to include the original message's attachments. Ignored unless forward_message_id is set. |
| include_signature | boolean | – | Whether to append the Gmail signature from Settings > Signature when available. Defaults to true. |
| quote_original | boolean | – | Whether to include the message being replied to as a quoted original. Only has an effect when thread_id is provided. Defaults to false. |
| references | – | – | Optional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target. |
| reply_all | boolean | – | Whether to derive reply-all recipients from the thread: To = the sender being replied to, Cc = the other participants, excluding the authenticated account and from_email. Requires thread_id. Explicit… |
| subject | – | – | Email subject. Required when sending; optional when forwarding (defaults to 'Fwd: <original subject>'). |
| thread_id | – | – | Optional Gmail thread ID to reply within. When in_reply_to is omitted, replies to the latest non-draft, non-trash message with an RFC Message-ID. |
| to | – | – | Recipient email address. Optional when replying with reply_all=True, which derives it from the thread. |
| user_google_email | string | yes | The user's Google email address. Required for authentication. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
send_message Send Message ~153
Sends a message to a Google Chat space, or edits a message already sent there.
| Name | Type | Req | Description |
|---|---|---|---|
| message_name | – | – | Edit this message in place instead of sending a new one (e.g. spaces/X/messages/Y, as returned by send_message or get_messages). Must be a message of space_id. Only the text is replaced, and only the… |
| message_text | string | yes | – |
| space_id | string | yes | – |
| thread_key | – | – | Reply in a thread by app-defined key (creates thread if not found). |
| thread_name | – | – | Reply in an existing thread by its resource name (e.g. spaces/X/threads/Y). |
| user_google_email | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
set_drive_file_permissions Set Drive File Permissions ~240
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.
| Name | Type | Req | Description |
|---|---|---|---|
| copy_requires_writer_permission | – | – | Whether viewers and commenters are prevented from copying, printing, or downloading. Defaults to None (no change). |
| file_id | string | yes | The ID of the file or folder. Required. |
| link_sharing | – | – | Control "anyone with the link" access for the file. - "off": Disable "anyone with the link" access for this file. - "reader": Anyone with the link can view. - "commenter": Anyone with the link can co… |
| user_google_email | string | yes | The user's Google email address. Required. |
| writers_can_share | – | – | Whether editors can change permissions and share. If False, only the owner can share. Defaults to None (no change). |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
set_publish_settings Set Publish Settings ~102
Updates the publish settings of a form.
| Name | Type | Req | Description |
|---|---|---|---|
| form_id | string | yes | The ID of the form to update publish settings for. |
| is_accepting_responses | boolean | – | Whether the form accepts responses. Only takes effect when the form is published. Defaults to True. |
| is_published | boolean | – | Whether the form is published and visible to responders. Defaults to True. |
| user_google_email | string | yes | The user's Google email address. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
start_google_auth Start Google Auth ~140
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: 1. You need to re-authenticate with different credentials 2. You want to proactively authenticate before using other tools 3. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| service_name | string | yes | – |
| user_google_email | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
update_doc_headers_footers Update Doc Headers Footers ~237
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: - If the header/footer does not exist, it is automatically created first. - If the header/footer already exists, its content is replaced. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | Text content for the header/footer |
| document_id | string | yes | ID of the document to update |
| header_footer_type | string | – | Type of header/footer ("DEFAULT", "FIRST_PAGE_ONLY", "EVEN_PAGE") |
| section_type | string | yes | Type of section to create or update ("header" or "footer") |
| user_google_email | string | yes | User's Google email address |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
update_drive_file Update Drive File ~713
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, preserving the existing file ID, sharing, comments, and links. For native Google Docs/Sheets/Slides 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.). For any other file (.md, .txt, .pdf, ...) there is nothing to convert, so the bytes are written back as-is under the file's own MIME type. Metadata and content can be updated in a single call. ``mode='append'``/``'prepend'`` splice ``content`` onto the file's existing text server-side, so only the new text has to be supplied — no need to send the whole file back to rewrite it. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| add_parents | – | – | Comma-separated folder IDs to add as parents. |
| content | – | – | New text content for text-based formats (markdown, TXT, HTML). |
| copy_requires_writer_permission | – | – | Whether copying requires writer permission. Pass the target ID directly; this cannot be changed on a shortcut resource. |
| description | – | – | New description for the file. |
| file_id | string | yes | The ID of the file to update. Required. |
| file_path | – | – | Local file path for binary formats (DOCX, ODT). Supports file:// URLs. |
| file_url | – | – | Remote http(s) URL to fetch new content from. |
| mime_type | – | – | New MIME type (note: changing type may require content upload). For a shortcut ID, this must accompany content and applies to the resolved target. |
| mode | string | – | How to apply the new content — 'replace' (default), 'append', or 'prepend'. Append/prepend require 'content' and a UTF-8 text file such as .md or .txt; a newline is inserted at the seam if neither si… |
| name | – | – | New name for the file. |
| properties | – | – | Custom key-value properties for the file. |
| remove_parents | – | – | Comma-separated folder IDs to remove from parents. |
| source_format | – | – | Source format hint for conversion (md, markdown, docx, txt, html, rtf, odt). Auto-detected when omitted, and ignored for non-Google files, which are uploaded without conversion. Provide at most one o… |
| starred | – | – | Whether to star/unstar the file. |
| trashed | – | – | Whether to move file to/from trash. |
| user_google_email | string | yes | The user's Google email address. Required. |
| writers_can_share | – | – | Whether editors can share the file. Pass the target ID directly; this cannot be changed on a shortcut resource. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
update_paragraph_style Update Paragraph Style ~825
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.
| Name | Type | Req | Description |
|---|---|---|---|
| alignment | string | – | Text alignment - 'START' (left), 'CENTER', 'END' (right), or 'JUSTIFIED' |
| avoid_widow_and_orphan | boolean | – | Avoid widows/orphans for the paragraph |
| border_color | string | – | Border color (#RRGGBB; defaults to black) |
| border_dash | string | – | Border dash style ('SOLID', 'DOT', or 'DASH'; defaults to 'SOLID') |
| border_edges | array | – | Paragraph border edges to update ('top', 'bottom', 'left', 'right', or 'between'); omit to update all four outer edges |
| border_padding | number | – | Border padding in points (defaults to 4) |
| border_width | number | – | Border width in points (defaults to 1) |
| bullet_preset | string | – | Optional explicit Google Docs bullet preset |
| direction | string | – | Paragraph direction - 'LEFT_TO_RIGHT' or 'RIGHT_TO_LEFT' |
| document_id | string | yes | Document ID to modify |
| end_index | integer | yes | End position (exclusive) - should cover the entire paragraph |
| heading_level | integer | – | Heading level 0-6 (0 = NORMAL_TEXT, 1 = H1, 2 = H2, etc.) Use for semantic document structure |
| indent_end | number | – | Right/end indent in points |
| indent_first_line | number | – | First line indent in points (e.g., 36 for 0.5 inch) |
| indent_start | number | – | Left/start indent in points |
| keep_lines_together | boolean | – | Keep all lines of the paragraph together |
| keep_with_next | boolean | – | Keep the paragraph with the next paragraph |
| line_spacing | number | – | Line spacing multiplier (1.0 = single, 1.5 = 1.5x, 2.0 = double) |
| list_nesting_level | integer | – | Nesting level for lists (0-8, where 0 is top level, default is 0) Use higher levels for nested/indented list items |
| list_type | string | – | Create a list from existing paragraphs ('UNORDERED' for bullets, 'ORDERED' for numbers, 'CHECKBOX' for checklists), or 'NONE' to remove existing list formatting from the range. Use 'NONE' when text i… |
| named_style_type | string | – | Direct named style type - 'NORMAL_TEXT', 'TITLE', 'SUBTITLE', 'HEADING_1' through 'HEADING_6'. Mutually exclusive with heading_level. |
| page_break_before | boolean | – | Start the paragraph on a new page |
| segment_id | string | – | Optional header/footer/footnote segment ID to target |
| shading_color | string | – | Paragraph shading/background color (#RRGGBB) |
| space_above | number | – | Space above paragraph in points (e.g., 12 for one line) |
| space_below | number | – | Space below paragraph in points |
| spacing_mode | string | – | 'NEVER_COLLAPSE' or 'COLLAPSE_LISTS' |
| start_index | integer | yes | Start position using Docs API indices from inspect_doc_structure. For the main body, 0 is also accepted as an alias for the first writable position. |
| tab_id | string | – | Optional document tab ID to target |
| user_google_email | string | yes | User's Google email address |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
update_script_content Update Script Content ~142
Update 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.
| Name | Type | Req | Description |
|---|---|---|---|
| files | array | yes | File objects with name, type, and source to create or update |
| merge | boolean | – | When True (default), overlay these files onto the current project. When False, replace the full project file set; omitted files are deleted. |
| script_id | string | yes | The script project ID |
| user_google_email | string | yes | User's email address |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
What is the io.github.taylorwilsdon/workspace-mcp server?
io.github.taylorwilsdon/workspace-mcp is listed in the public MCP registry as io.github.taylorwilsdon/workspace-mcp. Google Workspace MCP server for Gmail, Drive, Calendar, Docs, Sheets, Slides, Forms, Tasks, Chat. This page covers its PyPI package (workspace-mcp).
Is the io.github.taylorwilsdon/workspace-mcp server safe to use?
io.github.taylorwilsdon/workspace-mcp scores 58 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.taylorwilsdon/workspace-mcp server expose?
io.github.taylorwilsdon/workspace-mcp exposes 123 tools: start_google_auth, search_gmail_messages, get_gmail_message_content, get_gmail_messages_content_batch, get_gmail_attachment_content, and 118 more. Their descriptions and schemas cost roughly 26,154 tokens of context every time the server is loaded.
Is the io.github.taylorwilsdon/workspace-mcp server still maintained?
io.github.taylorwilsdon/workspace-mcp is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.