Requires setup of a Google Cloud project to enable the Photos Library API and manage OAuth credentials for library access.
Allows searching photos by content, date, and location, listing albums, and retrieving photo metadata and images from a Google Photos library.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Google Photos MCP Serverfind photos from my trip to Paris last summer"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Google Photos MCP Server
A Model Context Protocol (MCP) server for Google Photos integration, allowing Claude and other AI assistants to access and work with your Google Photos library.
ā ļø Important Notice: 2025 Google Photos API Changes
As of March 31, 2025, Google Photos API access is limited to app-created content only. This MCP server may have limited functionality with your existing photos. For full library access, Google now recommends using the Photos Picker API.
š”ļø Security Notice: CORS Removed (December 2025)
Breaking Change: CORS middleware has been removed for security reasons (commit 8afc1e2).
Why: The previous permissive CORS configuration exposed localhost users to drive-by attacks from malicious websites.
Impact:
ā STDIO mode (Claude Desktop): No impact - continues to work normally
ā SSE mode (Cursor IDE): No impact for same-origin requests
ā Browser-based clients: Will encounter CORS errors
Supported Use Cases:
Claude Desktop (STDIO transport) - Recommended
Cursor IDE (SSE transport)
Server-to-server MCP clients
Not Supported:
Direct browser AJAX calls from web applications
Cross-origin browser requests
For technical details, see .jules/sentinel.md.
ā” Performance & Modern Protocol Support
Streamable HTTP Transport (December 2025)
Upgraded to Streamable HTTP transport (2025-06-18 MCP specification):
ā SSE transport deprecated and removed
ā Modern session-based protocol with proper lifecycle management
ā Supports incremental results and bidirectional communication
ā Production-ready for networked MCP deployments
HTTPS Keep-Alive (December 2025)
The Google Photos API client uses persistent HTTPS connections (Keep-Alive) for performance:
Reduces latency by reusing TCP connections (30-50ms per request)
Connection pooling: Max 50 concurrent connections, keeps 10 idle connections warm
Particularly beneficial for operations with multiple API calls (pagination, location enrichment)
Automatically managed - no user configuration required
Technical Details: Configured with 30s keep-alive probes, 60s idle timeout, optimized for Google Photos API quota limits.
Port Configuration
Dynamic port support via environment variable:
Important: If you change PORT, also update GOOGLE_REDIRECT_URI in .env to match:
Recommended for Claude Desktop: Use STDIO mode instead (no port needed):
Features
ā Search photos by content, date, location
ā Get location data for photos (approximate, based on descriptions)
ā Fetch specific photos by ID
ā List albums and photo collections
ā Retrieve photo metadata and base64-encoded images
ā Proper STDIO mode support for Claude Desktop
ā Enhanced error handling and 2025 API compatibility warnings
ā Works with Claude Desktop, Cursor IDE, and other MCP-compatible clients
API Limitations (Google Photos API)
What This MCP CAN Do:
ā Search and browse photos (read-only access)
ā Get photo details, metadata, and images
ā List albums and their contents
ā Extract location information from descriptions
What This MCP CANNOT Do:
ā Delete photos or albums (API does not support deletion)
ā Upload new photos (beyond scope of this MCP)
ā Modify photo metadata or descriptions
ā Create or manage albums
ā Access precise GPS/EXIF coordinates (API limitation)
Why: The Google Photos Library API provides read-only access. Photo deletion, uploads, and metadata editing must be done through the Google Photos web or mobile app.
Text search behavior
Search queries are tokenized on whitespace/
:and compared against photo filenames, descriptions, timestamps, and any cached location metadata.Tokens that do not appear in any searchable fields are ignored so that queries like
vacation 2023still surface "vacation" matches even when the year is missing from the metadata.When none of the tokens match, the server falls back to the Google Photos API response instead of returning an empty result set, preserving the original ordering for broad or unmatched queries.
Prerequisites
Node.js 18 or newer
Google account with access to Google Photos
Google Cloud project with Photos Library API enabled
Setup
1. Google Cloud Setup
Go to Google Cloud Console
Create a new project
Navigate to "APIs & Services" > "Library"
Search for and enable "Photos Library API"
Go to "APIs & Services" > "Credentials"
Click "Create Credentials" > "OAuth client ID"
Select "Web application" as the application type
Add
http://localhost:3000/auth/callbackas an authorized redirect URINote your Client ID and Client Secret
2. Installation
Clone this repository
git clone https://github.com/savethepolarbears/google-photos-mcp.git cd google-photos-mcpInstall dependencies (ā ļø Required before building):
npm installNote: This installs TypeScript and other build tools. If you get
tsc: command not founderrors, ensure this step completed successfully.Create a
.envfile with your Google Cloud credentials:cp .env.example .env # Edit .env with your credentialsGOOGLE_CLIENT_ID=your_client_id_here GOOGLE_CLIENT_SECRET=your_client_secret_here GOOGLE_REDIRECT_URI=http://localhost:3000/auth/callback PORT=3000 NODE_ENV=developmentBuild the server:
npm run buildThis compiles TypeScript to JavaScript in the
dist/directory.Start the server:
npm startAuthenticate with Google Photos:
Visit
http://localhost:3000in your browserClick "Authenticate with Google Photos"
Follow the Google OAuth flow to grant access to your photos
Important Authentication Notes
ā ļø Authentication must be done in HTTP mode first!
Before using this MCP server with Claude Desktop or other STDIO-based clients:
First run the server in HTTP mode:
npm startComplete the authentication at
http://localhost:3000/authOnly after successful authentication, stop the server and switch to STDIO mode for Claude Desktop
The authentication tokens are stored locally and will persist between server restarts.
Testing with MCP Inspector
The MCP Inspector is an interactive developer tool for testing and debugging MCP servers. It allows you to verify your server's functionality before integrating it with clients like Claude or Cursor.
Install and run the MCP Inspector with your server:
# For HTTP transport npx @modelcontextprotocol/inspector node dist/index.js # For STDIO transport npx @modelcontextprotocol/inspector node dist/index.js --stdioThe Inspector will open a web interface (typically at
http://localhost:6274) where you can:Test all available tools
Verify authentication works correctly
Inspect request/response payloads
Debug any issues with your server
This step is highly recommended before integrating with Claude Desktop or other clients to ensure your server is working correctly.
Usage with Claude Desktop
To use this MCP server with Claude Desktop:
Ensure you have authenticated first (see Authentication Notes above)
Start the server in STDIO mode:
npm run stdioIn Claude Desktop, add the MCP server:
Go to Settings > MCP Servers
Select "Edit Config"
Add the following configuration:
{ "mcpServers": { "google-photos": { "command": "node", "args": ["/path/to/your/project/dist/index.js", "--stdio"], "env": { "GOOGLE_CLIENT_ID": "your_client_id_here", "GOOGLE_CLIENT_SECRET": "your_client_secret_here", "GOOGLE_REDIRECT_URI": "http://localhost:3000/auth/callback" } } } }Save the configuration and restart Claude Desktop
You can now ask Claude to search and fetch photos from your Google Photos account
Usage with Cursor IDE
To use this MCP server with Cursor IDE:
Start the server in HTTP mode:
npm startIn Cursor IDE, configure the MCP server:
Open the MCP panel in Cursor
Click "Add Server"
Choose "Command" as the Type
Enter the following for Command:
node /path/to/your/project/dist/index.jsName it "Google Photos"
Click "Save"
Alternatively, for HTTP mode:
Choose "URL" as the Type
Enter the server URL:
http://localhost:3000/mcpName it "Google Photos"
Click "Save"
Troubleshooting
JSON Parsing Errors in STDIO Mode (Issue #2)
Fixed in latest version! If you're getting errors like "Unexpected token 'S', 'Server run'..." when using the MCP Inspector:
Make sure you're using the latest version of this server
The issue was caused by console output going to stdout instead of stderr in STDIO mode
All logging now properly goes to stderr when using
--stdioflag
Authentication Endpoint Not Working (Issue #1)
Fixed in latest version! The /auth endpoint and HTML page are now properly configured:
Start the server in HTTP mode:
npm startVisit
http://localhost:3000/authin your browserFollow the Google OAuth flow
After authentication, switch to STDIO mode for Claude Desktop usage
Limited Photo Access (2025 API Changes)
Due to Google Photos API changes effective March 31, 2025:
Expected behavior: You may only see limited photos (app-created content)
This is not a bug: Google has restricted API access to app-created content only
Solution: For full photo library access, Google recommends using the Photos Picker API
Current workaround: This server still works but with limited scope
Permission Denied Errors
If you get 403 PERMISSION_DENIED errors:
Check that your Google Cloud project has the Photos Library API enabled
Verify your OAuth credentials are correct in the
.envfileMake sure you've completed the authentication flow via
/authNote: Due to 2025 API changes, some functionality may be limited
Integration with Smithery
Smithery is a registry for MCP servers that makes it easy to discover and install various MCP tools. You can register your Google Photos MCP server with Smithery to make it available to the community.
To install the Google Photos MCP server from Smithery:
For Claude Desktop:
For Cursor IDE:
You can also add a smithery.yaml file to your repository with the following content to make it discoverable:
Available Tools
Search Tools
search_photos: Search for photos based on text queriesParameters: - query: string (e.g., "vacation 2023", "sunset photos", "cats") - pageSize: number (optional, default: 25) - pageToken: string (optional, for pagination) - includeLocation: boolean (optional, default: true)Text queries are applied to filenames, descriptions, timestamps, and available location metadata. Tokens that do not appear in any searchable field are ignored so that stop-words or date fragments do not filter out valid items, and if metadata filteri ng would otherwise remove every item returned by Google Photos the original API response is preserved.
search_photos_by_location: Search for photos based on locationParameters: - locationName: string (e.g., "Paris", "Central Park", "Mount Everest") - pageSize: number (optional, default: 25) - pageToken: string (optional, for pagination)
Photo Tools
get_photo: Get a specific photo by IDParameters: - photoId: string - includeBase64: boolean (optional, default: false) - includeLocation: boolean (optional, default: true)get_photo_url: Get a specific photo URL with size optionsParameters: - photoId: string - size: "s" | "m" | "l" | "d" (small, medium, large, original)
Album Tools
list_albums: List all albumsParameters: - pageSize: number (optional, default: 20) - pageToken: string (optional, for pagination)get_album: Get a specific album by IDParameters: - albumId: stringlist_album_photos: List photos in a specific albumParameters: - albumId: string - pageSize: number (optional, default: 25) - pageToken: string (optional, for pagination) - includeLocation: boolean (optional, default: true)
Example Queries for Claude
Once your MCP server is set up and connected to Claude, you can ask queries like:
"Show me photos from my trip to Paris"
"Find photos of my dog"
"Show me photos from last summer"
"Get photos from my 'Family' album"
"Show me landscape photos from 2023"
"Find photos taken in Yellowstone National Park"
Location Data Support
The Google Photos API doesn't provide exact geolocation coordinates directly. This implementation attempts to extract location information from photo descriptions and uses geocoding to provide approximate location data when possible. Location features include:
Extracting location information from photo descriptions
Geocoding location names to obtain coordinates (using OpenStreetMap/Nominatim)
Searching photos by location name
Including location data in search results (when available)
Note that location data is approximate and may not be available for all photos.
Troubleshooting
If you encounter issues:
Verify your API credentials are correct in the
.envfileCheck the MCP server logs for error messages
Use the MCP Inspector to test the server directly
Ensure you've authorized the application with Google Photos
Try restarting the server and client application
Development
Building
To build the project, run:
Linting
To check for linting errors, run:
Documentation
The codebase is thoroughly documented using JSDoc/TSDoc comments. You can review the source code in src/ to understand the purpose and usage of functions, classes, and interfaces.
License
MIT