Skip to content

Add --openappa to install OpenAPPA guardrails at the egress gateway - #3817

Draft
Joey Orlando (joeyorlando) wants to merge 3 commits into
agent-substrate:mainfrom
joeyorlando:appa-extproc-bodies
Draft

Joey Orlando (joeyorlando) wants to merge 3 commits into
agent-substrate:mainfrom
joeyorlando:appa-extproc-bodies

Conversation

@joeyorlando

@joeyorlando Joey Orlando (joeyorlando) commented Nov 12, 2026 •

Copy link
Copy Markdown

Adds ate-setup deploy --openappa, which installs OpenAPPA guardrails at the egress gateway with one flag.

OpenAPPA is an open-source information-flow policy engine for AI agents. It labels each agent session with who may read the data it has seen and how far that data is trusted. It then checks every tool call against those labels, so a session that read a private repository can't post to a public issue. The decisions come from declarative per-tool rules, not from a model.

Running at the egress gateway, it checks every actor's MCP tool calls, whatever harness or image the actor runs, and refuses a call before it leaves the cluster. Its labels are keyed by the actor's verified identity.

--openappa deploys OpenAPPA's runtime and ext_proc processor into ate-system, with a Service and a NetworkPolicy that admits only the egress gateway. It also points the additional egress ext_proc filter at that Service. A redeploy without the flag removes it. Options:

  • --openappa-policy: the operator's own appa.toml. The bundled default includes OpenAPPA's GitHub battery.
  • --openappa-mcp-servers: the MCP hosts to check.
  • --openappa-runtime-image and --openappa-extproc-image: image overrides.
  • Provider tokens go in an optional openappa-provider-credentials Secret.

The guide is docs/guides/openappa.md.

To make this possible, the additional ext_proc filter gets two generic opt-in settings that any processor can use:

  • --experimental-additional-egress-extproc-allow-mode-override lets the processor read the request and response bodies of the requests it picks, via mode_override. All other traffic stays headers-only, so long-lived SSE streams are never buffered.
  • --experimental-additional-egress-extproc-timeout sets the filter's timeouts.

Without them the rendered filter is unchanged.

The default extproc image, ghcr.io/archestra-ai/appa-extproc, is published starting with OpenAPPA's next release (archestra-ai/OpenAPPA#904). Its digest gets pinned once that release exists.

Tested on a kind install deployed with --openappa alone and a locally built extproc image. A stock Claude Code actor read a file from a private repository through GitHub's MCP server. OpenAPPA then refused the agent's comment on a public issue, and a curl call from the same actor was refused the same way. Model API traffic stayed headers-only. The tests render the manifests and filter, parse the filter into the vendored ExternalProcessor proto, and cover the config validation and removal.

AI use: AI-assisted, I reviewed and tested it.

  • Tests pass
  • Docs updated

The additional egress ext_proc filter sees request headers only, so a
processor that needs request and response bodies, such as an MCP
tools/call policy, cannot run there. Buffering every body would stall
long-lived SSE streams.

--experimental-additional-egress-extproc-allow-mode-override sets
allow_mode_override with one allowed mode: response headers sent and
both bodies buffered. The processor opts a request in from its
request_headers response. --experimental-additional-egress-extproc-timeout
sets the filter's message and gRPC timeouts, which stay at 2s by
default. Both require --experimental-additional-egress-extproc-service.
The defaults render the filter unchanged.
@joeyorlando Joey Orlando (joeyorlando) changed the title Let the additional egress ext_proc read request and response bodies Let the additional egress ext_proc read request and response bodies, for MCP policy engines such as OpenAPPA Nov 12, 2026
@joeyorlando Joey Orlando (joeyorlando) changed the title Let the additional egress ext_proc read request and response bodies, for MCP policy engines such as OpenAPPA feat: let the additional egress ext_proc read request and response bodies, for MCP policy engines such as OpenAPPA Nov 12, 2026
OpenAPPA checks MCP tool calls against what an actor has already read.
Running it as the egress gateway's additional ext_proc filter took a
hand-built Deployment, Service and policy plus three extproc flags.

--openappa deploys manifests/openappa into ate-system and sets those
flags: the service to openappa:9443, mode overrides on, and a 60s
timeout unless one is given. A different service, mode overrides turned
off, another namespace or the agentgateway dataplane are refused. A
redeploy without it removes OpenAPPA and keeps its policy ConfigMap and
credentials Secret, as removeK8sCredentialProvider does.

The bundled appa.toml is applied only when the cluster has no policy, so
an edited one survives a redeploy. --openappa-policy replaces it on every
deploy. The pod template carries the policy's digest, so a changed policy
restarts the runtime.
@joeyorlando Joey Orlando (joeyorlando) changed the title feat: let the additional egress ext_proc read request and response bodies, for MCP policy engines such as OpenAPPA Add --openappa to install OpenAPPA guardrails at the egress gateway Nov 12, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant