First tagged release. Major-version bump to mark the new dual-MCP public
contract: the container now exposes two MCP endpoints on a single
port (3000) — /mcp (wpa-mcp itself) and /playwright-mcp (reverse
proxy for Microsoft Playwright MCP running inside the container's
network namespace). See
docs/design/13_Dual_MCP_Playwright_Design.md.
Added
- Dual-MCP architecture:
/playwright-mcpreverse proxy in front of a
containerised@playwright/mcp@0.0.70subprocess. The proxied browser
shares the container's netns, so it reaches captive portals on the WLAN
joined viawifi_connect— the only reliable path for WISPr / vendor
portal testing. The proxy injects aresult.instructionsstring into
theinitializeresponse so MCP clients surface "when to pick this
server" guidance automatically. ([#41], [#43]) - systemd daemon:
sudo make install-systemdinstalls a oneshot
service that launches the container, moves the WiFi phy into the
container's netns, and waits for health on boot. Uninstall with
sudo make uninstall-systemd. ([#40], [#42]) - Persistent credential store: Docker named volume
wpa-mcp-data
mounted at/home/node/.config/wpa-mcpso credentials added at runtime
viacredential_storesurvive container restarts, image rebuilds, and
host reboots. Baked certs undercerts/are re-imported (idempotent)
on every start. ([#40], [#42]) wifi_hs20_connect: Hotspot 2.0 / Passpoint auto-discovery via
ANQP queries; reusescredential_storefor certificates. (design)- Permanent-MAC restoration in Docker:
mac_mode=devicenow reads
permaddrfromip link showat daemon start and restores the real
hardware MAC before connecting, sinceiw phy set netnscauses the
kernel to assign a locally-administered MAC. ([#24], design) - CI test framework: YAML-driven test cases under
cicd/tests/with
buildandintegrationsuites, triggered via GitHub Actions
workflow_dispatch. ([#34]) - Functional integration tests: 13 MCP tool tests exercised over a
real Streamable HTTP transport. ([#39]) - User stories + traceability:
docs/user-stories/with stories for
all 22 MCP tools, plus cross-cutting (MAC, Docker netns) stories, each
mapped to an acceptance-criteria → test-case matrix. ([#37]) /prdand/user-storiesproject skills for the feature workflow
(PRD → user stories → test cases) described in
CLAUDE.md.
([#36])- Persistent NetworkManager unmanage:
sudo make nm-unmanagewrites
a drop-in under/etc/NetworkManager/conf.d/so the WiFi interface
stays unmanaged across reboots. (Docker Dev Plan §2.1) - Container entrypoint: deletes Docker bridge default route on start
(keeping the bridge subnet route) so WiFi becomes the sole default
oncewifi_connectestablishes a lease; includes preflight checks and
a sanity timer for the Playwright MCP subprocess. ([#42], [#43]) - Chromium pre-baked into the image:
playwright install-deps chromium+playwright install chromiumat build time,
PLAYWRIGHT_BROWSERS_PATH=/ms-playwright— required because the
runtime container has no default route (so no on-demand download is
possible).
Changed
wifi_scannow paginatesbss <id>instead of parsing
scan_results, avoiding truncation in dense RF environments
(scan_resultsbuffers at ~4 KiB). ([#44], [#45])- Documentation reorganised into
docs/reference/,docs/design/,
docs/operations/,docs/plans/,docs/user-stories/with a new
docs/README.mdmaster index. ([#36]) - README Reference section: fixed link rot after the docs reorg (all
links now point at the correct subfolder). docs/reference/00_Architecture.md: diagram and endpoint table
updated to show the/playwright-mcpproxy and the in-container
@playwright/mcpsubprocess.
Fixed
wifi_scantruncation in dense RF environments (see above). ([#44])
Internal
http-proxy-middleware@^3.0.5added as a dependency for the
/playwright-mcpreverse proxy.@playwright/mcp@0.0.70installed globally in the Docker image
(pinned; bump deliberately).- TypeScript build unchanged (
tsc).
Notes on public contract
- The only externally-exposed TCP port remains 3000. The
127.0.0.1:8931upstream for@playwright/mcpis an internal
implementation detail and is not part of the public contract. /mcptool surface is unchanged from 1.x — this is additive./playwright-mcpis a stateful Streamable HTTP endpoint
(Mcp-Session-Idround-trip required afterinitialize);/mcp
remains stateless.