Skip to main content
Glama
navidmoazzez

Google Photos MCP

by navidmoazzez

Google Photos MCP

Stars License npm CI YouTube X LinkedIn

Google Photos MCP server for Claude Code and AI agents. Picker-based reads, uploads, albums, sharing and metadata.

It opens Google's own picker, so you choose exactly what the agent sees.

It uploads photos and videos, builds and shares albums, and writes captions.

Google removed whole-library access for every third-party app in April 2025. Asking you to choose is the only honest way in, so this server is built around the picker rather than pretending otherwise.

29 tools. Connect as many Google accounts as you need.

Built and maintained by Navid Moazzez.

You:    I want to put my Iceland shots into a shared album.

Claude: [start_pick_session]
        Open this and choose the ones you want:
        https://photos.google.com/picker/...

You:    Done, picked 24.

Claude: [check_pick_session → list_picked_media → save_to_library → create_album]
        24 items, all photos, shot 3-11 March. They are in a new album
        called "Iceland 2026". Want me to share it?

Contents

Section

1

What you can ask it

Real prompts, not features

2

Quick install

No account needed

3

Setup

Every click, start to finish

4

Connect your client

Nine clients, copy and paste

5

Check it worked

One command

6

Tools

All 29

7

Notes and gotchas

What the API will not do

8

Troubleshooting

Symptom to cause

9

FAQ

Common questions

10

What changed

Every release

Related MCP server: CoreViz MCP

1. What you can ask it 💬

  • Let me pick some photos, then tell me what I chose.

  • Put these six product shots in a new album called "Q3 Launch" and give me a link to share.

  • Which of the ones you uploaded are videos, and how long are they?

  • Write a description on everything in the launch album.

  • Stop sharing the Iceland album.

  • Save what I just picked into my library so you can organise it later.

  • Upload this to my brand account, not my personal one.

  • Download the third photo I picked and tell me whether it is sharp enough to print.

  • What can you actually see in my Google Photos, and what can you not?

  • Add a caption between the second and third photo, then a map from Reykjavik to Vik.

The last one is the point. An album enrichment is a caption, a place, or a map between two points, sitting inline between the photos rather than in a description nobody opens. It is what makes an album read as a story, and almost nothing outside Google's own app drives it.

2. Quick install ⚡

Node 20 or newer. Nothing else.

npx -y @thenavidm/google-photos-mcp --version

That is the whole install. npx fetches it on demand, so there is nothing to update later.

Installing the package needs no account. Only the config in section 4 does.

3. Setup 🔑

Google Photos has no API keys, and Google does not support service accounts for these APIs at all. The only way in is an OAuth client that you create, in a Google Cloud project that you own, authorised by the account whose photos you want to reach.

About ten minutes, once. It is free and you will not be asked for a card.

Before you start

You need

Check with

If missing

Node 20 or newer

node -v

nodejs.org

A Google account

You have one

Any account works, personal or Workspace

It has to be the account that owns the photos, or one you are willing to sign in as.

Have an agent do it

The agent cannot sign in to Google for you. Only you can create the credential. What it can do is walk you through it, wire up the config, and verify the connection.

Paste this into Claude Code, Cursor, or any agent with terminal access:

Help me set up the Google Photos MCP server.

1. Open https://console.cloud.google.com/projectcreate and tell me what to name a project.
2. Walk me through enabling the Photos Picker API and the Photos Library API. Both.
3. Walk me through the Google Auth Platform consent screen, adding me as a test user,
   and adding these four scopes:
     https://www.googleapis.com/auth/photospicker.mediaitems.readonly
     https://www.googleapis.com/auth/photoslibrary.appendonly
     https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata
     https://www.googleapis.com/auth/photoslibrary.edit.appcreateddata
4. Walk me through creating a Web application OAuth client with
   http://localhost:4180 as an authorised redirect URI.
5. STOP and wait. I will paste you the client ID and client secret.
6. Then run: GOOGLE_PHOTOS_CLIENT_ID=... GOOGLE_PHOTOS_CLIENT_SECRET=... \
   npx -y @thenavidm/google-photos-mcp auth
   and tell me to approve it in the browser.
7. Add all three values to my MCP client config, then run doctor to verify.

Or do it yourself

Console labels move. Where a step names a button, that is what it was called at the time of writing. Where it describes a goal instead, that is deliberate.

Step 1: Create a project.

Go to console.cloud.google.com and create a project. Name it something you will recognise in six months.

A project is just a container for the API access and the OAuth client. An existing one works, but a fresh one keeps this credential separate from everything else, which makes it safe to delete later.

Step 2: Turn on both APIs.

Google Photos is two separate APIs and this server uses both. Enabling one and not the other gives you a half-working state where picking succeeds and albums return 403.

Each link opens that API in your project. Click to enable, go back, do the other.

IMPORTANT

Check the project picker in the top bar first. Enabling an API in the wrong project is the single most common way to lose half an hour here.

Step 3: Configure the consent screen.

This lives under Google Auth Platform. If the project has never been set up, its overview page offers a Get started button covering the same fields.

Field

What to put

App name

Something plain, like Photos MCP. Google rejects names containing its own product names, so anything with "Google" in it bounces

User support email

Your own address, from the dropdown

Audience

External, unless you have a Workspace organisation and want to restrict it to people inside it

Contact information

Your email again. This one is for Google to reach you

Step 4: Add yourself as a test user.

On the Audience page, add your own Google account as a test user.

This is easy to skip and it is what causes access_denied at the end of sign-in. While the publishing status is Testing, only accounts on that list can authorise the app, up to 100 of them.

WARNING

In Testing, an authorisation expiresseven days after you grant it, and the refresh token expires with it. Your setup works, then stops a week later for no visible reason. Set the publishing status to In production on the same page to stop that. For personal use this needs no verification review; you click past an "unverified app" warning during sign-in.

Step 5: Add the scopes.

On the Data access page, add these four. If one is not in the list, paste it in manually.

https://www.googleapis.com/auth/photospicker.mediaitems.readonly
https://www.googleapis.com/auth/photoslibrary.appendonly
https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata
https://www.googleapis.com/auth/photoslibrary.edit.appcreateddata

Older guides ask for photoslibrary or photoslibrary.readonly. Do not add those. Google removed them on 1 April 2025, and a project requesting one now fails at the consent screen rather than degrading. The four above are the complete set still available.

Step 6: Create the OAuth client.

On the Clients page, create a client.

  • Application type: Web application. Not "Desktop app". A desktop client cannot be given a redirect URI, and the sign-in command needs one to catch the response.

  • Authorised redirect URI: http://localhost:4180, exactly, with no trailing slash.

That port is where the auth command listens. If 4180 is busy, register http://localhost:<your port> instead and set GOOGLE_PHOTOS_AUTH_PORT to match. The string has to match byte for byte or Google returns redirect_uri_mismatch.

Save, then copy the client ID and client secret. The secret is shown once.

Step 7: Get a refresh token.

export GOOGLE_PHOTOS_CLIENT_ID="your-client-id"
export GOOGLE_PHOTOS_CLIENT_SECRET="your-client-secret"

npx -y @thenavidm/google-photos-mcp auth

A browser opens. Sign in as the account whose photos you want, click past the unverified-app warning, and approve the four permissions. The command prints a refresh token.

If it prints none, this account has already consented to this client before. Remove the app at myaccount.google.com/permissions and run it again.

Revoking

myaccount.google.com/permissions, find the app, remove it. That kills every token from that client at once.

The refresh token reaches your photo library until you do. Treat it like a password: never paste one into an issue, a gist, or a chat.

4. Connect your client 🔌

All three values go in every block below.

Claude Code

claude mcp add google-photos \
  -e GOOGLE_PHOTOS_CLIENT_ID=your-client-id \
  -e GOOGLE_PHOTOS_CLIENT_SECRET=your-client-secret \
  -e GOOGLE_PHOTOS_REFRESH_TOKEN=your-refresh-token \
  -- npx -y @thenavidm/google-photos-mcp@latest

--scope user makes it available in every project rather than the current one. Then run /mcp to confirm it is connected. Remove it with claude mcp remove google-photos.

Claude Desktop

Platform

Path

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "google-photos": {
      "command": "npx",
      "args": ["-y", "@thenavidm/google-photos-mcp@latest"],
      "env": {
        "GOOGLE_PHOTOS_CLIENT_ID": "your-client-id",
        "GOOGLE_PHOTOS_CLIENT_SECRET": "your-client-secret",
        "GOOGLE_PHOTOS_REFRESH_TOKEN": "your-refresh-token"
      }
    }
  }
}

