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 .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ body:
attributes:
label: Version or exact commit
description: Provide the tag or full commit SHA you tested.
placeholder: v0.2.1 or a 40-character commit
placeholder: v0.2.2 or a 40-character commit
validations:
required: true
- type: dropdown
Expand Down
20 changes: 19 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,23 @@ All notable changes to Agent Browser are recorded here. The format follows

## [Unreleased]

## [0.2.2] - 2026-09-04

### Added

- `server.json` at the repository root, so Agent Browser can be published to the official MCP
Registry as `io.github.AetherAI3/agent-browser`. It lists both clients — the npm and PyPI
`aether-browser` packages — each started as `aether-browser mcp` over stdio, with
`AGENT_BROWSER_URL` and the two tokens declared as optional environment variables.
- Registry ownership proof carried by the packages themselves: an `mcpName` field in the npm
client's `package.json`, and an `mcp-name` marker at the top of the PyPI client's README,
which is that package's long description. The registry verifies both against live package
metadata, so this is the first release that can be published to it.

### Changed

- Version bumped to 0.2.2 across the runtime, both clients, the image label, and the Compose
tag. No runtime behaviour changes, and the API contract stays `api_version: "v1"`.
## [0.2.1] - 2026-09-04

### Fixed
Expand Down Expand Up @@ -106,7 +123,8 @@ release and it carries the final naming throughout.
fixed high-or-higher findings, not an absence of vulnerabilities; see
[`docs/RELEASE_EVIDENCE.md`](docs/RELEASE_EVIDENCE.md) for the full posture.

[Unreleased]: https://github.com/AetherAI3/agent-browser/compare/v0.2.1...HEAD
[Unreleased]: https://github.com/AetherAI3/agent-browser/compare/v0.2.2...HEAD
[0.2.2]: https://github.com/AetherAI3/agent-browser/releases/tag/v0.2.2
[0.2.1]: https://github.com/AetherAI3/agent-browser/releases/tag/v0.2.1
[0.2.0]: https://github.com/AetherAI3/agent-browser/releases/tag/v0.2.0
[0.1.0]: https://github.com/AetherAI3/agent-browser/releases/tag/v0.1.0
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
FROM python:3.11-slim-bookworm@sha256:528257d48c1da0dcecc2e725d1ae34498d60c965f1241e39cd6a85a8859bdf84

LABEL org.opencontainers.image.title="Agent Browser" \
org.opencontainers.image.version="0.2.1" \
org.opencontainers.image.version="0.2.2" \
org.opencontainers.image.source="https://github.com/AetherAI3/agent-browser" \
org.opencontainers.image.documentation="https://github.com/AetherAI3/agent-browser/blob/main/THIRD_PARTY_NOTICES.md"

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ cleanup. The API and the live view are different interfaces to that shared resou
independent automation paths. See [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).

> [!IMPORTANT]
> **Agent Browser v0.2.1 is source-first and self-hosted.** It is not a hosted service, and
> **Agent Browser v0.2.2 is source-first and self-hosted.** It is not a hosted service, and
> the v0.x noVNC surface is unauthenticated and meant for numeric loopback on a machine you control.
> No Chrome-containing image, image tar, or public layer cache is distributed unless separate
> redistribution authorization is documented.
Expand Down
2 changes: 1 addition & 1 deletion clients/node/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ rejects unknown fields.

## Status

