Google Photos MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GOOGLE_PHOTOS_ACCOUNTS | No | JSON array of account configurations for multiple Google accounts. Each object requires name, client_id, client_secret, and refresh_token. | |
| GOOGLE_PHOTOS_AUDIT_LOG | No | File path where every attempted write operation is logged. | |
| GOOGLE_PHOTOS_AUTH_PORT | No | Port for the OAuth redirect during `auth`. Must match the authorised redirect URI registered in Google Cloud. | 4180 |
| GOOGLE_PHOTOS_CLIENT_ID | No | OAuth client ID from your Google Cloud project. | |
| GOOGLE_PHOTOS_READ_ONLY | No | Set to '1' to remove all write tools. | |
| GOOGLE_PHOTOS_CLIENT_SECRET | No | OAuth client secret from your Google Cloud project. | |
| GOOGLE_PHOTOS_REFRESH_TOKEN | No | Refresh token obtained by running the `auth` command. | |
| GOOGLE_PHOTOS_DEFAULT_ACCOUNT | No | Default account name to use when no account is specified in tool calls. | |
| GOOGLE_PHOTOS_ALLOW_DESTRUCTIVE | No | Set to '0' to block uploading and sharing while keeping other write operations. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| start_pick_sessionA | Open a Google Photos picker so the user can choose photos and videos from their ENTIRE library. This is the only way to reach media this app did not upload itself; the Library API cannot see anything else. Returns a Do not call list_picked_media straight after this. Nothing has been picked yet and the empty result does not mean the library is empty. |
| check_pick_sessionA | Poll a picker session started by start_pick_session. Respect the poll_interval_seconds from start_pick_session rather than polling in a tight loop. If it is still false after a few minutes, the user has probably not opened the link yet; ask them rather than polling forever. |
| list_picked_mediaA | Return the media items the user selected in a picker session. Call check_pick_session first; this returns an empty list until the selection is confirmed. The items include a |
| download_pickedA | Fetch the bytes of an item the user picked, returned as base64 with its mime type. Pass the item's Use this rather than giving a base_url to the user or to another tool: the URL needs an auth header and a size suffix, and it expires within the hour. Large files are refused; raise max_mb only when the caller genuinely needs the original. |
| create_albumA | Create a new, empty album in the user's Google Photos. It is private, and it belongs to this app, which is what makes it editable later. Add items with add_to_album or by passing album_id when uploading. |
| list_albumsA | List the albums this app created, newest first. Only albums created by this app are listed. Albums the user made in the Google Photos app are not visible to any scope available since 2025-04-01. Pass next_page_token from a previous result to continue; a library with many albums will not fit in one page. |
| get_albumA | Fetch a single album by id, including its item count, cover photo and sharing state. A 404 here usually means the album exists but was not created by this app, rather than that the id is wrong. Only albums created by this app are listed. Albums the user made in the Google Photos app are not visible to any scope available since 2025-04-01. |
| update_albumA | Change an album's title, its cover photo, or both. The cover has to be a media item that is already in the album; setting one that is not returns an error. |
| share_albumA | Turn an album into a shared album and return a link anyone can open without signing in. This is the one thing here that reaches people outside the account, and a link that has been sent cannot be recalled. unshare_album revokes it, but not from anyone who already saved the contents. Requires confirm: true. |
| unshare_albumA | Revoke an album's share link and make it private again. Anyone who already opened the link loses access, but anything they saved or downloaded stays with them. |
| list_shared_albumsA | List the shared albums this app created, with their share links. Only albums created by this app are listed. Albums the user made in the Google Photos app are not visible to any scope available since 2025-04-01. |
| add_to_albumA | Add media items this app created to an album this app created. Both sides have to be app-created; a picked item cannot be added directly, it has to be uploaded into the library first with save_to_library. Up to 50 items per call. |
| remove_from_albumA | Take media items out of an album. The items stay in the user's library; only the album membership goes. Up to 50 per call. |
| add_album_enrichmentA | Insert an enrichment into an album: a text caption, a named location, or a map between two places. Enrichments sit between photos and are how an album reads as a story rather than a grid. Position defaults to the end of the album. |
| list_app_mediaA | List media items, newest first, optionally scoped to one album. Only media uploaded by this app is returned. To reach anything else in the user's library, use start_pick_session. Pass next_page_token to continue past the first page. |
| search_libraryA | Filter media by date range, content category, media type or favourites. Only media uploaded by this app is returned. To reach anything else in the user's library, use start_pick_session. There is no free-text search in the Google Photos API: you cannot search for "beach" as a word. Categories are the closest equivalent, and they are Google's own classifier, not tags the user set. Call describe_filter_capabilities for the exact values. An album_id cannot be combined with any filter; Google rejects that combination. |
| describe_filter_capabilitiesA | Return the exact content categories, media types and feature filters search_library accepts, plus what the Google Photos API cannot do. Costs no API call and no quota. Read this before guessing a category name. A wrong one is rejected rather than ignored. |
| get_media_itemA | Fetch a single media item by id, with its dimensions, creation time and description. Only media uploaded by this app is returned. To reach anything else in the user's library, use start_pick_session. |
| get_media_itemsA | Fetch up to 50 media items by id in one call. Prefer this over repeated get_media_item: it is one request against the daily quota rather than fifty. Only media uploaded by this app is returned. To reach anything else in the user's library, use start_pick_session. Ids that cannot be read come back in |
| update_media_descriptionA | Write the description shown under a photo or video in Google Photos. Only works on media this app uploaded. Passing an empty string clears it. |
| download_media_itemA | Fetch the bytes of a media item this app uploaded, returned as base64 with its mime type. Resolves the item's current base_url first, so it works with a plain id and never with a stale URL. |
| upload_from_urlA | Download files from public URLs and add them to the user's Google Photos, optionally straight into an album. There is no API to delete a media item once uploaded, so this cannot be undone here: the user would have to remove it by hand in the Google Photos app. Requires confirm: true. Up to 20 URLs per call. |
| upload_fileA | Upload a photo or video from a path on the machine running this server, optionally straight into an album. There is no API to delete a media item once uploaded. Requires confirm: true. |
| save_to_libraryA | Take items the user chose in a picker session and upload them as app-created media, so the other tools can then read, describe and organise them. This is the bridge between the two halves of the API. A picked item is readable only for the life of its session; once saved it is a normal media item this app owns. It does create a second copy in the user's library. Requires confirm: true. Pass base_urls from list_picked_media, up to 20. |
| create_album_with_mediaA | Create an album and upload files into it in a single step. Saves three round trips over create_album, upload_from_url and add_to_album, and leaves no empty album behind if the uploads fail. There is no API to delete uploaded media. Requires confirm: true. Up to 20 URLs. |
| list_accountsA | Show every Google account this server can act as, and which one acts when a tool names none. Pass one of these names as |
| auth_statusA | Report whether the server can reach Google Photos, which account it acts as, and which scopes the grant actually carries. Call this first when anything returns a permission error. A missing scope and a revoked token produce similar-looking failures and are fixed differently. |
| quota_statusA | Report how much of the Google Cloud project's daily budget this server has spent: 10,000 API requests and 75,000 media-byte requests, both resetting at midnight UTC. Counted by this process since it started, so it is a floor rather than a true reading. Worth checking before a long batch, and worth reading when calls start failing with RESOURCE_EXHAUSTED. |
| rawA | Escape hatch for an endpoint this server does not wrap. Give a path relative to the API root and it is sent with the current access token. Prefer a named tool where one exists: they shape the response, handle pagination and explain their errors. Reach for this when the API has something the tools do not cover yet. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| pick-and-work | Have the user choose photos, then do something with them |
| build-album | Create an album from a set of image URLs |
| diagnose | Work out why Google Photos is not responding |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| google-photos-status | |
| google-photos-capabilities |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/navidmoazzez/google-photos-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server