Quit Claude Desktop completely and reopen it. On macOS use Cmd+Q; closing the window is not enough.

TIP

Claude Desktop does not inherit your shell PATH, so a barenpx can fail. Use the absolute path from which npx as the command.

claude.ai on the web

claude.ai runs connectors from Anthropic's cloud, not from your machine, so it cannot launch a local command. It needs a public HTTPS URL.

npx -y @thenavidm/google-photos-mcp@latest --http --port 8000

Host that somewhere with a public HTTPS URL, then in claude.ai: Customize, Connectors, +, Add custom connector. Paste the URL and click Add.

On Team and Enterprise an owner adds it first under Organization settings, Connectors, then each member enables it under Customize, Connectors. Free is limited to one custom connector. A server behind a VPN or firewall will not connect.

Cursor

~/.cursor/mcp.json for every project, or .cursor/mcp.json for one. Same JSON as Claude Desktop, key mcpServers. Reload the window afterwards.

Windsurf

~/.codeium/windsurf/mcp_config.json, same JSON, key mcpServers, then reload.

VS Code

.vscode/mcp.json. The key is servers, not mcpServers, and each entry needs a type:

{
  "servers": {
    "google-photos": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@thenavidm/google-photos-mcp@latest"],
      "env": {
        "GOOGLE_PHOTOS_CLIENT_ID": "your-client-id",
        "GOOGLE_PHOTOS_CLIENT_SECRET": "your-client-secret",
        "GOOGLE_PHOTOS_REFRESH_TOKEN": "your-refresh-token"
      }
    }
  }
}

Codex CLI

~/.codex/config.toml:

[mcp_servers.google-photos]
command = "npx"
args = ["-y", "@thenavidm/google-photos-mcp@latest"]

[mcp_servers.google-photos.env]
GOOGLE_PHOTOS_CLIENT_ID = "your-client-id"
GOOGLE_PHOTOS_CLIENT_SECRET = "your-client-secret"
GOOGLE_PHOTOS_REFRESH_TOKEN = "your-refresh-token"

Gemini CLI

~/.gemini/settings.json, same JSON as Claude Desktop, key mcpServers.

More than one Google account

Swap the three single-account variables for GOOGLE_PHOTOS_ACCOUNTS, a JSON array. Each account carries its own client id and secret, because a refresh token only works with the OAuth client that minted it. Two Google accounts authorised through the same Cloud project can reuse the same pair.

{
  "mcpServers": {
    "google-photos": {
      "command": "npx",
      "args": ["-y", "@thenavidm/google-photos-mcp@latest"],
      "env": {
        "GOOGLE_PHOTOS_ACCOUNTS": "[{\"name\":\"personal\",\"client_id\":\"...\",\"client_secret\":\"...\",\"refresh_token\":\"...\"},{\"name\":\"brand\",\"client_id\":\"...\",\"client_secret\":\"...\",\"refresh_token\":\"...\"}]",
        "GOOGLE_PHOTOS_DEFAULT_ACCOUNT": "personal"
      }
    }
  }
}

Run auth once per account, signing in as a different Google account each time. Then pass account: "brand" on any tool, or leave it off and the default acts. list_accounts shows what is connected.

An exact name wins over a prefix, so personal and personal-archive stay distinct rather than resolving to whichever came first.

Everything else

Zed, Cline, Continue and anything else that speaks MCP over stdio take the same three things: the command npx, the args, and the env block.

Docker

docker build -t google-photos-mcp .
docker run -i --rm \
  -e GOOGLE_PHOTOS_CLIENT_ID=your-client-id \
  -e GOOGLE_PHOTOS_CLIENT_SECRET=your-client-secret \
  -e GOOGLE_PHOTOS_REFRESH_TOKEN=your-refresh-token \
  google-photos-mcp

5. Check it worked 🩺

npx -y @thenavidm/google-photos-mcp@latest doctor

doctor checks four things in the order they fail and stops at the first real problem: credentials present, refresh token mints an access token, every scope actually landed in the grant, and one live API call.

Symptom

Cause

Missing: GOOGLE_PHOTOS_...

A value is not reaching the server. Check the JSON is valid

invalid_grant

Seven days passed with the consent screen in Testing, or the token was revoked

The grant is missing N scope(s)

A scope was added after the token was minted. Run auth again

6. Tools 🛠️

29 tools. Read-only mode leaves 16.

Picking from your library

The only route to photos this server did not upload. Asynchronous by design: a human has to actually use the URL before anything is visible.

Tool

What it does

start_pick_session

Open a picker and return a URL for the user

check_pick_session

Poll until the user has finished choosing

list_picked_media

List what they picked

download_picked

Fetch a picked item's bytes as base64

Albums

Tool

What it does

create_album

Create an empty album

list_albums

List albums this server created

get_album

One album, with cover and sharing state

update_album

Rename, or set the cover photo

share_album

Share by link, and return the URL

unshare_album

Revoke the link

list_shared_albums

Shared albums, with their links

add_to_album

Add up to 50 items

remove_from_album

Remove up to 50, keeping them in the library

add_album_enrichment

Insert a caption, a place, or a map between photos

Media

Tool

What it does

list_app_media

List media this server uploaded, optionally by album

search_library

Filter by date, content category, media type, favourites

describe_filter_capabilities

Every valid filter value, and what is not possible

get_media_item

One item

get_media_items

Up to 50 items in one request

update_media_description

Set a description

download_media_item

Fetch bytes as base64, resolving a fresh URL first

Uploading

Tool

What it does

upload_from_url

Upload up to 20 files from public URLs

upload_file

Upload a local file

save_to_library

Copy picked items in, so the other tools can reach them

create_album_with_media

Create an album and fill it in one call

The connection

Tool

What it does

list_accounts

Every connected Google account, and which one is the default

auth_status

Which account, which scopes, and what is missing

quota_status

How much of the daily budget is left

raw

Call an endpoint this server does not wrap

Resources and prompts

Two resources: google-photos://status for the connection, and google-photos://capabilities for a plain account of what the API can and cannot do. A model that reads the second stops proposing things Google removed.

Three prompts: pick-and-work, build-album, and diagnose.

7. Notes and gotchas 📓

Google removed whole-library read on 1 April 2025. The photoslibrary, photoslibrary.readonly and photoslibrary.sharing scopes are gone for third-party apps, with no replacement outside Google's partner programme. Any tool offering to search your entire library is either on a grandfathered grant or searching only what it uploaded and calling that your library.

So an empty listing means "this server uploaded nothing", not "you have no photos." The tool descriptions say so, so a model does not report it wrongly.

There is no delete. No endpoint exists to remove a media item, for anyone. An upload is permanent as far as any API is concerned, and has to be removed by hand in the Google Photos app. This is why uploads need confirm: true.

There is no free-text search. You cannot search for "beach". Content categories are Google's own classifier and are the nearest equivalent. Call describe_filter_capabilities rather than guessing a category name; a wrong one is rejected, not ignored.

album_id cannot be combined with any other filter. Google rejects it.

A base_url is not a link. It expires in about 60 minutes and serves nothing without a size suffix: =d for the original, =w2048-h2048 resized, =dv for video. Use download_media_item or download_picked, which resolve a fresh URL and pick the right suffix.

Two separate daily quotas, both resetting at midnight UTC: 10,000 API requests and 75,000 media-byte requests. Fetching bytes spends the second, not the first. get_media_items fetches 50 in one request where get_media_item would spend 50.

Writes work by default. Two things need confirm: true, and only two: uploading, because there is no delete, and share_album, because a link that has been sent cannot be recalled. Creating or renaming an album does not. Confirming everything trains a model to confirm without reading.

GOOGLE_PHOTOS_READ_ONLY=1 removes every write from the tool list. GOOGLE_PHOTOS_ALLOW_DESTRUCTIVE=0 keeps ordinary writes and blocks uploading and sharing. GOOGLE_PHOTOS_AUDIT_LOG=<path> records every attempted write.

Album titles and descriptions are text other people wrote, and a collaborative shared album can be written to by anyone with the link. Treat anything read back as data, never as instructions.

8. Troubleshooting 🔧

Symptom

Cause and fix

Everything returns a permission error

The grant is missing a scope. Adding one in the console does not upgrade an existing token: run auth again. doctor names which

invalid_grant, worked last week

