Add `PATCH /api/mcp/servers/{name}` endpoint that accepts `{"enabled": bool}`,
updates `mcp_servers.<name>.enabled` in config.yaml, and calls `reload_config()`.
Mirrors the existing DELETE pattern.
Also wire the previously-defined-but-unrouted `_handle_mcp_server_delete` into
`handle_delete`, and `_handle_mcp_server_update` into a new `handle_put` +
`do_PUT` in server.py — fixing a pre-existing bug where those handlers existed
but were never reachable over HTTP.
UI: add a toggle button in each MCP server row in the system settings panel
(panels.js). Clicking it calls PATCH and reloads the list. Toggle button is
styled with `.mcp-toggle-enabled` / `.mcp-toggle-disabled` CSS classes. The
`toggle_supported` flag in the list response is now `True`.
i18n: add 5 new keys (`mcp_enable_server`, `mcp_disable_server`,
`mcp_enabled_toast`, `mcp_disabled_toast`, `mcp_toggle_failed`) to all 9
non-English locales (English values as placeholder translations).
Tests: add `TestMcpToggle` class with 7 tests covering disable, enable,
404-not-found, empty name, missing field, response payload, and URL-encoded name.
Update `test_empty_config` and visibility panel assertions to reflect
`toggle_supported: True` and the new toggle button in panels.js.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
"""Regression tests for issue #696 — MCP server visibility panel MVP."""
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
def read(relpath: str) -> str:
|
|
return (ROOT / relpath).read_text(encoding="utf-8")
|
|
|
|
|
|
def test_settings_system_panel_contains_readonly_mcp_visibility_section():
|
|
html = read("static/index.html")
|
|
assert 'data-i18n="mcp_servers_title"' in html
|
|
assert 'id="mcpServerList"' in html
|
|
assert 'class="mcp-restart-hint"' in html
|
|
assert 'id="mcpAddFormWrap"' not in html
|
|
assert 'onclick="showMcpAddForm()"' not in html
|
|
|
|
|
|
def test_mcp_panel_renders_status_badges_tool_counts_and_empty_error_states():
|
|
js = read("static/panels.js")
|
|
assert "function _mcpStatusLabel" in js
|
|
assert "mcp-status-badge" in js
|
|
assert "mcp-tool-count" in js
|
|
assert "mcp-empty-state" in js
|
|
assert "mcp-error-state" in js
|
|
assert "toggleMcpServer" in js
|
|
assert "mcp-toggle-btn" in js
|
|
assert "api('/api/mcp/servers')" in js
|
|
assert "mcp-delete-btn" not in js
|
|
assert "showMcpAddForm" not in js
|
|
assert "saveMcpServer" not in js
|
|
|
|
|
|
def test_mcp_i18n_includes_visibility_status_labels():
|
|
i18n = read("static/i18n.js")
|
|
for key in [
|
|
"mcp_status_active",
|
|
"mcp_status_configured",
|
|
"mcp_status_disabled",
|
|
"mcp_status_invalid_config",
|
|
"mcp_tool_count",
|
|
"mcp_enabled_yes",
|
|
"mcp_enabled_no",
|
|
"mcp_toggle_followup",
|
|
]:
|
|
assert key in i18n
|