Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/dremioai/servers/mcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,11 @@ async def authorization_server_metadata(request: Request) -> Response:
return PydanticJSONResponse(md)
return Response(status_code=404)

@mcp.custom_route("/healthz", methods=["GET"])
async def health_check(_request: Request) -> Response:
"""Kubernetes-style health check endpoint"""
return Response(content="OK", status_code=200, media_type="text/plain")

return mcp


Expand Down
13 changes: 13 additions & 0 deletions tests/e2e/test_mcp_e2e.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

from dremioai.tools.tools import get_tools
from dremioai.config import settings
from urllib.parse import urlparse
from httpx import AsyncClient


@pytest.mark.asyncio
Expand All @@ -32,3 +34,14 @@ async def test_basic(mock_config_dir, logging_server, logging_level):
assert tr == {
t.__name__ for t in get_tools(For=settings.instance().tools.server_mode)
}

@pytest.mark.asyncio
async def test_healthz(mock_config_dir, logging_server, logging_level):
async with http_streamable_mcp_server(logging_server, logging_level) as sf:
async with AsyncClient() as client:
r = await client.get(
urlparse(sf.mcp_server.url)._replace(path="/healthz").geturl()
)
assert (
r.status_code == 200
), f"/healthz failed with {r.text}, {r.status_code}"