Spaces:
Sleeping
Sleeping
| """Container entrypoint for the M3GNet FastMCP service. | |
| The script searches for ``start_mcp.py`` in the extracted project tree and | |
| executes it with sensible defaults. This avoids hard-coding the deployment | |
| layout, which is helpful when only the ``mcp_output`` folder is uploaded to a | |
| Service (e.g., HuggingFace Space). | |
| """ | |
| from __future__ import annotations | |
| import os | |
| import sys | |
| from pathlib import Path | |
| def find_start_script(root: Path) -> Path | None: | |
| """Return the first ``start_mcp.py`` found within ``root`` (depth <= 3).""" | |
| max_depth = 3 | |
| queue = [(root, 0)] | |
| while queue: | |
| current, depth = queue.pop(0) | |
| if not current.is_dir(): | |
| continue | |
| # Look for the script in the current directory first | |
| candidate = current / "start_mcp.py" | |
| if candidate.is_file(): | |
| return candidate | |
| if depth >= max_depth: | |
| continue | |
| for child in current.iterdir(): | |
| if child.is_dir(): | |
| queue.append((child, depth + 1)) | |
| return None | |
| def main() -> None: | |
| root = Path("/app") | |
| script = find_start_script(root) | |
| if script is None: | |
| print("[ERROR] 未找到 start_mcp.py。/app 目录内容如下:", file=sys.stderr) | |
| for path in root.rglob("*"): | |
| if path.is_file(): | |
| print(f" - {path.relative_to(root)}", file=sys.stderr) | |
| sys.exit(1) | |
| host = os.environ.get("MCP_HOST", "0.0.0.0") | |
| port = os.environ.get("MCP_PORT", "7860") | |
| mode = os.environ.get("MCP_MODE", "sse") | |
| print(f"[INFO] 启动 FastMCP 服务:{script} (mode={mode}, host={host}, port={port})") | |
| os.execv(sys.executable, [sys.executable, str(script), "--mode", mode, "--host", host, "--port", port]) | |
| if __name__ == "__main__": | |
| main() | |