SafetyCard Request a review

MCP for Argo CD

MCP server for Argo CD applications, clusters and resources

github.com/argoproj-labs/mcp-for-argocd · 2026-10-03 · 28d15ca

Defense-in-depth score

3.1 / 10

As shipped, this server hands the model an Argo CD token with every write tool switched on: it can create Applications from any repository, sync with prune, run resource actions and delete with cascade, and it gives the MCP host no read-only or destructive markings to decide what needs approval. Tool results include pod logs and manifests other people control, so a prompt injection can turn into cluster changes. The token itself is well handled (never in tool arguments, bound to its host), and MCP_READ_ONLY=true removes all write tools, but it is opt-in. It also auto-loads a .env from the launch directory, and it keeps no record of tool calls.

Safest setup

MCP for Argo CD keeps its Argo CD token out of the model's hands and bound to the instance you configure. As shipped every write tool is on, no tool is marked as read-only or destructive for the host, and no tool call is recorded, so the safest setup narrows the Argo CD account, turns on read-only mode and builds the rest around the server.

SetupHowWhat it gives you
A read-only Argo CD accountGive ARGOCD_API_TOKEN a token from an Argo CD account whose RBAC role grants read access only, on just the projects the task needsArgo CD itself refuses changes, whatever the model asks for C1
A tight AppProjectBind that account to an Argo CD AppProject that allows only your own source repositories and destinationsAny deployment stays within the repositories and clusters you chose C4
Read-only modeSet MCP_READ_ONLY to true in the server's environmentThe create, update, delete, sync and resource-action tools are never registered, so the agent can only read C2
A locked HTTP listenerFor the HTTP transport, keep the default loopback MCP_BIND_ADDRESS and set MCP_AUTH_TOKEN before widening itOnly callers you authorize reach the server's Argo CD tools C1
Settings only from youSet ARGOCD_BASE_URL in the host config and launch the server from a directory with no .env file you didn't writeThe Argo CD endpoint and TLS settings come only from you, not from a repository you happen to open C6
Certificate checks onUse a trusted certificate on Argo CD and leave Node's certificate verification at its default, rather than copying the sample Cursor config's TLS settingThe Argo CD token travels only over verified connections C8
Records outside the serverKeep your MCP host's tool-call history and Argo CD's own audit events, stored where the agent can't change themA record of every change the agent made, since the server keeps none itself C9

Approving with confidence

  • Read each prompt and approve calls one at a time; the server marks no tool as read-only or destructive, so the tool name is your signal.
  • Ask for a dry run of sync_application first, and check the application and cascade setting before approving a delete.

Handling data

  • Tool results carry pod logs and manifests unredacted; treat the host's transcript like the cluster data it read.

Key gaps (4)

  1. The Argo CD token used for every tool can deploy any repository to any managed cluster and delete Applications with cascade; the server does not narrow it. C1 · Identity & least privilege
  2. create_application plus sync lets the model have Argo CD deploy arbitrary manifests (any container) to production clusters with no isolation or policy in the server. C4 · Code-execution isolation
  3. A hijacked session can read attacker-influenced logs and then delete, sync or deploy (and leak data via an attacker repoURL) with no server-side human step; read-only mode is off by default (C5-WORSTCASE). C5 · Untrusted input blast radius
  4. dotenv.config() auto-loads a .env from the working directory, letting a cloned repo redirect the Argo CD endpoint/token registry or disable TLS verification without a trust prompt (C6-REPOCONFIG). C6 · Memory, context & configuration integrity

Criteria

C1 Identity & least privilege

0.23 / 1.00

The server acts with a single Argo CD API token taken from the ARGOCD_API_TOKEN environment variable, and every tool, read or write, uses that same token. The server does not narrow it in any way: there is no separate read credential, no per-tool scoping and no authorization check of its own, so what the agent can do is whatever the operator's token can do in Argo CD. One good design choice is that the token is bound to the configured Argo CD host and is never sent to a different host the model names. Write tools are on by default, and the README does not steer users toward a read-only or project-scoped Argo CD account. In the HTTP transport (not the scored mode) the server also accepts the caller's token in a header and forwards it to Argo CD.

