A Python MCP server that exposes Google Docs, Google Sheets, Google Slides, and Google Forms as tools for any MCP-compatible AI assistant. Currently supporting 26 tools across documents, spreadsheets, presentations, and forms.
Enable these APIs in your Google Cloud project:
- Google Docs API
- Google Sheets API
- Google Slides API
- Google Drive API
- Google Forms API
Then create OAuth credentials:
- Go to
APIs & Services->OAuth consent screenand configure it - On the OAuth consent screen, go to Scopes and add the following scopes:
https://www.googleapis.com/auth/documentshttps://www.googleapis.com/auth/spreadsheetshttps://www.googleapis.com/auth/presentationshttps://www.googleapis.com/auth/drive.readonlyhttps://www.googleapis.com/auth/forms.bodyhttps://www.googleapis.com/auth/forms.responses.readonly
- Go to
APIs & Services->Credentials->Create credentials->OAuth client ID->Desktop app - Copy the
Client IDandClient Secret
docker compose buildcp .env.example .env
# Fill in GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRETdocker compose run --rm -p 8082:8082 authClaude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"google-docs": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "gdocs-suite-mcp-tokens:/tokens",
"--env-file", "/absolute/path/to/.env",
"gdocs-suite-mcp:latest",
"serve"
]
}
}
}Claude Code
claude mcp add --transport stdio google-docs -- \
docker run --rm -i \
-v gdocs-suite-mcp-tokens:/tokens \
--env-file /absolute/path/to/.env \
gdocs-suite-mcp:latest serveGemini CLI
Add to ~/.gemini/settings.json (or .gemini/settings.json for project-level):
{
"mcpServers": {
"gdocs-suite": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "gdocs-suite-mcp-tokens:/tokens",
"--env-file", "/absolute/path/to/.env",
"gdocs-suite-mcp:latest",
"serve"
]
}
}
}OpenAI Codex CLI
Add to ~/.codex/config.toml (or .codex/config.toml for project-level):
[mcp_servers.gdocs-suite]
command = "docker"
args = ["run", "--rm", "-i", "-v", "gdocs-suite-mcp-tokens:/tokens", "--env-file", "/absolute/path/to/.env", "gdocs-suite-mcp:latest", "serve"]
enabled = truegit clone https://github.com/stratosphereips/strato-mcp-gdocs-suite
cd strato-mcp-gdocs-suite
uv venv && source .venv/bin/activate
uv pip install -e .
cp .env.example .envAuthenticate once:
gdocs-suite-authStart MCP server:
gdocs-suite-mcp| Tool | Parameters | Description |
|---|---|---|
list_documents_tool |
max_results=10, query="" |
List Google Docs files, optionally filtered by name |
search_documents_tool |
query, max_results=10 |
Full-text search across document content |
get_document_tool |
document_id |
Get document metadata and extracted plain text |
create_document_tool |
title, content="" |
Create a document with optional initial text |
update_document_tool |
document_id, requests |
Apply raw Docs API batchUpdate requests |
| Tool | Parameters | Description |
|---|---|---|
list_spreadsheets_tool |
max_results=10, query="" |
List Google Sheets files, optionally filtered by name |
get_spreadsheet_tool |
spreadsheet_id |
Get spreadsheet metadata and sheet names |
create_spreadsheet_tool |
title |
Create a new spreadsheet |
read_range_tool |
spreadsheet_id, range |
Read cell values from an A1-notation range (e.g. Sheet1!A1:C10) |
write_range_tool |
spreadsheet_id, range, values |
Write a 2D list of values to a range |
append_rows_tool |
spreadsheet_id, range, values |
Append rows below the last row with data in the range |
| Tool | Parameters | Description |
|---|---|---|
list_presentations_tool |
max_results=10, query="" |
List Google Slides files, optionally filtered by name |
get_presentation_tool |
presentation_id |
Get presentation metadata, slide count, and slide titles |
create_presentation_tool |
title |
Create a new presentation |
| Tool | Parameters | Description |
|---|---|---|
list_forms_tool |
max_results=10, query="" |
List Google Forms files, optionally filtered by name |
get_form_tool |
form_id |
Get form metadata, description, and all items/questions |
create_form_tool |
title, description="" |
Create a new form with optional description |
add_question_tool |
form_id, question_type, title, required=False, index=None, options=None |
Add a question (types: text, paragraph, multiple_choice, checkbox, dropdown, scale, date, time) |
update_form_info_tool |
form_id, title="", description="" |
Update form title and/or description |
delete_item_tool |
form_id, item_id |
Delete a question/item by item ID |
list_responses_tool |
form_id, max_results=100 |
List all responses for a form |
get_response_tool |
form_id, response_id |
Get a single response by response ID |
move_item_tool |
form_id, original_index, new_index |
Move an item to a new position (0-based indices) |
add_text_item_tool |
form_id, title, description="", index=0 |
Add a section header with optional description |
add_page_break_tool |
form_id, title="", index=0 |
Add a page break to start a new section |
update_form_settings_tool |
form_id, email_collection_type="", is_quiz=None |
Set email collection (DO_NOT_COLLECT, VERIFIED, RESPONDER_INPUT) and/or quiz mode |
Note: The Forms tools require two additional OAuth scopes (
forms.bodyandforms.responses.readonly). If you previously authenticated without these scopes, re-run the auth step:docker compose run --rm -p 8082:8082 auth
| Variable | Required | Default | Description |
|---|---|---|---|
GOOGLE_CLIENT_ID |
Yes | - | OAuth client ID |
GOOGLE_CLIENT_SECRET |
Yes | - | OAuth client secret |
GOOGLE_REDIRECT_URI |
No | http://localhost:8082 |
OAuth redirect URI |
TOKEN_STORE_PATH |
No | ~/.config/gdocs-suite-mcp/ (local) / /tokens (Docker) |
Token storage directory |
GOOGLE_SCOPES |
No | docs + sheets + slides + drive.readonly | Comma-separated OAuth scopes |
LOG_LEVEL |
No | WARNING |
Log level (stderr only) |
uv pip install -e ".[dev]"
uv run pytest