Sign in to save your progressYou can keep reading without an account, but completed lessons won't be saved.
Sign in

이제 MCP 서버가 작동하고 있으니, 클라이언트 측을 구축할 차례입니다. 클라이언트는 애플리케이션 코드가 MCP 서버와 통신하고 그 기능에 접근할 수 있게 해주는 부분입니다.

클라이언트 아키텍처 이해하기

대부분의 실제 프로젝트에서는 MCP 클라이언트 또는 MCP 서버 중 하나만 구현하게 됩니다 - 둘 다 구현하지는 않습니다. 이 프로젝트에서는 둘이 어떻게 함께 작동하는지 보여주기 위해 둘 다 구축하고 있습니다.

프로젝트가 일반적으로 MCP 클라이언트 또는 MCP 서버 중 하나를 구현한다는 것을 나타내는 다이어그램; 우리 프로젝트는 둘 다 구현하며, 서버 내부의 MCP 클라이언트가 MCP 서버에 연결된 모습을 보여줌

MCP 클라이언트는 두 가지 주요 구성 요소로 이루어져 있습니다:

  • MCP Client - 세션을 더 쉽게 사용하기 위해 우리가 만드는 커스텀 클래스
  • Client Session - 서버에 대한 실제 연결 (MCP Python SDK의 일부)

mcp_client.py 다이어그램으로, 세션을 더 쉽게 사용하기 위해 우리가 작성하는 커스텀 클래스인 MCP Client와 MCP 서버에 대한 실제 연결인 Client Session을 포함함

클라이언트 세션은 신중한 리소스 관리가 필요합니다 - 작업이 끝나면 연결을 제대로 정리해야 합니다. 그래서 모든 정리 작업을 자동으로 처리하는 우리만의 클래스로 이를 감싸는 것입니다.

클라이언트가 애플리케이션에 맞는 방식

애플리케이션 흐름 다이어그램을 기억하시나요? 클라이언트는 두 가지 핵심 지점에서 우리 코드가 MCP 서버와 상호작용할 수 있게 해주는 부분입니다:

CLI 코드가 Claude에게 전달할 도구 목록을 가져오기 위해 클라이언트를 사용하는 위치와 도구를 호출하기 위해 클라이언트를 사용하는 위치를 강조하는 콜아웃이 있는 애플리케이션 흐름의 시퀀스 다이어그램

우리 CLI 코드는 클라이언트를 다음과 같이 사용합니다:

  • Claude에게 전송할 사용 가능한 도구 목록 가져오기
  • Claude가 요청할 때 도구 실행하기

핵심 클라이언트 함수 구현하기

list_tools()call_tool()이라는 두 가지 필수 함수를 구현해야 합니다.

List Tools 함수

이 함수는 MCP 서버에서 사용 가능한 모든 도구를 가져옵니다:

python
async def list_tools(self) -> list[types.Tool]:
    result = await self.session().list_tools()
    return result.tools

간단합니다 - 우리의 세션(서버에 대한 연결)에 접근하고, 내장된 list_tools() 메서드를 호출한 다음, 결과에서 도구를 반환합니다.

Call Tool 함수

이 함수는 서버에서 특정 도구를 실행합니다:

python
async def call_tool(
    self, tool_name: str, tool_input: dict
) -> types.CallToolResult | None:
    return await self.session().call_tool(tool_name, tool_input)

도구 이름과 입력 매개변수(Claude가 제공)를 서버에 전달하고 결과를 반환합니다.

클라이언트 테스트하기

클라이언트 파일 하단에는 간단한 테스트 하니스가 포함되어 있습니다. 모든 것이 제대로 작동하는지 확인하기 위해 직접 실행할 수 있습니다:

uv run mcp_client.py

이렇게 하면 MCP 서버에 연결되어 사용 가능한 도구를 출력합니다. 설명과 입력 스키마를 포함한 도구 정의를 보여주는 출력을 확인할 수 있습니다.

모든 것을 종합하기

클라이언트 함수가 구현되면, 메인 애플리케이션을 실행하여 전체 흐름을 테스트할 수 있습니다:

uv run main.py

다음과 같이 질문해 보세요:

report.pdf 문서의 내용은 무엇인가요?

다음은 내부에서 일어나는 일입니다:

  1. 애플리케이션이 클라이언트를 사용하여 사용 가능한 도구를 가져옵니다
  2. 이 도구들이 질문과 함께 Claude에게 전송됩니다
  3. Claude가 read_doc_contents 도구를 사용하기로 결정합니다
  4. 애플리케이션이 클라이언트를 사용하여 해당 도구를 실행합니다
  5. 결과가 Claude에게 반환되고, Claude가 이를 바탕으로 응답합니다

클라이언트는 애플리케이션 로직과 MCP 서버의 기능 사이의 다리 역할을 하여, 강력한 도구를 AI 워크플로우에 쉽게 통합할 수 있게 해줍니다.