fix(session): include full proxy URL from GRIST_MCP_URL env var

This commit is contained in:
2026-01-02 14:54:25 -05:00
parent d176b03d56
commit ba45de4582
4 changed files with 21 additions and 4 deletions

View File

@@ -127,6 +127,7 @@ def create_app(config: Config):
"""Create the ASGI application.""" """Create the ASGI application."""
auth = Authenticator(config) auth = Authenticator(config)
token_manager = SessionTokenManager() token_manager = SessionTokenManager()
proxy_base_url = os.environ.get("GRIST_MCP_URL")
sse = SseServerTransport("/messages") sse = SseServerTransport("/messages")
@@ -144,7 +145,7 @@ def create_app(config: Config):
return return
# Create a server instance for this authenticated connection # 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: async with sse.connect_sse(scope, receive, send) as streams:
await server.run( await server.run(

View File

@@ -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 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. """Create and configure the MCP server for an authenticated agent.
Args: Args:
auth: Authenticator instance for permission checks. auth: Authenticator instance for permission checks.
agent: The authenticated agent for this server instance. agent: The authenticated agent for this server instance.
token_manager: Optional session token manager for HTTP proxy access. 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: Returns:
Configured MCP Server instance. Configured MCP Server instance.
""" """
server = Server("grist-mcp") server = Server("grist-mcp")
_current_agent = agent _current_agent = agent
_proxy_base_url = proxy_base_url
@server.list_tools() @server.list_tools()
async def list_tools() -> list[Tool]: async def list_tools() -> list[Tool]:
@@ -327,6 +334,7 @@ def create_server(auth: Authenticator, agent: Agent, token_manager: SessionToken
arguments["document"], arguments["document"],
arguments["permissions"], arguments["permissions"],
ttl_seconds=arguments.get("ttl_seconds", 300), ttl_seconds=arguments.get("ttl_seconds", 300),
proxy_base_url=_proxy_base_url,
) )
else: else:
return [TextContent(type="text", text=f"Unknown tool: {name}")] return [TextContent(type="text", text=f"Unknown tool: {name}")]

View File

@@ -117,6 +117,7 @@ async def request_session_token(
document: str, document: str,
permissions: list[str], permissions: list[str],
ttl_seconds: int = 300, ttl_seconds: int = 300,
proxy_base_url: str | None = None,
) -> dict: ) -> dict:
"""Request a short-lived session token for HTTP proxy access. """Request a short-lived session token for HTTP proxy access.
@@ -139,10 +140,17 @@ async def request_session_token(
ttl_seconds=ttl_seconds, 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 { return {
"token": session.token, "token": session.token,
"document": session.document, "document": session.document,
"permissions": session.permissions, "permissions": session.permissions,
"expires_at": session.expires_at.isoformat(), "expires_at": session.expires_at.isoformat(),
"proxy_url": "/api/v1/proxy", "proxy_url": proxy_url,
} }

2
uv.lock generated
View File

@@ -153,7 +153,7 @@ wheels = [
[[package]] [[package]]
name = "grist-mcp" name = "grist-mcp"
version = "1.1.0" version = "1.2.0"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "httpx" }, { name = "httpx" },