Rancher MCP Server

Model Context Protocol (MCP) server for the Rancher ecosystem: multi-cluster Kubernetes, Harvester HCI (VMs, storage, networks), and Fleet GitOps.

rancher-mcp-server

GitHub License npm GitHub release (latest SemVer) Build

rancher-mcp-server banner

Model Context Protocol (MCP) server for the Rancher ecosystem: multi-cluster Kubernetes, Harvester HCI (VMs, storage, networks), and Fleet GitOps.

Demo

A walkthrough of how this MCP server works (example in Cursor).

https://github.com/user-attachments/assets/7d8fb814-e504-47b4-956d-28f43aeea3b8

Features

  • Harvester toolset: List/get VMs, images, volumes, networks, hosts; VM actions; addon list/switch (enable/disable)
  • Rancher toolset: List clusters and projects, cluster get, overview (management API)
  • Kubernetes toolset: List/get/create/patch/delete resources by apiVersion/kind; describe (resource + events), events, capacity
  • Helm toolset: List/get/history of releases; install, upgrade, rollback, uninstall; repo list
  • Fleet toolset: GitRepo list/get/create; Bundle list; Fleet cluster list; drift detection
  • Rancher Steve API: Single token, multi-cluster access; no CLI wrappers
  • Security: Read-only default, disable-destructive, sensitive data masking
  • Config: Flags, env (RANCHER_MCP_*), or file (YAML/TOML)

Quick start

Install

npm install -g rancher-mcp-server

Cursor

Add to .cursor/mcp.json (project-level) or ~/.cursor/mcp.json (global):

{
  "mcpServers": {
    "rancher": {
      "command": "npx",
      "args": [
        "-y", "rancher-mcp-server",
        "--rancher-server-url", "https://rancher.example.com",
        "--rancher-token", "token-xxxxx:yyyy",
        "--toolsets", "harvester,rancher,kubernetes,fleet"
      ]
    }
  }
}

Restart Cursor after saving. Check Settings → Tools & MCP that rancher is listed and enabled.

Claude Desktop

Add to your Claude Desktop config (claude_desktop_config.json):

{
  "mcpServers": {
    "rancher": {
      "command": "npx",
      "args": [
        "-y", "rancher-mcp-server",
        "--rancher-server-url", "https://rancher.example.com",
        "--rancher-token", "token-xxxxx:yyyy",
        "--toolsets", "harvester,rancher,kubernetes,fleet"
      ]
    }
  }
}

With env vars instead of args

If you prefer to keep the token out of the JSON config:

{
  "mcpServers": {
    "rancher": {
      "command": "npx",
      "args": ["-y", "rancher-mcp-server"],
      "env": {
        "RANCHER_MCP_RANCHER_SERVER_URL": "https://rancher.example.com",
        "RANCHER_MCP_RANCHER_TOKEN": "token-xxxxx:yyyy",
        "RANCHER_MCP_TOOLSETS": "harvester,rancher,kubernetes"
      }
    }
  }
}

Enable write operations

For VM create, snapshots, backups, image/volume create, addon switch, host maintenance mode, VPC create/update/delete, Kubernetes create/patch/delete, Helm install/upgrade/rollback, and Fleet gitrepo create/delete, add --read-only=false. Delete operations also require --disable-destructive=false (default).

{
  "mcpServers": {
    "rancher": {
      "command": "npx",
      "args": [
        "-y", "rancher-mcp-server",
        "--rancher-server-url", "https://rancher.example.com",
        "--rancher-token", "token-xxxxx:yyyy",
        "--toolsets", "harvester,rancher,kubernetes,helm,fleet",
        "--read-only=false"
      ]
    }
  }
}

Streamable HTTP transport

For web clients or remote access (e.g. Claude Code claude mcp add -t http), add --transport and --port:

{
  "mcpServers": {
    "rancher": {
      "command": "npx",
      "args": [
        "-y", "rancher-mcp-server",
        "--rancher-server-url", "https://rancher.example.com",
        "--rancher-token", "token-xxxxx:yyyy",
        "--transport", "http",
        "--port", "8080"
      ]
    }
  }
}

The server uses the MCP Streamable HTTP transport. The default MCP path is /mcp; connect to http://localhost:8080/mcp (or your server base URL + /mcp). Best supported with Claude Code; Cursor support may vary.

Build from source

If you prefer to build the Go binary yourself:

go build -o rancher-mcp-server ./cmd/rancher-mcp-server

Then reference the binary directly in your MCP config:

{
  "mcpServers": {
    "rancher": {
      "command": "/absolute/path/to/rancher-mcp-server",
      "args": [
        "--rancher-server-url", "https://rancher.example.com",
        "--rancher-token", "token-xxxxx:yyyy",
        "--toolsets", "harvester,rancher,kubernetes,fleet"
      ]
    }
  }
}

Configuration

