.NET으로 첫 번째 MCP 서버 구축하기
개요
본 문서는 .NET을 사용하여 MCP(Model Context Protocol) 서버를 구축하는 방법에 대한 상세한 가이드입니다. MCP는 AI 모델과 다양한 시스템 간의 통신을 표준화하는 프로토콜로, Claude와 같은 AI가 데이터베이스, API, 파일 등에 직접 접근할 수 있게 해줍니다.
MCP(Model Context Protocol)란 무엇인가?
핵심 개념
- 정의: Model Context Protocol의 약자로, AI 모델과 외부 시스템 간의 표준화된 통신 프로토콜
- 목적: AI 모델이 데이터베이스, API, 파일, 비즈니스 로직 등에 실시간으로 접근할 수 있도록 하는 것
- 기반 기술: JSON-RPC를 기반으로 한 메시지 교환 방식
MCP가 해결하는 문제점
기존의 AI 상호작용 방식의 한계:
- 데이터 복사-붙여넣기의 번거로움
- 각 사용 사례별 개별 통합 구축의 시간 소모
- 임시방편적 해결책의 불안정성
MCP의 작동 원리
Claude ←→ MCP Server ←→ 데이터베이스/API/파일/시스템
단계별 프로세스:
- MCP 서버 구축 및 기능 정의
- 서버가 제공 가능한 기능들을 Claude에게 알림
- Claude가 서버에 연결하여 사용 가능한 기능 탐색
- Claude가 필요에 따라 해당 기능들을 실시간으로 활용
MCP의 핵심 구성 요소
1. Tools (도구)
- 설명: Claude가 호출할 수 있는 함수들
- 예시: 이메일 전송, 캘린더 이벤트 생성, 앱 배포 등
- 특징: 매개변수를 받아서 결과를 반환
2. Resources (리소스)
- 설명: Claude가 읽을 수 있는 데이터 소스
- 예시: 작업 목록, 일일 매출 수치 등
- 특징: URL과 유사하지만 커스텀 데이터용
3. Prompts (프롬프트)
- 설명: 미리 구축된 프롬프트 템플릿
- 용도: 특정 워크플로우를 위한 재사용 가능한 프롬프트
- 특징: 덜 일반적이지만 특정 상황에서 유용
기술적 배경
통신 방식 (Transport)
- stdio: 표준 입출력을 통한 통신 (가장 간단한 설정)
- HTTP: 웹 서비스 형태로 서버 운영
- WebSockets: 실시간 통신이 필요한 경우
서버 생명주기
- 초기화: 서버 시작 및 기능 설정
- 핸드셰이크: Claude와의 연결 및 정보 교환
- 탐색: Claude가 사용 가능한 도구와 리소스 확인
- 운영: Claude가 필요에 따라 도구와 리소스 활용
- 종료: 깔끔한 연결 해제
MCP의 주요 장점
1. 실시간 데이터 접근
- 오래된 데이터가 아닌 최신 정보를 실시간으로 제공
- 시스템에서 직접 데이터를 가져와 정확성 보장
2. 사용자 제어 보안
- 읽기 전용 또는 쓰기 권한 제어 가능
- 특정 테이블이나 기능에 대한 접근 제한 설정
3. 하나의 서버, 다중 클라이언트
- 단일 MCP 서버로 여러 MCP 호환 클라이언트 지원
- 현재는 주로 Claude에서 사용되지만 생태계 확장 중
4. 표준화된 인터페이스
- 각 AI 통합별 개별 API 구축 불필요
- 하나의 MCP 서버로 모든 통합 처리
실습: 직원 관리 MCP 서버 구축
프로젝트 설정
dotnet new console -n EmployeeMcpServer
cd EmployeeMcpServer
dotnet add package ModelContextProtocol.Server
메인 프로그램 구조
Program.cs의 핵심 특징:
- 간단한 설정: SDK가 JSON-RPC 프로토콜, 탐색, 스키마 생성을 자동 처리
- 자동 도구 탐색: WithToolsFromAssembly()로 어셈블리에서 도구 자동 발견
- 표준 입출력 통신: WithStdioServerTransport()로 간단한 통신 설정
직원 관리 도구 클래스
주요 기능들
- GetEmployees(): 모든 직원 기록 조회
- GetEmployeeById(): 특정 직원 ID로 조회
- AddEmployee(): 새 직원 추가
- UpdateEmployee(): 기존 직원 정보 수정
- DeleteEmployee(): 직원 삭제
- GetEmployeesByDepartment(): 부서별 직원 조회
- GetEmployeesByStatus(): 상태별 직원 조회
- GetDepartmentCounts(): 부서별 직원 수 통계
구현의 핵심 특징
1. 어트리뷰트 시스템
- [McpServerToolType]: 클래스가 MCP 도구를 포함함을 표시
- [McpServerTool]: 메서드를 호출 가능한 도구로 표시
- [Description]: Claude가 볼 수 있는 도구 설명 제공
2. 자동 스키마 생성
- SDK가 모든 도구를 자동으로 탐색하여 JSON 스키마 생성
- Claude가 각 도구의 매개변수와 기능을 정확히 파악 가능
3. 타입 안전성
- decimal 타입으로 급여 처리
- DateTime 타입으로 입사일 처리
- SDK가 JSON과 C# 타입 간 변환 자동 처리
4. 간단한 반환값
- 각 도구는 문자열을 반환
- SDK가 적절한 MCP 응답으로 패키징
5. 유효성 검사
- 각 메서드에서 기본적인 유효성 검사 수행
- 오류 시 의미 있는 오류 메시지 반환
직원 데이터 모델
private class Employee
{
public string Name { get; set; }
public string Role { get; set; }
public string Department { get; set; }
public string Email { get; set; }
public DateTime HireDate { get; set; }
public decimal Salary { get; set; }
public string Status { get; set; }
public string Phone { get; set; }
public string Address { get; set; }
}
Claude Desktop과의 연동 설정
설정 파일 위치
- Windows:
%APPDATA%/Claude/claude_desktop_config.json
설정 예시
{
"mcpServers": {
"EmployeeMCPServer": {
"command": "dotnet",
"args": [
"run",
"--project",
"C:\\Users\\Niraj\\MCP\\EmployeeMCP\\EmployeeMCP.csproj",
"--no-build"
]
}
}
}
사용 방법
- Claude Desktop 재시작
- 연결 시 해머 아이콘 확인
- 자연어로 직원 관리 명령 입력
실제 사용 사례
기본 명령어 예시
- 직원 추가: “Engineering 부서에 Software Engineer로 Niraj라는 새 직원을 추가해줘”
- 부서별 조회: “Marketing 부서의 모든 직원을 보여줘”
- 정보 수정: “EMP001 직원의 급여를 $195,000로 업데이트해줘”
- 통계 조회: “각 부서별 직원 수는 얼마나 되나요?”
Claude의 지능적 처리
- 도구 간 관계 이해: 복잡한 작업을 위해 여러 도구를 조합하여 사용
- 매개변수 자동 추출: 자연어에서 필요한 매개변수를 자동으로 식별
- 오류 처리: 유효성 검사 오류 시 적절한 사용자 피드백 제공
확장 가능성과 활용 아이디어
데이터베이스 통합
- Entity Framework 연동: 메모리 딕셔너리를 실제 데이터베이스로 교체
- 대용량 데이터 처리: 수천 명의 직원 기록 관리 가능
파일 처리 기능
- CSV/Excel 내보내기: 요청 시 직원 데이터 보고서 생성
- 자동 보고서: Claude가 필요에 따라 다양한 형식의 보고서 생성
이메일 통합
- 신입사원 환영 이메일: 자동 발송 기능
- 상태 변경 알림: 직원 상태 변경 시 관련자에게 자동 통지
캘린더 연동
- 일정 관리: 직원 스케줄, 휴가 관리
- 회의 설정: API를 통한 자동 회의 일정 조율
고급 보고 기능
- HR 분석: 인사 관련 고급 통계 및 분석
- 급여 분석: 부서별, 직급별 급여 통계
- 성과 지표: 다양한 HR 메트릭 추적
승인 워크플로우
- 급여 변경 승인: 특정 금액 이상의 급여 변경 시 승인 절차
- 퇴사 처리: 여러 단계의 승인이 필요한 중요 작업 관리
다른 활용 사례
프로젝트 관리 도구
- 작업 할당 및 추적
- 프로젝트 진행 상황 모니터링
- 팀 협업 지원
고객 데이터 시스템
- 고객 정보 관리
- 상호작용 이력 추적
- 맞춤형 서비스 제공
파일 조직 시스템
- 자동 파일 분류
- 문서 검색 및 관리
- 백업 및 아카이빙
배포 자동화 도구
- 자동 배포 프로세스
- 환경 관리
- 모니터링 및 로깅
주요 학습 포인트
MCP 서버 개발의 핵심 패턴
- 클래스 생성: MCP 도구를 포함할 클래스 작성
- 어트리뷰트 적용: 적절한 MCP 어트리뷰트로 마킹
- 메서드 구현: 비즈니스 로직을 포함한 메서드 작성
- Claude 연동: 설정 파일을 통한 Claude와의 연결
성공적인 MCP 서버의 특징
- 명확한 도구 설명: Claude가 이해하기 쉬운 설명 제공
- 적절한 유효성 검사: 오류 상황에 대한 명확한 처리
- 타입 안전성: 강력한 타입 시스템 활용
- 사용자 친화적: 자연어 명령에 대한 직관적인 응답
실용적인 팁
개발 시 고려사항
- 간단한 시작: 기본 기능부터 구현하여 점진적으로 확장
- 테스트 중심: 각 도구를 개별적으로 테스트하여 안정성 확보
- 문서화: Description 어트리뷰트를 활용한 충분한 문서화
- 오류 처리: 예외 상황에 대한 명확하고 도움이 되는 메시지 제공
성능 최적화
- 메모리 관리: 대용량 데이터 처리 시 적절한 메모리 관리
- 비동기 처리: Task 기반 비동기 패턴 활용
- 캐싱: 자주 사용되는 데이터에 대한 적절한 캐싱 전략
보안 주의사항
- 입력 검증: 모든 사용자 입력에 대한 철저한 검증
- 권한 제어: 민감한 작업에 대한 적절한 권한 관리
- 로깅: 중요한 작업에 대한 적절한 로깅 및 감사
참고 자료
공식 문서
- ModelContextProtocol.Server NuGet 패키지
- .NET 콘솔 애플리케이션 개발 가이드
개발 도구
- Visual Studio 또는 VS Code
- .NET SDK
- Claude Desktop 애플리케이션
추가 학습 방향
- JSON-RPC 프로토콜 이해
- Entity Framework를 활용한 데이터베이스 연동
- RESTful API 설계 원칙
- 비동기 프로그래밍 패턴