EKS Metrics MCP Server
by normalzzz
README.md
# EKS Metrics MCP Server
Python MCP server for querying Amazon EKS cluster metrics.
Implemented now:
- Kubernetes API server `/metrics`, equivalent to `kubectl get --raw /metrics`
- Metric filtering by exact metric name, metric name regex, and labels
- A source selector that currently supports `api_server` and reserves `cloudwatch`
CloudWatch metric collection is intentionally left as a future extension.
## Install
```bash
python3.11 -m pip install -e .
```
The MCP Python SDK requires Python 3.10 or newer. If `python` points to Python
3.9, use `python3.11` or another Python 3.10+ interpreter in both installation
and MCP client configuration.
The server uses the Kubernetes Python client. Authentication follows the same
configuration sources as `kubectl`:
- In-cluster service account credentials when running inside Kubernetes
- Local kubeconfig from `KUBECONFIG` or `~/.kube/config`
- Optional per-call `kube_context` and `kubeconfig_path` tool arguments
The Kubernetes identity must be allowed to call the API server non-resource URL
`/metrics`.
## Run
```bash
eks-metrics-mcp-server
```
or:
```bash
python3.11 -m eks_metrics_mcp_server.server
```
## Codex MCP config
```toml
[mcp_servers.eks-metrics]
enabled = true
command = "python3.11"
args = ["-m", "eks_metrics_mcp_server.server"]
cwd = "/root/eks-metrics-server/eks-metrics-mcp-server"
[mcp_servers.eks-metrics.env]
PYTHONPATH = "/root/eks-metrics-server/eks-metrics-mcp-server/src"
```
## MCP Tools
### `get_eks_metrics`
Fetch metrics from the selected source.
Important arguments:
- `source`: `api_server` or `cloudwatch`; only `api_server` is implemented
- `metric_name`: exact Prometheus metric name
- `metric_name_pattern`: regular expression for metric names
- `label_selectors`: label key/value filters
- `limit`: maximum returned samples
- `include_raw`: include original Prometheus sample line
- `kube_context`: kubeconfig context to use
- `kubeconfig_path`: kubeconfig path to use
Example metric names from Kubernetes API server metrics include
`apiserver_request_total`, `apiserver_request_duration_seconds_bucket`, and
`apiserver_current_inflight_requests`.
### `list_api_server_metric_names`
Return metric names available from `/metrics`, including type/help metadata and
sample counts.
## Kubernetes RBAC
For an in-cluster deployment, bind a service account to a role that can read
the `/metrics` non-resource URL:
```yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: eks-metrics-mcp-api-server-metrics
rules:
- nonResourceURLs:
- /metrics
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: eks-metrics-mcp-api-server-metrics
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: eks-metrics-mcp-api-server-metrics
subjects:
- kind: ServiceAccount
name: eks-metrics-mcp
namespace: default
```
TDQS
B3/5.0
Scored across 2 tools
Disambiguation5/5
Each tool has a clear, distinct purpose: one fetches actual metrics data, the other lists available metric names. No overlap or ambiguity.
Naming Consistency5/5
Both tools use consistent snake_case verb_noun pattern: get_eks_metrics and list_api_server_metric_names. Naming is predictable and uniform.
Tool Count4/5
With 2 tools, the server is minimal but well-scoped for its purpose of EKS metrics retrieval. It slightly edges into 'thin' territory but is still reasonable.
Completeness3/5
Core operations (fetch metrics, list names) are present, but there are notable gaps like filtering, aggregation, or time-range queries. CloudWatch support is missing.
Maintenance
ActivityStale
ResponsivenessNo issues