From 15415080daca25352a2d851ae8dcdad72bf75083 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Mon, 1 Dec 2025 02:21:38 +0100 Subject: [PATCH] Trying to fix CORS --- README.md | 10 +++++ src/geoguessr_mcp/main.py | 85 ++++++++++++++++++++++++++------------- 2 files changed, 66 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 45c7302..7f2c7d5 100644 --- a/README.md +++ b/README.md @@ -465,6 +465,16 @@ geoguessr-mcp/ └── Dockerfile ``` +### MCP Inspector Tool Test + +Tool to inspect MCP server and test connectivity: +Using the [Inspector](https://github.com/modelcontextprotocol/inspector) tool from the MCP project. +Via Docker: + +```bash +docker run --rm -p 6274:6274 -p 6277:6277 -e HOST=0.0.0.0 ghcr.io/modelcontextprotocol/inspector:latest +``` + ## 🤝 Contributing Contributions are welcome! Please: diff --git a/src/geoguessr_mcp/main.py b/src/geoguessr_mcp/main.py index 233d0a0..cb81fc1 100644 --- a/src/geoguessr_mcp/main.py +++ b/src/geoguessr_mcp/main.py @@ -47,32 +47,7 @@ class RequestLoggingMiddleware(BaseHTTPMiddleware): def main(): """Main entry point for the server.""" - # Prepare middleware list - from starlette.middleware import Middleware - - middleware_list = [] - - # Add request logging middleware for debugging (first in chain) - if settings.LOG_LEVEL == "DEBUG": - middleware_list.append(Middleware(RequestLoggingMiddleware)) - - # Always add CORS middleware for browser compatibility - middleware_list.append( - Middleware( - CORSMiddleware, - allow_origins=["*"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], - ) - ) - - # Add authentication middleware if enabled - if settings.MCP_AUTH_ENABLED: - logger.info("Setting up authentication middleware") - middleware_list.append(Middleware(AuthenticationMiddleware)) - - # Create the MCP server instance with middleware + # Create the MCP server instance mcp = FastMCP( "GeoGuessr MCP", instructions=""" @@ -106,6 +81,59 @@ def main(): # Register all tools register_all_tools(mcp) + # Wrap the streamable_http_app method to inject middleware + _original_streamable_http_app = mcp.streamable_http_app + + def _streamable_http_app_with_middleware(): + """Wrap app creation to inject middleware.""" + + app = _original_streamable_http_app() + + # Add request logging middleware for debugging (first in chain) + if settings.LOG_LEVEL == "DEBUG": + app.add_middleware(RequestLoggingMiddleware) + + # Always add CORS middleware for browser compatibility + app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + # Add authentication middleware if enabled + if settings.MCP_AUTH_ENABLED: + app.add_middleware(AuthenticationMiddleware) + + return app + + # Replace the method with our wrapper + mcp.streamable_http_app = _streamable_http_app_with_middleware + + # Also wrap sse_app for SSE transport + if hasattr(mcp, "sse_app"): + _original_sse_app = mcp.sse_app + + def _sse_app_with_middleware(): + """Wrap SSE app creation to inject middleware.""" + app = _original_sse_app() + if settings.LOG_LEVEL == "DEBUG": + app.add_middleware(RequestLoggingMiddleware) + + app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + + ) + if settings.MCP_AUTH_ENABLED: + app.add_middleware(AuthenticationMiddleware) + return app + + mcp.sse_app = _sse_app_with_middleware + logger.info( f"Starting GeoGuessr MCP Server on {settings.HOST}:{settings.PORT} " f"with {settings.TRANSPORT} transport" @@ -116,7 +144,6 @@ def main(): logger.info(f"MCP server authentication is ENABLED with {api_key_count} API key(s)") else: logger.warning("MCP server authentication is DISABLED - server is publicly accessible") - if settings.DEFAULT_NCFA_COOKIE: logger.info("Default GeoGuessr authentication cookie configured from environment") else: @@ -125,8 +152,8 @@ def main(): "Users will need to login or provide a cookie." ) - # Run the server with middleware support - mcp.run(transport=settings.TRANSPORT, middleware=middleware_list) + # Run the server - middleware will be applied via our wrapper + mcp.run(transport=settings.TRANSPORT) if __name__ == "__main__":