workspace-mcp 1.1.4__py3-none-any.whl → 1.1.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
gslides/slides_tools.py CHANGED
@@ -20,8 +20,8 @@ logger = logging.getLogger(__name__)
20
20
 
21
21
 
22
22
  @server.tool()
23
- @require_google_service("slides", "slides")
24
23
  @handle_http_errors("create_presentation")
24
+ @require_google_service("slides", "slides")
25
25
  async def create_presentation(
26
26
  service,
27
27
  user_google_email: str,
@@ -42,27 +42,27 @@ async def create_presentation(
42
42
  body = {
43
43
  'title': title
44
44
  }
45
-
45
+
46
46
  result = await asyncio.to_thread(
47
47
  service.presentations().create(body=body).execute
48
48
  )
49
-
49
+
50
50
  presentation_id = result.get('presentationId')
51
51
  presentation_url = f"https://docs.google.com/presentation/d/{presentation_id}/edit"
52
-
52
+
53
53
  confirmation_message = f"""Presentation Created Successfully for {user_google_email}:
54
54
  - Title: {title}
55
55
  - Presentation ID: {presentation_id}
56
56
  - URL: {presentation_url}
57
57
  - Slides: {len(result.get('slides', []))} slide(s) created"""
58
-
58
+
59
59
  logger.info(f"Presentation created successfully for {user_google_email}")
60
60
  return confirmation_message
61
61
 
62
62
 
63
63
  @server.tool()
64
+ @handle_http_errors("get_presentation", is_read_only=True)
64
65
  @require_google_service("slides", "slides_read")
65
- @handle_http_errors("get_presentation")
66
66
  async def get_presentation(
67
67
  service,
68
68
  user_google_email: str,
@@ -83,17 +83,17 @@ async def get_presentation(
83
83
  result = await asyncio.to_thread(
84
84
  service.presentations().get(presentationId=presentation_id).execute
85
85
  )
86
-
86
+
87
87
  title = result.get('title', 'Untitled')
88
88
  slides = result.get('slides', [])
89
89
  page_size = result.get('pageSize', {})
90
-
90
+
91
91
  slides_info = []
92
92
  for i, slide in enumerate(slides, 1):
93
93
  slide_id = slide.get('objectId', 'Unknown')
94
94
  page_elements = slide.get('pageElements', [])
95
95
  slides_info.append(f" Slide {i}: ID {slide_id}, {len(page_elements)} element(s)")
96
-
96
+
97
97
  confirmation_message = f"""Presentation Details for {user_google_email}:
98
98
  - Title: {title}
99
99
  - Presentation ID: {presentation_id}
@@ -103,14 +103,14 @@ async def get_presentation(
103
103
 
104
104
  Slides Breakdown:
105
105
  {chr(10).join(slides_info) if slides_info else ' No slides found'}"""
106
-
106
+
107
107
  logger.info(f"Presentation retrieved successfully for {user_google_email}")
108
108
  return confirmation_message
109
109
 
110
110
 
111
111
  @server.tool()
112
- @require_google_service("slides", "slides")
113
112
  @handle_http_errors("batch_update_presentation")
113
+ @require_google_service("slides", "slides")
114
114
  async def batch_update_presentation(
115
115
  service,
116
116
  user_google_email: str,
@@ -133,22 +133,22 @@ async def batch_update_presentation(
133
133
  body = {
134
134
  'requests': requests
135
135
  }
136
-
136
+
137
137
  result = await asyncio.to_thread(
138
138
  service.presentations().batchUpdate(
139
139
  presentationId=presentation_id,
140
140
  body=body
141
141
  ).execute
142
142
  )
143
-
143
+
144
144
  replies = result.get('replies', [])
145
-
145
+
146
146
  confirmation_message = f"""Batch Update Completed for {user_google_email}:
147
147
  - Presentation ID: {presentation_id}
148
148
  - URL: https://docs.google.com/presentation/d/{presentation_id}/edit
149
149
  - Requests Applied: {len(requests)}
150
150
  - Replies Received: {len(replies)}"""
151
-
151
+
152
152
  if replies:
153
153
  confirmation_message += "\n\nUpdate Results:"
154
154
  for i, reply in enumerate(replies, 1):
@@ -160,14 +160,14 @@ async def batch_update_presentation(
160
160
  confirmation_message += f"\n Request {i}: Created shape with ID {shape_id}"
161
161
  else:
162
162
  confirmation_message += f"\n Request {i}: Operation completed"
163
-
163
+
164
164
  logger.info(f"Batch update completed successfully for {user_google_email}")
165
165
  return confirmation_message
166
166
 
167
167
 
168
168
  @server.tool()
169
+ @handle_http_errors("get_page", is_read_only=True)
169
170
  @require_google_service("slides", "slides_read")
170
- @handle_http_errors("get_page")
171
171
  async def get_page(
172
172
  service,
173
173
  user_google_email: str,
@@ -193,10 +193,10 @@ async def get_page(
193
193
  pageObjectId=page_object_id
194
194
  ).execute
195
195
  )
196
-
196
+
197
197
  page_type = result.get('pageType', 'Unknown')
198
198
  page_elements = result.get('pageElements', [])
199
-
199
+
200
200
  elements_info = []
201
201
  for element in page_elements:
202
202
  element_id = element.get('objectId', 'Unknown')
@@ -213,7 +213,7 @@ async def get_page(
213
213
  elements_info.append(f" Line: ID {element_id}, Type: {line_type}")
214
214
  else:
215
215
  elements_info.append(f" Element: ID {element_id}, Type: Unknown")
216
-
216
+
217
217
  confirmation_message = f"""Page Details for {user_google_email}:
218
218
  - Presentation ID: {presentation_id}
219
219
  - Page ID: {page_object_id}
@@ -222,14 +222,14 @@ async def get_page(
222
222
 
223
223
  Page Elements:
224
224
  {chr(10).join(elements_info) if elements_info else ' No elements found'}"""
225
-
225
+
226
226
  logger.info(f"Page retrieved successfully for {user_google_email}")
227
227
  return confirmation_message
228
228
 
229
229
 
230
230
  @server.tool()
231
+ @handle_http_errors("get_page_thumbnail", is_read_only=True)
231
232
  @require_google_service("slides", "slides_read")
232
- @handle_http_errors("get_page_thumbnail")
233
233
  async def get_page_thumbnail(
234
234
  service,
235
235
  user_google_email: str,
@@ -258,9 +258,9 @@ async def get_page_thumbnail(
258
258
  thumbnailPropertiesImageSize=thumbnail_size
259
259
  ).execute
260
260
  )
261
-
261
+
262
262
  thumbnail_url = result.get('contentUrl', '')
263
-
263
+
264
264
  confirmation_message = f"""Thumbnail Generated for {user_google_email}:
265
265
  - Presentation ID: {presentation_id}
266
266
  - Page ID: {page_object_id}
@@ -268,7 +268,7 @@ async def get_page_thumbnail(
268
268
  - Thumbnail URL: {thumbnail_url}
269
269
 
270
270
  You can view or download the thumbnail using the provided URL."""
271
-
271
+
272
272
  logger.info(f"Thumbnail generated successfully for {user_google_email}")
273
273
  return confirmation_message
274
274
 
gtasks/tasks_tools.py CHANGED
@@ -13,12 +13,14 @@ from googleapiclient.errors import HttpError
13
13
 
14
14
  from auth.service_decorator import require_google_service
15
15
  from core.server import server
16
+ from core.utils import handle_http_errors
16
17
 
17
18
  logger = logging.getLogger(__name__)
18
19
 
19
20
 
20
21
  @server.tool()
21
22
  @require_google_service("tasks", "tasks_read")
23
+ @handle_http_errors("list_task_lists")
22
24
  async def list_task_lists(
23
25
  service,
24
26
  user_google_email: str,
@@ -78,6 +80,7 @@ async def list_task_lists(
78
80
 
79
81
  @server.tool()
80
82
  @require_google_service("tasks", "tasks_read")
83
+ @handle_http_errors("get_task_list")
81
84
  async def get_task_list(
82
85
  service,
83
86
  user_google_email: str,
@@ -121,6 +124,7 @@ async def get_task_list(
121
124
 
122
125
  @server.tool()
123
126
  @require_google_service("tasks", "tasks")
127
+ @handle_http_errors("create_task_list")
124
128
  async def create_task_list(
125
129
  service,
126
130
  user_google_email: str,
@@ -168,6 +172,7 @@ async def create_task_list(
168
172
 
169
173
  @server.tool()
170
174
  @require_google_service("tasks", "tasks")
175
+ @handle_http_errors("update_task_list")
171
176
  async def update_task_list(
172
177
  service,
173
178
  user_google_email: str,
@@ -217,6 +222,7 @@ async def update_task_list(
217
222
 
218
223
  @server.tool()
219
224
  @require_google_service("tasks", "tasks")
225
+ @handle_http_errors("delete_task_list")
220
226
  async def delete_task_list(
221
227
  service,
222
228
  user_google_email: str,
@@ -256,6 +262,7 @@ async def delete_task_list(
256
262
 
257
263
  @server.tool()
258
264
  @require_google_service("tasks", "tasks_read")
265
+ @handle_http_errors("list_tasks")
259
266
  async def list_tasks(
260
267
  service,
261
268
  user_google_email: str,
@@ -361,6 +368,7 @@ async def list_tasks(
361
368
 
362
369
  @server.tool()
363
370
  @require_google_service("tasks", "tasks_read")
371
+ @handle_http_errors("get_task")
364
372
  async def get_task(
365
373
  service,
366
374
  user_google_email: str,
@@ -421,6 +429,7 @@ async def get_task(
421
429
 
422
430
  @server.tool()
423
431
  @require_google_service("tasks", "tasks")
432
+ @handle_http_errors("create_task")
424
433
  async def create_task(
425
434
  service,
426
435
  user_google_email: str,
@@ -495,6 +504,7 @@ async def create_task(
495
504
 
496
505
  @server.tool()
497
506
  @require_google_service("tasks", "tasks")
507
+ @handle_http_errors("update_task")
498
508
  async def update_task(
499
509
  service,
500
510
  user_google_email: str,
@@ -576,6 +586,7 @@ async def update_task(
576
586
 
577
587
  @server.tool()
578
588
  @require_google_service("tasks", "tasks")
589
+ @handle_http_errors("delete_task")
579
590
  async def delete_task(
580
591
  service,
581
592
  user_google_email: str,
@@ -617,6 +628,7 @@ async def delete_task(
617
628
 
618
629
  @server.tool()
619
630
  @require_google_service("tasks", "tasks")
631
+ @handle_http_errors("move_task")
620
632
  async def move_task(
621
633
  service,
622
634
  user_google_email: str,
@@ -695,6 +707,7 @@ async def move_task(
695
707
 
696
708
  @server.tool()
697
709
  @require_google_service("tasks", "tasks")
710
+ @handle_http_errors("clear_completed_tasks")
698
711
  async def clear_completed_tasks(
699
712
  service,
700
713
  user_google_email: str,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: workspace-mcp
3
- Version: 1.1.4
3
+ Version: 1.1.6
4
4
  Summary: Comprehensive, highly performant Google Workspace Streamable HTTP & SSE MCP Server for Calendar, Gmail, Docs, Sheets, Slides & Drive
5
5
  Author-email: Taylor Wilsdon <taylor@taylorwilsdon.com>
6
6
  License: MIT
@@ -47,11 +47,11 @@ Dynamic: license-file
47
47
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
48
48
  [![Python 3.11+](https://img.shields.io/badge/Python-3.11%2B-blue.svg)](https://www.python.org/downloads/)
49
49
  [![PyPI](https://img.shields.io/pypi/v/workspace-mcp.svg)](https://pypi.org/project/workspace-mcp/)
50
- [![UV](https://img.shields.io/badge/Package%20Installer-UV-blueviolet)](https://github.com/astral-sh/uv)
50
+ [![PyPI Downloads](https://static.pepy.tech/badge/workspace-mcp/month)](https://pepy.tech/projects/workspace-mcp)
51
51
  [![Website](https://img.shields.io/badge/Website-workspacemcp.com-green.svg)](https://workspacemcp.com)
52
52
  [![Verified on MseeP](https://mseep.ai/badge.svg)](https://mseep.ai/app/eebbc4a6-0f8c-41b2-ace8-038e5516dba0)
53
53
 
54
- **This is the single most feature-complete Google Workspace MCP server**
54
+ **This is the single most feature-complete Google Workspace MCP server** now with 1-click Claude installation
55
55
 
56
56
  *Full natural language control over Google Calendar, Drive, Gmail, Docs, Sheets, Slides, Forms, Tasks, and Chat through all MCP clients, AI assistants and developer tools.*
57
57
 
@@ -79,13 +79,15 @@ Dynamic: license-file
79
79
  ---
80
80
 
81
81
  ### A quick plug for AI-Enhanced Docs
82
+ <details>
83
+ <summary>But why?</summary>
82
84
 
83
- > **This README was crafted with AI assistance, and here's why that matters**
85
+ **This README was written with AI assistance, and here's why that matters**
84
86
  >
85
- > As a solo developer building open source tools that may only ever serve my own needs, comprehensive documentation often wouldn't happen without AI help. Using agentic dev tools like **Roo** & **Claude Code** that understand the entire codebase, AI doesn't just regurgitate generic content - it extracts real implementation details and creates accurate, specific documentation.
87
+ > As a solo dev building open source tools that many never see outside use, comprehensive documentation often wouldn't happen without AI help. Using agentic dev tools like **Roo** & **Claude Code** that understand the entire codebase, AI doesn't just regurgitate generic content - it extracts real implementation details and creates accurate, specific documentation.
86
88
  >
87
- > In this case, Sonnet 4 took a pass & a human (me) verified them 6/28/25.
88
-
89
+ > In this case, Sonnet 4 took a pass & a human (me) verified them 7/10/25.
90
+ </details>
89
91
 
90
92
  ## Overview
91
93
 
@@ -103,7 +105,7 @@ A production-ready MCP server that integrates all major Google Workspace service
103
105
  - **📝 Google Forms**: Form creation, retrieval, publish settings, and response management
104
106
  - **✓ Google Tasks**: Complete task and task list management with hierarchy, due dates, and status tracking
105
107
  - **💬 Google Chat**: Space management and messaging capabilities
106
- - **🔄 Multiple Transports**: HTTP with SSE fallback, OpenAPI compatibility via `mcpo`
108
+ - **🔄 All Transports**: Stdio, Streamable HTTP & SSE, OpenAPI compatibility via `mcpo`
107
109
  - **⚡ High Performance**: Service caching, thread-safe sessions, FastMCP integration
108
110
  - **🧩 Developer Friendly**: Minimal boilerplate, automatic service injection, centralized configuration
109
111
 
@@ -111,7 +113,48 @@ A production-ready MCP server that integrates all major Google Workspace service
111
113
 
112
114
  ## 🚀 Quick Start
113
115
 
114
- ### Simplest Start (uvx - Recommended)
116
+ ### 1. One-Click Claude Desktop Install (Recommended)
117
+
118
+ 1. **Download:** Grab the latest `google_workspace_mcp.dxt` from the “Releases” page
119
+ 2. **Install:** Double-click the file – Claude Desktop opens and prompts you to **Install**
120
+ 3. **Configure:** In Claude Desktop → **Settings → Extensions → Google Workspace MCP**, paste your Google OAuth credentials
121
+ 4. **Use it:** Start a new Claude chat and call any Google Workspace tool 🎉
122
+
123
+ >
124
+ **Why DXT?**
125
+ > Desktop Extensions (`.dxt`) bundle the server, dependencies, and manifest so users go from download → working MCP in **one click** – no terminal, no JSON editing, no version conflicts.
126
+
127
+ #### Required Configuration
128
+ <details>
129
+ <summary>Environment - you will configure these in Claude itself, see screenshot:</summary>
130
+
131
+ | Variable | Purpose |
132
+ |----------|---------|
133
+ | `GOOGLE_OAUTH_CLIENT_ID` | OAuth client ID from Google Cloud |
134
+ | `GOOGLE_OAUTH_CLIENT_SECRET` | OAuth client secret |
135
+ | `USER_GOOGLE_EMAIL` *(optional)* | Default email for single-user auth |
136
+ | `OAUTHLIB_INSECURE_TRANSPORT=1` | Development only (allows `http://` redirect) |
137
+
138
+ Claude Desktop stores these securely in the OS keychain; set them once in the extension pane.
139
+ </details>
140
+
141
+ <div align="center">
142
+ <video width="832" src="https://github.com/user-attachments/assets/83cca4b3-5e94-448b-acb3-6e3a27341d3a"></video>
143
+ </div>
144
+ ---
145
+
146
+ ### 2. Advanced / Cross-Platform Installation
147
+
148
+ If you’re developing, deploying to servers, or using another MCP-capable client, keep reading.
149
+
150
+ #### Instant CLI (uvx)
151
+
152
+ ```bash
153
+ # Requires Python 3.11+ and uvx
154
+ export GOOGLE_OAUTH_CLIENT_ID="xxx"
155
+ export GOOGLE_OAUTH_CLIENT_SECRET="yyy"
156
+ uvx workspace-mcp --tools gmail drive calendar
157
+ ```
115
158
 
116
159
  > Run instantly without manual installation - you must configure OAuth credentials when using uvx. You can use either environment variables (recommended for production) or set the `GOOGLE_CLIENT_SECRET_PATH` (or legacy `GOOGLE_CLIENT_SECRETS`) environment variable to point to your `client_secret.json` file.
117
160
 
@@ -187,9 +230,10 @@ uv run main.py
187
230
 
188
231
  3. **Server Configuration**:
189
232
  The server's base URL and port can be customized using environment variables:
190
- - `WORKSPACE_MCP_BASE_URI`: Sets the base URI for the server (default: http://localhost). This affects the server_url used for Gemini native function calling and the OAUTH_REDIRECT_URI.
233
+ - `WORKSPACE_MCP_BASE_URI`: Sets the base URI for the server (default: http://localhost). This affects the `server_url` used to construct the default `OAUTH_REDIRECT_URI` if `GOOGLE_OAUTH_REDIRECT_URI` is not set.
191
234
  - `WORKSPACE_MCP_PORT`: Sets the port the server listens on (default: 8000). This affects the server_url, port, and OAUTH_REDIRECT_URI.
192
235
  - `USER_GOOGLE_EMAIL`: Optional default email for authentication flows. If set, the LLM won't need to specify your email when calling `start_google_auth`.
236
+ - `GOOGLE_OAUTH_REDIRECT_URI`: Sets an override for OAuth redirect specifically, must include a full address (i.e. include port if necessary). Use this if you want to run your OAuth redirect separately from the MCP. This is not recommended outside of very specific cases
193
237
 
194
238
  ### Start the Server
195
239
 
@@ -221,7 +265,8 @@ The server supports two transport modes:
221
265
 
222
266
  #### Stdio Mode (Default - Recommended for Claude Desktop)
223
267
 
224
- **Easiest Setup (Recommended)**
268
+ **Guided Setup (Recommended if not using DXT)**
269
+
225
270
  ```bash
226
271
  python install_claude.py
227
272
  ```
@@ -266,8 +311,12 @@ After running the script, just restart Claude Desktop and you're ready to go.
266
311
  "mcpServers": {
267
312
  "google_workspace": {
268
313
  "command": "uv",
269
- "args": ["run", "main.py"],
270
- "cwd": "/path/to/google_workspace_mcp",
314
+ "args": [
315
+ "run",
316
+ "--directory",
317
+ "/path/to/repo/google_workspace_mcp",
318
+ "main.py"
319
+ ],
271
320
  "env": {
272
321
  "GOOGLE_OAUTH_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
273
322
  "GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret",
@@ -1,36 +1,36 @@
1
1
  main.py,sha256=a4w_AcD_nSJo9697-75tZ3sU0tqOP1J8xTrXXD7qmns,7601
2
2
  auth/__init__.py,sha256=gPCU3GE-SLy91S3D3CbX-XfKBm6hteK_VSPKx7yjT5s,42
3
- auth/google_auth.py,sha256=JiGrHFpzhuxQgUNumZtAbyl8HTisDVdnvVFeSqpkCfg,32939
4
- auth/oauth_callback_server.py,sha256=igrur3fkZSY0bawufrH4AN9fMNpobUdAUp1BG7AQC6w,9341
3
+ auth/google_auth.py,sha256=h0QIEthpZMxw7dEijYQ5ntXESg2FHNGkDneEjJkdCn4,32868
4
+ auth/oauth_callback_server.py,sha256=kcgufdYU3e3ncSNouqgGyIiIOfFCXiR6CiOS8pTYuNo,9837
5
5
  auth/oauth_responses.py,sha256=qbirSB4d7mBRKcJKqGLrJxRAPaLHqObf9t-VMAq6UKA,7020
6
6
  auth/scopes.py,sha256=v091tidkMnhB0pPWOr0O08mU_s9yxSwVZkpVOyvlSwY,3550
7
7
  auth/service_decorator.py,sha256=8UfJnST6oi5Mci2YUdiIocn8--0oAEXm74VrGMroqzQ,15846
8
8
  core/__init__.py,sha256=AHVKdPl6v4lUFm2R-KuGuAgEmCyfxseMeLGtntMcqCs,43
9
9
  core/comments.py,sha256=vVfZYjH0kwqFyXcwvBx3m0Ko4WmfTJTkfD3dCQbucuc,11215
10
10
  core/context.py,sha256=zNgPXf9EO2EMs9sQkfKiywoy6sEOksVNgOrJMA_c30Y,768
11
- core/server.py,sha256=KNAo43WTgzb6WSOyYE4Nixs5yLSg3NGqT6V2v3h3Wxo,9326
12
- core/utils.py,sha256=sUNPhM0xh3tqgyCZxTcoje37Et-pbNJTksybTatDyho,10127
11
+ core/server.py,sha256=En_sV6Z19kWx8SO4KAnh8Qg5v2HYw8f9f_WJdEGMDSA,9301
12
+ core/utils.py,sha256=QLgyM-XNJiAqmr-ac9SLXJBWpN8VxvNurxdW0Ib2N7s,13096
13
13
  gcalendar/__init__.py,sha256=D5fSdAwbeomoaj7XAdxSnIy-NVKNkpExs67175bOtfc,46
14
- gcalendar/calendar_tools.py,sha256=SIiSJRxG3G9KsScow0pYwew600_PdtFqlOo-y2vXQRo,22144
14
+ gcalendar/calendar_tools.py,sha256=mlWIn26dw7fNGqiIb8NUQNnPsP0b0RJGzp4BvvC85Fk,22193
15
15
  gchat/__init__.py,sha256=XBjH4SbtULfZHgFCxk3moel5XqG599HCgZWl_veIncg,88
16
16
  gchat/chat_tools.py,sha256=cIeXBBxWkFCdQNJ23BkX8IoDho6J8ZcfLsPjctUWyfA,7274
17
17
  gdocs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- gdocs/docs_tools.py,sha256=gWPBXf2M_ucP9LasAW0JAlCFAwixlcbAFDGS62xspZ4,8482
18
+ gdocs/docs_tools.py,sha256=WrCjya2-MvM7b-DwFAhoXPcV2kNxq4I0V_xaqV3a1ZI,8494
19
19
  gdrive/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
- gdrive/drive_tools.py,sha256=l-6IpHTstRMKIY2CU4DFTTNfEQ5rVbafgwo8BrbJ9Bk,15257
20
+ gdrive/drive_tools.py,sha256=NWna_uQ7dmXV4kRPX01A0P7so0sjRfq5awWczg6sloU,15310
21
21
  gforms/__init__.py,sha256=pL91XixrEp9YjpM-AYwONIEfeCP2OumkEG0Io5V4boE,37
22
- gforms/forms_tools.py,sha256=reJF3qw9WwW6-aCOkS2x5jVBvdRx4Za8onEZBC57RXk,9663
22
+ gforms/forms_tools.py,sha256=0zxXFd1JnHPjCHJp_d1id9UYGxbW3UCklBmVlZTRLHo,9597
23
23
  gmail/__init__.py,sha256=l8PZ4_7Oet6ZE7tVu9oQ3-BaRAmI4YzAO86kf9uu6pU,60
24
- gmail/gmail_tools.py,sha256=UIcws__Akw0kxbasc9fYH7rkzDw_7L-LJU1LQU_p-sA,24754
24
+ gmail/gmail_tools.py,sha256=3RpnrjFX_E5d8KUKsyx_K8fWMkDdj01mxha9vZBGwn4,28825
25
25
  gsheets/__init__.py,sha256=jFfhD52w_EOVw6N5guf_dIc9eP2khW_eS9UAPJg_K3k,446
26
- gsheets/sheets_tools.py,sha256=TVlJ-jcIvJ_sJt8xO4-sBWIshb8rabJhjTmZfzHIJsU,11898
26
+ gsheets/sheets_tools.py,sha256=dUXtlpjxhRnPTN4Y0mklrMtW4noqezBfj8Rga2ivw74,11954
27
27
  gslides/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- gslides/slides_tools.py,sha256=wil3XRyUMzUbpBUMqis0CW5eRuwOrP0Lp7-6WbF4QVU,10117
28
+ gslides/slides_tools.py,sha256=m9FifqBLPFo_tdxH6mvH1-fDUarAnr_ejJ9oMlgKiYQ,10094
29
29
  gtasks/__init__.py,sha256=qwOWUzQbkYLSBrdhCqEkAWPH2lEOljk1mLtrlab9YZc,107
30
- gtasks/tasks_tools.py,sha256=Gy_j1VTeaa4HD2HQe0U1QjG3dQrkijtPNe0dUq5mAZQ,26021
31
- workspace_mcp-1.1.4.dist-info/licenses/LICENSE,sha256=bB8L7rIyRy5o-WHxGgvRuY8hUTzNu4h3DTkvyV8XFJo,1070
32
- workspace_mcp-1.1.4.dist-info/METADATA,sha256=9e72G7CXNSO56YIRgxtGYHW1gEttRlOMKVGjuPlkxvc,21435
33
- workspace_mcp-1.1.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
34
- workspace_mcp-1.1.4.dist-info/entry_points.txt,sha256=kPiEfOTuf-ptDM0Rf2OlyrFudGW7hCZGg4MCn2Foxs4,44
35
- workspace_mcp-1.1.4.dist-info/top_level.txt,sha256=uAg7uV2mETWYRw5g80XtO1lhxVO1sY6_IihNdG_4n24,80
36
- workspace_mcp-1.1.4.dist-info/RECORD,,
30
+ gtasks/tasks_tools.py,sha256=6zmZsZ-8JWUpOIDhvxuBIJsjB9bH8LrdUX0yVlsjlM8,26508
31
+ workspace_mcp-1.1.6.dist-info/licenses/LICENSE,sha256=bB8L7rIyRy5o-WHxGgvRuY8hUTzNu4h3DTkvyV8XFJo,1070
32
+ workspace_mcp-1.1.6.dist-info/METADATA,sha256=OnRwHLeLW-2UsdM-8SxSEkeVCelG-a-4l_plaMqI-dA,23544
33
+ workspace_mcp-1.1.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
34
+ workspace_mcp-1.1.6.dist-info/entry_points.txt,sha256=kPiEfOTuf-ptDM0Rf2OlyrFudGW7hCZGg4MCn2Foxs4,44
35
+ workspace_mcp-1.1.6.dist-info/top_level.txt,sha256=uAg7uV2mETWYRw5g80XtO1lhxVO1sY6_IihNdG_4n24,80
36
+ workspace_mcp-1.1.6.dist-info/RECORD,,