# Google Docs MCP Server
A [Model Context Protocol](https://modelcontextprotocol.io/) server for Google Docs with **full tab support** — something most existing servers get wrong or skip entirely.
Uses Google service accounts with domain-wide delegation, so it works in Workspace orgs without OAuth consent screens.
<!-- mcp-name: io.github.gigabrain-observer/google-docs-mcp-server -->
## What it does
| Tool | Description |
|------|-------------|
| `list_tabs` | List all tabs (including nested) in a document |
| `read_document` | Read one tab or all tabs as markdown with proper heading levels |
| `get_document_info` | Lightweight metadata: title, ID, link, tab list |
| `create_document` | Create a new doc with optional initial text |
| `append_text` | Append text to the end of a specific tab |
| `insert_text` | Insert text at a character index in a tab |
| `replace_text` | Find and replace within a tab (or whole doc) |
| `batch_update` | Full batchUpdate access — formatting, tables, images, styles |
| `list_documents` | Search Drive for docs by name |
All tab-targeting tools accept `tab_id` or `tab_title` (case-insensitive). The `batch_update` tool auto-injects `tabId` into requests so you don't have to.
## Why this exists
Google Docs has supported [tabs](https://workspaceupdates.googleblog.com/2024/10/google-docs-tabs.html) since late 2024, but most MCP servers either:
- Ignore tabs entirely (only read the first tab)
- Don't use `includeTabsContent=True`, so tab content is invisible
- Don't handle nested tabs
This server handles all of that correctly and converts content to markdown with proper heading structure.
## Install
```bash
pip install google-docs-mcp-server
```
Or run directly with [uv](https://docs.astral.sh/uv/):
```bash
uvx google-docs-mcp-server
```
## Prerequisites
- Python 3.11+
- A Google Cloud service account with domain-wide delegation
## Setup
### 1. Create a GCP service account
1. Go to [Google Cloud Console](https://console.cloud.google.com/) and create (or select) a project
2. Enable the **Google Docs API** and **Google Drive API**
3. Create a service account under **IAM & Admin > Service Accounts**
4. Create a JSON key and download it
### 2. Enable domain-wide delegation
1. In GCP, on the service account details page, enable **Domain-wide Delegation** and note the Client ID
2. In [Google Workspace Admin](https://admin.google.com/) > Security > API Controls > Domain-wide Delegation
3. Add the Client ID with these scopes:
```
https://www.googleapis.com/auth/documents
https://www.googleapis.com/auth/drive.readonly
```
### 3. Configure your MCP client
Add to your MCP config (e.g. `~/.claude/mcp.json` or `.mcp.json`):
```json
{
"mcpServers": {
"google-docs": {
"command": "uvx",
"args": ["google-docs-mcp-server"],
"env": {
"SERVICE_ACCOUNT_PATH": "/path/to/your-service-account-key.json",
"SUBJECT_EMAIL": "you@yourdomain.com"
}
}
}
}
```
`SUBJECT_EMAIL` is the Workspace user the service account impersonates.
## Environment variables
| Variable | Required | Description |
|----------|----------|-------------|
| `SERVICE_ACCOUNT_PATH` | Yes | Path to the service account JSON key file |
| `SUBJECT_EMAIL` | Yes | Email of the Workspace user to impersonate |
## License
MIT