Google Drive MCP Server
by Stillfrozen
README.md
---
title: "Google Drive MCP Server"
date: 2026-08-19
tags:
- проект/workspace
- подпроект/tools
- тип/guide
- область/tech
- дата/2026-08-19
---
# Google Drive MCP Server
Локальный [MCP](https://modelcontextprotocol.io/)-сервер для Cursor, Claude Code и Claude Desktop. Через него агент ищет и читает файлы на Google Drive, создаёт и правит Google Docs и Google Sheets.
Google Docs при чтении уходят в Markdown, таблицы — в CSV, презентации — в текст. Docs можно править точечно: вставка, замена, стили, заголовки, списки, переименование, дубликат. Sheets — значения, форматы, вкладки, строки и столбцы. Работает и с личным Диском, и с Shared drives.
Репозиторий: https://github.com/Stillfrozen/gdrive-mcp
Основано на [wagnerlabs/gdrive-mcp](https://github.com/wagnerlabs/gdrive-mcp).
Ключи OAuth живут только у вас на диске. В git они не попадают.
**Доступ:** приложение просит полный scope `drive` (не `drive.file`). Токен видит **весь** Google Диск этого аккаунта и может менять Docs/Sheets. Для команды лучше отдельный Google-аккаунт или Диск только с нужными папками — не админский корпоративный логин.
**Пошаговая установка в Google Cloud (проект, API, Desktop OAuth, test users):** [docs/INSTALL.ru.md](docs/INSTALL.ru.md)
Skill для агента: [skills/gdrive/SKILL.md](skills/gdrive/SKILL.md) → копируется в `~/.cursor/skills/gdrive/`.
---
## Быстрый старт
Нужны Node.js 18+ (лучше 20) и Google-аккаунт, с чьего Диска будете работать.
```bash
git clone https://github.com/Stillfrozen/gdrive-mcp.git
cd gdrive-mcp
./scripts/install.sh
```
Скрипт ставит зависимости, собирает проект и проводит по Google Cloud: проект, API, экран согласия, Desktop-клиент, логин в браузере. В конце печатает готовый фрагмент для MCP-клиента.
Посмотреть шаги без изменений:
```bash
./scripts/install.sh --dry-run
```
Если хотите сами кликать в Console — весь разбор экранов в [docs/INSTALL.ru.md](docs/INSTALL.ru.md).
### Cursor
В `~/.cursor/mcp.json` (или `.cursor/mcp.json` в проекте) — только **абсолютный** путь:
```json
{
"mcpServers": {
"gdrive": {
"command": "node",
"args": ["/absolute/path/to/gdrive-mcp/dist/index.js"],
"env": {
"GDRIVE_OAUTH_PATH": "/absolute/path/to/gdrive-mcp/credentials/gcp-oauth.keys.json",
"GDRIVE_CREDENTIALS_PATH": "/absolute/path/to/gdrive-mcp/credentials/.gdrive-server-credentials.json"
}
}
}
}
```
Блок `env` не обязателен, если JSON лежат в `credentials/` репозитория. Если в файле уже есть другие серверы — добавьте `"gdrive"` внутрь `mcpServers`, не затирая остальное.
Дальше **Cursor → Settings → MCP → Reload**. Индикатор `gdrive` должен стать зелёным.
### Claude Code CLI
```bash
claude mcp add --scope user gdrive -- node /absolute/path/to/gdrive-mcp/dist/index.js
```
`--scope user` ставит сервер глобально. Снять: `claude mcp remove gdrive`.
### Claude Desktop
В `claude_desktop_config.json`:
```json
{
"mcpServers": {
"gdrive": {
"command": "node",
"args": ["/absolute/path/to/gdrive-mcp/dist/index.js"]
}
}
}
```
---
## Инструменты
### Чтение
| Tool | Что делает |
|------|------------|
| `gdrive_search` | Поиск по полному тексту или синтаксису запросов Drive |
| `gdrive_get_file` | Метаданные файла по ID |
| `gdrive_read_file` | Содержимое: Docs → Markdown, Sheets → CSV, Slides → текст |
| `gdrive_list_files` | Список файлов в папке, сортировка и пагинация |
| `gdrive_get_spreadsheet_info` | Вкладки таблицы и именованные диапазоны |
| `gdrive_get_document_info` | Метаданные Doc и опционально структурированный текст вкладки |
### Запись: Sheets
| Tool | Что делает | Destructive | Idempotent |
|------|------------|:-----------:|:----------:|
| `gdrive_create_sheet` | Новая таблица | Нет | Нет |
| `gdrive_update_sheet` | Перезаписать диапазон ячеек | Да | Да |
| `gdrive_append_sheet` | Добавить строки после данных | Нет | Нет |
| `gdrive_clear_values` | Очистить значения, формат оставить | Да | Да |
| `gdrive_format_cells` | Формат диапазона | Нет | Да |
| `gdrive_add_sheet_tab` | Новая вкладка | Нет | Нет |
| `gdrive_delete_sheet_tab` | Удалить вкладку вместе с данными | Да | Нет |
| `gdrive_rename_sheet_tab` | Переименовать вкладку | Да | Нет |
| `gdrive_insert_rows_columns` | Вставить пустые строки или столбцы | Нет | Нет |
| `gdrive_delete_rows_columns` | Удалить строки или столбцы с данными | Да | Нет |
### Запись: Docs
| Tool | Что делает | Destructive | Idempotent |
|------|------------|:-----------:|:----------:|
| `gdrive_create_doc` | Пустой Doc, можно в указанную папку | Нет | Нет |
| `gdrive_insert_doc_text` | Вставка по позиции, индексу или текстовому якорю | Нет | Нет |
| `gdrive_replace_doc_text` | Замена диапазона или якорного совпадения | Да | Нет |
| `gdrive_replace_all_doc_text` | Замена всех точных совпадений на вкладке или во всём Doc | Да | Да |
| `gdrive_delete_doc_text` | Удаление диапазона или якорного совпадения | Да | Нет |
| `gdrive_update_doc_text_style` | Жирный, цвет, шрифт, ссылка | Нет | Да |
| `gdrive_update_doc_paragraph_style` | Заголовки и выравнивание абзацев | Нет | Да |
| `gdrive_update_doc_list` | Списки: создать, сменить, снять | Да | Да |
| `gdrive_rename_doc` | Переименовать файл Doc | Да | Нет |
| `gdrive_duplicate_doc` | Дубликат, можно в указанную папку | Нет | Нет |
### Как пишутся значения в ячейки
У `gdrive_update_sheet` и `gdrive_append_sheet` параметр `value_input_option`:
- **`USER_ENTERED`** (по умолчанию) — как ввод в UI Sheets. Формула `=SUM(A1:A10)` выполнится, числа и даты отформатируются.
- **`RAW`** — как есть. Строка `=SUM(A1:A10)` останется текстом.
### Как читаются файлы
`gdrive_read_file` сам экспортирует документы Workspace:
| Формат источника | Что вернётся |
|------------------|--------------|
| Google Docs | Markdown |
| Google Sheets | CSV (только первая вкладка) |
| Google Slides | Текст |
| Google Drawings | PNG, по сути метаданные |
| Текст (`.txt`, `.json`, `.js`, …) | UTF-8 как есть |
| Бинарники (картинки, PDF, …) | Метаданные и ссылка в браузер |
Всю таблицу (вкладки, структура, запись) берите через `gdrive_get_spreadsheet_info` и write-tools Sheets, не через `gdrive_read_file`.
Для абзацев, заголовков, списков и якорных правок Doc — `gdrive_get_document_info`. В ответе есть сырой `text` и `displayText` без хвостового перевода строки абзаца; `displayText` обычно безопаснее как якорь. Markdown быстрее всего даёт `gdrive_read_file`.
---
## Модель безопасности
Несколько слоёв: аннотации MCP, «сначала прочитай», для Docs ещё ревизия и якоря, для Sheets — сверка текущих значений.
### 1. Аннотации инструментов
Каждый tool объявляет [MCP annotations](https://modelcontextprotocol.io/specification/2025-03-26/server/tools#annotations). Клиент может спросить подтверждение перед разрушающей операцией. См. колонки Destructive / Idempotent в таблицах выше.
### 2. Сначала чтение, потом запись
Сервер помнит, какие таблицы и Docs агент уже открывал **в этой сессии**.
Таблица считается прочитанной после:
- `gdrive_read_file` (ячейки как CSV)
- `gdrive_get_spreadsheet_info` (структура и вкладки)
- `gdrive_create_sheet` (агент сам только что создал файл)
Doc считается прочитанным после:
- `gdrive_read_file` (Markdown + ревизия, если Google её отдал)
- `gdrive_get_document_info` (вкладки или структурированный текст)
- `gdrive_create_doc`
Любая запись без этого шага отклоняется:
> *You must read this spreadsheet before writing to it…*
> *You must read this document before writing to it…*
Так агент реже целится не в тот файл. Список сбрасывается при рестарте процесса (каждая MCP-сессия заново).
`gdrive_get_file` сюда не входит: это только метаданные Диска, не содержимое.
### 3. Запись в Docs с учётом ревизии
Правка привязана к ревизии, которую агент читал последней:
- `conflict_mode: "strict"` (по умолчанию) — Docs `requiredRevisionId`. Если документ успели поменять, запись падает.
- `conflict_mode: "merge"` — Docs `targetRevisionId`. Google по возможности смержит с чужими правками.
Кэш структурированного содержимого живёт в сессии после `gdrive_get_document_info include_content=true`. Якорные tools (`gdrive_insert_doc_text`, `gdrive_replace_doc_text`, `gdrive_update_doc_paragraph_style`, `gdrive_update_doc_list`) берут его, пока ревизия та же. Иначе сервер заново снимает снимок.
Для точечной замены текста можно передать `expected_text`: перед отправкой сервер сверит, что в диапазоне именно эта строка.
У якорных `gdrive_delete_doc_text` и `gdrive_replace_doc_text` сервер сам отрезает только финальный перевод строки абзаца, если совпадение упирается в конец вкладки. Docs API не удаляет диапазон с терминальным newline сегмента. Явные `start_index` / `end_index` этого не делают: хвостовой newline надо исключить самим.
### 4. Предусловие для Sheets
У `gdrive_update_sheet` есть опциональный `expected_current_values` — двумерный массив той же формы, что `values`. Сервер читает ячейки и сравнивает. Не совпало — запись отказ, в ошибке фактическое содержимое.
- Точечная правка (одна ячейка, формула) — передавайте `expected_current_values`.
- Массовая операция (тысяча строк) — не передавайте, иначе удвоите запросы и упрётесь в квоту.
`include_previous_values: true` вернёт старые значения для аудита. Если задан `expected_current_values`, старые значения приходят всегда.
### Откат
Правки Docs и Sheets видны в истории версий Google Workspace. Откатить можно там.
**Ни один tool не удаляет файл целиком с Диска.** Разрушающие операции — только внутри Doc и внутри таблицы. Удалить файл — только через UI Диска.
---
## Конфигурация
Пути к ключам можно переопределить переменными окружения:
| Переменная | По умолчанию | Что это |
|------------|--------------|---------|
| `GDRIVE_OAUTH_PATH` | `credentials/gcp-oauth.keys.json` | JSON OAuth-клиента из Google Cloud |
| `GDRIVE_CREDENTIALS_PATH` | `credentials/.gdrive-server-credentials.json` | Сохранённый refresh token |
---
## Обновление
После `git pull` запускайте upgrade. Он пересоберёт проект и, если в [`setup-manifest.json`](setup-manifest.json) появились API или scope, попросит заново пройти auth:
```bash
cd /path/to/gdrive-mcp
git pull
./scripts/upgrade.sh
```
Если манифест не менялся, скрипт только пересоберёт и скажет, что вы на месте. Cursor подхватит `dist/` после Reload MCP. Перерегистрировать сервер не нужно.
> **Про scope:** сервер просит полный `drive`, а не узкий `drive.file`. Это шире, чем минимальная рекомендация Google, но иначе нельзя читать произвольный доступный файл и писать в уже существующие Docs (rename, duplicate, правки). Scope `documents` нужен для структурированного чтения и `batchUpdate`.
У External-приложения в статусе Testing refresh token живёт **7 дней**. Потом `invalid_grant` и снова `npm run auth`. Подробности и варианты (Internal / Publish) — в [docs/INSTALL.ru.md](docs/INSTALL.ru.md).
---
## Ограничения
- `gdrive_create_sheet` кладёт таблицу в корень Диска. Папку выбрать нельзя.
- `gdrive_read_file` для Sheets отдаёт CSV только с первой вкладки. Остальные вкладки — через `gdrive_get_spreadsheet_info`.
- `gdrive_read_file` для Docs всегда Markdown. Вкладки, границы абзацев, списки, якоря — `gdrive_get_document_info`.
- Перед сменой формата и структуры Doc сначала читайте `gdrive_get_document_info include_content=true`.
- `gdrive_replace_all_doc_text` по умолчанию трогает первую вкладку. По всем вкладкам — только с явным `all_tabs: true`.
---
## Разработка
```bash
npm install
npm run dev # tsx, без сборки
npm run build
npm test
npm run test:live # живой Google Doc, нужны сохранённые credentials
npm run test:watch
```
`npm run test:live` создаёт временный Doc, вставляет текст через тот же поток, что MCP, проверяет через `gdrive_get_document_info` и в конце кладёт файл в корзину.
---
## Лицензия
MIT
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues