Skip to main content
Glama
dknell

System Information MCP Server

by dknell

get_process_list_tool

Retrieve and analyze running processes with sorting and filtering options to monitor system performance and identify resource usage patterns.

Instructions

Retrieve list of running processes.

Args: limit: Maximum number of processes to return (default: 50) sort_by: Sort criteria - cpu, memory, name, pid (default: cpu) filter_name: Filter processes by name pattern

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNo
sort_byNocpu
filter_nameNo

Implementation Reference

  • MCP tool handler for get_process_list_tool, decorated with @app.tool() which registers the tool and defines input schema via type hints and docstring.
    @app.tool()
    def get_process_list_tool(
        limit: int = 50, sort_by: str = "cpu", filter_name: Optional[str] = None
    ) -> Dict[str, Any]:
        """Retrieve list of running processes.
    
        Args:
            limit: Maximum number of processes to return (default: 50)
            sort_by: Sort criteria - cpu, memory, name, pid (default: cpu)
            filter_name: Filter processes by name pattern
        """
        return get_process_list(limit=limit, sort_by=sort_by, filter_name=filter_name)
  • Core implementation logic for retrieving, filtering, sorting, and formatting the process list using psutil.
    @cache_result("process_list", ttl=2)
    def get_process_list(
        limit: int = 50, sort_by: str = "cpu", filter_name: Optional[str] = None
    ) -> Dict[str, Any]:
        """Retrieve list of running processes."""
        try:
            # Validate parameters
            if limit <= 0:
                raise ValueError("Limit must be a positive number")
    
            limit = min(limit, config.max_processes)
    
            valid_sort_keys = ["cpu", "memory", "name", "pid"]
            if sort_by not in valid_sort_keys:
                raise ValueError(f"sort_by must be one of: {valid_sort_keys}")
    
            processes = []
    
            # Get all processes
            for proc in psutil.process_iter(
                [
                    "pid",
                    "name",
                    "username",
                    "status",
                    "cpu_percent",
                    "memory_percent",
                    "memory_info",
                    "create_time",
                    "cmdline",
                ]
            ):
                try:
                    proc_info = proc.info
    
                    # Filter by name if specified
                    if filter_name and filter_name.lower() not in proc_info["name"].lower():
                        continue
    
                    # Get memory RSS
                    memory_rss = 0
                    if proc_info.get("memory_info"):
                        memory_rss = proc_info["memory_info"].rss
    
                    # Filter and format command line
                    cmdline = filter_sensitive_cmdline(proc_info.get("cmdline") or [])
    
                    process_data = {
                        "pid": proc_info["pid"],
                        "name": proc_info["name"] or "Unknown",
                        "username": proc_info.get("username", "Unknown"),
                        "status": proc_info.get("status", "unknown"),
                        "cpu_percent": round(
                            safe_float(proc_info.get("cpu_percent", 0)), 1
                        ),
                        "memory_percent": round(
                            safe_float(proc_info.get("memory_percent", 0)), 1
                        ),
                        "memory_rss": memory_rss,
                        "memory_rss_mb": bytes_to_mb(memory_rss),
                        "create_time": timestamp_to_iso(proc_info.get("create_time", 0)),
                        "cmdline": cmdline,
                    }
    
                    processes.append(process_data)
    
                except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
                    # Process may have terminated or we don't have permission
                    continue
    
            # Sort processes
            reverse_sort = True  # Most metrics should be sorted in descending order
            if sort_by == "cpu":
                processes.sort(key=lambda p: p["cpu_percent"], reverse=reverse_sort)
            elif sort_by == "memory":
                processes.sort(key=lambda p: p["memory_percent"], reverse=reverse_sort)
            elif sort_by == "name":
                processes.sort(key=lambda p: p["name"].lower(), reverse=False)
            elif sort_by == "pid":
                processes.sort(key=lambda p: p["pid"], reverse=False)
    
            # Apply limit
            limited_processes = processes[:limit]
    
            return {"processes": limited_processes, "total_processes": len(processes)}
    
        except Exception as e:
            logger.error(f"Error getting process list: {e}")
            raise

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/dknell/mcp-system-info'

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