Skip to main content
Glama
oborchers

mcp-server-pacman

docker_image_info

Retrieve detailed metadata about a Docker image, including version, repository, and tag, to manage and analyze containerized applications effectively.

Instructions

Get detailed information about a specific Docker image

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameYesImage name (e.g., user/repo or library/repo)
tagNoSpecific image tag (default: latest)

Implementation Reference

  • MCP tool handler dispatch for 'docker_image_info' in @server.call_tool(), validates input with DockerImageInfo schema, calls appropriate provider function based on tag presence, and formats response.
    elif name == "docker_image_info":
        try:
            args = DockerImageInfo(**arguments)
            logger.debug(f"Validated docker image info args: {args}")
        except ValueError as e:
            logger.error(f"Invalid docker image info parameters: {str(e)}")
            raise McpError(ErrorData(code=INVALID_PARAMS, message=str(e)))
    
        logger.info(
            f"Getting Docker image info for {args.name}"
            + (f" (tag={args.tag})" if args.tag else "")
        )
    
        if args.tag:
            info = await get_docker_hub_tag_info(args.name, args.tag)
        else:
            info = await get_docker_hub_tags(args.name)
    
        logger.info(f"Successfully retrieved Docker image info for {args.name}")
        return [
            TextContent(
                type="text",
                text=f"Docker image information for {args.name}:\n{json.dumps(info, indent=2)}",
            )
        ]
  • Pydantic model defining input schema for docker_image_info tool: requires 'name', optional 'tag'.
    class DockerImageInfo(BaseModel):
        """Parameters for getting Docker image information."""
    
        name: Annotated[
            str, Field(description="Image name (e.g., user/repo or library/repo)")
        ]
        tag: Annotated[
            Optional[str],
            Field(
                default=None,
                description="Specific image tag (default: latest)",
            ),
        ]
  • Tool registration in @server.list_tools(): defines name, description, and input schema.
    Tool(
        name="docker_image_info",
        description="Get detailed information about a specific Docker image",
        inputSchema=DockerImageInfo.model_json_schema(),
    ),
  • Helper function to fetch all tags for a Docker image from Docker Hub API, including repo info; called when no specific tag provided.
    async def get_docker_hub_tags(name: str) -> Dict:
        """Get information about tags for a specific Docker image."""
        # Split the image name into namespace and repository
        if "/" in name:
            namespace, repository = name.split("/", 1)
        else:
            namespace, repository = "library", name
    
        async with httpx.AsyncClient() as client:
            response = await client.get(
                f"https://hub.docker.com/v2/repositories/{namespace}/{repository}/tags",
                params={"page_size": 25, "ordering": "last_updated"},
                headers={"Accept": "application/json", "User-Agent": DEFAULT_USER_AGENT},
                follow_redirects=True,
            )
    
            if response.status_code != 200:
                raise McpError(
                    ErrorData(
                        code=INTERNAL_ERROR,
                        message=f"Failed to get image tags from Docker Hub - status code {response.status_code}",
                    )
                )
    
            try:
                data = response.json()
                tags = [
                    {
                        "name": tag.get("name", ""),
                        "last_updated": tag.get("last_updated", ""),
                        "digest": tag.get("digest", ""),
                        "images": [
                            {
                                "architecture": img.get("architecture", ""),
                                "os": img.get("os", ""),
                                "size": img.get("size", 0),
                            }
                            for img in tag.get("images", [])
                        ],
                    }
                    for tag in data.get("results", [])
                ]
    
                # Get repo information
                repo_response = await client.get(
                    f"https://hub.docker.com/v2/repositories/{namespace}/{repository}",
                    headers={
                        "Accept": "application/json",
                        "User-Agent": DEFAULT_USER_AGENT,
                    },
                    follow_redirects=True,
                )
                repo_info = {}
                if repo_response.status_code == 200:
                    repo_data = repo_response.json()
                    repo_info = {
                        "description": repo_data.get("description", ""),
                        "star_count": repo_data.get("star_count", 0),
                        "pull_count": repo_data.get("pull_count", 0),
                        "is_official": repo_data.get("is_official", False),
                        "last_updated": repo_data.get("last_updated", ""),
                    }
    
                return {
                    "name": f"{namespace}/{repository}",
                    "tags": tags,
                    "tag_count": data.get("count", 0),
                    "repository": repo_info,
                }
            except Exception as e:
                raise McpError(
                    ErrorData(
                        code=INTERNAL_ERROR,
                        message=f"Failed to parse Docker Hub tags response: {str(e)}",
                    )
                )
  • Helper function to fetch specific tag info for a Docker image from Docker Hub API; called when tag is provided.
    async def get_docker_hub_tag_info(name: str, tag: str = "latest") -> Dict:
        """Get information about a specific tag of a Docker image."""
        # Split the image name into namespace and repository
        if "/" in name:
            namespace, repository = name.split("/", 1)
        else:
            namespace, repository = "library", name
    
        async with httpx.AsyncClient() as client:
            tag_url = f"https://hub.docker.com/v2/repositories/{namespace}/{repository}/tags/{tag}"
            response = await client.get(
                tag_url,
                headers={"Accept": "application/json", "User-Agent": DEFAULT_USER_AGENT},
                follow_redirects=True,
            )
    
            if response.status_code != 200:
                raise McpError(
                    ErrorData(
                        code=INTERNAL_ERROR,
                        message=f"Failed to get tag info for {name}:{tag} - status code {response.status_code}",
                    )
                )
    
            try:
                data = response.json()
                result = {
                    "name": f"{namespace}/{repository}",
                    "tag": tag,
                    "last_updated": data.get("last_updated", ""),
                    "full_size": data.get("full_size", 0),
                    "digest": data.get("digest", ""),
                    "images": [
                        {
                            "architecture": img.get("architecture", ""),
                            "os": img.get("os", ""),
                            "size": img.get("size", 0),
                        }
                        for img in data.get("images", [])
                    ],
                }
                return result
            except Exception as e:
                raise McpError(
                    ErrorData(
                        code=INTERNAL_ERROR,
                        message=f"Failed to parse Docker Hub tag info: {str(e)}",
                    )
                )
Install Server

Other Tools

Related 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/oborchers/mcp-server-pacman'

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