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
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Image name (e.g., user/repo or library/repo) | |
| tag | No | Specific image tag (default: latest) |
Implementation Reference
- src/mcp_server_pacman/server.py:339-363 (handler)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)", ), ]
- src/mcp_server_pacman/server.py:85-89 (registration)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)}", ) )