--- title: Google Slides description: Mount Google Slides presentations as JSON-backed files that Python agents can read through Mirage shell commands. icon: presentation --- The Google Slides resource exposes presentations as a virtual filesystem mounted at some prefix such as `/gslides/`. For Google OAuth setup, see [Google Workspace Setup](/python/setup/google). ## Config ```python import os from mirage import MountMode, Workspace from mirage.resource.gslides import GSlidesConfig, GSlidesResource config = GSlidesConfig( client_id=os.environ["GOOGLE_CLIENT_ID"], client_secret=os.environ["GOOGLE_CLIENT_SECRET"], refresh_token=os.environ["GOOGLE_REFRESH_TOKEN"], ) resource = GSlidesResource(config=config) ws = Workspace({"/gslides": resource}, mode=MountMode.READ) ``` ## Filesystem Layout ```text /gslides/ owned/ ___.gslide.json ... shared/ ___.gslide.json ... ``` Example: ```text /gslides/ owned/ 2026-04-04_QBR_Deck__1AbCdEf.gslide.json 2026-04-10_Team_Update__2BcDeFg.gslide.json shared/ 2026-04-03_Design_Review__9XyZ.gslide.json ``` Presentations are split into `owned` (presentations you created) and `shared` (presentations shared with you). The filename shape is: ```text ___.gslide.json ``` If the modified date is unavailable, the date prefix is omitted. Reading a presentation file returns the full Google Slides API JSON for that presentation. ## Cache The Google Slides resource uses `IndexCacheStore`. Index entries store presentation IDs and metadata. There is no separate content cache -- file content caching is handled by the workspace `IOResult` mechanism. ## Example ```python import asyncio import os from dotenv import load_dotenv from mirage import MountMode, Workspace from mirage.resource.gslides import GSlidesConfig, GSlidesResource load_dotenv(".env.development") config = GSlidesConfig( client_id=os.environ["GOOGLE_CLIENT_ID"], client_secret=os.environ["GOOGLE_CLIENT_SECRET"], refresh_token=os.environ["GOOGLE_REFRESH_TOKEN"], ) resource = GSlidesResource(config=config) async def main(): ws = Workspace({"/gslides": resource}, mode=MountMode.READ) # List structure r = await ws.execute("ls /gslides/") print(await r.stdout_str()) # List owned presentations r = await ws.execute("ls /gslides/owned/") print(await r.stdout_str()) # Read a presentation r = await ws.execute( "cat /gslides/owned/2026-04-04_QBR_Deck__1AbCdEf.gslide.json") print(await r.stdout_str()) # Extract title with jq r = await ws.execute( 'jq ".title"' " /gslides/owned/2026-04-04_QBR_Deck__1AbCdEf.gslide.json") print(await r.stdout_str()) # Search across all presentations r = await ws.execute('rg "quarterly" /gslides/owned/') print(await r.stdout_str()) # Tree view r = await ws.execute("tree -L 1 /gslides/") print(await r.stdout_str()) # Create a new presentation r = await ws.execute( 'gws-slides-presentations-create --json \'{"title":"MIRAGE Deck"}\'') print(await r.stdout_str()) # Batch update a presentation r = await ws.execute( 'gws-slides-presentations-batchUpdate' ' --params \'{"presentationId":"1AbCdEf"}\'' ' --json \'{"requests":[]}\'') print(await r.stdout_str()) if __name__ == "__main__": asyncio.run(main()) ``` See `examples/gslides/gslides.py` for the full working example. ## Shell Commands Standard commands available on the mounted Google Slides tree: | Command | Notes | | ----------------------------------- | ------------------------------- | | `ls` | List owned/shared presentations | | `cat` | Read presentation JSON | | `head` / `tail` | First/last N lines | | `grep` / `rg` | Pattern search | | `jq` | Query JSON fields | | `wc` | Line/word/byte counts | | `stat` | File metadata | | `find` | Recursive search | | `tree` | Directory tree view | | `basename` / `dirname` / `realpath` | Path utilities | | `nl` | Number lines | Resource-specific commands: ### `gws-slides-presentations-create` Create a new presentation. ```bash gws-slides-presentations-create --json '{"title":"MIRAGE Deck"}' ``` | Option | Required | Description | | -------- | -------- | ---------------------------- | | `--json` | yes | JSON body with `title` field | Returns the created presentation JSON. ### `gws-slides-presentations-batchUpdate` Batch update a presentation. ```bash gws-slides-presentations-batchUpdate --params '{"presentationId":"1AbCdEf"}' --json '{"requests":[]}' ``` | Option | Required | Description | | ---------- | -------- | -------------------------- | | `--params` | yes | JSON with `presentationId` | | `--json` | yes | JSON with `requests` array | Returns the batch update response JSON.