이제 MCP 서버가 작동하고 있으니, 클라이언트 측을 구축할 차례입니다. 클라이언트는 애플리케이션 코드가 MCP 서버와 통신하고 그 기능에 접근할 수 있게 해주는 부분입니다.
클라이언트 아키텍처 이해하기
대부분의 실제 프로젝트에서는 MCP 클라이언트 또는 MCP 서버 중 하나만 구현하게 됩니다 - 둘 다 구현하지는 않습니다. 이 프로젝트에서는 둘이 어떻게 함께 작동하는지 보여주기 위해 둘 다 구축하고 있습니다.

MCP 클라이언트는 두 가지 주요 구성 요소로 이루어져 있습니다:
- MCP Client - 세션을 더 쉽게 사용하기 위해 우리가 만드는 커스텀 클래스
- Client Session - 서버에 대한 실제 연결 (MCP Python SDK의 일부)

클라이언트 세션은 신중한 리소스 관리가 필요합니다 - 작업이 끝나면 연결을 제대로 정리해야 합니다. 그래서 모든 정리 작업을 자동으로 처리하는 우리만의 클래스로 이를 감싸는 것입니다.
클라이언트가 애플리케이션에 맞는 방식
애플리케이션 흐름 다이어그램을 기억하시나요? 클라이언트는 두 가지 핵심 지점에서 우리 코드가 MCP 서버와 상호작용할 수 있게 해주는 부분입니다:

우리 CLI 코드는 클라이언트를 다음과 같이 사용합니다:
- Claude에게 전송할 사용 가능한 도구 목록 가져오기
- Claude가 요청할 때 도구 실행하기
핵심 클라이언트 함수 구현하기
list_tools()와 call_tool()이라는 두 가지 필수 함수를 구현해야 합니다.
List Tools 함수
이 함수는 MCP 서버에서 사용 가능한 모든 도구를 가져옵니다:
간단합니다 - 우리의 세션(서버에 대한 연결)에 접근하고, 내장된 list_tools() 메서드를 호출한 다음, 결과에서 도구를 반환합니다.
Call Tool 함수
이 함수는 서버에서 특정 도구를 실행합니다:
도구 이름과 입력 매개변수(Claude가 제공)를 서버에 전달하고 결과를 반환합니다.
클라이언트 테스트하기
클라이언트 파일 하단에는 간단한 테스트 하니스가 포함되어 있습니다. 모든 것이 제대로 작동하는지 확인하기 위해 직접 실행할 수 있습니다:
uv run mcp_client.py이렇게 하면 MCP 서버에 연결되어 사용 가능한 도구를 출력합니다. 설명과 입력 스키마를 포함한 도구 정의를 보여주는 출력을 확인할 수 있습니다.
모든 것을 종합하기
클라이언트 함수가 구현되면, 메인 애플리케이션을 실행하여 전체 흐름을 테스트할 수 있습니다:
uv run main.py다음과 같이 질문해 보세요:
다음은 내부에서 일어나는 일입니다:
- 애플리케이션이 클라이언트를 사용하여 사용 가능한 도구를 가져옵니다
- 이 도구들이 질문과 함께 Claude에게 전송됩니다
- Claude가 read_doc_contents 도구를 사용하기로 결정합니다
- 애플리케이션이 클라이언트를 사용하여 해당 도구를 실행합니다
- 결과가 Claude에게 반환되고, Claude가 이를 바탕으로 응답합니다
클라이언트는 애플리케이션 로직과 MCP 서버의 기능 사이의 다리 역할을 하여, 강력한 도구를 AI 워크플로우에 쉽게 통합할 수 있게 해줍니다.