WORKSPACE_MCP_STATELESS_MODE=true was already read, validated, and used to
configure the OAuth layer — but was never passed to server.run(). FastMCP
therefore always ran in stateful mode, keeping session state in memory.
On pod/process restart all in-memory sessions are lost, causing clients to
receive {"code":-32600,"message":"Session not found"} on their next request.
Passes stateless_http=is_stateless_mode() to server.run() so FastMCP drops
session tracking when stateless mode is configured, matching what the env var
already advertises.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When credentials had a refresh_token but credentials.expired was False
(e.g., token=None with no stored expiry), the refresh was skipped and
the server would start a new OAuth flow instead. This changes the
condition to attempt refresh whenever credentials are not valid and a
refresh_token is available, regardless of the expired flag.
window.close() is blocked by modern browsers for tabs not opened via
window.open(). The success page's close button and auto-close timer
silently fail as a result.
- Add tryClose() that attempts window.close() and falls back to
showing "You can close this tab manually" after 500ms
- Remove ineffective auto-close scripts from error pages
Add mutual exclusion guard so clients get a clear error instead of
named_style_type silently overriding heading_level.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Extract VALID_NAMED_STYLE_TYPES constant in docs_helpers.py, reuse in validation_manager.py
- Switch build_paragraph_style call to keyword arguments for clarity and resilience
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Conference/meeting links (Google Meet, Zoom, etc.) were fetched from the
API but never included in get_events() output. Extract video entry point
from conferenceData (with hangoutLink fallback) and display it in all
three output modes: single detailed, multi detailed, and basic list.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Exposes native Google Docs createParagraphBullets and
deleteParagraphBullets APIs via the batch operation manager.
Supports UNORDERED (bullets), ORDERED (numbered), and NONE
(remove formatting) list types with optional nesting levels.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allows setting TITLE and SUBTITLE paragraph styles directly, in addition
to the existing heading_level (0-6) parameter. The new named_style_type
parameter accepts all Google Docs named styles: NORMAL_TEXT, TITLE,
SUBTITLE, HEADING_1 through HEADING_6.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>