kubeview-mcp 1.0.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.
- package/.prettierrc.json +11 -0
- package/CHANGELOG.md +55 -0
- package/LICENSE +21 -0
- package/README.md +251 -0
- package/RELEASE.md +154 -0
- package/TODO.md +0 -0
- package/bin/kubeview-mcp.js +274 -0
- package/bin/setup.js +368 -0
- package/dist/src/cli/cli.d.ts +3 -0
- package/dist/src/cli/cli.d.ts.map +1 -0
- package/dist/src/cli/cli.js +23 -0
- package/dist/src/cli/cli.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +45 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/kubernetes/BaseResourceOperations.d.ts +155 -0
- package/dist/src/kubernetes/BaseResourceOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/BaseResourceOperations.js +136 -0
- package/dist/src/kubernetes/BaseResourceOperations.js.map +1 -0
- package/dist/src/kubernetes/CircuitBreaker.d.ts +182 -0
- package/dist/src/kubernetes/CircuitBreaker.d.ts.map +1 -0
- package/dist/src/kubernetes/CircuitBreaker.js +369 -0
- package/dist/src/kubernetes/CircuitBreaker.js.map +1 -0
- package/dist/src/kubernetes/ConnectionManager.d.ts +60 -0
- package/dist/src/kubernetes/ConnectionManager.d.ts.map +1 -0
- package/dist/src/kubernetes/ConnectionManager.js +77 -0
- package/dist/src/kubernetes/ConnectionManager.js.map +1 -0
- package/dist/src/kubernetes/ConnectionPool.d.ts +183 -0
- package/dist/src/kubernetes/ConnectionPool.d.ts.map +1 -0
- package/dist/src/kubernetes/ConnectionPool.js +437 -0
- package/dist/src/kubernetes/ConnectionPool.js.map +1 -0
- package/dist/src/kubernetes/ErrorHandler.d.ts +172 -0
- package/dist/src/kubernetes/ErrorHandler.d.ts.map +1 -0
- package/dist/src/kubernetes/ErrorHandler.js +328 -0
- package/dist/src/kubernetes/ErrorHandler.js.map +1 -0
- package/dist/src/kubernetes/ErrorHandling.d.ts +148 -0
- package/dist/src/kubernetes/ErrorHandling.d.ts.map +1 -0
- package/dist/src/kubernetes/ErrorHandling.js +304 -0
- package/dist/src/kubernetes/ErrorHandling.js.map +1 -0
- package/dist/src/kubernetes/KubernetesClient.d.ts +162 -0
- package/dist/src/kubernetes/KubernetesClient.d.ts.map +1 -0
- package/dist/src/kubernetes/KubernetesClient.js +382 -0
- package/dist/src/kubernetes/KubernetesClient.js.map +1 -0
- package/dist/src/kubernetes/ResourceOperations.d.ts +69 -0
- package/dist/src/kubernetes/ResourceOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/ResourceOperations.js +99 -0
- package/dist/src/kubernetes/ResourceOperations.js.map +1 -0
- package/dist/src/kubernetes/RetryStrategy.d.ts +137 -0
- package/dist/src/kubernetes/RetryStrategy.d.ts.map +1 -0
- package/dist/src/kubernetes/RetryStrategy.js +277 -0
- package/dist/src/kubernetes/RetryStrategy.js.map +1 -0
- package/dist/src/kubernetes/RetryableOperation.d.ts +118 -0
- package/dist/src/kubernetes/RetryableOperation.d.ts.map +1 -0
- package/dist/src/kubernetes/RetryableOperation.js +233 -0
- package/dist/src/kubernetes/RetryableOperation.js.map +1 -0
- package/dist/src/kubernetes/index.d.ts +18 -0
- package/dist/src/kubernetes/index.d.ts.map +1 -0
- package/dist/src/kubernetes/index.js +28 -0
- package/dist/src/kubernetes/index.js.map +1 -0
- package/dist/src/kubernetes/resources/ConfigMapOperations.d.ts +60 -0
- package/dist/src/kubernetes/resources/ConfigMapOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/ConfigMapOperations.js +306 -0
- package/dist/src/kubernetes/resources/ConfigMapOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/CustomResourceOperations.d.ts +55 -0
- package/dist/src/kubernetes/resources/CustomResourceOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/CustomResourceOperations.js +363 -0
- package/dist/src/kubernetes/resources/CustomResourceOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/DeploymentOperations.d.ts +66 -0
- package/dist/src/kubernetes/resources/DeploymentOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/DeploymentOperations.js +234 -0
- package/dist/src/kubernetes/resources/DeploymentOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/IngressOperations.d.ts +60 -0
- package/dist/src/kubernetes/resources/IngressOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/IngressOperations.js +224 -0
- package/dist/src/kubernetes/resources/IngressOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/MetricOperations.d.ts +218 -0
- package/dist/src/kubernetes/resources/MetricOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/MetricOperations.js +893 -0
- package/dist/src/kubernetes/resources/MetricOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/NamespaceOperations.d.ts +38 -0
- package/dist/src/kubernetes/resources/NamespaceOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/NamespaceOperations.js +101 -0
- package/dist/src/kubernetes/resources/NamespaceOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.d.ts +109 -0
- package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.js +383 -0
- package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/PersistentVolumeOperations.d.ts +97 -0
- package/dist/src/kubernetes/resources/PersistentVolumeOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/PersistentVolumeOperations.js +321 -0
- package/dist/src/kubernetes/resources/PersistentVolumeOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/PodOperations.d.ts +99 -0
- package/dist/src/kubernetes/resources/PodOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/PodOperations.js +333 -0
- package/dist/src/kubernetes/resources/PodOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/SecretOperations.d.ts +71 -0
- package/dist/src/kubernetes/resources/SecretOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/SecretOperations.js +254 -0
- package/dist/src/kubernetes/resources/SecretOperations.js.map +1 -0
- package/dist/src/kubernetes/resources/ServiceOperations.d.ts +64 -0
- package/dist/src/kubernetes/resources/ServiceOperations.d.ts.map +1 -0
- package/dist/src/kubernetes/resources/ServiceOperations.js +232 -0
- package/dist/src/kubernetes/resources/ServiceOperations.js.map +1 -0
- package/dist/src/kubernetes/utils/ResourceUtils.d.ts +238 -0
- package/dist/src/kubernetes/utils/ResourceUtils.d.ts.map +1 -0
- package/dist/src/kubernetes/utils/ResourceUtils.js +439 -0
- package/dist/src/kubernetes/utils/ResourceUtils.js.map +1 -0
- package/dist/src/plugins/ArgoCDToolsPlugin.d.ts +45 -0
- package/dist/src/plugins/ArgoCDToolsPlugin.d.ts.map +1 -0
- package/dist/src/plugins/ArgoCDToolsPlugin.js +155 -0
- package/dist/src/plugins/ArgoCDToolsPlugin.js.map +1 -0
- package/dist/src/plugins/ArgoToolsPlugin.d.ts +45 -0
- package/dist/src/plugins/ArgoToolsPlugin.d.ts.map +1 -0
- package/dist/src/plugins/ArgoToolsPlugin.js +149 -0
- package/dist/src/plugins/ArgoToolsPlugin.js.map +1 -0
- package/dist/src/plugins/HelmToolsPlugin.d.ts +41 -0
- package/dist/src/plugins/HelmToolsPlugin.d.ts.map +1 -0
- package/dist/src/plugins/HelmToolsPlugin.js +146 -0
- package/dist/src/plugins/HelmToolsPlugin.js.map +1 -0
- package/dist/src/plugins/KubernetesToolsPlugin.d.ts +44 -0
- package/dist/src/plugins/KubernetesToolsPlugin.d.ts.map +1 -0
- package/dist/src/plugins/KubernetesToolsPlugin.js +159 -0
- package/dist/src/plugins/KubernetesToolsPlugin.js.map +1 -0
- package/dist/src/plugins/SamplePlugin.d.ts +12 -0
- package/dist/src/plugins/SamplePlugin.d.ts.map +1 -0
- package/dist/src/plugins/SamplePlugin.js +51 -0
- package/dist/src/plugins/SamplePlugin.js.map +1 -0
- package/dist/src/plugins/index.d.ts +5 -0
- package/dist/src/plugins/index.d.ts.map +1 -0
- package/dist/src/plugins/index.js +5 -0
- package/dist/src/plugins/index.js.map +1 -0
- package/dist/src/server/MCPServer.d.ts +93 -0
- package/dist/src/server/MCPServer.d.ts.map +1 -0
- package/dist/src/server/MCPServer.js +398 -0
- package/dist/src/server/MCPServer.js.map +1 -0
- package/dist/src/tools/argo/ArgoCronListTool.d.ts +10 -0
- package/dist/src/tools/argo/ArgoCronListTool.d.ts.map +1 -0
- package/dist/src/tools/argo/ArgoCronListTool.js +70 -0
- package/dist/src/tools/argo/ArgoCronListTool.js.map +1 -0
- package/dist/src/tools/argo/ArgoGetTool.d.ts +10 -0
- package/dist/src/tools/argo/ArgoGetTool.d.ts.map +1 -0
- package/dist/src/tools/argo/ArgoGetTool.js +80 -0
- package/dist/src/tools/argo/ArgoGetTool.js.map +1 -0
- package/dist/src/tools/argo/ArgoListTool.d.ts +10 -0
- package/dist/src/tools/argo/ArgoListTool.d.ts.map +1 -0
- package/dist/src/tools/argo/ArgoListTool.js +133 -0
- package/dist/src/tools/argo/ArgoListTool.js.map +1 -0
- package/dist/src/tools/argo/ArgoLogsTool.d.ts +10 -0
- package/dist/src/tools/argo/ArgoLogsTool.d.ts.map +1 -0
- package/dist/src/tools/argo/ArgoLogsTool.js +117 -0
- package/dist/src/tools/argo/ArgoLogsTool.js.map +1 -0
- package/dist/src/tools/argo/BaseTool.d.ts +60 -0
- package/dist/src/tools/argo/BaseTool.d.ts.map +1 -0
- package/dist/src/tools/argo/BaseTool.js +51 -0
- package/dist/src/tools/argo/BaseTool.js.map +1 -0
- package/dist/src/tools/argo/index.d.ts +7 -0
- package/dist/src/tools/argo/index.d.ts.map +1 -0
- package/dist/src/tools/argo/index.js +6 -0
- package/dist/src/tools/argo/index.js.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppGetTool.d.ts +10 -0
- package/dist/src/tools/argocd/ArgoCDAppGetTool.d.ts.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppGetTool.js +97 -0
- package/dist/src/tools/argocd/ArgoCDAppGetTool.js.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppHistoryTool.d.ts +10 -0
- package/dist/src/tools/argocd/ArgoCDAppHistoryTool.d.ts.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppHistoryTool.js +80 -0
- package/dist/src/tools/argocd/ArgoCDAppHistoryTool.js.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppListTool.d.ts +10 -0
- package/dist/src/tools/argocd/ArgoCDAppListTool.d.ts.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppListTool.js +128 -0
- package/dist/src/tools/argocd/ArgoCDAppListTool.js.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppLogsTool.d.ts +10 -0
- package/dist/src/tools/argocd/ArgoCDAppLogsTool.d.ts.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppLogsTool.js +143 -0
- package/dist/src/tools/argocd/ArgoCDAppLogsTool.js.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppResourcesTool.d.ts +10 -0
- package/dist/src/tools/argocd/ArgoCDAppResourcesTool.d.ts.map +1 -0
- package/dist/src/tools/argocd/ArgoCDAppResourcesTool.js +123 -0
- package/dist/src/tools/argocd/ArgoCDAppResourcesTool.js.map +1 -0
- package/dist/src/tools/argocd/BaseTool.d.ts +71 -0
- package/dist/src/tools/argocd/BaseTool.d.ts.map +1 -0
- package/dist/src/tools/argocd/BaseTool.js +62 -0
- package/dist/src/tools/argocd/BaseTool.js.map +1 -0
- package/dist/src/tools/argocd/index.d.ts +8 -0
- package/dist/src/tools/argocd/index.d.ts.map +1 -0
- package/dist/src/tools/argocd/index.js +7 -0
- package/dist/src/tools/argocd/index.js.map +1 -0
- package/dist/src/tools/helm/BaseTool.d.ts +51 -0
- package/dist/src/tools/helm/BaseTool.d.ts.map +1 -0
- package/dist/src/tools/helm/BaseTool.js +42 -0
- package/dist/src/tools/helm/BaseTool.js.map +1 -0
- package/dist/src/tools/helm/HelmGetHooksTool.d.ts +10 -0
- package/dist/src/tools/helm/HelmGetHooksTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmGetHooksTool.js +38 -0
- package/dist/src/tools/helm/HelmGetHooksTool.js.map +1 -0
- package/dist/src/tools/helm/HelmGetManifestTool.d.ts +10 -0
- package/dist/src/tools/helm/HelmGetManifestTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmGetManifestTool.js +38 -0
- package/dist/src/tools/helm/HelmGetManifestTool.js.map +1 -0
- package/dist/src/tools/helm/HelmGetNotesTool.d.ts +10 -0
- package/dist/src/tools/helm/HelmGetNotesTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmGetNotesTool.js +38 -0
- package/dist/src/tools/helm/HelmGetNotesTool.js.map +1 -0
- package/dist/src/tools/helm/HelmGetResourcesTool.d.ts +13 -0
- package/dist/src/tools/helm/HelmGetResourcesTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmGetResourcesTool.js +124 -0
- package/dist/src/tools/helm/HelmGetResourcesTool.js.map +1 -0
- package/dist/src/tools/helm/HelmGetValuesTool.d.ts +10 -0
- package/dist/src/tools/helm/HelmGetValuesTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmGetValuesTool.js +54 -0
- package/dist/src/tools/helm/HelmGetValuesTool.js.map +1 -0
- package/dist/src/tools/helm/HelmHistoryTool.d.ts +10 -0
- package/dist/src/tools/helm/HelmHistoryTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmHistoryTool.js +49 -0
- package/dist/src/tools/helm/HelmHistoryTool.js.map +1 -0
- package/dist/src/tools/helm/HelmListTool.d.ts +10 -0
- package/dist/src/tools/helm/HelmListTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmListTool.js +107 -0
- package/dist/src/tools/helm/HelmListTool.js.map +1 -0
- package/dist/src/tools/helm/HelmListWithResourcesTool.d.ts +14 -0
- package/dist/src/tools/helm/HelmListWithResourcesTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmListWithResourcesTool.js +175 -0
- package/dist/src/tools/helm/HelmListWithResourcesTool.js.map +1 -0
- package/dist/src/tools/helm/HelmStatusTool.d.ts +10 -0
- package/dist/src/tools/helm/HelmStatusTool.d.ts.map +1 -0
- package/dist/src/tools/helm/HelmStatusTool.js +54 -0
- package/dist/src/tools/helm/HelmStatusTool.js.map +1 -0
- package/dist/src/tools/helm/index.d.ts +12 -0
- package/dist/src/tools/helm/index.d.ts.map +1 -0
- package/dist/src/tools/helm/index.js +11 -0
- package/dist/src/tools/helm/index.js.map +1 -0
- package/dist/src/tools/kubernetes/BaseTool.d.ts +48 -0
- package/dist/src/tools/kubernetes/BaseTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/BaseTool.js +55 -0
- package/dist/src/tools/kubernetes/BaseTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetConfigMapTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetConfigMapTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetConfigMapTool.js +28 -0
- package/dist/src/tools/kubernetes/GetConfigMapTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetContainerLogsTool.d.ts +15 -0
- package/dist/src/tools/kubernetes/GetContainerLogsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetContainerLogsTool.js +119 -0
- package/dist/src/tools/kubernetes/GetContainerLogsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetDeploymentsTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetDeploymentsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetDeploymentsTool.js +30 -0
- package/dist/src/tools/kubernetes/GetDeploymentsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetEventsTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetEventsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetEventsTool.js +123 -0
- package/dist/src/tools/kubernetes/GetEventsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetIngressTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetIngressTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetIngressTool.js +35 -0
- package/dist/src/tools/kubernetes/GetIngressTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetMetricsTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetMetricsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetMetricsTool.js +40 -0
- package/dist/src/tools/kubernetes/GetMetricsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetNamespacesTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetNamespacesTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetNamespacesTool.js +33 -0
- package/dist/src/tools/kubernetes/GetNamespacesTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.js +92 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumesTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumesTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumesTool.js +88 -0
- package/dist/src/tools/kubernetes/GetPersistentVolumesTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetPodMetricsTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetPodMetricsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetPodMetricsTool.js +100 -0
- package/dist/src/tools/kubernetes/GetPodMetricsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetPodsTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetPodsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetPodsTool.js +35 -0
- package/dist/src/tools/kubernetes/GetPodsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetResourceTool.d.ts +12 -0
- package/dist/src/tools/kubernetes/GetResourceTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetResourceTool.js +79 -0
- package/dist/src/tools/kubernetes/GetResourceTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetSecretsTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetSecretsTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetSecretsTool.js +49 -0
- package/dist/src/tools/kubernetes/GetSecretsTool.js.map +1 -0
- package/dist/src/tools/kubernetes/GetServicesTool.d.ts +11 -0
- package/dist/src/tools/kubernetes/GetServicesTool.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/GetServicesTool.js +35 -0
- package/dist/src/tools/kubernetes/GetServicesTool.js.map +1 -0
- package/dist/src/tools/kubernetes/index.d.ts +17 -0
- package/dist/src/tools/kubernetes/index.d.ts.map +1 -0
- package/dist/src/tools/kubernetes/index.js +16 -0
- package/dist/src/tools/kubernetes/index.js.map +1 -0
- package/dist/src/utils/CliUtils.d.ts +24 -0
- package/dist/src/utils/CliUtils.d.ts.map +1 -0
- package/dist/src/utils/CliUtils.js +159 -0
- package/dist/src/utils/CliUtils.js.map +1 -0
- package/dist/tests/__mocks__/@kubernetes/client-node.d.ts +34 -0
- package/dist/tests/__mocks__/@kubernetes/client-node.d.ts.map +1 -0
- package/dist/tests/__mocks__/@kubernetes/client-node.js +20 -0
- package/dist/tests/__mocks__/@kubernetes/client-node.js.map +1 -0
- package/dist/tests/argo/ArgoGetTool.test.d.ts +2 -0
- package/dist/tests/argo/ArgoGetTool.test.d.ts.map +1 -0
- package/dist/tests/argo/ArgoGetTool.test.js +141 -0
- package/dist/tests/argo/ArgoGetTool.test.js.map +1 -0
- package/dist/tests/helm/BaseTool.test.d.ts +2 -0
- package/dist/tests/helm/BaseTool.test.d.ts.map +1 -0
- package/dist/tests/helm/BaseTool.test.js +241 -0
- package/dist/tests/helm/BaseTool.test.js.map +1 -0
- package/dist/tests/index.test.d.ts +2 -0
- package/dist/tests/index.test.d.ts.map +1 -0
- package/dist/tests/index.test.js +7 -0
- package/dist/tests/index.test.js.map +1 -0
- package/dist/tests/kubernetes/ConfigMapOperations.test.d.ts +2 -0
- package/dist/tests/kubernetes/ConfigMapOperations.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/ConfigMapOperations.test.js +460 -0
- package/dist/tests/kubernetes/ConfigMapOperations.test.js.map +1 -0
- package/dist/tests/kubernetes/ConnectionManager.test.d.ts +2 -0
- package/dist/tests/kubernetes/ConnectionManager.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/ConnectionManager.test.js +97 -0
- package/dist/tests/kubernetes/ConnectionManager.test.js.map +1 -0
- package/dist/tests/kubernetes/ConnectionPool.test.d.ts +2 -0
- package/dist/tests/kubernetes/ConnectionPool.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/ConnectionPool.test.js +328 -0
- package/dist/tests/kubernetes/ConnectionPool.test.js.map +1 -0
- package/dist/tests/kubernetes/DeploymentOperations.test.d.ts +2 -0
- package/dist/tests/kubernetes/DeploymentOperations.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/DeploymentOperations.test.js +196 -0
- package/dist/tests/kubernetes/DeploymentOperations.test.js.map +1 -0
- package/dist/tests/kubernetes/ErrorHandling.test.d.ts +2 -0
- package/dist/tests/kubernetes/ErrorHandling.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/ErrorHandling.test.js +329 -0
- package/dist/tests/kubernetes/ErrorHandling.test.js.map +1 -0
- package/dist/tests/kubernetes/GetPodMetricsTool.test.d.ts +2 -0
- package/dist/tests/kubernetes/GetPodMetricsTool.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/GetPodMetricsTool.test.js +150 -0
- package/dist/tests/kubernetes/GetPodMetricsTool.test.js.map +1 -0
- package/dist/tests/kubernetes/KubernetesClient.test.d.ts +2 -0
- package/dist/tests/kubernetes/KubernetesClient.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/KubernetesClient.test.js +371 -0
- package/dist/tests/kubernetes/KubernetesClient.test.js.map +1 -0
- package/dist/tests/kubernetes/MetricOperations.parsing.test.d.ts +2 -0
- package/dist/tests/kubernetes/MetricOperations.parsing.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/MetricOperations.parsing.test.js +49 -0
- package/dist/tests/kubernetes/MetricOperations.parsing.test.js.map +1 -0
- package/dist/tests/kubernetes/NamespaceOperations.test.d.ts +2 -0
- package/dist/tests/kubernetes/NamespaceOperations.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/NamespaceOperations.test.js +115 -0
- package/dist/tests/kubernetes/NamespaceOperations.test.js.map +1 -0
- package/dist/tests/kubernetes/PodOperations.test.d.ts +2 -0
- package/dist/tests/kubernetes/PodOperations.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/PodOperations.test.js +209 -0
- package/dist/tests/kubernetes/PodOperations.test.js.map +1 -0
- package/dist/tests/kubernetes/RetryStrategy.test.d.ts +2 -0
- package/dist/tests/kubernetes/RetryStrategy.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/RetryStrategy.test.js +419 -0
- package/dist/tests/kubernetes/RetryStrategy.test.js.map +1 -0
- package/dist/tests/kubernetes/ServiceOperations.test.d.ts +2 -0
- package/dist/tests/kubernetes/ServiceOperations.test.d.ts.map +1 -0
- package/dist/tests/kubernetes/ServiceOperations.test.js +159 -0
- package/dist/tests/kubernetes/ServiceOperations.test.js.map +1 -0
- package/dist/tests/plugins/KubernetesToolsPlugin.test.d.ts +2 -0
- package/dist/tests/plugins/KubernetesToolsPlugin.test.d.ts.map +1 -0
- package/dist/tests/plugins/KubernetesToolsPlugin.test.js +153 -0
- package/dist/tests/plugins/KubernetesToolsPlugin.test.js.map +1 -0
- package/dist/tests/server/MCPServer.integration.test.d.ts +2 -0
- package/dist/tests/server/MCPServer.integration.test.d.ts.map +1 -0
- package/dist/tests/server/MCPServer.integration.test.js +244 -0
- package/dist/tests/server/MCPServer.integration.test.js.map +1 -0
- package/dist/tests/server/MCPServer.test.d.ts +2 -0
- package/dist/tests/server/MCPServer.test.d.ts.map +1 -0
- package/dist/tests/server/MCPServer.test.js +257 -0
- package/dist/tests/server/MCPServer.test.js.map +1 -0
- package/package.json +85 -0
- package/src/cli/cli.ts +25 -0
- package/src/cli/run-command.js +391 -0
- package/src/index.ts +46 -0
- package/src/kubernetes/BaseResourceOperations.ts +286 -0
- package/src/kubernetes/CircuitBreaker.ts +485 -0
- package/src/kubernetes/ConnectionManager.ts +114 -0
- package/src/kubernetes/ConnectionPool.ts +551 -0
- package/src/kubernetes/ErrorHandler.ts +436 -0
- package/src/kubernetes/ErrorHandling.ts +401 -0
- package/src/kubernetes/KubernetesClient.ts +500 -0
- package/src/kubernetes/README.md +349 -0
- package/src/kubernetes/ResourceOperations.ts +116 -0
- package/src/kubernetes/RetryStrategy.ts +365 -0
- package/src/kubernetes/RetryableOperation.ts +313 -0
- package/src/kubernetes/docs/ResourceOperations.md +606 -0
- package/src/kubernetes/index.ts +116 -0
- package/src/kubernetes/resources/ConfigMapOperations.ts +367 -0
- package/src/kubernetes/resources/CustomResourceOperations.ts +392 -0
- package/src/kubernetes/resources/DeploymentOperations.ts +294 -0
- package/src/kubernetes/resources/IngressOperations.ts +277 -0
- package/src/kubernetes/resources/MetricOperations.ts +1159 -0
- package/src/kubernetes/resources/NamespaceOperations.ts +129 -0
- package/src/kubernetes/resources/PersistentVolumeClaimOperations.ts +516 -0
- package/src/kubernetes/resources/PersistentVolumeOperations.ts +438 -0
- package/src/kubernetes/resources/PodOperations.ts +417 -0
- package/src/kubernetes/resources/SecretOperations.ts +304 -0
- package/src/kubernetes/resources/ServiceOperations.ts +283 -0
- package/src/kubernetes/utils/ResourceUtils.ts +553 -0
- package/src/plugins/ArgoCDToolsPlugin.ts +189 -0
- package/src/plugins/ArgoToolsPlugin.ts +180 -0
- package/src/plugins/HelmToolsPlugin.ts +180 -0
- package/src/plugins/KubernetesToolsPlugin.ts +198 -0
- package/src/plugins/SamplePlugin.ts +60 -0
- package/src/plugins/index.ts +4 -0
- package/src/server/MCPServer.ts +500 -0
- package/src/tools/argo/ArgoCronListTool.ts +78 -0
- package/src/tools/argo/ArgoGetTool.ts +91 -0
- package/src/tools/argo/ArgoListTool.ts +143 -0
- package/src/tools/argo/ArgoLogsTool.ts +131 -0
- package/src/tools/argo/BaseTool.ts +69 -0
- package/src/tools/argo/index.ts +6 -0
- package/src/tools/argocd/ArgoCDAppGetTool.ts +109 -0
- package/src/tools/argocd/ArgoCDAppHistoryTool.ts +91 -0
- package/src/tools/argocd/ArgoCDAppListTool.ts +144 -0
- package/src/tools/argocd/ArgoCDAppLogsTool.ts +162 -0
- package/src/tools/argocd/ArgoCDAppResourcesTool.ts +139 -0
- package/src/tools/argocd/BaseTool.ts +83 -0
- package/src/tools/argocd/index.ts +7 -0
- package/src/tools/helm/BaseTool.ts +60 -0
- package/src/tools/helm/HelmGetHooksTool.ts +44 -0
- package/src/tools/helm/HelmGetManifestTool.ts +44 -0
- package/src/tools/helm/HelmGetNotesTool.ts +44 -0
- package/src/tools/helm/HelmGetResourcesTool.ts +140 -0
- package/src/tools/helm/HelmGetValuesTool.ts +62 -0
- package/src/tools/helm/HelmHistoryTool.ts +56 -0
- package/src/tools/helm/HelmListTool.ts +107 -0
- package/src/tools/helm/HelmListWithResourcesTool.ts +194 -0
- package/src/tools/helm/HelmStatusTool.ts +62 -0
- package/src/tools/helm/index.ts +11 -0
- package/src/tools/kubernetes/BaseTool.ts +76 -0
- package/src/tools/kubernetes/GetConfigMapTool.ts +33 -0
- package/src/tools/kubernetes/GetContainerLogsTool.ts +140 -0
- package/src/tools/kubernetes/GetDeploymentsTool.ts +33 -0
- package/src/tools/kubernetes/GetEventsTool.ts +133 -0
- package/src/tools/kubernetes/GetIngressTool.ts +39 -0
- package/src/tools/kubernetes/GetMetricsTool.ts +53 -0
- package/src/tools/kubernetes/GetNamespacesTool.ts +36 -0
- package/src/tools/kubernetes/GetPersistentVolumeClaimsTool.ts +113 -0
- package/src/tools/kubernetes/GetPersistentVolumesTool.ts +107 -0
- package/src/tools/kubernetes/GetPodMetricsTool.ts +113 -0
- package/src/tools/kubernetes/GetPodsTool.ts +39 -0
- package/src/tools/kubernetes/GetResourceTool.ts +90 -0
- package/src/tools/kubernetes/GetSecretsTool.ts +55 -0
- package/src/tools/kubernetes/GetServicesTool.ts +39 -0
- package/src/tools/kubernetes/index.ts +16 -0
- package/src/utils/CliUtils.ts +207 -0
- package/tsconfig.json +36 -0
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import {
|
|
4
|
+
CallToolRequestSchema,
|
|
5
|
+
ListResourcesRequestSchema,
|
|
6
|
+
ListResourceTemplatesRequestSchema,
|
|
7
|
+
ListToolsRequestSchema,
|
|
8
|
+
ReadResourceRequestSchema,
|
|
9
|
+
ListPromptsRequestSchema,
|
|
10
|
+
GetPromptRequestSchema,
|
|
11
|
+
Tool,
|
|
12
|
+
Resource,
|
|
13
|
+
ResourceTemplate,
|
|
14
|
+
} from '@modelcontextprotocol/sdk/types.js';
|
|
15
|
+
import winston from 'winston';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Plugin interface for extending MCP server functionality
|
|
19
|
+
*/
|
|
20
|
+
export interface MCPPlugin {
|
|
21
|
+
name: string;
|
|
22
|
+
version: string;
|
|
23
|
+
initialize(server: MCPServer): Promise<void>;
|
|
24
|
+
shutdown?(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Tool registry entry
|
|
29
|
+
*/
|
|
30
|
+
interface ToolEntry {
|
|
31
|
+
tool: Tool;
|
|
32
|
+
handler: (params: any) => Promise<any>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Core MCP Server implementation for Kubernetes operations
|
|
37
|
+
*/
|
|
38
|
+
export interface MCPServerOptions {
|
|
39
|
+
skipTransportErrorHandling?: boolean;
|
|
40
|
+
skipGracefulShutdown?: boolean;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export class MCPServer {
|
|
44
|
+
private server: Server;
|
|
45
|
+
private transport: StdioServerTransport;
|
|
46
|
+
private logger: winston.Logger;
|
|
47
|
+
private tools: Map<string, ToolEntry> = new Map();
|
|
48
|
+
private resources: Map<string, Resource> = new Map();
|
|
49
|
+
private resourceTemplates: Map<string, ResourceTemplate> = new Map();
|
|
50
|
+
private plugins: Map<string, MCPPlugin> = new Map();
|
|
51
|
+
private isShuttingDown = false;
|
|
52
|
+
private options: MCPServerOptions;
|
|
53
|
+
private eventListeners: Array<{
|
|
54
|
+
target: any;
|
|
55
|
+
event: string;
|
|
56
|
+
handler: (...args: any[]) => void;
|
|
57
|
+
}> = [];
|
|
58
|
+
|
|
59
|
+
constructor(options: MCPServerOptions = {}) {
|
|
60
|
+
this.options = options;
|
|
61
|
+
// Initialize Winston logger
|
|
62
|
+
this.logger = winston.createLogger({
|
|
63
|
+
level: process.env.LOG_LEVEL || 'info',
|
|
64
|
+
format: winston.format.combine(winston.format.timestamp(), winston.format.json()),
|
|
65
|
+
transports: [
|
|
66
|
+
new winston.transports.Console({
|
|
67
|
+
stderrLevels: ['error', 'warn', 'info', 'verbose', 'debug', 'silly'],
|
|
68
|
+
format: winston.format.combine(winston.format.colorize(), winston.format.simple()),
|
|
69
|
+
}),
|
|
70
|
+
new winston.transports.File({
|
|
71
|
+
filename: 'kubeview-mcp.log',
|
|
72
|
+
format: winston.format.json(),
|
|
73
|
+
}),
|
|
74
|
+
],
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// Initialize MCP server
|
|
78
|
+
this.server = new Server(
|
|
79
|
+
{
|
|
80
|
+
name: 'kubeview-mcp',
|
|
81
|
+
version: '0.1.0',
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
capabilities: {
|
|
85
|
+
tools: {},
|
|
86
|
+
resources: {},
|
|
87
|
+
prompts: {},
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
// Initialize stdio transport
|
|
93
|
+
this.transport = new StdioServerTransport();
|
|
94
|
+
|
|
95
|
+
// Add custom error handler to the transport (skip in tests)
|
|
96
|
+
if (!options.skipTransportErrorHandling) {
|
|
97
|
+
this.setupTransportErrorHandling();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Set up handlers
|
|
101
|
+
this.setupHandlers();
|
|
102
|
+
|
|
103
|
+
// Set up graceful shutdown (skip in tests to avoid process listeners)
|
|
104
|
+
if (!this.options.skipGracefulShutdown) {
|
|
105
|
+
this.setupGracefulShutdown();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
this.logger.info('MCPServer initialized');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Add an event listener and track it for cleanup
|
|
113
|
+
*/
|
|
114
|
+
private addTrackedListener(target: any, event: string, handler: (...args: any[]) => void): void {
|
|
115
|
+
target.on(event, handler);
|
|
116
|
+
this.eventListeners.push({ target, event, handler });
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Remove all tracked event listeners
|
|
121
|
+
*/
|
|
122
|
+
private removeAllListeners(): void {
|
|
123
|
+
for (const { target, event, handler } of this.eventListeners) {
|
|
124
|
+
try {
|
|
125
|
+
target.removeListener(event, handler);
|
|
126
|
+
} catch {
|
|
127
|
+
// Ignore errors during cleanup
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
this.eventListeners = [];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Set up custom error handling for the transport
|
|
135
|
+
*/
|
|
136
|
+
private setupTransportErrorHandling(): void {
|
|
137
|
+
// Handle connection errors in the transport
|
|
138
|
+
// StdioServerTransport uses the process stdin/stdout directly
|
|
139
|
+
this.addTrackedListener(process.stdin, 'error', (error) => {
|
|
140
|
+
this.logger.error('Transport stdin error:', error);
|
|
141
|
+
// Don't throw - log and continue
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
this.addTrackedListener(process.stdout, 'error', (error) => {
|
|
145
|
+
this.logger.error('Transport stdout error:', error);
|
|
146
|
+
// Don't throw - log and continue
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// Add additional error event listeners to catch more issues
|
|
150
|
+
if (process.stdin.on && typeof process.stdin.on === 'function') {
|
|
151
|
+
this.addTrackedListener(process.stdin, 'close', () => {
|
|
152
|
+
this.logger.warn('Transport stdin closed unexpectedly');
|
|
153
|
+
this.gracefulRestart();
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (process.stdout.on && typeof process.stdout.on === 'function') {
|
|
158
|
+
this.addTrackedListener(process.stdout, 'close', () => {
|
|
159
|
+
this.logger.warn('Transport stdout closed unexpectedly');
|
|
160
|
+
this.gracefulRestart();
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Attempt to gracefully restart the server connection
|
|
167
|
+
*/
|
|
168
|
+
private async gracefulRestart(): Promise<void> {
|
|
169
|
+
if (this.isShuttingDown) return;
|
|
170
|
+
|
|
171
|
+
this.logger.info('Attempting to gracefully restart server connection...');
|
|
172
|
+
|
|
173
|
+
try {
|
|
174
|
+
// Close existing connection
|
|
175
|
+
await this.server.close();
|
|
176
|
+
|
|
177
|
+
// Small delay to allow resources to be released
|
|
178
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
179
|
+
|
|
180
|
+
// Create a new transport instance since the old one might be in an invalid state
|
|
181
|
+
this.transport = new StdioServerTransport();
|
|
182
|
+
|
|
183
|
+
// Reconnect
|
|
184
|
+
await this.server.connect(this.transport);
|
|
185
|
+
this.logger.info('Server connection restarted successfully');
|
|
186
|
+
} catch (error) {
|
|
187
|
+
this.logger.error('Failed to restart server connection', error);
|
|
188
|
+
|
|
189
|
+
// If we get an error about the transport already being started,
|
|
190
|
+
// try to create a completely new server instance
|
|
191
|
+
if (
|
|
192
|
+
error instanceof Error &&
|
|
193
|
+
error.message.includes('StdioServerTransport already started')
|
|
194
|
+
) {
|
|
195
|
+
this.logger.info('Attempting to create new server instance...');
|
|
196
|
+
try {
|
|
197
|
+
// Re-initialize the server
|
|
198
|
+
this.server = new Server(
|
|
199
|
+
{
|
|
200
|
+
name: 'kubeview-mcp',
|
|
201
|
+
version: '0.1.0',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
capabilities: {
|
|
205
|
+
tools: {},
|
|
206
|
+
resources: {},
|
|
207
|
+
prompts: {},
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
// Recreate the transport
|
|
213
|
+
this.transport = new StdioServerTransport();
|
|
214
|
+
|
|
215
|
+
// Re-register all handlers
|
|
216
|
+
this.setupHandlers();
|
|
217
|
+
|
|
218
|
+
// Reconnect
|
|
219
|
+
await this.server.connect(this.transport);
|
|
220
|
+
this.logger.info('Server reconnected with new instance successfully');
|
|
221
|
+
} catch (nestedError) {
|
|
222
|
+
this.logger.error('Failed to create new server instance', nestedError);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Set up request handlers for MCP protocol
|
|
230
|
+
*/
|
|
231
|
+
private setupHandlers(): void {
|
|
232
|
+
// Handle tool listing
|
|
233
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
234
|
+
const tools = Array.from(this.tools.values()).map((entry) => entry.tool);
|
|
235
|
+
this.logger.debug(`Listing ${tools.length} tools`);
|
|
236
|
+
return { tools };
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
// Handle tool execution
|
|
240
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
241
|
+
const toolEntry = this.tools.get(request.params.name);
|
|
242
|
+
|
|
243
|
+
if (!toolEntry) {
|
|
244
|
+
const error = `Tool not found: ${request.params.name}`;
|
|
245
|
+
this.logger.error(error);
|
|
246
|
+
throw new Error(error);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
this.logger.info(`Executing tool: ${request.params.name}`, {
|
|
250
|
+
arguments: request.params.arguments,
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
try {
|
|
254
|
+
const result = await toolEntry.handler(request.params.arguments);
|
|
255
|
+
return {
|
|
256
|
+
content: [
|
|
257
|
+
{
|
|
258
|
+
type: 'text',
|
|
259
|
+
text: JSON.stringify(result, null, 2),
|
|
260
|
+
},
|
|
261
|
+
],
|
|
262
|
+
};
|
|
263
|
+
} catch (error) {
|
|
264
|
+
this.logger.error(`Tool execution failed: ${request.params.name}`, error);
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
// Handle resource listing
|
|
270
|
+
this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
271
|
+
const resources = Array.from(this.resources.values());
|
|
272
|
+
this.logger.debug(`Listing ${resources.length} resources`);
|
|
273
|
+
return { resources };
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
// Handle resource reading
|
|
277
|
+
this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
278
|
+
const resource = this.resources.get(request.params.uri);
|
|
279
|
+
|
|
280
|
+
if (!resource) {
|
|
281
|
+
const error = `Resource not found: ${request.params.uri}`;
|
|
282
|
+
this.logger.error(error);
|
|
283
|
+
throw new Error(error);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
this.logger.info(`Reading resource: ${request.params.uri}`);
|
|
287
|
+
|
|
288
|
+
// This is a placeholder - actual resource reading logic would go here
|
|
289
|
+
return {
|
|
290
|
+
contents: [
|
|
291
|
+
{
|
|
292
|
+
type: 'text',
|
|
293
|
+
text: `Resource content for ${request.params.uri}`,
|
|
294
|
+
uri: request.params.uri,
|
|
295
|
+
},
|
|
296
|
+
],
|
|
297
|
+
};
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
// Handle resource template listing
|
|
301
|
+
this.server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => {
|
|
302
|
+
const templates = Array.from(this.resourceTemplates.values());
|
|
303
|
+
this.logger.debug(`Listing ${templates.length} resource templates`);
|
|
304
|
+
return { resourceTemplates: templates };
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// Handle prompt listing
|
|
308
|
+
this.server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
309
|
+
this.logger.debug('Listing prompts (none available)');
|
|
310
|
+
return { prompts: [] };
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// Handle prompt getting
|
|
314
|
+
this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
315
|
+
const error = `Prompt not found: ${request.params.name}`;
|
|
316
|
+
this.logger.error(error);
|
|
317
|
+
throw new Error(error);
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Register a tool with the MCP server
|
|
323
|
+
*/
|
|
324
|
+
public registerTool(tool: Tool, handler: (params: any) => Promise<any>): void {
|
|
325
|
+
if (this.tools.has(tool.name)) {
|
|
326
|
+
this.logger.warn(`Tool already registered: ${tool.name}, overwriting`);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
this.tools.set(tool.name, { tool, handler });
|
|
330
|
+
this.logger.info(`Registered tool: ${tool.name}`);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Register a resource with the MCP server
|
|
335
|
+
*/
|
|
336
|
+
public registerResource(resource: Resource): void {
|
|
337
|
+
if (this.resources.has(resource.uri)) {
|
|
338
|
+
this.logger.warn(`Resource already registered: ${resource.uri}, overwriting`);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
this.resources.set(resource.uri, resource);
|
|
342
|
+
this.logger.info(`Registered resource: ${resource.uri}`);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Load and initialize a plugin
|
|
347
|
+
*/
|
|
348
|
+
public async loadPlugin(plugin: MCPPlugin): Promise<void> {
|
|
349
|
+
if (this.plugins.has(plugin.name)) {
|
|
350
|
+
throw new Error(`Plugin already loaded: ${plugin.name}`);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
this.logger.info(`Loading plugin: ${plugin.name} v${plugin.version}`);
|
|
354
|
+
|
|
355
|
+
try {
|
|
356
|
+
await plugin.initialize(this);
|
|
357
|
+
this.plugins.set(plugin.name, plugin);
|
|
358
|
+
this.logger.info(`Plugin loaded successfully: ${plugin.name}`);
|
|
359
|
+
} catch (error) {
|
|
360
|
+
this.logger.error(`Failed to load plugin: ${plugin.name}`, error);
|
|
361
|
+
throw error;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Start the MCP server
|
|
367
|
+
*/
|
|
368
|
+
public async start(): Promise<void> {
|
|
369
|
+
this.logger.info('Starting MCP server...');
|
|
370
|
+
|
|
371
|
+
try {
|
|
372
|
+
if (this.options.skipTransportErrorHandling) {
|
|
373
|
+
// Simple connection for tests
|
|
374
|
+
await this.server.connect(this.transport);
|
|
375
|
+
} else {
|
|
376
|
+
// Wrap the connection with our custom error handling for production
|
|
377
|
+
await this.connectWithErrorHandling();
|
|
378
|
+
}
|
|
379
|
+
this.logger.info('MCP server started successfully');
|
|
380
|
+
} catch (error) {
|
|
381
|
+
this.logger.error('Failed to start MCP server', error);
|
|
382
|
+
throw error;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Connect to the transport with improved error handling
|
|
388
|
+
*/
|
|
389
|
+
private async connectWithErrorHandling(): Promise<void> {
|
|
390
|
+
// Add global handler for parse errors that might not be caught by the SDK
|
|
391
|
+
const originalStdinData = process.stdin.listeners('data') as Array<(chunk: Buffer) => void>;
|
|
392
|
+
|
|
393
|
+
// Add our handler before the SDK's handlers
|
|
394
|
+
process.stdin.removeAllListeners('data');
|
|
395
|
+
|
|
396
|
+
process.stdin.on('data', (chunk: Buffer) => {
|
|
397
|
+
try {
|
|
398
|
+
// Try to parse as JSON to catch syntax errors early
|
|
399
|
+
const str = chunk.toString().trim();
|
|
400
|
+
if (str.length > 0) {
|
|
401
|
+
try {
|
|
402
|
+
JSON.parse(str);
|
|
403
|
+
} catch (err) {
|
|
404
|
+
this.logger.warn(
|
|
405
|
+
`Received invalid JSON: ${str.substring(0, 100)}${str.length > 100 ? '...' : ''}`,
|
|
406
|
+
);
|
|
407
|
+
this.logger.error('JSON parse error:', err);
|
|
408
|
+
// Continue processing - the SDK will handle the error
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
} catch (err) {
|
|
412
|
+
this.logger.error('Error in pre-processing stdin data:', err);
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
// Re-add original listeners
|
|
417
|
+
for (const listener of originalStdinData) {
|
|
418
|
+
process.stdin.on('data', listener);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// Connect to the transport
|
|
422
|
+
await this.server.connect(this.transport);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Stop the MCP server
|
|
427
|
+
*/
|
|
428
|
+
public async stop(): Promise<void> {
|
|
429
|
+
if (this.isShuttingDown) {
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
this.isShuttingDown = true;
|
|
434
|
+
this.logger.info('Stopping MCP server...');
|
|
435
|
+
|
|
436
|
+
// Remove all tracked event listeners
|
|
437
|
+
this.removeAllListeners();
|
|
438
|
+
|
|
439
|
+
// Shutdown plugins
|
|
440
|
+
for (const [name, plugin] of this.plugins) {
|
|
441
|
+
if (plugin.shutdown) {
|
|
442
|
+
try {
|
|
443
|
+
await plugin.shutdown();
|
|
444
|
+
this.logger.info(`Plugin shutdown complete: ${name}`);
|
|
445
|
+
} catch (error) {
|
|
446
|
+
this.logger.error(`Plugin shutdown failed: ${name}`, error);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Close server connection
|
|
452
|
+
await this.server.close();
|
|
453
|
+
this.logger.info('MCP server stopped');
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
/**
|
|
457
|
+
* Set up graceful shutdown handling
|
|
458
|
+
*/
|
|
459
|
+
private setupGracefulShutdown(): void {
|
|
460
|
+
const shutdown = async (signal: string) => {
|
|
461
|
+
this.logger.info(`Received ${signal}, initiating graceful shutdown...`);
|
|
462
|
+
await this.stop();
|
|
463
|
+
process.exit(0);
|
|
464
|
+
};
|
|
465
|
+
|
|
466
|
+
this.addTrackedListener(process, 'SIGINT', () => shutdown('SIGINT'));
|
|
467
|
+
this.addTrackedListener(process, 'SIGTERM', () => shutdown('SIGTERM'));
|
|
468
|
+
|
|
469
|
+
this.addTrackedListener(process, 'uncaughtException', (error) => {
|
|
470
|
+
this.logger.error('Uncaught exception:', error);
|
|
471
|
+
shutdown('uncaughtException');
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
this.addTrackedListener(process, 'unhandledRejection', (reason) => {
|
|
475
|
+
this.logger.error('Unhandled rejection:', reason);
|
|
476
|
+
shutdown('unhandledRejection');
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* Get the logger instance
|
|
482
|
+
*/
|
|
483
|
+
public getLogger(): winston.Logger {
|
|
484
|
+
return this.logger;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* Get the underlying MCP server instance
|
|
489
|
+
*/
|
|
490
|
+
public getServer(): Server {
|
|
491
|
+
return this.server;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* Clean up resources and event listeners (useful for tests)
|
|
496
|
+
*/
|
|
497
|
+
public cleanup(): void {
|
|
498
|
+
this.removeAllListeners();
|
|
499
|
+
}
|
|
500
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { ArgoBaseTool, ArgoCommonSchemas, executeArgoCommand } from './BaseTool.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* List Argo cron workflows
|
|
6
|
+
*/
|
|
7
|
+
export class ArgoCronListTool implements ArgoBaseTool {
|
|
8
|
+
tool: Tool = {
|
|
9
|
+
name: 'argo_cron_list',
|
|
10
|
+
description: 'List Argo cron workflows in the cluster (similar to `argo cron list`)',
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
namespace: ArgoCommonSchemas.namespace,
|
|
15
|
+
allNamespaces: ArgoCommonSchemas.allNamespaces,
|
|
16
|
+
outputFormat: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
description: 'Output format for cron workflows. Supports: wide, name',
|
|
19
|
+
enum: ['wide', 'name'],
|
|
20
|
+
optional: true,
|
|
21
|
+
default: 'wide',
|
|
22
|
+
},
|
|
23
|
+
selector: ArgoCommonSchemas.selector,
|
|
24
|
+
maxCronWorkflows: {
|
|
25
|
+
type: 'number',
|
|
26
|
+
description: 'Maximum number of cron workflows to return',
|
|
27
|
+
optional: true,
|
|
28
|
+
},
|
|
29
|
+
showScheduled: {
|
|
30
|
+
type: 'boolean',
|
|
31
|
+
description: 'Show scheduled workflows as well',
|
|
32
|
+
optional: true,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
required: [],
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
async execute(params: any): Promise<any> {
|
|
40
|
+
const args = ['cron', 'list'];
|
|
41
|
+
|
|
42
|
+
// Add namespace specification
|
|
43
|
+
if (params.allNamespaces) {
|
|
44
|
+
args.push('--all-namespaces');
|
|
45
|
+
} else if (params.namespace) {
|
|
46
|
+
args.push('-n', params.namespace);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Add output format
|
|
50
|
+
if (params.outputFormat) {
|
|
51
|
+
args.push('-o', params.outputFormat);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Add selector
|
|
55
|
+
if (params.selector) {
|
|
56
|
+
args.push('-l', params.selector);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Add max cron workflows limit
|
|
60
|
+
if (params.maxCronWorkflows) {
|
|
61
|
+
args.push('--limit', params.maxCronWorkflows.toString());
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Add show scheduled option
|
|
65
|
+
if (params.showScheduled) {
|
|
66
|
+
args.push('--show-scheduled');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
const result = await executeArgoCommand(args);
|
|
71
|
+
return result;
|
|
72
|
+
} catch (error) {
|
|
73
|
+
throw new Error(
|
|
74
|
+
`Failed to list Argo cron workflows: ${error instanceof Error ? error.message : String(error)}`,
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { ArgoBaseTool, ArgoCommonSchemas, executeArgoCommand } from './BaseTool.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Get details of an Argo workflow
|
|
6
|
+
*/
|
|
7
|
+
export class ArgoGetTool implements ArgoBaseTool {
|
|
8
|
+
tool: Tool = {
|
|
9
|
+
name: 'argo_get',
|
|
10
|
+
description: 'Get details of an Argo workflow (similar to `argo get <workflow-name>`)',
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
workflowName: ArgoCommonSchemas.workflowName,
|
|
15
|
+
namespace: ArgoCommonSchemas.namespace,
|
|
16
|
+
outputFormat: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
description: 'Output format for workflow details. Supports: json, yaml, wide',
|
|
19
|
+
enum: ['json', 'yaml', 'wide'],
|
|
20
|
+
optional: true,
|
|
21
|
+
default: 'json',
|
|
22
|
+
},
|
|
23
|
+
showParameters: {
|
|
24
|
+
type: 'boolean',
|
|
25
|
+
description: 'Show workflow parameters',
|
|
26
|
+
optional: true,
|
|
27
|
+
},
|
|
28
|
+
showArtifacts: {
|
|
29
|
+
type: 'boolean',
|
|
30
|
+
description: 'Show workflow artifacts',
|
|
31
|
+
optional: true,
|
|
32
|
+
},
|
|
33
|
+
showEvents: {
|
|
34
|
+
type: 'boolean',
|
|
35
|
+
description: 'Show workflow events',
|
|
36
|
+
optional: true,
|
|
37
|
+
},
|
|
38
|
+
nodeFieldSelector: {
|
|
39
|
+
type: 'string',
|
|
40
|
+
description: 'Field selector to filter nodes',
|
|
41
|
+
optional: true,
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
required: ['workflowName'],
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
async execute(params: any): Promise<any> {
|
|
49
|
+
const args = ['get', params.workflowName];
|
|
50
|
+
|
|
51
|
+
// Add namespace specification
|
|
52
|
+
if (params.namespace) {
|
|
53
|
+
args.push('-n', params.namespace);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Add output format
|
|
57
|
+
if (params.outputFormat) {
|
|
58
|
+
args.push('-o', params.outputFormat);
|
|
59
|
+
} else {
|
|
60
|
+
args.push('-o', 'json');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Add optional flags
|
|
64
|
+
if (params.showParameters) {
|
|
65
|
+
args.push('--show-parameters');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (params.showArtifacts) {
|
|
69
|
+
args.push('--show-artifacts');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (params.showEvents) {
|
|
73
|
+
args.push('--show-events');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (params.nodeFieldSelector) {
|
|
77
|
+
args.push('--node-field-selector', params.nodeFieldSelector);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
try {
|
|
81
|
+
const result = await executeArgoCommand(args);
|
|
82
|
+
return result;
|
|
83
|
+
} catch (error) {
|
|
84
|
+
throw new Error(
|
|
85
|
+
`Failed to get Argo workflow ${params.workflowName}: ${
|
|
86
|
+
error instanceof Error ? error.message : String(error)
|
|
87
|
+
}`,
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|