Spaces:
Running
Running
#!/usr/bin/env python3 | |
""" | |
FoodWise Remote MCP Server Entry Point | |
Entry point for HuggingFace Spaces deployment | |
""" | |
import os | |
import sys | |
from pathlib import Path | |
# Add the src directory to Python path | |
sys.path.insert(0, str(Path(__file__).parent / "src")) | |
# Load environment variables from a .env file if present | |
try: | |
from dotenv import load_dotenv | |
load_dotenv() | |
except Exception: | |
# Safe to continue if dotenv isn't available | |
pass | |
# Import and run the existing FastMCP server | |
from foodwise.mcp_server.main import mcp | |
""" | |
Minimal FastMCP HTTP entrypoint for Hugging Face Spaces. | |
Serves Streamable-HTTP at /mcp/ using FastMCP's built-in transport. | |
If MCP_AUTH_TOKEN is set, run in proxy mode: | |
- Start FastMCP HTTP on internal 127.0.0.1:7870 | |
- Start FastAPI auth proxy on public PORT (default 7860) | |
""" | |
def main(): | |
"""Start the MCP server for HuggingFace Spaces using FastMCP HTTP runner. | |
- If MCP_AUTH_TOKEN is present, run MCP upstream + auth proxy on public port | |
- Otherwise, run MCP directly on PORT for simplicity (current default) | |
""" | |
host = os.getenv("HOST", "0.0.0.0") | |
port = int(os.getenv("PORT", "7860")) | |
environment = os.getenv("ENVIRONMENT", "production") | |
print("π Starting FoodWise MCP Server") | |
print(f" Environment: {environment}") | |
auth_token = os.getenv("MCP_AUTH_TOKEN") | |
if auth_token: | |
# Proxy mode: run MCP upstream on 127.0.0.1:7870 and proxy on PORT | |
upstream_host = os.getenv("UPSTREAM_HOST", "127.0.0.1") | |
upstream_port = int(os.getenv("UPSTREAM_PORT", "7870")) | |
print(f" Mode: Proxy (token enabled)") | |
print(f" Upstream MCP: http://{upstream_host}:{upstream_port}") | |
print(f" Proxy: http://{host}:{port}") | |
import threading | |
import uvicorn | |
def run_upstream() -> None: | |
mcp.run(transport="http", host=upstream_host, port=upstream_port, log_level="info") | |
upstream_thread = threading.Thread(target=run_upstream, name="mcp-upstream", daemon=True) | |
upstream_thread.start() | |
# Run proxy in main thread | |
from foodwise.mcp_server.auth_proxy import app as proxy_app | |
uvicorn.run(proxy_app, host=host, port=port, log_level="info") | |
return | |
# Default: direct MCP HTTP on PORT | |
print(f" Host: {host}:{port}") | |
print(" Mode: Direct HTTP (no auth token set)") | |
mcp.run(transport="http", host=host, port=port, log_level="info") | |
if __name__ == "__main__": | |
main() |