Seven days passed with the consent screen in Testing. Publish it, or re-run auth

invalid_client

The id or secret does not match the project. Check for a literal \n left by a copy-paste out of a quoted string

redirect_uri_mismatch during auth

The registered URI is not exactly http://localhost:4180. No trailing slash, http not https, localhost not 127.0.0.1

access_denied after signing in

Your account is not on the test user list, or you signed in as a different one

A read returns nothing

Almost always correct. This server has uploaded nothing yet. Use start_pick_session

A base_url returns 403

It expired, or has no size suffix. Use download_media_item

RESOURCE_EXHAUSTED

Daily quota. Check quota_status; it resets at midnight UTC

Nothing appears in Claude Desktop

Node is not on the PATH Desktop sees, or the JSON is malformed. Check ~/Library/Logs/Claude/mcp-server-google-photos.log

9. FAQ ❓

What is an MCP server?

Model Context Protocol is an open standard that lets an AI assistant use outside tools. An MCP server exposes a set of tools, and any MCP client (Claude Code, Claude Desktop, Cursor, Windsurf, VS Code, Codex CLI, Gemini CLI) can call them. This one exposes Google Photos.

Can it search all my photos?

No, and nothing can. Google removed that for third-party apps on 1 April 2025. It can show you a picker, and you choose what it sees.

Can it delete a photo?

No. Google exposes no delete endpoint to any app. That is also why uploading asks for confirmation.

Does it upload my photos anywhere?

No. It runs on your machine and talks directly to Google. There is no service in the middle. Photo bytes are held in memory for one call and never cached.

Is my refresh token safe?

It is scoped to four permissions and no more: read what you pick, upload, read back what it uploaded, edit what it created. It cannot read your existing photos and cannot reach any other Google service. It still reaches a real photo library, so treat it as a password. Revoke at myaccount.google.com/permissions.

Why do I have to create my own Google Cloud project?

Google Photos has no API keys and does not support service accounts. A user OAuth grant is the only way in, and a grant needs a client. Setup is once.

Why did it stop working after a week?

The OAuth consent screen is in Testing, where Google expires authorisations after seven days. Set it to In production.

Do I need Google to verify my app?

Not for your own use. You click past an "unverified app" warning. Verification matters only when other people will use your client, and Google Photos scopes need a separate review on top of the usual one.

Can I run it for more than one Google account?

One account per server instance. Run a second instance with a different refresh token under a different name in your client config.

Can I use it from claude.ai on the web?

Yes, but claude.ai runs connectors from Anthropic's cloud, so it needs the HTTP transport hosted somewhere with a public HTTPS URL. See section 4.

How do I stop an agent changing anything?

GOOGLE_PHOTOS_READ_ONLY=1. The write tools are not registered at all, so a model cannot call what it cannot see, and the list drops from 29 tools to 16.

How do I know it is actually working?

doctor. It tests credentials, scopes and a live API call, and names the first real problem rather than leaving you to guess.

10. What changed 📦

Every release, newest first, in VERSIONS.md, with the upstream API and action versions this was last checked against.

FAQ ❓

An MCP server is a standard way to give an AI assistant real access to a tool, so it can act rather than guess. You install it once, your assistant gains the tools, and it works in Claude, Cursor, ChatGPT and anything else that speaks the protocol.

It cannot, and this is the most important thing to understand about it. Google removed the broad library scopes from new grants on 1 April 2025. An app created today can read only what it uploaded itself, plus whatever you hand it through Google's own picker.

Anything promising full library access on a new project is describing a world that no longer exists.

The picker is Google's own selection screen. You choose the photos, and only those become visible to the server. It exists because Google decided that reading someone's entire library should be the user's explicit choice each time rather than a permission granted once.

In practice you pick a set, the server reads it, and nothing else is exposed.

It asks for four narrow scopes: read what you picked, upload new media and create albums, read back only what this app created, and edit descriptions and album membership for that same app-created data. None of them grant access to photos it did not upload or you did not pick.

Nothing leaves your machine except calls to Google. There is no backend here, no account to create and no telemetry. Your credential sits in your client's config or your local data directory.

It cannot delete anything. Google's API exposes no delete for library media, so there is nothing to call. The strongest thing it does is edit descriptions and album membership for items it created itself.

It uploads and creates albums when you ask it to. Setting GOOGLE_PHOTOS_READ_ONLY=1 removes every write tool from the list, so the model cannot see or call them.

It costs nothing. The server is MIT licensed and the Google Photos API is free. Uploads count against your normal Google storage, the same as any other upload.

It works with any MCP client. Claude Code, Claude Desktop, Cursor, Windsurf, VS Code, Codex CLI and Gemini CLI all run it the same way.

Remove the app's access at myaccount.google.com under Security, then Third-party apps, which invalidates the token immediately. Then remove the server from your client's config.

Questions

Run into a problem or have a question? Open an issue and I will help.

About the author 👋

Navid Moazzez is a leading AI business strategist, and the host of the AI Creator Summit, watched by 100,000+ creators. He helps creators and founders master AI and build their own AI Operating System (AI OS) to automate their business and life. This Google Photos MCP server is one piece of that system.

Links

If this is useful, star the repo and come say hi on X.

Dependencies

Library

License

What it does

MCP TypeScript SDK

MIT

The MCP server and transports

zod

MIT

Tool argument schemas and validation

Security

Found a vulnerability? Report it privately, not as a public issue. SECURITY.md covers what this server holds, the write-safety model, and running it over HTTP.

License

MIT. Free to use, modify, and share.

Not affiliated with, endorsed by, or connected to Google LLC.


© 2026 NM Media. Made with ❤️ by Navid Moazzez.

Available Tools

29 tools
add_album_enrichmentAdd a caption, location or map to an albumA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoFor type 'text': the caption.
typeYesWhat to add.
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
album_idYesThe album to enrich.
latitudeNoFor type 'location': latitude.
longitudeNoFor type 'location': longitude.
origin_nameNoFor type 'map': the starting place name.
location_nameNoFor type 'location': the place name to show.
origin_latitudeNoFor type 'map': starting latitude.
destination_nameNoFor type 'map': the ending place name.
origin_longitudeNoFor type 'map': starting longitude.
after_media_item_idNoPlace the enrichment after this item. Omit to put it at the end of the album.
destination_latitudeNoFor type 'map': ending latitude.
destination_longitudeNoFor type 'map': ending longitude.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already convey mutability and non-destructiveness; the description adds behavior beyond them by explaining that enrichments occupy sposition between photos and that position defaults to the album end. This helps an agent anticipate placement semantics without contradicting the annotations.

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?

Two short sentences, front-loaded with the core action and enrichment types, then a single high-value positional default. No flff or repetition of schema content.

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

Completeness4/5

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

For a write tool with no output schema, the description covers the conceptual purpose, the three type variants, and the one non-obvious behavioral default. It does not explain return values, but this is a minor gap for an insert operation with a fully self-describing schema.

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 description coverage is 100%, so the paramter baseline is 3. The description adds semantic value by explicitly stating the default placement behavior of after_media_item_id, which is useful for constructing a valid invocation.

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?

Names a specific operation, 'Insert an enrichment into an album,' and enumerates the three concrete enrichment kinds: text caption, named location, or map between places. The phrase 'enrichments sit between photos' implicitly separates this from sibling tools that add media to albums.

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

Usage Guidelines4/5

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

Provides clear context about when this tool makes sense (adding storytelling elements between photos) even though it does not explicitly name sibling alternatives or exclusions. The positional default notes how the insertion behaves, which is actionable guidance.

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

add_to_albumAdd media to an 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
album_idYesThe album to add to.
media_item_idsYesMedia item ids, up to 50.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations indicate a mutating operation, and the description adds meaningnful behavioral constraints beyond them: app-created media and album, the picked-item limitation, the save_to_library prerequisite, and the 50-item cap. This gives an agent a clear model of what the tool will and won't accept.

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?

Three short sentences, tightly packed with the essential constraint and limit. No redundant or filler content; the key usage rule is front-loaded.

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

Completeness4/5

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

For a mutating tool with no output schema, this description covers the important preconditions, the main exception, and the batch limit. It doesn't describe response or error behavior, but those are less critical and not indicated in annotations.

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% and parameter descriptions are alraedy informative. The description adds extra semantic value by clarifying that album_id and media_item_ids must refer to app-created entities, and that picked media must be uploaded first, which is not captured in the schema.

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?

