Skip to content

Commit f16e55e

Browse files
committed
feat: add Docker support and implement SSE in MCP server
1 parent e018209 commit f16e55e

File tree

6 files changed

+82
-4
lines changed

6 files changed

+82
-4
lines changed

.dockerignore

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
.env
2+
.venv/
3+
.vscode/
4+
.github/
5+
dist/
6+
__pycache__/
7+
*.egg-info/
8+
*.pyc
9+
*.pyo
10+
*.pyd
11+
*.db
12+
13+
docker-compose.yaml

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,3 +172,5 @@ cython_debug/
172172

173173
# PyPI configuration file
174174
.pypirc
175+
176+
.vscode/

Dockerfile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,7 @@ ADD . /app
1818

1919
ENV PATH="/app/.venv/bin:$PATH"
2020

21-
ENTRYPOINT [ "uv", "run", "mcp", "run", "src/server.py" ]
21+
EXPOSE 8000
22+
23+
ENTRYPOINT [ "uv", "run", "src/server.py" ]
24+
CMD [ "--host", "0.0.0.0", "--port", "8000" ]

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "mcp-trino-python"
3-
version = "0.4.0"
3+
version = "0.6.0"
44
description = "A Model Context Protocol (MCP) connector for Trino, enabling seamless integration between MCP-compliant services and Trino query engine"
55
readme = "README.md"
66
license = { text = "Apache-2.0" }

src/server.py

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,15 @@
44
functionality through resources and tools, with special support for Iceberg tables.
55
"""
66

7+
import uvicorn
8+
from mcp.server import Server
79
from mcp.server.fastmcp import FastMCP
810
from mcp.server.fastmcp.prompts import base
11+
from mcp.server.sse import SseServerTransport
912
from pydantic import Field
13+
from starlette.applications import Starlette
14+
from starlette.requests import Request
15+
from starlette.routing import Mount, Route
1016

1117
from config import load_config
1218
from trino_client import TrinoClient
@@ -533,8 +539,46 @@ def maintain_iceberg(table: str, catalog: str, schema_name: str) -> list[base.Me
533539
]
534540

535541

542+
def create_starlette_app(mcp_server: Server, *, debug: bool = False) -> Starlette:
543+
"""Create a Starlette application that can server the provied mcp server with SSE."""
544+
sse = SseServerTransport("/messages/")
545+
546+
async def handle_sse(request: Request) -> None:
547+
async with sse.connect_sse(
548+
request.scope,
549+
request.receive,
550+
request._send, # noqa: SLF001
551+
) as (read_stream, write_stream):
552+
await mcp_server.run(
553+
read_stream,
554+
write_stream,
555+
mcp_server.create_initialization_options(),
556+
)
557+
558+
return Starlette(
559+
debug=debug,
560+
routes=[
561+
Route("/sse", endpoint=handle_sse),
562+
Mount("/messages/", app=sse.handle_post_message),
563+
],
564+
)
565+
566+
536567
if __name__ == "__main__":
568+
import argparse
569+
537570
from loguru import logger
538571

539572
logger.info("Starting Trino MCP server...")
540-
mcp.run(transport="stdio")
573+
mcp_server = mcp._mcp_server # noqa: SLF001
574+
575+
parser = argparse.ArgumentParser(description="Run MCP Trino Server as a SSE-based server")
576+
parser.add_argument("--host", default="127.0.0.1", help="Host to bind to")
577+
parser.add_argument("--port", type=int, default=8000, help="Port to listen on")
578+
args = parser.parse_args()
579+
580+
# Bind SSE request handling to MCP server
581+
starlette_app = create_starlette_app(mcp_server, debug=True)
582+
# Run the server with Uvicorn
583+
uvicorn.run(starlette_app, host=args.host, port=args.port)
584+
logger.info("Trino MCP server is running.")

uv.lock

Lines changed: 17 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)