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_calendaris removed. Callmanage_calendar(action="create", summary=...)instead; it takes the same parameters and returns the same output.
New
- gcalendar:
manage_calendarcreates secondary calendars (replacingcreate_calendar) and manages sharing over the Calendar ACL API withlist_sharing,share,update_sharingandunshare; 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) andX-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-onlyor--permissions(#1351) - feat(core): narrow tools per request with X-MCP-Toolsets and X-MCP-Tools by @taylorwilsdon in #1351 - gdocs:
get_doc_contentandget_doc_as_markdowntakeheadingandheading_levelto 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_sheettakesdestination_spreadsheet_idto copy a tab, with its formatting and formulas, into a different spreadsheet viacopyTo, 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_filetakesshortcut_target_idto 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_messagestakespage_tokenand 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.commatchesluke@example.com.jsonon 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_REUSEADDRso 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_responselists 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_projectsincludes 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
- @stantheman0128 made their first contribution in #957
- @TWG-Security made their first contribution in #1316
Full Changelog: v2.3.0...v2.4.0