Five isolated remote MCP servers for Gmail, Calendar, Drive, Sheets, and Docs
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http · http counts 27 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
calendar_get_event
-
calendar_get_freebusy
-
calendar_list_calendars
-
calendar_list_event_instances
-
calendar_search_events
-
drive_copy_file
-
drive_create_folder
-
drive_download_file
-
drive_get_file
-
drive_list_folder
-
drive_search_files
-
drive_upload_file
-
gmail_create_draft
-
gmail_delete_draft
-
gmail_get_draft
-
gmail_get_message
-
gmail_get_thread
-
gmail_list_drafts
-
gmail_list_labels
-
gmail_reply
-
gmail_search_messages
-
gmail_search_threads
-
gmail_send_draft
-
gmail_send_message
-
sheets_add_sheet
-
sheets_create_spreadsheet
-
sheets_update_range
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 32029ab · analyzer v33 · 2d ago
danger signals15
- over-broad OAuth scope https://www.googleapis.com/auth/documents
expected for this server's purpose
hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/docs/constants.py :4
'https://www.googleapis.com/auth/documents', - over-broad OAuth scope gmail.modify hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/gmail/constants.py :3
GMAIL_SCOPE = 'https://www.googleapis.com/auth/gmail.modify' - over-broad OAuth scope https://www.googleapis.com/auth/spreadsheets
expected for this server's purpose
hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/sheets/constants.py :4
'https://www.googleapis.com/auth/spreadsheets', - over-broad OAuth scope https://www.googleapis.com/auth/documents
expected for this server's purpose
hawkxdev-google-workspace-mcp-32029ab/tests/core/test_google_consent.py :25
'https://www.googleapis.com/auth/documents', - over-broad OAuth scope gmail.modify hawkxdev-google-workspace-mcp-32029ab/tests/services/conftest.py :142
scopes=('https://www.googleapis.com/auth/gmail.modify',), - over-broad OAuth scope https://www.googleapis.com/auth/documents
expected for this server's purpose
hawkxdev-google-workspace-mcp-32029ab/tests/services/docs_provider.py :393
scopes=('https://www.googleapis.com/auth/documents',), - over-broad OAuth scope https://www.googleapis.com/auth/documents
expected for this server's purpose
hawkxdev-google-workspace-mcp-32029ab/tests/services/test_docs_client.py :73
scopes=('https://www.googleapis.com/auth/documents',), - over-broad OAuth scope https://www.googleapis.com/auth/documents
expected for this server's purpose
hawkxdev-google-workspace-mcp-32029ab/tests/services/test_docs_factory.py :124
'https://www.googleapis.com/auth/documents', - over-broad OAuth scope https://www.googleapis.com/auth/documents
expected for this server's purpose
hawkxdev-google-workspace-mcp-32029ab/tests/services/test_docs_utf16.py :191
'https://www.googleapis.com/auth/documents', - over-broad OAuth scope https://www.googleapis.com/auth/spreadsheets
expected for this server's purpose
hawkxdev-google-workspace-mcp-32029ab/tests/services/test_sheets_a1.py :127
assert 'https://www.googleapis.com/auth/spreadsheets' in SHEETS_SCOPES - over-broad OAuth scope https://www.googleapis.com/auth/spreadsheets
expected for this server's purpose
hawkxdev-google-workspace-mcp-32029ab/tests/services/test_sheets_batch.py :154
scopes=('https://www.googleapis.com/auth/spreadsheets',), - over-broad OAuth scope https://www.googleapis.com/auth/spreadsheets
expected for this server's purpose
hawkxdev-google-workspace-mcp-32029ab/tests/services/test_sheets_client.py :186
scopes=('https://www.googleapis.com/auth/spreadsheets',), - over-broad OAuth scope https://www.googleapis.com/auth/spreadsheets
expected for this server's purpose
hawkxdev-google-workspace-mcp-32029ab/tests/services/test_sheets_factory.py :125
'https://www.googleapis.com/auth/spreadsheets', - over-broad OAuth scope https://www.googleapis.com/auth/spreadsheets
expected for this server's purpose
hawkxdev-google-workspace-mcp-32029ab/tests/services/test_sheets_structure.py :154
scopes=('https://www.googleapis.com/auth/spreadsheets',), - over-broad OAuth scope https://www.googleapis.com/auth/spreadsheets
expected for this server's purpose
hawkxdev-google-workspace-mcp-32029ab/tests/services/test_sheets_values.py :174
scopes=('https://www.googleapis.com/auth/spreadsheets',),
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 187
filesystem 51
- fs hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/audit/logger.py :8
from pathlib import Path - fs hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/auth/state.py :19
from pathlib import Path - fs hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/cli/authorize.py :10
from pathlib import Path - fs hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/cli/cutover.py :14
from pathlib import Path - fs hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/cli/oauth_admin.py :9
from pathlib import Path - fs hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/common/config.py :7
from pathlib import Path - fs hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/common/managed_files.py :14
from pathlib import Path - fs hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/evals/apply.py :14
from pathlib import Path - fs hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/evals/cli.py :8
from pathlib import Path - fs hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/evals/models.py :9
from pathlib import Path - fs hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/google_auth/consent.py :11
from pathlib import Path - fs hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/google_auth/store.py :13
from pathlib import Path - fs hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/drive/client.py :7
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/common/test_managed_files.py :8
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/conftest.py :3
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_audit.py :7
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_audit_propagation.py :8
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_authorize_cli.py :9
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_bearer_oauth_only.py :7
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_cutover_cli.py :5
import shutil - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_factory_isolation.py :2
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_forwarded_host.py :4
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_google_auth.py :16
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_google_consent.py :8
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_hardening_regressions.py :9
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_mcp_path.py :3
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_oauth.py :11
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_oauth_admin.py :11
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_oauth_refresh.py :9
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_oauth_state.py :14
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_resource_canonicalization.py :8
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_resource_isolation.py :5
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_service_config.py :4
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_startup_validation.py :3
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_state_ownership.py :7
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/evals/conftest.py :7
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/evals/test_apply.py :9
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/evals/test_bindings.py :7
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/services/conftest.py :7
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/services/test_calendar_factory.py :5
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/services/test_docs_factory.py :5
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/services/test_drive_creates.py :9
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/services/test_drive_downloads.py :8
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/services/test_drive_factory.py :5
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/services/test_drive_mutations.py :8
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/services/test_gmail_tools.py :5
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/services/test_sheets_factory.py :5
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/smoke/test_cutover_ingress_script.py :5
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/smoke/test_deploy_assets.py :3
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/smoke/test_multi_service_smoke.py :2
from pathlib import Path - fs (weak) hawkxdev-google-workspace-mcp-32029ab/tests/smoke/test_public_pages.py :3
from pathlib import Path
shell / exec 3
- shell hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/cli/cutover.py :11
import subprocess - shell (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_google_auth.py :10
import subprocess - shell (weak) hawkxdev-google-workspace-mcp-32029ab/tests/smoke/test_cutover_ingress_script.py :4
import subprocess
network 5
- net hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/auth/bearer.py :8
from urllib.parse import unquote, urlsplit - net hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/auth/oauth.py :10
import urllib.parse - net hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/common/config.py :8
from urllib.parse import urlsplit - net hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/evals/apply.py :16
from urllib.parse import quote - net (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_oauth.py :9
import urllib.parse
database 13
- db hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/auth/state.py :13
import sqlite3 - db hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/cli/oauth_admin.py :7
import sqlite3 - db (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_cutover_cli.py :6
import sqlite3 - db (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_factory_isolation.py :1
import sqlite3 - db (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_mcp_path.py :1
import sqlite3 - db (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_oauth.py :8
import sqlite3 - db (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_oauth_admin.py :9
import sqlite3 - db (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_oauth_refresh.py :7
import sqlite3 - db (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_oauth_state.py :9
import sqlite3 - db (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_resource_isolation.py :3
import sqlite3 - db (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_startup_validation.py :2
import sqlite3 - db (weak) hawkxdev-google-workspace-mcp-32029ab/tests/core/test_state_ownership.py :3
import sqlite3 - db (weak) hawkxdev-google-workspace-mcp-32029ab/tests/smoke/test_multi_service_smoke.py :1
import sqlite3
tool registrations 27
- calendar_list_calendars hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/calendar/tools/read.py :43
- calendar_search_events hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/calendar/tools/read.py :58
- calendar_get_event hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/calendar/tools/read.py :89
- calendar_list_event_instances hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/calendar/tools/read.py :104
- calendar_get_freebusy hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/calendar/tools/read.py :137
- drive_download_file hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/drive/tools/files.py :46
- drive_create_folder hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/drive/tools/files.py :102
- drive_upload_file hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/drive/tools/files.py :132
- drive_copy_file hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/drive/tools/files.py :336
- drive_search_files hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/drive/tools/read.py :37
- drive_get_file hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/drive/tools/read.py :150
- drive_list_folder hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/drive/tools/read.py :171
- gmail_list_drafts hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/gmail/tools/drafts.py :36
- gmail_get_draft hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/gmail/tools/drafts.py :57
- gmail_create_draft hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/gmail/tools/drafts.py :78
- gmail_delete_draft hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/gmail/tools/drafts.py :140
- gmail_send_draft hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/gmail/tools/drafts.py :153
- gmail_search_messages hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/gmail/tools/read.py :36
- gmail_search_threads hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/gmail/tools/read.py :59
- gmail_get_message hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/gmail/tools/read.py :82
- gmail_get_thread hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/gmail/tools/read.py :96
- gmail_list_labels hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/gmail/tools/read.py :110
- gmail_send_message hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/gmail/tools/send.py :29
- gmail_reply hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/gmail/tools/send.py :71
- sheets_create_spreadsheet hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/sheets/tools/structure.py :44
- sheets_add_sheet hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/sheets/tools/structure.py :87
- sheets_update_range hawkxdev-google-workspace-mcp-32029ab/src/google_workspace_mcp/services/sheets/tools/values.py :54
declared dependencies 8
- mcp@>=2,<3
- starlette@>=1.6,<2
- uvicorn@>=0.52,<0.53
- google-auth@>=2.56,<3
- google-auth-oauthlib@>=1.4,<2
- google-api-python-client@>=2.198,<3
- pydantic@>=2.12,<3
- pydantic-settings@>=2.0,<3