agentleFS
bakissationbakissation/mcp-google-multi/skills/google-workspace/SKILL.md

google-workspace

Skill21 starsChanged 30 days agoMITView on GitHub

Use this skill when working with the mcp-google-multi MCP server to call Gmail, Drive, Calendar, Sheets, Docs, Contacts, Tasks, Meet, Chat, Slides, Forms, Search Console, Admin, or any other Google Workspace tool it exposes. Load it before the first discover or tool call in a session that touches this server, and whenever an account selector, a write-profile refusal, or an unfamiliar argument name needs resolving.

49 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use heartmula, jupyter-live-kernel and 10 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • math-incSkill

    heartmula

    Set up and run HeartMuLa, the open-source music generation model family (Suno-like). Generates full songs from lyrics + tags with multilingual support.

    Also in 6 projects that use this

  • math-incSkill

    jupyter-live-kernel

    Use a live Jupyter kernel for stateful, iterative Python execution via hamelnb. Load this skill when the task involves exploration, iteration, or inspecting intermediate results — data science, ML experimentation, API exploration, or building up complex code step-by-step. Uses terminal to run CLI commands against a live Jupyter kernel. No new tools required.

    Also in 5 projects that use this

  • Tommy-ywSkill

    songwriting-and-ai-music

    Songwriting craft, AI music generation prompts (Suno focus), parody/adaptation techniques, phonetic tricks, and lessons learned. These are tools and ideas, not rules. Break any of them when the art calls for it.

    Also in 7 projects that use this

  • john-data-chenSkill

    teams-meeting-pipeline

    Operate the Teams meeting summary pipeline via Hermes CLI — summarize meetings, inspect pipeline status, replay jobs, manage Microsoft Graph subscriptions.

    Also in 5 projects that use this

  • Tommy-ywSkill

    maps

    Location intelligence — geocode a place, reverse-geocode coordinates, find nearby places (46 POI categories), driving/walking/cycling distance + time, turn-by-turn directions, timezone lookup, bounding box + area for a named place, and POI search within a rectangle. Uses OpenStreetMap + Overpass + OSRM. Free, no API key.

    Also in 8 projects that use this

  • mae616Skill

    p5js

    p5.js(クリエイティブコーディング)のProcessing由来「コードでスケッチ」思想を軸に、setup/drawループ・座標系・インタラクション・パフォーマンス最適化を整理する。p5.js、Processing、クリエイティブコーディング、ジェネラティブアート、インタラクティブ表現、ビジュアルプログラミング、Canvas描画、パーティクル、フラクタル、ノイズ表現に関する相談で必ず使うこと。ユーザーが「コードでアート」「動くビジュアル」「インタラクティブな描画」と言った場合にも適用する。

    Also in 6 projects that use this

  • +5 more from math-inc

The file

We split this skill into the rules it gives an agent