C2 Approval gates

0.42 / 1.00

The server has no approval step of its own and relies on the MCP host. It gives the host little to work with: no tool carries read-only or destructive annotations, so a host cannot tell list_applications from delete_application by metadata. Only sync_application offers a dry-run option, and the model chooses whether to use it. The strongest control is an opt-in read-only mode (MCP_READ_ONLY=true) that removes all five mutating tools; without it, deletes with cascade, prunes and resource actions run immediately when called.

C3 Tool & action scoping

0.38 / 1.00

Tools are narrow and named for Argo CD operations rather than a generic HTTP client, and each has a typed schema. But almost nothing is validated beyond types: names in request paths are not strictly validated. Repository URLs, resource action names and sync options are passed through unchecked. All write tools are on by default; one environment variable removes them as a group.

C4 Code-execution isolation

0.00 / 1.00

The server never runs a shell, eval, or subprocess on its own host. It can, however, cause model-chosen code to run elsewhere: create_application accepts any repository URL and destination, and sync_application then has Argo CD apply whatever manifests that repository contains, which can start any container in a managed cluster. Nothing in the server isolates or constrains this; only Argo CD's own project rules, configured outside this repo, stand in the way, and the write tools are on by default.

C5 Untrusted input blast radius

0.07 / 1.00

Tool results include content that other people control: application logs, Kubernetes events, resource manifests and Application specs. The server returns them as one plain JSON text blob with no marking of what is untrusted and no separation between data and metadata. The only mode that would drop a dangerous capability, read-only, is off by default. A prompt-injected agent that reads a crafted log line can therefore delete or re-sync applications, deploy an attacker's repository to a cluster, and send data out through a repository URL Argo CD will fetch, all in the same session.

C6 Memory, context & configuration integrity

0.25 / 1.00

The server keeps no memory, conversation store, or retrieval index. However, at startup it calls dotenv, which loads a .env file from whatever directory the server is launched in. MCP hosts commonly start stdio servers inside the user's project, so a .env committed to a cloned repository can set variables the operator left unset, such as the Argo CD base URL, the token-registry path, or NODE_TLS_REJECT_UNAUTHORIZED=0 to turn off certificate checks. This happens silently, with no trust prompt, and persists for every session started in that directory.

C7 Third-party extensions

N/A · full credit 1.00 / 1.00

The server loads no third-party code at runtime: no plugins, no dynamic imports, no subprocesses and no package installs. Its dependencies are fixed at build time. The README's 'npx argocd-mcp@latest' install line is how users fetch this server itself and is general supply-chain hygiene, not an extension mechanism.

C8 Secrets & sensitive-data protection

0.38 / 1.00

The Argo CD token is read from an environment variable and is deliberately kept out of tool arguments, so it never passes through the model, and it is bound to the configured Argo CD host so the model cannot redirect it elsewhere. The server does not log requests, tokens or tool results, and has no telemetry. But nothing is redacted from tool output: logs and manifests returned to the model are passed through as-is. The token itself is a long-lived Argo CD credential, and the repository's own sample Cursor config ships with TLS verification disabled.

C9 Audit & traceability

0.00 / 1.00

The server keeps no record of what it did. Its logger writes only startup and listener messages; tool calls, their arguments, and their results are never logged. After an incident the only trace would be whatever the MCP host or Argo CD's own audit events recorded.

C10 Limits & kill switch

0.38 / 1.00

Log tools always ask Argo CD for at most the last 100 lines and never follow the stream, which bounds one kind of output. Everything else is unbounded: listing applications fetches every application before applying the caller's optional limit, get_resources with no refs fetches every resource in the tree in parallel, and no HTTP request has a timeout or cancellation. There are no rate limits on the write tools.