From d2a93979a494fe2fd9b849511fea0462f4735bc9 Mon Sep 17 00:00:00 2001 From: chrischristiansen-glitch Date: Wed, 10 Jun 2026 03:48:38 +0200 Subject: [PATCH] fix(CI3): bytt MCPToolset med FunctionTools for opax-mcp REST-kall --- agents/tools/mcp_tools.py | 87 ++++++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 20 deletions(-) diff --git a/agents/tools/mcp_tools.py b/agents/tools/mcp_tools.py index eabb835..e8a6c6c 100644 --- a/agents/tools/mcp_tools.py +++ b/agents/tools/mcp_tools.py @@ -3,10 +3,10 @@ mcp_tools.py — MCP toolset integrations for OSVauco ADK agent. Supports: - Google BigQuery MCP (via StreamableHTTP, uses ADC/OAuth) - Google Maps MCP (via StreamableHTTP, uses API key) - - OPAX-MCP (Vauco intern CI/CD-kanal, uses MCP_SECRET + identity token) + - OPAX-MCP (Vauco intern CI/CD-kanal, FunctionTools over REST) - Local stdio MCP server (dev/test only) -Requires: google-adk >= 2.0.0, google-auth +Requires: google-adk >= 2.0.0, google-auth, httpx """ import os @@ -54,30 +54,77 @@ def get_maps_mcp_toolset() -> MCPToolset: ) ) -# --- OPAX-MCP (Vauco intern CI/CD-kanal) --- + +# --- OPAX-MCP (Vauco intern CI/CD-kanal) via FunctionTools --- +# Bruker httpx over REST i stedet for MCPToolset siden opax-mcp er en +# vanlig FastAPI-server, ikke en MCP streamable-server med session-handshake. + OPAX_MCP_URL = os.environ.get("MCP_SERVER_URL", "https://opax-mcp-zjbqp3prqq-uc.a.run.app") -def get_opax_mcp_toolset() -> MCPToolset: - """ - Connect to Vauco sin interne opax-mcp server. - Auth: Cloud Run identity token (Bearer) + X-MCP-Key header fra Secret Manager. - """ - mcp_secret = os.environ.get("MCP_SECRET", "") - if not mcp_secret: - raise ValueError("MCP_SECRET env var ikke satt. Sjekk Secret Manager: mcp-server-key") - +def _opax_headers() -> dict: + """Bygg auth-headers for opax-mcp: Cloud Run identity token + MCP-nøkkel.""" + import google.auth.transport.requests credentials, _ = google.auth.default() credentials.refresh(google.auth.transport.requests.Request()) + return { + "Authorization": f"Bearer {credentials.token}", + "X-MCP-Key": os.environ.get("MCP_SECRET", ""), + "Content-Type": "application/json", + } - return MCPToolset( - connection_params=StreamableHTTPConnectionParams( - url=f"{OPAX_MCP_URL}/mcp", - headers={ - "Authorization": f"Bearer {credentials.token}", - "X-MCP-Key": mcp_secret, - }, - ) +def push_static(file_path: str, content: str, content_type: str = "text/html; charset=utf-8") -> dict: + """Last opp en statisk fil (HTML/CSS/JS) til opax.vauco.no via GCS. file_path er relativ sti, f.eks. static/jason.html.""" + import httpx + resp = httpx.post( + f"{OPAX_MCP_URL}/tools/push_static", + headers=_opax_headers(), + json={"file_path": file_path, "content": content, "content_type": content_type}, + timeout=30, ) + return resp.json() + +def get_build_status() -> dict: + """Hent status på siste Cloud Build-kjøring for OSVauco. Returnerer status, commit, varighet og logg-URL.""" + import httpx + resp = httpx.get( + f"{OPAX_MCP_URL}/tools/get_build_status", + headers=_opax_headers(), + timeout=15, + ) + return resp.json() + +def get_logs(lines: int = 50, severity: str = "DEFAULT") -> dict: + """Hent siste Cloud Run-logger for osvauco-agent. severity: ERROR | WARNING | INFO | DEFAULT.""" + import httpx + resp = httpx.get( + f"{OPAX_MCP_URL}/tools/get_logs", + headers=_opax_headers(), + params={"lines": lines, "severity": severity}, + timeout=15, + ) + return resp.json() + +def deploy_service(branch: str = "main", trigger_id: str = "") -> dict: + """Trigger Cloud Build for å bygge og deploye osvauco-agent. Krever HITL-godkjenning fra Chris.""" + import httpx + resp = httpx.post( + f"{OPAX_MCP_URL}/tools/deploy_service", + headers=_opax_headers(), + json={"branch": branch, "trigger_id": trigger_id}, + timeout=15, + ) + return resp.json() + +def get_opax_tools() -> list: + """Returner liste med ADK FunctionTool-er for opax-mcp.""" + from google.adk.tools import FunctionTool + return [ + FunctionTool(func=push_static), + FunctionTool(func=get_build_status), + FunctionTool(func=get_logs), + FunctionTool(func=deploy_service), + ] + # --- Local stdio MCP server (dev/test only) --- def get_local_stdio_toolset(command: str, args: list[str]) -> MCPToolset: