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

Google Workspace MCP server for Gmail, Drive, Calendar, Docs, Sheets, Slides, Forms, Tasks, Chat.

Available components

+15 this week 77 Trust /100

Last scanned (21 hours ago)

Scores higher than 74% of PyPI servers

Category Productivity and Notes

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 Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs setuptools.build_meta at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • 4 of 57 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency23
Schema Quality & AI Usability59
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 30634 tokens (~257/item across 119 items; 119 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 Management98
  • Stability check failed: the tool surface changed between 1.30.1 and 2.3.0: 2 tool removals, 0 breaking changes, 1 additions. See how to fix → Fail
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 5 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 119 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
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.

  • 3 Nov 26 +15
    • Malware scan: unverified → pass ▲ security
  • 2 Nov 26 −15
    • Malware scan: pass → unverified ▼ security
  • 1 Nov 26 +15
    • Malware scan: unverified → pass ▲ security
  • 30 Oct 26 0
    • Malware scan: unverified → pass ▲ security
    • Package version: 2.2.1 → 2.3.0 functional
  • 29 Oct 26 0
    • Package version: 2.0.1 → 2.2.1 functional
  • 28 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 89 to 98.

  • 26 Oct 26 0
    • Package version: 2.2.0 → 2.2.1 functional
  • 23 Oct 26 0
    • Package version: 2.1.2 → 2.2.0 functional
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 4 Nov 2026 · Analysed pypi/workspace-mcp@2.3.0

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem pypi
Reason No attestation published

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 57 packages
Packages resolved 57
Stale 3
No linked repository 1
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 119 exposed · ~30,634 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
append_table_rows ~138

Appends rows to a structured table in a Google Sheet. The rows are added to the end of the table body, automatically extending the table range. Use list_sheet_tables first to find the table ID.

NameTypeReqDescription
spreadsheet_idstringyesThe ID of the spreadsheet. Required.
table_idstringyesThe ID of the table to append to (get from list_sheet_tables). Required.
user_google_emailstringyesThe user's Google email address. Required.
values–yes2D array of values to append. Each inner list is one row. Can be a JSON string or Python list. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

batch_modify_gmail_message_labels ~306

Adds or removes labels on many Gmail messages, or on every message of whole conversations via thread_ids. message_ids are sent in one users.messages.batchModify call (Gmail accepts up to 1000 ids per call). That endpoint returns no per-message result and silently ignores ids it does not recognise, so by default the messages are read back afterwards to report which ids actually changed. thread_ids are modified one at a time with users.threads.modify, e.g. archive a conversation with remove_label_ids=["INBOX"] or mark it read with remove_label_ids=["UNREAD"]. Each thread reports its own outcome. message_ids and thread_ids can be combined; at least one is required, as is at least one of add_label_ids or remove_label_ids.

NameTypeReqDescription
add_label_idsarray–Label IDs to add.
message_idsarray–Message IDs to modify.
remove_label_idsarray–Label IDs to remove.
thread_idsarray–Thread (conversation) IDs to modify.
user_google_emailstringyesThe user's Google email address. Required.
verifyboolean–Read message_ids back and report per-id outcomes, at the cost of one extra read per id (batched 25 at a time). Set False for very large sweeps where an unverified result is acceptable. Has no effect…
NameTypeReqDescription
resultstringyes–

No examples provided.

batch_update_doc ~384

Executes multiple low-level document operations in a single atomic batch update. For normal header/footer text, prefer update_doc_headers_footers. Only use create_header_footer here for advanced section-break layouts. RECOMMENDED WORKFLOW FOR BUILDING DOCUMENTS: ============================================= To avoid index calculation errors, build documents in phases: PHASE 1 - INSERT ALL CONTENT (use end_of_segment=true, no index math): Append text, section breaks, and page breaks sequentially. Each operation appends to the end of the body. No index needed. Example batch: [ {"type": "insert_text", "end_of_segment": true, "text": "Report Title\n"}, {"type": "insert_text", "end_of_segment": true, "text": "\nExecutive Summary\n"}, {"type": "insert_text", "end_of_segment": true, "text": "Revenue grew 15%.\n"}, {"type": "insert_section_break", "end_of_segment": true, "section_type": "NEXT_PAGE"}, {"type": "insert_text", "end_of_segment": true, "text": "Detailed Analysis\n"} ] PHASE 2 - CREATE HEADERS/FOOTERS (if needed): For normal header/footer text, use update_doc_headers_footers (it auto-creates if missing and writes the content for you). Only include create_header_footer operations in a batch when you are intentionally managing advanced section-break-specific layouts.

NameTypeReqDescription
document_idstringyesID of the document to update
operationsarrayyesList of operation dicts. Each operation MUST have a 'type' field. All operations accept an optional 'tab_id' to target a specific tab.
user_google_emailstringyesUser's Google email address
NameTypeReqDescription
resultstringyes–

No examples provided.

batch_update_form ~161

Apply batch updates to a Google Form. Supports adding, updating, and deleting form items, as well as updating form metadata and settings. This is the primary method for modifying form content after creation.

NameTypeReqDescription
form_idstringyesThe ID of the form to update.
requestsarrayyesList of update requests to apply. Supported request types: - createItem: Add a new question or content item - updateItem: Modify an existing item - deleteItem: Remove an item - moveItem: Reorder an i…
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

batch_update_presentation ~63

Apply batch updates to a Google Slides presentation.

NameTypeReqDescription
presentation_idstringyesThe ID of the presentation to update.
requestsarrayyesList of update requests to apply.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

check_drive_file_public_access ~132

Searches for a file by name and checks if it has public link sharing enabled.

NameTypeReqDescription
drive_idstring–ID of the shared drive to scope the search to. When set, the underlying files.list call uses corpora='drive' and the given driveId, which is required to re…
file_namestringyesThe name of the file to check.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

copy_drive_file ~160

Creates a copy of an existing Google Drive file. This tool copies the template document to a new location with an optional new name. The copy maintains all formatting and content from the original file.

NameTypeReqDescription
copy_commentsboolean–Copy open comments and suggestions (Docs/Sheets/Slides only). Defaults to False.
file_idstringyesThe ID of the file to copy. Required.
new_namestring–New name for the copied file. If not provided, uses "Copy of [original name]".
parent_folder_idstring–The ID of the folder where the copy should be created. Defaults to 'root' (My Drive).
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

create_calendar ~80

Creates a new secondary Google Calendar.

NameTypeReqDescription
descriptionstring–An optional description for the calendar.
summarystringyesThe title/name of the new calendar.
timezonestring–IANA timezone for the calendar (e.g. 'America/New_York').
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

create_doc ~212

Creates a new Google Doc and optionally inserts initial content. `content` is inserted as plain text (Markdown is not rendered); use import_to_google_doc to create a doc from Markdown. After creation, the document body starts at index 1. A new empty doc has total length 2 (one section break at index 0, one newline at index 1). To build a rich document after creation, use batch_update_doc with insert_text operations using end_of_segment=true to append content sequentially without calculating indices. Then call inspect_doc_structure to get exact positions before applying formatting in a separate batch call.

NameTypeReqDescription
contentstring–Optional initial plain text content to insert
folder_idstring–The ID of the parent folder. Defaults to 'root'. For shared drives, this must be a folder ID within the shared drive.
titlestringyesTitle of the new document
user_google_emailstringyesUser's Google email address
NameTypeReqDescription
resultstringyes–

No examples provided.

create_drive_file ~327

Creates a new file in Google Drive, supporting creation within shared drives. Accepts direct text content, inline base64 bytes, or a fileUrl to fetch content from. Where local file access is disabled it can instead return an upload URL for the caller to PUT file bytes to. This stores the supplied bytes without converting them to Google Docs, Sheets, or Slides. Use the matching import_to_google_* tool for Google-native conversion.

NameTypeReqDescription
base64_contentstring–Standard base64-encoded file bytes.
base64_sha256string–Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks.
contentstring–If provided, the content to write to the file.
content_mime_typestring–MIME type for base64_content uploads.
fileUrlstring–If provided, fetches the file content from this URL. Supports http:// and https://; file:// only where local file access is enabled. Where it is disabled, files on the caller's machine go through an…
file_namestringyesThe name for the new file.
folder_idstring–The ID of the parent folder. Defaults to 'root'. For shared drives, this must be a folder ID within the shared drive.
mime_typestring–The MIME type of the file. Defaults to 'text/plain'; required with return_upload_url.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

create_drive_folder ~86

Creates a new folder in Google Drive, supporting creation within shared drives.

NameTypeReqDescription
folder_namestringyesThe name for the new folder.
parent_folder_idstring–The ID of the parent folder. Defaults to 'root'. For shared drives, use a folder ID within that shared drive.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

create_form ~81

Create a new form using the title given in the provided form message in the request.

NameTypeReqDescription
descriptionstring–The description of the form.
document_titlestring–The document title (shown in browser tab).
titlestringyesThe title of the form.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

create_presentation ~52

Create a new Google Slides presentation.

NameTypeReqDescription
titlestring–The title for the new presentation. Defaults to "Untitled Presentation".
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

create_reaction ~67

Adds an emoji reaction to a Google Chat message.

NameTypeReqDescription
emoji_unicodestringyesThe emoji character to react with (e.g. 👍).
message_idstringyesThe message resource name (e.g. spaces/X/messages/Y).
user_google_emailstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

create_sheet ~101

Creates a new sheet or duplicates an existing sheet (user_google_email: str, spreadsheet_id: str, sheet_name: Optional[str] = None, source_sheet_name: Optional[str] = None, insert_sheet_index: Optional[int] = None).

NameTypeReqDescription
insert_sheet_indexinteger––
sheet_namestring––
source_sheet_namestring––
spreadsheet_idstringyes–
user_google_emailstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

create_spreadsheet ~108

Creates a new Google Spreadsheet.

NameTypeReqDescription
folder_idstring–The ID of the parent folder. Defaults to 'root'. For shared drives, this must be a folder ID within the shared drive.
sheet_namesarray–List of sheet names to create. If not provided, creates one sheet with default name.
titlestringyesThe title of the new spreadsheet. Required.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

create_table_with_data ~487

Creates a table and populates it with data in one reliable operation. CRITICAL: YOU MUST CALL inspect_doc_structure FIRST TO GET THE INDEX! MANDATORY WORKFLOW - DO THESE STEPS IN ORDER: Step 1: ALWAYS call inspect_doc_structure first Step 2: Use the 'total_length' value from inspect_doc_structure as your index Step 3: Format data as 2D list: [["col1", "col2"], ["row1col1", "row1col2"]] Step 4: Call this function with the correct index and data EXAMPLE DATA FORMAT: table_data = [ ["Header1", "Header2", "Header3"], # Row 0 - headers ["Data1", "Data2", "Data3"], # Row 1 - first data row ["Data4", "Data5", "Data6"] # Row 2 - second data row ] CRITICAL INDEX REQUIREMENTS: - NEVER use index values like 1, 2, 10 without calling inspect_doc_structure first - ALWAYS get index from inspect_doc_structure 'total_length' field - Index must be a valid insertion point in the document DATA FORMAT REQUIREMENTS: - Must be 2D list of strings only - Each inner list = one table row - All rows MUST have same number of columns - Use empty strings "" for empty cells, never None - Use debug_table_structure after creation to verify results

NameTypeReqDescription
bold_headersboolean–Whether to make first row bold (default: true)
document_idstringyesID of the document to update
header_rowsinteger–Number of leading rows to mark as a repeating header that reappears after each page break. Must be between 0 and the number of table rows (default: 0 = none)
indexintegeryesDocument position (MANDATORY: get from inspect_doc_structure 'total_length')
tab_idstring–Optional tab ID to create the table in a specific tab
table_dataarrayyes2D list of strings - EXACT format: [["col1", "col2"], ["row1col1", "row1col2"]]
user_google_emailstringyesUser's Google email address
NameTypeReqDescription
resultstringyes–

No examples provided.

debug_table_structure ~343

ESSENTIAL DEBUGGING TOOL - Use this whenever tables don't work as expected. USE THIS IMMEDIATELY WHEN: - Table population put data in wrong cells - You get "table not found" errors - Data appears concatenated in first cell - Need to understand existing table structure - Planning to fill existing cells with modify_doc_text at their insertion_index WHAT THIS SHOWS YOU: - Exact table dimensions (rows × columns) - Each cell's position coordinates (row,col) - Current content in each cell - Insertion indices for each cell - Table boundaries and ranges HOW TO READ THE OUTPUT: - "dimensions": "2x3" = 2 rows, 3 columns - "position": "(0,0)" = first row, first column - "current_content": What's actually in each cell right now - "insertion_index": Where new text would be inserted in that cell WORKFLOW INTEGRATION: 1. After creating table → Use this to verify structure 2. Before populating → Use this to plan your data format 3. After population fails → Use this to see what went wrong 4. When debugging → Compare your data array to actual table structure

NameTypeReqDescription
document_idstringyesID of the document to inspect
tab_idstring–Optional ID of the tab containing the table (from inspect_doc_structure). If not provided, inspects the first tab.
table_indexinteger–Which table to debug (0 = first table, 1 = second table, etc.)
user_google_emailstringyesUser's Google email address
NameTypeReqDescription
resultstringyes–

No examples provided.

download_chat_attachment ~103

Downloads an attachment from a Google Chat message and saves it to local disk. In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour).

NameTypeReqDescription
attachment_indexinteger–Zero-based index of the attachment to download (default 0).
message_idstringyesThe message resource name (e.g. spaces/X/messages/Y).
user_google_emailstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

draft_gmail_message ~1,076

Creates a draft email in the user's Gmail account. Supports new, reply, and forward drafts with optional attachments. Supports Gmail's "Send As" feature to draft from configured alias addresses. To save a forward as a draft for review, pass forward_message_id. The original subject, body (quoted with a "Forwarded message" header), and attachments are carried over. In forward mode, body (if any) is prepended as a note, subject is optional, and threading, reply, and signature options do not apply. SCHEDULED SEND IS NOT AVAILABLE. Gmail's REST API exposes no send-time parameter; the Schedule send feature is web-UI only, and a message cannot be placed in the Scheduled folder through the API. Do not claim a message was scheduled. To deliver at a chosen time, create a draft with draft_gmail_message. An external scheduler must retain the message data to create and send a new message via send_gmail_message then, or call users.drafts.send with the draft ID returned by draft_gmail_message. Alternatively, let the user schedule the draft in the Gmail UI.

NameTypeReqDescription
attachmentsarray–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…
bccstring–Optional BCC email address.
bodystring–Email body. Required unless forwarding, where it becomes an optional note prepended above the quoted original.
body_formatstring–Email body format. Use 'plain' for plaintext or 'html' for HTML content. With 'html', write real markup; an entity-escaped body ('<div>') is rejected.
ccstring–Optional CC email address.
directionstring–Base text direction of the body. 'auto' (default) takes it from the first strong character (a right-to-left script gives 'rtl', anything else 'ltr'); 'ltr'/'rtl' force it. On a forward it orients the…
forward_message_idstring–Set to a Gmail message ID to save a forward of that message as a draft for review. The original subject, body, and (optionally) attachments are carried over; 'body' becomes an optional note prepended…
from_emailstring–Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the account's default Send As address, falling back to the aut…
from_namestring–Optional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'.
in_reply_tostring–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_attachmentsboolean–When forwarding, whether to include the original message's attachments. Ignored unless forward_message_id is set.
include_signatureboolean–Whether to append the Gmail signature from Settings > Signature when available. Defaults to true.
quote_originalboolean–Whether to include the original message as a quoted reply. Only has an effect when thread_id is provided. Defaults to false.
referencesstring–Optional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target.
reply_allboolean–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…
subjectstring–Email subject. Required for a new draft. Optional when replying with thread_id (inherits the parent message's subject, adding 'Re:' only if absent) or when forwarding (then defaults to 'Fwd: <origina…
thread_idstring–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.
tostring–Optional recipient email address.
user_google_emailstringyesThe user's Google email address. Required for authentication.
NameTypeReqDescription
resultstringyes–

No examples provided.

export_doc_to_pdf ~105

Exports a Google Doc to PDF format and saves it to Google Drive.

NameTypeReqDescription
document_idstringyesID of the Google Doc to export
folder_idstring–Drive folder ID to save PDF in (optional - if not provided, saves in root)
pdf_filenamestring–Name for the PDF file (optional - if not provided, uses original name + "_PDF")
user_google_emailstringyesUser's Google email address
NameTypeReqDescription
resultstringyes–

No examples provided.

find_and_replace_doc ~198

Finds and replaces text throughout a Google Doc. No index calculation required. This is the safest way to update specific text in a document because it does not require knowing any indices. Use this tool when you need to: - Replace placeholder text (e.g., {{TITLE}}) with real content - Update specific words or phrases throughout the document - Make targeted text changes without risk of index errors For building documents from scratch, consider inserting text with unique placeholders via batch_update_doc, then using this tool to replace them.

NameTypeReqDescription
document_idstringyesID of the document to update
find_textstringyesText to search for
match_caseboolean–Whether to match case exactly
replace_textstringyesText to replace with
tab_idstring–Optional ID of the tab to target
user_google_emailstringyesUser's Google email address
NameTypeReqDescription
resultstringyes–

No examples provided.

format_sheet_range ~582

Applies formatting to a range: colors, number formats, text wrapping, alignment, text styling, cell merging/unmerging, borders, and dropdown lists. Colors accept hex strings (#RRGGBB). Number formats follow Sheets types (e.g., NUMBER, CURRENCY, DATE, PERCENT). If no sheet name is provided, the first sheet is used.

NameTypeReqDescription
background_colorstring–Hex background color (e.g., "#FFEECC").
boldboolean–Whether to apply bold formatting.
border_colorstring–Hex border color (default black). Requires borders.
border_stylestring–SOLID (default), SOLID_MEDIUM, SOLID_THICK, DASHED, DOTTED, or DOUBLE. Requires borders.
bordersstring–Which borders to draw, comma-separated: all, outer, inner, top, bottom, left, right, inner_horizontal, inner_vertical (e.g., "outer" or "bottom,inner_horizontal"). "none" removes every border in the…
clear_dropdownboolean–Remove all data validation from the range: dropdowns, but also checkboxes and other validation rules.
dropdown_strictboolean–With dropdown_values: reject other input (default True) or only show a warning (False).
dropdown_valuesarray–Turns every cell in the range into a dropdown offering these values (e.g., ["open", "done"]).
font_sizeinteger–Font size in points.
horizontal_alignmentstring–Horizontal text alignment - LEFT, CENTER, or RIGHT.
italicboolean–Whether to apply italic formatting.
merge_cellsboolean–True merges the range, False unmerges it. Merging keeps only the top-left value of each merged group.
merge_typestring–MERGE_ALL (default), MERGE_COLUMNS, or MERGE_ROWS. Setting it implies merge_cells=True.
number_format_patternstring–Custom pattern for the number format.
number_format_typestring–Sheets number format type (e.g., "DATE").
range_namestringyesA1-style range (optionally with sheet name). Required.
spreadsheet_idstringyesThe ID of the spreadsheet. Required.
text_colorstring–Hex text color (e.g., "#000000").
user_google_emailstringyesThe user's Google email address. Required.
vertical_alignmentstring–Vertical text alignment - TOP, MIDDLE, or BOTTOM.
wrap_strategystring–Text wrap strategy - WRAP (wrap text within cell), CLIP (clip text at cell boundary), or OVERFLOW_CELL (allow text to overflow into adjacent empty cells).
NameTypeReqDescription
resultstringyes–

No examples provided.

generate_trigger_code ~379

Generates Apps Script code for creating triggers. The Apps Script API cannot create triggers directly - they must be created from within Apps Script itself. This tool generates the code you need. To list or remove existing triggers without opening the editor, use `manage_script_trigger` (action="list" / action="delete") instead.

NameTypeReqDescription
function_namestringyesThe function to run when trigger fires (e.g., "sendDailyReport")
schedulestring–Schedule details (depends on trigger_type): - For time_minutes: "1", "5", "10", "15", or "30" - For time_hours: "1", "2", "4", "6", "8", or "12" - For time_daily: hour as "0"-"23" (…
trigger_typestringyesType of trigger. One of: - "time_minutes" (run every N minutes: 1, 5, 10, 15, 30) - "time_hours" (run every N hours: 1, 2, 4, 6, 8, 12) - "time_daily" (run daily at a sp…
NameTypeReqDescription
resultstringyes–

No examples provided.

get_contact ~65

Get detailed information about a specific contact.

NameTypeReqDescription
contact_idstringyesThe contact ID (e.g., "c1234567890" or full resource name "people/c1234567890").
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_contact_group ~73

Get details of a specific contact group including its members.

NameTypeReqDescription
group_idstringyesThe contact group ID.
max_membersinteger–Maximum number of members to return (default: 100, max: 1000).
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_doc_as_markdown ~469

Reads a Google Doc and returns it as clean Markdown with optional comment context. Unlike get_doc_content which returns plain text, this tool preserves document formatting as Markdown: headings, bold/italic/strikethrough, links, code spans, ordered/unordered lists with nesting, and tables. When comments are included (the default), each comment's anchor text — the specific text the comment was attached to — is preserved, giving full context for the discussion.

NameTypeReqDescription
comment_modestring–How to display comments: - "inline": Footnote-style references placed at the anchor text location (default) - "appendix": All comments grouped at the bottom with blockquoted anchor text - "none": No…
document_idstringyesID of the Google Doc (or full URL). When a full URL is provided and it contains a ?tab= query parameter, that tab is used automatically unless tab_id is also specified (explicit tab_id takes preceden…
include_colorsboolean–Follow text that has an explicit RGB foreground color with "[color: #rrggbb]" (default: False). Theme colors are not shown.
include_commentsboolean–Whether to include comments (default: True)
include_resolvedboolean–Whether to include resolved comments (default: False)
suggestions_view_modestring–How to render suggestions in the returned content: - "DEFAULT_FOR_CURRENT_ACCESS": Default based on user's access level - "SUGGESTIONS_INLINE": Suggested changes appear inline in the document - "PREV…
tab_idstring–Optional ID of a single tab to read (from inspect_doc_structure). When given, only that tab's content is rendered, without its child tabs and without a tab heading, and comments are listed as documen…
user_google_emailstringyesUser's Google email address
NameTypeReqDescription
resultstringyes–

No examples provided.

get_doc_content ~546

Retrieves content of a Google Doc or a Drive file (like .docx) identified by document_id. - Native Google Docs: Fetches content via Docs API. - Office files (.docx, etc.) stored in Drive: Downloads via Drive API and extracts text. By default, native Google Docs text is index-aligned with the document: empty paragraphs are preserved and every non-text element that occupies an index (inline object, page break, footnote reference, ...) is rendered as one U+FFFC placeholder per index. The document body starts at index 1, so an offset n into the text that follows "--- CONTENT ---" is document index n + 1, and that index can be passed straight to format_text or delete_text. Tables and multi-tab documents interleave separators, so alignment holds up to the first table or tab header. Set preserve_context=True for readable link destinations, internal targets, smart-chip values, table boundaries, headers, footers, footnotes, and object context exposed by the Docs API. This output is plain text, not Markdown, and its offsets must not be used as document editing indices. Comments, revision history, exact visual layout, and chip details hidden by the API are not included. Use get_doc_as_markdown for formatting or comments.

NameTypeReqDescription
document_idstringyesID of the Google Doc or Drive file (or full URL). A Docs URL's ?tab= selects that tab unless tab_id is also specified.
preserve_contextboolean–Include readable semantic annotations for native Docs. Defaults to False to retain index alignment. Office extraction is unaffected. With tab_id, only the selected tab is rendered.
suggestions_view_modestring–How to render suggestions in the returned content: - "DEFAULT_FOR_CURRENT_ACCESS": Default based on user's access level - "SUGGESTIONS_INLINE": Suggested changes appear inline in the document - "PREV…
tab_idstring–Optional ID of a single tab to read (from inspect_doc_structure). When given, only that tab's content is returned with no tab separator, so the default output stays index-aligned with that tab. When…
user_google_emailstringyesUser's Google email address
NameTypeReqDescription
resultstringyes–

No examples provided.

get_drive_file_content ~263

Retrieves the content of a specific Google Drive file by ID, supporting files in shared drives. • Native Google Docs, Sheets, Slides → exported as text / CSV. • Office files (.docx, .xlsx, .pptx) → unzipped & parsed with std-lib to extract readable text. • PDFs → text extracted with pypdf when possible; scanned/image-only PDFs fall back to a download hint. • Images (PNG, JPEG, GIF, WebP) → returned as MCP image content after the metadata header. SVG → returned as its markup; raster images it embeds as base64 are attached as image content, numbered to match their place in the markup. BMP and TIFF → base64 text, or a download hint when over the default page size. • Any other file → downloaded; tries UTF-8 decode, else notes binary.

NameTypeReqDescription
file_idstringyesDrive file ID.
full_contentboolean–Return all content from offset onward in one call instead of a page of the default size.
offsetinteger–Character offset to read on from after a truncated result.
user_google_emailstringyesThe user’s Google email address.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_drive_file_download_url ~343

Downloads a Google Drive file and saves it to local disk. In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour). In stateless mode (no file storage), returns the file itself as an embedded resource, up to WORKSPACE_MCP_STATELESS_INLINE_MAX_BYTES (default 10 MiB, and never more than WORKSPACE_MCP_MAX_FILE_BYTES when that is set). For Google native files (Docs, Sheets, Slides, Drawings), exports to a useful format: - Google Docs -> PDF (default) or DOCX if export_format='docx' - Google Sheets -> XLSX (default), PDF if export_format='pdf', or CSV if export_format='csv' - Google Slides -> PDF (default) or PPTX if export_format='pptx' - Google Drawings -> PNG (default), or PDF, JPG or SVG if export_format='pdf', 'jpg' or 'svg' For other files, downloads the original file format.

NameTypeReqDescription
export_formatstring–Optional export format for Google native files. Options: 'pdf', 'docx', 'xlsx', 'csv', 'pptx', 'png', 'jpg', 'svg'. If not specified, uses sensible defaults (PDF for Docs/Slides,…
file_idstringyesThe Google Drive file ID to download.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_drive_file_permissions ~65

Gets detailed metadata about a Google Drive file including sharing permissions, parent folder IDs, ownership, and lifecycle timestamps.

NameTypeReqDescription
file_idstringyesThe ID of the file to check permissions for.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_drive_shareable_link ~64

Gets the shareable link for a Google Drive file or folder.

NameTypeReqDescription
file_idstringyesThe ID of the file or folder to get the shareable link for. Required.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_events ~657

Retrieves events from a specified Google Calendar. Can retrieve a single event by ID or multiple events within a time range. You can also search for events by keyword by supplying the optional "query" param.

NameTypeReqDescription
calendar_idstring–The ID of the calendar to query. Use 'primary' for the user's primary calendar. Defaults to 'primary'. Calendar IDs can be obtained using `list_calendars`.
detailedboolean–Whether to return detailed event information including description, location, colour (colorId), attendees, and attendee details (response status, organizer, optional flags). Recurring instances also…
event_idstring–The ID of a specific event to retrieve. If provided, retrieves only this event and ignores time filtering parameters.
include_attachmentsboolean–Whether to include attachment information in detailed event output. When True, shows attachment details (fileId, fileUrl, mimeType, title) for events that have attachments. Only applies when detailed…
max_resultsinteger–The maximum number of events to return in one page. Defaults to 25. Ignored if event_id is provided.
page_tokenstring–Token for the next page, taken from a previous response. When single_events=True, also pass the response's Pagination time_min as time_min, even if omitted on the first call. Keep all other query par…
querystring–A keyword to search for within event fields (summary, description, location). Ignored if event_id is provided.
single_eventsboolean–Whether to expand recurring series into individual instances. Defaults to True for backwards compatibility. Set to False with detailed=True to retrieve recurring master events and their exact RFC5545…
time_maxstring–The end of the time range (exclusive) in RFC3339 format. If omitted, events starting from `time_min` onwards are considered (up to `max_results`). Ignored if event_id is provided.
time_minstring–The start of the time range (inclusive) in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). If omitted, defaults to the current time when single_events=True. It is omitted from unexpand…
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_form ~43

Get a form.

NameTypeReqDescription
form_idstringyesThe ID of the form to retrieve.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_form_response ~60

Get one response from the form.

NameTypeReqDescription
form_idstringyesThe ID of the form.
response_idstringyesThe ID of the response to retrieve.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_gmail_attachment_content ~281

Downloads an email attachment and saves it to local disk. In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour). May re-fetch message metadata to resolve filename and MIME type.

NameTypeReqDescription
attachment_idstringyesThe ID of the attachment to download.
attachment_indexinteger–Zero-based attachment position from the message-content response. Lets the server resolve Gmail's refreshed attachment IDs against current metadata before every download, selecting the current attach…
message_idstringyesThe ID of the Gmail message containing the attachment.
return_base64boolean–When True, includes the full attachment as a standard base64 string in the response (in addition to any file path or download URL). Useful for sandboxed clients that cannot reach localhost download U…
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_gmail_message_content ~588

Retrieves the full content (subject, sender, recipients, body) of a specific Gmail message. Set page_offset=0 to read the complete rendered body, excluding attachments and attached messages, as JSON pages of at most page_size characters. Follow next_offset until complete=true, passing body_sha256 as expected_sha256 and keeping body_format and include_links unchanged. Bodies are returned inline and truncated at 20,000 characters. Set full=True to get the complete, untruncated message instead: it is exported to storage and the response carries a short-lived download URL (HTTP transport) or file path (stdio transport) rather than the body, so large messages never stream through the model context. Stateless deployments without GCS staging have no storage, so there full=True returns the untruncated body inline; with GCS staging configured it returns a signed download URL like any other HTTP deployment.

NameTypeReqDescription
body_formatstring–Body output format (only applies when format='full'). 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches…
expected_sha256string–Optional previous body_sha256; rejects changed content.
formatstring–Message format. "full" (default) includes the body and attachments, "metadata" only headers.
fullboolean–When True, return the COMPLETE untruncated message: saved to storage and referenced by download URL/file path instead of the body text. In stateless mode without GCS staging, the body is returned inl…
include_headersboolean–When False, omit the Subject/From/To/Date header summary (attached messages' too), and with full=True name the export after the message ID. Requires format='full'; body_format='raw' is only allowed w…
include_linksboolean–When True, append a LINKS section listing the http(s) URLs from the HTML body that the text output omits. Only applies to body_format='text'.
message_idstringyesThe unique ID of the Gmail message to retrieve.
page_offsetinteger–Character offset in the complete rendered body. Start at 0 and follow next_offset.
page_sizeinteger–Maximum body characters per page, between 1 and 20,000.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_gmail_messages_content_batch ~204

Retrieves the content of multiple Gmail messages in a single batch request. Supports up to 25 messages per batch to prevent SSL connection exhaustion.

NameTypeReqDescription
body_formatstring–Body output format (only applies when format='full'). 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches…
formatstring–Message format. "full" includes body, "metadata" only headers.
include_linksboolean–When True, append a LINKS section listing the http(s) URLs from the HTML body that the text output omits. Only applies to body_format='text'.
message_idsarrayyesList of Gmail message IDs to retrieve; fetched in batches of 25.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_gmail_thread_content ~258

Retrieves the complete content of a Gmail conversation thread, including all messages. Optionally also returns structured ownership analysis so a caller can determine who sent the last message and who owes whom a response without re-parsing the formatted string or making a second tool call.

NameTypeReqDescription
body_formatstring–Body output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches each message's full raw MIME cont…
include_analysisboolean–When True, the return value is a dict with both the formatted thread content AND structured ownership analysis (last sender, ball-in-court verdict, per-sender message counts, participants). Defaults…
include_linksboolean–When True, append a LINKS section listing the http(s) URLs from the HTML body that the text output omits. Only applies to body_format='text'.
thread_idstringyesThe unique ID of the Gmail thread to retrieve.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
result–yes–

No examples provided.

get_gmail_threads_content_batch ~184

Retrieves the content of multiple Gmail threads in a single batch request. Supports up to 25 threads per batch to prevent SSL connection exhaustion.

NameTypeReqDescription
body_formatstring–Body output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches each message's full raw MIME cont…
include_linksboolean–When True, append a LINKS section listing the http(s) URLs from the HTML body that the text output omits. Only applies to body_format='text'.
thread_idsarrayyesA list of Gmail thread IDs to retrieve. The function will automatically batch requests in chunks of 25.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_messages ~158

Retrieves messages from a Google Chat space.

NameTypeReqDescription
message_filterstring–Optional filter string using the Chat API filter syntax. Supports createTime and thread.name. Examples: 'createTime > "2026-03-18T00:00:00-03:00"'…
order_bystring––
page_sizeinteger––
space_idstringyes–
user_google_emailstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

get_page ~347

Get details about a specific page (slide) in a presentation.

NameTypeReqDescription
include_geometryboolean–Also report each element's placement - its transform (translate, and scale/shear when not identity) and intrinsic size, in raw EMU. Set this when adding elements to an existing deck: it is the only w…
include_stylesboolean–Also report text styling: per paragraph (alignment, indents, spacing, bullets) and per run of uniform style (font family, weight, size, bold/italic, color), each with a short excerpt; plus placeholde…
page_object_idstringyesThe object ID of the page/slide to retrieve.
presentation_idstringyesThe ID of the presentation.
rawboolean–Return the complete Slides API Page resource as JSON instead of the summary. Nothing is filtered. Use when the summary does not carry a field you need. Overrides the other flags.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_presentation ~286

Get details about a Google Slides presentation.

NameTypeReqDescription
include_geometryboolean–Also list each slide's elements with their placement - transform (translate, and scale/shear when not identity) and intrinsic size, in raw EMU. Set this when adding slides to an existing deck so new…
include_speaker_notesboolean–Also report each slide's speaker (presenter) notes and the object ID of the shape holding them. Pass True when you need to read or edit notes: that shape ID is the only valid target for insertText/de…
include_stylesboolean–Also list each slide's elements with text styling (see get_page). Defaults to False.
presentation_idstringyesThe ID of the presentation to retrieve.
rawboolean–Return the complete Slides API Presentation resource as JSON (slides, layouts, masters, notes, every element and style) instead of the summary. Nothing is filtered, so it can be large; prefer get_pag…
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_script_activity ~113

Read execution activity for scripts: recent processes or aggregate metrics.

NameTypeReqDescription
actionstringyesOne of "processes", "metrics".
metrics_granularitystring–Granularity for metrics - "DAILY" or "WEEKLY".
page_sizeinteger–Number of results for processes (default: 50).
script_idstring–The script project ID (required for metrics; optional for processes).
user_google_emailstringyesUser's email address
NameTypeReqDescription
resultstringyes–

No examples provided.

get_script_project ~109

Read Apps Script projects and their source files.

NameTypeReqDescription
actionstringyesOne of "list", "get".
file_namestring–Optional source file name for get.
page_sizeinteger–Number of results per page for list (default: 50).
page_tokenstring–Pagination token for list (optional).
script_idstring–The script project ID (required for get).
user_google_emailstringyesUser's email address
NameTypeReqDescription
resultstringyes–

No examples provided.

get_script_version ~52

List or retrieve immutable version snapshots of a script project.

NameTypeReqDescription
actionstringyes–
script_idstringyes–
user_google_emailstringyes–
version_numberinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

get_search_engine_info ~35

Retrieves metadata about a Programmable Search Engine.

NameTypeReqDescription
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_spreadsheet_info ~56

Gets information about a specific spreadsheet including its sheets.

NameTypeReqDescription
spreadsheet_idstringyesThe ID of the spreadsheet to get info for. Required.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

get_task ~64

Get details of a specific task.

NameTypeReqDescription
task_idstringyesThe ID of the task to retrieve.
task_list_idstringyesThe ID of the task list containing the task.
user_google_emailstringyesThe user's Google email address. Required.
NameTypeReqDescription
resultstringyes–

No examples provided.

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
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 77 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 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 119 tools: start_google_auth, search_gmail_messages, get_gmail_message_content, get_gmail_messages_content_batch, get_gmail_attachment_content, and 114 more. Their descriptions and schemas cost roughly 30,634 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 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the io.github.taylorwilsdon/workspace-mcp server under?

io.github.taylorwilsdon/workspace-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.