#!/usr/bin/env python3
"""Databricks MCP Proxy - Entry Point"""
import os
import sys
from pathlib import Path
import yaml
from .server import mcp, state
from .auth import DEFAULT_SCOPES
def load_app_yaml(path: str = "app.yaml") -> dict:
"""Load configuration from app.yaml (Databricks App format)."""
app_yaml = Path(path)
if not app_yaml.exists():
return {}
with open(app_yaml) as f:
config = yaml.safe_load(f) or {}
# Parse env list into dict
env = {}
for item in config.get("env", []):
name = item.get("name")
if not name:
continue
if "value" in item:
env[name] = item["value"]
elif "valueFrom" in item:
# Secrets are injected as env vars by Databricks
env[name] = os.environ.get(name, "")
return {"command": config.get("command"), "env": env}
def main():
"""Main entry point."""
# Try to load app.yaml from current directory or parent directories
config = {}
for path in [Path("app.yaml"), Path("../app.yaml"), Path.cwd() / "app.yaml"]:
if path.exists():
config = load_app_yaml(str(path))
print(f"Loaded config from {path}", file=sys.stderr)
break
env = config.get("env", {})
# Set state from config (priority: app.yaml > env vars)
state.host = env.get("DATABRICKS_HOST") or os.environ.get("DATABRICKS_HOST")
state.app_url = env.get("DATABRICKS_APP_URL") or os.environ.get("DATABRICKS_APP_URL")
state.scopes = env.get("DATABRICKS_SCOPES") or os.environ.get("DATABRICKS_SCOPES", DEFAULT_SCOPES)
print("=" * 50, file=sys.stderr)
print("Databricks MCP Proxy", file=sys.stderr)
print("=" * 50, file=sys.stderr)
if state.host:
print(f"Host: {state.host}", file=sys.stderr)
if state.app_url:
print(f"App URL: {state.app_url}", file=sys.stderr)
print("", file=sys.stderr)
print("Tools available:", file=sys.stderr)
print(" - authenticate: Start OAuth flow (opens browser)", file=sys.stderr)
print(" - list_databricks_tools: List remote tools", file=sys.stderr)
print(" - call_databricks_tool: Call a remote tool", file=sys.stderr)
print("=" * 50, file=sys.stderr)
# Run MCP server (stdio transport)
mcp.run()
if __name__ == "__main__":
main()