github taylorwilsdon/google_workspace_mcp v2.4.0

one hour ago

A release about doing more with the tools you already have: calendar creation and sharing fold into one manage_calendar tool, Sheets can copy a tab into another spreadsheet, Docs can read a single heading section, and Drive can create shortcuts, all without adding a new tool definition. HTTP deployments can also narrow the tool list per request with X-MCP-Toolsets and X-MCP-Tools headers, and a batch of multi-account auth fixes stops needless re-auth loops.

Heads up: create_calendar is removed. Call manage_calendar(action="create", summary=...) instead; it takes the same parameters and returns the same output.

New

  • gcalendar: manage_calendar creates secondary calendars (replacing create_calendar) and manages sharing over the Calendar ACL API with list_sharing, share, update_sharing and unshare; the owner's own rule can't be changed, and the tool stays in the extended tier and is hidden under --read-only (#1353) - feat(calendar): manage_calendar for creating and sharing calendars by @taylorwilsdon in #1353
  • core: streamable-http clients sharing one server can narrow the tool list per request with X-MCP-Toolsets (service names) and X-MCP-Tools (tool names), the same headers the GitHub MCP server uses; headers only filter what the server already loaded, so they can never expose a tool removed by the tier, --tools, --read-only or --permissions (#1351) - feat(core): narrow tools per request with X-MCP-Toolsets and X-MCP-Tools by @taylorwilsdon in #1351
  • gdocs: get_doc_content and get_doc_as_markdown take heading and heading_level to return just that heading and everything under it until the next heading of equal or shallower level; a heading that isn't found lists the available ones (#1352) - feat(docs): read a single heading section with get_doc_content and get_doc_as_markdown by @taylorwilsdon in #1352
  • gsheets: create_sheet takes destination_spreadsheet_id to copy a tab, with its formatting and formulas, into a different spreadsheet via copyTo, then renames and positions it; a failed rename removes the copy so a retry leaves no orphan (#1350) - feat(sheets): copy a tab into another spreadsheet with create_sheet by @taylorwilsdon in #1350
  • gdrive: create_drive_file takes shortcut_target_id to create a Drive shortcut to an existing file or folder, so an item shows up in a second folder without being copied (#1345) - feat(drive): create shortcuts through create_drive_file by @Bortlesboat in #1345
  • gchat: get_messages takes page_token and reports the next token when more messages remain, so long spaces can be read past the first page (#1308) - fix(gchat): page get_messages with page_token by @ConnorMoss02 in #1308

Fixes

  • auth: in multi-account mode, a successful token refresh for an account other than the one bound to the session is kept instead of being discarded as a refresh failure, and a refused rebind no longer wipes another session's binding (#1348) - fix(auth): keep a refreshed token when the session is bound to another account by @taylorwilsdon in #1348
  • auth: single-user mode finds the stored credential case-insensitively, so Luke@example.com matches luke@example.com.json on case-sensitive filesystems instead of looping on re-auth (#1349) - fix(auth): match the single-user stored account case-insensitively by @taylorwilsdon in #1349
  • auth: startup logs the directory FastMCP's default encrypted OAuth proxy store writes to and names the env var that selects another backend (#1354) - fix(auth): log the default OAuth proxy storage directory by @taylorwilsdon in #1354
  • gchat: cached People API names are keyed per authenticated user, so one user's private contact label for a colleague is never served to another user on a multi-user server (#1316) - fix(chat): isolate cached People names per authenticated user by @TWG-Security in #1316
  • core: the streamable-http pre-flight port probe sets SO_REUSEADDR so lingering TIME_WAIT sockets no longer fake an address-in-use failure on fast restart, and a real bind failure is logged at ERROR so it shows up in container logs (#957) - fix: streamable-http port probe SO_REUSEADDR + ERROR bind logging by @stantheman0128 in #957
  • gforms: get_form_response lists the files uploaded to file-upload questions instead of leaving those answers blank (#1338) - fix(gforms): list uploaded files in get_form_response by @ConnorMoss02 in #1338
  • gappsscript: list_script_projects includes projects stored in shared drives (#1336) - fix(gappsscript): include shared drives in list_script_projects by @ConnorMoss02 in #1336
  • telemetry: when a Gmail or Drive tool falls back after an attachment save fails, the span is now marked as an error with the exception type and errno, so a read-only home directory shows up in traced error rates instead of only in logs (#1333) - fix(telemetry): mark spans as errors when a tool recovers from a save failure by @DrFaust92 in #1333

Dependencies

  • core: pyasn1 0.6.4 to 0.6.5 (#1339) - chore(deps): bump pyasn1 from 0.6.4 to 0.6.5 in the uv group across 1 directory by @dependabot[bot] in #1339
  • core: pypdf 6.21.3 to 6.21.4 and joserfc 1.6.8 to 1.7.6 (#1341) - chore(deps): bump the uv group across 1 directory with 2 updates by @dependabot[bot] in #1341
  • core: oauthlib 4.0.0 to 4.0.1 (#1355) - chore(deps): bump oauthlib from 4.0.0 to 4.0.1 in the uv group across 1 directory by @dependabot[bot] in #1355

New Contributors

Full Changelog: v2.3.0...v2.4.0

Don't miss a new google_workspace_mcp release

NewReleases is sending notifications on new releases.