Playwright sweep: 5/5 scenarios passed.
Verified against a fresh mcpproxy build: populated instance (13 tools, 1 enabled + 1 disabled server)
and an empty instance. Covers US1 (global listing), US2 (search + sort), US3 (batch),
and the empty-state edge case. Backend (storage + httpapi + CLI) covered by Go table/handler/command tests;
GET /api/v1/tools asserted in the API E2E suite.
Expected: Open /tools with 13 tools across an enabled + a disabled server.
Observed: Dense table renders all tools; Total/Enabled/Disabled/Pending cards populated and consistent; sidebar Tools entry shows a live count badge.
Expected: Type 'echo' in the search box (debounced).
Observed: Only tools matching name/description/server remain; disabled/config-denied matches are not hidden.
Expected: Click the Tool column header twice.
Observed: Sort direction toggles asc/desc; the first row changes between the two directions.
Expected: Click select-all.
Observed: Batch action bar appears with a selection count and Enable/Disable actions.
Expected: Click 'Disable selected'.
Observed: Action runs grouped by server via the existing per-tool endpoint and reports a per-tool success/failure summary (quarantine-pending tools surface as failures, not silently swallowed).
Expected: Open /tools on an instance with no servers.
Observed: Page renders an explicit empty state; stat cards show 0; no error.