workspace-mcp 1.0.6__tar.gz → 1.1.1__tar.gz
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.
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/PKG-INFO +38 -24
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/README.md +37 -23
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/core/comments.py +19 -25
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/core/utils.py +1 -6
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/pyproject.toml +1 -1
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/workspace_mcp.egg-info/PKG-INFO +38 -24
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/LICENSE +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/auth/__init__.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/auth/google_auth.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/auth/oauth_callback_server.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/auth/oauth_responses.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/auth/scopes.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/auth/service_decorator.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/core/__init__.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/core/context.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/core/server.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gcalendar/__init__.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gcalendar/calendar_tools.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gchat/__init__.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gchat/chat_tools.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gdocs/__init__.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gdocs/docs_tools.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gdrive/__init__.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gdrive/drive_tools.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gforms/__init__.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gforms/forms_tools.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gmail/__init__.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gmail/gmail_tools.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gsheets/__init__.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gsheets/sheets_tools.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gslides/__init__.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/gslides/slides_tools.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/main.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/setup.cfg +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/tests/test_auth.py +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/workspace_mcp.egg-info/SOURCES.txt +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/workspace_mcp.egg-info/dependency_links.txt +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/workspace_mcp.egg-info/entry_points.txt +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/workspace_mcp.egg-info/requires.txt +0 -0
- {workspace_mcp-1.0.6 → workspace_mcp-1.1.1}/workspace_mcp.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: workspace-mcp
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.1.1
|
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
|
@@ -79,7 +79,7 @@ Dynamic: license-file
|
|
79
79
|
### A quick plug for AI-Enhanced Docs
|
80
80
|
|
81
81
|
> **This README was crafted with AI assistance, and here's why that matters**
|
82
|
-
>
|
82
|
+
>
|
83
83
|
> 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.
|
84
84
|
>
|
85
85
|
> In this case, Sonnet 4 took a pass & a human (me) verified them 6/28/25.
|
@@ -217,34 +217,47 @@ docker run -p 8000:8000 -v $(pwd):/app workspace-mcp --transport streamable-http
|
|
217
217
|
The server supports two transport modes:
|
218
218
|
|
219
219
|
#### Stdio Mode (Default - Recommended for Claude Desktop)
|
220
|
-
|
220
|
+
|
221
|
+
**Easiest Setup (Recommended)**
|
221
222
|
```bash
|
222
223
|
python install_claude.py
|
223
224
|
```
|
224
225
|
|
225
|
-
|
226
|
+
This script automatically:
|
227
|
+
- Prompts you for your Google OAuth credentials (Client ID and Secret)
|
228
|
+
- Creates the Claude Desktop config file in the correct location
|
229
|
+
- Sets up all necessary environment variables
|
230
|
+
- No manual file editing required!
|
231
|
+
|
232
|
+
After running the script, just restart Claude Desktop and you're ready to go.
|
233
|
+
|
234
|
+
**Manual Claude Configuration (Alternative)**
|
226
235
|
1. Open Claude Desktop Settings → Developer → Edit Config
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
236
|
+
1. **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
237
|
+
2. **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
238
|
+
2. Add the server configuration:
|
239
|
+
```json
|
240
|
+
{
|
241
|
+
"mcpServers": {
|
242
|
+
"google_workspace": {
|
243
|
+
"command": "uvx",
|
244
|
+
"args": ["workspace-mcp"],
|
245
|
+
"env": {
|
246
|
+
"GOOGLE_OAUTH_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
|
247
|
+
"GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret",
|
248
|
+
"OAUTHLIB_INSECURE_TRANSPORT": "1"
|
249
|
+
}
|
250
|
+
}
|
251
|
+
}
|
252
|
+
}
|
253
|
+
```
|
231
254
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
"command": "uvx",
|
237
|
-
"args": ["workspace-mcp"],
|
238
|
-
"env": {
|
239
|
-
"GOOGLE_OAUTH_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
|
240
|
-
"GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret"
|
241
|
-
}
|
242
|
-
}
|
243
|
-
}
|
244
|
-
}
|
245
|
-
```
|
255
|
+
**Get Google OAuth Credentials** (if you don't have them):
|
256
|
+
- Go to [Google Cloud Console](https://console.cloud.google.com/)
|
257
|
+
- Create a new project and enable APIs: Calendar, Drive, Gmail, Docs, Sheets, Slides, Forms, Chat
|
258
|
+
- Create OAuth 2.0 Client ID (Web application) with redirect URI: `http://localhost:8000/oauth2callback`
|
246
259
|
|
247
|
-
**
|
260
|
+
**Development Installation (For Contributors)**:
|
248
261
|
```json
|
249
262
|
{
|
250
263
|
"mcpServers": {
|
@@ -254,7 +267,8 @@ python install_claude.py
|
|
254
267
|
"cwd": "/path/to/google_workspace_mcp",
|
255
268
|
"env": {
|
256
269
|
"GOOGLE_OAUTH_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
|
257
|
-
"GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret"
|
270
|
+
"GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret",
|
271
|
+
"OAUTHLIB_INSECURE_TRANSPORT": "1"
|
258
272
|
}
|
259
273
|
}
|
260
274
|
}
|
@@ -37,7 +37,7 @@
|
|
37
37
|
### A quick plug for AI-Enhanced Docs
|
38
38
|
|
39
39
|
> **This README was crafted with AI assistance, and here's why that matters**
|
40
|
-
>
|
40
|
+
>
|
41
41
|
> 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.
|
42
42
|
>
|
43
43
|
> In this case, Sonnet 4 took a pass & a human (me) verified them 6/28/25.
|
@@ -175,34 +175,47 @@ docker run -p 8000:8000 -v $(pwd):/app workspace-mcp --transport streamable-http
|
|
175
175
|
The server supports two transport modes:
|
176
176
|
|
177
177
|
#### Stdio Mode (Default - Recommended for Claude Desktop)
|
178
|
-
|
178
|
+
|
179
|
+
**Easiest Setup (Recommended)**
|
179
180
|
```bash
|
180
181
|
python install_claude.py
|
181
182
|
```
|
182
183
|
|
183
|
-
|
184
|
+
This script automatically:
|
185
|
+
- Prompts you for your Google OAuth credentials (Client ID and Secret)
|
186
|
+
- Creates the Claude Desktop config file in the correct location
|
187
|
+
- Sets up all necessary environment variables
|
188
|
+
- No manual file editing required!
|
189
|
+
|
190
|
+
After running the script, just restart Claude Desktop and you're ready to go.
|
191
|
+
|
192
|
+
**Manual Claude Configuration (Alternative)**
|
184
193
|
1. Open Claude Desktop Settings → Developer → Edit Config
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
194
|
+
1. **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
195
|
+
2. **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
196
|
+
2. Add the server configuration:
|
197
|
+
```json
|
198
|
+
{
|
199
|
+
"mcpServers": {
|
200
|
+
"google_workspace": {
|
201
|
+
"command": "uvx",
|
202
|
+
"args": ["workspace-mcp"],
|
203
|
+
"env": {
|
204
|
+
"GOOGLE_OAUTH_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
|
205
|
+
"GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret",
|
206
|
+
"OAUTHLIB_INSECURE_TRANSPORT": "1"
|
207
|
+
}
|
208
|
+
}
|
209
|
+
}
|
210
|
+
}
|
211
|
+
```
|
189
212
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
"command": "uvx",
|
195
|
-
"args": ["workspace-mcp"],
|
196
|
-
"env": {
|
197
|
-
"GOOGLE_OAUTH_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
|
198
|
-
"GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret"
|
199
|
-
}
|
200
|
-
}
|
201
|
-
}
|
202
|
-
}
|
203
|
-
```
|
213
|
+
**Get Google OAuth Credentials** (if you don't have them):
|
214
|
+
- Go to [Google Cloud Console](https://console.cloud.google.com/)
|
215
|
+
- Create a new project and enable APIs: Calendar, Drive, Gmail, Docs, Sheets, Slides, Forms, Chat
|
216
|
+
- Create OAuth 2.0 Client ID (Web application) with redirect URI: `http://localhost:8000/oauth2callback`
|
204
217
|
|
205
|
-
**
|
218
|
+
**Development Installation (For Contributors)**:
|
206
219
|
```json
|
207
220
|
{
|
208
221
|
"mcpServers": {
|
@@ -212,7 +225,8 @@ python install_claude.py
|
|
212
225
|
"cwd": "/path/to/google_workspace_mcp",
|
213
226
|
"env": {
|
214
227
|
"GOOGLE_OAUTH_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
|
215
|
-
"GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret"
|
228
|
+
"GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret",
|
229
|
+
"OAUTHLIB_INSECURE_TRANSPORT": "1"
|
216
230
|
}
|
217
231
|
}
|
218
232
|
}
|
@@ -37,100 +37,94 @@ def create_comment_tools(app_name: str, file_id_param: str):
|
|
37
37
|
reply_func_name = f"reply_to_{app_name}_comment"
|
38
38
|
resolve_func_name = f"resolve_{app_name}_comment"
|
39
39
|
|
40
|
-
# Create
|
40
|
+
# Create functions without decorators first, then apply decorators with proper names
|
41
41
|
if file_id_param == "document_id":
|
42
|
-
@server.tool()
|
43
42
|
@require_google_service("drive", "drive_read")
|
44
43
|
@handle_http_errors(read_func_name)
|
45
44
|
async def read_comments(service, user_google_email: str, document_id: str) -> str:
|
46
|
-
"""Read all comments from a Google
|
45
|
+
"""Read all comments from a Google Document."""
|
47
46
|
return await _read_comments_impl(service, app_name, document_id)
|
48
47
|
|
49
|
-
@server.tool()
|
50
48
|
@require_google_service("drive", "drive_file")
|
51
49
|
@handle_http_errors(create_func_name)
|
52
50
|
async def create_comment(service, user_google_email: str, document_id: str, comment_content: str) -> str:
|
53
|
-
"""Create a new comment on a Google
|
51
|
+
"""Create a new comment on a Google Document."""
|
54
52
|
return await _create_comment_impl(service, app_name, document_id, comment_content)
|
55
53
|
|
56
|
-
@server.tool()
|
57
54
|
@require_google_service("drive", "drive_file")
|
58
55
|
@handle_http_errors(reply_func_name)
|
59
56
|
async def reply_to_comment(service, user_google_email: str, document_id: str, comment_id: str, reply_content: str) -> str:
|
60
57
|
"""Reply to a specific comment in a Google Document."""
|
61
58
|
return await _reply_to_comment_impl(service, app_name, document_id, comment_id, reply_content)
|
62
59
|
|
63
|
-
@server.tool()
|
64
60
|
@require_google_service("drive", "drive_file")
|
65
61
|
@handle_http_errors(resolve_func_name)
|
66
62
|
async def resolve_comment(service, user_google_email: str, document_id: str, comment_id: str) -> str:
|
67
|
-
"""Resolve a comment in a Google
|
63
|
+
"""Resolve a comment in a Google Document."""
|
68
64
|
return await _resolve_comment_impl(service, app_name, document_id, comment_id)
|
69
65
|
|
70
66
|
elif file_id_param == "spreadsheet_id":
|
71
|
-
@server.tool()
|
72
67
|
@require_google_service("drive", "drive_read")
|
73
68
|
@handle_http_errors(read_func_name)
|
74
69
|
async def read_comments(service, user_google_email: str, spreadsheet_id: str) -> str:
|
75
|
-
"""Read all comments from a Google
|
70
|
+
"""Read all comments from a Google Spreadsheet."""
|
76
71
|
return await _read_comments_impl(service, app_name, spreadsheet_id)
|
77
72
|
|
78
|
-
@server.tool()
|
79
73
|
@require_google_service("drive", "drive_file")
|
80
74
|
@handle_http_errors(create_func_name)
|
81
75
|
async def create_comment(service, user_google_email: str, spreadsheet_id: str, comment_content: str) -> str:
|
82
|
-
"""Create a new comment on a Google
|
76
|
+
"""Create a new comment on a Google Spreadsheet."""
|
83
77
|
return await _create_comment_impl(service, app_name, spreadsheet_id, comment_content)
|
84
78
|
|
85
|
-
@server.tool()
|
86
79
|
@require_google_service("drive", "drive_file")
|
87
80
|
@handle_http_errors(reply_func_name)
|
88
81
|
async def reply_to_comment(service, user_google_email: str, spreadsheet_id: str, comment_id: str, reply_content: str) -> str:
|
89
|
-
"""Reply to a specific comment in a Google
|
82
|
+
"""Reply to a specific comment in a Google Spreadsheet."""
|
90
83
|
return await _reply_to_comment_impl(service, app_name, spreadsheet_id, comment_id, reply_content)
|
91
84
|
|
92
|
-
@server.tool()
|
93
85
|
@require_google_service("drive", "drive_file")
|
94
86
|
@handle_http_errors(resolve_func_name)
|
95
87
|
async def resolve_comment(service, user_google_email: str, spreadsheet_id: str, comment_id: str) -> str:
|
96
|
-
"""Resolve a comment in a Google
|
88
|
+
"""Resolve a comment in a Google Spreadsheet."""
|
97
89
|
return await _resolve_comment_impl(service, app_name, spreadsheet_id, comment_id)
|
98
90
|
|
99
91
|
elif file_id_param == "presentation_id":
|
100
|
-
@server.tool()
|
101
92
|
@require_google_service("drive", "drive_read")
|
102
93
|
@handle_http_errors(read_func_name)
|
103
94
|
async def read_comments(service, user_google_email: str, presentation_id: str) -> str:
|
104
|
-
"""Read all comments from a Google
|
95
|
+
"""Read all comments from a Google Presentation."""
|
105
96
|
return await _read_comments_impl(service, app_name, presentation_id)
|
106
97
|
|
107
|
-
@server.tool()
|
108
98
|
@require_google_service("drive", "drive_file")
|
109
99
|
@handle_http_errors(create_func_name)
|
110
100
|
async def create_comment(service, user_google_email: str, presentation_id: str, comment_content: str) -> str:
|
111
|
-
"""Create a new comment on a Google
|
101
|
+
"""Create a new comment on a Google Presentation."""
|
112
102
|
return await _create_comment_impl(service, app_name, presentation_id, comment_content)
|
113
103
|
|
114
|
-
@server.tool()
|
115
104
|
@require_google_service("drive", "drive_file")
|
116
105
|
@handle_http_errors(reply_func_name)
|
117
106
|
async def reply_to_comment(service, user_google_email: str, presentation_id: str, comment_id: str, reply_content: str) -> str:
|
118
|
-
"""Reply to a specific comment in a Google
|
107
|
+
"""Reply to a specific comment in a Google Presentation."""
|
119
108
|
return await _reply_to_comment_impl(service, app_name, presentation_id, comment_id, reply_content)
|
120
109
|
|
121
|
-
@server.tool()
|
122
110
|
@require_google_service("drive", "drive_file")
|
123
111
|
@handle_http_errors(resolve_func_name)
|
124
112
|
async def resolve_comment(service, user_google_email: str, presentation_id: str, comment_id: str) -> str:
|
125
|
-
"""Resolve a comment in a Google
|
113
|
+
"""Resolve a comment in a Google Presentation."""
|
126
114
|
return await _resolve_comment_impl(service, app_name, presentation_id, comment_id)
|
127
115
|
|
128
|
-
# Set the proper function names
|
116
|
+
# Set the proper function names and register with server
|
129
117
|
read_comments.__name__ = read_func_name
|
130
118
|
create_comment.__name__ = create_func_name
|
131
119
|
reply_to_comment.__name__ = reply_func_name
|
132
120
|
resolve_comment.__name__ = resolve_func_name
|
133
121
|
|
122
|
+
# Register tools with the server using the proper names
|
123
|
+
server.tool()(read_comments)
|
124
|
+
server.tool()(create_comment)
|
125
|
+
server.tool()(reply_to_comment)
|
126
|
+
server.tool()(resolve_comment)
|
127
|
+
|
134
128
|
return {
|
135
129
|
'read_comments': read_comments,
|
136
130
|
'create_comment': create_comment,
|
@@ -36,12 +36,7 @@ def check_credentials_directory_permissions(credentials_dir: str = None) -> None
|
|
36
36
|
except (PermissionError, OSError) as e:
|
37
37
|
raise PermissionError(f"Cannot write to existing credentials directory '{os.path.abspath(credentials_dir)}': {e}")
|
38
38
|
else:
|
39
|
-
# Directory doesn't exist,
|
40
|
-
parent_dir = os.path.dirname(os.path.abspath(credentials_dir)) or "."
|
41
|
-
if not os.access(parent_dir, os.W_OK):
|
42
|
-
raise PermissionError(f"Cannot create credentials directory '{os.path.abspath(credentials_dir)}': insufficient permissions in parent directory '{parent_dir}'")
|
43
|
-
|
44
|
-
# Test creating the directory
|
39
|
+
# Directory doesn't exist, try to create it and its parent directories
|
45
40
|
try:
|
46
41
|
os.makedirs(credentials_dir, exist_ok=True)
|
47
42
|
# Test writing to the new directory
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "workspace-mcp"
|
7
|
-
version = "1.
|
7
|
+
version = "1.1.1"
|
8
8
|
description = "Comprehensive, highly performant Google Workspace Streamable HTTP & SSE MCP Server for Calendar, Gmail, Docs, Sheets, Slides & Drive"
|
9
9
|
readme = "README.md"
|
10
10
|
keywords = [ "mcp", "google", "workspace", "llm", "ai", "claude", "model", "context", "protocol", "server"]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: workspace-mcp
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.1.1
|
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
|
@@ -79,7 +79,7 @@ Dynamic: license-file
|
|
79
79
|
### A quick plug for AI-Enhanced Docs
|
80
80
|
|
81
81
|
> **This README was crafted with AI assistance, and here's why that matters**
|
82
|
-
>
|
82
|
+
>
|
83
83
|
> 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.
|
84
84
|
>
|
85
85
|
> In this case, Sonnet 4 took a pass & a human (me) verified them 6/28/25.
|
@@ -217,34 +217,47 @@ docker run -p 8000:8000 -v $(pwd):/app workspace-mcp --transport streamable-http
|
|
217
217
|
The server supports two transport modes:
|
218
218
|
|
219
219
|
#### Stdio Mode (Default - Recommended for Claude Desktop)
|
220
|
-
|
220
|
+
|
221
|
+
**Easiest Setup (Recommended)**
|
221
222
|
```bash
|
222
223
|
python install_claude.py
|
223
224
|
```
|
224
225
|
|
225
|
-
|
226
|
+
This script automatically:
|
227
|
+
- Prompts you for your Google OAuth credentials (Client ID and Secret)
|
228
|
+
- Creates the Claude Desktop config file in the correct location
|
229
|
+
- Sets up all necessary environment variables
|
230
|
+
- No manual file editing required!
|
231
|
+
|
232
|
+
After running the script, just restart Claude Desktop and you're ready to go.
|
233
|
+
|
234
|
+
**Manual Claude Configuration (Alternative)**
|
226
235
|
1. Open Claude Desktop Settings → Developer → Edit Config
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
236
|
+
1. **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
237
|
+
2. **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
238
|
+
2. Add the server configuration:
|
239
|
+
```json
|
240
|
+
{
|
241
|
+
"mcpServers": {
|
242
|
+
"google_workspace": {
|
243
|
+
"command": "uvx",
|
244
|
+
"args": ["workspace-mcp"],
|
245
|
+
"env": {
|
246
|
+
"GOOGLE_OAUTH_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
|
247
|
+
"GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret",
|
248
|
+
"OAUTHLIB_INSECURE_TRANSPORT": "1"
|
249
|
+
}
|
250
|
+
}
|
251
|
+
}
|
252
|
+
}
|
253
|
+
```
|
231
254
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
"command": "uvx",
|
237
|
-
"args": ["workspace-mcp"],
|
238
|
-
"env": {
|
239
|
-
"GOOGLE_OAUTH_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
|
240
|
-
"GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret"
|
241
|
-
}
|
242
|
-
}
|
243
|
-
}
|
244
|
-
}
|
245
|
-
```
|
255
|
+
**Get Google OAuth Credentials** (if you don't have them):
|
256
|
+
- Go to [Google Cloud Console](https://console.cloud.google.com/)
|
257
|
+
- Create a new project and enable APIs: Calendar, Drive, Gmail, Docs, Sheets, Slides, Forms, Chat
|
258
|
+
- Create OAuth 2.0 Client ID (Web application) with redirect URI: `http://localhost:8000/oauth2callback`
|
246
259
|
|
247
|
-
**
|
260
|
+
**Development Installation (For Contributors)**:
|
248
261
|
```json
|
249
262
|
{
|
250
263
|
"mcpServers": {
|
@@ -254,7 +267,8 @@ python install_claude.py
|
|
254
267
|
"cwd": "/path/to/google_workspace_mcp",
|
255
268
|
"env": {
|
256
269
|
"GOOGLE_OAUTH_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
|
257
|
-
"GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret"
|
270
|
+
"GOOGLE_OAUTH_CLIENT_SECRET": "your-client-secret",
|
271
|
+
"OAUTHLIB_INSECURE_TRANSPORT": "1"
|
258
272
|
}
|
259
273
|
}
|
260
274
|
}
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|