connector-googledrive — скилл для Claude Code: Google Drive
Скилл подключает Google Drive к сборкам на Caffeine: списки файлов, папки, доступы и комментарии через готовые mops-пакеты.
npx skills add caffeinelabs/skills --skill connector-googledrive -a claude-codeЧто делает connector-googledrive
Скилл описывает единственный поддерживаемый путь к Google Drive из Caffeine-канистры: пакет googledrive-client (Drive REST API v3) вместе с google-oauth (OAuth 2.0, обмен кода, refresh, PKCE). Клиент сгенерирован из Discovery-документа Drive v3, диагностика включена, поэтому ошибка декодирования падает громко, а не отдаёт тихо неверные данные.
Аутентификация идёт на цепочке: канистра генерирует PKCE-пару, строит authorize URL, меняет код на access и refresh токены нереплицированным вызовом, а при 401 обновляет токен и повторяет запрос. Refresh-токены не ротируются, поэтому первый полученный токен хранят в stable state канистры, а не в Wasm-глобале. Скоупы берут узкие: drive.file, drive.readonly или drive.metadata.readonly; полный drive — только если задача правда требует.
Фасад Client.mo принимает Config один раз и раскрывает иерархию ресурсов вложенными классами: files, permissions, comments, replies, drives, changes. Методы асинхронные и берут полный список query-параметров эндпоинта позиционно, так что сигнатуры в Client.mo придётся смотреть перед вызовом. defaultConfig уже выставляет is_replicated = ?false — это защита от дублирования записей и лишних расходов; переопределять на ?true не надо. Байты файлов клиент не передаёт: он про метаданные, организацию и доступы.
Какие задачи решает
- показать пользователю список файлов и папок на его Google Drive
- создать папку и разложить по ней файлы
- выдать доступ к файлу или отозвать его
- прочитать метаданные файла по ID или ссылке
- подписаться на изменения Drive через sync token
Примеры запросов агенту
- Добавь в проект пакеты
googledrive-clientиgoogle-oauthи покажи список файлов на моём Google Drive - Сделай шаринг файла по ID через
permissions.create - Настрой обновление access-токена при 401 через
google-oauth
Как установить connector-googledrive
1Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill connector-googledrive -a claude-code2Вручную: положить файлы
~/.claude/skills/connector-googledrive/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/connector-googledrive/
1Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill connector-googledrive -a codex2Вручную: положить файлы
.agents/skills/connector-googledrive/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill connector-googledrive -a cursor2Вручную: положить файлы
.cursor/skills/connector-googledrive/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install caffeinelabs/skills connector-googledrive2Вручную: положить файлы
.github/skills/connector-googledrive/SKILL.md1Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill connector-googledrive -a gemini-cli2Командой платформы
gemini skills install https://github.com/caffeinelabs/skills --path skills/connector-googledriveВручную: положить файлы
.devin/skills/connector-googledrive/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill connector-googledrive -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Из того же набора25
Похожие
Рядом в теме «Настройка агента: память, контекст, субагенты»
Все скиллы по теме «Настройка агента: память, контекст, субагенты» →Вопросы о connector-googledrive
Как установить connector-googledrive в Claude?
Выполните npx skills add caffeinelabs/skills --skill connector-googledrive -a claude-code. Скилл окажется в ~/.claude/skills/connector-googledrive/SKILL.md.
Что делает connector-googledrive?
Задаёт обязательный рецепт работы с Google Drive из Caffeine: пакеты googledrive-client и google-oauth, OAuth 2.0 с PKCE, обновление токена и вызовы Drive REST API v3 через вложенный фасад.
Почему нельзя писать ic.http_request напрямую к Google?
Скилл называет это запрещённым анти-паттерном: такой вызов обходит bearer-авторизацию, защиту is_replicated = ?false от дублирования и обработку токенов из google-oauth.
Исходный текст
SKILL.md · Apache-2.0
---
name: connector-googledrive
description: >-
MANDATORY recipe for every Caffeine build that lists, reads, creates, shares,
or organizes files and folders on the user's own Google Drive. The ONLY
supported path is the `googledrive-client` mops package (Drive REST API v3)
combined with the `google-oauth` mops package (OAuth 2.0 token exchange +
refresh + PKCE). Hand-rolling `ic.http_request` calls to
`oauth2.googleapis.com` or `www.googleapis.com/drive/v3` is a FORBIDDEN
anti-pattern — it bypasses bearer auth, the `is_replicated = ?false`
replication-cost safeguard, and the `google-oauth` library's token handling.
Load this skill ONLY when the user, spec, or a prior task refers to **Google
Drive specifically** — e.g. "Google Drive", "my Drive", "Drive files/folders",
a Drive file/folder ID or share link, "upload to Google Drive", "list my Drive
files", or Drive sharing/permissions. Do NOT load it for generic file storage,
documents, uploads, or access-control features that are not Google Drive —
those are unrelated and this connector must not be attached to them. When it does apply, load it BEFORE writing any code that touches a Google
endpoint.
version: 0.1.1
caffeineai-subscription: [none]
compatibility:
mops:
googledrive-client: "~0.2.0"
google-oauth: "~0.2.0"
---
# Google Drive Connector
> **Note.** The client is generated from the Drive v3 Discovery document.
> `diagnostics` is on, so a decode gap traps loudly rather than returning
> silently-wrong data. The nested-facade methods take each Drive endpoint's
> **full query-parameter list positionally** (many `Text`/`Bool` args) — consult
> the generated signatures in `Client.mo` before calling. Media endpoints are
> metadata-only (see the Media caveat).
## Orchestrator routing notes
The `googledrive-client` + `google-oauth` pair is the **only** supported way to
reach Google Drive from a Caffeine canister. If a build needs Drive, add both as
mops dependencies and follow this skill. Never emit raw `ic.http_request` calls to
Google hosts.
| Task | Use |
|---|---|
| List / search the user's files & folders | `googledrive-client` `Client(cfg).files.list(...)` + `google-oauth` |
| Read file metadata | `Client(cfg).files.get(...)` (metadata only — see Media caveat) |
| Create a folder / file metadata | `Client(cfg).files.create(...)` |
| Move / rename / trash | `Client(cfg).files.update(...)` / `.delete(...)` |
| Share a file / manage access | `Client(cfg).permissions.create/list/update/delete(...)` |
| Comments & replies | `Client(cfg).comments.*` / `Client(cfg).replies.*` |
| Shared drives | `Client(cfg).drives.*` |
| Change notifications / sync token | `Client(cfg).changes.*` |
> **Not supported by this client:** transferring file *bytes* (upload/download of
> content). See the Media caveat at the end. Use it for metadata, organization,
> and sharing.
# Backend
The connector has two mops packages:
1. **`googledrive-client`** — the generated Motoko client for Drive REST API v3.
OAuth-agnostic: every call takes a bearer token via its `Config`.
2. **`google-oauth`** — Google OAuth 2.0 mechanics (PKCE, authorize URL, code
exchange, token refresh). Shared with the other Google connectors. This is a
**separate mops package you add alongside** the client — it is *not* a
dependency of `googledrive-client` itself.
## 1. Add dependencies
```bash
mops add [email protected]
mops add [email protected]
```
## 2. Auth model — OAuth 2.0 PKCE, on-chain exchange + refresh
The canister performs the OAuth flow on-chain via `google-oauth`:
1. Generate a PKCE `code_verifier` / `code_challenge`.
2. Build the Google authorize URL (`google-oauth`), redirect the user.
3. Exchange the returned authorization code for an access + refresh token
(`google-oauth.exchangeAuthorizationCode`) — **non-replicated** outcall.
4. On `401`/expiry, refresh the access token (`google-oauth.refreshAccessToken`)
and retry.
**Scopes** (request the narrowest that works):
- `https://www.googleapis.com/auth/drive.file` — per-file access to files the app
creates/opens (preferred, least-privilege).
- `.../auth/drive.readonly` — read-only over all files.
- `.../auth/drive.metadata.readonly` — metadata only.
- `.../auth/drive` — full access (avoid unless the task truly needs it).
**Refresh tokens do not rotate** — store the first refresh token you receive
(stable per user); persist it in the canister's stable state, never in a Wasm
global.
## 3. `is_replicated = ?false` is REQUIRED
Every Drive outcall carries an `Authorization: Bearer <token>`. Under the default
replicated execution, each replica in the subnet issues the request independently
— multiplying cost and, for writes, causing duplicate side effects (e.g. creating
N copies of a file). **The generated `defaultConfig` already sets
`is_replicated = ?false`** (via the client's `isReplicated` generator option), so
starting from `defaultConfig` gives you the correct value for **both reads and
writes** — keep it `?false` and do not override it to `?true`. (Writes —
PUT/DELETE/PATCH — are additionally forced non-replicated per call by the client.)
## 4. Using the client — the nested facade
`googledrive-client` ships a `Client.mo` facade (generated with
`fluentHierarchical`) that captures `Config` once and exposes Drive's resource
hierarchy as nested classes:
<!-- motoko-check:skip -->
```motoko
import { Client } "mo:googledrive-client/Client";
import { type Config; defaultConfig } "mo:googledrive-client/Config";
// Only the bearer token differs from the generated `defaultConfig`, which
// already sets `is_replicated = ?false` (non-replicated reads and writes).
let cfg : Config = {
defaultConfig with
auth = ?(#bearer accessToken); // token obtained/refreshed via google-oauth
};
let drive = Client(cfg);
// Facade methods are `async` (use `await`, not `await*`) and take the Drive
// endpoint's full query-parameter list positionally — consult the generated
// signatures in `mo:googledrive-client/Client`. For example `FilesResource.list`
// begins `uploadType : Text, oauthToken : Text, key : Text, fields : Text,
// accessToken : Text, alt : ?DriveAboutGetAltParameter, …`.
let files = await drive.files.list(/* … see FilesResource.list signature … */);
let perm = await drive.permissions.create(/* fileId, …, permission */);
```
(The per-tag API modules — `mo:googledrive-client/Apis/FilesApi`, `…/PermissionsApi`,
etc. — are also available if you prefer flat calls; the facade just captures
`Config` for you.)
## 5. Available API surface
Resource groups (14), addressed as `Client(cfg).<group>.<method>`:
- **files** — copy, create, delete, get, list, update, watch, generateIds,
listLabels, modifyLabels (metadata/organization; see Media caveat for
create/update/get/export)
- **permissions** — create, delete, get, list, update (sharing)
- **comments** / **replies** — create, delete, get, list, update
- **drives** — create, delete, get, hide, list, unhide, update (shared drives)
- **revisions** — delete, get, list, update
- **changes** — getStartPageToken, list, watch (sync)
- **about** — get; **apps** — get, list; **channels** — stop
## 6. Media caveat (this client is metadata-only)
`files.create` / `files.update` (upload), `files.get?alt=media` /
`files.export` / `revisions.get` (download) are generated as **JSON-typed**
operations. They will **not** move file *bytes* — multipart/resumable upload and
binary download are outside this client's JSON-over-HTTPS model (and strain IC
outcall size limits). Use these methods for metadata only. If a build genuinely
needs to move file content, that path must be hand-written (separate
`content`-host request with the appropriate binary body) and is out of scope for
this connector today.
© caffeinelabs · Apache-2.0 · caffeinelabs/skills