Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
{
"name": "agentic-engineering",
"description": "The autonomous engineering system for repository portfolios and everything its agents need — engineer, read-only surveyor, meta-engineer and Flux troubleshooter agents; portfolio, product, spend and improvement workflows; GitHub, CodeRabbit review, security, library documentation, Go, Kubernetes, Flux, Talos, SvelteKit frontend, Stripe payments, engineering-practice, design, product-management, marketing, finance and productivity skills; and the MCP servers they use; configured by the consumer AGENTS.md",
"version": "7.2.0",
"version": "7.2.1",
"source": "./plugins/agentic-engineering"
},
{
Expand Down
2 changes: 1 addition & 1 deletion .github/plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
{
"name": "agentic-engineering",
"description": "The autonomous engineering system for repository portfolios and everything its agents need — engineer, read-only surveyor, meta-engineer and Flux troubleshooter agents; portfolio, product, spend and improvement workflows; GitHub, CodeRabbit review, security, library documentation, Go, Kubernetes, Flux, Talos, SvelteKit frontend, Stripe payments, engineering-practice, design, product-management, marketing, finance and productivity skills; and the MCP servers they use; configured by the consumer AGENTS.md",
"version": "7.2.0",
"version": "7.2.1",
"source": "./plugins/agentic-engineering"
},
{
Expand Down
3 changes: 2 additions & 1 deletion docs/resources.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ Every path invokes the same `flux-operator-mcp` binary, so install it first —
`brew install controlplaneio-fluxcd/tap/flux-operator-mcp` or `go install
github.com/controlplaneio-fluxcd/flux-operator/cmd/mcp@latest`. It refuses to start unless the
`KUBECONFIG` environment variable is set, which is why the hand-written entry sets it; the bundled
plugin's `sh` wrapper sets it to `$HOME/.kube/config` when it is unset or empty. It can read every
plugin starts it through its `scripts/flux-operator-mcp.sh` launcher, which sets it to
`$HOME/.kube/config` when it is unset or empty. It can read every
context in that kubeconfig, starting at the current one, because its read-only
`set_kubeconfig_context` tool switches between them. See the
[Flux MCP docs](https://fluxcd.control-plane.io/operator/mcp/) for read-only mode and remote
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion plugins/agentic-engineering/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "agentic-engineering",
"description": "The autonomous engineering system for repository portfolios and everything its agents need — engineer, read-only surveyor, meta-engineer and Flux troubleshooter agents; portfolio, product, spend and improvement workflows; GitHub, CodeRabbit review, security, library documentation, Go, Kubernetes, Flux, Talos, SvelteKit frontend, Stripe payments, engineering-practice, design, product-management, marketing, finance and productivity skills; and the MCP servers they use; configured by the consumer AGENTS.md",
"version": "7.2.0",
"version": "7.2.1",
"author": {
"name": "devantler-tech",
"url": "https://github.com/devantler-tech"
Expand Down
73 changes: 73 additions & 0 deletions plugins/agentic-engineering/.codex-plugin/mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
{
"mcpServers": {
"aws-knowledge": {
"type": "http",
"url": "https://knowledge-mcp.global.api.aws"
},
"cloudflare-docs": {
"type": "http",
"url": "https://docs.mcp.cloudflare.com/mcp"
},
"context7": {
"type": "http",
"url": "https://mcp.context7.com/mcp"
},
"coroot": {
"type": "http",
"url": "${COROOT_URL}/mcp",
"headersHelper": "bash \"${CLAUDE_PLUGIN_ROOT}/scripts/coroot-mcp-headers.sh\" \"${CLAUDE_PLUGIN_DATA}\""
},
"flux-operator-mcp": {
"command": "sh",
"args": [
"scripts/flux-operator-mcp.sh"
],
"cwd": "."
Comment thread
devantler marked this conversation as resolved.
Resolved
},
"github": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/",
"headers": {
"X-MCP-Toolsets": "context,repos,issues,pull_requests,users,actions,labels,projects",
"X-MCP-Exclude-Tools": "merge_pull_request,create_repository,fork_repository,push_files,create_or_update_file,delete_file,update_pull_request_branch,update_pull_request,pull_request_review_write,add_comment_to_pending_review,actions_run_trigger,delete_repository"
},
"headersHelper": "bash \"${CLAUDE_PLUGIN_ROOT}/scripts/github-mcp-headers.sh\" \"${CLAUDE_PLUGIN_DATA}\""
},
"github-ghas-tools": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/readonly",
"headers": {
"X-MCP-Toolsets": "code_security,secret_protection,security_advisories,dependabot",
"X-MCP-Readonly": "true"
},
"headersHelper": "bash \"${CLAUDE_PLUGIN_ROOT}/scripts/github-mcp-headers.sh\" \"${CLAUDE_PLUGIN_DATA}\""
},
"kubescape": {
"command": "sh",
"args": [
"scripts/kubescape-mcp.sh"
],
"cwd": "."
},
"siderolabs-docs": {
"type": "http",
"url": "https://docs.siderolabs.com/mcp"
},
"stripe": {
"type": "http",
"url": "https://mcp.stripe.com"
},
"svelte": {
"type": "http",
"url": "https://mcp.svelte.dev/mcp"
},
"terraform-registry": {
"command": "terraform-mcp-server",
"args": [
"stdio",
"--toolsets",
"registry"
]
}
}
}
4 changes: 2 additions & 2 deletions plugins/agentic-engineering/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "agentic-engineering",
"description": "The autonomous engineering system for repository portfolios and everything its agents need — engineer, read-only surveyor, meta-engineer and Flux troubleshooter agents; portfolio, product, spend and improvement workflows; GitHub, CodeRabbit review, security, library documentation, Go, Kubernetes, Flux, Talos, SvelteKit frontend, Stripe payments, engineering-practice, design, product-management, marketing, finance and productivity skills; and the MCP servers they use; configured by the consumer AGENTS.md",
"version": "7.2.0",
"version": "7.2.1",
"author": {
"name": "devantler-tech",
"url": "https://github.com/devantler-tech"
Expand Down Expand Up @@ -45,7 +45,7 @@
"connectors"
],
"skills": "./skills/",
"mcpServers": "./.mcp.json",
"mcpServers": "./.codex-plugin/mcp.json",
"apps": "./.app.json",
"interface": {
"displayName": "Agentic Engineering",
Expand Down
6 changes: 2 additions & 4 deletions plugins/agentic-engineering/.mcp.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@
"flux-operator-mcp": {
"command": "sh",
"args": [
"-c",
"[ -n \"$KUBECONFIG\" ] || { [ -n \"$HOME\" ] || { echo 'flux-operator-mcp: set KUBECONFIG or HOME' >&2; exit 1; }; KUBECONFIG=\"$HOME/.kube/config\"; }; export KUBECONFIG; exec flux-operator-mcp serve --read-only"
"${CLAUDE_PLUGIN_ROOT}/scripts/flux-operator-mcp.sh"
]
},
"github": {
Expand All @@ -45,8 +44,7 @@
"kubescape": {
"command": "sh",
"args": [
"-c",
"[ -n \"$KUBECONFIG\" ] || { [ -n \"$HOME\" ] || { echo 'kubescape: set KUBECONFIG or HOME' >&2; exit 1; }; KUBECONFIG=\"$HOME/.kube/config\"; }; export KUBECONFIG; exec kubescape mcpserver"
"${CLAUDE_PLUGIN_ROOT}/scripts/kubescape-mcp.sh"
]
},
"siderolabs-docs": {
Expand Down
32 changes: 32 additions & 0 deletions plugins/agentic-engineering/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,37 @@
# Changelog — `agentic-engineering`

## 7.2.1 — 2026-11-07

The plugin now passes the Claude plugin directory's blocking checks and carries the listing
details it asks for. Nothing a consumer configures changes.

**Fixed**

- `flux-operator-mcp` and `kubescape` start from POSIX `sh` scripts the plugin ships,
[`scripts/flux-operator-mcp.sh`](scripts/flux-operator-mcp.sh) and
[`scripts/kubescape-mcp.sh`](scripts/kubescape-mcp.sh), instead of an inline `sh -c` program the
directory's validator cannot follow. They resolve `KUBECONFIG` exactly as before:
`$HOME/.kube/config` when it is unset or empty, any other value unchanged. `.mcp.json` names them
by `${CLAUDE_PLUGIN_ROOT}`, which Claude Code and VS Code substitute. Codex does not, so it now
loads [`.codex-plugin/mcp.json`](.codex-plugin/mcp.json), a mirror of `.mcp.json` that runs the
two scripts by their plugin-relative paths from the plugin's directory. Copilot CLI's handling of
`${CLAUDE_PLUGIN_ROOT}` there is not verified.
- The `github-mcp-headers.sh` self-test no longer ships stub values shaped like GitHub tokens, which
the directory's secret scan reported as a secret in a shipped file.

**Changed**

- `kubescape` scans no longer send Kubescape's version check, which carries a cluster ID and the
node count, to Kubescape's update service: the launcher sets `KS_SKIP_UPDATE_CHECK=true` unless
you set it yourself.

**Added**

- [`PRIVACY.md`](PRIVACY.md): the plugin collects no data itself; the policy lists what each bundled
server sends and to whom. The README links it.
- `.claude-plugin/icon.png`, the Devantler Tech orb at 512 × 512, for the directory listing.
- The README's Claude Code install line.

## 7.2.0 — 2026-11-05

**Added** — `coroot`, the MCP endpoint at `/mcp` that Coroot serves itself, which accepts
Expand Down
74 changes: 74 additions & 0 deletions plugins/agentic-engineering/PRIVACY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Privacy

The `agentic-engineering` plugin is a set of files that runs inside your own AI coding tool:
skills, agents, helper scripts and MCP server definitions. Devantler Tech runs no service for it.
The plugin has no backend and sends no telemetry, and Devantler Tech collects, stores, shares and
sells no personal data through it.

What the plugin's servers send, and to whom, is set out below. Your conversation, including what
those servers return, also goes to the model provider your AI tool uses, under that provider's
terms rather than this policy.

## On your machine

- **Skills and agents** are instructions your tool loads. Anything they do, such as running `gh`
or `git`, runs through your tool's own tools and permissions.
- **GitHub sign-in (Claude Code only).**
[`scripts/github-mcp-headers.sh`](scripts/github-mcp-headers.sh) reads a GitHub token from a
`github-token` file you create in the plugin's data directory, or else from your GitHub CLI
login. It hands the token to Claude Code, which sends it only to GitHub's MCP server as the
`Authorization` header of the bundled `github` and `github-ghas-tools` servers. The script stores
the token nowhere and never writes it to an error message or a log.
- **Cluster servers.** [`scripts/flux-operator-mcp.sh`](scripts/flux-operator-mcp.sh) and
[`scripts/kubescape-mcp.sh`](scripts/kubescape-mcp.sh) start the Flux and Kubescape servers against
the clusters in your kubeconfig. They talk to your clusters, and Kubescape also downloads its
released policy bundle from GitHub each time it starts. Kubescape's scans would also send a
version check to Kubescape's update service, carrying a cluster ID, the node count, the
frameworks scanned and the client version. The launcher turns that check off by setting
`KS_SKIP_UPDATE_CHECK=true`, unless you set that variable yourself.
- **Coroot (Claude Code only).** `coroot` connects to your own Coroot instance at the address in
`COROOT_URL`. [`scripts/coroot-mcp-headers.sh`](scripts/coroot-mcp-headers.sh) reads that
instance's address from `coroot-url` and a service-account API key from `coroot-api-key`, both
files you create in the plugin's data directory. It hands the key to Claude Code as a bearer
token only when Claude Code is connecting to that pinned address followed by `/mcp`. What the
agents ask Coroot, and what it answers, stays between your tool and your Coroot.
- **Terraform Registry server.** `terraform-registry` runs locally and looks providers and modules
up in HashiCorp's public Terraform Registry.

## Hosted servers

Every other bundled server is hosted by a third party. When an agent calls one of its tools, the
request goes to that service, together with what the agent passes it: a search, a repository or
package name, a version, or code. Each service handles it under its own privacy policy.

| Server | Operated by |
|---|---|
| `aws-knowledge` | Amazon Web Services |
| `cloudflare-docs` | Cloudflare |
| `context7` | Upstash |
| `github`, `github-ghas-tools` | GitHub |
| `siderolabs-docs` | Sidero Labs |
| `stripe` | Stripe, once you sign in to it |
| `svelte` | The Svelte maintainers |

In Codex, the plugin also offers optional app connectors for iCloud Mail, iCloud Calendar,
LinkedIn and Codex Security. None connects unless you choose it. Each then works under its
operator's terms.

## Your choices

- Disable any server in your tool's MCP settings to stop it contacting its service. Denying single
tools does not stop the connection.
- The only files the plugin reads that you create are the optional `github-token`, `coroot-url`
Comment thread
devantler marked this conversation as resolved.
Resolved
and `coroot-api-key` in its data directory. Delete them at any time. Claude Code removes that
directory when you uninstall the plugin from the last place it is installed, unless you pass
`--keep-data`.
- Uninstalling the plugin stops all of the above.

## Changes and contact

Changes to this policy ship with the plugin and are listed in [`CHANGELOG.md`](CHANGELOG.md).
Ask questions in the repository's
[issues](https://github.com/devantler-tech/agent-plugins/issues). Report a privacy or security
problem privately through the repository's
[security advisories](https://github.com/devantler-tech/agent-plugins/security/advisories/new).
33 changes: 29 additions & 4 deletions plugins/agentic-engineering/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,22 @@ the [engineering toolbox](#the-engineering-toolbox) and [MCP servers](#bundled-m
agents work with. The generic role lives here; each consumer supplies its organization-specific
configuration through its canonical `AGENTS.md`.

Install it in Claude Code (2.1.275 or later) with:

```text
/plugin install agentic-engineering --marketplace devantler-tech/agent-plugins
```

The [installation guide](../../docs/installation.md) covers Copilot CLI, VS Code and Codex.

Released versions and the upgrade steps each breaking release needs are in the
[changelog](CHANGELOG.md). A plugin's version is its cache key, so an install that never moves off an
old version keeps serving that version's definitions — check what a deployment actually loaded before
assuming it has a change the changelog lists.

[Privacy](https://github.com/devantler-tech/agent-plugins/blob/main/plugins/agentic-engineering/PRIVACY.md):
the plugin collects no data itself; that policy lists what each bundled server sends and to whom.

## What it includes

Four agents:
Expand Down Expand Up @@ -230,8 +241,12 @@ Until all three are set, Claude Code shows a missing-variable warning or a faile
Claude-only `headersHelper`, which is not yet verified on each tool; configure Coroot for them with
their own MCP settings.

`kubescape` runs `kubescape mcpserver` from the Kubescape CLI, through the same `sh` wrapper as
the Flux server, so it reads every cluster in your kubeconfig the same way. Its tools read the
`kubescape` runs `kubescape mcpserver` from the Kubescape CLI, through
[`scripts/kubescape-mcp.sh`](scripts/kubescape-mcp.sh), which resolves the kubeconfig the same way
as the Flux server's launcher, so it reads every cluster in your kubeconfig the same way. The
launcher also sets `KS_SKIP_UPDATE_CHECK=true` unless you set it yourself, so the agents' scans
send no version check to Kubescape's update service; that check would carry a cluster ID, the node
count, the frameworks scanned and the client version. Its tools read the
cluster and the results the in-cluster Kubescape operator stores. Its only write-shaped calls are
server-side dry-run patches, which change nothing; despite its name, `apply_remediation` never
applies a fix (Kubescape v4.0.17 sends every patch it makes as a server-side dry run), and
Expand Down Expand Up @@ -273,8 +288,18 @@ A local server whose binary is missing reports a failed connection and leaves th
The Flux server starts with `--read-only`, so it can read, trace and diff but never apply, delete,
reconcile, suspend or resume; hand fixes to your GitOps delivery instead. `flux-operator-mcp`
refuses to start unless the `KUBECONFIG` environment variable is set, so the plugin starts it
through `sh`, which sets `KUBECONFIG` to `$HOME/.kube/config` when your environment leaves it
unset or empty and passes any non-empty value unchanged. It can read every cluster in that
through [`scripts/flux-operator-mcp.sh`](scripts/flux-operator-mcp.sh), which sets `KUBECONFIG` to
`$HOME/.kube/config` when your environment leaves it unset or empty and passes any non-empty value
unchanged. Both cluster servers start from a POSIX `sh` script the plugin ships rather than from an
inline shell program, so a plugin directory's validator can read what they run. `.mcp.json` names
each script by `${CLAUDE_PLUGIN_ROOT}`, which Claude Code and VS Code substitute. Codex substitutes
no such variable, so it loads [`.codex-plugin/mcp.json`](.codex-plugin/mcp.json) instead: the same
servers, with the two scripts named relative to the plugin, run from the plugin's own directory.
`validate-manifests.sh` keeps that file a mirror of `.mcp.json`. Copilot CLI's handling of
`${CLAUDE_PLUGIN_ROOT}` in a plugin's `.mcp.json` is not verified; a tool that does not substitute
it reports both cluster servers as failed connections and leaves the rest working. Under Codex,
`kubescape` resolves a relative path you give its local-scan tools against the plugin's directory,
so give those tools absolute paths. `flux-operator-mcp` can read every cluster in that
kubeconfig, not only the current context: its read-only `set_kubeconfig_context` tool switches
between them, and it can read workload logs (Secret values are masked by default). Every session
that loads this plugin gets that read access, including unattended runs. To narrow it, point
Expand Down
2 changes: 1 addition & 1 deletion plugins/agentic-engineering/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "agentic-engineering",
"description": "The autonomous engineering system for repository portfolios and everything its agents need — engineer, read-only surveyor, meta-engineer and Flux troubleshooter agents; portfolio, product, spend and improvement workflows; GitHub, CodeRabbit review, security, library documentation, Go, Kubernetes, Flux, Talos, SvelteKit frontend, Stripe payments, engineering-practice, design, product-management, marketing, finance and productivity skills; and the MCP servers they use; configured by the consumer AGENTS.md",
"version": "7.2.0",
"version": "7.2.1",
"author": {
"name": "devantler-tech",
"url": "https://github.com/devantler-tech"
Expand Down
35 changes: 35 additions & 0 deletions plugins/agentic-engineering/scripts/flux-operator-mcp.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#!/bin/sh
# Start the bundled `flux-operator-mcp` server read-only. ../.mcp.json runs this file with `sh` as
# the server's command, and ../.codex-plugin/mcp.json runs it by its plugin-relative path, so a
# plugin directory's validator can read exactly what the plugin starts instead of an inline `sh -c`
# program it cannot follow.
#
# flux-operator-mcp refuses to start unless the KUBECONFIG environment variable is set. This sets
# it to $HOME/.kube/config when the environment leaves it unset or empty, and passes any
# non-empty value through unchanged. `--read-only` keeps the server from applying, deleting,
# reconciling, suspending or resuming anything.
#
# The server speaks MCP over stdin and stdout, so this script writes nothing to stdout itself and
# replaces itself with the server. It is POSIX sh, run by `sh`, which reads no BASH_ENV file that
# could print onto that stream first.
#
# Usage: flux-operator-mcp.sh (no arguments)
# Exit codes: the server's own; 1 neither KUBECONFIG nor HOME is set; 2 usage error; 127 the
# flux-operator-mcp binary is not on PATH.
set -eu

if [ $# -gt 0 ]; then
echo 'usage: flux-operator-mcp.sh' >&2
exit 2
fi

if [ -z "${KUBECONFIG:-}" ]; then
if [ -z "${HOME:-}" ]; then
echo 'flux-operator-mcp: set KUBECONFIG or HOME' >&2
exit 1
fi
KUBECONFIG="$HOME/.kube/config"
fi
export KUBECONFIG

exec flux-operator-mcp serve --read-only
Loading
Loading