`0.2.1` tracks Agent Browser `v0.2.1` and its `api_version: "v1"` contract, and is versioned in
`0.2.2` tracks Agent Browser `v0.2.2` and its `api_version: "v1"` contract, and is versioned in
lockstep with the PyPI client. Issues and design discussion are welcome on
[the repository](https://github.com/AetherAI3/agent-browser/issues).

Expand Down
3 changes: 2 additions & 1 deletion clients/node/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"name": "aether-browser",
"version": "0.2.1",
"version": "0.2.2",
"mcpName": "io.github.AetherAI3/agent-browser",
"description": "Client and CLI for Agent Browser by Aether AI: drive one self-hosted Chrome session over a closed HTTP API and watch or take over that same session through noVNC.",
"license": "Apache-2.0",
"author": "Aether AI",
Expand Down
4 changes: 3 additions & 1 deletion clients/python/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
<!-- mcp-name: io.github.AetherAI3/agent-browser -->

# aether-browser

Client and CLI for **[Agent Browser](https://github.com/AetherAI3/agent-browser) by Aether AI** —
Expand Down Expand Up @@ -119,7 +121,7 @@ rejects unknown fields.

## Status

`0.2.1` tracks Agent Browser `v0.2.1` and its `api_version: "v1"` contract, and is versioned in
`0.2.2` tracks Agent Browser `v0.2.2` and its `api_version: "v1"` contract, and is versioned in
lockstep with the npm client. Issues and design discussion are welcome on
[the repository](https://github.com/AetherAI3/agent-browser/issues).

Expand Down
2 changes: 1 addition & 1 deletion clients/python/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ build-backend = "hatchling.build"
# tests/test_packaging.py fails the build if the two ever drift apart.
[project]
name = "aether-browser"
version = "0.2.1"
version = "0.2.2"
description = "Client and CLI for Agent Browser by Aether AI: drive one self-hosted Chrome session over a closed HTTP API and watch or take over that same session through noVNC."
readme = "README.md"
requires-python = ">=3.10"
Expand Down
2 changes: 1 addition & 1 deletion clients/python/src/aether_browser/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,4 @@
"session",
]

__version__ = "0.2.1"
__version__ = "0.2.2"
2 changes: 1 addition & 1 deletion clients/python/src/aether_browser/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
NOVNC_URL = "http://127.0.0.1:6080/vnc.html"
# The published source tag for this client. `up` builds this exact tree, so the container
# and the client always speak the same api_version.
SOURCE_TAG = "v0.2.1"
SOURCE_TAG = "v0.2.2"

_COLOR = sys.stdout.isatty() and not os.environ.get("NO_COLOR")

Expand Down
2 changes: 1 addition & 1 deletion clients/python/tests/test_mcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ def create_session(self, **_: Any) -> _FakeSession:
def health(self, **_: Any) -> dict[str, Any]:
return {
"status": "ok",
"version": "0.2.1",
"version": "0.2.2",
"browser_ready": True,
"session_active": False,
"slots_available": 1,
Expand Down
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ services:
build:
context: .
dockerfile: Dockerfile
image: agent-browser:0.2.1
image: agent-browser:0.2.2
# Host networking makes the numeric loopback binds below refer to the host
# loopback interface. Do not replace this with bridge port publishing:
# websockify would then need a container-interface listener reachable by peers.
Expand Down
8 changes: 4 additions & 4 deletions docs/launch.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Agent Browser launch kit

> This kit accompanies `v0.2.1`. The repository is public, and the Node and Python clients are
> This kit accompanies `v0.2.2`. The repository is public, and the Node and Python clients are
> released version for version as [`aether-browser` on npm](https://www.npmjs.com/package/aether-browser)
> and [`aether-browser` on PyPI](https://pypi.org/project/aether-browser/). Publishing the copy below
> to any outside channel remains a deliberate, separate action. Chrome-containing images,
Expand All @@ -18,19 +18,19 @@
Python clients and CLIs, both with zero runtime dependencies.
- MCP: both clients serve the same nine-tool MCP interface over stdio with `aether-browser mcp`.
- Repository: <https://github.com/AetherAI3/agent-browser>
- Release: `v0.2.1` (stable patch, source-only runtime distribution).
- Release: `v0.2.2` (stable patch, source-only runtime distribution).
- Distribution: Apache-2.0 Aether-owned source; locally built container for the v0.x line.
- Boundary: no hosted-service claim, no remote noVNC claim, and no Chrome-containing image, image
tar, or public layer-cache publication unless separate redistribution authorization is documented.

## GitHub Release

### Agent Browser v0.2.1 — See what your agent sees
### Agent Browser v0.2.2 — See what your agent sees

Agent Browser runs one headed Google Chrome Stable session that an agent controls through a small JSON API
while a human watches or takes over the same local display through noVNC.

The v0.2.1 source release includes:
The v0.2.2 source release includes:

- explicit session ownership, expiry, vision budget, and idempotent cleanup;
- navigate, snapshot, click, type, scroll, and allowlisted key actions;
Expand Down
2 changes: 1 addition & 1 deletion docs/llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Rather than a headless browser the operator cannot see, it runs one headed sessi
participants share: the agent acts through JSON, the human watches the identical display and can
take the controls without starting a second browser or replaying a transcript.

Status: `v0.2.1`. The API contract is `api_version: "v1"`; it may still change within the
Status: `v0.2.2`. The API contract is `api_version: "v1"`; it may still change within the
pre-1.0 line. Both clients also serve an MCP server over stdio (`aether-browser mcp`).

## Interface
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "agent-browser"
version = "0.2.1"
version = "0.2.2"
description = "Self-hosted Chrome runtime for AI agents with API control and a live noVNC view."
readme = "README.md"
requires-python = ">=3.11"
Expand Down
87 changes: 87 additions & 0 deletions server.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"name": "io.github.AetherAI3/agent-browser",
"description": "Self-hosted Chrome for AI agents, with a live noVNC view a human can take over.",
"version": "0.2.2",
"websiteUrl": "https://aetherai3.github.io/agent-browser/",
"repository": {
"url": "https://github.com/AetherAI3/agent-browser",
"source": "github"
},
"packages": [
{
"registryType": "npm",
"identifier": "aether-browser",
"version": "0.2.2",
"runtimeHint": "npx",
"transport": {
"type": "stdio"
},
"packageArguments": [
{
"type": "positional",
"value": "mcp",
"valueHint": "mcp",
"isRequired": true,
"description": "Start the Agent Browser MCP server on stdio."
}
],
"environmentVariables": [
{
"name": "AGENT_BROWSER_URL",
"isRequired": false,
"description": "Base URL of your Agent Browser server. Defaults to http://127.0.0.1:8092."
},
{
"name": "AGENT_BROWSER_CONTROLLER_TOKEN",
"isRequired": false,
"isSecret": true,
"description": "Controller token, if the server runs authenticated."
},
{
"name": "AGENT_BROWSER_OBSERVER_TOKEN",
"isRequired": false,
"isSecret": true,
"description": "Observer token for read-only health and snapshot calls."
}
]
},
{
"registryType": "pypi",
"identifier": "aether-browser",
"version": "0.2.2",
"runtimeHint": "uvx",
"transport": {
"type": "stdio"
},
"packageArguments": [
{
"type": "positional",
"value": "mcp",
"valueHint": "mcp",
"isRequired": true,
"description": "Start the Agent Browser MCP server on stdio."
}
],
"environmentVariables": [
{
"name": "AGENT_BROWSER_URL",
"isRequired": false,
"description": "Base URL of your Agent Browser server. Defaults to http://127.0.0.1:8092."
},
{
"name": "AGENT_BROWSER_CONTROLLER_TOKEN",
"isRequired": false,
"isSecret": true,
"description": "Controller token, if the server runs authenticated."
},
{
"name": "AGENT_BROWSER_OBSERVER_TOKEN",
"isRequired": false,
"isSecret": true,
"description": "Observer token for read-only health and snapshot calls."
}
]
}
]
}
2 changes: 1 addition & 1 deletion src/agent_browser/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

from typing import Final

__version__: Final = "0.2.1"
__version__: Final = "0.2.2"

__all__ = ["__version__"]
2 changes: 1 addition & 1 deletion src/agent_browser/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -411,7 +411,7 @@ async def lifespan(application: FastAPI) -> Any:

application = FastAPI(
title="Agent Browser",
version="0.2.1",
version="0.2.2",
docs_url=None,
redoc_url=None,
openapi_url=None,
Expand Down
2 changes: 1 addition & 1 deletion src/agent_browser/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ class SessionRequest(EmptyRequest):
class HealthResponse(ClosedModel):
api_version: ApiVersion = API_VERSION
status: Literal["ok"] = "ok"
version: Literal["0.2.1"] = __version__
version: Literal["0.2.2"] = __version__
browser_ready: bool
session_active: bool
slots_available: int = Field(ge=0, le=1)
Expand Down
2 changes: 1 addition & 1 deletion tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def test_version_contract_is_consistent() -> None:
slots_available=1,
started_at=datetime.now(UTC),
)
assert __version__ == "0.2.1"
assert __version__ == "0.2.2"
assert response.version == __version__
assert response.api_version == API_VERSION == "v1"

Expand Down