Multi-module MCP server for comprehensive OpenShift cluster performance analysis including etcd, nodes, network (OVN-Kubernetes), and egress IP monitoring
This MCP server exhibits significant quality gaps across naming, descriptions, and schema completeness. Of 35 tools evaluated, the majority have adequate naming conventions (verb_noun pattern) but severe deficiencies in schema definition, parameter validation, and error handling. Only 1 tool (run_cornet_6498_test) has a fully documented input schema; the remaining 34 tools either have minimal schemas (generic 'DurationInput' object) or no visible schemas at all. Descriptions are present but often generic and lack actionable guidance for when to use each tool. The server provides no evidence of documented output schemas, pagination support, or error recovery guidance. Parameter naming and validation is minimal, most tools accept opaque object parameters without field-level type documentation.
Analyze EgressIP performance metrics and identify potential bottlenecks. This tool examines EgressIP objects, pod assignments, traffic patterns, and node resource utilization to identify performance issues and provide optimization recommendations.
analyze_etcd_bottlenecksread onlyauth50/100
Analyze etcd cluster for performance bottlenecks and provide recommendations
Kubernetes API server performance metrics including latency, throughput, error metrics, inflight requests, etcd performance, and priority/fairness statistics
get_disk_io_statsread onlyauth50/100
Get disk I/O statistics including read/write performance
Get comprehensive status of all EgressIP objects in the cluster. Returns detailed information about EgressIP objects including their current assignments, node distribution, and overall health status.
34 of 35 tools (97%) have no visible input schema or only generic 'DurationInput' placeholder. The schema attribute is either entirely missing or references an undefined object type without field-level type documentation. Per hard scoring rules, tools with no visible schema must score 0 on schema dimension.
CRITICAL: Add complete JSON Schema definitions for ALL tools. For 34 tools with missing schemas, define explicit input object types with field names, types (string/integer/boolean/enum), descriptions, defaults, and min/max constraints. Example for get_ocp_node_usage: {"type": "object", "properties": {"duration_minutes": {"type": "integer", "description": "How long to collect metrics (1-1440 minutes, default 5)", "minimum": 1, "maximum": 1440, "default": 5}}, "required": []}.
CRITICAL: Document output schemas for all 35 tools. Use 'returns' sections in docstrings or MCP schema declarations. For example, get_egressip_status should return: {"egressips": [{"name": "string", "namespace": "string", "status": "string", "pod_count": "integer"}], "total_count": "integer"}. LLMs need to know what fields are present.
HIGH: Expand shallow descriptions to 100-150 characters following the pattern: '[WHAT] [WHEN to call it] [PREREQUISITES if any]'. Example: 'Retrieve all EgressIP objects across the cluster, their current pod assignments, and health status. Call this first to discover available EgressIPs before analyzing performance or validating rules.'
HIGH: Define the 'DurationInput' type explicitly in a shared schema or replace it with concrete fields. If most tools accept 'duration_minutes', declare: {"type": "object", "properties": {"duration_minutes": {"type": "integer", "description": "Duration in minutes (default: 5)", "minimum": 1, "maximum": 1440}}}.
HIGH: Add pagination support to tools that return lists. For get_egressip_status and get_ocp_cluster_info, add parameters: 'limit' (1-100, default 20), 'offset' (0+, default 0). Return 'total_count' and 'has_more' fields so agents know when to call again.
Spec posture evidence
Inferred effective spec: <=2025-11-25.
Relies on Logging (deprecated) - log to stderr or use OpenTelemetry
Score history
Overall score trend
↑ 5 points across a rubric change (v1 → v2)
40/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
F
40
<=2025-11-25
v2
2026-03-09
F
35
-
v1
get_etcd_cluster_statusread onlyauth45/100
Get etcd cluster status including member health, leader information, and replication status
get_etcd_compact_defrag_statsread onlyauth48/100
Get etcd compaction and defragmentation statistics
get_etcd_general_inforead onlyauth48/100
Get general etcd metrics including operations, latency, and backend statistics
get_etcd_performance_deep_diveread onlyauth50/100
Perform deep analysis of etcd performance with bottleneck identification
get_etcd_performance_reportread onlyauth50/100
Generate comprehensive etcd performance report with analysis and recommendations
get_etcd_wal_fsync_statsread onlyauth50/100
Get etcd WAL fsync performance metrics
get_netstat_tcpread onlyauth50/100
TCP netstat information and connection statistics
get_netstat_udpread onlyauth50/100
UDP netstat information and connection statistics
get_network_ioread onlyauth48/100
Get network I/O metrics including traffic and throughput
Monitor SNAT/LRP rule changes on a specific node over time. This tool continuously monitors OVN rule changes on the specified node to detect rule inconsistencies, missing rules, or unexpected changes.
Execute CORNET-6498 large-scale EgressIP stress test. This test creates multiple EgressIP objects with large numbers of pods and validates SNAT/LRP rules consistency under various stress conditions including node reboots, OVN pod restarts, and scaling operations.
Validate SNAT/LRP rules consistency on a specific OpenShift node. This tool examines the OVN database on the specified node to validate that SNAT and LRP (Logical Router Policy) rules are properly configured and consistent with the current EgressIP assignments.
No documented output schemas for any tool. LLMs have no way to know what fields to expect in responses, what structure they contain, or which IDs/references are available for chaining to downstream tools. This violates composition best practices and prevents tool chaining.
Generic, shallow descriptions across 30+ tools. Most descriptions are 40-65 characters and lack actionable guidance. Examples: 'Get general etcd metrics' (24 chars), 'Health checks and status' (24 chars), 'Get OpenShift cluster information' (32 chars). LLMs cannot reliably select between similar tools without substantive descriptions.
Generic 'request' parameter named identically across 20+ tools, referencing undefined 'DurationInput' type. The actual structure of this object is never documented, does it have fields 'duration', 'duration_minutes', 'duration_seconds'? What format is expected? This forces LLMs to guess or fail.
No error handling or recovery guidance in any tool. Descriptions do not indicate what can fail, what errors mean, or how to recover. Per pattern:recovery-guide, error responses should say 'If you get X, try Y', none of these tools provide that.
No pagination support documented. Tools returning lists (e.g., get_etcd_cluster_status, get_ocp_cluster_info) do not indicate limit, offset, or total_count parameters.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. run_cornet_6498_test is marked WRITE but has no destructiveHint annotation to warn the LLM about side effects. Per current MCP spec (2026-07-28), tool annotations are expected.
Parameter descriptions are minimal or missing type hints. Examples: 'eip_object_count' description says 'Number of EgressIP objects to create' but does not specify min/max bounds or whether defaults are required. 'platform' parameter lacks enum constraint, description just says 'auto, aws, gcp, azure, etc.', the 'etc' invites hallucination.
run_cornet_6498_testmonitor_ovn_rules
HIGH: Document error scenarios and recovery guidance for the 3 WRITE tools. Example: 'run_cornet_6498_test may fail if [condition]. If this happens, try [recovery step]. Returns exit code 1 on failure with detailed logs in /tmp/test_logs.json.'
MEDIUM: Add tool annotations. Mark run_cornet_6498_test with destructiveHint=true and idempotentHint=false (side effects, not safe to retry). Mark all READ_ONLY tools with readOnlyHint=true.
MEDIUM: Replace generic enum descriptions ('auto, aws, gcp, azure, etc.') with explicit enums in schema. For 'platform' parameter: {"type": "string", "enum": ["auto", "aws", "gcp", "azure", "bare_metal"], "default": "auto"}.
MEDIUM: Add min/max bounds to numeric parameters. For 'eip_object_count', 'pods_per_eip', 'iterations': specify {"minimum": 1, "maximum": 10000} or equivalent. This prevents LLMs from passing absurd values.
MEDIUM: Add dependency hints in parameter descriptions. Example: 'namespace (optional, default: all), only valid if analyzing a single cluster; if multi-cluster setup, omit this parameter and use cluster filter instead.'
LOW: Disambiguate duplicate tool names. Three tools are named 'get_server_health' and three are named 'get_ocp_cluster_info'. Rename by domain: 'get_etcd_server_health', 'get_network_server_health', 'get_node_server_health', etc. This prevents LLM confusion.
LOW: Add discovery hint to cluster_info tools: 'Call this first to list all available nodes and their versions before querying node-specific metrics.'
LOW: Document what 'CORNET-6498' and 'SNAT/LRP' mean in run_cornet_6498_test and validate_snat_lrp_rules descriptions. Assume the LLM has no context of OpenShift internals.