Skip to content

Commit a10b204

Browse files
authored
Overrided GET /mcp to return 405 to avoid opening a long living stream (#33)
1 parent 3ac5ea8 commit a10b204

3 files changed

Lines changed: 55 additions & 5 deletions

File tree

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ dependencies = [
3131
"jq>=1.10.0",
3232
"typer>=0.20.0",
3333
"pydantic-settings>=2.12.0",
34+
"fastapi>=0.136.0",
35+
"starlette>=0.50.0",
3436
]
3537

3638
[project.scripts]

src/open_targets_platform_mcp/cli.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
import asyncio
22
from importlib import metadata
3-
from typing import Annotated
3+
from typing import Annotated, Any
44

55
import typer
6+
import uvicorn
7+
from fastapi import FastAPI
8+
from fastapi.responses import JSONResponse
9+
from starlette.middleware.base import BaseHTTPMiddleware
10+
from starlette.requests import Request
611

712
from open_targets_platform_mcp.create_server import create_server
813
from open_targets_platform_mcp.settings import TransportType, settings
@@ -151,12 +156,26 @@ def root(
151156

152157
try:
153158
if settings.transport == TransportType.HTTP:
154-
mcp.run(
159+
160+
class MCPMethodOverrideMiddleware(BaseHTTPMiddleware):
161+
async def dispatch(self, request: Request, call_next: Any) -> JSONResponse:
162+
if request.url.path in {"/mcp", "/mcp/"} and request.method in {"GET", "HEAD", "OPTIONS"}:
163+
return JSONResponse(
164+
status_code=405,
165+
content={"error": "Method Not Allowed"},
166+
headers={"Allow": "POST"},
167+
)
168+
return await call_next(request)
169+
170+
mcp_asgi = mcp.http_app(
171+
path="/",
155172
transport=settings.transport.value,
156-
host=settings.http_host,
157-
port=settings.http_port,
158173
stateless_http=settings.stateless_http,
159174
)
175+
app = FastAPI(lifespan=mcp_asgi.lifespan)
176+
app.mount("/mcp", mcp_asgi)
177+
app.add_middleware(MCPMethodOverrideMiddleware)
178+
uvicorn.run(app, host=settings.http_host, port=settings.http_port)
160179
else:
161180
mcp.run(
162181
transport=settings.transport.value,

uv.lock

Lines changed: 30 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)