Monitor and analyze local system processes, CPU, memory, disk usage, and detect anomalies
This is a functional STDIO-based systems monitoring server with reasonably clear tool definitions. All 9 tools have descriptions and basic parameter schemas. However, there are consistent issues: descriptions lack actionable context (e.g., when to call which tool), error handling guidance is absent, output schemas are documented in docstrings but not formally in responses, and several tools have minimal or missing parameter descriptions. The server follows a clear verb_noun naming pattern (get_*, detect_*, analyze_*, find_*) which is a strength. However, per the rubric baselines, the average description length across tools is ~120-150 chars (below the 194-char median for A+ tools), and parameter descriptions are sparse or missing entirely. Security and composition patterns are minimally addressed. For a domain-specific monitor, the tools are appropriately scoped, but LLM discoverability and recovery guidance are weak.
Analyze currently running processes for common anomalies, including: - High memory usage (>1000 MB) combined with near-zero CPU usage (possible memory leak or stalled process) - Zombie or defunct processes Returns: list: A list of anomaly reports, each as a dictionary with: - pid (int): Process ID. - name (str): Process name. - issue (str): Description of the detected anomaly. If no anomalies are found, returns a single-item list: ['No anomalies detected.']
Detect CPU or memory usage spikes that exceed a specified percentage threshold. Args: threshold (int, optional): The usage percentage threshold (0–100) above which a warning is triggered. Defaults to 80, but it can be adjusted. Returns: dict: A dictionary containing: - cpu_percent (float): Current CPU usage in percentage. - memory_percent (float): Current memory usage in percentage. - threshold (int): The threshold value used for detection. - warnings (list of str): List of warning messages if any usage exceeds the threshold. Returns ['System usage normal.'] if no issues are found.
Find all currently running processes that match a given name substring. Args: name (str): Name or partial name to match (case-insensitive). Returns: list of dict: A list of matching processes with: - pid (int): Process ID. - name (str): Process name. - status (str): Process status (e.g., 'running', 'sleeping').
Measure the current CPU usage as a percentage of total processing capacity. Returns: dict: A dictionary containing: - cpu_percent (float): CPU usage over a 1-second interval, as a percentage (0.0–100.0).
Output schemas are documented only in docstrings, not as formal JSON Schema structures visible to tool registration. LLM cannot reliably parse return types without explicit schema definitions.
Descriptions lack actionable context. No guidance on when to use each tool vs similar tools (e.g., detect_spikes vs get_cpu_usage both report CPU; unclear which to call when). Missing recovery guidance (e.g., 'If spikes detected, call get_top_processes to identify culprit').
Numeric parameters lack bounds in schemas. Examples: 'n' in get_top_processes has no min/max (could be 0 or 1000000); 'delay' has no bounds (could be negative or infinite); 'threshold' in detect_spikes should enforce 0 - 100 but doesn't.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | F | 48 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 51 | - | v1 |
Retrieve disk usage statistics of the root ("/") filesystem. Returns: dict: A dictionary containing: - total_gb (float): Total disk capacity in GB. - used_gb (float): Used disk space in GB. - free_gb (float): Free disk space in GB. - percent_used (float): Percentage of disk space used.
Retrieve current RAM and swap memory usage. Returns: dict: A dictionary containing: - RAM (dict): - total_gb (float): Total physical memory in GB. - used_gb (float): Used memory in GB. - free_gb (float): Available memory in GB. - percent (float): Percentage of RAM used. - SWAP (dict): - total_gb (float): Total swap space in GB. - used_gb (float): Used swap space in GB. - percent (float): Percentage of swap space used.
Retrieve the full child process tree for a given parent process ID (PID). Args: pid (int): Process ID of the parent process. Returns: dict: A dictionary containing: - parent (str): Parent process name and PID. - children (list of str): List of child process names and their PIDs. If the process is not found, returns: - error (str): Error message.
Retrieve a high-level summary of the current system's key hardware and OS details. Returns: dict: A dictionary containing: - os (str): Human-readable platform identifier (e.g., 'macOS-13.5-arm64'). - cpu (str): CPU name or identifier string. - cpu_count (int): Number of logical CPU cores. - ram_total_gb (float): Total RAM in gigabytes. - disk_total_gb (float): Total disk capacity in gigabytes (root partition). - boot_time (float): System boot time as a Unix timestamp.
Return a list of top N processes sorted by CPU usage. Args: n (int, optional): Number of top processes to return. Defaults to 10. delay (float, optional): Sampling delay (in seconds) between CPU usage reads. Defaults to 1.0. include_self (bool, optional): Whether to include the MCP server process in results. Defaults to False. Returns: list of dict: Each dictionary contains: - pid (int): Process ID. - name (str): Process name. - cpu_percent (float): CPU usage percentage. - memory_percent (float): Memory usage percentage. Notes: The function initializes CPU counters and measures usage after a short delay to get meaningful values. Excluding the current Python process avoids artificial inflation of CPU usage by the MCP server itself.
No result limits enforced. find_process_by_name and get_top_processes could return very large lists (e.g., 'find_process_by_name("python")' on a dev machine might return 50+ results), bloating the LLM context. No pagination or limit parameter on find_process_by_name.
Error handling is minimal. get_process_tree documents a fallback error response but does not specify the error format. No recovery guidance (e.g., 'PID not found; call find_process_by_name to locate it').
Parameter descriptions are missing or minimal for several tools. Examples: get_process_tree pid parameter has no validation hint; find_process_by_name name parameter does not clarify if regex is allowed or if it's substring only.
detect_spikes and get_cpu_usage overlap in functionality (both report CPU percent). No clear separation or guidance on which to call. Tool naming does not disambiguate (spike detection vs raw measurement).
analyze_process_anomalies returns 'issue' as free-text string. Structured output (e.g., {pid, name, anomaly_type, severity}) would improve LLM parsing and enable consistent handling.