Consuming MCP Servers from .NET: When Your App Becomes the Client

개요

.NET 애플리케이션에서 MCP(Model Context Protocol) 서버의 기능을 클라이언트로 활용하는 방법을 설명하며, 이를 통해 내부 지원 콘솔, 워커 서비스, CLI 등이 외부 도구를 사용하는 시나리오를 다룹니다.

주요 내용

* MCP 클라이언트의 핵심 동사: MCP 클라이언트는 세 가지 기본 동사(Connect, Discover, Call)를 중심으로 작동합니다.
* Connect: StdioClientTransport (자식 프로세스로 서버 실행) 또는 HttpClientTransport (HTTP 엔드포인트 연결)를 통해 서버에 연결합니다.
* Discover: ListToolsAsync()를 호출하여 서버가 제공하는 도구 목록과 해당 입력 스키마를 런타임에 동적으로 가져옵니다. 이는 생성된 프록시 클래스를 사용하는 전통적인 API 클라이언트와 달리, 런타임에 동적으로 결정되는 계약 기반 통신입니다.
* Call: CallToolAsync()를 사용하여 도구를 이름과 인자 딕셔너리로 호출하고, 결과를 반환받습니다. 이때 실제 실행 로직은 서버 측에 있습니다.
* Aurora Coffee Co. 서버 연결 및 도구 사용:
* dotnet new consoledotnet add package ModelContextProtocol.Core 명령어로 클라이언트 콘솔 앱을 생성합니다.
* StdioClientTransport를 사용하여 로컬에서 Aurora Coffee Co. MCP 서버를 자식 프로세스로 실행하고 McpClient.CreateAsync()로 연결합니다.
* client.ListToolsAsync()로 도구 목록을 가져와 실제 도구 이름을 확인한 후, client.CallToolAsync()로 특정 도구(get_order_status 등)를 호출합니다.
* 도구의 결과는 텍스트, 이미지 등 여러 블록으로 구성될 수 있으며, OfType<TextContentBlock>() 등을 사용하여 파싱합니다.
* 모델 기반 자동 에이전트 루프:
* ModelContextProtocol SDK는 MCP 도구를 Microsoft.Extensions.AIAIFunction으로 바로 변환할 수 있어, 별도의 어댑터 코드 없이 IChatClient (예: AnthropicClient)에서 직접 사용할 수 있습니다.
* UseFunctionInvocation() 미들웨어를 사용하면 LLM(모델)이 질문에 따라 적절한 도구를 자동으로 선택하고 호출하며, 그 결과를 다시 모델에게 전달하는 에이전트 루프가 간소화됩니다. 기존의 수동으로 작성된 에이전트 루프가 몇 줄로 축약됩니다.
* 원격 서버 연결:
* HttpClientTransport를 사용하여 ASP.NET Core 기반의 원격 MCP 서버에 연결할 수 있으며, EndpointTransportMode 옵션을 설정합니다. TransportMode.StreamableHttp가 기본적으로 권장됩니다.
* stdio 방식과 마찬가지로 ListToolsAsync, CallToolAsync, IChatClient 연동 코드는 동일하게 유지됩니다.
* MCP v2.0 주요 변경 사항:
* HTTP 전송이 기본적으로 stateless로 변경되었습니다. Stateless 옵션이 true로 기본 설정되어 초기화 핸드셰이크 및 Mcp-Session-Id 헤더가 제거되었습니다. 이는 로드 밸런서 뒤에서 서버 확장에 유리하지만, 세션 기반으로 작동하던 경우 마이그레이션이 필요할 수 있습니다.
* 서버 주도 요청(샘플링, 루트)이 진단 MCP9005 하에 폐기되고 stateless 모드에서 오류를 발생시킵니다. 대화형 흐름은 Multi Round-Trip Requests로 이동했습니다.
* 일반적인 요청/응답 도구만 사용하는 서버는 큰 영향을 받지 않습니다.
* MCP 클라이언트 작성 시점:
* 애플리케이션 외부(플랫폼 팀 관리 서버, 제3자 서버, 공유 서버)에 존재하는 기능을 활용해야 할 때 MCP 클라이언트를 작성하는 것이 유리합니다. 서버 측 도구 변경 시 애플리케이션 재배포 없이 기능 확장이 가능합니다.
* 단순히 애플리케이션 내부의 메서드를 호출하는 경우, 프로토콜과 프로세스 경계를 넘는 MCP 클라이언트 방식 대신 직접 호출하는 것이 더 효율적입니다. MCP 클라이언트는 소유하지 않은 경계를 넘을 때 사용하고, 경계를 넘지 않을 때는 인-프로세스 도구 사용이 더 적합합니다.

시사점

MCP 클라이언트는 .NET 애플리케이션이 외부 서비스의 기능을 동적으로 탐색하고 활용할 수 있게 함으로써, 애플리케이션의 확장성과 유연성을 크게 향상시키며, 특히 LLM 기반 에이전트 시스템에서 외부 도구 통합을 간소화합니다.

원문 읽기 →
원문을 불러오는 중...

댓글

GitHub Discussions