@prodisco/k8s-mcp 0.1.0

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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/dist/codegen/generateTypes.d.ts +8 -0
  4. package/dist/codegen/generateTypes.d.ts.map +1 -0
  5. package/dist/codegen/generateTypes.js +96 -0
  6. package/dist/codegen/generateTypes.js.map +1 -0
  7. package/dist/codegen/interfaceGenerator.d.ts +9 -0
  8. package/dist/codegen/interfaceGenerator.d.ts.map +1 -0
  9. package/dist/codegen/interfaceGenerator.js +185 -0
  10. package/dist/codegen/interfaceGenerator.js.map +1 -0
  11. package/dist/codegen/toolMapping.d.ts +11 -0
  12. package/dist/codegen/toolMapping.d.ts.map +1 -0
  13. package/dist/codegen/toolMapping.js +78 -0
  14. package/dist/codegen/toolMapping.js.map +1 -0
  15. package/dist/codegen/typeExtractor.d.ts +23 -0
  16. package/dist/codegen/typeExtractor.d.ts.map +1 -0
  17. package/dist/codegen/typeExtractor.js +112 -0
  18. package/dist/codegen/typeExtractor.js.map +1 -0
  19. package/dist/kube/client.d.ts +37 -0
  20. package/dist/kube/client.d.ts.map +1 -0
  21. package/dist/kube/client.js +161 -0
  22. package/dist/kube/client.js.map +1 -0
  23. package/dist/kube/types.d.ts +27 -0
  24. package/dist/kube/types.d.ts.map +1 -0
  25. package/dist/kube/types.js +2 -0
  26. package/dist/kube/types.js.map +1 -0
  27. package/dist/resources/filesystem.d.ts +15 -0
  28. package/dist/resources/filesystem.d.ts.map +1 -0
  29. package/dist/resources/filesystem.js +54 -0
  30. package/dist/resources/filesystem.js.map +1 -0
  31. package/dist/server.d.ts +3 -0
  32. package/dist/server.d.ts.map +1 -0
  33. package/dist/server.js +127 -0
  34. package/dist/server.js.map +1 -0
  35. package/dist/tools/index.d.ts +3 -0
  36. package/dist/tools/index.d.ts.map +1 -0
  37. package/dist/tools/index.js +3 -0
  38. package/dist/tools/index.js.map +1 -0
  39. package/dist/tools/kubernetes/index.d.ts +5 -0
  40. package/dist/tools/kubernetes/index.d.ts.map +1 -0
  41. package/dist/tools/kubernetes/index.js +6 -0
  42. package/dist/tools/kubernetes/index.js.map +1 -0
  43. package/dist/tools/kubernetes/metadata.d.ts +110 -0
  44. package/dist/tools/kubernetes/metadata.d.ts.map +1 -0
  45. package/dist/tools/kubernetes/metadata.js +19 -0
  46. package/dist/tools/kubernetes/metadata.js.map +1 -0
  47. package/dist/tools/kubernetes/searchTools-old.d.ts +35 -0
  48. package/dist/tools/kubernetes/searchTools-old.d.ts.map +1 -0
  49. package/dist/tools/kubernetes/searchTools-old.js +414 -0
  50. package/dist/tools/kubernetes/searchTools-old.js.map +1 -0
  51. package/dist/tools/kubernetes/searchTools-v2.d.ts +35 -0
  52. package/dist/tools/kubernetes/searchTools-v2.d.ts.map +1 -0
  53. package/dist/tools/kubernetes/searchTools-v2.js +269 -0
  54. package/dist/tools/kubernetes/searchTools-v2.js.map +1 -0
  55. package/dist/tools/kubernetes/searchTools.d.ts +87 -0
  56. package/dist/tools/kubernetes/searchTools.d.ts.map +1 -0
  57. package/dist/tools/kubernetes/searchTools.js +529 -0
  58. package/dist/tools/kubernetes/searchTools.js.map +1 -0
  59. package/dist/tools/kubernetes/typeDefinitions.d.ts +24 -0
  60. package/dist/tools/kubernetes/typeDefinitions.d.ts.map +1 -0
  61. package/dist/tools/kubernetes/typeDefinitions.js +518 -0
  62. package/dist/tools/kubernetes/typeDefinitions.js.map +1 -0
  63. package/dist/tools/types.d.ts +10 -0
  64. package/dist/tools/types.d.ts.map +1 -0
  65. package/dist/tools/types.js +2 -0
  66. package/dist/tools/types.js.map +1 -0
  67. package/dist/util/manifest.d.ts +5 -0
  68. package/dist/util/manifest.d.ts.map +1 -0
  69. package/dist/util/manifest.js +31 -0
  70. package/dist/util/manifest.js.map +1 -0
  71. package/dist/util/paths.d.ts +7 -0
  72. package/dist/util/paths.d.ts.map +1 -0
  73. package/dist/util/paths.js +14 -0
  74. package/dist/util/paths.js.map +1 -0
  75. package/dist/util/summary.d.ts +403 -0
  76. package/dist/util/summary.d.ts.map +1 -0
  77. package/dist/util/summary.js +211 -0
  78. package/dist/util/summary.js.map +1 -0
  79. package/package.json +61 -0
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Mapping of tool files to their Kubernetes types
3
+ */
4
+ export const TOOL_TYPE_MAPPINGS = [
5
+ {
6
+ toolFile: 'src/tools/kubernetes/getPod.ts',
7
+ resultTypeName: 'GetPodResult',
8
+ kubernetesType: 'V1Pod',
9
+ description: 'Pod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts.'
10
+ },
11
+ {
12
+ toolFile: 'src/tools/kubernetes/listPods.ts',
13
+ resultTypeName: 'ListPodsResult',
14
+ kubernetesType: 'V1PodList',
15
+ description: 'PodList is a list of Pods.'
16
+ },
17
+ {
18
+ toolFile: 'src/tools/kubernetes/getDeployment.ts',
19
+ resultTypeName: 'GetDeploymentResult',
20
+ kubernetesType: 'V1Deployment',
21
+ description: 'Deployment enables declarative updates for Pods and ReplicaSets.'
22
+ },
23
+ {
24
+ toolFile: 'src/tools/kubernetes/listDeployments.ts',
25
+ resultTypeName: 'ListDeploymentsResult',
26
+ kubernetesType: 'V1DeploymentList',
27
+ description: 'DeploymentList is a list of Deployments.'
28
+ },
29
+ {
30
+ toolFile: 'src/tools/kubernetes/getService.ts',
31
+ resultTypeName: 'GetServiceResult',
32
+ kubernetesType: 'V1Service',
33
+ description: 'Service is a named abstraction of software service consisting of a local port that the proxy listens on, and the selector that determines which pods will answer requests sent through the proxy.'
34
+ },
35
+ {
36
+ toolFile: 'src/tools/kubernetes/listServices.ts',
37
+ resultTypeName: 'ListServicesResult',
38
+ kubernetesType: 'V1ServiceList',
39
+ description: 'ServiceList is a list of Services.'
40
+ },
41
+ {
42
+ toolFile: 'src/tools/kubernetes/listNodes.ts',
43
+ resultTypeName: 'ListNodesResult',
44
+ kubernetesType: 'V1NodeList',
45
+ description: 'NodeList is a list of nodes in the cluster.'
46
+ },
47
+ {
48
+ toolFile: 'src/tools/kubernetes/getPodLogs.ts',
49
+ resultTypeName: 'GetPodLogsResult',
50
+ kubernetesType: 'string',
51
+ description: 'Pod logs as a string.'
52
+ },
53
+ {
54
+ toolFile: 'src/tools/kubernetes/applyManifest.ts',
55
+ resultTypeName: 'ApplyManifestResult',
56
+ kubernetesType: 'Array<KubernetesObject>',
57
+ description: 'Array of applied Kubernetes objects.'
58
+ },
59
+ {
60
+ toolFile: 'src/tools/kubernetes/deleteResource.ts',
61
+ resultTypeName: 'DeleteResourceResult',
62
+ kubernetesType: 'object',
63
+ description: 'Result of resource deletion.'
64
+ },
65
+ {
66
+ toolFile: 'src/tools/kubernetes/getCustomResource.ts',
67
+ resultTypeName: 'GetCustomResourceResult',
68
+ kubernetesType: 'KubernetesObject',
69
+ description: 'Custom resource object.'
70
+ },
71
+ {
72
+ toolFile: 'src/tools/kubernetes/listCustomResources.ts',
73
+ resultTypeName: 'ListCustomResourcesResult',
74
+ kubernetesType: 'KubernetesListObject',
75
+ description: 'List of custom resource objects.'
76
+ },
77
+ ];
78
+ //# sourceMappingURL=toolMapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolMapping.js","sourceRoot":"","sources":["../../src/codegen/toolMapping.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,CAAC,MAAM,kBAAkB,GAAsB;IACnD;QACE,QAAQ,EAAE,gCAAgC;QAC1C,cAAc,EAAE,cAAc;QAC9B,cAAc,EAAE,OAAO;QACvB,WAAW,EAAE,yHAAyH;KACvI;IACD;QACE,QAAQ,EAAE,kCAAkC;QAC5C,cAAc,EAAE,gBAAgB;QAChC,cAAc,EAAE,WAAW;QAC3B,WAAW,EAAE,4BAA4B;KAC1C;IACD;QACE,QAAQ,EAAE,uCAAuC;QACjD,cAAc,EAAE,qBAAqB;QACrC,cAAc,EAAE,cAAc;QAC9B,WAAW,EAAE,kEAAkE;KAChF;IACD;QACE,QAAQ,EAAE,yCAAyC;QACnD,cAAc,EAAE,uBAAuB;QACvC,cAAc,EAAE,kBAAkB;QAClC,WAAW,EAAE,0CAA0C;KACxD;IACD;QACE,QAAQ,EAAE,oCAAoC;QAC9C,cAAc,EAAE,kBAAkB;QAClC,cAAc,EAAE,WAAW;QAC3B,WAAW,EAAE,mMAAmM;KACjN;IACD;QACE,QAAQ,EAAE,sCAAsC;QAChD,cAAc,EAAE,oBAAoB;QACpC,cAAc,EAAE,eAAe;QAC/B,WAAW,EAAE,oCAAoC;KAClD;IACD;QACE,QAAQ,EAAE,mCAAmC;QAC7C,cAAc,EAAE,iBAAiB;QACjC,cAAc,EAAE,YAAY;QAC5B,WAAW,EAAE,6CAA6C;KAC3D;IACD;QACE,QAAQ,EAAE,oCAAoC;QAC9C,cAAc,EAAE,kBAAkB;QAClC,cAAc,EAAE,QAAQ;QACxB,WAAW,EAAE,uBAAuB;KACrC;IACD;QACE,QAAQ,EAAE,uCAAuC;QACjD,cAAc,EAAE,qBAAqB;QACrC,cAAc,EAAE,yBAAyB;QACzC,WAAW,EAAE,sCAAsC;KACpD;IACD;QACE,QAAQ,EAAE,wCAAwC;QAClD,cAAc,EAAE,sBAAsB;QACtC,cAAc,EAAE,QAAQ;QACxB,WAAW,EAAE,8BAA8B;KAC5C;IACD;QACE,QAAQ,EAAE,2CAA2C;QACrD,cAAc,EAAE,yBAAyB;QACzC,cAAc,EAAE,kBAAkB;QAClC,WAAW,EAAE,yBAAyB;KACvC;IACD;QACE,QAAQ,EAAE,6CAA6C;QACvD,cAAc,EAAE,2BAA2B;QAC3C,cAAc,EAAE,sBAAsB;QACtC,WAAW,EAAE,kCAAkC;KAChD;CACF,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Extract TypeScript type definitions and JSDoc from @kubernetes/client-node
3
+ */
4
+ export interface FieldInfo {
5
+ name: string;
6
+ type: string;
7
+ optional: boolean;
8
+ jsDoc?: string;
9
+ }
10
+ export interface InterfaceInfo {
11
+ name: string;
12
+ jsDoc?: string;
13
+ fields: FieldInfo[];
14
+ }
15
+ /**
16
+ * Parse a TypeScript source file and extract interface information
17
+ */
18
+ export declare function extractInterfaceFromFile(filePath: string, interfaceName: string): InterfaceInfo | null;
19
+ /**
20
+ * Find the source file for a Kubernetes type
21
+ */
22
+ export declare function findKubernetesTypeFile(typeName: string): string | null;
23
+ //# sourceMappingURL=typeExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeExtractor.d.ts","sourceRoot":"","sources":["../../src/codegen/typeExtractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAmDtG;AAqED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAStE"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Extract TypeScript type definitions and JSDoc from @kubernetes/client-node
3
+ */
4
+ import * as ts from 'typescript';
5
+ import * as path from 'path';
6
+ import * as fs from 'fs';
7
+ /**
8
+ * Parse a TypeScript source file and extract interface information
9
+ */
10
+ export function extractInterfaceFromFile(filePath, interfaceName) {
11
+ const sourceText = fs.readFileSync(filePath, 'utf-8');
12
+ const sourceFile = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true);
13
+ let result = null;
14
+ function visit(node) {
15
+ if (ts.isClassDeclaration(node) && node.name?.text === interfaceName) {
16
+ const jsDoc = extractJsDocFromSource(sourceText, node);
17
+ const fields = [];
18
+ node.members.forEach(member => {
19
+ if (ts.isPropertyDeclaration(member)) {
20
+ const fieldName = member.name?.getText(sourceFile);
21
+ if (!fieldName)
22
+ return;
23
+ // Skip static/readonly/internal fields
24
+ if (fieldName === 'discriminator' || fieldName === 'mapping' || fieldName === 'attributeTypeMap') {
25
+ return;
26
+ }
27
+ const fieldType = member.type ? getTypeString(member.type, sourceFile) : 'unknown';
28
+ const fieldJsDoc = extractJsDocFromSource(sourceText, member);
29
+ const optional = member.questionToken !== undefined;
30
+ fields.push({
31
+ name: fieldName.replace(/'/g, ''), // Remove quotes if present
32
+ type: fieldType,
33
+ optional,
34
+ jsDoc: fieldJsDoc
35
+ });
36
+ }
37
+ });
38
+ result = {
39
+ name: interfaceName,
40
+ jsDoc,
41
+ fields
42
+ };
43
+ }
44
+ ts.forEachChild(node, visit);
45
+ }
46
+ visit(sourceFile);
47
+ return result;
48
+ }
49
+ /**
50
+ * Extract JSDoc comment from a node using the source text
51
+ */
52
+ function extractJsDocFromSource(sourceText, node) {
53
+ const nodeStart = node.getStart();
54
+ const nodeFullStart = node.getFullStart();
55
+ // Get the text between full start and start (includes comments)
56
+ const leadingText = sourceText.substring(nodeFullStart, nodeStart);
57
+ // Find JSDoc comments (/** ... */)
58
+ const jsDocMatch = leadingText.match(/\/\*\*([\s\S]*?)\*\//);
59
+ if (!jsDocMatch) {
60
+ return undefined;
61
+ }
62
+ // Clean up the comment
63
+ const commentText = jsDocMatch[1];
64
+ if (!commentText) {
65
+ return undefined;
66
+ }
67
+ // Remove leading * from each line and trim
68
+ const lines = commentText.split('\n')
69
+ .map(line => line.replace(/^\s*\*\s?/, '').trim())
70
+ .filter(line => line.length > 0);
71
+ return lines.join(' ');
72
+ }
73
+ /**
74
+ * Convert TypeScript type node to string representation
75
+ */
76
+ function getTypeString(typeNode, sourceFile) {
77
+ if (ts.isTypeReferenceNode(typeNode)) {
78
+ const typeName = sourceFile ? typeNode.typeName.getText(sourceFile) : typeNode.typeName.getText();
79
+ // Handle generic types
80
+ if (typeNode.typeArguments && typeNode.typeArguments.length > 0) {
81
+ const genericArgs = typeNode.typeArguments.map(arg => getTypeString(arg, sourceFile)).join(', ');
82
+ return `${typeName}<${genericArgs}>`;
83
+ }
84
+ return typeName;
85
+ }
86
+ if (ts.isArrayTypeNode(typeNode)) {
87
+ return `Array<${getTypeString(typeNode.elementType, sourceFile)}>`;
88
+ }
89
+ if (ts.isUnionTypeNode(typeNode)) {
90
+ return typeNode.types.map(t => getTypeString(t, sourceFile)).join(' | ');
91
+ }
92
+ if (ts.isTypeLiteralNode(typeNode)) {
93
+ // For type literals, try to extract the structure
94
+ if (typeNode.members.length === 0) {
95
+ return 'object';
96
+ }
97
+ return 'object';
98
+ }
99
+ return sourceFile ? typeNode.getText(sourceFile) : typeNode.getText();
100
+ }
101
+ /**
102
+ * Find the source file for a Kubernetes type
103
+ */
104
+ export function findKubernetesTypeFile(typeName) {
105
+ const nodeModulesPath = path.resolve(process.cwd(), 'node_modules/@kubernetes/client-node/dist/gen/models');
106
+ const expectedFile = path.join(nodeModulesPath, `${typeName}.d.ts`);
107
+ if (fs.existsSync(expectedFile)) {
108
+ return expectedFile;
109
+ }
110
+ return null;
111
+ }
112
+ //# sourceMappingURL=typeExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeExtractor.js","sourceRoot":"","sources":["../../src/codegen/typeExtractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { AppsV1Api, CoreV1Api, CustomObjectsApi, KubeConfig, KubernetesListObject, KubernetesObject, KubernetesObjectApi, V1DeleteOptions } from '@kubernetes/client-node';
2
+ import type { ListOptions, ManifestWithMeta, ResourceIdentifier } from './types.js';
3
+ interface KubernetesClientBundle {
4
+ kubeConfig: KubeConfig;
5
+ core: CoreV1Api;
6
+ apps: AppsV1Api;
7
+ customObjects: CustomObjectsApi;
8
+ objectApi: KubernetesObjectApi;
9
+ }
10
+ export declare function getKubeClients(): KubernetesClientBundle;
11
+ export declare function resetKubeClients(): void;
12
+ export declare function splitApiVersion(apiVersion: string): {
13
+ group?: string;
14
+ version: string;
15
+ };
16
+ export declare function listResources(apiVersion: string, kind: string, options?: ListOptions): Promise<KubernetesListObject<KubernetesObject>>;
17
+ export declare function getResource(manifest: KubernetesObject): Promise<KubernetesObject>;
18
+ export interface DeleteResourceOptions {
19
+ dryRun?: boolean;
20
+ gracePeriodSeconds?: number;
21
+ propagationPolicy?: 'Foreground' | 'Background' | 'Orphan';
22
+ body?: V1DeleteOptions;
23
+ }
24
+ export declare function deleteResource(manifest: KubernetesObject, options?: DeleteResourceOptions): Promise<void>;
25
+ export declare function applyManifest(input: ManifestWithMeta<KubernetesObject>): Promise<KubernetesObject>;
26
+ export declare function getPodLogs(params: {
27
+ namespace: string;
28
+ podName: string;
29
+ container?: string;
30
+ tailLines?: number;
31
+ timestamps?: boolean;
32
+ previous?: boolean;
33
+ }): Promise<string>;
34
+ export declare function listCustomResources(identifier: ResourceIdentifier, options?: ListOptions): Promise<unknown>;
35
+ export declare function getCustomResource(identifier: ResourceIdentifier): Promise<unknown>;
36
+ export {};
37
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/kube/client.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EAChB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKpF,UAAU,sBAAsB;IAC9B,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,aAAa,EAAE,gBAAgB,CAAC;IAChC,SAAS,EAAE,mBAAmB,CAAC;CAChC;AAkCD,wBAAgB,cAAc,IAAI,sBAAsB,CAMvD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAWvF;AAED,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC,CAejD;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAevF;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAC;IAC3D,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,GACxC,OAAO,CAAC,gBAAgB,CAAC,CAgB3B;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC,MAAM,CAAC,CAYlB;AAaD,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,kBAAkB,EAC9B,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,OAAO,CAAC,CAiClB;AAED,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBxF"}
@@ -0,0 +1,161 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { AppsV1Api, CoreV1Api, CustomObjectsApi, KubeConfig, KubernetesObjectApi, } from '@kubernetes/client-node';
5
+ import { PatchStrategy } from '@kubernetes/client-node/dist/patch.js';
6
+ const DEFAULT_FIELD_MANAGER = 'kubernetes-mcp';
7
+ const DEFAULT_FORCE_CONFLICTS = true;
8
+ let cachedClients = null;
9
+ function loadKubeConfig() {
10
+ const kubeConfig = new KubeConfig();
11
+ const kubeconfigEnv = process.env.KUBECONFIG?.split(path.delimiter).filter(Boolean) ?? [];
12
+ const defaultKubeconfigPath = path.join(homedir(), '.kube', 'config');
13
+ try {
14
+ if (kubeconfigEnv.length > 0 || fs.existsSync(defaultKubeconfigPath)) {
15
+ kubeConfig.loadFromDefault();
16
+ }
17
+ else {
18
+ kubeConfig.loadFromCluster();
19
+ }
20
+ }
21
+ catch (error) {
22
+ throw new Error(`Failed to load kubeconfig: ${error.message}`);
23
+ }
24
+ return kubeConfig;
25
+ }
26
+ function createClients() {
27
+ const kubeConfig = loadKubeConfig();
28
+ return {
29
+ kubeConfig,
30
+ core: kubeConfig.makeApiClient(CoreV1Api),
31
+ apps: kubeConfig.makeApiClient(AppsV1Api),
32
+ customObjects: kubeConfig.makeApiClient(CustomObjectsApi),
33
+ objectApi: KubernetesObjectApi.makeApiClient(kubeConfig),
34
+ };
35
+ }
36
+ export function getKubeClients() {
37
+ if (!cachedClients) {
38
+ cachedClients = createClients();
39
+ }
40
+ return cachedClients;
41
+ }
42
+ export function resetKubeClients() {
43
+ cachedClients = null;
44
+ }
45
+ export function splitApiVersion(apiVersion) {
46
+ if (!apiVersion.includes('/')) {
47
+ return { version: apiVersion };
48
+ }
49
+ const [group, version] = apiVersion.split('/');
50
+ if (!version) {
51
+ throw new Error(`Invalid apiVersion: ${apiVersion}`);
52
+ }
53
+ return { group, version };
54
+ }
55
+ export async function listResources(apiVersion, kind, options = {}) {
56
+ const { objectApi } = getKubeClients();
57
+ return objectApi.list(apiVersion, kind, options.namespace, undefined, undefined, undefined, options.fieldSelector, options.labelSelector, options.limit, options.continueToken);
58
+ }
59
+ export async function getResource(manifest) {
60
+ const { objectApi } = getKubeClients();
61
+ if (!manifest.metadata?.name) {
62
+ throw new Error('Manifest metadata.name is required to read a resource');
63
+ }
64
+ return objectApi.read({
65
+ apiVersion: manifest.apiVersion,
66
+ kind: manifest.kind,
67
+ metadata: {
68
+ name: manifest.metadata.name,
69
+ namespace: manifest.metadata.namespace,
70
+ },
71
+ });
72
+ }
73
+ export async function deleteResource(manifest, options = {}) {
74
+ const { objectApi } = getKubeClients();
75
+ await objectApi.delete(manifest, undefined, options.dryRun ? 'All' : undefined, options.gracePeriodSeconds, undefined, options.propagationPolicy, options.body);
76
+ }
77
+ export async function applyManifest(input) {
78
+ const { objectApi } = getKubeClients();
79
+ const { manifest, dryRun, fieldManager, forceConflicts } = input;
80
+ if (!manifest.metadata?.name) {
81
+ throw new Error('Manifest metadata.name is required to apply a resource');
82
+ }
83
+ return objectApi.patch(manifest, dryRun ? 'All' : undefined, undefined, fieldManager ?? DEFAULT_FIELD_MANAGER, forceConflicts ?? DEFAULT_FORCE_CONFLICTS, PatchStrategy.ServerSideApply);
84
+ }
85
+ export async function getPodLogs(params) {
86
+ const { core } = getKubeClients();
87
+ const { namespace, podName, container, tailLines, timestamps, previous } = params;
88
+ return core.readNamespacedPodLog({
89
+ namespace,
90
+ name: podName,
91
+ container,
92
+ tailLines,
93
+ timestamps,
94
+ previous,
95
+ });
96
+ }
97
+ function ensureCustomResourceIdentifier(id) {
98
+ if (!id.group)
99
+ throw new Error('Custom resource group is required');
100
+ if (!id.version)
101
+ throw new Error('Custom resource version is required');
102
+ if (!id.plural)
103
+ throw new Error('Custom resource plural is required');
104
+ }
105
+ function ensureCustomResourceName(id) {
106
+ ensureCustomResourceIdentifier(id);
107
+ if (!id.name)
108
+ throw new Error('Custom resource name is required for get/delete operations');
109
+ }
110
+ export async function listCustomResources(identifier, options = {}) {
111
+ ensureCustomResourceIdentifier(identifier);
112
+ const { customObjects } = getKubeClients();
113
+ const namespace = identifier.namespace ?? options.namespace;
114
+ if (namespace) {
115
+ const result = await customObjects.listNamespacedCustomObject({
116
+ group: identifier.group,
117
+ version: identifier.version,
118
+ namespace,
119
+ plural: identifier.plural,
120
+ allowWatchBookmarks: false,
121
+ _continue: options.continueToken,
122
+ fieldSelector: options.fieldSelector,
123
+ labelSelector: options.labelSelector,
124
+ limit: options.limit,
125
+ });
126
+ return result.body;
127
+ }
128
+ const result = await customObjects.listClusterCustomObject({
129
+ group: identifier.group,
130
+ version: identifier.version,
131
+ plural: identifier.plural,
132
+ allowWatchBookmarks: false,
133
+ _continue: options.continueToken,
134
+ fieldSelector: options.fieldSelector,
135
+ labelSelector: options.labelSelector,
136
+ limit: options.limit,
137
+ });
138
+ return result.body;
139
+ }
140
+ export async function getCustomResource(identifier) {
141
+ ensureCustomResourceName(identifier);
142
+ const { customObjects } = getKubeClients();
143
+ if (identifier.namespace) {
144
+ const result = await customObjects.getNamespacedCustomObject({
145
+ group: identifier.group,
146
+ version: identifier.version,
147
+ namespace: identifier.namespace,
148
+ plural: identifier.plural,
149
+ name: identifier.name,
150
+ });
151
+ return result.body;
152
+ }
153
+ const result = await customObjects.getClusterCustomObject({
154
+ group: identifier.group,
155
+ version: identifier.version,
156
+ plural: identifier.plural,
157
+ name: identifier.name,
158
+ });
159
+ return result.body;
160
+ }
161
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/kube/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EACL,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,UAAU,EAGV,mBAAmB,GAEpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAItE,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAC/C,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAUrC,IAAI,aAAa,GAAkC,IAAI,CAAC;AAExD,SAAS,cAAc;IACrB,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IACpC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC1F,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEtE,IAAI,CAAC;QACH,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACrE,UAAU,CAAC,eAAe,EAAE,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,eAAe,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA+B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IAEpC,OAAO;QACL,UAAU;QACV,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC;QACzC,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC;QACzC,aAAa,EAAE,UAAU,CAAC,aAAa,CAAC,gBAAgB,CAAC;QACzD,SAAS,EAAE,mBAAmB,CAAC,aAAa,CAAC,UAAU,CAAC;KACzD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,aAAa,EAAE,CAAC;IAClC,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB,EAClB,IAAY,EACZ,UAAuB,EAAE;IAEzB,MAAM,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE,CAAC;IAEvC,OAAO,SAAS,CAAC,IAAI,CACnB,UAAU,EACV,IAAI,EACJ,OAAO,CAAC,SAAS,EACjB,SAAS,EACT,SAAS,EACT,SAAS,EACT,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,aAAa,CACtB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAA0B;IAC1D,MAAM,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE,CAAC;IAEvC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,CAAC;QACpB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;YAC5B,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS;SACvC;KACF,CAAC,CAAC;AACL,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAA0B,EAC1B,UAAiC,EAAE;IAEnC,MAAM,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE,CAAC;IACvC,MAAM,SAAS,CAAC,MAAM,CACpB,QAAQ,EACR,SAAS,EACT,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAClC,OAAO,CAAC,kBAAkB,EAC1B,SAAS,EACT,OAAO,CAAC,iBAAiB,EACzB,OAAO,CAAC,IAAI,CACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAyC;IAEzC,MAAM,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE,CAAC;IACvC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAEjE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,SAAS,CAAC,KAAK,CACpB,QAAQ,EACR,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAC1B,SAAS,EACT,YAAY,IAAI,qBAAqB,EACrC,cAAc,IAAI,uBAAuB,EACzC,aAAa,CAAC,eAAe,CAC9B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAOhC;IACC,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAElF,OAAO,IAAI,CAAC,oBAAoB,CAAC;QAC/B,SAAS;QACT,IAAI,EAAE,OAAO;QACb,SAAS;QACT,SAAS;QACT,UAAU;QACV,QAAQ;KACT,CAAC,CAAC;AACL,CAAC;AAED,SAAS,8BAA8B,CAAC,EAAsB;IAC5D,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACpE,IAAI,CAAC,EAAE,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACxE,IAAI,CAAC,EAAE,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,wBAAwB,CAAC,EAAsB;IACtD,8BAA8B,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAA8B,EAC9B,UAAuB,EAAE;IAEzB,8BAA8B,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,EAAE,aAAa,EAAE,GAAG,cAAc,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;IAE5D,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,0BAA0B,CAAC;YAC5D,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,SAAS;YACT,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,mBAAmB,EAAE,KAAK;YAC1B,SAAS,EAAE,OAAO,CAAC,aAAa;YAChC,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,uBAAuB,CAAC;QACzD,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,mBAAmB,EAAE,KAAK;QAC1B,SAAS,EAAE,OAAO,CAAC,aAAa;QAChC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAA8B;IACpE,wBAAwB,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,EAAE,aAAa,EAAE,GAAG,cAAc,EAAE,CAAC;IAE3C,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,yBAAyB,CAAC;YAC3D,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,IAAI,EAAE,UAAU,CAAC,IAAI;SACtB,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,sBAAsB,CAAC;QACxD,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,IAAI,EAAE,UAAU,CAAC,IAAI;KACtB,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { KubernetesListObject, KubernetesObject } from '@kubernetes/client-node';
2
+ export interface ResourceIdentifier {
3
+ group?: string;
4
+ version: string;
5
+ namespace?: string;
6
+ plural: string;
7
+ name?: string;
8
+ }
9
+ export type AnyManifest<T = Record<string, unknown>> = KubernetesObject & T;
10
+ export type AnyManifestList<T extends KubernetesObject = KubernetesObject> = KubernetesListObject<T>;
11
+ export interface ManifestWithMeta<T extends KubernetesObject = KubernetesObject> {
12
+ manifest: T;
13
+ dryRun?: boolean;
14
+ fieldManager?: string;
15
+ forceConflicts?: boolean;
16
+ }
17
+ export interface ListOptions {
18
+ namespace?: string;
19
+ labelSelector?: string;
20
+ fieldSelector?: string;
21
+ limit?: number;
22
+ continueToken?: string;
23
+ }
24
+ export interface GetOptions {
25
+ namespace?: string;
26
+ }
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/kube/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEtF,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,gBAAgB,GAAG,CAAC,CAAC;AAE5E,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC;AAErG,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB;IAC7E,QAAQ,EAAE,CAAC,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/kube/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Expose the generated TypeScript files as MCP resources
3
+ * so Claude can discover and read them
4
+ */
5
+ export interface FileResource {
6
+ uri: string;
7
+ name: string;
8
+ description?: string;
9
+ mimeType?: string;
10
+ }
11
+ export declare const PUBLIC_GENERATED_ROOT_PATH = "/dist/tools/kubernetes";
12
+ export declare const PUBLIC_GENERATED_ROOT_PATH_WITH_SLASH: string;
13
+ export declare function listGeneratedFiles(generatedDir: string): Promise<FileResource[]>;
14
+ export declare function readGeneratedFile(generatedDir: string, relativePath: string): Promise<string>;
15
+ //# sourceMappingURL=filesystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/resources/filesystem.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AACnE,eAAO,MAAM,qCAAqC,QAEd,CAAC;AAErC,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAUtF;AA4BD,wBAAsB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYnG"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Expose the generated TypeScript files as MCP resources
3
+ * so Claude can discover and read them
4
+ */
5
+ import * as fs from 'node:fs/promises';
6
+ import * as path from 'node:path';
7
+ export const PUBLIC_GENERATED_ROOT_PATH = '/dist/tools/kubernetes';
8
+ export const PUBLIC_GENERATED_ROOT_PATH_WITH_SLASH = PUBLIC_GENERATED_ROOT_PATH.endsWith('/')
9
+ ? PUBLIC_GENERATED_ROOT_PATH
10
+ : `${PUBLIC_GENERATED_ROOT_PATH}/`;
11
+ export async function listGeneratedFiles(generatedDir) {
12
+ const resources = [];
13
+ try {
14
+ await walkDirectory(generatedDir, generatedDir, resources);
15
+ }
16
+ catch (error) {
17
+ console.error('Error listing generated files:', error);
18
+ }
19
+ return resources;
20
+ }
21
+ async function walkDirectory(baseDir, currentDir, resources) {
22
+ const entries = await fs.readdir(currentDir, { withFileTypes: true });
23
+ for (const entry of entries) {
24
+ const fullPath = path.join(currentDir, entry.name);
25
+ const relativePath = path.relative(baseDir, fullPath);
26
+ if (entry.isDirectory()) {
27
+ await walkDirectory(baseDir, fullPath, resources);
28
+ }
29
+ else if (entry.isFile() && entry.name.endsWith('.d.ts')) {
30
+ const posixRelativePath = toPosixPath(relativePath);
31
+ const publicPath = path.posix.join(PUBLIC_GENERATED_ROOT_PATH_WITH_SLASH, posixRelativePath);
32
+ resources.push({
33
+ uri: `file://${encodeURI(publicPath)}`,
34
+ name: posixRelativePath,
35
+ description: `TypeScript declaration file: ${posixRelativePath}`,
36
+ mimeType: 'text/typescript',
37
+ });
38
+ }
39
+ }
40
+ }
41
+ export async function readGeneratedFile(generatedDir, relativePath) {
42
+ const fullPath = path.join(generatedDir, relativePath);
43
+ // Security: ensure the path is within generatedDir
44
+ const resolvedPath = path.resolve(fullPath);
45
+ const resolvedBase = path.resolve(generatedDir);
46
+ if (!resolvedPath.startsWith(resolvedBase)) {
47
+ throw new Error('Access denied: path outside generated directory');
48
+ }
49
+ return await fs.readFile(fullPath, 'utf-8');
50
+ }
51
+ function toPosixPath(value) {
52
+ return value.split(path.sep).join('/');
53
+ }
54
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/resources/filesystem.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AASlC,MAAM,CAAC,MAAM,0BAA0B,GAAG,wBAAwB,CAAC;AACnE,MAAM,CAAC,MAAM,qCAAqC,GAAG,0BAA0B,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC3F,CAAC,CAAC,0BAA0B;IAC5B,CAAC,CAAC,GAAG,0BAA0B,GAAG,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,YAAoB;IAC3D,MAAM,SAAS,GAAmB,EAAE,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,YAAY,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,UAAkB,EAAE,SAAyB;IACzF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEtD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,MAAM,iBAAiB,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAChC,qCAAqC,EACrC,iBAAiB,CAClB,CAAC;YAEF,SAAS,CAAC,IAAI,CAAC;gBACb,GAAG,EAAE,UAAU,SAAS,CAAC,UAAU,CAAC,EAAE;gBACtC,IAAI,EAAE,iBAAiB;gBACvB,WAAW,EAAE,gCAAgC,iBAAiB,EAAE;gBAChE,QAAQ,EAAE,iBAAiB;aAC5B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,YAAoB,EAAE,YAAoB;IAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAEvD,mDAAmD;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAEhD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}