Skip to main content
Glama

list_people

List all recognized people (face clusters) in the library. Use this to browse who appears, view thumbnails, and find person IDs for further actions.

Instructions

List all recognized people (face clusters) in the library. Use this to browse who appears in the photo library or find a person's ID. For searching by name, use search_people instead. Read-only.

Args:
    page: Page number, starting from 1 (default 1).
    size: Results per page (default 50).
    with_hidden: Include people marked as hidden (default false).

Returns: JSON with total count, page, and people array (each with id, name, thumbnailPath, photoCount).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pageNo
sizeNo
with_hiddenNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Implementation Reference

  • MCP tool handler for 'list_people'. Decorated with @mcp.tool(), calls _client(ctx).list_people() and returns JSON with total, page, and people array.
    @mcp.tool()
    async def list_people(
        ctx: Context, page: int = 1, size: int = 50, with_hidden: bool = False
    ) -> str:
        """List all recognized people (face clusters) in the library. Use this to browse
        who appears in the photo library or find a person's ID. For searching by name,
        use search_people instead. Read-only.
    
        Args:
            page: Page number, starting from 1 (default 1).
            size: Results per page (default 50).
            with_hidden: Include people marked as hidden (default false).
    
        Returns: JSON with total count, page, and people array (each with id, name, thumbnailPath, photoCount).
        """
        result = await _client(ctx).list_people(page=page, size=size, with_hidden=with_hidden)
        people = result.get("people", [])
        total = result.get("total", len(people))
        return json.dumps({"total": total, "page": page, "people": people}, default=str)
  • Function signature defines input schema: page (int=1), size (int=50), with_hidden (bool=False).
    @mcp.tool()
    async def list_people(
        ctx: Context, page: int = 1, size: int = 50, with_hidden: bool = False
    ) -> str:
  • Registered as MCP tool via @mcp.tool() decorator on the list_people function.
    @mcp.tool()
    async def list_people(
  • Client-side helper method that calls GET /people with pagination params (page, size, withHidden). Called by the MCP tool handler.
    async def list_people(
        self, page: int = 1, size: int = 50, with_hidden: bool = False
    ) -> dict:
        """List all people (paginated)."""
        params = {"page": str(page), "size": str(size), "withHidden": str(with_hidden).lower()}
        return await self._request("GET", "/people", params=params)
Behavior4/5

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

The description states the tool is 'Read-only' and describes the return format, but does not disclose potential rate limits, authentication requirements, or any side effects beyond the listed behavior. However, for a simple read operation, the level of disclosure is adequate.

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 concise yet comprehensive, with a clear structure: purpose, usage note, parameter block, and return note. Every sentence adds value, and the length is appropriate for the tool's complexity.

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 low complexity and the presence of an output description (though no formal output schema), the description covers all contextual needs: what the tool does, when to use it, parameters, and return format. It is fully self-contained.

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

Parameters5/5

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

The description adds meaningful descriptions for each parameter (page, size, with_hidden) beyond the schema's basic type/default definitions. The schema had 0% coverage, but the description fully compensates by explaining the semantics.

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 action ('list'), the resource ('all recognized people'), and the context (face clusters in the library). It also distinguishes the tool from its sibling `search_people`, avoiding ambiguity.

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 when to use this tool ('browse who appears... or find a person's ID') and when not to ('For searching by name, use search_people instead'). This provides clear usage context and alternative.

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

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/drolosoft/immich-photo-manager'

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