Releases: ambient-code/mcp
v0.2.2
v0.2.2 (2026-02-16)
Bug Fixes
When semantic-release determines no release is needed, the build/publish steps are skipped and uv is never invoked. The post-job cache cleanup then fails because the cache directory was never created, marking the entire run as failed.
Disable caching since uv is only used conditionally (via uvx for builds).
Fixes: https://github.com/ambient-code/mcp/actions/runs/22051441188
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Detailed Changes: v0.2.1...v0.2.2
v0.2.1
v0.2.1 (2026-02-16)
Bug Fixes
The cache causes spurious failures in post-job cleanup when build steps are skipped (no new release), marking the run as failed.
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Detailed Changes: v0.2.0...v0.2.1
v0.2.0
v0.2.0 (2026-02-16)
Bug Fixes
- fix(ci): run ruff in autofix mode
Runs ruff check --fix and ruff format to apply auto-fixable lint and format corrections, then fails via git diff --exit-code if the working tree is dirty — meaning the developer forgot to run ruff locally before pushing. This gives a clear error message pointing them to the fix.
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
- style: apply ruff format to client.py
Pre-commit hooks caught one file needing reformatting.
- fix: merge implicit string concatenation for ruff compliance
Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com
- test: rewrite tests for new public-api client
- Remove obsolete tests for oc CLI-based client - Remove test_security.py (tested methods no longer exist) - Add test_formatters.py for output formatting - Update test_client.py for HTTP-based client - Update test_server.py for current 7 tools
All 40 tests pass with 70% coverage.
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Co-authored-by: Ambient Code ambient-code@redhat.com
When the virtual environment cache is restored, the .venv directory already exists, causing uv venv to fail. The --allow-existing flag allows uv to reuse or recreate the venv as needed.
Co-authored-by: Ambient Code ambient-code@redhat.com
Co-authored-by: Claude Opus 4.5 noreply@anthropic.com
The release workflow was failing because GITHUB_TOKEN (github-actions[bot]) cannot push directly to main when branch protection requires pull requests. On GitHub Free, the built-in GitHub Actions integration cannot be added as a bypass actor in rulesets.
Switch to authenticating via the ambient-code GitHub App using actions/create-github-app-token, which generates a short-lived token that can bypass the "Protect main" ruleset.
Requires repo secrets: RELEASE_APP_ID, RELEASE_APP_PRIVATE_KEY
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Features
- feat: add 18 new MCP tools for session management and observability (#27)
Add comprehensive session management and observability tools to the MCP server, expanding from 8 to 26 total tools. New capabilities include:
- Session lifecycle: get, update, restart, stop, delete (single + bulk) - Observability: logs, transcript, metrics retrieval - Organization: label/unlabel sessions (single + bulk, by name or label) - Discovery: list sessions filtered by label selectors - Bulk operations: delete/stop/restart/label/unlabel by name or label with dry_run preview, confirm safeguard, and 3-item safety limit
All bulk destructive operations require explicit confirm=true and support dry_run=true for safe preview. Label-based bulk ops resolve matching sessions first, then apply the operation.
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
- test: fill coverage gaps for bulk operations and server dispatch
Add 32 new tests covering previously untested paths:
Client layer: - _run_bulk dry_run path and partial failure handling - _run_bulk_by_label pipeline (delete/stop/restart by label) - _run_bulk_by_label with no matching sessions - bulk_label_sessions (success + dry_run) - bulk_unlabel_sessions (success + dry_run)
Server dispatch layer: - get_session, create_session_from_template, clone_session, update_session, get_session_logs, get_session_transcript, get_session_metrics, label_resource, unlabel_resource, list_sessions_by_label - Confirmation enforcement for all 8 TOOLS_REQUIRING_CONFIRMATION - Confirmed dispatch for bulk_label, bulk_unlabel, bulk_restart, and all 3 by-label bulk operations
Coverage: 72% → 81% overall (client 70→80%, server 63→83%)
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
- feat: add acp_create_session tool and hello-acp integration test
Add acp_create_session MCP tool for submitting AgenticSessions with custom prompts (vs template-only). Extract shared _apply_manifest() helper from create_session_from_template. Fix pod label selector bug in get_session_logs (agenticsession → agentic-session). Add first live integration test that creates a session, polls for marker output in logs, and cleans up.
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
- chore: add hello-acp demo (asciinema cast + GIF)
Claude Code UI simulation showing the full acp_create_session flow: dry-run, live creation, status polling, log verification, cleanup, and automated pytest run.
- chore: re-record hello-acp demo with real pytest output
Replace scripted typing-effects demo with raw pytest execution. Simpler script, smaller artifacts (GIF: 1.1MB → 42KB).
- fix: use SettingsConfigDict and re-record demo at 100 cols
Replace deprecated class Config with model_config = SettingsConfigDict() to eliminate PydanticDeprecatedSince20 warning. Re-record demo with 100-col terminal to prevent line wrapping.
- feat: replace pytest demo with full ACP workflow demo
New demo shows the actual user workflow: 1. Display the plan 2. Submit via acp_create_session (real API call) 3. Disconnect — session runs autonomously on cluster 4. Check session status via acp_list_sessions 5. Verify output via acp_get_session_logs
- docs: consolidate QUICKSTART + TRIGGER_PHRASES into README; fix ruff lint
Merge QUICKSTART.md and TRIGGER_PHRASES.md into a single comprehensive README.md with TOC. Delete the redundant files — users no longer need to hop between 4 docs to get started. Update CLAUDE.md cross-references.
Also includes pending fixes for ruff F541 (unnecessary f-strings) in demos/hello-acp-workflow.py that were failing CI, plus prior uncommitted work on the branch: public-api gateway docs, settings, and test updates.
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Replace direct OpenShift API authentication with HTTP requests to the public-api gateway service. This simplifies the MCP server by removing the oc CLI dependency and aligns with the platform's security model where the public-api is the single entry point for all clients.
Changes: - client.py: Rewrite to use httpx for HTTP requests to public-api - settings.py: Update ClusterConfig to point to public-api URL - server.py: Reduce to 7 supported tools (list, get, delete sessions) - formatters.py: Remove unused formatters - pyproject.toml: Replace aiohttp with httpx, update description
The public-api provides: - GET/POST/DELETE /v1/sessions endpoints - Bearer token auth via Authorization header - Project context via X-Ambient-Project header
Co-authored-by: Ambient Code ambient-code@redhat.com
Co-authored-by: Claude Opus 4.5 noreply@anthropic.com
Detailed Changes: v0.1.3...v0.2.0
v0.1.3
v0.1.3 (2026-02-10)
Bug Fixes
- Also clean root-owned dist/ and build/ dirs in release workflow (
b866b32)
The python-semantic-release Docker action creates dist/ and build/ directories in addition to egg-info, all owned by root. The previous fix only cleaned egg-info, so the build step still failed trying to write to the root-owned dist/ directory.
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
Detailed Changes: v0.1.2...v0.1.3
v0.1.2
v0.1.2 (2026-02-10)
Bug Fixes
- Use sudo to remove root-owned egg-info in release workflow (
127b208)
The python-semantic-release Docker action runs as root, creating src/mcp_acp.egg-info with root ownership. The subsequent cleanup step fails with "Permission denied" when trying to rm -rf as the runner user. Using sudo resolves this.
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
Detailed Changes: v0.1.1...v0.1.2
v0.1.1
v0.1.1 (2026-02-10)
Bug Fixes
- Clean stale egg-info before build in release workflow (
7e96f2a)
semantic-release runs setuptools internally via build_command, which creates a src/mcp_acp.egg-info directory. This stale directory causes the subsequent pyproject-build step to fail with: "error: Cannot update time stamp of directory 'src/mcp_acp.egg-info'"
Add rm -rf src/*.egg-info before the build step to prevent the collision.
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
Detailed Changes: v0.1.0...v0.1.1
v0.1.0
v0.1.0 (2026-02-10)
Bug Fixes
- Add cluster config setup for CI tests (
532159f)
Copy clusters.yaml.example to ~/.config/acp/clusters.yaml before tests to prevent FileNotFoundError in ACPClient initialization. This fixes 16 failing tests in test_security.py and related test failures.
Co-Authored-By: Claude Sonnet 4.5 noreply@anthropic.com
- Add environment to release workflow for trusted publishing (
028ad6e)
Add 'environment: pypi' to the release workflow job to support PyPI trusted publishing. Some PyPI projects require an environment to be specified in the workflow for trusted publishing to work.
This should resolve the "Publisher with matching claims was not found" error.
Next steps: 1. Create a 'pypi' environment in GitHub repository settings 2. Configure trusted publisher on PyPI with environment name 'pypi'
Alternative: Use API token instead of trusted publishing by adding
PYPI_API_TOKEN secret and modifying the publish step.
Co-Authored-By: Claude Sonnet 4.5 noreply@anthropic.com
- Configure release workflow for Test PyPI (
3b33274)
Update release workflow to publish to Test PyPI first before production PyPI. This allows testing the release process safely.
Changes:
- Changed environment from 'pypi' to 'test-pypi'
- Added repository-url for Test PyPI: https://test.pypi.org/legacy/
- Updated comments to reflect Test PyPI usage
Next steps: 1. Create 'test-pypi' environment in GitHub settings (or reuse existing 'pypi' environment) 2. Configure trusted publisher on Test PyPI at https://test.pypi.org/manage/account/publishing/ 3. Test the release workflow 4. Once validated, switch back to production PyPI
Co-Authored-By: Claude Sonnet 4.5 noreply@anthropic.com
Fix ImportError in test_server.py by updating imports to use the correct module and function names. Formatting functions were moved from server.py to formatters.py and don't have underscore prefixes.
Changes:
- Import formatting functions from mcp_acp.formatters instead of mcp_acp.server
- Remove underscore prefixes from function names (format* -> format_*)
- Update all test method calls to use public function names
This resolves the CI import error: ImportError: cannot import name '_format_bulk_result' from 'mcp_acp.server'
Co-authored-by: Claude Sonnet 4.5 noreply@anthropic.com
Tools like acp_list_clusters, acp_whoami, acp_login, acp_switch_cluster, acp_add_cluster, and acp_list_workflows don't accept a project parameter.
The call_tool() function was auto-filling project for ALL tools, causing these handlers to fail with 'unexpected keyword argument project'.
Added TOOLS_WITHOUT_PROJECT set to exclude these tools from project auto-fill logic.
Replace image links to .mp4 files with HTML5
- Add poster images (thumbnails) to all 8 demos
- Remove redundant "Watch Demo" links (video controls handle this)
- Improves user experience and demo accessibility
Co-authored-by: Claude Sonnet 4.5 noreply@anthropic.com
- Remove pip cache from CI workflow (using uv not pip) (
b518d4b)
The setup-python action was configured with cache: 'pip' but we use uv for package management. This caused CI failures with: "Cache folder path is retrieved for pip but doesn't exist on disk"
Caching is already handled by setup-uv action with enable-cache: true.
Co-Authored-By: Claude Sonnet 4.5 noreply@anthropic.com
- Remove pip cache from release workflow (
2908dbe)
Remove cache: 'pip' from Python setup since we're using uv, not pip. This eliminates the harmless but noisy cache warning: "Cache folder path is retrieved for pip but doesn't exist on disk"
We use uv for all package management, which has its own caching via the setup-uv action with enable-cache: true.
Co-Authored-By: Claude Sonnet 4.5 noreply@anthropic.com
- Reuse existing pypi environment for Test PyPI publishing (
cc8d9cf)
Change from 'test-pypi' to 'pypi' environment to reuse the existing environment configured for the ambient-code organization.
The environment name doesn't determine the publishing destination - that's controlled by the repository-url parameter. Using the existing 'pypi' environment simplifies setup and reuses infrastructure already in place.
Publishing destination:
- repository-url: https://test.pypi.org/legacy/ → Test PyPI (current)
- (no repository-url) → Production PyPI (future)
Co-Authored-By: Claude Sonnet 4.5 noreply@anthropic.com
GitHub doesn't render the poster attribute on HTML5 video tags, so thumbnails weren't showing. Display image separately above each video player for visual preview before playing.
- Add
tag above each
- Remove poster attribute (not supported by GitHub)
- Thumbnails now visible in demo gallery
Co-authored-by: Claude Sonnet 4.5 noreply@anthropic.com
-
Update tests to match implementation and remove obsolete tests (
d8c909a) -
Removed 3 obsolete config validation tests (tested non-existent _validate_config method)
-
Fixed test_delete_session_dry_run to expect correct response format
-
Fixed test_bulk_stop_sessions with proper mocking of _get_resource_json
-
Fixed server bulk operation wrappers to use proper async functions instead of lambdas
-
Updated test assertions to match actual formatter output
-
All 45 tests now pass
Co-Authored-By: Claude Sonnet 4.5 noreply@anthropic.com
Replace incorrect hardcoded apiVersion "agenticplatform.io/v1" with "vteam.ambient-code/v1alpha1" in clone_session and create_session_from_template manifests.
Fixes #19
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
The semantic-release action runs in its own container where uvx is not available. Use pip install build && python -m build instead.
- Use testpypi environment for Test PyPI publishing (
6860e42)
Update workflow to use the newly created 'testpypi' GitHub environment.
This provides clear separation between test and production publishing environments and follows best practices for environment management.
Next step: Configure Test PyPI trusted publisher at https://test.pypi.org/manage/account/publishing/ with:
- Owner: ambient-code
- Repository: mcp
- Workflow: release.yml
- Environment: testpypi
Co-Authored-By: Claude Sonnet 4.5 noreply@anthropic.com
Documentation
Changes
1. Fixed Version Numbers (4 locations) - README.md lines 16, 124: Use dist/mcp_acp-*.whl pattern - QUICKSTART.md lines 47, 476: Use wildcard pattern instead of hardcoded version
2. Added OCP Login Note (2 locations) - README.md after line 186: Note about PR #558 frontend API - QUICKSTART.md after line 88: Same note
3. Converted Usage Examples to Natural Language (14 locations) - README.md lines 196-270: 12 Python function calls → natural language - demos/README.md line 101: Function call → workflow description
Example conversion: - Before: acp_list_sessions(project="my-workspace", status="running") - After: List running sessions in my-workspace
4. Fixed Dead Links (10 locations in README.md) Replaced links to consolidated documentation files: - USAGE_GUIDE.md → QUICKSTART.md (5 occurrences) - ARCHITECTURE.md → CLAUDE.md (2 occurrences) - DEVELOPMENT.md → CLAUDE.md (3 occurrences) - Removed CLEANROOM_SPEC.md reference
5. Updated First Command Example - Changed from "Use acp_whoami to check my authentication" - To: "List my ambient sessions that are older than a week"
Co-authored-by: Claude Sonnet 4.5 noreply@anthropic.com