feat: surface MCP server status in System Status page

Add per-tool in-memory call counters to the MCP module and a
GET /api/v1/status/mcp endpoint that joins them with the live tool
registry and endpoint config, then render it as a new card on the
System Status page with a one-click client-config copy button.

- app/mcp/stats.py: lock-guarded MCPStatsTracker (the mcp SDK runs sync
  tool bodies via anyio.to_thread.run_sync, so this is genuinely
  multi-threaded, unlike the async REST routes)
- app/mcp/server.py: instrument search_regulations, add get_mcp_status()
- app/config/settings.py: optional MCP_PUBLIC_URL override, required
  because the Vite proxy and reverse proxies rewrite the Host header
- StatusPage.tsx: MCP Server card, joins the existing parallel fetch

Counters are process-local by design; token usage is already persisted
by ModelUsageTracker since MCP calls route through ask().

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
wangwei
2026-08-03 11:37:22 +08:00
co-authored by Copilot
parent 73e79a610d
commit 31bbf80aeb
14 changed files with 621 additions and 10 deletions
+12
View File
@@ -212,6 +212,18 @@ class Settings(BaseSettings):
),
)
# Optional override for the URL shown on the System Status page and copied
# into client configs. Needed because request.base_url reflects the Host
# header, which the Vite dev proxy (changeOrigin: true) and reverse proxies
# that do not forward the original Host both rewrite.
mcp_public_url: str = Field(
default="",
description=(
"Externally reachable MCP endpoint URL, e.g. http://6.86.80.9:8000/mcp/. "
"Leave empty to derive it from the incoming request."
),
)
@lru_cache
def get_settings() -> Settings:
"""Return settings."""