States a specific verb and resource: adding media items to an album. Clearly distinguishes itself by emphasizing the app-created constraint on both sides, which differentiates it from operations like remove_from_album and create_album_with_media.

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?

Explicitly states when this tool applies: both the media items and the album must be app-created. It also gives an explicit exclusion and alternative: picked items cannot be added directly and must first be uploaded via save_to_library.

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

auth_statusCheck the Google Photos connectionA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds diagnostic nuance: it inspects the actual grant scopes and warns that two failure modes look similar but are fixed differently, which is useful beyond the annotations.

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?

Two sentences, each with a distinct job: define the report and give the triggering scenario. No filler or repetition.

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?

The tool is a simple optional-parameter read-only diagnostic, and the description states its output dimensions and when to invoke it. With annotations covering safety, nothing needed for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the optional 'account' parameter is fully documented in the input schema. The description adds nothing about the parameter, so the baseline 3 applies.

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?

States a specific verb ('Report') and resource ('server can reach Google Photos'), plus the three outputs: reachability, acting account, and actually granted scopes. This distinguishes it from sibling list_accounts (identity only) and quota_status (usage), so an agent can select it without inspecting schemas.

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

Usage Guidelines4/5

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

Gives an explicit trigger: 'Call this first when anything returns a permission error' and explains why with the missing-scope vs revoked-token distinction. It does not mention when not to use it or name alternatives, but the context is clear.

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

check_pick_sessionCheck whether the user has finished pickingA
Read-onlyIdempotent

Poll a picker session started by start_pick_session. ready is true once the user has confirmed a selection.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
session_idYesThe session_id returned by start_pick_session.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare this as safe, read-only, idempotent, and non-destructive. The description adds behavioral context beyond those hints: `ready` flips to true on confirmation, and prolonged false suggests the user hasn't opened the link. This explains the polling lifecycle without contradicting the annotations.

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?

Two short paragraphs, each earning its place: the first states purpose and the core `ready` behavior, the second gives operational polling guidance. No filler or redundant repetition of the title or schema.

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?

For a simple polling tool, the description covers what the agent needs: how to start the poll, what `ready` indicates, how often to poll, and when to abandon polling. The optional account parameter is fully described in the schema, and no output schema exists to complicate expectations. The guidance about asking the user handles the realistic failure case.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both `session_id` and `account`. The description reinforces that the session comes from start_pick_session and implies polling frequency is referenced from that call, but it adds little beyond the schema. Baseline 3 is appropriate.

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 a specific verb and resource: 'Poll a picker session started by start_pick_session.' It clearly defines the tool's responsibility and gives the key semantic detail that `ready` is true once the user confirms a selection. This distinguishes it from sibling tools like start_pick_session and list_picked_media.

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?

The description provides explicit guidance on how to poll: respect `poll_interval_seconds`, avoid tight looping, and stop polling after a few minutes to ask the user. It names the originating tool and gives a clear 'when not to continue' condition, which is strong usage guidance for an agent.

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

create_albumCreate an 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesThe album title as the user will see it.
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.

TDQS

A4.2/5.0
Behavior4/5

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

There are no readOnly or destructive annotations, so the description carries the behavioral disclosure burden. It does disclose meaningful side effects: the album is private, belongs to this app, and is created empty, which explains why it is editable later. It doesn't mention permissions or reversibility, but for a simple create action this is solid context.

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?

Three short sentences, front-loaded with the core verb-object, followed by ownership/privacy context and next-step usage. Every sentence earns its place; there is no redundant wording or filler.

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

Completeness4/5

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

For a simple 2-parameter create tool with no output schema, the description covers what is created, the privacy and ownership model, and how to proceed afterward. It does not explicitly describe the return value or name the sibling create_album_with_media, but the reference to passing album_id when uploading implies the created album exposes an album_id, which is enough in context.

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

Parameters3/5

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

Both parameters are fully documented in the schema, so the description does not need to repeat parameter details. The mention of album_id is useful workflow guidance but does not add semantic detail about this tool's own parameters beyond what the schema already provides.

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 clearly states the verb and resource: it creates a new, empty album in the user's Google Photos. It also distinguishes itself from siblings by emphasizing 'empty', 'private', and 'belongs to this app', which separates it from create_album_with_media and the album management tools.

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

Usage Guidelines4/5

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

It explains the intended workflow: create the empty album, then add items later via add_to_album or by passing album_id when uploading. It does not explicitly name create_album_with_media as the alternative when an album should be created with items, so it lacks an explicit when-not-to-use statement.

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

create_album_with_mediaCreate an album and fill it in one callA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsYesPublic URLs to upload into it, up to 20.
titleYesThe album title.
max_mbNoSkip any file larger than this, in MB. Default 100.
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
confirmNoMust be true for this to run. The effect cannot be undone through the API, so it is refused without an explicit confirmation.
descriptionNoDescription applied to every uploaded item.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark destructiveHint=true, and the description adds important behavioral context beyond that: 'There is no API to delete uploaded media', 'Requires confirm: true', and 'leaves no empty album behind if the uploads fail'. This meaningfully discloses consequences and transactional behavior, exceeding what the annotations alone provide.

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 brief and front-loaded with the primary purpose in the first sentence, followed by high-value caveats and constraints. Every sentence adds operational information without redundancy.

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

Completeness4/5

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

For a composite mutation tool with six parameters and no output schema, the description together with the rich schema covers purpose, safety, limitations, and alternatives. It could mention what the tool returns, but that is not essential for correct selection and invocation given the schema's completeness.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents every parameter fully. The description reinforces 'Up to 20 URLs' and 'Requires confirm: true', but adds little new parameter meaning beyond the schema's existing descriptions.

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 states a specific verb and resource: create an album and upload files in a single step. It explicitly names the three siblings it composes (create_album, upload_from_url, add_to_album), clearly distinguishing it from them.

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?

The description says this tool saves three round trips over the listed alternatives and notes that it leaves no empty album behind if uploads fail, giving a clear reason to choose it over the multi-step flow. It also warns about the irreversible nature of uploads, which helps the agent decide when caution is needed.

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

describe_filter_capabilitiesList every filter value search_library acceptsA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations, the description adds valuable behavioral context: it costs no API call and no quota, and incorrect category names are rejected rather than ignored. It also discloses that the tool reports what the Google Photos API cannot do, setting accurate expectations.

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 compact and front-loaded with the core purpose, then adds a short, high-value usage warning. Every sentence earns its place and no irrelevant details are included.

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?

For a simple introspection tool with one optional parameter and strong annotations, the description fully covers what the tool returns, when to use it, and its cost/quota behavior. No output schema is needed because the return value is the list of accepted filters itself.

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

Parameters3/5

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

Schema coverage is 100%, so the one optional parameter is already fully documented in the input schema. The description adds no parameter-specific meaning, which matches the baseline of 3 for high schema coverage.

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 names a specific verb (Return) and a precise resource (the filter values search_library accepts), and further narrows it to content categories, media types, and feature filters. It also distinguishes the tool from search_library by making clear it lists accepted values rather than performing searches.

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

Usage Guidelines4/5

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

The description clearly tells the agent when to call it: 'Read this before guessing a category name.' It also notes that a wrong guess is rejected, reinforcing the need to consult this tool first. It does not explicitly mention alternatives, but none are needed for an introspection tool.

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

download_media_itemDownload a media itemA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoSize suffix: 'd' for the original, or 'w2048-h2048' to cap the long edge. Default 'w2048-h2048'.
max_mbNoRefuse anything larger, in MB. Default 25.
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
media_item_idYesThe media item to download.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover readOnly, idempotent, and non-destructive. The description adds meaningful behavioral details: it resolves the item's current base_url internally, works with a plain id, and never relies on a stale URL. It also discloses the return type (base64 + mime), going beyond what annotations express. No contradiction detected.

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?

Two concise, purposeful sentences. The first frontloads the action and output format; the second explains the URL-resolution behavior and its benefit. No filler or repetition of schema fields.

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

Completeness4/5

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

For a simple download tool with four documented parameters, no output schema, and a safety profile in annotations, the description covers the essential return information (base64 + mime), the scoping limitation (this app uploaded), and the id handling behavior. It does not detail error or size-limit behavior, but max_mb is already documented in the schema.

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 description coverage is 100%, so the baseline is 3. The description adds value by specifying that media_item_id should be a plain id (not a pre-resolved URL) and that the tool handles resolution itself, which the schema's 'The media item to download.' does not convey.

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 states a specific verb ('Fetch') and resource ('bytes of a media item this app uploaded'), and clarifies that output is base64 with mime type. This clearly distinguishes it from siblings like get_media_item, which likely returns metadata rather than raw bytes.

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

