Enhanced the update_paragraph_style tool to support creating bulleted and
numbered lists with nested indentation levels (0-8). This enables agents to
create well-structured documents that match professional document styles.
Changes:
- Enhanced update_paragraph_style tool with:
- create_list parameter: Create bulleted (UNORDERED) or numbered (ORDERED) lists
- list_nesting_level parameter: Support nested list items (0-8 levels)
- Updated create_bullet_list_request helper to accept nesting_level parameter
- Updated documentation in README.md, docs/README.md, and docs/README_NEW.md
- Tool remains in Extended tier as defined in tool_tiers.yaml
This addresses the feature request to expose paragraph-level formatting
operations (named styles, bullets, indentation) that were previously missing
from the character-level modify_doc_text tool.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Several docs tools (search_docs, get_doc_content, list_docs_in_folder,
export_doc_to_pdf) and sheets tools (list_spreadsheets) internally use
the Google Drive API but only receive docs/sheets-specific OAuth scopes
when configured with `--tools docs sheets` (without `drive`).
This adds the minimal required Drive scopes as cross-service dependencies:
- docs: drive.readonly (metadata queries) + drive.file (PDF export)
- sheets: drive.readonly (spreadsheet listing)
This follows the existing pattern where appscript already includes
DRIVE_FILE_SCOPE for its Drive API dependency.
The alternative workaround of adding `--tools drive` exposes 14
full-access Drive tools which is undesirable from a security perspective.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Use consistent terminology in confirmation message ("background color"
to match "text color")
- Tighten test assertions for invalid parameter validation to check
parameter name and all allowed values instead of loose substring matches
- Remove unrelated calendar_tools.py changes (lambda reformatting, guest
permissions, query_freebusy) that belong in separate PRs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When USER_GOOGLE_EMAIL environment variable is set, include it in the MCP
server instructions so that AI clients know which email to use for
Google Workspace tools without asking the user.
This improves the experience for desktop apps that handle OAuth externally
and pass credentials via GOOGLE_MCP_CREDENTIALS_DIR + USER_GOOGLE_EMAIL.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Extends format_sheet_range with new parameters:
- wrap_strategy: WRAP, CLIP, OVERFLOW_CELL
- horizontal_alignment: LEFT, CENTER, RIGHT
- vertical_alignment: TOP, MIDDLE, BOTTOM
- bold: boolean for bold text
- italic: boolean for italic text
- font_size: integer for font size in points
All parameters work alongside existing color and number format options.
Includes 21 unit tests covering all new functionality.
Added to extended tier in tool_tiers.yaml.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fixes#327
- Use absolute path (~/.workspace-mcp/attachments/) instead of relative
./tmp/attachments to avoid polluting working directories
- Make storage directory configurable via WORKSPACE_ATTACHMENT_DIR env var
- Return file path from save_attachment() instead of UUID for direct
filesystem access (useful in stdio mode where HTTP URLs are unavailable)
- Preserve original filenames with UUID suffix for uniqueness
- Use format="full" instead of format="metadata" when fetching attachment
info, as metadata format doesn't include attachmentId in parts
- Add multi-level filename matching: exact attachmentId → size-based
fallback → single-attachment fallback (handles ephemeral IDs)