From 0480119316a6b74f1607ef00b35362fc984e5a12 Mon Sep 17 00:00:00 2001 From: bradfordwagner Date: Mon, 10 Nov 2025 19:39:36 -0500 Subject: [PATCH] feat: add cluster management tool to list registered clusters Signed-off-by: bradfordwagner --- README.md | 3 +++ src/argocd/client.ts | 16 +++++++++++++++- src/server/server.ts | 19 +++++++++++++++++++ src/types/argocd-types.ts | 2 ++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bec72dd..92b318e 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,9 @@ const urlForGithub = `https://insiders.vscode.dev/redirect?url=${encodeURICompon The server provides the following ArgoCD management tools: +### Cluster Management +- `list_clusters`: List all clusters registered with ArgoCD + ### Application Management - `list_applications`: List and filter all applications - `get_application`: Get detailed information about a specific application diff --git a/src/argocd/client.ts b/src/argocd/client.ts index 90d6737..1d4e48a 100644 --- a/src/argocd/client.ts +++ b/src/argocd/client.ts @@ -7,7 +7,8 @@ import { V1alpha1ResourceAction, V1alpha1ResourceDiff, V1alpha1ResourceResult, - V1alpha1ApplicationResourceResult + V1alpha1ApplicationResourceResult, + V1alpha1ClusterList } from '../types/argocd-types.js'; import { HttpClient } from './http.js'; @@ -65,6 +66,19 @@ export class ArgoCDClient { }; } + public async listClusters(params?: { server?: string; name?: string }) { + const queryParams: Record = {}; + if (params?.server) queryParams.server = params.server; + if (params?.name) queryParams.name = params.name; + + const { body } = await this.client.get( + `/api/v1/clusters`, + Object.keys(queryParams).length > 0 ? queryParams : undefined + ); + + return body; + } + public async getApplication(applicationName: string, appNamespace?: string) { const queryParams = appNamespace ? { appNamespace } : undefined; const { body } = await this.client.get( diff --git a/src/server/server.ts b/src/server/server.ts index c9a55c7..18eba62 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -65,6 +65,25 @@ export class Server extends McpServer { offset }) ); + this.addJsonOutputTool( + 'list_clusters', + 'list_clusters returns list of clusters registered with ArgoCD', + { + server: z + .string() + .optional() + .describe('Filter clusters by server URL. Optional.'), + name: z + .string() + .optional() + .describe('Filter clusters by name. Optional.') + }, + async ({ server, name }) => + await this.argocdClient.listClusters({ + server: server ?? undefined, + name: name ?? undefined + }) + ); this.addJsonOutputTool( 'get_application', 'get_application returns application by application name. Optionally specify the application namespace to get applications from non-default namespaces.', diff --git a/src/types/argocd-types.ts b/src/types/argocd-types.ts index 583fc84..8f3530b 100644 --- a/src/types/argocd-types.ts +++ b/src/types/argocd-types.ts @@ -11,3 +11,5 @@ export type V1alpha1ResourceAction = ArgoCD.V1alpha1ResourceAction; export type V1alpha1ResourceDiff = ArgoCD.V1alpha1ResourceDiff; export type V1alpha1ResourceResult = ArgoCD.V1alpha1ResourceResult; export type V1alpha1ApplicationResourceResult = ArgoCD.ApplicationApplicationResourceResponse; +export type V1alpha1Cluster = ArgoCD.V1alpha1Cluster; +export type V1alpha1ClusterList = ArgoCD.V1alpha1ClusterList;