Provides AI agents with real-time read and write access to Kubernetes, ArgoCD, Prometheus, PagerDuty, and Loki infrastructure.
Also known as NotHarshhaa/devops-mcp, @notharshhaa/devops-mcp
- Stars
- 4
- Tools
- 39
- Downloads, 30 days
- —
- Latest version
- 2.1.1
- Last commit
- Oct 24, 2026
- License
- MIT
What is devops MCP?
devops provides AI agents with real-time read and write access to Kubernetes, ArgoCD, Prometheus, PagerDuty, and Loki infrastructure. It exposes 39 tools, such as k8s__list_pods, k8s__get_pod_logs, k8s__describe_resource.
Summary generated from the project's README
About devops MCP server
DevOps engineers can manage and monitor their entire infrastructure stack through a single interface using this MCP server. It provides AI agents with real-time read and write access to Kubernetes, ArgoCD, Prometheus, PagerDuty, and Loki. By connecting these tools to an MCP-compatible client like Claude Desktop or Claude Code, you can move away from manual command line copying and instead ask natural language questions about your cluster health or deployment status.
Setup requires configuring environment variables for your specific providers, such as KUBECONFIG for Kubernetes, ARGOCD_TOKEN for ArgoCD, or PAGERDUTY_TOKEN for PagerDuty. The server includes specialized tools like k8s__list_pods for cluster inspection, prom__summarize_service_health for human-readable metric summaries, and logs__search for Loki log analysis. To prevent accidental changes, the system uses a three-tier safety model where mutations default to a dry run mode and destructive actions require explicit confirmation.
What you can do with it
- 1Debug Kubernetes deployment failuresAsk an AI agent to investigate why a specific deployment is stuck in a crash loop by pulling pod logs and resource descriptions.
- 2Analyze service health with metricsRequest a human-readable summary of service latency and error rates compared to SLO thresholds using Prometheus data.
- 3Manage incident response workflowsIdentify which engineer is currently on call and check the status of open incidents via PagerDuty.
Written from the project's README. Every use case is checked against a quote from it.
How to install devops MCP
Formats verified 10 Nov 2026Add to CursorAdd to GooseInstall devops MCP in Claude Code
$ claude mcp add --env 'ARGOCD_TOKEN=<YOUR_ARGOCD_TOKEN>' --env 'LOKI_TOKEN=<YOUR_LOKI_TOKEN>' --env 'PAGERDUTY_TOKEN=<YOUR_PAGERDUTY_TOKEN>' --env 'PROMETHEUS_BEARER_TOKEN=<YOUR_PROMETHEUS_BEARER_TOKEN>' devops-mcp -- npx -y @notharshhaa/devops-mcpInstall devops MCP in Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"devops-mcp": {
"command": "npx",
"args": [
"-y",
"@notharshhaa/devops-mcp"
],
"env": {
"ARGOCD_TOKEN": "<YOUR_ARGOCD_TOKEN>",
"LOKI_TOKEN": "<YOUR_LOKI_TOKEN>",
"PAGERDUTY_TOKEN": "<YOUR_PAGERDUTY_TOKEN>",
"PROMETHEUS_BEARER_TOKEN": "<YOUR_PROMETHEUS_BEARER_TOKEN>"
}
}
}
}Install devops MCP in VS Code
.vscode/mcp.json
{
"servers": {
"devops-mcp": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@notharshhaa/devops-mcp"
],
"env": {
"ARGOCD_TOKEN": "<YOUR_ARGOCD_TOKEN>",
"LOKI_TOKEN": "<YOUR_LOKI_TOKEN>",
"PAGERDUTY_TOKEN": "<YOUR_PAGERDUTY_TOKEN>",
"PROMETHEUS_BEARER_TOKEN": "<YOUR_PROMETHEUS_BEARER_TOKEN>"
}
}
}
}Install devops MCP in VS Code CLI
$ code --add-mcp '{"name":"devops-mcp","type":"stdio","command":"npx","args":["-y","@notharshhaa/devops-mcp"],"env":{"ARGOCD_TOKEN":"<YOUR_ARGOCD_TOKEN>","LOKI_TOKEN":"<YOUR_LOKI_TOKEN>","PAGERDUTY_TOKEN":"<YOUR_PAGERDUTY_TOKEN>","PROMETHEUS_BEARER_TOKEN":"<YOUR_PROMETHEUS_BEARER_TOKEN>"}}'Install devops MCP in Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"devops-mcp": {
"command": "npx",
"args": [
"-y",
"@notharshhaa/devops-mcp"
],
"env": {
"ARGOCD_TOKEN": "<YOUR_ARGOCD_TOKEN>",
"LOKI_TOKEN": "<YOUR_LOKI_TOKEN>",
"PAGERDUTY_TOKEN": "<YOUR_PAGERDUTY_TOKEN>",
"PROMETHEUS_BEARER_TOKEN": "<YOUR_PROMETHEUS_BEARER_TOKEN>"
}
}
}
}Install devops MCP in Codex
$ codex mcp add devops-mcp --env 'ARGOCD_TOKEN=<YOUR_ARGOCD_TOKEN>' --env 'LOKI_TOKEN=<YOUR_LOKI_TOKEN>' --env 'PAGERDUTY_TOKEN=<YOUR_PAGERDUTY_TOKEN>' --env 'PROMETHEUS_BEARER_TOKEN=<YOUR_PROMETHEUS_BEARER_TOKEN>' -- npx -y @notharshhaa/devops-mcpInstall devops MCP in Codex config.toml
~/.codex/config.toml
[mcp_servers.devops-mcp] command = "npx" args = ["-y", "@notharshhaa/devops-mcp"] [mcp_servers.devops-mcp.env] ARGOCD_TOKEN = "<YOUR_ARGOCD_TOKEN>" LOKI_TOKEN = "<YOUR_LOKI_TOKEN>" PAGERDUTY_TOKEN = "<YOUR_PAGERDUTY_TOKEN>" PROMETHEUS_BEARER_TOKEN = "<YOUR_PROMETHEUS_BEARER_TOKEN>"
Install devops MCP in Gemini CLI
$ gemini mcp add -s user -e 'ARGOCD_TOKEN=<YOUR_ARGOCD_TOKEN>' -e 'LOKI_TOKEN=<YOUR_LOKI_TOKEN>' -e 'PAGERDUTY_TOKEN=<YOUR_PAGERDUTY_TOKEN>' -e 'PROMETHEUS_BEARER_TOKEN=<YOUR_PROMETHEUS_BEARER_TOKEN>' devops-mcp npx -- -y @notharshhaa/devops-mcpInstall devops MCP in Gemini settings.json
~/.gemini/settings.json
{
"mcpServers": {
"devops-mcp": {
"command": "npx",
"args": [
"-y",
"@notharshhaa/devops-mcp"
],
"env": {
"ARGOCD_TOKEN": "<YOUR_ARGOCD_TOKEN>",
"LOKI_TOKEN": "<YOUR_LOKI_TOKEN>",
"PAGERDUTY_TOKEN": "<YOUR_PAGERDUTY_TOKEN>",
"PROMETHEUS_BEARER_TOKEN": "<YOUR_PROMETHEUS_BEARER_TOKEN>"
}
}
}
}devops MCP tools 39
Detected from the READMEk8s__list_podsk8s__get_pod_logsk8s__describe_resourcek8s__get_eventsk8s__list_deploymentsk8s__get_resource_usagek8s__get_node_statusk8s__get_network_policiesk8s__get_ingressesk8s__list_cronjobsk8s__get_cronjob_statusk8s__diff_resource
| k8s__list_pods | — | |
| k8s__get_pod_logs | — | |
| k8s__describe_resource | — | |
| k8s__get_events | — | |
| k8s__list_deployments | — | |
| k8s__get_resource_usage | — | |
| k8s__get_node_status | — | |
| k8s__get_network_policies | — | |
| k8s__get_ingresses | — | |
| k8s__list_cronjobs | — | |
| k8s__get_cronjob_status | — | |
| k8s__diff_resource | — |
Show all 39 toolsShow fewer tools
k8s__get_hpak8s__list_pvcsk8s__list_servicesk8s__list_contextsk8s__switch_contextk8s__scale_deploymentk8s__apply_manifestk8s__rollout_restartk8s__delete_resourceargo__list_appsargo__get_appargo__get_app_diffargo__get_app_historyargo__get_resource_treeargo__sync_appargo__rollback_appargo__terminate_opprom__queryprom__query_rangeprom__list_alertsprom__get_firing_alertsprom__list_targetsprom__label_valuesprom__metric_metadataprom__compare_periodsprom__slo_statusprom__summarize_service_health
| k8s__get_hpa | — | |
| k8s__list_pvcs | — | |
| k8s__list_services | — | |
| k8s__list_contexts | — | |
| k8s__switch_context | — | |
| k8s__scale_deployment | — | |
| k8s__apply_manifest | — | |
| k8s__rollout_restart | — | |
| k8s__delete_resource | — | |
| argo__list_apps | — | |
| argo__get_app | — | |
| argo__get_app_diff | — | |
| argo__get_app_history | — | |
| argo__get_resource_tree | — | |
| argo__sync_app | — | |
| argo__rollback_app | — | |
| argo__terminate_op | — | |
| prom__query | — | |
| prom__query_range | — | |
| prom__list_alerts | — | |
| prom__get_firing_alerts | — | |
| prom__list_targets | — | |
| prom__label_values | — | |
| prom__metric_metadata | — | |
| prom__compare_periods | — | |
| prom__slo_status | — | |
| prom__summarize_service_health | — |
Configuration
ARGOCD_TOKENSecretArgoCD authentication token
LOKI_TOKENSecretLoki authentication token
PAGERDUTY_TOKENSecretPagerDuty API token
PROMETHEUS_BEARER_TOKENSecretPrometheus bearer token
ARGOCD_SERVERArgoCD server URL
DEVOPS_MCP_AUDIT_LOGDEVOPS_MCP_DRY_RUNK8S_ALLOWED_NAMESPACESK8S_CONTEXTKubernetes context to use
KUBECONFIGPath to Kubernetes kubeconfig file
LOKI_URLLoki server URL
MCP_ALLOWED_HOSTSMCP_ALLOWED_ORIGINSMCP_AUTH_TOKENMCP_CACHE_TTL_MSMCP_HTTP_HOSTMCP_REQUEST_STATE_SECRETPAGERDUTY_USER_EMAILPagerDuty user email for mutations requiring From header
PROMETHEUS_URLPrometheus server URL
| Name | Description | |
|---|---|---|
| ARGOCD_TOKEN | ArgoCD authentication token | Secret |
| LOKI_TOKEN | Loki authentication token | Secret |
| PAGERDUTY_TOKEN | PagerDuty API token | Secret |
| PROMETHEUS_BEARER_TOKEN | Prometheus bearer token | Secret |
| ARGOCD_SERVER | ArgoCD server URL | |
| DEVOPS_MCP_AUDIT_LOG | — | |
| DEVOPS_MCP_DRY_RUN | — | |
| K8S_ALLOWED_NAMESPACES | — | |
| K8S_CONTEXT | Kubernetes context to use | |
| KUBECONFIG | Path to Kubernetes kubeconfig file | |
| LOKI_URL | Loki server URL | |
| MCP_ALLOWED_HOSTS | — | |
| MCP_ALLOWED_ORIGINS | — | |
| MCP_AUTH_TOKEN | — | |
| MCP_CACHE_TTL_MS | — | |
| MCP_HTTP_HOST | — | |
| MCP_REQUEST_STATE_SECRET | — | |
| PAGERDUTY_USER_EMAIL | PagerDuty user email for mutations requiring From header | |
| PROMETHEUS_URL | Prometheus server URL |
Automated checks
Ran Nov 12, 2026Full report →Passed our automated checks. That is not a security audit: read the code and give the server the narrowest access it needs. How checks work
- Source repository linked and reachablePass
- Open source license (OSI)Pass
- Commit or release in the last yearPass
- Package name not close to a popular packagePass
- Remote endpoint uses HTTPSNot checked
- Destructive tools are labelledPass
- No hidden instructions to the modelPass
- No critical advisory in the package or its dependenciesPass
README
View on GitHubdevops-mcp
Unified MCP server for DevOps engineers — query and manage Kubernetes, ArgoCD, Prometheus, and PagerDuty from any MCP-compatible AI agent.
What is this?
devops-mcp is an open source Model Context Protocol server that gives AI agents (Claude, etc.) real-time read and write access to your infrastructure stack — all from a single install.
Instead of copy-pasting kubectl output into a chat window, you can ask:
"Why is the payments deployment in CrashLoopBackOff?" "What changed in the last ArgoCD sync for the auth app?" "Show me the p99 latency for the API gateway over the last hour." "Who's on call right now and what incidents are open?" "Debug the payments service - what's wrong with it?"
...and get live answers, sourced directly from your cluster and tooling.
Providers included:
| Prefix | Provider | Transport |
|---|---|---|
k8s__* |
Kubernetes (via kubeconfig or in-cluster SA) | client-go |
argo__* |
ArgoCD | REST API |
prom__* |
Prometheus | HTTP API (PromQL) |
pd__* |
PagerDuty | REST API v2 |
helm__* |
Helm | CLI (helm binary) |
devops__* |
Cross-provider incident debugging | Aggregates all providers |
logs__* |
Loki | HTTP API (LogQL) |
Quick start
Claude Desktop (stdio — recommended)
Add this to ~/.config/claude/claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"devops": {
"command": "npx",
"args": ["-y", "@notharshhaa/devops-mcp@latest"],
"env": {
"KUBECONFIG": "/home/you/.kube/config",
"ARGOCD_SERVER": "https://argocd.company.com",
"ARGOCD_TOKEN": "your-argocd-token",
"PROMETHEUS_URL": "http://prometheus.monitoring:9090",
"PAGERDUTY_TOKEN": "your-pd-api-token",
"PAGERDUTY_USER_EMAIL": "you@company.com",
"LOKI_URL": "http://loki.monitoring:3100",
"LOKI_TOKEN": "your-loki-token"
}
}
}
}
Restart Claude Desktop. The devops server will appear in the tools list.
Claude Code (CLI)
claude mcp add devops-mcp -e KUBECONFIG=$HOME/.kube/config \
-e ARGOCD_SERVER=https://argocd.company.com \
-e ARGOCD_TOKEN=... \
-e PROMETHEUS_URL=http://prometheus:9090 \
-e PAGERDUTY_TOKEN=... \
-e LOKI_URL=http://loki.monitoring:3100 \
-e LOKI_TOKEN=... \
-- npx -y @notharshhaa/devops-mcp@latest
Local dev / test
Requires Node.js 20 or newer.
npx @notharshhaa/devops-mcp
# or clone and run:
git clone https://github.com/NotHarshhaa/devops-mcp
cd devops-mcp
npm install
cp .env.example .env # fill in your values
npm run dev
Configuration
All config is via environment variables. Only set the ones for providers you actually use — providers with missing config are silently skipped.
# ── Kubernetes ────────────────────────────────────────────────
KUBECONFIG=/home/user/.kube/config # omit to use in-cluster service account
K8S_CONTEXT=my-prod-context # optional: pin a specific context
K8S_ALLOWED_NAMESPACES=default,backend # optional: restrict namespace access
# ── ArgoCD ───────────────────────────────────────────────────
ARGOCD_SERVER=https://argocd.company.com
ARGOCD_TOKEN=eyJhbGci... # argocd account generate-token
# ── Prometheus ───────────────────────────────────────────────
PROMETHEUS_URL=http://prometheus:9090
PROMETHEUS_BEARER_TOKEN= # optional: for authenticated Prometheus
# ── PagerDuty ────────────────────────────────────────────────
PAGERDUTY_TOKEN=your-api-v2-token
PAGERDUTY_USER_EMAIL=you@company.com # required for PagerDuty incident mutations (From header)
# ── Loki ───────────────────────────────────────────────────
LOKI_URL=http://loki.monitoring:3100
LOKI_TOKEN=your-loki-token
# ── Stateless Streamable HTTP ────────────────────────────────
# For stdio mode (default): no transport config needed
MCP_HTTP_HOST=127.0.0.1 # use 0.0.0.0 inside a container
PORT=3000
MCP_AUTH_TOKEN=shared-secret # optional static Bearer token
MCP_REQUEST_STATE_SECRET=32+-byte-secret # optional MRTR signing key shared by all replicas
MCP_ALLOWED_HOSTS=localhost,127.0.0.1 # required with non-loopback binding
MCP_ALLOWED_ORIGINS= # optional browser Origin hostname allowlist
MCP_CACHE_TTL_MS=60000 # discovery/tools catalog TTL; 0 disables caching
# ── Safety ───────────────────────────────────────────────────
DEVOPS_MCP_DRY_RUN=false # true = block all mutations globally
DEVOPS_MCP_AUDIT_LOG=/var/log/devops-mcp-audit.jsonl
Tool reference
All tools follow a three-tier safety model:
- Read — safe, no side effects, no confirmation needed
- Mutate — defaults to
dry_run: true; setdry_run: falseto execute - Destructive — requires
confirm: true, or a 2026-07-28 client can complete the server's interactive MRTR confirmation
Kubernetes (k8s__*)
| Tool | Tier | Description |
|---|---|---|
k8s__list_pods |
read | List pods with status, restarts, node, age |
k8s__get_pod_logs |
read | Tail or stream logs from a pod container |
k8s__describe_resource |
read | Full describe for any resource type (pod, service, configmap, secret [values auto-redacted], deployment, statefulset, daemonset, job, cronjob) |
k8s__get_events |
read | Cluster or namespace events, filterable by reason |
k8s__list_deployments |
read | Deployments with replica counts, rollout health, and container images |
k8s__get_resource_usage |
read | CPU/mem usage per pod via metrics-server |
k8s__get_node_status |
read | Node health, conditions, capacity, allocatable resources, taints |
k8s__get_network_policies |
read | Network policies with pod selectors and ingress/egress rules |
k8s__get_ingresses |
read | Ingress resources with hosts, paths, backends, TLS config |
k8s__list_cronjobs |
read | CronJobs with schedule, last run, active jobs, suspend status |
k8s__get_cronjob_status |
read | Detailed CronJob status with recent job history |
k8s__diff_resource |
read | Compare current resource state vs last-applied-configuration |
k8s__get_hpa |
read | HorizontalPodAutoscaler with current/target metrics and scaling status |
k8s__list_pvcs |
read | PersistentVolumeClaims with status, capacity, storage class |
k8s__list_services |
read | Services with type, ports, selectors, clusterIP, endpoints |
k8s__list_contexts |
read | All kubeconfig contexts and the active one |
k8s__switch_context |
mutate | Preview a context selection; set K8S_CONTEXT and restart to apply it safely |
k8s__scale_deployment |
mutate | Scale replicas with dry-run diff preview |
k8s__apply_manifest |
mutate | Apply a manifest string with server-side dry-run |
k8s__rollout_restart |
mutate | Trigger rolling restart of a deployment or statefulset |
k8s__delete_resource |
destructive | Delete a named resource (pod, service, configmap, secret, deployment, statefulset, daemonset, job, cronjob) — requires direct or interactive confirmation |
ArgoCD (argo__*)
| Tool | Tier | Description |
|---|---|---|
argo__list_apps |
read | All apps with health, sync status, source repo |
argo__get_app |
read | Full spec and status for one application |
argo__get_app_diff |
read | Live diff between git and cluster state |
argo__get_app_history |
read | Deployment history with git SHAs and timestamps |
argo__get_resource_tree |
read | Full owned resource tree for an app |
argo__sync_app |
mutate | Trigger sync — supports dry-run, prune, force |
argo__rollback_app |
mutate | Preview rollback to a history revision; set dry_run: false to execute |
argo__terminate_op |
mutate | Preview cancellation of an in-progress sync; set dry_run: false to execute |
Prometheus (prom__*)
| Tool | Tier | Description |
|---|---|---|
prom__query |
read | Instant PromQL query with label + value output |
prom__query_range |
read | Range query with step, returns time-series data |
prom__list_alerts |
read | All alert rules with state (firing / pending / inactive) |
prom__get_firing_alerts |
read | Only currently firing alerts with duration |
prom__list_targets |
read | All scrape targets with health and last scrape |
prom__label_values |
read | Enumerate values for a given label name |
prom__metric_metadata |
read | Type, help text, and unit for a metric |
prom__compare_periods |
read | 📈 Compare metrics between two time windows — detect before/after deployment changes |
prom__slo_status |
read | 🎯 SLO compliance — error budget remaining, burn rate, time to exhaustion |
prom__summarize_service_health |
read | 📊 Smart summary - human-readable service health metrics including latency changes, error rate vs SLO, and traffic patterns |
Example usage:
# Get a human-readable health summary
prom__summarize_service_health(service="payments", timeframeMinutes=30, sloThreshold=0.05)
What it outputs:
- Latency: "Latency increased: 120ms → 480ms (+300%)" or "Latency stable: 125ms"
- Error rate: "Error rate crossed SLO (5%): 7.2%" or "Error rate within SLO: 2.1%"
- Traffic: "Traffic dropped: 500 → 350 req/s (-30%)" or "Traffic spike detected (+150%)"
- Overall assessment: Summary of issues and positive indicators
Why this matters: Instead of raw PromQL numbers that require interpretation, this tool provides actionable insights that AI agents can use directly in responses, making monitoring data actually useful for incident investigation and communication.
Loki (logs__*)
| Tool | Tier | Description |
|---|---|---|
logs__get_recent_errors |
read | Get recent error logs from Loki for debugging incidents |
logs__search |
read | Search logs in Loki with custom query for root cause analysis |
Example usage:
# Get recent error logs
logs__get_recent_errors(service="payments", namespace="default", minutes=30, limit=50)
# Search logs with custom query
logs__search(query='{service="payments"} |= level="error"', limit=100)
Why this matters:
- Metrics tell what: Prometheus shows you that latency increased or error rate crossed SLO
- Logs tell why: Loki shows you the actual error messages, stack traces, and context around failures
- Complete debugging: Without logs, you can see that something is broken but not understand the root cause
Output format:
- Structured log entries with timestamp, message, service, namespace, and extracted log levels
- Error count summaries and filtering
- Raw LogQL results for detailed analysis
This makes incident investigation complete by combining the "what" (metrics) with the "why" (logs).
PagerDuty (pd__*)
| Tool | Tier | Description |
|---|---|---|
pd__list_incidents |
read | Open incidents with severity, status, assignee |
pd__get_incident |
read | Full detail with alerts, notes, timeline |
pd__who_is_oncall |
read | Current on-call per schedule or escalation policy |
pd__list_services |
read | All services with integration keys and status |
pd__get_log_entries |
read | Audit log for an incident (all state changes) |
pd__acknowledge_incident |
mutate | Preview acknowledgement; set dry_run: false to execute |
pd__add_note |
mutate | Preview appending a note; set dry_run: false to execute |
pd__escalate_incident |
destructive | Escalate to a different policy — requires direct or interactive confirmation |
pd__summarize_incident |
read | 🚨 Incident auto-summary - what happened, affected services, probable root cause, current status |
pd__summarize_incident
Example usage:
# Get an auto-summary of an incident
pd__summarize_incident(id="ABC123")
What it outputs:
- What happened: Incident title, description, severity, urgency, status, creation time, and duration
- Affected services: Service name, ID, and current status
- Probable root cause: Analysis of trigger alerts and log entries to identify likely causes
- Current status: Current incident state, assignees, acknowledgements, and notes count
Output format:
{
"what_happened": {
"title": "API Gateway High Error Rate",
"description": "5xx error rate exceeded 5% threshold",
"severity": "high",
"urgency": "high",
"status": "acknowledged",
"createdAt": "2025-01-15T10:30:00Z",
"updatedAt": "2025-01-15T11:45:00Z",
"duration": "1h 15m"
},
"affected_services": [
{
"id": "P123456",
"name": "API Gateway",
"status": "critical"
}
],
"probable_root_cause": "Triggered by: High 5xx error rate from API Gateway pods",
"current_status": {
"status": "acknowledged",
"lastUpdated": "2025-01-15T11:45:00Z",
"assignees": ["john.doe@company.com"],
"acknowledgements": 2,
"notes": 3
}
}
Why this matters: Instead of manually piecing together incident details from multiple API calls, this tool provides a comprehensive, human-readable summary perfect for:
- Demos: Shows AI's ability to understand and summarize complex incident data
- Real-world use: Quickly understand incident impact without digging through raw data
- Communication: Share concise incident summaries with stakeholders
Helm (helm__*)
| Tool | Tier | Description |
|---|---|---|
helm__list_releases |
read | List Helm releases with status, chart, app version |
helm__get_status |
read | Full status of a Helm release |
helm__get_values |
read | User-supplied or computed values for a release |
helm__get_history |
read | Revision history of a release |
helm__rollback |
mutate | Rollback to a previous revision (dry-run by default) |
Requirements: Helm CLI binary must be available in PATH.
Example usage:
# List all releases in a namespace
helm__list_releases(namespace="production")
# Check what values a release is using
helm__get_values(name="api-gateway", all_values=true)
# Rollback after a bad deploy
helm__rollback(name="api-gateway", revision=5, dry_run=false)
Cross-Provider Debugging (devops__*)
| Tool | Tier | Description |
|---|---|---|
devops__debug_service |
read | 🔥 Cross-provider incident debugging - aggregates Kubernetes, ArgoCD, Prometheus, and PagerDuty data to diagnose service issues in one command |
devops__explain_change |
read | 🧠 Explain what changed - combines ArgoCD history, Kubernetes rollout history, and Prometheus anomaly window to identify cause of issues |
devops__runbook |
read | 📋 Automated runbook - symptom-based diagnostic that runs targeted checks (crashloop, high-latency, oom, 5xx, pod-pending) |
devops__health_report |
read | 🏥 Cluster health report - one-shot assessment across all providers with overall status (healthy/degraded/critical) |
devops__incident_timeline |
read | 🕐 Incident timeline - unified event timeline across K8s, ArgoCD, Prometheus, and PagerDuty sorted chronologically |
devops__debug_service
Example usage:
# Debug a service across all providers
devops__debug_service(service="payments", namespace="default")
What it checks:
- Kubernetes: Pod status, restart counts, readiness, deployment health, recent events
- ArgoCD: Sync status, health status, Git diff detection, deployment history
- Prometheus: Error rate (5xx responses), latency (p95), firing alerts
- PagerDuty: Active incidents matching the service name
Output format:
- Human-readable diagnosis with emoji indicators (⚠️ warnings, ❌ errors)
- Per-provider status sections
- Summary highlighting critical issues
- Raw JSON data for detailed analysis
This is the most powerful tool for incident investigation - it gives you a complete picture of what's wrong with a service in seconds.
devops__explain_change
Example usage:
# Explain what changed in the last hour
devops__explain_change(service="payments", namespace="default", timeframeMinutes=60)
What it analyzes:
- ArgoCD: Deployment history within the timeframe, including revision, author, repo, and chart
- Kubernetes: Current rollout status, replica counts, image tags, and deployment readiness
- Prometheus: Error rate trends, latency patterns, and traffic spikes over the time window
Output format:
- Timeline of recent deployments with full metadata
- Kubernetes rollout status and health
- Metric anomaly detection (error rate spikes, latency issues, traffic changes)
- Correlation analysis that links deployments to metric changes
- Summary with root cause hypothesis
Problem it solves: "Everything was working yesterday… what changed?"
This tool answers that question by correlating deployment events with metric anomalies, helping you quickly identify whether a recent deployment, config change, or external factor caused the issue.
devops__runbook
Example usage:
# Diagnose a crashlooping service
devops__runbook(symptom="crashloop", service="payments", namespace="default")
# Investigate high latency
devops__runbook(symptom="high-latency", service="api-gateway")
Supported symptoms:
| Symptom | What it checks |
|---|---|
crashloop |
Pod status → logs (tail 50) → BackOff events → deployment health |
high-latency |
p95 latency → resource usage → firing alerts → recent deploys |
oom |
OOMKilled events → memory usage → pod describe → resource limits |
5xx |
Error rate → Loki error logs → deployment health |
pod-pending |
Scheduling events → pending pods → node capacity |
Output: Structured JSON with steps_executed[], findings[], and recommended_actions[].
devops__health_report
Example usage:
# Get a full cluster health assessment
devops__health_report(namespace="production")
What it gathers:
- Kubernetes: Unhealthy pods, deployments not at desired replicas
- Prometheus: Count of firing alerts
- ArgoCD: Out-of-sync and unhealthy applications
- PagerDuty: Open incident count
Output: Overall status (healthy / degraded / critical), per-provider sections, and summary. Perfect for morning standup checks or shift handoffs.
Deployment options
stdio (recommended for local use)
The MCP host launches devops-mcp as a subprocess and communicates over stdin/stdout. Zero network config. Auth comes from the local environment (kubeconfig, env vars). Process lifecycle tied to Claude Desktop.
npx @notharshhaa/devops-mcp
# or with env vars
KUBECONFIG=~/.kube/config npx @notharshhaa/devops-mcp
Stateless Streamable HTTP (shared deployments)
The HTTP entry serves MCP at POST /mcp using the 2026-07-28 stateless protocol. Each request gets a fresh MCP server instance, so requests can land on any replica without session affinity or shared protocol state. The same endpoint also accepts 2025-era Streamable HTTP clients in stateless compatibility mode.
MCP_HTTP_HOST=127.0.0.1 \
PORT=3000 \
MCP_AUTH_TOKEN=your-secret \
npx -y -p @notharshhaa/devops-mcp@latest devops-mcp-http
Connect clients to http://127.0.0.1:3000/mcp. For a container or remote service, set MCP_HTTP_HOST=0.0.0.0 and configure MCP_ALLOWED_HOSTS with the public/proxy hostnames. Put the service behind TLS for team use.
The deprecated devops-mcp-sse binary remains as a temporary alias for the HTTP entry, but /sse, /message, and /ws now return HTTP 410. Legacy HTTP+SSE and non-standard WebSocket clients must migrate to Streamable HTTP.
2026-07-28 behavior
- No
initializerequirement orMcp-Session-Idon modern requests. server/discover, per-request client metadata, andMCP-Protocol-Versionare handled by the official SDK.Mcp-MethodandMcp-Nameheaders are validated against the JSON-RPC body for gateway routing and authorization.server/discoverandtools/listadvertise deterministic, public cache hints usingMCP_CACHE_TTL_MS(default 60 seconds).- Destructive tools accept
confirm: true; modern clients may instead complete an MRTR interactive confirmation. Confirmation state is HMAC-signed, expires after five minutes, and is bound to the exact tool arguments. Global dry-run blocks before prompting. MCP_REQUEST_STATE_SECRETmust be the same on every replica for MRTR retries to land anywhere. When omitted, the server derives the key fromMCP_AUTH_TOKEN, or uses a process-local random key when no token is configured.- 2025-era Streamable HTTP and stdio clients remain supported. Sessionful HTTP and legacy HTTP+SSE are not.
The built-in MCP_AUTH_TOKEN is a static bearer-token gate, not an OAuth authorization server. For Internet-facing deployments, terminate TLS and enforce your organization’s OAuth/OIDC policy at a gateway or integrate a dedicated identity provider; do not use deprecated Dynamic Client Registration for new deployments.
A minimal docker-compose.yml is available in examples/.
Security model
devops-mcp is designed for internal use inside a trusted network. That said:
- Kubernetes: Uses standard kubeconfig via
@kubernetes/client-node. Supports exec plugins (AWS EKS, GKE). In-cluster: auto-mounts SA token. Add RBAC rules scoped to your desired permissions — run devops-mcp under a dedicated ServiceAccount with minimal verbs. Context selection is fixed byK8S_CONTEXTat startup; the tool only previews changes because runtime switching would affect other callers. - ArgoCD: Generate a long-lived token:
argocd account generate-token --account devops-mcp. Create a dedicated account in argocd-cm with apiKey capability and a role limited to read + sync. - Prometheus: Usually unauthenticated inside a cluster. If using Grafana Mimir or Thanos with auth, pass a Bearer token. All tools are read-only so minimal permissions are needed.
- PagerDuty: Create a dedicated API key in PagerDuty → API Access → Create New API Key. Use Full Access if you want acknowledge/escalate tools; Read-only if you want a safe-only mode.
- Mutations are dry-run by default. Every mutating tool defaults
dry_run: true. The AI must explicitly passdry_run: false— it won't do this unless the user clearly requests an action. - Destructive tools require confirmation. Pass
confirm: truedirectly, or use a 2026-07-28 client that supports the server's MRTR confirmation request.DEVOPS_MCP_DRY_RUN=trueblocks execution even after confirmation. - Audit log. Set
DEVOPS_MCP_AUDIT_LOGto a file path. Every tool call is written as a JSONL line with timestamp, tool name, parameters, and outcome. Mutations and destructive calls are flagged. - Global dry-run mode. Set
DEVOPS_MCP_DRY_RUN=trueto block every executing mutation, even when a caller passesdry_run: false. Safe previews remain available — useful for read-only team deployments.
devops MCP questions
How do I add devops MCP to Claude Code?
Run claude mcp add --env 'ARGOCD_TOKEN=<YOUR_ARGOCD_TOKEN>' --env 'LOKI_TOKEN=<YOUR_LOKI_TOKEN>' --env 'PAGERDUTY_TOKEN=<YOUR_PAGERDUTY_TOKEN>' --env 'PROMETHEUS_BEARER_TOKEN=<YOUR_PROMETHEUS_BEARER_TOKEN>' devops-mcp -- npx -y @notharshhaa/devops-mcp in your terminal. Add --scope user to make it available in every project.
How do I add devops MCP to Cursor?
Open ~/.cursor/mcp.json and add the server under mcpServers, using the Cursor config shown in the install section above.
What tools does devops MCP provide?
It exposes 39 tools, including k8s__list_pods, k8s__get_pod_logs, k8s__describe_resource, k8s__get_events, k8s__list_deployments.
How can I prevent the AI from making accidental changes?
You can enable a global dry run mode by setting the DEVOPS_MCP_DRY_RUN environment variable to true.
Does the server support different safety levels for tools?
Yes, tools follow a three-tier safety model: Read (safe), Mutate (defaults to dry-run), and Destructive (requires confirmation).