diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json
index 98137ca8..426e0f77 100644
--- a/.cursor-plugin/marketplace.json
+++ b/.cursor-plugin/marketplace.json
@@ -98,6 +98,21 @@
"source": "third_party/google-calendar",
"description": "Search events and schedule meetings."
},
+ {
+ "name": "google-docs",
+ "source": "third_party/google-docs",
+ "description": "Read, create, and edit documents."
+ },
+ {
+ "name": "google-sheets",
+ "source": "third_party/google-sheets",
+ "description": "Read, write, and append spreadsheet data."
+ },
+ {
+ "name": "google-slides",
+ "source": "third_party/google-slides",
+ "description": "Create, edit, and render presentations."
+ },
{
"name": "gong",
"source": "third_party/gong",
diff --git a/README.md b/README.md
index 75c92cf5..9157b13e 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,9 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc
| `gmail` | [Gmail](third_party/gmail/) | Cursor | Productivity | Search, read, draft, and manage email. |
| `google-drive` | [Google Drive](third_party/google-drive/) | Cursor | Productivity | Search, read, create, and share files. |
| `google-calendar` | [Google Calendar](third_party/google-calendar/) | Cursor | Productivity | Search events and schedule meetings. |
+| `google-docs` | [Google Docs](third_party/google-docs/) | Cursor | Productivity | Read, create, and edit documents. |
+| `google-sheets` | [Google Sheets](third_party/google-sheets/) | Cursor | Productivity | Read, write, and append spreadsheet data. |
+| `google-slides` | [Google Slides](third_party/google-slides/) | Cursor | Productivity | Create, edit, and render presentations. |
| `gong` | [Gong](third_party/gong/) | Cursor | Integrations | Pull account summaries, deal insights, and call briefs. |
| `salesforce` | [Salesforce](third_party/salesforce/) | Cursor | Integrations | Query, create, and update records in your org. |
| `playwright` | [Playwright](third_party/playwright/) | Cursor | Integrations | Navigate, click, screenshot, and test in a real browser. |
diff --git a/third_party/google-docs/.cursor-plugin/plugin.json b/third_party/google-docs/.cursor-plugin/plugin.json
new file mode 100644
index 00000000..b43c5ad5
--- /dev/null
+++ b/third_party/google-docs/.cursor-plugin/plugin.json
@@ -0,0 +1,36 @@
+{
+ "name": "google-docs",
+ "displayName": "Google Docs",
+ "version": "1.0.0",
+ "minClientVersions": {
+ "cursor": "3.22.0",
+ "grokbot": "0.30.0",
+ "sand": "0.30.0"
+ },
+ "description": "Read, create, and edit documents.",
+ "author": {
+ "name": "Cursor",
+ "email": "plugins@cursor.com"
+ },
+ "homepage": "https://github.com/cursor/plugins/tree/main/third_party/google-docs",
+ "repository": "https://github.com/cursor/plugins",
+ "license": "MIT",
+ "logo": "assets/logo.svg",
+ "keywords": [
+ "google-docs",
+ "docs",
+ "google",
+ "mcp",
+ "documents",
+ "workspace"
+ ],
+ "category": "productivity",
+ "tags": [
+ "docs",
+ "documents",
+ "mcp",
+ "google-workspace"
+ ],
+ "mcpServers": "./mcp.json",
+ "skills": "./skills/"
+}
diff --git a/third_party/google-docs/CHANGELOG.md b/third_party/google-docs/CHANGELOG.md
new file mode 100644
index 00000000..59e90831
--- /dev/null
+++ b/third_party/google-docs/CHANGELOG.md
@@ -0,0 +1,9 @@
+# Changelog
+
+All notable changes to this plugin will be documented here.
+
+## 1.0.0 - initial release
+
+- Logo: official Google Docs product icon on a padded white tile.
+- Added the `google-docs` MCP server pointing at `https://api.cursor.com/rest-mcp/google-docs/mcp`.
+- Bundled the `google-docs` skill covering the index contract, styling, lists, tables, and images.
diff --git a/third_party/google-docs/LICENSE b/third_party/google-docs/LICENSE
new file mode 100644
index 00000000..ca2bba77
--- /dev/null
+++ b/third_party/google-docs/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 Cursor
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/google-docs/README.md b/third_party/google-docs/README.md
new file mode 100644
index 00000000..a0122f31
--- /dev/null
+++ b/third_party/google-docs/README.md
@@ -0,0 +1,43 @@
+# Google Docs
+
+Cursor plugin that connects agents to [Google Docs](https://docs.google.com) through Cursor's remote [Model Context Protocol](https://modelcontextprotocol.io/) server.
+
+Read document structure and text, create documents, insert and replace text, delete content ranges, and apply paragraph styles.
+
+## Install
+
+1. Open **Cursor Settings → Plugins**.
+2. Search for **Google Docs**.
+3. Click **Install**, then complete the Google sign-in prompt.
+
+Or run `/add-plugin google-docs` in chat.
+
+## MCP
+
+```json
+{
+ "mcpServers": {
+ "google-docs": {
+ "type": "http",
+ "url": "https://api.cursor.com/rest-mcp/google-docs/mcp"
+ }
+ }
+}
+```
+
+Auth is OAuth 2.0 against Google. Cursor prompts for Google sign-in when the plugin connects.
+
+## Skill
+
+The bundled `google-docs` skill teaches agents document-authoring conventions: the index contract for safe edits, character and paragraph styling, lists, tables, and images.
+
+## Docs
+
+- Google Docs API: https://developers.google.com/workspace/docs/api/reference/rest
+- Google Workspace overview: https://developers.google.com/workspace
+
+Logo is the official Google Docs product icon, placed on a white tile with padding so it reads well in the Cursor UI.
+
+## License
+
+MIT
diff --git a/third_party/google-docs/assets/logo.svg b/third_party/google-docs/assets/logo.svg
new file mode 100644
index 00000000..25b4312d
--- /dev/null
+++ b/third_party/google-docs/assets/logo.svg
@@ -0,0 +1 @@
+
diff --git a/third_party/google-docs/mcp.json b/third_party/google-docs/mcp.json
new file mode 100644
index 00000000..3fb37522
--- /dev/null
+++ b/third_party/google-docs/mcp.json
@@ -0,0 +1,8 @@
+{
+ "mcpServers": {
+ "google-docs": {
+ "type": "http",
+ "url": "https://api.cursor.com/rest-mcp/google-docs/mcp"
+ }
+ }
+}
diff --git a/third_party/google-docs/skills/google-docs/SKILL.md b/third_party/google-docs/skills/google-docs/SKILL.md
new file mode 100644
index 00000000..7afe4f25
--- /dev/null
+++ b/third_party/google-docs/skills/google-docs/SKILL.md
@@ -0,0 +1,77 @@
+---
+name: google-docs
+description: Author and edit Google Docs through the google-docs MCP tools - structured writing, character and paragraph styling, lists, tables, images, and safe index math. Use when creating a formatted document, editing document content, or applying styles.
+---
+
+# Google Docs authoring
+
+## The index contract (the #1 source of bugs)
+
+Docs edits address zero-based UTF-16 index ranges within one tab. Every write
+SHIFTS later indexes, so:
+
+1. `read_document` first; it returns each element's `{start, end}` plus the
+ `revisionId`.
+2. Compute ONE edit from that read, pass `requiredRevisionId`, apply.
+3. Re-read before the next positional edit. Never reuse indexes across
+ writes, and never do arithmetic across two writes.
+
+Order multi-part positional work BACK-TO-FRONT (highest index first) when
+re-reading between steps is too expensive; earlier ranges stay valid.
+
+## Creating a document
+
+`create_document` makes a BLANK doc (its API ignores content), so plan:
+
+- Content known up front: prefer google-drive `google_drive_create_file`
+ with Markdown (`target_mime_type: ...document`), which imports headings,
+ lists, and tables in one call and can target a folder.
+- Building incrementally: `create_document`, then `insert_text` with `index`
+ omitted to APPEND each paragraph; append mode reads the tail itself and is
+ revision-guarded automatically. `paragraphStyle` styles the new paragraphs
+ and `bold`/`italic` style the inserted text in the same call, so a
+ well-structured document is a sequence of appends with no styling pass.
+
+## Structure is not optional
+
+A document without hierarchy reads as a text dump. Default shape for any
+report/memo/notes request: a TITLE paragraph, an italic byline or date line,
+HEADING_2 per section, short body paragraphs with bold on the phrases that
+matter, and bulleted lists for enumerations. Use `insert_text`'s
+paragraphStyle/bold/italic arguments as you write rather than styling
+afterwards.
+
+## Styling
+
+- Character styling (`apply_text_style`): bold/italic/underline/strike,
+ fontSize, fontFamily, textColor/backgroundColor as `#RRGGBB`, linkUrl.
+ Exclusive END index: to style one paragraph without its trailing newline,
+ use `end - 1` from the read.
+- Paragraph styling: `apply_paragraph_style` for named styles
+ (TITLE/HEADING_1..6), `set_paragraph_format` for alignment, indents, and
+ line spacing (percent, 100 = single).
+- Lists: `create_list` over the paragraphs' range; each newline-separated
+ paragraph becomes one item. Insert the plain lines first, then bullet them.
+
+## Tables and images
+
+- `insert_table` inserts an EMPTY grid. To fill it: re-read (cells appear
+ with their own index ranges) and `insert_text` into cells from the LAST
+ cell to the first, so earlier cell indexes stay valid.
+- `insert_image` needs a PUBLICLY fetchable URL (Google fetches it; auth
+ walls and localhost fail), PNG/JPEG/GIF. Size with width/height in points
+ (aspect kept when only one is set).
+- `insert_page_break` starts a new page at an index.
+
+## Bulk text ops
+
+`replace_text` replaces literal strings everywhere (or in named tabs) with
+no index math; prefer it for renames and corrections. `delete_content`
+rejects ranges that split table structure or surrogate pairs; deleting a
+paragraph's final newline merges it with the next.
+
+## Verifying
+
+Re-read with `read_document` for structure and styles, or google-drive
+`google_drive_read_file` for the whole doc as Markdown, or
+`google_drive_export_file` (pdf) when the visual result matters.
diff --git a/third_party/google-sheets/.cursor-plugin/plugin.json b/third_party/google-sheets/.cursor-plugin/plugin.json
new file mode 100644
index 00000000..b1e3e8dc
--- /dev/null
+++ b/third_party/google-sheets/.cursor-plugin/plugin.json
@@ -0,0 +1,36 @@
+{
+ "name": "google-sheets",
+ "displayName": "Google Sheets",
+ "version": "1.0.0",
+ "minClientVersions": {
+ "cursor": "3.22.0",
+ "grokbot": "0.30.0",
+ "sand": "0.30.0"
+ },
+ "description": "Read, write, and append spreadsheet data.",
+ "author": {
+ "name": "Cursor",
+ "email": "plugins@cursor.com"
+ },
+ "homepage": "https://github.com/cursor/plugins/tree/main/third_party/google-sheets",
+ "repository": "https://github.com/cursor/plugins",
+ "license": "MIT",
+ "logo": "assets/logo.svg",
+ "keywords": [
+ "google-sheets",
+ "sheets",
+ "google",
+ "mcp",
+ "spreadsheets",
+ "workspace"
+ ],
+ "category": "productivity",
+ "tags": [
+ "sheets",
+ "spreadsheets",
+ "mcp",
+ "google-workspace"
+ ],
+ "mcpServers": "./mcp.json",
+ "skills": "./skills/"
+}
diff --git a/third_party/google-sheets/CHANGELOG.md b/third_party/google-sheets/CHANGELOG.md
new file mode 100644
index 00000000..9ec31b18
--- /dev/null
+++ b/third_party/google-sheets/CHANGELOG.md
@@ -0,0 +1,9 @@
+# Changelog
+
+All notable changes to this plugin will be documented here.
+
+## 1.0.0 - initial release
+
+- Logo: official Google Sheets product icon on a padded white tile.
+- Added the `google-sheets` MCP server pointing at `https://api.cursor.com/rest-mcp/google-sheets/mcp`.
+- Bundled the `google-sheets` skill covering A1 and grid coordinates, formatting, charts, and validation.
diff --git a/third_party/google-sheets/LICENSE b/third_party/google-sheets/LICENSE
new file mode 100644
index 00000000..ca2bba77
--- /dev/null
+++ b/third_party/google-sheets/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 Cursor
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/google-sheets/README.md b/third_party/google-sheets/README.md
new file mode 100644
index 00000000..5f454f8d
--- /dev/null
+++ b/third_party/google-sheets/README.md
@@ -0,0 +1,43 @@
+# Google Sheets
+
+Cursor plugin that connects agents to [Google Sheets](https://sheets.google.com) through Cursor's remote [Model Context Protocol](https://modelcontextprotocol.io/) server.
+
+Read spreadsheet metadata and cell ranges, create spreadsheets, write and append values, clear ranges, and manage sheet tabs.
+
+## Install
+
+1. Open **Cursor Settings → Plugins**.
+2. Search for **Google Sheets**.
+3. Click **Install**, then complete the Google sign-in prompt.
+
+Or run `/add-plugin google-sheets` in chat.
+
+## MCP
+
+```json
+{
+ "mcpServers": {
+ "google-sheets": {
+ "type": "http",
+ "url": "https://api.cursor.com/rest-mcp/google-sheets/mcp"
+ }
+ }
+}
+```
+
+Auth is OAuth 2.0 against Google. Cursor prompts for Google sign-in when the plugin connects.
+
+## Skill
+
+The bundled `google-sheets` skill teaches agents spreadsheet conventions: when to use A1 versus grid coordinates, dashboard formatting, charts, and validation.
+
+## Docs
+
+- Google Sheets API: https://developers.google.com/workspace/sheets/api/reference/rest
+- Google Workspace overview: https://developers.google.com/workspace
+
+Logo is the official Google Sheets product icon, placed on a white tile with padding so it reads well in the Cursor UI.
+
+## License
+
+MIT
diff --git a/third_party/google-sheets/assets/logo.svg b/third_party/google-sheets/assets/logo.svg
new file mode 100644
index 00000000..1a3ef67e
--- /dev/null
+++ b/third_party/google-sheets/assets/logo.svg
@@ -0,0 +1 @@
+
diff --git a/third_party/google-sheets/mcp.json b/third_party/google-sheets/mcp.json
new file mode 100644
index 00000000..2a455735
--- /dev/null
+++ b/third_party/google-sheets/mcp.json
@@ -0,0 +1,8 @@
+{
+ "mcpServers": {
+ "google-sheets": {
+ "type": "http",
+ "url": "https://api.cursor.com/rest-mcp/google-sheets/mcp"
+ }
+ }
+}
diff --git a/third_party/google-sheets/skills/google-sheets/SKILL.md b/third_party/google-sheets/skills/google-sheets/SKILL.md
new file mode 100644
index 00000000..de65b591
--- /dev/null
+++ b/third_party/google-sheets/skills/google-sheets/SKILL.md
@@ -0,0 +1,61 @@
+---
+name: google-sheets
+description: Build and edit Google Sheets through the google-sheets MCP tools - values, formatting, charts, conditional formatting, structure, and validation. Use when creating a spreadsheet or dashboard, formatting cells, adding charts, or reorganizing tabs and rows.
+---
+
+# Google Sheets authoring
+
+## Two coordinate systems, on purpose
+
+- VALUE tools (`read_range`, `write_range`, `append_rows`, `clear_range`)
+ address a TAB TITLE plus A1 cells: `{sheet: "Data", cells: "A1:B4"}`.
+- STRUCTURE/FORMAT tools (`format_cells`, `set_borders`, `merge_cells`,
+ `add_chart`, `add_conditional_formatting`, `insert/delete_rows_or_columns`,
+ `freeze_rows_or_columns`, `sort_range`, `set_data_validation`,
+ `set_basic_filter`, `add_banding`, `set_column_width`,
+ `rename/delete_sheet_tab`) address the numeric `sheetId`.
+
+`get_spreadsheet` returns both (each tab's title AND sheetId) with no cell
+data - call it first and keep the mapping. A new tab's sheetId is in
+`add_sheet_tab`'s reply (`replies[0].addSheet.properties.sheetId`).
+
+## Sequencing a styled sheet
+
+1. `create_spreadsheet` (optionally with named tabs; it cannot target a
+ folder - move it after with google-drive `google_drive_move_or_rename`).
+2. `write_range` the data with `parseInput: true` when values include
+ numbers, dates, or formulas (default false stores everything as literal
+ text - a top source of "chart is empty" bugs).
+3. Format like a real dashboard, not a bare grid:
+ - `format_cells` bold header with a fill color and white text; number
+ patterns on value columns (`$#,##0`, `0.0%`).
+ - `freeze_rows_or_columns` the header row.
+ - `set_basic_filter` over the table range - filter dropdowns are what
+ make it read as a data table.
+ - `set_borders` (outer heavier than inner) or `add_banding` for
+ alternating row colors; `set_column_width` so nothing clips.
+ - `add_conditional_formatting` for thresholds worth seeing at a glance.
+4. `add_chart` LAST, after the data exists: first range is the domain
+ (x axis / pie labels), later ranges are series; ranges live on the same
+ tab as the chart. headerCount 1 uses first cells as labels.
+
+## Pitfalls
+
+- No revision guard anywhere: last write wins. Read before writing when a
+ collaborator may be editing.
+- `merge_cells` keeps only the top-left value; write the text after merging.
+- `sort_range` rewrites cell positions; sort before adding formulas that
+ reference the range, and exclude the header row from the sorted range.
+- `insert/delete_rows_or_columns` positions are 1-based (A=1); deletes are
+ immediate and not undoable through the API.
+- `find_replace_sheet` is literal (never regex here) and can search inside
+ formulas with `searchFormulas: true`.
+- Whole-tab reads can blow the byte cap; bound `cells` (e.g. "1:2000") on
+ tabs you have not sized and follow `nextCells` when truncated.
+
+## Verifying
+
+`read_range` (FORMATTED_VALUE shows what the user sees; UNFORMATTED_VALUE
+raw numbers) for values, `get_spreadsheet` for structure, and google-drive
+`google_drive_export_file` (pdf - renders every tab including charts and
+formatting) when the visual result matters.
diff --git a/third_party/google-slides/.cursor-plugin/plugin.json b/third_party/google-slides/.cursor-plugin/plugin.json
new file mode 100644
index 00000000..9036725a
--- /dev/null
+++ b/third_party/google-slides/.cursor-plugin/plugin.json
@@ -0,0 +1,36 @@
+{
+ "name": "google-slides",
+ "displayName": "Google Slides",
+ "version": "1.0.0",
+ "minClientVersions": {
+ "cursor": "3.22.0",
+ "grokbot": "0.30.0",
+ "sand": "0.30.0"
+ },
+ "description": "Create, edit, and render presentations.",
+ "author": {
+ "name": "Cursor",
+ "email": "plugins@cursor.com"
+ },
+ "homepage": "https://github.com/cursor/plugins/tree/main/third_party/google-slides",
+ "repository": "https://github.com/cursor/plugins",
+ "license": "MIT",
+ "logo": "assets/logo.svg",
+ "keywords": [
+ "google-slides",
+ "slides",
+ "google",
+ "mcp",
+ "presentations",
+ "workspace"
+ ],
+ "category": "productivity",
+ "tags": [
+ "slides",
+ "presentations",
+ "mcp",
+ "google-workspace"
+ ],
+ "mcpServers": "./mcp.json",
+ "skills": "./skills/"
+}
diff --git a/third_party/google-slides/CHANGELOG.md b/third_party/google-slides/CHANGELOG.md
new file mode 100644
index 00000000..b3af0fbb
--- /dev/null
+++ b/third_party/google-slides/CHANGELOG.md
@@ -0,0 +1,9 @@
+# Changelog
+
+All notable changes to this plugin will be documented here.
+
+## 1.0.0 - initial release
+
+- Logo: official Google Slides product icon on a padded white tile.
+- Added the `google-slides` MCP server pointing at `https://api.cursor.com/rest-mcp/google-slides/mcp`.
+- Bundled the `google-slides` skill covering deck layout, styling, and per-slide PNG verification.
diff --git a/third_party/google-slides/LICENSE b/third_party/google-slides/LICENSE
new file mode 100644
index 00000000..ca2bba77
--- /dev/null
+++ b/third_party/google-slides/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 Cursor
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/google-slides/README.md b/third_party/google-slides/README.md
new file mode 100644
index 00000000..1aa6ee97
--- /dev/null
+++ b/third_party/google-slides/README.md
@@ -0,0 +1,43 @@
+# Google Slides
+
+Cursor plugin that connects agents to [Google Slides](https://slides.google.com) through Cursor's remote [Model Context Protocol](https://modelcontextprotocol.io/) server.
+
+Read presentation structure and text, create presentations, add and reorder slides, insert text boxes, shapes, images, and tables, style text and backgrounds, and render any slide as a PNG thumbnail.
+
+## Install
+
+1. Open **Cursor Settings → Plugins**.
+2. Search for **Google Slides**.
+3. Click **Install**, then complete the Google sign-in prompt.
+
+Or run `/add-plugin google-slides` in chat.
+
+## MCP
+
+```json
+{
+ "mcpServers": {
+ "google-slides": {
+ "type": "http",
+ "url": "https://api.cursor.com/rest-mcp/google-slides/mcp"
+ }
+ }
+}
+```
+
+Auth is OAuth 2.0 against Google. Cursor prompts for Google sign-in when the plugin connects.
+
+## Skill
+
+The bundled `google-slides` skill teaches agents deck-building conventions: object handles and point geometry, layout that avoids clipped images, palette and text styling, and per-slide PNG verification.
+
+## Docs
+
+- Google Slides API: https://developers.google.com/workspace/slides/api/reference/rest
+- Google Workspace overview: https://developers.google.com/workspace
+
+Logo is the official Google Slides product icon, placed on a white tile with padding so it reads well in the Cursor UI.
+
+## License
+
+MIT
diff --git a/third_party/google-slides/assets/logo.svg b/third_party/google-slides/assets/logo.svg
new file mode 100644
index 00000000..67109de9
--- /dev/null
+++ b/third_party/google-slides/assets/logo.svg
@@ -0,0 +1 @@
+
diff --git a/third_party/google-slides/mcp.json b/third_party/google-slides/mcp.json
new file mode 100644
index 00000000..be0b3fa9
--- /dev/null
+++ b/third_party/google-slides/mcp.json
@@ -0,0 +1,8 @@
+{
+ "mcpServers": {
+ "google-slides": {
+ "type": "http",
+ "url": "https://api.cursor.com/rest-mcp/google-slides/mcp"
+ }
+ }
+}
diff --git a/third_party/google-slides/skills/google-slides/SKILL.md b/third_party/google-slides/skills/google-slides/SKILL.md
new file mode 100644
index 00000000..50152666
--- /dev/null
+++ b/third_party/google-slides/skills/google-slides/SKILL.md
@@ -0,0 +1,77 @@
+---
+name: google-slides
+description: Build and edit Google Slides through the google-slides MCP tools - slides, text boxes, shapes, images, tables, styling, and per-slide PNG rendering. Use when creating a deck, laying out slide elements, or verifying how a slide looks.
+---
+
+# Google Slides authoring
+
+## Handles and geometry
+
+Everything is addressed by objectId from `read_presentation`: slides, shapes,
+tables, images. Element positions and sizes are in POINTS from the slide's
+top-left; a standard slide is 720x405 pt. Plan a layout on that grid before
+inserting (e.g. title at y 40-60, content rows at y 150+, keep 40 pt margins)
+so elements do not overlap.
+
+## Sequencing a styled deck
+
+1. `create_presentation` (starts with ONE blank slide; it cannot target a
+ folder - move it after with google-drive `google_drive_move_or_rename`).
+ Delete the default placeholders when building a custom layout.
+2. `read_presentation` for the first slide's objectId, the layouts list,
+ and the revisionId.
+3. Pick a PALETTE first: one background color, one card/accent color that
+ harmonizes with it, one or two text colors. Every element uses it.
+4. Per slide: `set_slide_background`, then insert elements with their style
+ INLINE - `insert_text_box` takes bold/fontSize/textColor/textAlignment,
+ `insert_shape` additionally fillColor/outlineColor, so one call produces
+ a finished element. `insert_image` aspect-fits into maxWidth/maxHeight
+ and never crops; give it the box you want filled.
+5. More slides: `add_slide` with a predefined layout fills title/body
+ placeholders in the same call; `move_slide` reorders.
+
+## Layout that reads well
+
+- Align to a grid: same y for elements in a row, equal sizes for peer cards,
+ equal gaps (e.g. three 180 pt cards at x 60/270/480 on a 720 pt slide).
+- Whitespace is part of the design, but content should not huddle in one
+ corner of an otherwise empty slide; spread rows vertically (title ~56,
+ content ~180, footer ~330).
+- Tables are for genuinely tabular data on CONTENT slides; on title or
+ summary slides prefer stat cards (`insert_shape` with text) or short
+ bulleted placeholders.
+- `set_text_style` restyles ALL text of one shape (or a table cell via
+ cellRow/cellColumn); it does not do partial ranges.
+
+Pass `requiredRevisionId` from the latest read (or the previous write's
+response) so concurrent edits fail the write instead of corrupting layout.
+
+## Tables
+
+`insert_table` makes an empty grid; fill cells with `set_shape_text` using
+`pageObjectId` = the slide, `objectId` = the table, and
+`cell: {rowIndex, columnIndex}` (0-based, EXACTLY those key names). Note
+`set_shape_text` REPLACES the whole cell/shape text.
+
+## Placeholders vs free elements
+
+`add_slide` with layout TITLE_AND_BODY etc. fills placeholders - the fastest
+way to a clean, theme-consistent slide. Free `insert_text_box`/`insert_shape`
+give exact control but inherit no theme styling; set fonts and colors
+yourself with `set_text_style`.
+
+## Position changes
+
+`update_element_position` moves an element to an absolute point position; it
+does not resize (the API resizes via transform scale against intrinsic size,
+which is unreliable across element kinds - delete and re-create at the right
+size instead).
+
+## Verifying visually
+
+`get_slide_thumbnail` renders ONE slide as PNG (base64; LARGE = 1600 px wide)
+- the ground truth for layout checks; read_presentation cannot tell you
+whether elements overlap. For the whole deck use google-drive
+`google_drive_export_file` (pdf). Speaker notes: write with `set_shape_text`
+using pageObjectId = the slide's notesPageId and objectId =
+speakerNotesObjectId from `read_presentation`.