Skip to content
Open
Show file tree
Hide file tree
Changes from 4 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
22 changes: 22 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
FROM python:3.10-slim

WORKDIR /app

# Install uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv

# Copy dependency files and source code (needed for setuptools-scm version generation)
COPY pyproject.toml uv.lock README.md ./
COPY src/ ./src/

# Install dependencies and build the package
RUN uv sync --frozen --no-dev

# Expose port
EXPOSE 8000

# Set environment variables
ENV PYTHONUNBUFFERED=1

# Run the MCP server with HTTP transport
CMD ["uv", "run", "mcp-server-datahub", "--transport", "http", "--host", "0.0.0.0", "--port", "8000"]
128 changes: 74 additions & 54 deletions src/mcp_server_datahub/__main__.py
Original file line number Diff line number Diff line change
@@ -1,54 +1,74 @@
import logging

import click
from datahub.ingestion.graph.config import ClientMode
from datahub.sdk.main_client import DataHubClient
from datahub.telemetry import telemetry
from fastmcp.server.middleware.logging import LoggingMiddleware
from typing_extensions import Literal

from mcp_server_datahub._telemetry import TelemetryMiddleware
from mcp_server_datahub._version import __version__
from mcp_server_datahub.mcp_server import mcp, register_all_tools, with_datahub_client

logging.basicConfig(level=logging.INFO)

# Register tools with OSS-compatible descriptions
register_all_tools(is_oss=True)


@click.command()
@click.version_option(version=__version__)
@click.option(
"--transport",
type=click.Choice(["stdio", "sse", "http"]),
default="stdio",
)
@click.option(
"--debug",
is_flag=True,
default=False,
)
@telemetry.with_telemetry(
capture_kwargs=["transport"],
)
def main(transport: Literal["stdio", "sse", "http"], debug: bool) -> None:
client = DataHubClient.from_env(
client_mode=ClientMode.SDK,
datahub_component=f"mcp-server-datahub/{__version__}",
)

if debug:
# logging.getLogger("datahub").setLevel(logging.DEBUG)
mcp.add_middleware(LoggingMiddleware(include_payloads=True))
mcp.add_middleware(TelemetryMiddleware())

with with_datahub_client(client):
if transport == "http":
mcp.run(transport=transport, show_banner=False, stateless_http=True)
else:
mcp.run(transport=transport, show_banner=False)


if __name__ == "__main__":
main()
import logging

import click
from datahub.ingestion.graph.config import ClientMode
from datahub.sdk.main_client import DataHubClient
from datahub.telemetry import telemetry
from fastmcp.server.middleware.logging import LoggingMiddleware
from typing_extensions import Literal

from mcp_server_datahub._telemetry import TelemetryMiddleware
from mcp_server_datahub._version import __version__
from mcp_server_datahub.mcp_server import mcp, register_all_tools, with_datahub_client

logging.basicConfig(level=logging.INFO)

# Register tools with OSS-compatible descriptions
register_all_tools(is_oss=True)


@click.command()
@click.version_option(version=__version__)
@click.option(
"--transport",
type=click.Choice(["stdio", "sse", "http"]),
default="stdio",
)
@click.option(
"--debug",
is_flag=True,
default=False,
)
@click.option(
"--host",
type=str,
default="0.0.0.0",
help="Host to bind the server to (default: 0.0.0.0 for all interfaces)",
)
@click.option(
"--port",
type=int,
default=8000,
help="Port to bind the server to (default: 8000)",
)
@telemetry.with_telemetry(
capture_kwargs=["transport"],
)
def main(
transport: Literal["stdio", "sse", "http"], debug: bool, host: str, port: int
) -> None:
client = DataHubClient.from_env(
client_mode=ClientMode.SDK,
datahub_component=f"mcp-server-datahub/{__version__}",
)

if debug:
# logging.getLogger("datahub").setLevel(logging.DEBUG)
mcp.add_middleware(LoggingMiddleware(include_payloads=True))
mcp.add_middleware(TelemetryMiddleware())

with with_datahub_client(client):
if transport == "http":
mcp.run(
transport=transport,
show_banner=False,
stateless_http=True,
host=host,
port=port,
)
else:
mcp.run(transport=transport, show_banner=False)


if __name__ == "__main__":
main()