Skip to main content
Glama
sweetrb

apple-photos-mcp

by sweetrb

import-photos

Import image and video files from disk into the Photos library, optionally filing them into an existing album. Validates paths, flags duplicates, and returns import details for further actions.

Instructions

Use when: you have image/video files on disk that belong in the Photos library — round-trip edits (export → fix → import), a folder of scans, an SD-card ingest — optionally filed straight into an existing album. Returns: requestedCount (validated source files), importedCount, imported (uuid + filename per new item — feed into get-photos / add-to-album / set-photo-date), and the album when one was targeted. importedCount < requestedCount usually means Photos skipped duplicates. Do not use when: the target album doesn't exist yet — call create-album first (a missing album is an error, not auto-created); or the files are outside your home directory, /tmp, /private/tmp, or /Volumes — those paths are rejected. Safety: WRITE tool — disabled unless APPLE_PHOTOS_MCP_ENABLE_WRITES=1 (run doctor to check). Only ADDS to the library — never modifies or deletes anything; source files stay where they are (Photos copies them in). But note the reverse door is closed: Photos' AppleScript has no photo-delete verb, so an import cannot be programmatically undone — removing a mistaken import requires Photos.app by hand. Every path is validated (absolute, exists, allowed root) before anything imports. Duplicate checking is ON by default; a duplicate then makes Photos.app show a BLOCKING dialog a human must answer (the call waits up to its timeout) — set skipDuplicateCheck=true only when duplicates are acceptable, because they WILL be re-added silently. Drives Photos.app via AppleScript (requires macOS Automation permission; launches Photos if needed). Imports go into the library currently open in Photos.app.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
albumNoEXISTING album (name or UUID) to file the imports into — create it with create-album first if needed
pathsYesAbsolute (or ~-prefixed) file paths of images/videos to import (1–50). Must exist, under your home directory, /tmp, /private/tmp, or /Volumes
skipDuplicateCheckNotrue = skip Photos' duplicate check: duplicates WILL be re-imported silently. Default false: Photos checks, and a found duplicate raises a blocking dialog in Photos.app that a human must answer

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
albumNo
importedNo
importedCountNo
requestedCountNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and excels: labels itself a WRITE tool, requires APPLE_PHOTOS_MCP_ENABLE_WRITES=1, notes it only adds to the library (never modifies/deletes), explains the blocking duplicate dialog, mentions AppleScript permissions and that imports go into the currently open library. Also discloses no programmatic undo.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but structured with headers ('Use when', 'Returns', 'Do not use when', 'Safety') and every sentence provides unique information. For a tool with this many caveats, the length is justified and front-loaded with the primary use case.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all critical behavioral and operational aspects: environment variable, permissions, path validation, duplicate handling, album requirement, and the lack of undo. The output schema exists, so return values need not be detailed, but the description still mentions them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds context beyond schema by specifying that a missing album is an error rather than auto-created and that every path is validated before import. It also reinforces the duplicate-check semantics, though the schema already covers these, so 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Use when: you have image/video files on disk that belong in the Photos library' and clarifies the optional album filing. This clearly states the verb (import) and resource (Photos library), and distinguishes from siblings like export (reverse direction) and create-album (prerequisite for missing albums).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' and 'Do not use when' sections, including the condition that the target album must exist (call create-album first) and that paths must be under allowed roots. Also states the exact environment variable needed to enable the write operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

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/sweetrb/apple-photos-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server