google-slides-mcp
Google Slides MCP Server
This process is an MCP server for the Google Slides API. A host talks to it on stdio. The first start opens a browser. You paste a Desktop client id and client secret. Google consent follows. Later starts read the token store.
Prerequisites
Node.js 20 or later
A Google Cloud project with the Google Slides API enabled
An OAuth Desktop client id and client secret
You do not need a refresh token. You do not need process env.
Claude Code
Create a Desktop OAuth client. Use the Google Auth platform steps below.
In Claude Code run:
/plugin marketplace add matteoantoci/claude-plugins
/plugin install google-slides-mcp@matteoantoci-pluginsRun
/reload-pluginsif Claude asks.The first start opens a browser. Paste the client id and the client secret. Finish Google consent.
Later sessions read the token store. No host JSON. No env.
Other hosts
Clone this repository.
Run
npm install.Run
npm run build.Create a Desktop OAuth client in Google Cloud Console:
Open Google Auth platform.
If the page says the platform is not configured, click Get Started.
App name:
Google Slides MCP. User support email: your address.Audience: External.
Contact email: your address. Agree to the policy. Click Create.
Open Audience. Add your Gmail as a test user.
Open Data Access. Add
https://www.googleapis.com/auth/presentationsandhttps://www.googleapis.com/auth/drive.readonly. Save.Open Clients. Click Create Client. Application type: Desktop app. Name:
Google Slides MCP Desktop. Click Create.Copy the client id and the client secret.
Run
npm run start. Paste the client id and the client secret. Finish Google consent. Then stop the process.Point the host at
node /path/to/google-slides-mcp/build/index.js. Do not set env.
Example host config:
"google-slides-mcp": {
"transportType": "stdio",
"command": "node",
"args": [
"/path/to/google-slides-mcp/build/index.js"
]
}Replace the path with the compiled build/index.js on your machine.
First start
The process opens a loopback page.
If the store has no client id or client secret, paste those two values.
Continue to Google consent.
Close the success page.
The process writes the Google credential to the token store. It tries the OS keychain first. It uses ~/.config/google-slides-mcp/credential.json if the keychain is not available. File mode is 0600.
Later starts use the store. No browser.
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, and GOOGLE_REFRESH_TOKEN can override one field. They are never required. If env supplies a missing field, the process writes the merged credential to the store.
Run without a host
npm run startThe process listens on stdio. Stderr prints Google Slides MCP server running and connected via stdio.
Available Tools
create_presentation: Creates a new Google Slides presentation.Input:
title(string, required): The title for the new presentation.
Output: JSON object representing the created presentation details.
get_presentation: Retrieves details about an existing presentation.Input:
presentationId(string, required): The ID of the presentation to retrieve.fields(string, optional): A field mask (e.g., "slides,pageSize") to limit the returned data.
Output: JSON object representing the presentation details.
batch_update_presentation: Applies a series of updates to a presentation. This is the primary method for modifying slides (adding text, shapes, images, creating slides, etc.).Input:
presentationId(string, required): The ID of the presentation to update.requests(array, required): An array of request objects defining the updates. Refer to the Google Slides APIbatchUpdatedocumentation for the structure of individual requests.writeControl(object, optional): Controls write request execution (e.g., using revision IDs).
Output: JSON object representing the result of the batch update.
get_page: Retrieves details about a specific page (slide) within a presentation.Input:
presentationId(string, required): The ID of the presentation to retrieve.pageObjectId(string, required): The object ID of the page (slide) to retrieve.
Output: JSON object representing the page details.
summarize_presentation: Extracts and formats all text content from a presentation for easier summarization.Input:
presentationId(string, required): The ID of the presentation to summarize.include_notes(boolean, optional): Whether to include speaker notes in the summary. Defaults to false.
Output: JSON object containing:
title: The presentation's titleslideCount: Total number of slideslastModified: Revision informationslides: Array of slide objects containing:slideNumber: Position in presentationslideId: Object ID of the slidecontent: All text extracted from the slidenotes: Speaker notes (if requested and available)