diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml index aa968591..6e56a408 100644 --- a/.github/workflows/pr-build.yml +++ b/.github/workflows/pr-build.yml @@ -252,7 +252,8 @@ jobs: pip3 install virtualenv virtualenv venv source venv/bin/activate - pip install --upgrade pip setuptools + pip install --upgrade pip + pip install setuptools>=70.0.0 pip install -r requirements.txt pip install -r dev-requirements.txt mkdir -p test-results diff --git a/services/chatbot/src/mcpserver/server.py b/services/chatbot/src/mcpserver/server.py index 1199cd4f..3c0fd114 100644 --- a/services/chatbot/src/mcpserver/server.py +++ b/services/chatbot/src/mcpserver/server.py @@ -3,7 +3,10 @@ import os import time +from importlib.metadata import version + import httpx +import uvicorn from fastmcp import FastMCP from starlette.middleware import Middleware @@ -143,17 +146,40 @@ async def debug_web_service(path: str = "") -> dict: if __name__ == "__main__": mcp_server_port = int(os.environ.get("MCP_SERVER_PORT", 5500)) + + class ServerHeaderMiddleware: + def __init__(self, app): + self.app = app + self.server_header = f"FastMCP/{version('FastMCP')}".encode() + + async def __call__(self, scope, receive, send): + if scope["type"] == "http": + async def send_with_header(message): + if message["type"] == "http.response.start": + headers = [ + (k, v) for k, v in message.get("headers", []) + if k != b"server" + ] + headers.append((b"server", self.server_header)) + message["headers"] = headers + await send(message) + await self.app(scope, receive, send_with_header) + else: + await self.app(scope, receive, send) + # Auth middleware to validate requests against identity service middleware = [ + Middleware(ServerHeaderMiddleware), Middleware( MCPAuthMiddleware, identity_service_url=BASE_IDENTITY_URL, - ) + ), ] - mcp.run( - transport="streamable-http", + app = mcp.streamable_http_app(middleware=middleware) + uvicorn.run( + app, host="0.0.0.0", port=mcp_server_port, - middleware=middleware, + server_header=False, ) diff --git a/services/workshop/Dockerfile b/services/workshop/Dockerfile index e5ab87fd..d47210bd 100644 --- a/services/workshop/Dockerfile +++ b/services/workshop/Dockerfile @@ -39,7 +39,7 @@ FROM python:3.11-alpine COPY --from=build /app /app WORKDIR /app RUN apk update && apk add --no-cache postgresql-libs curl cairo -RUN pip install setuptools +RUN pip install "setuptools>=70.0.0,<82" RUN pip install --no-index --find-links=/app/wheels -r requirements.txt COPY ./certs /app/certs COPY health.sh /app/health.sh diff --git a/services/workshop/requirements.txt b/services/workshop/requirements.txt index c10137dd..598a49dd 100644 --- a/services/workshop/requirements.txt +++ b/services/workshop/requirements.txt @@ -1,3 +1,4 @@ +setuptools>=70.0.0,<82 bcrypt==4.1.2 Django~=4.1.13 cryptography==40.0.2