Repository navigation
feat(tower): Control Tower 0.9 runbook tools (0.5.1) - #53
Conversation
Reader tools list runbooks, recommendations and executions; writer tools preview, execute, cancel and verify over Tower's runbook HTTP routes. Runbook parameters are the only structured argument, limited to 20 string-to-string entries. No approval or revocation tool is exposed.
With Tower 0.9 the model may recommend only an eligible runbook returned by tower.runbook_recommendations and must show its parameters and steps.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
🟡 Changes recommended
Active findings remain, including a critical deadline mismatch that can falsely report valid long-running executions as failed, plus metadata, input-validation, and release-documentation inconsistencies.
5 open issues
What changed in this PR
Adds local MCP support for Control Tower 0.9 versioned runbooks and prepares the 0.5.1 release, while preserving human-only approval and hosted Tower restrictions.
Changes:
- Added eight runbook reader and writer tools with bounded parameters and role-specific credentials.
- Updated investigation guidance, documentation, generated tool references, roadmap, README, and changelog.
- Added route, credential, schema, validation, and hosted-restriction tests.
- Bumped package, registry, and lockfile versions to 0.5.1.
| File | Description |
|---|---|
uv.lock |
Updates the locked package version to 0.5.1. |
tests/test_tower.py |
Tests runbook dispatch, credentials, routes, validation, schemas, and hosted restrictions. |
src/deep_agentic_core_mcp/tools/tower.py |
Defines runbook routes, validation, metadata, and connector dispatch. |
src/deep_agentic_core_mcp/prompts/registry.py |
Updates investigation guidance to use eligible Tower runbooks. |
src/deep_agentic_core_mcp/__init__.py |
Sets the package version to 0.5.1. |
server.json |
Updates MCP registry metadata to 0.5.1. |
ROADMAP.md |
Records the completed Control Tower 0.9 runbook milestone. |
README.md |
Documents the new local runbook capabilities. |
pyproject.toml |
Bumps the project release version. |
mkdocs.yml |
Adds the runbook guide to documentation navigation. |
docs/tower-0.9-runbooks.md |
Documents tools, routes, credentials, limits, and workflow behavior. |
docs/tools.md |
Regenerates the MCP tool reference with eight runbook tools. |
CHANGELOG.md |
Adds the 0.5.1 release notes and compatibility details. |
This pull request requires changes.
Review effort: Lite
| "runbook_execute": ("/runbook-executions/{execution_id}/execute", {"preview_digest"}), | ||
| "runbook_cancel": ("/runbook-executions/{execution_id}/cancel", set()), |
There was a problem hiding this comment.
Fixed: tower.runbook_execute now waits up to 150 seconds (the 120-second runbook budget plus lease slack), and the HTTP worker receives the matching timeout. All other Tower tools keep the 10-second deadline.
| if set(args) - allowed: | ||
| return {"ok": False, "error": "Unsupported Tower arguments"} | ||
| parameters = args.pop("parameters", None) if operation == "runbook_preview" else None | ||
| if parameters is not None and not ( | ||
| isinstance(parameters, dict) | ||
| and len(parameters) <= MAX_RUNBOOK_PARAMETERS | ||
| and all(isinstance(k, str) and isinstance(v, str) for k, v in parameters.items()) | ||
| ): | ||
| return {"ok": False, "error": "Runbook parameters must map strings to strings"} | ||
| if any(not isinstance(value, (str, int)) or isinstance(value, bool) for value in args.values()): | ||
| return {"ok": False, "error": "Tower arguments must be scalar strings or integers"} | ||
| if parameters is not None: | ||
| args["parameters"] = parameters |
There was a problem hiding this comment.
Fixed: required arguments, including a non-null parameters, are now checked against a shared REQUIRED_ARGUMENTS table before the worker is spawned. The same table generates the advertised schemas.
| ## Control Tower 0.9.0 runbooks (MCP 0.5.1) | ||
|
|
||
| Local stdio adds eight `tower.runbook*` tools (twenty `tower.*` tools in total). | ||
| Reader tools list installed runbooks, recommendations for an incident and | ||
| execution history. Writer tools preview a catalog version with string | ||
| parameters, execute the exact human-approved digest, cancel and verify. There is | ||
| still no approval or revocation tool: a human approves through Tower HTTP/CLI | ||
| with the separate approver credential. Recommendations come only from installed | ||
| runbook versions, and hosted MCP still refuses Tower tools. See the | ||
| [runbook tools guide](docs/tower-0.9-runbooks.md). |
There was a problem hiding this comment.
Fixed: the current-surface heading now says 0.5.1 and lists the tower.* tools, including the runbook tools.
| ## Control Tower 0.9.0 runbook tools (MCP 0.5.1) | ||
|
|
||
| Tower Phase 9 ships versioned runbooks with exact-digest approval, bounded steps, | ||
| compensation, cancellation, reconciliation and verified recovery. MCP 0.5.1 adds | ||
| local `tower.runbooks`, `tower.runbook_recommendations`, | ||
| `tower.runbook_executions`, `tower.runbook_execution`, `tower.runbook_preview`, | ||
| `tower.runbook_execute`, `tower.runbook_cancel` and `tower.runbook_verify`. | ||
| Approval stays human-only through Tower; hosted MCP keeps rejecting Tower tools | ||
| until per-user credential binding (Phase 6). Tower's existing | ||
| `deep-agentic-core-mcp>=0.3.6,<1` range admits 0.5.1, so no Tower change is needed. | ||
| See [runbook tools](docs/tower-0.9-runbooks.md). |
There was a problem hiding this comment.
Fixed: Release Status now names 0.5.1 as current and keeps 0.5.0 as history.
tower.runbook_execute now waits up to 150 seconds (Tower's 120-second runbook budget plus lease slack) and is advertised as slow; other Tower tools keep the ten-second deadline. Required arguments are checked from one shared table before any worker is spawned, and the same table drives the input schemas.



Adds local MCP tools for Control Tower 0.9.0's automated runbooks (DeepAgentLabs/agenticops-control-tower#42) and prepares the 0.5.1 patch release.
Changes
tower.runbooks,tower.runbook_recommendations,tower.runbook_executions,tower.runbook_executiontower.runbook_preview,tower.runbook_execute,tower.runbook_cancel,tower.runbook_verifyparametersis the only structured argument. It accepts at most 20 string-to-string entries and is allowed only on preview.tower.investigationprompt now recommends only eligible runbooks returned bytower.runbook_recommendations.docs/tower-0.9-runbooks.md(in nav), regenerateddocs/tools.md, plus README, ROADMAP and CHANGELOG updates.pyproject.toml,__init__,server.jsonanduv.lock.Validation
make check: 345 passed, 7 skippedHosted MCP still hides and refuses all
tower.*tools. Docs links to Towerv0.9.0resolve once that tag is pushed.