Chart To Drive
ai-analyst-lab/ai-analyst
Standardized workflow for uploading local chart PNGs to Google Drive and making them available for insertion into Google Docs and Slides.
Find, read, export, edit, and manage the user's Google Drive, Docs, Sheets, and Slides through per-user OAuth.
$ npx skills add yc-software/qm --skill google-drive-sheets -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install yc-software/qm google-drive-sheets --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/yc-software/qm.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills-seed/google-drive-sheets .claude/skills/google-drive-sheets && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "google-drive-sheets" agent skill from https://github.com/yc-software/qm/tree/main/skills-seed/google-drive-sheets into .claude/skills/google-drive-sheets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "google-drive-sheets", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/yc-software/qm/tree/main/skills-seed/google-drive-sheetsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add yc-software/qm --skill google-drive-sheets -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install yc-software/qm google-drive-sheets --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yc-software/qm.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills-seed/google-drive-sheets .agents/skills/google-drive-sheets && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "google-drive-sheets" agent skill from https://github.com/yc-software/qm/tree/main/skills-seed/google-drive-sheets into .agents/skills/google-drive-sheets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "google-drive-sheets", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add yc-software/qm --skill google-drive-sheets -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install yc-software/qm google-drive-sheets --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yc-software/qm.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills-seed/google-drive-sheets .cursor/skills/google-drive-sheets && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "google-drive-sheets" agent skill from https://github.com/yc-software/qm/tree/main/skills-seed/google-drive-sheets into .cursor/skills/google-drive-sheets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "google-drive-sheets", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/yc-software/qm.git --path skills-seed/google-drive-sheets--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add yc-software/qm --skill google-drive-sheets -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install yc-software/qm google-drive-sheets --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yc-software/qm.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills-seed/google-drive-sheets .gemini/skills/google-drive-sheets && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "google-drive-sheets" agent skill from https://github.com/yc-software/qm/tree/main/skills-seed/google-drive-sheets into .gemini/skills/google-drive-sheets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "google-drive-sheets", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install yc-software/qm google-drive-sheetsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add yc-software/qm --skill google-drive-sheets -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/yc-software/qm.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills-seed/google-drive-sheets .github/skills/google-drive-sheets && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "google-drive-sheets" agent skill from https://github.com/yc-software/qm/tree/main/skills-seed/google-drive-sheets into .github/skills/google-drive-sheets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "google-drive-sheets", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add yc-software/qm --skill google-drive-sheets -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install yc-software/qm google-drive-sheets --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yc-software/qm.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills-seed/google-drive-sheets .opencode/skills/google-drive-sheets && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "google-drive-sheets" agent skill from https://github.com/yc-software/qm/tree/main/skills-seed/google-drive-sheets into .opencode/skills/google-drive-sheets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "google-drive-sheets", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
google-drive-sheetsFind, read, export, edit, and manage the user's Google Drive, Docs, Sheets, and Slides through per-user OAuth.
Google Drive Sheets is an agent skill from yc-software/qm. Find, read, export, edit, and manage the user's Google Drive, Docs, Sheets, and Slides through per-user OAuth.
Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Documents & Office, covering Slides and decks, Cloud office suites and OAuth and OpenID Connect. It works with Google Drive and Google Docs. The repository describes itself as: Multiplayer agent harness for work. The licence is MIT.
Read from SKILL.md and the folder at commit 23af31b. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
curlFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
googleapis.comdocs.googleapis.comslides.googleapis.comsheets.googleapis.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Google Drive Sheets loads about 2.3k tokens when it runs. Until then it costs about 33 tokens; SKILL.md has 697 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from yc-software/qm at commit 23af31b, republished under its MIT licence (© yc-software). 697 words, ~2,280 tokens.
.claude/skills/google-drive-sheets/SKILL.md (or your agent's skills folder).Use this skill when the user asks about Drive files, Google Docs, Google Sheets, Google Slides, sharing/access problems, or reading/editing any of that content.
This is an OAuth connector. The resolved user's Google OAuth token already lives on your computer as an environment variable, one per Google API host (the way a logged-in CLI's cached credential would):
$VAULT_TOKEN_WWW_GOOGLEAPIS_COM — for www.googleapis.com (Drive)$VAULT_TOKEN_SHEETS_GOOGLEAPIS_COM — for sheets.googleapis.com (Sheets)$VAULT_TOKEN_DOCS_GOOGLEAPIS_COM — for docs.googleapis.com (Docs)$VAULT_TOKEN_SLIDES_GOOGLEAPIS_COM — for slides.googleapis.com (Slides)These all carry the same Google token (one OAuth grant spans every Google API), so
if a host-specific var is empty (e.g. an older connection made before that host was
added), $VAULT_TOKEN_WWW_GOOGLEAPIS_COM works as the bearer for any Google API host.
Call the Google APIs directly over https:// with curl and pass the matching token
as a bearer header (-H "Authorization: Bearer $VAULT_TOKEN_..."). Do not ask the user
for a token, log it, or use another principal's credential or a service fallback.
If the variable is empty or the API returns 401/403 or a file is inaccessible, tell the user which Google account/principal needs access and whether they should connect Google or share the file with that account.
Search Drive by name, owner, MIME type, or recency:
curl -sS --get 'https://www.googleapis.com/drive/v3/files' \
-H "Authorization: Bearer $VAULT_TOKEN_WWW_GOOGLEAPIS_COM" \
--data-urlencode "q=name contains 'deadline' and trashed=false" \
--data-urlencode 'fields=nextPageToken,files(id,name,mimeType,webViewLink,owners(emailAddress,displayName),modifiedTime)' \
--data-urlencode 'corpora=allDrives' \
--data-urlencode 'includeItemsFromAllDrives=true' \
--data-urlencode 'supportsAllDrives=true' \
--data-urlencode 'pageSize=100'The three allDrives params matter: without them the API searches only "My Drive",
and files living in shared drives — most team docs — are invisible, so you'd wrongly
report a file doesn't exist. If the response has a nextPageToken, keep fetching with
pageToken= before concluding anything is missing.
For a specific file, fetch metadata first:
curl -sS 'https://www.googleapis.com/drive/v3/files/FILE_ID?supportsAllDrives=true&fields=id,name,mimeType,webViewLink,owners(emailAddress,displayName),capabilities' \
-H "Authorization: Bearer $VAULT_TOKEN_WWW_GOOGLEAPIS_COM"Add supportsAllDrives=true to every per-file call (get, download, PATCH, DELETE) —
without it, operations on shared-drive files 404.
For uploaded files, download media:
curl -sS 'https://www.googleapis.com/drive/v3/files/FILE_ID?alt=media' \
-H "Authorization: Bearer $VAULT_TOKEN_WWW_GOOGLEAPIS_COM" \
-o inbox/drive-file.binFor Google Docs/Sheets/Slides, export to a useful format:
curl -sS --get 'https://www.googleapis.com/drive/v3/files/FILE_ID/export' \
-H "Authorization: Bearer $VAULT_TOKEN_WWW_GOOGLEAPIS_COM" \
--data-urlencode 'mimeType=text/plain'Keep source file ids and links in your answer so claims can be traced.
Read values from a named range:
curl -sS 'https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID/values/Sheet1!A1:Z100' \
-H "Authorization: Bearer $VAULT_TOKEN_SHEETS_GOOGLEAPIS_COM"For workbook structure:
curl -sS 'https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID?includeGridData=false' \
-H "Authorization: Bearer $VAULT_TOKEN_SHEETS_GOOGLEAPIS_COM"Creating, moving, sharing, or editing Drive/Sheets content is a write. Prepare the exact change, summarize the target file/range, and ask for approval before running it.
After approval, update values:
curl -sS -X PUT 'https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID/values/Sheet1!A1:B2?valueInputOption=USER_ENTERED' \
-H "Authorization: Bearer $VAULT_TOKEN_SHEETS_GOOGLEAPIS_COM" \
-H 'content-type: application/json' \
--data @values.jsonAlways report the file id/link and the modified range.
You can save a file you produced (a report, an export, a generated artifact) into the user's Drive. This is a write — summarize what you're uploading and where, and get approval first.
After approval, multipart-upload the bytes. Send the metadata part then the file part:
curl -sS -X POST 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id,name,webViewLink' \
-H "Authorization: Bearer $VAULT_TOKEN_WWW_GOOGLEAPIS_COM" \
-F "metadata={\"name\":\"report.pdf\"};type=application/json;charset=UTF-8" \
-F "file=@report.pdf;type=application/pdf"To place it in a specific folder, add "parents":["FOLDER_ID"] to the metadata. The
response returns the new file's id and webViewLink — report both so the user can open
it.
The connector has full Drive access, so you can rename, move, and delete any file the
connected user can reach — including pre-existing files in shared folders, not just ones
this connector created. These are destructive writes: name the exact file (id + name) and
the change, and get approval first. Deletes are especially irreversible — prefer trashing
(trashed=true) over permanent DELETE unless the user asks to purge.
Rename a file:
curl -sS -X PATCH 'https://www.googleapis.com/drive/v3/files/FILE_ID?fields=id,name' \
-H "Authorization: Bearer $VAULT_TOKEN_WWW_GOOGLEAPIS_COM" \
-H 'content-type: application/json' \
--data '{"name":"new-name.pdf"}'Move a file (swap its parent folder):
curl -sS -X PATCH 'https://www.googleapis.com/drive/v3/files/FILE_ID?addParents=DEST_FOLDER_ID&removeParents=OLD_FOLDER_ID&fields=id,parents' \
-H "Authorization: Bearer $VAULT_TOKEN_WWW_GOOGLEAPIS_COM"Trash a file (reversible) or permanently delete it:
curl -sS -X PATCH 'https://www.googleapis.com/drive/v3/files/FILE_ID?fields=id,trashed' \
-H "Authorization: Bearer $VAULT_TOKEN_WWW_GOOGLEAPIS_COM" \
-H 'content-type: application/json' \
--data '{"trashed":true}'
curl -sS -X DELETE 'https://www.googleapis.com/drive/v3/files/FILE_ID' \
-H "Authorization: Bearer $VAULT_TOKEN_WWW_GOOGLEAPIS_COM"Report the file id/link and what changed.
Editing a Doc's content uses the Docs API (docs.googleapis.com), not the Drive export
endpoint (export is read-only). First read the document to find the character indexes you
want to edit:
curl -sS 'https://docs.googleapis.com/v1/documents/DOCUMENT_ID' \
-H "Authorization: Bearer $VAULT_TOKEN_DOCS_GOOGLEAPIS_COM"The response's body.content[] carries each element's startIndex/endIndex — use those
to target an edit. All edits go through :batchUpdate. This is a write — summarize the
exact change and get approval first. Insert text at an index:
curl -sS -X POST 'https://docs.googleapis.com/v1/documents/DOCUMENT_ID:batchUpdate' \
-H "Authorization: Bearer $VAULT_TOKEN_DOCS_GOOGLEAPIS_COM" \
-H 'content-type: application/json' \
--data '{"requests":[{"insertText":{"location":{"index":1},"text":"Hello\n"}}]}'Other common requests in the same requests[] array: deleteContentRange
({"range":{"startIndex":N,"endIndex":M}}), replaceAllText
({"containsText":{"text":"OLD","matchCase":true},"replaceText":"NEW"}), and
insertInlineImage. Create a new doc with POST https://docs.googleapis.com/v1/documents
and a {"title":"..."} body. Report the document id/link and what changed.
Slides editing uses the Slides API (slides.googleapis.com). Read the deck to find slide
and element object ids:
curl -sS 'https://slides.googleapis.com/v1/presentations/PRESENTATION_ID' \
-H "Authorization: Bearer $VAULT_TOKEN_SLIDES_GOOGLEAPIS_COM"Edits go through :batchUpdate. Get approval first, then e.g. replace text across the deck:
curl -sS -X POST 'https://slides.googleapis.com/v1/presentations/PRESENTATION_ID:batchUpdate' \
-H "Authorization: Bearer $VAULT_TOKEN_SLIDES_GOOGLEAPIS_COM" \
-H 'content-type: application/json' \
--data '{"requests":[{"replaceAllText":{"containsText":{"text":"{{TITLE}}","matchCase":true},"replaceText":"Q3 Review"}}]}'Other common requests: createSlide, insertText ({"objectId":"...","text":"...","insertionIndex":0}),
and createImage. Create a new deck with POST https://slides.googleapis.com/v1/presentations
and a {"title":"..."} body. Report the presentation id/link and what changed.
© yc-software, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills-seed/google-drive-sheets of yc-software/qm.
Open the folder on GitHubat commit 23af31b
Google Drive Sheets next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Google Drive Sheets this skillyc-software/qm | 15k | — | ~2.3k | Automated safety check: Pass | MIT | |
| Chart To Driveai-analyst-lab/ai-analyst | 304 | — | ~1.4k | Automated safety check: Pass | MIT | |
| Google Docs, Sheets and Slides Editingasgeirtj/system_prompts_leaks | 69k | — | ~3.5k | Automated safety check: Warn | CC0-1.0 | |
| Google Workspace Opsaffaan-m/ECC | 274k | 2 repos | ~684 | Automated safety check: Pass | MIT | |
| Google Workspaceespennilsen/pi | 122 | — | ~3.4k | Automated safety check: Pass | MIT | |
| Google Workspacegoogle/adk-recipes | 10k | — | ~4.6k | Automated safety check: Pass | Apache-2.0 |
ai-analyst-lab/ai-analyst
Standardized workflow for uploading local chart PNGs to Google Drive and making them available for insertion into Google Docs and Slides.
asgeirtj/system_prompts_leaks
Guidance for creating and editing Google Docs, Sheets and Slides through connectors, with per-app API rules and helper scripts for positions, ranges and slide layout.
affaan-m/ECC
Operate across Google Drive, Docs, Sheets, and Slides as one workflow surface for plans, trackers, decks, and shared documents.
espennilsen/pi
Manage Google Workspace via the gws CLI — Drive, Gmail, Sheets, Docs, Slides, People, Chat, Meet, Forms, and cross-service workflows.
google/adk-recipes
Read/write Google Drive, Docs, Sheets, Gmail, Calendar, Chat, Tasks, Slides via the gws CLI.
ai-analyst-lab/ai-analyst
Export analysis results in different formats for different audiences — email summaries, Slack updates, decision briefs, Google Docs with embedded charts, Word documents, slide decks, or raw data CSVs.
yc-software/qm
Act for an org admin — the admin API (scope directory, per-scope config & SOUL, any scope's memory, transcripts & captured prompts, files, user roster & external users, audit/errors/metrics/egress)…
yc-software/qm
Drive a real stealth browser from your shell — act on websites (order food, file an expense, pull data behind a login), with per-person persistent sign-ins via the provider's managed auth (Kernel…
yc-software/qm
Show the app connection picker or setup widget when users ask to connect apps, reopen setup, or need an app that isn't connected yet.
yc-software/qm
Run the current worktree as a production-shaped local dev instance with web, Slack, or both, on a real LLM + Postgres.
yc-software/qm
Work with GitHub and GitLab repositories through resident gh/glab/git auth on the agent computer.
yc-software/qm
Read and act on the user's Gmail, Google Calendar, and Google Tasks through per-user OAuth.
Works with
Categories
Find, read, export, edit, and manage the user's Google Drive, Docs, Sheets, and Slides through per-user OAuth. Google Drive Sheets is an agent skill from yc-software/qm. Find, read, export, edit, and manage the user's Google Drive, Docs, Sheets, and Slides through per-user OAuth.
Google Drive Sheets fits situations like: tasks that involve Slides and decks; tasks that involve Cloud office suites; tasks that involve OAuth and OpenID Connect.
Run `npx skills add yc-software/qm --skill google-drive-sheets -a claude-code`. Or copy the skill folder (skills-seed/google-drive-sheets in yc-software/qm) into .claude/skills/google-drive-sheets in your project. Claude Code loads it when a task matches its description.
Run `npx skills add yc-software/qm --skill google-drive-sheets -a codex`. Or copy the skill folder (skills-seed/google-drive-sheets in yc-software/qm) into .agents/skills/google-drive-sheets in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add yc-software/qm --skill google-drive-sheets -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/google-drive-sheets, .gemini/skills/google-drive-sheets, .github/skills/google-drive-sheets and .opencode/skills/google-drive-sheets in your project.
Going by SKILL.md and its folder, Google Drive Sheets needs the command-line tools its instructions call (curl).
SKILL.md names 4 domains. In commands or code: googleapis.com, docs.googleapis.com, slides.googleapis.com and sheets.googleapis.com; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Google Drive Sheets is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.3k tokens (SKILL.md is roughly 9.1k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Google Drive Sheets: Chart To Drive (ai-analyst-lab/ai-analyst, 304 stars), Google Docs, Sheets and Slides Editing (asgeirtj/system_prompts_leaks, 69k stars), Google Workspace Ops (affaan-m/ECC, 274k stars) and Google Workspace (espennilsen/pi, 122 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
yc-software (a GitHub organization) maintains it in yc-software/qm, which has 15,357 GitHub stars. The repository holds 29 skills in this directory. The repository was last updated on October 6, 2026.
Source: yc-software/qm on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.