OptionEnvDefaultDescription
--rancher-server-urlRANCHER_MCP_RANCHER_SERVER_URLRancher server URL (required)
--rancher-tokenRANCHER_MCP_RANCHER_TOKENBearer token (required)
--tls-insecureRANCHER_MCP_TLS_INSECUREfalseSkip TLS verification
--read-onlyRANCHER_MCP_READ_ONLYtrueDisable write operations
--disable-destructiveRANCHER_MCP_DISABLE_DESTRUCTIVEfalseDisable delete operations
--toolsetsRANCHER_MCP_TOOLSETSharvesterToolsets to enable: harvester, rancher, kubernetes, helm, fleet
--transportRANCHER_MCP_TRANSPORTstdioTransport: stdio or http (Streamable HTTP; default path /mcp)
--portRANCHER_MCP_PORT0Port for HTTP (0 = stdio only)

Harvester tools

ToolDescription
harvester_vm_listList VMs with status, namespace, spec/status
harvester_vm_getGet one VM (full spec and status)
harvester_vm_actionstart, stop, restart, pause, unpause, migrate
harvester_vm_createCreate VM (when not read-only). Supports network, interface_type (managedtap/bridge/masquerade), subnet for KubeOVN VPC.
harvester_vm_snapshotCreate/list/restore/delete VM snapshots
harvester_vm_backupCreate/list/restore VM backups (Backup Target)
harvester_image_listList VM images (VirtualMachineImage)
harvester_image_createCreate VM image from URL (when not read-only)
harvester_volume_listList PVCs (Longhorn-backed volumes)
harvester_volume_createCreate volume/PVC (optionally from image)
harvester_network_listList VM networks (NetworkAttachmentDefinition)
harvester_network_createCreate VM network - KubeOVN overlay or VLAN (when not read-only)
harvester_network_updateUpdate VM network config (when not read-only)
harvester_network_deleteDelete VM network (when destructive allowed)
harvester_subnet_listList KubeOVN Subnets (requires kubeovn-operator)
harvester_subnet_createCreate Subnet in VPC for VM network (when not read-only)
harvester_subnet_updateUpdate Subnet namespaces/NAT (when not read-only)
harvester_subnet_deleteDelete Subnet (when destructive allowed)
harvester_host_listList nodes (Harvester hosts)
harvester_host_actionEnable/disable maintenance mode on a host (cordon/uncordon)
harvester_settingsList or get Harvester cluster settings (backup-target, etc.)
harvester_addon_listList Harvester addons (enabled/disabled state)
harvester_addon_switchEnable or disable an addon (when not read-only)
harvester_vpc_listList KubeOVN VPCs (requires kubeovn-operator addon)
harvester_vpc_createCreate a KubeOVN VPC (when not read-only)
harvester_vpc_updateUpdate a KubeOVN VPC namespaces (when not read-only)
harvester_vpc_deleteDelete a KubeOVN VPC (when destructive allowed)

List tools accept cluster (required), namespace, format (json|table), limit (default 100), continue (pagination token for next page). Write tools require read_only: false.

Creating a VM on KubeOVN VPC with external internet

Use harvester_vm_create with:

  1. network: Name of the overlay network (NAD) linked to a KubeOVN subnet. Create via harvester_network_create (type=kubeovn) then harvester_subnet_create with provider={network}.{namespace}.ovn, vpc=<vpc-name>, and nat_outgoing=true.
  2. interface_type: managedtap (recommended for KubeOVN) or bridge. Uses Multus as primary network.
  3. subnet: Optional KubeOVN subnet name for ovn.kubernetes.io/logical_switch annotation.

Example: VM on network vswitch1 in namespace default, managedTap interface, subnet vswitch1-subnet:

harvester_vm_create cluster=<cluster-id> namespace=default name=testvm image=<image> network=vswitch1 interface_type=managedtap subnet=vswitch1-subnet

Rancher tools

ToolDescription
rancher_cluster_listList Rancher clusters (management)
rancher_cluster_getGet one cluster (health, version, node count)
rancher_project_listList Rancher projects
rancher_overviewOverview: cluster count and project count

Uses Rancher management API (cluster ID local). No cluster param.

Helm tools

ToolDescription
helm_listList Helm releases (optionally by namespace, deployed/failed/pending)
helm_getGet release details (manifest, values, notes)
helm_historyGet revision history for a release
helm_repo_listList configured Helm chart repositories (from local config)
helm_installInstall a Helm chart (when not read-only)
helm_upgradeUpgrade a Helm release (when not read-only)
helm_rollbackRollback a release to a previous revision (when not read-only)
helm_uninstallUninstall a release (when destructive allowed)

All tools take cluster (Rancher cluster ID). Install/upgrade require chart, release; optional repo_url, version, values (JSON).

Fleet tools

