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.
- auth/google_auth.py +6 -8
- auth/oauth_callback_server.py +22 -8
- core/server.py +1 -1
- core/utils.py +153 -54
- gcalendar/calendar_tools.py +7 -7
- gdocs/docs_tools.py +4 -5
- gdrive/drive_tools.py +5 -5
- gforms/forms_tools.py +22 -23
- gmail/gmail_tools.py +199 -82
- gsheets/sheets_tools.py +7 -7
- gslides/slides_tools.py +25 -25
- gtasks/tasks_tools.py +13 -0
- {workspace_mcp-1.1.4.dist-info → workspace_mcp-1.1.6.dist-info}/METADATA +62 -13
- {workspace_mcp-1.1.4.dist-info → workspace_mcp-1.1.6.dist-info}/RECORD +18 -18
- {workspace_mcp-1.1.4.dist-info → workspace_mcp-1.1.6.dist-info}/WHEEL +0 -0
- {workspace_mcp-1.1.4.dist-info → workspace_mcp-1.1.6.dist-info}/entry_points.txt +0 -0
- {workspace_mcp-1.1.4.dist-info → workspace_mcp-1.1.6.dist-info}/licenses/LICENSE +0 -0
- {workspace_mcp-1.1.4.dist-info → workspace_mcp-1.1.6.dist-info}/top_level.txt +0 -0
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.
|
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
|
[](https://opensource.org/licenses/MIT)
|
48
48
|
[](https://www.python.org/downloads/)
|
49
49
|
[](https://pypi.org/project/workspace-mcp/)
|
50
|
-
[](https://pepy.tech/projects/workspace-mcp)
|
51
51
|
[](https://workspacemcp.com)
|
52
52
|
[](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
|
-
|
85
|
+
**This README was written with AI assistance, and here's why that matters**
|
84
86
|
>
|
85
|
-
> As a solo
|
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
|
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
|
-
- **🔄
|
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
|
-
###
|
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
|
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
|
-
**
|
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": [
|
270
|
-
|
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=
|
4
|
-
auth/oauth_callback_server.py,sha256=
|
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=
|
12
|
-
core/utils.py,sha256=
|
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=
|
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=
|
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=
|
20
|
+
gdrive/drive_tools.py,sha256=NWna_uQ7dmXV4kRPX01A0P7so0sjRfq5awWczg6sloU,15310
|
21
21
|
gforms/__init__.py,sha256=pL91XixrEp9YjpM-AYwONIEfeCP2OumkEG0Io5V4boE,37
|
22
|
-
gforms/forms_tools.py,sha256=
|
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=
|
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=
|
26
|
+
gsheets/sheets_tools.py,sha256=dUXtlpjxhRnPTN4Y0mklrMtW4noqezBfj8Rga2ivw74,11954
|
27
27
|
gslides/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
28
|
-
gslides/slides_tools.py,sha256=
|
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=
|
31
|
-
workspace_mcp-1.1.
|
32
|
-
workspace_mcp-1.1.
|
33
|
-
workspace_mcp-1.1.
|
34
|
-
workspace_mcp-1.1.
|
35
|
-
workspace_mcp-1.1.
|
36
|
-
workspace_mcp-1.1.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|