Add Google Drive connector: mcp_local, OAuth2 (same pattern as Gmail/GCal), 8 tools, verify with Drive API probe, SVG icons
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Verify Google Drive OAuth credentials are valid.
|
||||
|
||||
Priority:
|
||||
1. DRIVE_CREDS_JSON env var — authorized_user JSON injected by Skald.
|
||||
2. GOOGLE_CREDS_PATH env var → file on disk (standalone).
|
||||
3. Default path ./secrets/google_creds.json (standalone).
|
||||
|
||||
Loads credentials and does one cheap API probe (files.list(maxResults=1)).
|
||||
|
||||
Output: single JSON object on stdout:
|
||||
{"ok": true, "message": "..."}
|
||||
{"ok": false, "message": "..."}
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
def _check_api(creds) -> None:
|
||||
"""Perform a live Drive API probe with the given credentials."""
|
||||
try:
|
||||
from google.auth.transport.requests import Request
|
||||
from googleapiclient.discovery import build
|
||||
except ImportError as e:
|
||||
_fail(f"Missing dependencies: {e}. Install google-api-python-client and google-auth.")
|
||||
return
|
||||
|
||||
if creds.expired and creds.refresh_token:
|
||||
try:
|
||||
creds.refresh(Request())
|
||||
except Exception as e:
|
||||
_fail(f"Token refresh failed: {e}")
|
||||
return
|
||||
|
||||
try:
|
||||
service = build("drive", "v3", credentials=creds)
|
||||
result = service.files().list(maxResults=1, q="trashed=false").execute()
|
||||
count = len(result.get("files", []))
|
||||
_ok(f"Google Drive API is reachable. {count} recent file(s) found.")
|
||||
except Exception as e:
|
||||
_fail(f"API probe failed: {e}")
|
||||
|
||||
|
||||
def main() -> None:
|
||||
# Priority 1: env var with full JSON (Skald mode)
|
||||
raw = os.environ.get("DRIVE_CREDS_JSON")
|
||||
if raw:
|
||||
try:
|
||||
from google.oauth2.credentials import Credentials
|
||||
creds = Credentials.from_authorized_user_info(
|
||||
json.loads(raw),
|
||||
["https://www.googleapis.com/auth/drive"],
|
||||
)
|
||||
_check_api(creds)
|
||||
return
|
||||
except ImportError as e:
|
||||
_fail(f"Missing dependencies: {e}. Install google-api-python-client and google-auth.")
|
||||
return
|
||||
except Exception as e:
|
||||
_fail(f"Failed to load credentials from DRIVE_CREDS_JSON: {e}")
|
||||
return
|
||||
|
||||
# Priority 2/3: file-based (standalone use)
|
||||
creds_path = os.environ.get(
|
||||
"GOOGLE_CREDS_PATH",
|
||||
os.path.join(os.path.dirname(__file__), "secrets", "google_creds.json"),
|
||||
)
|
||||
|
||||
if not os.path.exists(creds_path):
|
||||
_fail(f"Credentials not found. Set DRIVE_CREDS_JSON env var (Skald mode) or "
|
||||
f"place credentials file at {creds_path} (standalone mode).")
|
||||
return
|
||||
|
||||
try:
|
||||
from google.oauth2.credentials import Credentials
|
||||
creds = Credentials.from_authorized_user_file(
|
||||
creds_path,
|
||||
["https://www.googleapis.com/auth/drive"],
|
||||
)
|
||||
except ImportError as e:
|
||||
_fail(f"Missing dependencies: {e}. Install google-api-python-client and google-auth.")
|
||||
return
|
||||
except Exception as e:
|
||||
_fail(f"Failed to load credentials: {e}")
|
||||
return
|
||||
|
||||
_check_api(creds)
|
||||
|
||||
|
||||
def _ok(message: str) -> None:
|
||||
json.dump({"ok": True, "message": message}, sys.stdout)
|
||||
sys.stdout.write("\n")
|
||||
|
||||
|
||||
def _fail(message: str) -> None:
|
||||
json.dump({"ok": False, "message": message}, sys.stdout)
|
||||
sys.stdout.write("\n")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user