An OpenAPI 3.0-based MCP (Model Context Protocol) server that provides structured access to Immich 2.0 server functionality through tools, resources, and contextual capabilities.
- MCP Protocol Compliance: Full implementation of MCP server interface
- Immich 2.0 Integration: Authenticated access to all major Immich API endpoints
- Tool-based Architecture: Each Immich endpoint group exposed as MCP tools
- OpenAPI 3.0 Schema: Auto-generated discoverable schemas for all tools
- Caching Layer: Optional caching for improved performance
- Docker Ready: Production-ready containerization
albums_list- List all albums with filtering optionsalbums_create- Create new albums with optional assetsalbums_get- Get album details by IDalbums_update- Update album name/descriptionalbums_delete- Delete albumsalbums_add_assets- Add assets to albumsalbums_remove_assets- Remove assets from albums
assets_list- List assets with pagination and filteringassets_get- Get asset details by IDassets_update- Update asset properties (favorite, archived, etc.)assets_delete- Delete assetsassets_bulk_update- Bulk update multiple assetsassets_get_statistics- Get asset statisticsassets_get_random- Get random assets
search_general- General search across all entitiessearch_smart- AI-powered image recognition searchsearch_metadata- Search by EXIF metadata and locationsearch_explore- Explore by detected objects/faces/places
- Clone the repository:
git clone https://github.com/pimpmypixel/immich-mcp-server.git
cd immich-mcp-server- Create a
.envfile:
IMMICH_API_KEY=your_immich_api_key_here
IMMICH_INSTANCE_URL=https://your-immich-instance.com
PORT=8000
LOG_LEVEL=info
CACHE_TTL=300- Build and run with Docker:
docker build -t immich-mcp-server .
docker run --env-file .env -p 8000:8000 immich-mcp-server- Install dependencies:
npm install-
Create
.envfile (see above) -
Run in development mode:
npm run dev- Build for production:
npm run build
npm start| Variable | Required | Default | Description |
|---|---|---|---|
IMMICH_API_KEY |
Yes | - | Your Immich instance API key |
IMMICH_INSTANCE_URL |
Yes | - | Base URL of your Immich instance |
PORT |
No | 8000 | Port for the MCP server |
LOG_LEVEL |
No | info | Logging level (error, warn, info, debug) |
CACHE_TTL |
No | 300 | Cache TTL in seconds for GET requests |
- Log into your Immich web interface
- Go to Account Settings → API Keys
- Create a new API key
- Copy the key to your
.envfile
You have three options for configuring Claude Desktop with the Immich MCP Server:
{
"mcpServers": {
"immich": {
"command": "node",
"args": ["~/ImmichMcpServer/dist/index.js"],
"env": {
"IMMICH_API_KEY": "your_api_key",
"IMMICH_INSTANCE_URL": "https://your-immich-instance.com"
}
}
}
}{
"mcpServers": {
"immich": {
"command": "npm",
"args": ["start"],
"cwd": "~/ImmichMcpServer",
"env": {
"IMMICH_API_KEY": "your_api_key",
"IMMICH_INSTANCE_URL": "https://your-immich-instance.com"
}
}
}
}{
"mcpServers": {
"immich": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"--env", "IMMICH_API_KEY=your_api_key",
"--env", "IMMICH_INSTANCE_URL=https://your-immich-instance.com",
"immich-mcp-server:latest"
]
}
}
}Or with .env file:
{
"mcpServers": {
"immich": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"--env-file", "~/ImmichMcpServer/.env",
"immich-mcp-server:latest"
]
}
}
}- Option 1 (Direct Node.js): Best for development, debugging, and when you want direct control
- Option 2 (npm start): Easiest to set up, handles dependencies automatically
- Option 3 (Docker): Best for production, isolated environment, consistent deployment
- Ensure the project is built:
cd /Users/andreas/Herd/ImmichMcpServer
npm run build- Test the server works:
npm start
# You should see: "Immich MCP Server started successfully"
# Press Ctrl+C to stop-
Find Claude Desktop configuration file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
- macOS:
-
Create or edit the configuration file:
If the file doesn't exist, create it with this content:
{
"mcpServers": {
"immich": {
"command": "npm",
"args": ["start"],
"cwd": "~/ImmichMcpServer",
"env": {
"IMMICH_API_KEY": "KEY",
"IMMICH_INSTANCE_URL": "https://<URL>"
}
}
}
}If the file already exists, add the immich server to the existing mcpServers object:
{
"mcpServers": {
"existing-server": {
"command": "...",
"args": ["..."]
},
"immich": {
"command": "npm",
"args": ["start"],
"cwd": "~/ImmichMcpServer",
"env": {
"IMMICH_API_KEY": "KEY",
"IMMICH_INSTANCE_URL": "https://<URL>"
}
}
}
}- Quit Claude Desktop completely
- Relaunch Claude Desktop
- Verify connection: Look for MCP server indicators in Claude Desktop
In Claude Desktop, try these commands:
- "List my Immich albums"
- "Show me server information"
- "Search for photos with 'beach'"
If Claude Desktop doesn't connect:
- Check the configuration file syntax (use a JSON validator)
- Verify the path: Make sure
/Users/andreas/Herd/ImmichMcpServeris correct - Test manually:
cd ~/ImmichMcpServer npm start
- Check Claude Desktop logs (if available in the app)
- Try with environment variables in .env file instead:
{ "mcpServers": { "immich": { "command": "npm", "args": ["start"], "cwd": "~/ImmichMcpServer" } } }
Connect to the server using stdio transport on the configured port.
// MCP Tool Call
{
"tool": "albums_list",
"arguments": {
"shared": false
}
}// Smart search for beach photos
{
"tool": "search_smart",
"arguments": {
"query": "beach sunset",
"type": "IMAGE",
"size": 10
}
}// Mark asset as favorite
{
"tool": "assets_update",
"arguments": {
"assetId": "asset-uuid-here",
"isFavorite": true
}
}src/
├── mcp/ # MCP protocol implementation
├── immich/ # Immich API client & types
├── tools/ # Individual MCP tool definitions
├── schemas/ # Zod schemas for validation
└── utils/ # Logging, config, utilities
- Define schemas in
src/schemas/mcp-schemas.ts - Create tool class in
src/tools/ - Register in
src/mcp/server.ts
npm testnpm run lint
npm run lint:fixThe server acts as an intelligent middleware layer:
MCP Client → MCP Server → Immich API Proxy → Immich Instance
- MCP Layer: Handles protocol compliance and tool registration
- Proxy Layer: Manages authentication, caching, and error handling
- Tool Layer: Converts REST operations to MCP tools with validation
- Connection Failed: Check
IMMICH_INSTANCE_URLand API key - Authentication Error: Verify API key is valid and not expired
- Tools Not Available: Check logs for tool registration errors
Enable debug logging:
LOG_LEVEL=debugCheck server logs for detailed request/response information.
- Fork the repository
- Create a feature branch
- Make your changes with tests
- Submit a pull request
MIT License - see LICENSE file for details.