Spec 050 — Global Tools Overview Page (issue #437)

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.

✅ US1 — Loaded global table + stat cards + sidebar badge

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.

✅ US2 — Substring search narrows the list

Expected: Type 'echo' in the search box (debounced).

Observed: Only tools matching name/description/server remain; disabled/config-denied matches are not hidden.

✅ US2 — Column sort toggles order

Expected: Click the Tool column header twice.

Observed: Sort direction toggles asc/desc; the first row changes between the two directions.

✅ US3 — Batch selection action bar

Expected: Click select-all.

Observed: Batch action bar appears with a selection count and Enable/Disable actions.

✅ US3 — Batch disable executes + reports

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).

✅ Edge case — Empty state

Expected: Open /tools on an instance with no servers.

Observed: Page renders an explicit empty state; stat cards show 0; no error.