using System.Text; using Dabit.Mcp.Config; using Dabit.Mcp.Services; using DibdProtocol.Transport; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; // EUC-KR 인코딩 등록 — PacketBuilder/PacketParser가 의존한다. 누락 시 런타임 예외. Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var builder = Host.CreateApplicationBuilder(args); // ★ stdio transport는 stdout을 JSON-RPC 채널로 쓴다. // 기본 로깅 provider(Windows EventLog 포함)를 모두 제거한 뒤 콘솔 로그를 전부 stderr로 보낸다. // EventLog는 표준 사용자 계정에서 '.NET Runtime' 소스 쓰기 실패로 예외를 던져 MCP 요청을 깨뜨릴 수 있다(codex 교차 리뷰 P2). builder.Logging.ClearProviders(); builder.Logging.AddConsole(o => o.LogToStandardErrorThreshold = LogLevel.Trace); // 전광판 연결 설정 (환경변수 DABIT_*) builder.Services.AddSingleton(McpConnectionSettings.FromEnvironment()); // Transport 레지스트리 — Serial + TcpClient 등록 (AutoSend과 동일 범위) builder.Services.AddSingleton(_ => { var registry = new TransportRegistry(); registry.Register(TransportType.Serial, new SerialTransport()); registry.Register(TransportType.TcpClient, new TcpClientTransport()); return registry; }); builder.Services.AddSingleton(); // MCP 서버 — stdio transport + 어셈블리에서 [McpServerToolType] 도구 자동 검색 builder.Services .AddMcpServer() .WithStdioServerTransport() .WithToolsFromAssembly(); await builder.Build().RunAsync();