fix(session): include full proxy URL from GRIST_MCP_URL env var
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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}")]
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user