|
3 | 3 | import os |
4 | 4 | import time |
5 | 5 |
|
| 6 | +from importlib.metadata import version |
| 7 | + |
6 | 8 | import httpx |
| 9 | +import uvicorn |
7 | 10 | from fastmcp import FastMCP |
8 | 11 | from starlette.middleware import Middleware |
9 | 12 |
|
@@ -143,17 +146,40 @@ async def debug_web_service(path: str = "") -> dict: |
143 | 146 | if __name__ == "__main__": |
144 | 147 | mcp_server_port = int(os.environ.get("MCP_SERVER_PORT", 5500)) |
145 | 148 |
|
| 149 | + |
| 150 | + class ServerHeaderMiddleware: |
| 151 | + def __init__(self, app): |
| 152 | + self.app = app |
| 153 | + self.server_header = f"FastMCP/{version('FastMCP')}".encode() |
| 154 | + |
| 155 | + async def __call__(self, scope, receive, send): |
| 156 | + if scope["type"] == "http": |
| 157 | + async def send_with_header(message): |
| 158 | + if message["type"] == "http.response.start": |
| 159 | + headers = [ |
| 160 | + (k, v) for k, v in message.get("headers", []) |
| 161 | + if k != b"server" |
| 162 | + ] |
| 163 | + headers.append((b"server", self.server_header)) |
| 164 | + message["headers"] = headers |
| 165 | + await send(message) |
| 166 | + await self.app(scope, receive, send_with_header) |
| 167 | + else: |
| 168 | + await self.app(scope, receive, send) |
| 169 | + |
146 | 170 | # Auth middleware to validate requests against identity service |
147 | 171 | middleware = [ |
| 172 | + Middleware(ServerHeaderMiddleware), |
148 | 173 | Middleware( |
149 | 174 | MCPAuthMiddleware, |
150 | 175 | identity_service_url=BASE_IDENTITY_URL, |
151 | | - ) |
| 176 | + ), |
152 | 177 | ] |
153 | 178 |
|
154 | | - mcp.run( |
155 | | - transport="streamable-http", |
| 179 | + app = mcp.streamable_http_app(middleware=middleware) |
| 180 | + uvicorn.run( |
| 181 | + app, |
156 | 182 | host="0.0.0.0", |
157 | 183 | port=mcp_server_port, |
158 | | - middleware=middleware, |
| 184 | + server_header=False, |
159 | 185 | ) |
0 commit comments