From ba45de45827101013cd890b47b818131ae699318 Mon Sep 17 00:00:00 2001 From: Bill Date: Fri, 2 Jan 2026 14:54:25 -0500 Subject: [PATCH] fix(session): include full proxy URL from GRIST_MCP_URL env var --- src/grist_mcp/main.py | 3 ++- src/grist_mcp/server.py | 10 +++++++++- src/grist_mcp/tools/session.py | 10 +++++++++- uv.lock | 2 +- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/grist_mcp/main.py b/src/grist_mcp/main.py index 63efd1d..79ff39f 100644 --- a/src/grist_mcp/main.py +++ b/src/grist_mcp/main.py @@ -127,6 +127,7 @@ def create_app(config: Config): """Create the ASGI application.""" auth = Authenticator(config) token_manager = SessionTokenManager() + proxy_base_url = os.environ.get("GRIST_MCP_URL") sse = SseServerTransport("/messages") @@ -144,7 +145,7 @@ def create_app(config: Config): return # Create a server instance for this authenticated connection - server = create_server(auth, agent, token_manager) + server = create_server(auth, agent, token_manager, proxy_base_url) async with sse.connect_sse(scope, receive, send) as streams: await server.run( diff --git a/src/grist_mcp/server.py b/src/grist_mcp/server.py index 863f0f0..70353a3 100644 --- a/src/grist_mcp/server.py +++ b/src/grist_mcp/server.py @@ -28,19 +28,26 @@ from grist_mcp.tools.schema import modify_column as _modify_column from grist_mcp.tools.schema import delete_column as _delete_column -def create_server(auth: Authenticator, agent: Agent, token_manager: SessionTokenManager | None = None) -> Server: +def create_server( + auth: Authenticator, + agent: Agent, + token_manager: SessionTokenManager | None = None, + proxy_base_url: str | None = None, +) -> Server: """Create and configure the MCP server for an authenticated agent. Args: auth: Authenticator instance for permission checks. agent: The authenticated agent for this server instance. token_manager: Optional session token manager for HTTP proxy access. + proxy_base_url: Base URL for the proxy endpoint (e.g., "https://example.com"). Returns: Configured MCP Server instance. """ server = Server("grist-mcp") _current_agent = agent + _proxy_base_url = proxy_base_url @server.list_tools() async def list_tools() -> list[Tool]: @@ -327,6 +334,7 @@ def create_server(auth: Authenticator, agent: Agent, token_manager: SessionToken arguments["document"], arguments["permissions"], ttl_seconds=arguments.get("ttl_seconds", 300), + proxy_base_url=_proxy_base_url, ) else: return [TextContent(type="text", text=f"Unknown tool: {name}")] diff --git a/src/grist_mcp/tools/session.py b/src/grist_mcp/tools/session.py index bd5569f..51aaa2f 100644 --- a/src/grist_mcp/tools/session.py +++ b/src/grist_mcp/tools/session.py @@ -117,6 +117,7 @@ async def request_session_token( document: str, permissions: list[str], ttl_seconds: int = 300, + proxy_base_url: str | None = None, ) -> dict: """Request a short-lived session token for HTTP proxy access. @@ -139,10 +140,17 @@ async def request_session_token( ttl_seconds=ttl_seconds, ) + # Build proxy URL - use base URL if provided, otherwise just path + proxy_path = "/api/v1/proxy" + if proxy_base_url: + proxy_url = f"{proxy_base_url.rstrip('/')}{proxy_path}" + else: + proxy_url = proxy_path + return { "token": session.token, "document": session.document, "permissions": session.permissions, "expires_at": session.expires_at.isoformat(), - "proxy_url": "/api/v1/proxy", + "proxy_url": proxy_url, } diff --git a/uv.lock b/uv.lock index 8b223c9..2a5cfba 100644 --- a/uv.lock +++ b/uv.lock @@ -153,7 +153,7 @@ wheels = [ [[package]] name = "grist-mcp" -version = "1.1.0" +version = "1.2.0" source = { editable = "." } dependencies = [ { name = "httpx" },