Usage Guidelines3/5

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

The description implies the right context — using a plain media_item_id for an app-uploaded item when raw bytes are needed. However, it never explicitly contrasts with related siblings such as download_picked or get_media_item, so an agent gets no direct 'when-not-to-use' guidance.

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

download_pickedDownload a picked photo or videoA
Read-onlyIdempotent

Fetch the bytes of an item the user picked, returned as base64 with its mime type. Pass the item's base_url from list_picked_media.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoSize suffix. 'd' for the original file, or 'w2048-h2048' to cap the long edge. Defaults to 'w2048-h2048', which is plenty for viewing and far smaller than an original.
max_mbNoRefuse anything larger, in MB. Default 25.
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
base_urlYesThe `base_url` of an item from list_picked_media.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, idempotentHint, etc.), the description discloses important behaviors: the underlying URL is transient and auth-scoped, large files are refused, and the default size suffix is capped. These details help an agent anticipate failures and choose parameters correctly, going well beyond what annotations alone convey.

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 compact and front-loaded: the first sentence states the core function, the second gives the required input, and the following sentences provide only decision-relevant caveats. Every sentence earns its place, with no repetition of schema content or annotations.

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?

Although there is no output schema, the description specifies the return shape (base64 with mime type) and covers the critical operational constraints (auth, expiry, size caps, max_mb intent). The 4 parameters are fully documented in the schema, so nothing an agent needs to invoke correctly is missing.

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?

With 100% schema coverage, the baseline is 3, and the description adds extra meaning: it labels base_url as coming from list_picked_media and explains when to raise max_mb ('only when the caller genuinely needs the original'). The size and account parameters are well documented in the schema, and the description enriches the two most context-sensitive parameters.

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

Purpose4/5

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

The description clearly states the action ('Fetch the bytes') and the resource ('an item the user picked'), and specifies the return format (base64 with mime type). It also ties the input to list_picked_media, which scopes the tool distinctly from library download tools. However, it does not explicitly name or contrast the sibling download_media_item, so sibling differentiation is achieved only implicitly through the 'picked' vocabulary.

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?

The description gives explicit when-to-use guidance: 'Use this rather than giving a base_url to the user or to another tool,' with the concrete reasons (auth header, size suffix, expiry within the hour). It also advises on max_mb, telling the agent to raise it only when the caller genuinely needs the original. This is strong, actionable routing guidance.

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

get_albumGet one albumA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
album_idYesThe album id, from list_albums or create_album.

TDQS

A4.5/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond the readOnlyHint/openWorldHint/idempotentHint annotations: what fields are returned, the special meaning of a 404 (album exists but not app-created), and a hard time-based scope limitation (since 2025-04-01). No contradiction with annotations.

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?

Two short paragraphs, the first front-loading the core action and result fields, the second packing troubleshooting and scope limitations into three tight sentences. Every sentence carries useful information with zero redundancy.

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?

For a single-item read tool with no output schema, this is fully complete: an agent knows what it will get, how errors behave, which scope applies, and what the id originates from. The only omission is the optional account parameter, which is already covered by the schema.

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

Parameters3/5

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

Schema coverage is 100% and both parameters are fully described in the schema. The description reinforces that album_id is the lookup key but adds no new semantics about the account parameter or value formats, so the baseline of 3 applies.

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 a specific verb and resource: 'Fetch a single album by id', naming the exact return scope (item count, cover photo, sharing state). It clearly differentiates from siblings like list_albums by emphasizing single-album retrieval.

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

Usage Guidelines4/5

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

It implies the correct usage context (when you already have an album id) and provides critical exclusions: the album must have been created by this app, and Google Photos native albums are invisible. It does not explicitly name an alternative tool (e.g., list_albums), but the guidance is clear enough for an agent to select this over fetching a list.

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

get_media_itemGet one media itemA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
media_item_idYesThe media item id.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds meaningful context beyond annotations: the returned fields and the important limitation that only app-uploaded media is accessible. This is useful behavioral disclosure, though it does not discuss error cases.

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?

Three sentences deliver the core action, return contents, scope limitation, and the routing alternative with no wasted words. The most important information is front-loaded.

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?

For a simple read-only single-item fetch with one required parameter and no output schema, this description is complete: it explains what is returned, the access boundary, and the correct alternative for other cases. The annotations cover idempotency and safety, so no critical call-time information is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are already documented. The description reinforces that media_item_id is the lookup key and adds the return fields, but it does not add meaning to the account parameter beyond what the schema already provides. Baseline 3 is appropriate.

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 uses a specific verb ('Fetch') and resource ('a single media item by id'), and states the key returned fields: dimensions, creation time, and description. It also explicitly distinguishes itself from start_pick_session, which is the sibling for reaching non-app-uploaded library content.

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?

