"""入口:python -m mcp_bridge [options]""" import argparse import json import sys from dwg_review import config from . import __version__ from .server import StdioBridge def build_parser(): parser = argparse.ArgumentParser( prog="mcp_bridge", description="把标准 MCP 客户端(stdio)桥接到 CAD 基座(裸 TCP)。", ) parser.add_argument("--host", default=None, help=f"CAD 基座主机(默认 {config.HOST})") parser.add_argument("--port", type=int, default=None, help=f"CAD 基座端口(默认 {config.PORT})") parser.add_argument("--timeout", type=float, default=None, help=f"单次调用超时秒数(默认 {config.CALL_TIMEOUT})") parser.add_argument("--verbose", action="store_true", help="把诊断信息打到 stderr") parser.add_argument("--print-config", action="store_true", help="打印可直接粘进 MCP 客户端的配置片段后退出") return parser def print_config(args): host = args.host or config.HOST port = args.port if args.port is not None else config.PORT snippet = { "mcpServers": { "cad-autocad": { "command": sys.executable, "args": ["-m", "mcp_bridge"], "env": { # 用绝对路径,避免依赖客户端的工作目录 "PYTHONPATH": str(config.PROJECT_ROOT), "CAD_MCP_HOST": host, "CAD_MCP_PORT": str(port), }, } } } print(json.dumps(snippet, ensure_ascii=False, indent=2)) return 0 def main(argv=None): args = build_parser().parse_args(argv) if args.print_config: return print_config(args) bridge = StdioBridge( host=args.host, port=args.port, timeout=args.timeout, verbose=args.verbose ) if args.verbose: print( f"[mcp_bridge] v{__version__} 转发到 {bridge.host}:{bridge.port}," f"单次超时 {bridge.timeout}s", file=sys.stderr, flush=True, ) bridge.run() return 0 if __name__ == "__main__": sys.exit(main())