Skip to content

Take operator approve off the MCP server - #38

Merged
shipmill-romamo[bot] merged 2 commits into
mainfrom
fix/35-operator-approve-off-mcp
Oct 9, 2026
Merged

shipmill-romamo[bot] merged 2 commits into
mainfrom
fix/35-operator-approve-off-mcp

Conversation

@shipmill-romamo

Copy link
Copy Markdown
Contributor

Summary

On a project, cloudfall mcp serve served operator approve as the operator_approve tool, so an agent could run and verify its own proposal with no person in the loop.

  • operator approve gets mcp=False with the same comment as decisions approve ("A person approves; no agent tool stands in for it"); the CLI command itself is unchanged
  • "operator.approve" is removed from PROJECT_COMMANDS; operator_list and operator_show stay tools
  • The --gateway-url, --gateway-ca, --gateway-cert and --gateway-key flags of cloudfall mcp serve are removed. Only operator_approve took them, and treaty refuses to start a server that binds a field no served tool has (MCP_BIND_UNKNOWN)
  • The project server's MCP instructions, docs/operator-guide.md ("The record", "Through an agent") and sdk/README.md now say a person approves from a shell with cloudfall operator approve
  • CHANGELOG: a ### Security entry under Unreleased

Tests

  • New test_a_project_call_cannot_approve_its_own_proposal: calling operator_approve on a project server returns UNKNOWN_TOOL
  • --list-tools test: operator_list and operator_show are listed, operator_approve is not
  • The project tool-list test moves operator_approve from the expected tools to the never-tools set
  • The gateway_url binding assertion is gone from the secrets/URL test, since the tool no longer exists
  • uv sync, uv run ruff check ., uv run mypy, uv run pytest (396 passed), uv run cloudfall config validate --project config/examples and uv lock --check all pass

Part of #35

🤖 Generated with Claude Code

@shipmill-romamo

Copy link
Copy Markdown
Contributor Author

@romamo Decision needed: with operator_approve off the MCP surface, what happens to the --gateway-url, --gateway-ca, --gateway-cert and --gateway-key flags of cloudfall mcp serve?

They existed only to be passed to operator_approve so its verify step could reach the alerts gateway. With the tool gone, treaty refuses to start the server while they are bound to nothing (MCP_BIND_UNKNOWN), so they can't stay as they are.

  1. Remove them (recommended; this is what the PR does): anyone who starts mcp serve with them, as the old operator guide showed, gets an argument error until they drop them. 0.6.0 is still a release candidate, and the CHANGELOG entry names the removal
  2. Keep them accepted but unused for one release, with a deprecation note in their help text and the CHANGELOG, then remove them: nothing breaks now, but they are flags that do nothing

operator approve and operator run keep their own gateway flags either way. The person-only confirmation for operator approve comes after #37, as planned on #35.

Checks pass locally (396 tests); CI was still running when this was posted. Reply here with a number or your own answer; shipmill takes this up on the tick after your reply.

@romamo

romamo commented Oct 9, 2026

Copy link
Copy Markdown
Collaborator

Decision by @romamo, given in chat; posted by Claude on his behalf.

1. Remove the --gateway-url, --gateway-ca, --gateway-cert and --gateway-key flags of cloudfall mcp serve, as this PR does, with the removal named in the CHANGELOG. 0.6.0 is still a release candidate, so no stable release has promised them.

@shipmill-romamo shipmill-romamo Bot removed the needs-decision A shipmill session asked a question here; waits for a reply label Oct 9, 2026
shipmill-romamo Bot and others added 2 commits October 9, 2026 11:13
An agent over MCP could call operator_approve and run and verify its own
proposal. operator approve is now mcp=False like decisions approve, and
out of PROJECT_COMMANDS; the mcp serve gateway flags only that tool used
are removed. Docs and the server instructions say a person approves from
a shell.

Part of #35

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Unreleased entries for cloudfall mcp serve still listed the alert
gateway operator_approve verifies against and operator_approve running in
one call; #38 took the tool off the server, so they now say it is gone.

Part of #35

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shipmill-romamo
shipmill-romamo Bot force-pushed the fix/35-operator-approve-off-mcp branch from a9022a7 to f668590 Compare October 9, 2026 08:17
shipmill-romamo Bot added a commit that referenced this pull request Oct 9, 2026
operator approve ran a proposal's playbook and its verify step on any
shell call, so an agent with a shell could approve its own proposal. It
now follows decisions approve (#37): requires_person=True, and ctx.attest
asks the person to type the proposal id before anything runs. No flag
answers it, --yes and a raw payload's "yes" included; off a terminal it
exits 4 with PERSON_REQUIRED, a mistyped id with ATTESTATION_MISMATCH,
and the proposal stays proposed. operator show is the preview.

A person's approval on the receipt records approval.via (terminal; a
human approval written before reads as unknown; a policy's has none),
reusing ApprovalChannel from the decision record. The field is optional
in operator-proposal.schema.json.

requires_person implies mcp=False, so on its own this breaks
`mcp serve --project`: its bound gateway_url no longer names a served
tool (MCP_BIND_UNKNOWN). It lands after #38, which takes the gateway
flags off mcp serve.

Part of #35

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shipmill-romamo
shipmill-romamo Bot merged commit e8a2195 into main Oct 9, 2026
1 check passed
@shipmill-romamo
shipmill-romamo Bot deleted the fix/35-operator-approve-off-mcp branch October 9, 2026 08:21
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