Skip to main content
Glama
BenedatLLC

Kubernetes Tools MCP Server

by BenedatLLC

get_pod_summaries

Retrieve pod summaries from Kubernetes clusters to monitor container status, restarts, and resource allocation across namespaces.

Instructions

Retrieves a list of PodSummary objects for pods in a given namespace or all namespaces.

Parameters
----------
namespace : Optional[str], default=None
    The specific namespace to list pods from. If None, lists pods from all namespaces.

Returns
-------
list of PodSummary
    A list of PodSummary objects, each providing a summary of a pod's status with the following fields:

    name : str
        Name of the pod.
    namespace : str
        Namespace in which the pod is running.
    total_containers : int
        Total number of containers in the pod.
    ready_containers : int
        Number of containers currently in ready state.
    restarts : int
        Total number of restarts for all containers in the pod.
    last_restart : Optional[datetime.timedelta]
        Time since the container last restart (None if never restarted).
    age : datetime.timedelta
        Age of the pod (current time minus creation timestamp).
    ip : Optional[str]
        Pod IP address (None if not assigned).
    node : Optional[str]
        Name of the node where the pod is running (None if not scheduled).
Raises
------
K8sConfigError
    If unable to initialize the K8S API.
K8sApiError
    If the API call to list pods fails.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
namespaceNo

Implementation Reference

  • The handler function that implements the logic for the 'get_pod_summaries' tool. It initializes the Kubernetes client if necessary, lists pods (namespaced or all), processes each pod to extract summary information, and returns a list of PodSummary objects.
    def get_pod_summaries(namespace: Optional[str] = None) -> list[PodSummary]:
        """
        Retrieves a list of PodSummary objects for pods in a given namespace or all namespaces.
    
        Parameters
        ----------
        namespace : Optional[str], default=None
            The specific namespace to list pods from. If None, lists pods from all namespaces.
    
        Returns
        -------
        list of PodSummary
            A list of PodSummary objects, each providing a summary of a pod's status with the following fields:
    
            name : str
                Name of the pod.
            namespace : str
                Namespace in which the pod is running.
            total_containers : int
                Total number of containers in the pod.
            ready_containers : int
                Number of containers currently in ready state.
            restarts : int
                Total number of restarts for all containers in the pod.
            last_restart : Optional[datetime.timedelta]
                Time since the container last restart (None if never restarted).
            age : datetime.timedelta
                Age of the pod (current time minus creation timestamp).
            ip : Optional[str]
                Pod IP address (None if not assigned).
            node : Optional[str]
                Name of the node where the pod is running (None if not scheduled).
        Raises
        ------
        K8sConfigError
            If unable to initialize the K8S API.
        K8sApiError
            If the API call to list pods fails.
        """
        global K8S
        
        # Load Kubernetes configuration and initialize client only once
        if K8S is None:
            K8S = _get_api_client()
    
        logging.info(f"get_pod_summaries(namespace={namespace})")
        pod_summaries: list[PodSummary] = []
        
        try:
            if namespace:
                # List pods in a specific namespace
                pods = K8S.list_namespaced_pod(namespace=namespace).items
            else:
                # List pods across all namespaces
                pods = K8S.list_pod_for_all_namespaces().items
        except client.ApiException as e:
            raise K8sApiError(f"Error fetching pods: {e}") from e
    
        current_time_utc = datetime.datetime.now(datetime.timezone.utc)
    
        for pod in pods:
            pod_name = pod.metadata.name
            pod_namespace = pod.metadata.namespace
            
            total_containers = len(pod.spec.containers)
            ready_containers = 0
            total_restarts = 0
            latest_restart_time: Optional[datetime.datetime] = None
    
            if pod.status and pod.status.container_statuses:
                for container_status in pod.status.container_statuses:
                    if container_status.ready:
                        ready_containers += 1
                    
                    total_restarts += container_status.restart_count
                    
                    # Check for last restart time
                    if container_status.last_state and container_status.last_state.terminated:
                        terminated_at = container_status.last_state.terminated.finished_at
                        if terminated_at:
                            if latest_restart_time is None or terminated_at > latest_restart_time:
                                latest_restart_time = terminated_at
    
            # Calculate age
            age = datetime.timedelta(0) # Default to 0 if creation_timestamp is missing
            if pod.metadata.creation_timestamp:
                age = current_time_utc - pod.metadata.creation_timestamp
    
            # Calculate last_restart timedelta if a latest_restart_time was found
            last_restart_timedelta: Optional[datetime.timedelta] = None
            if latest_restart_time:
                last_restart_timedelta = current_time_utc - latest_restart_time
    
            # Extract IP and node information
            pod_ip = pod.status.pod_ip if pod.status and pod.status.pod_ip else None
            node_name = pod.spec.node_name if pod.spec and pod.spec.node_name else None
    
            pod_summary = PodSummary(
                name=pod_name,
                namespace=pod_namespace,
                total_containers=total_containers,
                ready_containers=ready_containers,
                restarts=total_restarts,
                last_restart=last_restart_timedelta,
                age=age,
                ip=pod_ip,
                node=node_name
            )
            pod_summaries.append(pod_summary)
        
        return pod_summaries
  • Pydantic model defining the output schema for PodSummary objects returned by get_pod_summaries.
    class PodSummary(BaseModel):
        """A summary of a pod's status like returned by `kubectl get pods -o wide`"""
        name: str
        namespace: str
        total_containers: int
        ready_containers: int
        restarts: int
        last_restart: Optional[datetime.timedelta]
        age: datetime.timedelta
        ip: Optional[str] = None
        node: Optional[str] = None
  • List of tool handler functions including get_pod_summaries, imported by mcp_server.py and wrapped into MCP Tool objects.
    TOOLS = [
        get_namespaces,
        get_node_summaries,
        get_pod_summaries,
        get_pod_container_statuses,
        get_pod_events,
        get_pod_spec,
        get_logs_for_pod_and_container,
        get_deployment_summaries,
        get_service_summaries
    ]
  • MCP server registration where TOOLS from k8s_tools.py are wrapped using Tool.from_function and passed to FastMCP server instance, registering get_pod_summaries as an MCP tool.
    if not args.mock:
        from .k8s_tools import TOOLS
    else:
        from .mock_tools import TOOLS
        logging.warning(f"Using mock versions of the tools")
    wrapped_tools = [get_tool_for_function(fn) for fn in TOOLS]
    
    mcp = FastMCP(
        name="k8stools-"+args.transport,
        tools=wrapped_tools,
        streamable_http_path="/mcp",
        stateless_http=(args.transport == 'streamable-http'),
        host=args.host,
        port=args.port,
        log_level=args.log_level,
        debug=args.debug
    )
    logging.debug(f"Settings are: {mcp.settings}")
    logging.info(f"Starting with {len(wrapped_tools)} tools on transport {args.transport}")
    # this starts the uvicorn server
    mcp.run(transport=args.transport)

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/BenedatLLC/k8stools'

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