Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

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

−1 this week 58 Trust /100
Trust breakdown (7 categories)

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
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
Install

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

# add to Claude Code
claude mcp add taylorwilsdon-workspace-mcp -- uvx workspace-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "taylorwilsdon-workspace-mcp": {
      "command": "uvx",
      "args": [
        "workspace-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "taylorwilsdon-workspace-mcp": {
      "command": "uvx",
      "args": [
        "workspace-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add taylorwilsdon-workspace-mcp -- uvx workspace-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "taylorwilsdon-workspace-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "workspace-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add taylorwilsdon-workspace-mcp --command uvx --arg workspace-mcp
# ~/.hermes/config.yaml
mcp_servers:
  taylorwilsdon-workspace-mcp:
    command: "uvx"
    args: ["workspace-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "taylorwilsdon-workspace-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "workspace-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add taylorwilsdon-workspace-mcp -t stdio -c uvx -a workspace-mcp
// mcp.json
{
  "mcpServers": {
    "taylorwilsdon-workspace-mcp": {
      "command": "uvx",
      "args": [
        "workspace-mcp"
      ]
    }
  }
}
Changelog

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
Diagnostics

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 →

MCP tools · 123 exposed · ~26,154 tokens

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 →

Tool Tokens
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.

NameTypeReqDescription
actionstringyesOne of "rename", "delete", "hide", "unhide", "reorder"
new_indexNew zero-based position, required for action="reorder"
new_nameNew title, required for action="rename"
sheet_namestringyesTitle of the existing tab to act on
spreadsheet_idstringyesID of the spreadsheet
user_google_emailstringyesUser's Google email address
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
actionstringyes
comment_content
comment_id
spreadsheet_idstringyes
user_google_emailstringyes
NameTypeReqDescription
resultstringyes

No examples provided.

manage_task ~287

Manage tasks: create, update, delete, or move tasks within task lists.

NameTypeReqDescription
actionstringyesThe action to perform. Must be one of: "create", "update", "delete", "move".
destination_task_listDestination task list ID (for moving between lists). Used by "move" action.
dueDue date in RFC 3339 format (e.g., "2024-12-31T23:59:59Z"). Used by "create" and "update" actions.
notesNotes/description for the task. Used by "create" and "update" actions.
parentParent task ID (for subtasks). Used by "create" and "move" actions.
previousPrevious sibling task ID (for positioning). Used by "create" and "move" actions.
statusTask status ("needsAction" or "completed"). Used by "update" action.
task_idThe ID of the task. Required for "update", "delete", and "move" actions.
task_list_idstringyesThe ID of the task list. Required for all actions.
titleThe title of the task. Required for "create", optional for "update".
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes

No examples provided.

manage_task_list ~119

Manage task lists: create, update, delete, or clear completed tasks.

NameTypeReqDescription
actionstringyesThe action to perform. Must be one of: "create", "update", "delete", "clear_completed".
task_list_idThe ID of the task list. Required for "update", "delete", and "clear_completed" actions.
titleThe title for the task list. Required for "create" and "update" actions.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes

No examples provided.

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".

NameTypeReqDescription
background_colorstringBackground/highlight color (#RRGGBB)
baseline_offsetstringOne of NONE, SUPERSCRIPT, SUBSCRIPT
boldbooleanWhether to make text bold (True/False/None to leave unchanged)
clear_linkbooleanRemove hyperlink from the target range
document_idstringyesID of the document to update
end_indexintegerEnd position for text replacement/formatting (if not provided with text, text is inserted)
end_of_segmentbooleanInsert text at the end of the targeted segment instead of start_index
font_familystringFont family name (e.g., "Arial", "Times New Roman")
font_sizenumberFont size in points
font_weightintegerFont weight (100-900 in steps of 100; requires font_family)
italicbooleanWhether to make text italic (True/False/None to leave unchanged)
link_urlstringHyperlink URL (http/https)
segment_idstringOptional header/footer/footnote segment ID to target
small_capsbooleanWhether to apply small caps
start_indexintegeryesStart 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.
strikethroughbooleanWhether to strike through text (True/False/None to leave unchanged)
tab_idstringOptional document tab ID to target
textstringNew text to insert or replace with (optional - can format existing text without changing it)
text_colorstringForeground text color (#RRGGBB)
underlinebooleanWhether to underline text (True/False/None to leave unchanged)
user_google_emailstringyesUser's Google email address
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
add_label_idsarrayList of label IDs to add to the message.
message_idstringyesThe ID of the message to modify.
remove_label_idsarrayList of label IDs to remove from the message.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes

No examples provided.

modify_sheet_values ~173

Modifies values in a specific range of a Google Sheet - can write, update, or clear values.

NameTypeReqDescription
clear_valuesbooleanIf True, clears the range instead of writing values. Defaults to False.
range_namestringyesThe range to modify (e.g., "Sheet1!A1:D10", "A1:D10"). Required.
spreadsheet_idstringyesThe ID of the spreadsheet. Required.
user_google_emailstringyesThe user's Google email address. Required.
value_input_optionstringHow to interpret input values ("RAW" or "USER_ENTERED"). Defaults to "USER_ENTERED".
values2D array of values to write/update. Can be a JSON string or Python list. Required unless clear_values=True.
NameTypeReqDescription
resultstringyes

No examples provided.

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).

NameTypeReqDescription
destination_sheetstringyesName of the sheet to move rows to. Required.
end_rowintegeryesLast row to move (1-based, inclusive). Required.
source_sheetstringyesName of the sheet to move rows from. Required.
spreadsheet_idstringyesThe ID of the spreadsheet. Required.
start_rowintegeryesFirst row to move (1-based, inclusive). Required.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes

No examples provided.

query_freebusy ~245

Returns free/busy information for a set of calendars.

NameTypeReqDescription
calendar_expansion_maxMaximum number of calendars for which FreeBusy information is to be provided. Optional. Maximum value is 50.
calendar_idsList 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_maxMaximum 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_maxstringyesThe end of the interval for the query in RFC3339 format (e.g., '2024-05-12T18:00:00Z' or '2024-05-12').
time_minstringyesThe start of the interval for the query in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12').
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes

No examples provided.

read_sheet_values ~224

Reads values from a specific range in a Google Sheet.

NameTypeReqDescription
include_formulasbooleanIf 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_hyperlinksbooleanIf True, also fetch hyperlink metadata for the range. Defaults to False to avoid expensive includeGridData requests.
include_notesbooleanIf True, also fetch cell notes for the range. Defaults to False to avoid expensive includeGridData requests.
range_namestringThe 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_idstringyesThe ID of the spreadsheet. Required.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
auto_resize_columnsList of column letters to auto-resize to fit content. Example: ["A", "B"].
auto_resize_rowsList of 1-based row numbers to auto-resize to fit content. Example: [1, 2].
column_sizesDict mapping column letters to pixel widths. Example: {"A": 200, "C": 300}. Can be a JSON string or Python dict.
delete_columnsList of column letters to delete. Example: ["E", "F"].
delete_row_rangeContiguous 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_rowsList of 1-based row numbers to delete. Example: [5, 6]. Best for non-contiguous rows.
frozen_column_countNumber of columns to freeze from the left. Use 0 to unfreeze all columns.
frozen_row_countNumber of rows to freeze from the top. Use 0 to unfreeze all rows.
hide_columnsList of column letters to hide. Example: ["C", "D"].
hide_rowsList of 1-based row numbers to hide. Example: [3, 4].
insert_columnsNumber of columns to insert.
insert_columns_atColumn letter to insert before (e.g. "C"). Appends to the end if omitted.
insert_rowsNumber of rows to insert.
insert_rows_at1-based row number to insert before. Appends to the end of the sheet if omitted.
row_sizesDict mapping 1-based row numbers to pixel heights. Example: {"1": 40, "3": 60}. Can be a JSON string or Python dict.
sheet_nameSheet name to target. Defaults to the first sheet if not provided.
spreadsheet_idstringyesThe ID of the spreadsheet. Required.
unhide_columnsList of column letters to unhide. Example: ["C", "D"].
unhide_rowsList of 1-based row numbers to unhide. Example: [3, 4].
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes

No examples provided.

run_script_function ~123

Executes a function in a deployed script.

NameTypeReqDescription
deployment_idOptional 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_modebooleanWhether to run latest code vs deployed version
function_namestringyesName of function to execute
parametersOptional list of parameters to pass
script_idstringyesThe script project ID
user_google_emailstringyesUser's email address
NameTypeReqDescription
resultstringyes

No examples provided.

search_contacts ~81

Search contacts by name, email, phone number, or other fields.

NameTypeReqDescription
page_sizeintegerMaximum number of results to return (default: 30, max: 30).
querystringyesSearch query string (searches names, emails, phone numbers).
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes

No examples provided.

search_custom ~275

Performs a search using Google Custom Search JSON API.

NameTypeReqDescription
countryCountry code for results (e.g., "countryUS").
date_restrictRestrict results by date (e.g., "d5" for past 5 days, "m3" for past 3 months).
file_typeFilter by file type (e.g., "pdf", "doc").
languageLanguage code for results (e.g., "lang_en").
numintegerNumber of results to return (1-10). Defaults to 10.
qstringyesThe search query. Required.
safestringSafe search level. Defaults to "off".
search_typeSearch for images if set to "image".
site_searchRestrict search to a specific site/domain.
site_search_filterExclude ("e") or include ("i") site_search results.
sitesList of sites/domains to restrict search to (e.g., ["example.com", "docs.example.com"]). When provided, results are limited to these sites.
startintegerThe index of the first result to return (1-based). Defaults to 1.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
page_sizeinteger
querystringyes
user_google_emailstringyes
NameTypeReqDescription
resultstringyes

No examples provided.

search_drive_files ~592

Searches for files and folders within a user's Google Drive, including shared drives.

NameTypeReqDescription
corporaBodies of items to query (e.g., 'user', 'domain', 'drive', 'allDrives'). If 'drive_id' is specified and 'corpora' is None, it defaults to 'drive'. Otherwise,…
detailedbooleanWhether to include size, modified time, and link in results. Defaults to True.
drive_idID of the shared drive to search. If None, behavior depends on `corpora` and `include_items_from_all_drives`.
file_typeRestrict results to a specific file type. Accepts a friendly name ('folder', 'document'/'doc', 'spreadsheet'/'sheet', 'presentation'/'slides', 'form', 'd…
include_items_from_all_drivesbooleanWhether shared drive items should be included in results. Defaults to True. This is effective when not specifying a `drive_id`.
include_trashedbooleanWhether 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_bySort order. Comma-separated list of sort keys with optional 'desc' modifier. Valid keys: 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name…
page_sizeintegerThe maximum number of files to return. Defaults to 10.
page_tokenPage token from a previous response's nextPageToken to retrieve the next page of results.
querystringyesThe 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_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
include_headersbooleanIf 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_sizeintegerThe maximum number of messages to return. Defaults to 10.
page_tokenToken for retrieving the next page of results. Use the next_page_token from a previous response.
querystringyesThe search query. Supports standard Gmail search operators.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes

No examples provided.

search_messages ~191

Searches for messages in Google Chat spaces by text content and/or time range.

NameTypeReqDescription
max_spacesintegerMaximum number of spaces to search when space_id is not provided (default 10).
page_sizeintegerMaximum number of messages to return per space.
queryOptional text to search for. If omitted, only time_filter is applied.
space_idOptional space to restrict the search to.
time_filterOptional 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_emailstringyes
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
attachmentsOptional 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…
bccOptional BCC email address.
bodyEmail body content (plain text or HTML). Required when sending. When forwarding, this is an optional note prepended above the quoted original.
body_formatstringFormat of the body content (and of the prepended note when forwarding). Use 'plain' for plaintext or 'html' for HTML content.
ccOptional CC email address.
forward_message_idSet 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_emailOptional '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_nameOptional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'.
in_reply_toOptional 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_attachmentsbooleanWhen forwarding, whether to include the original message's attachments. Ignored unless forward_message_id is set.
include_signaturebooleanWhether to append the Gmail signature from Settings > Signature when available. Defaults to true.
quote_originalbooleanWhether to include the message being replied to as a quoted original. Only has an effect when thread_id is provided. Defaults to false.
referencesOptional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target.
reply_allbooleanWhether 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…
subjectEmail subject. Required when sending; optional when forwarding (defaults to 'Fwd: <original subject>').
thread_idOptional 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.
toRecipient email address. Optional when replying with reply_all=True, which derives it from the thread.
user_google_emailstringyesThe user's Google email address. Required for authentication.
NameTypeReqDescription
resultstringyes

No examples provided.

send_message ~153

Sends a message to a Google Chat space, or edits a message already sent there.

NameTypeReqDescription
message_nameEdit 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_textstringyes
space_idstringyes
thread_keyReply in a thread by app-defined key (creates thread if not found).
thread_nameReply in an existing thread by its resource name (e.g. spaces/X/threads/Y).
user_google_emailstringyes
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
copy_requires_writer_permissionWhether viewers and commenters are prevented from copying, printing, or downloading. Defaults to None (no change).
file_idstringyesThe ID of the file or folder. Required.
link_sharingControl "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_emailstringyesThe user's Google email address. Required.
writers_can_shareWhether editors can change permissions and share. If False, only the owner can share. Defaults to None (no change).
NameTypeReqDescription
resultstringyes

No examples provided.

set_publish_settings ~102

Updates the publish settings of a form.

NameTypeReqDescription
form_idstringyesThe ID of the form to update publish settings for.
is_accepting_responsesbooleanWhether the form accepts responses. Only takes effect when the form is published. Defaults to True.
is_publishedbooleanWhether the form is published and visible to responders. Defaults to True.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
service_namestringyes
user_google_emailstring
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
contentstringyesText content for the header/footer
document_idstringyesID of the document to update
header_footer_typestringType of header/footer ("DEFAULT", "FIRST_PAGE_ONLY", "EVEN_PAGE")
section_typestringyesType of section to create or update ("header" or "footer")
user_google_emailstringyesUser's Google email address
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
add_parentsComma-separated folder IDs to add as parents.
contentNew text content for text-based formats (markdown, TXT, HTML).
copy_requires_writer_permissionWhether copying requires writer permission. Pass the target ID directly; this cannot be changed on a shortcut resource.
descriptionNew description for the file.
file_idstringyesThe ID of the file to update. Required.
file_pathLocal file path for binary formats (DOCX, ODT). Supports file:// URLs.
file_urlRemote http(s) URL to fetch new content from.
mime_typeNew MIME type (note: changing type may require content upload). For a shortcut ID, this must accompany content and applies to the resolved target.
modestringHow 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…
nameNew name for the file.
propertiesCustom key-value properties for the file.
remove_parentsComma-separated folder IDs to remove from parents.
source_formatSource 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…
starredWhether to star/unstar the file.
trashedWhether to move file to/from trash.
user_google_emailstringyesThe user's Google email address. Required.
writers_can_shareWhether editors can share the file. Pass the target ID directly; this cannot be changed on a shortcut resource.
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
alignmentstringText alignment - 'START' (left), 'CENTER', 'END' (right), or 'JUSTIFIED'
avoid_widow_and_orphanbooleanAvoid widows/orphans for the paragraph
border_colorstringBorder color (#RRGGBB; defaults to black)
border_dashstringBorder dash style ('SOLID', 'DOT', or 'DASH'; defaults to 'SOLID')
border_edgesarrayParagraph border edges to update ('top', 'bottom', 'left', 'right', or 'between'); omit to update all four outer edges
border_paddingnumberBorder padding in points (defaults to 4)
border_widthnumberBorder width in points (defaults to 1)
bullet_presetstringOptional explicit Google Docs bullet preset
directionstringParagraph direction - 'LEFT_TO_RIGHT' or 'RIGHT_TO_LEFT'
document_idstringyesDocument ID to modify
end_indexintegeryesEnd position (exclusive) - should cover the entire paragraph
heading_levelintegerHeading level 0-6 (0 = NORMAL_TEXT, 1 = H1, 2 = H2, etc.) Use for semantic document structure
indent_endnumberRight/end indent in points
indent_first_linenumberFirst line indent in points (e.g., 36 for 0.5 inch)
indent_startnumberLeft/start indent in points
keep_lines_togetherbooleanKeep all lines of the paragraph together
keep_with_nextbooleanKeep the paragraph with the next paragraph
line_spacingnumberLine spacing multiplier (1.0 = single, 1.5 = 1.5x, 2.0 = double)
list_nesting_levelintegerNesting level for lists (0-8, where 0 is top level, default is 0) Use higher levels for nested/indented list items
list_typestringCreate 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_typestringDirect named style type - 'NORMAL_TEXT', 'TITLE', 'SUBTITLE', 'HEADING_1' through 'HEADING_6'. Mutually exclusive with heading_level.
page_break_beforebooleanStart the paragraph on a new page
segment_idstringOptional header/footer/footnote segment ID to target
shading_colorstringParagraph shading/background color (#RRGGBB)
space_abovenumberSpace above paragraph in points (e.g., 12 for one line)
space_belownumberSpace below paragraph in points
spacing_modestring'NEVER_COLLAPSE' or 'COLLAPSE_LISTS'
start_indexintegeryesStart 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_idstringOptional document tab ID to target
user_google_emailstringyesUser's Google email address
NameTypeReqDescription
resultstringyes

No examples provided.

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.

NameTypeReqDescription
filesarrayyesFile objects with name, type, and source to create or update
mergebooleanWhen True (default), overlay these files onto the current project. When False, replace the full project file set; omitted files are deleted.
script_idstringyesThe script project ID
user_google_emailstringyesUser's email address
NameTypeReqDescription
resultstringyes

No examples provided.

Common questions

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.