@@ -125,6 +125,7 @@ async def build_status() -> dict[str, Any]:
125125 "version" : "0.1.0" ,
126126 "uptime_seconds" : round (time .time () - _START_TIME , 1 ),
127127 "base_url" : os .getenv ("BASE_URL" ) or None ,
128+ "public_base_url" : os .getenv ("PUBLIC_BASE_URL" ) or None ,
128129 },
129130 "obp_api" : {
130131 "base_url" : obp_base_url or None ,
@@ -264,7 +265,8 @@ def row(label: str, value: Any) -> str:
264265 { row ("Name" , srv .get ("name" ))}
265266 { row ("Version" , srv .get ("version" ))}
266267 { row ("Uptime" , _fmt_uptime (srv .get ("uptime_seconds" , 0 )))}
267- { row ("Public base URL" , srv .get ("base_url" ))}
268+ { row ("Base URL (BASE_URL)" , srv .get ("base_url" ))}
269+ { row ("Public base URL (PUBLIC_BASE_URL)" , srv .get ("public_base_url" ))}
268270 </table>
269271 </section>
270272
@@ -303,19 +305,37 @@ def row(label: str, value: Any) -> str:
303305</html>"""
304306
305307
306- def _server_base_url (request : Request ) -> str :
307- """Public base URL of this server: BASE_URL env if set, else derived
308- from the incoming request (scheme://host[:port])."""
309- configured = os .getenv ("BASE_URL" , "" ).rstrip ("/" )
310- if configured :
311- return configured
312- return f"{ request .url .scheme } ://{ request .url .netloc } "
308+ def _endpoint_urls (request : Request ) -> tuple [str , str | None ]:
309+ """Resolve the MCP base URLs to advertise.
310+
311+ Returns (external, internal):
312+ - external: what clients outside the cluster/network should use —
313+ PUBLIC_BASE_URL if set, else BASE_URL, else derived from the request.
314+ - internal: BASE_URL, only when PUBLIC_BASE_URL is also set and differs
315+ (i.e. the server has distinct intra-cluster and public interfaces);
316+ None otherwise.
317+ """
318+ base_url = os .getenv ("BASE_URL" , "" ).rstrip ("/" )
319+ public_base_url = os .getenv ("PUBLIC_BASE_URL" , "" ).rstrip ("/" )
320+ external = public_base_url or base_url or f"{ request .url .scheme } ://{ request .url .netloc } "
321+ internal = base_url if public_base_url and base_url and base_url != public_base_url else None
322+ return external , internal
313323
314324
315325def _render_index_html (request : Request ) -> str :
316326 esc = _html .escape
317- base_url = _server_base_url (request )
318- mcp_url = f"{ base_url } /mcp"
327+ external_base , internal_base = _endpoint_urls (request )
328+ mcp_url = f"{ external_base } /mcp"
329+ internal_note = (
330+ f"""
331+ <h3>Internal (intra-cluster)</h3>
332+ <p class="endpoint"><code>{ esc (internal_base )} /mcp</code></p>
333+ <p>Only reachable from inside the cluster/network — for internal agents
334+ (e.g. Opey) and service-to-service clients.</p>"""
335+ if internal_base
336+ else ""
337+ )
338+ external_heading = "<h3>External (public)</h3>" if internal_base else ""
319339
320340 auth_enabled = os .getenv ("ENABLE_OAUTH" , "false" ).lower () == "true"
321341 auth_provider = os .getenv ("AUTH_PROVIDER" , "none" ) if auth_enabled else "none"
@@ -383,8 +403,10 @@ def _render_index_html(request: Request) -> str:
383403
384404 <section>
385405 <h2>MCP endpoint</h2>
406+ { external_heading }
386407 <p class="endpoint"><code>{ esc (mcp_url )} </code> (Streamable HTTP)</p>
387408 <p>{ auth_note } </p>
409+ { internal_note }
388410 { obp_line }
389411 </section>
390412
0 commit comments