The description clearly states when to use this tool (fetch one media item by id) and when not to ('To reach anything else in the user's library, use start_pick_session'). The scope boundary—only media uploaded by this app—gives an agent a concrete decision rule.

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

get_media_itemsGet several media items at onceA
Read-onlyIdempotent

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 failed with a reason, rather than failing the whole call.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
media_item_idsYesMedia item ids, up to 50.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior. The description adds valuable beyond-annotation context: the 50-item cap, the app-only media scope, and the partial-failure behavior where unreadable IDs appear in 'failed' instead of failing the whole call.

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?

Three tight sentences, each earning its place: the core capability, the preferred-use and scope guidance, and the failure behavior. The most important information is front-loaded and there is no redundant filler.

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?

For a read-only batch retrieval tool with rich annotations, complete coverage of parameters in schema, and clear behavioral notes, the description leaves no material gap. It explains quota implications, scope, alternatives, and partial-failure semantics without needing an output schema.

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 the baseline is 3. The description adds meaning by clarifying that media_item_ids are batched, limited to 50, and that individual failures are handled gracefully via a 'failed' field. This enriches the parameter's practical semantics beyond the schema.

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 uses a specific verb ('Fetch'), states the resource ('media items by id'), and gives a clear bound ('up to 50 ... in one call'). It also distinguishes itself from the singular get_media_item and from start_pick_session, making the tool's unique role unmistakable.

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?

The description explicitly says to prefer this over repeated get_media_item calls and explains why. It also provides the exclusion condition: for anything beyond app-uploaded media, use start_pick_session. This is direct, actionable routing guidance.

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

list_accountsList the connected Google accountsA
Read-onlyIdempotent

Show every Google account this server can act as, and which one acts when a tool names none.

Pass one of these names as account on any tool to act as that library instead of the default. Costs no API call.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark the operation read-only, idempotent, and non-destructive. The description adds useful behavioral context beyond those: the tool reveals the default account behavior, and it explicitly notes the call incurs no API cost. It doesn't describe output format, but no output schema exists and this is a simple list operation.

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 two compact paragraphs with no wasted words. The main purpose is front-loaded in the first sentence, and the second sentence explains downstream usage and cost without redundancy.

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?

Given no input parameters and ample annotations, the description covers everything an agent needs: what accounts are shown, how the default is represented, and how to use the returned names in other tools. The lack of an output schema is mitigated by the direct description of the listing content.

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?

The tool accepts zero parameters, so the schema fully covers parameter semantics (100% coverage). Baseline for zero parameters is 4; the description's mention of the `account` parameter on other tools clarifies how the returned names are consumed, adding slight context but not changing this tool's schema.

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 starts with a specific action and resource: 'Show every Google account this server can act as,' and uniquely distinguishes this tool from siblings by also revealing that it identifies the default account when no account is named. This separates it clearly from auth_status or quota_status.

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

Usage Guidelines4/5

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

It states when to use the results by instructing the agent to 'Pass one of these names as `account` on any tool to act as that library instead of the default.' It also adds a cost characteristic ('Costs no API call') that informs decision-making, though it doesn't name alternative tools or exclusion criteria.

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

list_albumsList albumsA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many to return per page, 1-100.
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
page_tokenNoContinue from a previous page. Pass the `next_page_token` from the last result. Omit for the first page.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description reveals important non-obvious behavior: only app-created albums are returned, user-created albums are hidden due to a scope boundary, results are ordered newest first, and pagination is required via next_page_token. These are operational details an agent needs before calling.

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?

Three sentences deliver the core purpose, the critical scope limitation, and the pagination instruction with no filler. The most decision-relevant information is front-loaded.

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?

For a read-only paginated list with no required parameters, the description covers scope, ordering, a key availability boundary, and how to continue paging. The lack of an output schema is acceptable because the tool's list semantics and sibling context make its return expectations clear.

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

Parameters3/5

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

The input schema already covers all three parameters at 100%, so the description does not need to repeat their formats. The description adds only a general pagination reminder without introducing new per-parameter meaning, matching the baseline for full schema coverage.

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 states a specific action and resource: 'List the albums this app created, newest first.' It also distinguishes itself from album-related siblings by explicitly limiting results to app-created albums and noting that user-created Google Photos albums are not visible.

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

Usage Guidelines4/5

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

The description gives clear scoping context: it should be used for app-created albums, and user-created albums are unavailable to any scope since 2025-04-01. It does not explicitly name sibling alternatives like list_shared_albums, so it stops short of full alternative routing.

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

list_app_mediaList media this app uploadedA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many to return per page, 1-100.
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
album_idNoLimit to one album. Omit to list everything this app uploaded.
page_tokenNoContinue from a previous page. Pass the `next_page_token` from the last result. Omit for the first page.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds useful behavioral context beyond that: only app-uploaded media is returned, results are newest-first, and album scoping is optional, with no contradictions.

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?

Three short sentences front-load the core purpose and scope, then provide the alternative and pagination. Every sentence carries distinct useful information with no repetition.

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?

The description is complete for a filtered read-only listing tool: scope, ordering, pagination, and routing to the appropriate sibling are all present. The rich annotations and fully described schema cover the remaining safety and parameter context.

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

Parameters3/5

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

All four parameters are fully documented in the schema, so the description does not need to add parameter-level detail. It slightly reinforces album scoping and pagination but adds no semantics beyond the schema.

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?

Description names the resource (media items), action (List), ordering (newest first), and scope (this app's uploads, optionally one album). It also explicitly contrasts with start_pick_session, so an agent can distinguish it from the closest sibling.

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?

States when to use it (listing this app's uploads) and when not ('To reach anything else in the user's library, use start_pick_session'). The pagination note gives a concrete operational instruction for continuing results.

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

list_picked_mediaList what the user pickedA
Read-onlyIdempotent

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 base_url that expires in about an hour. To get actual bytes, pass an item's base_url to download_picked rather than handing the URL to the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many to return per page, 1-100.
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
page_tokenNoContinue from a previous page. Pass the `next_page_token` from the last result. Omit for the first page.
session_idYesThe session_id returned by start_pick_session.

TDQS

A4.7/5.0
Behavior5/5

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

The annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds context beyond those annotations: empty results until confirmation, the ~1-hour expiry of base_url, and the need to use download_picked for actual bytes. This is exactly the kind of behavioral disclosure that helps an agent act safely.

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 compact and front-loaded: the core purpose appears first, followed by the prerequisite call, then the crucial download guidance. Every sentence earns its place and no filler is present.

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?

For a read-only list tool with 100% schema coverage, the description covers the non-obvious return behavior (empty until confirmed), the expiring base_url, and how to access actual bytes. No output schema exists, but the key behavior an agent needs to call and interpret this tool correctly is present.

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

Parameters3/5

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

All four parameters are already fully documented in the input schema, including session_id's origin from start_pick_session, pagination with next_page_token, and account selection. The description does not add parameter-level meaning beyond the schema, so the baseline of 3 is appropriate.

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 states a specific verb and resource: 'Return the media items the user selected in a picker session.' This clearly distinguishes the tool from library search, album listing, and item download, and is consistent with the title.

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?

The description explicitly tells the agent to call check_pick_session first and explains that the result is empty until selection is confirmed. It also routes actual byte retrieval to download_picked rather than exposing the expiring base_url directly, giving clear when-to-use and when-not-to-use guidance.

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

list_shared_albumsList shared albumsA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many to return per page, 1-100.
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
page_tokenNoContinue from a previous page. Pass the `next_page_token` from the last result. Omit for the first page.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful context beyond those annotations: the app-only scope, the inclusion of share links, and the API limitation that user-created Google Photos albums are invisible as of 2025-04-01.

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 two sentences with no fluff. The core function is front-loaded in the first sentence, and the critical scope limitation is stated concisely in the second. Every sentence earns its place.

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?

For a read-only, idempotent list tool with zero required parameters and a fully documented schema, the description covers everything an agent needs to invoke it correctly: what it returns, what scope it operates under, and an important API constraint. The lack of an output schema is not a serious gap because the description explicitly mentions share links and the pagination parameter is already documented.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters limit, account, and page_token are already fully documented in the schema. The description does not add parameter-specific guidance, which is acceptable because the baseline for full schema coverage is 3 and no extra semantic burden is placed on the description.

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 uses a specific verb ('List') and a specific resource ('shared albums this app created'), and clearly states the result includes share links. It also distinguishes itself from general album listing by explicitly excluding albums the user created directly in Google Photos, preventing confusion with sibling tools like list_albums.

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

Usage Guidelines4/5

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

The description gives clear context about when this tool applies: only albums created by this app are listed, and user-created Google Photos albums are not visible. It does not explicitly name an alternative tool, but the scope constraint effectively tells an agent when not to rely on this tool.

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

quota_statusCheck how much daily quota is leftA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

Adds a critical behavioral caveat beyond what annotations provide: the count is 'a floor rather than a true reading' because it is 'counted by this process since it started.' This prevents the agent from over-trusting the number as the authoritative Google Cloud quota figure. It also discloses the specific limits and reset period. No contradiction with readOnlyHint=true.

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?

Three sentences with distinct jobs: what it reports and the limits, the measurement caveat, and when to call it. Every sentence earns its place; there is no filler or repetition of the title.

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?

For a 0-parameter status tool with rich annotations, the description covers what is measured, both quota types, limits, reset time, the floor caveat, and recommended usage timing. The lack of an exact return format is a minor gap since the reported quantities are already specified.

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?

The tool has 0 parameters and an empty schema (100% coverage trivially), so the baseline of 4 applies. There are no parameters in need of explanation or compensation.

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 uses a specific verb ('Report') and resource ('the Google Cloud project's daily budget') with concrete limits (10,000 API requests, 75,000 media-byte requests) and a reset time (midnight UTC). No sibling tool covers quota, so it is unambiguous which tool this is.

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

Usage Guidelines4/5

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

Gives two explicit trigger conditions: check before a long batch, and check when calls start failing with RESOURCE_EXHAUSTED. It does not name alternatives or when-not-to-use, but none of the 28 siblings competes for this role, so the context is still clear.

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

rawCall a Google Photos endpoint directlyA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiYesWhich host: 'library' for photoslibrary.googleapis.com/v1, 'picker' for photospicker.googleapis.com/v1.
bodyNoJSON body, for POST and PATCH.
pathYesPath under the v1 root, starting with a slash. For example '/albums'.
queryNoQuery string parameters.
methodNoHTTP method. Default GET.
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.

TDQS

A4.4/5.0
Behavior4/5

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

The description discloses meaningful behavioral traits beyond the annotations: it uses the current access token, and unlike named tools, it does not shape responses, handle pagination, or explain errors. The annotations are neutral on safety, so this added context helps the agent anticipate raw output and error behavior.

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 compact and front-loaded: it defines the purpose in the first sentence, explains the mechanism in the second, and then gives usage guidance. Every sentence contributes value without redundancy.

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

Completeness4/5

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

For an arbitrary endpoint escape hatch, the description covers the essential context: when to use it, the auth mechanism, and the trade-offs versus named tools. The parameter details are fully handled by the schema, so nothing critical is missing for invoking the tool correctly.

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

Parameters3/5

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

The input schema already describes all six parameters with full coverage, including enums, defaults, and examples. The description adds little parameter-level detail, but with 100% schema coverage, no additional compensation is needed.

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 clearly defines the tool as an escape hatch for unwrapped Google Photos endpoints, stating exactly what it does: send a path relative to the API root with the current access token. It also distinguishes itself from the sibling named tools by positioning raw as the fallback for API capabilities not yet covered.

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?

The description explicitly says to prefer a named tool where one exists and to reach for raw only when the API has something the tools do not cover yet. This gives the agent a clear decision rule for choosing raw over any sibling tool.

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

remove_from_albumRemove media from an 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
album_idYesThe album to remove from.
media_item_idsYesMedia item ids, up to 50.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate this is a mutating but non-destructive operation. The description adds the key behavioral detail that only album membership is affected, not the underlying media items. It also notes the per-call limit of 50, giving agents a concrete boundary beyond the schema's maxItems.

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 three short sentences, front-loaded with the primary action and then adding the crucial non-destructive guarantee and the batch limit. Every sentence earns its place with no fluff or restated title content.

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

Completeness4/5

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

For a simple, non-destructive mutation with well-documented parameters and helpful annotations, the description is nearly complete. It does not explain return values or error behavior, but no output schema exists and the operation is straightforward. This is adequate for an agent to select and invoke the tool correctly.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all three parameters including account behavior, album_id, and media_item_ids. The description adds little beyond the schema, but the 'up to 50 per call' phrasing slightly reinforces the batch limit. Baseline 3 is appropriate because the schema carries the semantic weight.

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 uses a specific verb and resource: 'Take media items out of an album.' It immediately clarifies the non-destructive scope — items stay in the library — which distinguishes this from deletion-style tools like delete operations. The sibling and title context reinforce that this is the album-membership removal tool.

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

Usage Guidelines4/5

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

The description gives clear operational context: use this to remove media from an album while preserving them in the user's library. It implies when not to use it, but it does not explicitly name alternatives like add_to_album or state exclusion conditions.

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

save_to_libraryCopy picked media into this app's libraryA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
confirmNoMust be true for this to run. The effect cannot be undone through the API, so it is refused without an explicit confirmation.
album_idNoSave them straight into this album.
base_urlsYes`base_url` values from list_picked_media, up to 20.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations' destructiveHint, the description discloses that this creates a second copy, that the item becomes an app-owned normal media item, and that picked items are only readable for the session lifetime. This meaningfully clarifies the side effects and persistence model, which annotations alone do not convey.

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?

Three short, purposeful sentences: main action, lifecycle context, and input requirement. Nothing is redundant; the critical constraints and side effects are front-loaded.

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?

Given the schema covers all parameters and annotations cover safety/destructive traits, the description gives everything needed to call it correctly: where to get base_urls, the limit, the confirmation requirement, and the persistence consequences. No output schema is expected, so return-value omission is acceptable.

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

Parameters3/5

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

The input schema already has 100% coverage, fully documenting base_urls, account, confirm, and album_id. The description essentially restates base_urls' source and limit, which the schema already provides, adding no new parameter-level meaning.

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?

States a specific action: take picked items, upload them as app-created media, and make them usable by the app's read/describe/organise tools. It clearly distinguishes this from sibling tools like list_picked_media, download_picked, or upload_from_url by framing it as the bridge between the picker session and the app library.

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

Usage Guidelines4/5

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

Provides clear workflow context: use after list_picked_media, because picked items are only readable during the session, and before the app's media tools can work on them. It names the exact input source and the confirm: true requirement, though it does not explicitly discuss when not to use alternatives.

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

search_librarySearch media by date, category or typeA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many to return per page, 1-100.
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
album_idNoSearch inside one album. Cannot be combined with any filter below.
end_dateNoInclusive end, as YYYY-MM-DD.
categoriesNoInclude only these content categories. See describe_filter_capabilities.
media_typeNoRestrict to photos or videos.
page_tokenNoContinue from a previous page. Pass the `next_page_token` from the last result. Omit for the first page.
start_dateNoInclusive start, as YYYY-MM-DD.
favorites_onlyNoOnly items the user marked as a favourite.
include_archivedNoInclude archived items. Default false.
exclude_categoriesNoExclude these categories.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safefy profile is covered; the description then adds genuinely useful behavioral context: results are scoped to app-uploaded media only, the Google Photos API has no free-text search, categories are Google's classifier rather than user tags, and album_id+filters is rejected by Google. This materially prevents wasted calls and no contradiction with annotations.

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?

Three short paragraphs, zero fluff. Core function front-loaded, folowed by scope/alternative, then the API limitation, then the interaction constraint. Every sentence carries information an agent needs; there is no redundant restating of the title or schema.

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

Completeness4/5

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

For a tool with 11 params, 28 siblings, and a notably idiosyncratic API, the description covers the critical risks: scope limitation, the main alternative workflow, the no-free-text constraint, category semantics, and the album_id incompatibility. There is no output schema and the description does not describe the return shape, but pagination is implied by the page_token/next_page_token schema docs — a minor gap only.

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 description coverage is 100% and the schema entries are already detailed (formats, defaults, page_token mechanics), so the baseline is 3. The description earns a 4 by adding conceptual meaning beyond the schema: it explains that categories are classifier-based rather than user-set tags and that the API lacks free-text search, which shapes how an agent chosses parameter values.

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?

Opens with a specific verb-resource pair — 'Filter media by date range, content category, media type or favourites' — and immediately defines scope: 'Only media uploaded by this app is returned.' It explicitly names the sibling it is not ('use start_pick_session'), so an agent can distinguish this from the album-picking workflow without opening any schema.

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?

Gives explicit when-to-use (filtering app-uploaded media), when-not-to-use (anything else in the user's library → start_pick_session), and routes to a supporting sibling (describe_filter_capabilities for exact values). Also preempts a likely mistake by stating album_id cannot combine with any filter. Nothig is left to inference.

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

share_albumShare an album by linkA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
confirmNoMust be true for this to run. The effect cannot be undone through the API, so it is refused without an explicit confirmation.
album_idYesThe album to share.
commentableNoLet people comment on items. Default true.
collaborativeNoLet people who open the link add their own photos to the album. Default false.

TDQS

A4.7/5.0
Behavior5/5

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

The description adds material behavioral context beyond the annotations: the link cannot be recalled once sent, unshare_album cannot retract content already saved by others, and confirm:true is required. This aligns with and enriches destructiveHint=true and openWorldHint=true, giving the agent a realistic sense of consequence before invoking.

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 three short sentences, with the core effect front-loaded and the risk-related caveats placed immediately after. Every sentence adds distinct value: what it does, why it is unique, and what irreversible consequence to expect.

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?

For a tool with no output schema, the description still names the return value (a link). It covers uniqueness, irreversibility, the related unshare tool, and the confirmation guard. Combined with full schema coverage and rich annotations, no critical operational detail is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents album_id, account, confirm, commentable, and collaborative. The description reinforces the confirm requirement, but does not add detail about parameters beyond what the schema provides. Baseline 3 is appropriate.

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 a specific verb and resource: 'Turn an album into a shared album and return a link anyone can open without signing in.' It clearly distinguishes this from siblings by noting it is 'the one thing here that reaches people outside the account,' which separates it from create_album, update_album, and other internal operations.

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?

It explicitly states the unique use case: sharing with people outside the account. It also provides a direct alternative comparison with unshare_album, explaining the limitation that revoking cannot recall content already saved. This gives an agent clear routing guidance without needing to inspect other tools.

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

start_pick_sessionStart a photo picker sessionA
Read-onlyIdempotent

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 picker_uri. Give that URL to the user and stop. They open it, select items in Google Photos, and finish. Then call check_pick_session until ready is true, and list_picked_media to see what they chose.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark this as read-only, open-world, idempotent, and non-destructive. The description adds meaningful behavioral context beyond annotations: it returns a picker_uri, requires user interaction to complete, and involves a stateful pick session with timing constraints. The caveat about empty results is especially valuable for agents interpreting the tool's output.

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 front-loaded with the core purpose, then provides the required follow-up workflow, then the critical pitfall. Every sentence adds value: no filler, no repetition of the schema or title, and the most important instruction ('Give that URL to the user and stop') is prominent.

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?

For a tool with no output schema, it fully explains the return value (picker_uri), the interactive nature, the required polling pattern, and the meaning of an empty result. It is complete enough for an agent to invoke and continue the workflow correctly.

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

Parameters3/5

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

Schema description coverage is 100%: the single optional account parameter is fully documented in the input schema, including its default behavior and how to list accounts. The tool description does not add parameter-level detail, but none is needed because the schema already carries that burden. Baseline 3 is appropriate.

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?

Description uses a specific verb ('Open') and resource ('Google Photos picker') and clearly differentiates from sibling tools by noting it is 'the only way to reach media this app did not upload itself.' This distinguishes start_pick_session from search_library and other media-access tools.

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 when-to-use guidance: use when the user needs media from their ENTIRE library, because the Library API cannot see anything else. Also gives a complete follow-on workflow: hand the picker_uri to the user, then call check_pick_session until ready, then list_picked_media. Directly warns against calling list_picked_media too early, which is actionable guidance.

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

unshare_albumStop sharing an albumA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
album_idYesThe album to stop sharing.

TDQS

A4.5/5.0
Behavior5/5

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

The description discloses concrete behavioral consequences beyond the annotations: people who already opened the link lose access, while anything they saved or downloaded remains with them. This gives the agent a clear picture of external impact and is consistent with the readOnly, idempotent, and destructive hints.

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?

Two concise sentences with no filler: the first states the action, the second states the human-visible consequence. Every sentence earns its place.

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?

For a simple mutation with one required parameter, useful annotations, and no output schema, this description is complete. The agent understands what will happen, what will not be destroyed, and how the account and album are specified via the schema.

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

Parameters3/5

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

The input schema documents both parameters at 100% coverage, including album_id and account with clear descriptions. The tool description does not add much parameter-level detail, so the baseline 3 is appropriate.

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 uses a specific action verb ('Revoke') and a specific resource ('an album's share link'), and it states the result ('make it private again'). This clearly distinguishes it from siblings like share_album and update_album.

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

Usage Guidelines4/5

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

The description makes the intended use case unmistakable: call this when an album should no longer be shared. It does not explicitly contrast it with share_album, but the semantics and sibling context make the boundary obvious.

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

update_albumRename an album or set its coverA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoA new title. Omit to leave it unchanged.
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
album_idYesThe album to update.
cover_media_item_idNoA media item already in this album, to use as the cover. Omit to leave it unchanged.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already convey readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds a non-obvious behavioral detail: the cover must already be a media item in the album, otherwise an error is returned. This is genuinely useful runtime behavior beyond what the annotations state.

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 two sentences with no redundant content. It leads with the main purpose and follows with the critical constraint. Every sentence contributes useful information.

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

Completeness4/5

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

For a relatively simple update tool, the description covers the core operation and the main error condition. The schema covers account defaulting and per-field omission behavior. A minor gap is the behavior when both title and cover_media_item_id are omitted, which is not addressed, but this does not meaningfully block correct use.

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

Parameters3/5

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

Schema description coverage is 100%, with clear parameter descriptions for title, accountant, album_id, and cover_media_item_id. The description adds only a small cross-parameter constraint: that the cover must already be in the album, and that the operation can target title, cover, or both. This is modest added value over the schema, so baseline 3 is appropriate.

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 states a specific verb and resource: 'Change an album's title, its cover photo, or both.' This clearly distinguishes it from sibling tools like create_album, list_albums, and add_to_album. The title reinforcement also helps disambiguate it from update_media_description.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool: renaming an album or changing its cover. It does not explicitly name alternatives or give when-not-to-use conditions, but the operation is distinct enough that a capable agent can infer the appropriate scenario. The note about cover items already being in the album is a useful precondition.

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

update_media_descriptionSet a media item's descriptionA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
descriptionYesThe new description. Empty string clears it.
media_item_idYesThe media item to update.

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the annotations, the description adds important behavioral context: the restriction to app-uploaded media and the clearing behavior on empty string. It does not contradict the annotations and provides useful detail about how the operation behaves.

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?

Three short sentences front-load the core action, then add the key constraint and the clearing behavior. Every sentence earns its place and there is no filler.

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

Completeness4/5

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

For a simple mutation with rich schema coverage, the description covers the operation's scope and special empty-string behavior. It does not describe error cases or return values, but the annotations already convey the safety profile and the schema covers parameter semantics.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all three parameters. The description adds real-world context about the description field and the app-uploaded scope, but it does not need to repeat parameter details.

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 uses a specific verb and resource: 'Write the description shown under a photo or video in Google Photos.' It also distinguishes this tool from related media tools by stating it only works on media this app uploaded.

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

Usage Guidelines4/5

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

The description gives a clear scope condition: only media this app uploaded, which helps an agent decide when not to use it. It also clarifies that an empty string clears the description, but it does not explicitly name alternatives; no sibling tool performs the same function, so the exclusion is sufficient.

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

upload_fileUpload a local fileA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute path to the file on this machine.
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
confirmNoMust be true for this to run. The effect cannot be undone through the API, so it is refused without an explicit confirmation.
album_idNoPut it straight into this album, which this app must have created.
descriptionNoDescription for the uploaded item.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false. The description adds the crucial fact that media cannot be deleted through any API once uploaded, and it reiterates the confirm:true requirement. This goes beyond the annotations to explain why the action is destructive and irreversible.

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?

Two short sentences deliver the core purpose and the most important behavioral warning. The critical constraint about irreversibility is front-loaded in the second sentence, and every word contributes useful information with no padding or repetition of schema details.

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

Completeness4/5

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

The combination of the description, detailed parameter schema, and annotations covers what an agent needs to invoke this tool correctly: the local path requirement, the optional album, the confirmation flag, and the irreversible nature of the action. It does not explain return values, but for an upload tool with no output schema, the absence is not a serious gap.

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

Parameters3/5

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

Schema description coverage is 100%, and each parameter already has a meaningful description, including the confirmation requirement and account selection. The description adds little beyond clarifying that uploads are photos/videos from a local path, so it appropriately stays at the baseline rather than adding significant value.

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 first sentence names a specific verb (Upload), a concrete resource (photo or video), and a distinguishing source (a path on the machine running this server). This clearly separates the tool from URL-based uploads and other library operations, so an agent can identify the right tool without opening schemas.

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

Usage Guidelines4/5

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

The description gives clear context: use this tool for local file uploads, optionally into an album. It does not explicitly name alternatives like upload_from_url, but the local-path framing and sibling list make the intended use obvious. It provides no explicit exclusions, which keeps this just below a 5.

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

upload_from_urlUpload photos or videos from URLsA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsYesPublic URLs to fetch and upload, up to 20.
max_mbNoSkip any file larger than this, in MB. Default 100.
accountNoWhich connected Google account to act as, by the name it was configured under (or its email). Defaults to the first one. Call list_accounts to see them.
confirmNoMust be true for this to run. The effect cannot be undone through the API, so it is refused without an explicit confirmation.
album_idNoPut them straight into this album, which this app must have created.
descriptionNoDescription applied to every uploaded item.

TDQS

A4.4/5.0
Behavior5/5

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

Adds critical behavior beyond annotations: no API deletion exists, the operation cannot be undone via this tool, requires explicit confirm=true, and is limited to 20 URLs. No contradiction with destructiveHint=true.

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?

Three concise, front-loaded paragraphs: purpose, irreversibility/confirmation, and limit. Every sentence adds operational value without redundancy.

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

Completeness4/5

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

For a 6-param mutation tool, schema covers all param semantics and annotations flag destructiveness; description adds irreversibility and confirmation requirements. It doesn't describe return/result behavior or error cases, but no output schema exists and the core invocation context is sufficiently covered.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description confirms the 20-URL limit and optional album insertion, but adds little beyond the schema's parameter descriptions.

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?

Clear verb+resource: downloads files from public URLs and adds them to Google Photos, optionally into an album. It distinctly conveys its domain vs siblings like upload_file or add_to_album.

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

Usage Guidelines4/5

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

Description implies usage context: for public URL ingestion into Google Photos, with optional album placement. It doesn't explicitly name alternatives or exclusions, but the public-URL framing plus sibling names makes when-to-use fairly clear.

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

TDQS

A4.1/5.0
Disambiguation4/5

The set is largely distinct: picker session tools form a clear multi-step workflow, album tools follow CRUD plus sharing, and media tools separate app-owned from picked items. A few pairs could be conflated (search_library vs list_app_media; upload_from_url vs create_album_with_media), but their descriptions resolve the boundaries well.

Naming Consistency4/5

Most tools follow a consistent verb_noun snake_case pattern (list_albums, create_album, update_media_description, save_to_library). The deviations are minor: auth_status and quota_status are noun-like, and raw is a bare escape hatch, but they do not make the naming unpredictable.

Tool Count2/5

At 29 tools, the surface is well past the 25-tool threshold and over double the typical well-scoped range. Although many operations are genuinely distinct, the set would be easier to navigate with consolidation, especially around upload entry points and singleton admin/status tools.

Completeness4/5

The domain is broadly covered: upload, search/list, media detail/download, album create/read/update/share/enrich, and the picker bridge to the full library. The main missing named operation is delete_album, and media deletion is impossible in the underlying API; raw provides an escape hatch for such gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

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/navidmoazzez/google-photos-mcp'

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