Skip to content

Commit 80f9b44

Browse files
committed
Use mcp_server.request_context.request to retrieve http request info
1 parent 312b4bc commit 80f9b44

File tree

2 files changed

+15
-22
lines changed

2 files changed

+15
-22
lines changed

fastapi_mcp/server.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,7 @@ def decorator(
3535

3636
async def handler(req: types.CallToolRequest):
3737
try:
38-
# Pull the original HTTP request info from the MCP message. It was injected in
39-
# `FastApiSseTransport.handle_fastapi_post_message()`
40-
if hasattr(req.params, "_http_request_info") and req.params._http_request_info is not None:
41-
http_request_info = HTTPRequestInfo.model_validate(req.params._http_request_info)
42-
results = await func(req.params.name, (req.params.arguments or {}), http_request_info)
43-
else:
44-
results = await func(req.params.name, (req.params.arguments or {}))
38+
results = await func(req.params.name, (req.params.arguments or {}))
4539
return types.ServerResult(types.CallToolResult(content=list(results), isError=False))
4640
except Exception as e:
4741
return types.ServerResult(
@@ -177,6 +171,20 @@ async def handle_list_tools() -> List[types.Tool]:
177171
async def handle_call_tool(
178172
name: str, arguments: Dict[str, Any], http_request_info: Optional[HTTPRequestInfo] = None
179173
) -> List[Union[types.TextContent, types.ImageContent, types.EmbeddedResource]]:
174+
request = self.server.request_context.request
175+
176+
http_request_info = None
177+
if request:
178+
body = await request.body()
179+
http_request_info = HTTPRequestInfo(
180+
method=request.method,
181+
path=request.url.path,
182+
headers=dict(request.headers),
183+
cookies=request.cookies,
184+
query_params=dict(request.query_params),
185+
body=body.decode(),
186+
)
187+
180188
return await self._execute_api_tool(
181189
client=self._http_client,
182190
tool_name=name,

fastapi_mcp/transport/sse.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from pydantic import ValidationError
1010
from mcp.server.sse import SseServerTransport
1111
from mcp.types import JSONRPCMessage, JSONRPCError, ErrorData
12-
from fastapi_mcp.types import HTTPRequestInfo
1312

1413

1514
logger = logging.getLogger(__name__)
@@ -59,20 +58,6 @@ async def handle_fastapi_post_message(self, request: Request) -> Response:
5958

6059
try:
6160
message = JSONRPCMessage.model_validate_json(body)
62-
63-
# HACK to inject the HTTP request info into the MCP message,
64-
# so we can use it for auth.
65-
# It is then used in our custom `LowlevelMCPServer.call_tool()` decorator.
66-
if hasattr(message.root, "params") and message.root.params is not None:
67-
message.root.params["_http_request_info"] = HTTPRequestInfo(
68-
method=request.method,
69-
path=request.url.path,
70-
headers=dict(request.headers),
71-
cookies=request.cookies,
72-
query_params=dict(request.query_params),
73-
body=body.decode(),
74-
).model_dump(mode="json")
75-
7661
logger.debug(f"Validated client message: {message}")
7762
except ValidationError as err:
7863
logger.error(f"Failed to parse message: {err}")

0 commit comments

Comments
 (0)