ToolDescription
fleet_gitrepo_listList Fleet GitRepos (GitOps sources)
fleet_gitrepo_getGet one GitRepo (spec, status)
fleet_gitrepo_createCreate a GitRepo (when not read-only)
fleet_gitrepo_deleteDelete a GitRepo (when destructive allowed)
fleet_gitrepo_actionPause, unpause, disablePolling, enablePolling, forceUpdate
fleet_gitrepo_cloneClone a GitRepo to a new name (copy spec)
fleet_bundle_listList Fleet Bundles (deployment units from GitRepos)
fleet_cluster_listList Fleet clusters (downstream clusters registered with Fleet)
fleet_drift_detectReport BundleDeployments with Modified state (drift)

All tools use the Rancher management cluster (local). Optional namespace (default: fleet-default). List tools support format, limit, continue (pagination). fleet_gitrepo_create requires name, repo; optional branch, paths. fleet_gitrepo_action supports: pause, unpause, disablePolling, enablePolling, forceUpdate. fleet_gitrepo_clone copies spec from an existing GitRepo to a new name.

Kubernetes tools

ToolDescription
kubernetes_listList resources by apiVersion/kind (e.g. v1 Pod, apps/v1 Deployment)
kubernetes_getGet one resource by apiVersion, kind, namespace, name
kubernetes_describeGet resource + recent events
kubernetes_logsGet recent pod logs (tail only; container, tailLines, sinceSeconds)
kubernetes_eventsList events in a namespace (optional involvedObject filter)
kubernetes_capacityNode capacity/allocatable summary per node
kubernetes_createCreate resource from JSON (when not read-only)
kubernetes_patchPatch resource with JSON (when not read-only)
kubernetes_deleteDelete resource (when destructive allowed)

All tools take cluster (Rancher cluster ID). List/get support namespace, format (json|table), limit, continue (pagination). Create/patch/delete are gated by read_only and disable_destructive. kubernetes_logs does not support follow (streaming); use tail_lines and since_seconds to limit output. In some Rancher/proxy setups pod logs can return 503 or stream errors; see Troubleshooting.


Setup: Rancher token & Harvester cluster ID

Get a Rancher API token

  1. Log in to your Rancher UI.
  2. Click your profile/avatar (top right) → Account & API Keys (or API & Keys).
  3. Click Create API Key, name it (e.g. mcp-server), then Create.
  4. Copy the token once (format like token-abc12:xyz...). Use it as --rancher-token or RANCHER_MCP_RANCHER_TOKEN.

Find your Harvester cluster ID

Harvester tools require the cluster ID (e.g. c-tx8rn) on each call.

  • From Rancher UI: Go to Cluster Management → open your Harvester cluster. The URL contains the cluster ID: .../c/<cluster-id>/....
  • From API: curl -s -H "Authorization: Bearer YOUR_TOKEN" "https://YOUR_RANCHER_URL/v1/management.cattle.io.clusters" | jq '.data[] | {name: .metadata.name}'

Docker (Streamable HTTP)

For HTTP server mode, use the container image from GitHub Container Registry (ghcr.io). For Cursor/Claude with stdio, use npm (see Quick start).

Run the server and expose the port:

docker run -d -p 8080:8080 \
  -e RANCHER_MCP_RANCHER_SERVER_URL=https://rancher.example.com \
  -e RANCHER_MCP_RANCHER_TOKEN="token-xxxxx:yyyy" \
  -e RANCHER_MCP_TRANSPORT=http \
  -e RANCHER_MCP_PORT=8080 \
  ghcr.io/mrostamii/rancher-mcp-server:latest

Connect clients to the MCP endpoint: http://localhost:8080/mcp (Streamable HTTP; default path is /mcp). Example: claude mcp add -t http rancher http://localhost:8080/mcp

Supported platforms

  • macOS (Apple Silicon & Intel)
  • Linux (x64 & ARM64)
  • Windows (x64)

Troubleshooting

IssueWhat to check
"rancher-server-url and rancher-token are required"Check --rancher-server-url and --rancher-token in args, or env vars RANCHER_MCP_RANCHER_SERVER_URL and RANCHER_MCP_RANCHER_TOKEN.
401 UnauthorizedToken expired or invalid. Create a new API key in Rancher.
TLS / certificate errorsFor self-signed Rancher, pass --tls-insecure (dev only).
"cluster not found" or empty listsWrong cluster ID. Get it from Rancher UI URL or API; pass it as cluster to Harvester/Kubernetes tools.
Cursor doesn't show toolsRestart Cursor after editing mcp.json; check Tools & MCP that the server is enabled.
Binary not foundUse absolute paths in mcp.json for command when building from source.
kubernetes_logs 503 or stream errorsKnown in some Rancher/proxied setups (e.g. RKE2). Reduce tail_lines or try another cluster; see rancher/rancher#40711.

License

Apache-2.0

Related Servers