@dockndevai/mcp-kubernetes 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -14
- package/dist/k8s/client.js +17 -10
- package/dist/k8s/client.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.js +4 -3
- package/dist/server.js.map +1 -1
- package/dist/tools/annotations.d.ts +25 -0
- package/dist/tools/annotations.js +23 -0
- package/dist/tools/annotations.js.map +1 -0
- package/dist/tools/types.d.ts +4 -0
- package/dist/tools/types.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/dockndevai/mcp-kubernetes/actions/workflows/ci.yml)
|
|
4
4
|
[](./LICENSE)
|
|
5
|
+
[](https://www.npmjs.com/package/@dockndevai/mcp-kubernetes)
|
|
5
6
|
|
|
6
7
|
A [Model Context Protocol](https://modelcontextprotocol.io) server for **Kubernetes**. It lets an MCP-capable client (Claude Desktop, Claude Code, etc.) inspect and operate Kubernetes clusters across multiple contexts — with behaviour controlled entirely by flags.
|
|
7
8
|
|
|
@@ -38,39 +39,75 @@ The layers are independent — e.g. `admin` mode with all three opt-ins `false`
|
|
|
38
39
|
|
|
39
40
|
**Admin** (`admin`): `delete_resource` (needs `K8S_ALLOW_DELETE`), `exec_in_pod` (needs `K8S_ALLOW_EXEC`)
|
|
40
41
|
|
|
41
|
-
##
|
|
42
|
+
## Quickstart — add to your agent
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
Published on npm as [`@dockndevai/mcp-kubernetes`](https://www.npmjs.com/package/@dockndevai/mcp-kubernetes). No clone or build needed — your MCP client runs it on demand with `npx`. **Start in `read-only` mode**; see [`.env.example`](.env.example) for every variable and [docs/CLIENTS.md](docs/CLIENTS.md) for the full per-client guide.
|
|
44
45
|
|
|
45
|
-
|
|
46
|
+
**Claude Code** (CLI)
|
|
46
47
|
|
|
47
48
|
```bash
|
|
48
|
-
|
|
49
|
-
npm run build
|
|
49
|
+
claude mcp add kubernetes -e KUBECONFIG_PATH="/Users/you/.kube/config" -e K8S_MODE="read-only" -- npx -y @dockndevai/mcp-kubernetes
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
Add to your MCP client configuration:
|
|
52
|
+
**Claude Desktop · Cursor · Windsurf** — same block in `claude_desktop_config.json`, `.cursor/mcp.json`, or `~/.codeium/windsurf/mcp_config.json`:
|
|
55
53
|
|
|
56
54
|
```json
|
|
57
55
|
{
|
|
58
56
|
"mcpServers": {
|
|
59
57
|
"kubernetes": {
|
|
60
|
-
"command": "
|
|
61
|
-
"args": [
|
|
58
|
+
"command": "npx",
|
|
59
|
+
"args": [
|
|
60
|
+
"-y",
|
|
61
|
+
"@dockndevai/mcp-kubernetes"
|
|
62
|
+
],
|
|
63
|
+
"env": {
|
|
64
|
+
"KUBECONFIG_PATH": "/Users/you/.kube/config",
|
|
65
|
+
"K8S_MODE": "read-only"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**OpenAI Codex CLI** — in `~/.codex/config.toml`:
|
|
73
|
+
|
|
74
|
+
```toml
|
|
75
|
+
[mcp_servers.kubernetes]
|
|
76
|
+
command = "npx"
|
|
77
|
+
args = ["-y", "@dockndevai/mcp-kubernetes"]
|
|
78
|
+
env = { KUBECONFIG_PATH = "/Users/you/.kube/config", K8S_MODE = "read-only" }
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**VS Code (GitHub Copilot, Agent mode)** — in `.vscode/mcp.json`:
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"servers": {
|
|
86
|
+
"kubernetes": {
|
|
87
|
+
"type": "stdio",
|
|
88
|
+
"command": "npx",
|
|
89
|
+
"args": [
|
|
90
|
+
"-y",
|
|
91
|
+
"@dockndevai/mcp-kubernetes"
|
|
92
|
+
],
|
|
62
93
|
"env": {
|
|
63
94
|
"KUBECONFIG_PATH": "/Users/you/.kube/config",
|
|
64
|
-
"K8S_MODE": "read-only"
|
|
65
|
-
"K8S_CONTEXT_ALLOWLIST": "staging",
|
|
66
|
-
"K8S_NAMESPACE_ALLOWLIST": "app,web"
|
|
95
|
+
"K8S_MODE": "read-only"
|
|
67
96
|
}
|
|
68
97
|
}
|
|
69
98
|
}
|
|
70
99
|
}
|
|
71
100
|
```
|
|
72
101
|
|
|
73
|
-
|
|
102
|
+
## Run from source (development)
|
|
103
|
+
|
|
104
|
+
Prefer the published package above. To run from a clone:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npm install
|
|
108
|
+
npm run build
|
|
109
|
+
node dist/index.js # with the environment variables set
|
|
110
|
+
```
|
|
74
111
|
|
|
75
112
|
## Develop
|
|
76
113
|
|
package/dist/k8s/client.js
CHANGED
|
@@ -8,17 +8,24 @@ export class K8sClient {
|
|
|
8
8
|
base;
|
|
9
9
|
constructor(conn) {
|
|
10
10
|
this.base = new KubeConfig();
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
// Loading is best-effort so the server can still start and advertise its
|
|
12
|
+
// tools (introspection) without a kube-config; tool calls then fail clearly.
|
|
13
|
+
try {
|
|
14
|
+
if (conn.inCluster) {
|
|
15
|
+
this.base.loadFromCluster();
|
|
16
|
+
}
|
|
17
|
+
else if (conn.kubeconfigPath) {
|
|
18
|
+
this.base.loadFromFile(conn.kubeconfigPath);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
this.base.loadFromDefault();
|
|
22
|
+
}
|
|
23
|
+
if (conn.defaultContext) {
|
|
24
|
+
this.base.setCurrentContext(conn.defaultContext);
|
|
25
|
+
}
|
|
19
26
|
}
|
|
20
|
-
|
|
21
|
-
|
|
27
|
+
catch (err) {
|
|
28
|
+
process.stderr.write(`[kubernetes-mcp] WARNING: could not load kube-config (${err.message}); tool calls will fail until a valid config is available.\n`);
|
|
22
29
|
}
|
|
23
30
|
}
|
|
24
31
|
/** Names of all contexts in the loaded kube-config. */
|
package/dist/k8s/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/k8s/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,SAAS,EACT,SAAS,EACT,IAAI,EACJ,UAAU,EACV,mBAAmB,GAEpB,MAAM,yBAAyB,CAAC;AAYjC,MAAM,OAAO,SAAS;IACH,IAAI,CAAa;IAElC,YAAY,IAAoB;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/k8s/client.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { AppConfig } from "./config.js";
|
|
3
|
+
import type { ToolDef } from "./tools/types.js";
|
|
4
|
+
export declare const ALL_TOOLS: ToolDef[];
|
|
3
5
|
export declare function buildServer(config: AppConfig): {
|
|
4
6
|
server: McpServer;
|
|
5
7
|
enabled: string[];
|
package/dist/server.js
CHANGED
|
@@ -4,13 +4,14 @@ import { K8sClient } from "./k8s/client.js";
|
|
|
4
4
|
import { PolicyError, SecurityPolicy } from "./security.js";
|
|
5
5
|
import { adminTools } from "./tools/admin.js";
|
|
6
6
|
import { readTools } from "./tools/read.js";
|
|
7
|
+
import { annotationsFor } from "./tools/annotations.js";
|
|
7
8
|
import { writeTools } from "./tools/write.js";
|
|
8
|
-
const ALL_TOOLS = [...readTools, ...writeTools, ...adminTools];
|
|
9
|
+
export const ALL_TOOLS = [...readTools, ...writeTools, ...adminTools];
|
|
9
10
|
export function buildServer(config) {
|
|
10
11
|
const policy = new SecurityPolicy(config.security);
|
|
11
12
|
const client = new K8sClient(config.connection);
|
|
12
13
|
const ctx = { client, policy };
|
|
13
|
-
const server = new McpServer({ name: "mcp-kubernetes", version: "0.1.
|
|
14
|
+
const server = new McpServer({ name: "mcp-kubernetes", version: "0.1.2" });
|
|
14
15
|
const enabled = [];
|
|
15
16
|
for (const tool of ALL_TOOLS) {
|
|
16
17
|
if (!policy.isCapabilityEnabled(tool.capability))
|
|
@@ -19,7 +20,7 @@ export function buildServer(config) {
|
|
|
19
20
|
if (tool.enabledWhen && !tool.enabledWhen(policy))
|
|
20
21
|
continue;
|
|
21
22
|
enabled.push(tool.name);
|
|
22
|
-
server.registerTool(tool.name, tool.config, async (args) => {
|
|
23
|
+
server.registerTool(tool.name, { ...tool.config, annotations: annotationsFor(tool) }, async (args) => {
|
|
23
24
|
try {
|
|
24
25
|
return await tool.handler(args ?? {}, ctx);
|
|
25
26
|
}
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ToolDef } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* MCP tool annotations — machine-readable behaviour hints the host reads to
|
|
4
|
+
* decide what to auto-approve versus prompt on.
|
|
5
|
+
* See https://modelcontextprotocol.io/docs/concepts/tools#tool-annotations
|
|
6
|
+
*/
|
|
7
|
+
export interface ToolAnnotations {
|
|
8
|
+
title?: string;
|
|
9
|
+
readOnlyHint?: boolean;
|
|
10
|
+
destructiveHint?: boolean;
|
|
11
|
+
idempotentHint?: boolean;
|
|
12
|
+
openWorldHint?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Derive annotations from a tool's declared capability, so the safe-by-default
|
|
16
|
+
* access model is exposed to the host rather than hidden in the description.
|
|
17
|
+
*
|
|
18
|
+
* - `read` ⇒ read-only, non-destructive, idempotent.
|
|
19
|
+
* - `write` ⇒ mutating; non-destructive unless the tool sets `destructive`.
|
|
20
|
+
* - `admin` ⇒ mutating and destructive (data loss possible).
|
|
21
|
+
*
|
|
22
|
+
* Every tool talks to an external system (cluster/cloud/database), so
|
|
23
|
+
* `openWorldHint` is always true.
|
|
24
|
+
*/
|
|
25
|
+
export declare function annotationsFor(tool: ToolDef): ToolAnnotations;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derive annotations from a tool's declared capability, so the safe-by-default
|
|
3
|
+
* access model is exposed to the host rather than hidden in the description.
|
|
4
|
+
*
|
|
5
|
+
* - `read` ⇒ read-only, non-destructive, idempotent.
|
|
6
|
+
* - `write` ⇒ mutating; non-destructive unless the tool sets `destructive`.
|
|
7
|
+
* - `admin` ⇒ mutating and destructive (data loss possible).
|
|
8
|
+
*
|
|
9
|
+
* Every tool talks to an external system (cluster/cloud/database), so
|
|
10
|
+
* `openWorldHint` is always true.
|
|
11
|
+
*/
|
|
12
|
+
export function annotationsFor(tool) {
|
|
13
|
+
const readOnly = tool.capability === "read";
|
|
14
|
+
const destructive = tool.destructive ?? tool.capability === "admin";
|
|
15
|
+
return {
|
|
16
|
+
title: tool.config.title,
|
|
17
|
+
readOnlyHint: readOnly,
|
|
18
|
+
destructiveHint: readOnly ? false : destructive,
|
|
19
|
+
idempotentHint: tool.idempotent ?? readOnly,
|
|
20
|
+
openWorldHint: true,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=annotations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/tools/annotations.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO,CAAC;IACpE,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;QACxB,YAAY,EAAE,QAAQ;QACtB,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW;QAC/C,cAAc,EAAE,IAAI,CAAC,UAAU,IAAI,QAAQ;QAC3C,aAAa,EAAE,IAAI;KACpB,CAAC;AACJ,CAAC"}
|
package/dist/tools/types.d.ts
CHANGED
|
@@ -16,6 +16,10 @@ export interface ToolResult {
|
|
|
16
16
|
export interface ToolDef<Shape extends ZodRawShape = ZodRawShape> {
|
|
17
17
|
name: string;
|
|
18
18
|
capability: Capability;
|
|
19
|
+
/** Marks a mutating tool as destructive (data loss possible). Defaults to `capability === "admin"`. */
|
|
20
|
+
destructive?: boolean;
|
|
21
|
+
/** Overrides the idempotency hint. Defaults to `true` for read tools, `false` otherwise. */
|
|
22
|
+
idempotent?: boolean;
|
|
19
23
|
/** If set, the tool is only registered when this predicate passes. */
|
|
20
24
|
enabledWhen?: (policy: SecurityPolicy) => boolean;
|
|
21
25
|
config: {
|
package/dist/tools/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAiCA,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAAC,IAA4C;IACxE,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI;QACtB,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS;QAChC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK;QACtB,KAAK,EACH,CAAC,CAAC,CAAC,MAAM,EAAE,iBAAiB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM;YACtE,GAAG;YACH,CAAC,CAAC,CAAC,MAAM,EAAE,iBAAiB,IAAI,EAAE,CAAC,CAAC,MAAM;QAC5C,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,iBAAiB,IAAI,EAAE,CAAC,CAAC,MAAM,CAClD,CAAC,CAAS,EAAE,CAAM,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,EAChD,CAAC,CACF;QACD,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ;QACtB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS;KAC/B,CAAC,CAAC,CAAC;AACN,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dockndevai/mcp-kubernetes",
|
|
3
3
|
"mcpName": "io.github.dockndevai/mcp-kubernetes",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.2",
|
|
5
5
|
"description": "Model Context Protocol server for Kubernetes — multi-cluster access with security modes and access-control flags.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"license": "MIT",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
],
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@kubernetes/client-node": "^1.0.0",
|
|
46
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
46
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
47
47
|
"zod": "^3.23.8"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|