Enables CLI access to Google Drive via gdrive binary with 1Password OAuth. Lists files, downloads, and syncs folders after preflight setup and auth checks.
From productivity-toolsnpx claudepluginhub terrylica/cc-skills --plugin productivity-toolsThis skill is limited to using the following tools:
references/evolution-log.mdreferences/gdrive-api-setup.mdreferences/oauth-clients.mdscripts/bun.lockscripts/cli.tsscripts/lib/auth.tsscripts/lib/config.tsscripts/lib/drive.tsscripts/lib/index.tsscripts/lib/types.tsscripts/package.jsonscripts/tsconfig.jsonExecutes pre-written implementation plans: critically reviews, follows bite-sized steps exactly, runs verifications, tracks progress with checkpoints, uses git worktrees, stops on blockers.
Guides idea refinement into designs: explores context, asks questions one-by-one, proposes approaches, presents sections for approval, writes/review specs before coding.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
List, download, and sync files from Google Drive programmatically via Claude Code.
Self-Evolving Skill: This skill improves through use. If instructions are wrong, parameters drifted, or a workaround was needed — fix this file immediately, don't defer. Only update for real, reproducible issues.
CRITICAL: You MUST complete this preflight checklist before running any gdrive commands. Do NOT skip steps.
ls -la "$HOME/.claude/plugins/marketplaces/cc-skills/plugins/gdrive-tools/skills/gdrive-access/scripts/gdrive" 2>/dev/null || echo "BINARY_NOT_FOUND"
If BINARY_NOT_FOUND: Build it first:
cd ~/.claude/plugins/marketplaces/cc-skills/plugins/gdrive-tools/skills/gdrive-access/scripts && bun install && bun run build
echo "GDRIVE_OP_UUID: ${GDRIVE_OP_UUID:-NOT_SET}"
If NOT_SET: You MUST run the Setup Flow below. Do NOT proceed to gdrive commands.
op account list 2>&1 | head -3
If error or not signed in: Inform user to run op signin first.
Follow these steps IN ORDER. Use AskUserQuestion at decision points.
command -v op && echo "OP_CLI_INSTALLED" || echo "OP_CLI_MISSING"
If OP_CLI_MISSING: Stop and inform user:
1Password CLI is required. Install with:
brew install 1password-cli
op item list --vault Employee --format json 2>/dev/null | jq -r '.[] | select(.title | test("drive|oauth|google"; "i")) | "\(.id)\t\(.title)"'
Parse the output and proceed based on results:
If items found, use AskUserQuestion with discovered items:
AskUserQuestion({
questions: [{
question: "Which 1Password item contains your Google Drive OAuth credentials?",
header: "Drive OAuth",
options: [
// POPULATE FROM op item list RESULTS - example:
{ label: "Google Drive API (56peh...)", description: "OAuth client in Employee vault" },
{ label: "Gmail API - dental-quizzes (abc12...)", description: "Can also access Drive" },
],
multiSelect: false
}]
})
If NO items found, use AskUserQuestion to guide setup:
AskUserQuestion({
questions: [{
question: "No Google Drive OAuth credentials found in 1Password. How would you like to proceed?",
header: "Setup",
options: [
{ label: "Create new OAuth credentials (Recommended)", description: "I'll guide you through Google Cloud Console setup" },
{ label: "I have credentials elsewhere", description: "Help me add them to 1Password" },
{ label: "Skip for now", description: "I'll set this up later" }
],
multiSelect: false
}]
})
After user selects an item (with UUID), use AskUserQuestion:
AskUserQuestion({
questions: [{
question: "Add GDRIVE_OP_UUID to .mise.local.toml in current project?",
header: "Configure",
options: [
{ label: "Yes, add to .mise.local.toml (Recommended)", description: "Creates/updates gitignored config file" },
{ label: "Show me the config only", description: "I'll add it manually" }
],
multiSelect: false
}]
})
If "Yes, add to .mise.local.toml":
.mise.local.toml existsGDRIVE_OP_UUID to [env] section[env]
GDRIVE_OP_UUID = "<selected-uuid>"
.mise.local.toml is in .gitignoreIf "Show me the config only": Output the TOML for user to add manually.
mise trust 2>/dev/null || true
cd . && echo "GDRIVE_OP_UUID after reload: ${GDRIVE_OP_UUID:-NOT_SET}"
If still NOT_SET: Inform user to restart their shell or run source ~/.zshrc.
GDRIVE_OP_UUID="${GDRIVE_OP_UUID}" $HOME/.claude/plugins/marketplaces/cc-skills/plugins/gdrive-tools/skills/gdrive-access/scripts/gdrive list 1wqqqvBmeUFYuwOOEQhzoChC7KzAk-mAS
If OAuth prompt appears: This is expected on first run. Browser will open for Google consent.
GDRIVE_CLI="$HOME/.claude/plugins/marketplaces/cc-skills/plugins/gdrive-tools/skills/gdrive-access/scripts/gdrive"
# List files in a folder
$GDRIVE_CLI list <folder_id>
# List with details (size, modified date)
$GDRIVE_CLI list <folder_id> --verbose
# Search for files
$GDRIVE_CLI search "name contains 'training'"
# Get file info
$GDRIVE_CLI info <file_id>
# Download a single file
$GDRIVE_CLI download <file_id> -o ./output.pdf
# Sync entire folder to local directory
$GDRIVE_CLI sync <folder_id> -o ./output_dir
# Sync with subfolders
$GDRIVE_CLI sync <folder_id> -o ./output_dir -r
# JSON output (for parsing)
$GDRIVE_CLI list <folder_id> --json
Google Drive folder URL:
https://drive.google.com/drive/folders/1wqqqvBmeUFYuwOOEQhzoChC7KzAk-mAS
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This is the folder ID
| Query | Description |
|---|---|
name contains 'keyword' | Name contains keyword |
name = 'exact name' | Exact name match |
mimeType = 'application/pdf' | By file type |
modifiedTime > '2026-01-01' | Modified after date |
trashed = false | Not in trash |
'<folderId>' in parents | In specific folder |
Reference: https://developers.google.com/drive/api/guides/search-files
| Variable | Required | Description |
|---|---|---|
GDRIVE_OP_UUID | Yes | 1Password item UUID for OAuth credentials |
GDRIVE_OP_VAULT | No | 1Password vault (default: Employee) |
OAuth tokens stored at: ~/.claude/tools/gdrive-tokens/<uuid>.json
Google Docs (Docs, Sheets, Slides) are automatically exported:
| Google Type | Export Format |
|---|---|
| Document | .docx |
| Spreadsheet | .xlsx |
| Presentation | .pptx |
| Drawing | .png |
After this skill completes, reflect before closing the task:
Do NOT defer. The next invocation inherits whatever you leave behind.