# z.ai MCP endpoints via local proxy ## What we wanted - Allow apps to use z.ai MCP servers **without configuring z.ai keys** in those apps. - Keep secrets out of URLs (avoid query-string auth). - Make each MCP capability toggleable. ## What we got When `proxy.zai.mcp.enabled=true`, the proxy can expose MCP endpoints under its own base URL. ### 1) Web Search (remote reverse-proxy) Local endpoint: - `/mcp/web_search_prime/mcp` Upstream: - `https://api.z.ai/api/mcp/web_search_prime/mcp` Implementation: - Handler: [`src-tauri/src/proxy/handlers/mcp.rs`](../../src-tauri/src/proxy/handlers/mcp.rs) (`handle_web_search_prime`) ### 2) Web Reader (remote reverse-proxy) Local endpoint: - `/mcp/web_reader/mcp` Upstream: - `https://api.z.ai/api/mcp/web_reader/mcp` Implementation: - Handler: [`src-tauri/src/proxy/handlers/mcp.rs`](../../src-tauri/src/proxy/handlers/mcp.rs) (`handle_web_reader`) ### 3) Vision MCP (built-in server) Local endpoint: - `/mcp/zai-mcp-server/mcp` Implementation: - Route wiring: [`src-tauri/src/proxy/server.rs`](../../src-tauri/src/proxy/server.rs) - Handler: [`src-tauri/src/proxy/handlers/mcp.rs`](../../src-tauri/src/proxy/handlers/mcp.rs) (`handle_zai_mcp_server`) - Session state: [`src-tauri/src/proxy/zai_vision_mcp.rs`](../../src-tauri/src/proxy/zai_vision_mcp.rs) - Tool execution: [`src-tauri/src/proxy/zai_vision_tools.rs`](../../src-tauri/src/proxy/zai_vision_tools.rs) ## Auth model - Local proxy auth (if enabled) is handled by the proxy middleware: - [`src-tauri/src/proxy/middleware/auth.rs`](../../src-tauri/src/proxy/middleware/auth.rs) - z.ai auth is always injected upstream by the proxy using `proxy.zai.api_key`. - No z.ai key needs to be configured in MCP clients that point at the local endpoints. ## UI wiring The MCP toggles and local endpoints are shown in: - [`src/pages/ApiProxy.tsx`](../../src/pages/ApiProxy.tsx) ## Validation 1) Enable `proxy.zai.enabled=true` and set `proxy.zai.api_key`. 2) Enable: - `proxy.zai.mcp.enabled=true` - any subset of `{web_search_enabled, web_reader_enabled, vision_enabled}` 3) Start the proxy and point an MCP client at the corresponding local endpoint(s).