You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fast-forward-compatible merge that brings halo-main up to the PR branch
tip. Cherry-picks already on halo-main (f7694c8, f548de1, c3e99ac,
ba2dcad) are byte-identical to their PR-branch originals (6032ed8,
d584b16, b5f0a0c, 7bc7c73), so the 3-way merge resolves cleanly and the
resulting tree matches the PR tip.
Brings in:
- Spec 047 (CPU hotpath fix + coalescer + SSE payload embed)
- Spec 048 (tray refetch elimination)
- Spec 046 (local launcher for HTTP/SSE upstreams + onboarding wizard v2)
- Spec 044 phase H diagnostics counters
- Spec 042 telemetry tier 2 finalization
- The 3 PR-smart-mcp-proxy#463 commits that depend on the Spec 047 coalescer:
- perf(runtime): build servers.changed payload lazily in coalescer drainer
- fix(runtime): honour app-shutdown cancellation in coalescer drainer
- fix(sse): plumb SecurityScan via management.ListServers
- All other upstream-merged fixes between 2b9b5f9 and 7bc7c73
Authorized force-push equivalent: the user explicitly requested halo-main
be set to the PR branch tip; force-push was blocked by the git MCP and
the sandbox lacks raw-git auth, so we take the merge-commit path which
achieves tree-equality without rewriting halo-main history.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts:
# .gitignore
# oas/docs.go
Copy file name to clipboardExpand all lines: CLAUDE.md
+51Lines changed: 51 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -157,6 +157,53 @@ go test -race ./internal/... -v # Race detection
157
157
158
158
**E2E Prerequisites**: Node.js, npm, jq, built mcpproxy binary.
159
159
160
+
### Verifying Web UI changes (Playwright + rich HTML report)
161
+
162
+
When you modify the Web UI (any Vue file under `frontend/src/`), verify it end-to-end with a Playwright sweep that captures screenshots and packages them into a self-contained HTML report. This is the same workflow used to verify Spec 046 v2 — see `specs/046-local-first-onboarding/verification/` for a worked example.
163
+
164
+
The pattern, in order:
165
+
166
+
1.**Stand up a fresh mcpproxy.** Use a throwaway data-dir so persisted state doesn't bleed between runs:
executablePath: '/Users/user/Library/Caches/ms-playwright/chromium-1217/chrome-mac-arm64/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing',
191
+
},
192
+
},
193
+
});
194
+
```
195
+
4. **Write the spec.** Use `data-test` attributes already on the components (the project convention). For new components, add them. Drive scenarios with `page.locator('[data-test="..."]')`. Always use `page.waitForLoadState('domcontentloaded')` — `networkidle` hangs because of the SSE channel. Snapshot each state with `page.screenshot({ path: ... })`. Number screenshots in execution order so the report renders left-to-right.
196
+
5. **Run.** `./node_modules/.bin/playwright test --reporter=list`. Iterate until green.
197
+
6. **Build the rich HTML report.** A short Python script that base64-embeds each PNG and wraps it in a styled `<details>` per scenario produces a single self-contained HTML file the user can open offline. Pattern: top summary card with pass/fail counts, then one collapsible per scenario with `Expected` / `Observed` / inline screenshot. The reference implementation is `/tmp/wizard-v2-verify/build-report.py` from the v2 work — clone it and update the `SCENARIOS` list. Output goes to `specs/<feature>/verification/report.html`.
198
+
7. **Drop screenshots + report alongside the spec.** Always commit them with the spec changes — they're part of the trace.
199
+
8. **Surface the report.** End your reply with `open <path-to-report.html>` so the user can review without re-running the suite.
200
+
201
+
Key gotchas:
202
+
- The wizard's `<dialog>` element renders as `[open]` only when the Vue store sets it. To assert open/closed state robustly, query the dialog property in `page.evaluate()`, not aria-hidden or styling.
203
+
- `pkill -f 'mcpproxy ... <port>'` matches the merge-detection regex in user hooks. Ignore the `Merge-detection trigger` notifications when no actual merge happened.
204
+
- The default config from a stub file does NOT trigger `applyFirstRunDockerIsolation` — that only runs when the config file is absent at boot. To test the "Docker auto-enabled" path, either let mcpproxy create the config or pre-set `docker_isolation.enabled: true` in your stub.
205
+
- For browser-driven verification of subtle states (badge counts, empty/loaded transitions), prefer the Playwright spec over ad-hoc screenshots from the chrome-in-chrome MCP — the spec is reproducible and a CI agent can re-run it.
@@ -719,6 +766,10 @@ See `docs/prerelease-builds.md` for download instructions.
719
766
- No new persistent storage. Diagnostic state lives on in-memory stateview snapshot. Fix-attempt audit rows reuse existing activity log (`ActivityBucket` in BBolt). Telemetry counters are in-memory only (consistent with spec 042). (044-diagnostics-taxonomy)
720
767
- Markdown (agent instruction files, wiki articles); optionally shell or AppleScript helpers for bootstrap idempotency + Paperclip AI (paperclipai/paperclip, MIT) running locally on loopback :3100; Synapbus on kubic; Anthropic API via Paperclip's Claude Code subprocess adapter (045-paperclip-cockpit)
721
768
- Paperclip's embedded Postgres (existing, port 54329); Synapbus DB (existing); no new storage in mcpproxy-go (045-paperclip-cockpit)
769
+
- Go 1.24 (toolchain go1.24.10); Swift 5.9 (macOS 13+); TypeScript 5.9 / Vue 3.5 (frontend) + `go.etcd.io/bbolt` (existing), `go.uber.org/zap` (existing), `github.com/mark3labs/mcp-go` (existing). No new deps. (047-cpu-hotpath-fix)
770
+
- BBolt (`~/.mcpproxy/config.db`) — read-only on the hot path; no schema change. (047-cpu-hotpath-fix)
771
+
- Swift 5.9 (macOS 13+); Go 1.24 only for the verification harness, no Go changes in scope. + SwiftUI/AppKit (existing), Combine (existing for the periodic timer pattern). No new deps. (048-tray-refetch-elimination)
772
+
- None. Pure in-memory state. (048-tray-refetch-elimination)
722
773
723
774
## Recent Changes
724
775
- 001-update-version-display: Added Go 1.24 (toolchain go1.24.10)
Both packages ship a hardened `systemd` unit and start the service automatically. Repository signing key fingerprint: `3B6F A1AD 5D53 59DA 51F1 8DDC E1B5 9B9B A1CB 8A3B`.
80
87
81
88
For one-off `.deb` / `.rpm` downloads (air-gapped installs), grab them from the [latest release](https://github.com/smart-mcp-proxy/mcpproxy-go/releases/latest).
Copy file name to clipboardExpand all lines: docs/configuration.md
+51-2Lines changed: 51 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -147,8 +147,9 @@ MCPProxy looks for configuration in these locations (in order):
147
147
|`args`| array | No | Command arguments |
148
148
|`url`| string | Yes*| Server URL (required for `http`/`sse`/`streamable-http` protocols) |
149
149
|`headers`| object | No | HTTP headers for HTTP-based protocols |
150
-
|`working_dir`| string | No | Working directory for stdio servers (default: current directory) |
151
-
|`env`| object | No | Environment variables for stdio servers |
150
+
|`working_dir`| string | No | Working directory for stdio servers, or for the locally-launched child of an HTTP/SSE server (default: current directory) |
151
+
|`env`| object | No | Environment variables for stdio servers, or for the locally-launched child of an HTTP/SSE server |
152
+
|`launcher_wait_timeout`| duration | No | When `command` is set together with an HTTP/SSE `url`, how long mcpproxy waits for that URL to become reachable after spawning the child (e.g. `"15s"`, default `"30s"`) |
152
153
|`oauth`| object | No | OAuth configuration (see [OAuth Configuration](#oauth-configuration)) |
153
154
|`isolation`| object | No | Per-server Docker isolation settings (see [Docker Isolation](#docker-isolation)) |
154
155
|`enabled`| boolean | No | Enable/disable server (default: `true`) |
@@ -210,6 +211,54 @@ MCPProxy looks for configuration in these locations (in order):
210
211
}
211
212
```
212
213
214
+
### Locally-launched HTTP / SSE servers
215
+
216
+
By default `command` is only used for `stdio` servers. When you set `command`
217
+
together with an HTTP/SSE `url` and an explicit `protocol` of `http`, `sse`,
218
+
or `streamable-http`, mcpproxy will:
219
+
220
+
1. Spawn the command (with `args`, `env`, `working_dir`, and Docker isolation
221
+
exactly like a stdio server).
222
+
2. Wait up to `launcher_wait_timeout` (default 30s) for `url` to accept a TCP
223
+
connection.
224
+
3. Connect via the configured HTTP/SSE transport.
225
+
4. Own the child's lifecycle — the process is stopped (`SIGTERM`, then
226
+
`SIGKILL` after a grace period) on disconnect, restart, server-disable, or
227
+
mcpproxy shutdown. Unexpected exits trigger an automatic disconnect, which
MCPProxy is available on the [Arch User Repository](https://aur.archlinux.org/) as [`mcpproxy-bin`](https://aur.archlinux.org/packages/mcpproxy-bin), which installs the official upstream binary plus a hardened systemd unit.
The package installs `mcpproxy` to `/usr/bin` and ships a systemd user unit at `/usr/lib/systemd/user/mcpproxy.service`.
91
+
92
+
Enable it with:
93
+
:::note Update cadence
94
+
95
+
Unlike the apt/dnf repositories above, AUR is community-driven: new versions land via the `mcpproxy-bin` PKGBUILD being bumped, not via a project-controlled mirror. The package is currently kept current by automation in the maintainer's [updater repo](https://github.com/JasonLandbridge/Arch-Linux-AUR-Packages-Updater), so bumps usually appear within a day of a GitHub release. If `yay` reports an old version after a recent release, you can flag the package "out-of-date" on AUR or fall back to the [Tarball install](#tarball-any-distro) below.
96
+
97
+
:::
98
+
76
99
### Debian / Ubuntu — direct `.deb` download (fallback)
77
100
78
101
If the apt repository isn't reachable (air-gapped installs, behind corporate proxies blocking `mcpproxy.app`, etc.), download the `.deb` from the [releases page](https://github.com/smart-mcp-proxy/mcpproxy-go/releases) and install it locally.
0 commit comments