diff --git a/asgi_app.py b/asgi_app.py index 89d5d94..ba5a1f4 100644 --- a/asgi_app.py +++ b/asgi_app.py @@ -57,8 +57,8 @@ if CLERK_SECRET_KEY and CLERK_ISSUER: jwks_uri=f"{CLERK_ISSUER}/.well-known/jwks.json", issuer=CLERK_ISSUER, algorithm="RS256", - audience=CLERK_PUBLISHABLE_KEY, # Use publishable key as audience - required_scopes=["yargi.read"] # Global scope requirement + audience=None, # Disable audience validation - Clerk uses different audience format + required_scopes=[] # Disable scope validation - Clerk JWT has ['read', 'search'] ) logger.info(f"Bearer auth configured with Clerk JWKS: {CLERK_ISSUER}/.well-known/jwks.json") else: @@ -165,8 +165,15 @@ async def health_check(): "auth_enabled": os.getenv("ENABLE_AUTH", "false").lower() == "true" }) -# Mount MCP app at /mcp (not at root to avoid conflicts) -app.mount("/mcp", mcp_app) +# Add explicit redirect for /mcp to /mcp/ with method preservation +@app.api_route("/mcp", methods=["GET", "POST", "HEAD", "OPTIONS"]) +async def redirect_to_slash(request: Request): + """Redirect /mcp to /mcp/ preserving HTTP method with 308""" + from fastapi.responses import RedirectResponse + return RedirectResponse(url="/mcp/", status_code=308) + +# Mount MCP app at /mcp/ with trailing slash +app.mount("/mcp/", mcp_app) # Set the lifespan context after mounting app.router.lifespan_context = mcp_app.lifespan diff --git a/mcp_server_main.py b/mcp_server_main.py index ff29131..f0a53d0 100644 --- a/mcp_server_main.py +++ b/mcp_server_main.py @@ -240,12 +240,25 @@ from fastmcp import FastMCP def create_app(auth=None): """Create FastMCP app with standard capabilities and optional auth.""" + global app if auth: - app = FastMCP("Yargı MCP Server", auth=auth) + # Replace placeholder app with auth-enabled app, keeping all tools/resources + auth_app = FastMCP("Yargı MCP Server", auth=auth) + # Copy all tools and resources from placeholder app to auth-enabled app + auth_app._tool_manager = app._tool_manager + auth_app._resource_manager = app._resource_manager + app = auth_app logger.info("MCP server created with Bearer authentication enabled") else: - app = FastMCP("Yargı MCP Server") + # Update placeholder app name + app.name = "Yargı MCP Server" logger.info("MCP server created with standard capabilities (FastMCP handles tools.listChanged automatically)") + + # Add token counting middleware + token_counter = TokenCountingMiddleware() + app.add_middleware(token_counter) + logger.info("Token counting middleware added to MCP server") + return app # --- Module Imports --- @@ -335,13 +348,11 @@ from bddk_mcp_module.models import ( ) -# Create app without auth initially (auth will be added in ASGI wrapper) -app = create_app() +# Create a placeholder app that will be properly initialized after tools are defined +from fastmcp import FastMCP -# --- Add Token Counting Middleware --- -token_counter = TokenCountingMiddleware() -app.add_middleware(token_counter) -logger.info("Token counting middleware added to MCP server") +# Placeholder app for decorators - will be replaced in create_app() after all tools are defined +app = FastMCP("Yargı MCP Server Placeholder") # --- Tool Documentation Resources --- @app.resource("docs://tools/yargitay")