feat(mcp): connect authenticated AquaPortal tools to Vocero (#1)
Vocero needs to query AquaPortal on behalf of the caller selected by the existing phone link. This adds server-owned conversations and MCP tool execution for voice and HTTP reasoning while leaving the speech pipeline unchanged. Release notes: - Added browser-bound conversations that keep backend credentials server-side and isolate callers. - Connected the eight-tool AquaPortal catalog through authenticated Streamable HTTP with full input schemas and structured results. - Added bounded multi-step tool execution with cancellation, expiry, and stale-result protection. - Updated browser bootstrap, tool progress, reasoning headers, and conversation cleanup. - Disabled legacy unscoped content preloads in MCP mode and documented configuration and deployment constraints. - Preserved disabled-mode contracts and added local SDK, WebSocket, and browser regression coverage. Reviewed-on: AquaPortal/s2s#1
This commit is contained in:
@@ -16,12 +16,16 @@ from vocero_api.core import urls as core_urls
|
||||
from vocero_api.providers import apipilot as providers_apipilot
|
||||
from vocero_api.providers import caller as providers_caller
|
||||
from vocero_api.realtime import events as realtime_events
|
||||
from vocero_api.realtime.mcp_proxy import realtime_mcp_proxy
|
||||
from vocero_api.services import context as services_context
|
||||
from vocero_api.services import tool_context as services_tool_context
|
||||
|
||||
|
||||
async def realtime_proxy(ws: WebSocket) -> None:
|
||||
"""Relay the browser's same-origin realtime WebSocket to the configured upstream."""
|
||||
if settings.S2S_MCP_URL:
|
||||
await realtime_mcp_proxy(ws)
|
||||
return
|
||||
client_ip = ws.client.host if ws.client else "?"
|
||||
if not settings.S2S_PROXY_TARGET:
|
||||
app_logging.logger.debug("[EXT][S2S-PROXY] client=%s rejected: S2S_PROXY_TARGET not configured", client_ip)
|
||||
|
||||
Reference in New Issue
Block a user