11 rules. 0 are common, 1 is distinctive, and 10 are very specific to this project.

  • 0

    Common

    Most of the 45 edited versions we read keep these.

  • 1

    Distinctive

    This author's own choices. Worth a look.

  • 10

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Every operational tool takes an account argument naming one of the configured aliases (an alias is a short local name, not the email …

    line 17
  2. Very specific:

    Call account_list first. It returns each alias, its email, admin flag, token status, and which alias (if any) is the configured default.

    line 21
  3. Very specific:

    If a default account is set, omit account on a single-account call.

    line 23
  4. Very specific:

    If no default is set and more than one account is configured, you must pass account explicitly.

    line 25
  5. Very specific:

    Read tools accept "*" for the account argument to fan out across every configured account (bounded concurrency), or a comma-separated …

    line 30
  6. Very specific:

    Call {service}_discover (e.g.

    line 44
  7. Distinctive:

    Call the tool by its exact name from that catalog.

    line 48
  8. Very specific:

    gmail_search(since, until): when you have no stored history ID (e.g.

    line 72
  9. Very specific:

    Leave full unset (it defaults to the trimmed shape) on fat readers such as gmail_read(full) and gmail_read_thread(full).

    line 87
  10. Very specific:

    If a service has no curated or generated tool for the operation you need (or discovery/reference/ doesn't cover it):

    line 146
  11. Very specific:

    Call google_api_search(query, api, maxResults) with keywords (optionally scoped to one api alias) to find the Discovery method id, e.g.

    line 149

“Common” is measured: kept by at least 6 in 10 of the 45 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Google Workspace MCP server

This server exposes Google Workspace as MCP tools: a small set of curated, hand-written tools per service, a long tail of generated tools (one per Google API Discovery method), and an escape hatch for anything else. Reading this skill before the first call avoids the two most common failures: guessing an account when none was configured as default, and guessing an argument name instead of using the one the tool actually declares.

1. Pick the account

Every operational tool takes an account argument naming one of the configured aliases (an alias is a short local name, not the email address itself). Before calling anything:

  1. Call account_list first. It returns each alias, its email, admin flag, token status, and which alias (if any) is the configured default.
  2. If a default account is set, omit account on a single-account call; the server injects the default. Passing an alias is always safe too.
  3. If no default is set and more than one account is configured, you must pass account explicitly. A call that omits it then fails with E_NO_DEFAULT_ACCOUNT and a hint listing every alias=email pair so you can match the one the user means by email, name, or context, rather than guessing.
  4. Read tools accept "*" for the account argument to fan out across every configured account (bounded concurrency), or a comma-separated subset such as "work,personal". Fan-out is read-only by design: write tools, and the handful of read tools that save a file to local disk (drive_download, drive_export, gmail_download_attachment), take exactly one account. A fan-out call returns { results: [{ account, ok, data|error }], partial } so one account failing never hides the others.

2. Discover before calling

Tools are hidden from the model's context until revealed, but every tool is always callable by exact name (discovery is a listing optimization, not a security boundary).

  1. Call {service}_discover (e.g. gmail_discover, drive_discover) for the service you need. It returns that service's catalog: each tool's name, a one-line summary, its arguments, and its read/create/update/delete class. An optional query argument filters the catalog by keyword.
  2. Call the tool by its exact name from that catalog. Do not guess a name by analogy with another service.
  3. discover_all reveals every curated tool across all services at once, useful before a session doing substantial cross-service work, and discover_reset collapses back to the configured default afterward to reclaim context.
  4. A client that loads tool schemas on demand (rather than accepting everything a server advertises) may need its own tool-search or tool-load step before a newly revealed tool is actually callable. If a call to a tool you just discovered fails as unknown on such a client, look for that client's own load-tool mechanism before retrying the Google call itself.

3. Incremental Gmail sweeps

For a recurring "what's new in this mailbox" check, do not re-run the same broad gmail_search on a timer. Two cheaper patterns:

  • gmail_list_history(startHistoryId, historyTypes) with a startHistoryId you stored from a previous gmail_get_profile or gmail_list_history response. It returns exactly the mailbox changes since that point (messages added/deleted, labels added/removed), optionally filtered by historyTypes. Store the newest history ID you observe and pass it next time.
  • gmail_search(since, until) when you have no stored history ID (e.g. the first sweep, or after a gap long enough that Gmail's history window has expired). Both accept an ISO 8601 date or a date-time with an explicit Z or UTC offset, never a bare local time.

4. Keep results small

Large responses cost context and, for list endpoints, risk a page that looks complete but isn't. Prefer the per-call controls over reading everything and discarding most of it:

  • On a generated tool or the google_api_call(queryParams) escape hatch, pass Google's own fields partial-response query param to restrict a response to the properties you actually need. Curated tools already pick a response shape for you, so they don't expose fields themselves.
  • Leave full unset (it defaults to the trimmed shape) on fat readers such as gmail_read(full) and gmail_read_thread(full); pass full: true only when you actually need the untruncated body. calendar_list_events and calendar_list_instances always return a trimmed view with no full argument to toggle; call calendar_get_event for one event's complete data.
  • Cap the page on list and search tools (the argument name varies by tool: drive_search(maxResults) and contacts_search(pageSize) are two examples; check {service}_discover or the reference table for the exact name), and follow nextPageToken rather than assuming a short list is the whole answer. Where a list reports truncated, there is more to fetch.
  • On Gmail, pass headers on gmail_read(headers) or gmail_read_batch(headers) to fetch only id, threadId, labelIds, and the named header values, skipping full body decoding entirely when you only need metadata like Subject or From.

5. Write profiles

Reads are never gated. Writes (create/update/delete) are deny-by-default and controlled by the deployment's GOOGLE_PROFILE:

  • read-only (the default): every write refused.
  • safe-writes: ordinary creates and updates on your own data are allowed, and so is moving an item to or from Trash (gmail_trash, drive_trash, and their untrash equivalents) since that is recoverable. Permanent deletes (emptying Trash, a hard Gmail or Drive delete), drive_transfer with move: true, and privileged writes (anything needing an admin, Vault, reseller, or script scope, or registering a push channel) stay refused under this profile.
  • full-writes: everything permitted by OAuth scope and the account's grants, privileged writes included. An operator's allow and deny patterns can widen or narrow any profile.

A write a profile refuses comes back as { error: "write_disabled", message, hint, retriable: false } rather than a silent no-op or a generic failure. The hint names the exact rule that refused it (a deny pattern, the privileged-write rule, or the active profile) and what would need to change; read it rather than retrying the same call. This applies to curated tools. A generated tool or google_api_call follows a different rule: see section 7.

6. Argument names are exact

The server never rewrites an argument name: if you pass pageSize where a tool expects maxResults, the call fails rather than silently mapping one to the other. Always use the exact name shown by {service}_discover or the service's reference table in reference/ next to this file. When in doubt, discover the tool again and read its declared arguments rather than guessing from memory or from another service's convention.

Each reference/<service>.md file tables every curated tool for that service: its name, its read/create/update/delete class, a one-line summary, and every argument with its type, whether it's required, and its description. Generated tools (the long tail, one per Google API Discovery method) are not tabled individually: they take Google's own Discovery parameter names directly, and calling {service}_discover lists each one with its arguments at call time.

7. Escape hatch for anything not covered

If a service has no curated or generated tool for the operation you need (or discovery/reference/ doesn't cover it):

  1. Call google_api_search(query, api, maxResults) with keywords (optionally scoped to one api alias) to find the Discovery method id, e.g. drive.revisions.list.
  2. Call google_api_call(api, methodId, pathParams, queryParams, body) with that method id and whichever of path params, query params, or a JSON body it needs.

A read through the escape hatch is never gated, same as everywhere else. A write (the class is derived from the method's HTTP verb and name) follows a different rule than named tools: GOOGLE_READ_ONLY or a matching GOOGLE_WRITE_DENY still refuses outright, and GOOGLE_PROFILE=full-writes (with GOOGLE_OUTBOUND_ALLOWLIST unset) still allows outright, but every other case, including GOOGLE_WRITE_ALLOW (allow lists no longer open the escape hatch at all), asks the connected human to confirm the real call before it runs. Expect a write through google_api_call or a generated tool (anything called by its full name directly, not through a curated tool) to pause for that confirmation unless the deployment runs full-writes; a client that cannot be asked gets back { error: "elicitation_unsupported", ... } instead, and a decline or cancel comes back as { error: "write_declined", ... }; neither is worth retrying without changing the write-control configuration or using a curated tool instead. Over HTTP a client on the 2026-07-28 protocol revision gets an "input required" result carrying the confirmation prompt: show it to the user and repeat the same call with their answer attached. Otherwise, on the 2025 revision with the operator's opt-in, a write can come back as { error: "confirmation_required", summary, confirmToken }: show the summary to the user and, only if they agree, repeat the identical call with confirmToken added (it works once and expires; an error of "confirmation_invalid" means start over). The escape hatch returns JSON only (binary media is refused with a pointer to drive_download / drive_export), and a response over about 100k characters may be cut by the client, so narrow a large request. Prefer a named curated or generated tool when one exists: it is more token-lean and better typed than building the call by hand.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.