Minimal MCP server for Google Drive file management and Google Sheets editing.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
A focused Model Context Protocol server (and standalone CLI) for Google Drive file management (move, upload, organize), Google Sheets editing (cells, rows, tabs, format), and surgical Google Docs editing (replace a phrase, insert at an anchor, delete a range β leaving all other formatting untouched). Twenty-three granular, single-purpose tools β each an explicit operation, with writes returning before/after or precise indices so nothing changes silently.
Built because the hosted Google Drive connectors can search, read, and copy files, but cannot move them (copy duplicates a file with a new ID rather than relocating it), cannot reliably upload a real binary (their inline-content API needs the bytes embedded as base64, which breaks for large/binary files), and cannot edit spreadsheet or document contents in place. This server adds a true move, a resumable upload from a local path, folder creation, a full set of Google Sheets edits, and range-scoped Google Docs edits β for any MCP client (Claude Code, Claude Desktop, Cursor, Cline, etc.).
drive_search(query, only_folders=False, max_results=20) β find files/folders (and their IDs).drive_create_folder(name, parent=None) β create a folder (parent accepts an ID, URL, root, or an unambiguous folder name).drive_move(file, dest_folder, keep_existing_parents=False) β true move (removed from its current folder); keep_existing_parents=True adds without removing.drive_upload_file(local_path, parent=None, name=None, mime_type=None) β upload a local file (any type, incl. large binaries) via a resumable media upload. Stored as-is (no Google-format conversion).sheets_get_info(spreadsheet) β list tabs + sizes (call first to learn tab names).sheets_read(spreadsheet, range_a1, render_option="FORMATTED_VALUE") β read a range (FORMULA/UNFORMATTED_VALUE available).sheets_write(spreadsheet, range_a1, values, value_input_option="USER_ENTERED") β overwrite a range; returns before. USER_ENTERED parses numbers and makes =SUM(..) a formula; RAW writes literally.sheets_append(spreadsheet, range_a1, values, ...) β append rows after a table.sheets_clear(spreadsheet, range_a1) β clear values (keeps formatting); returns before.sheets_batch_write(spreadsheet, updates, ...) β write many ranges atomically.sheets_add_tab / sheets_rename_tab / sheets_delete_tab β manage tabs (delete is destructive).sheets_freeze_panes(spreadsheet, tab, rows=None, cols=None) β freeze/unfreeze header rows/cols (0 = explicitly unfreeze; omit = untouched).sheets_format(spreadsheet, range_a1, number_format=None, bold=None, background=None, wrap=None) β number pattern / bold / #RRGGBB background / text wrap.sheets_set_column_width(spreadsheet, range_a1, pixel_size) β set column width in pixels for a whole-column range (e.g. 'A:C').sheets_set_row_height(spreadsheet, range_a1, pixel_size) β set row height in pixels for a whole-row range (e.g. '2:5').Every Docs edit is range-scoped (documents.batchUpdate), so it changes exactly what you target and leaves every other run's native formatting byte-for-byte intact.
docs_get_info(document) β title + structure (paragraph/table counts, end index).docs_read(document) β full text with per-segment character indices (table cells include row/col). Read this first to target edits.docs_replace_text(document, find, replace, match_case=False) β replace a phrase everywhere; surrounding content/formatting untouched.docs_insert_text(document, text, index=None, after_text=None, before_text=None) β insert at an index or right after/before an anchor phrase.docs_delete_range(document, start_index, end_index) β delete one precise range.docs_append_text(document, text) β append at the end.No rename/copy/trash/delete of files (copy already exists in the hosted Drive connector); destructive ops (sheets_clear, sheets_delete_tab, docs_delete_range) are their own explicit tools so you control exactly when they run.
Moving an existing arbitrary file requires the full drive scope β read/write/delete on all your Drive files. There is no narrower scope that can change a file's parents (drive.file only covers files the app itself created). This tool is therefore far more powerful than a read-only connector. Treat its cached token like a password (stored 0600), and prefer an isolated OAuth client/token rather than sharing one with read-only tools.
drive scope already authorizes the Sheets and Docs APIs β no extra consent, just enable each API you want.)google-drive-files-mcp setup --import-credentials ~/Downloads/client_secret_*.json β consent in the browser.Verify:
Find my "Q2 Report" doc and move it into the "2026 Reports" folder.
drive_move returns the before/after parents so the move is auditable:
| Variable | Default | What |
|---|---|---|
GDRIVE_FILES_MCP_CREDENTIALS | ~/.config/google-drive-files-mcp/credentials.json | OAuth client secret |
GDRIVE_FILES_MCP_TOKEN | ~/.config/google-drive-files-mcp/token.json | Cached refresh token |
GDRIVE_FILES_MCP_SCOPES | https://www.googleapis.com/auth/drive | OAuth scopes (comma-separated) |
keep_existing_parents=True adds without removing.drive_move refuses and lists the candidates so you can pass an explicit ID.HttpError 403: Google Drive API has not been used in project β¦ or it is disabled
Enable the Drive API on the project that owns your OAuth client: console.cloud.google.com/apis/library/drive.googleapis.com β Enable, then wait ~1 min and retry. (This is the single most common first-run error.)
multiple folders named 'β¦'; pass the folder ID/URL instead
Two or more of your folders share that name, so a name is ambiguous. Run google-drive-files-mcp search "<name>" --folders to get the IDs and pass the exact one.
no folder named 'β¦' found
Create it first (google-drive-files-mcp mkdir "<name>") or pass a folder ID/URL/root.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/google-drive-files-mcp)<a href="https://allmcps.com/mcp/google-drive-files-mcp"><img src="https://allmcps.com/api/badge/google-drive-files-mcp?style=directory" alt="Google Drive Files MCP on AllMCPs" /></a>