티스토리 뷰

 

단계의 목표

이번 단계의 목표는 이미 구현된 MCP 서버를 MCP Python SDK를 이용해 좀 더 만들어보는 것이다.

지난 코드작업들은 완전히 클로드 코드에게 맡기고 코드의 동작만을 이해했었는데, SDK를 이용해 좀 더 쉽게 이해해보는 것이다. 그럼에도 불구하고 지난 번 구현은 MCP의 작동에 대한 이해에 도움이 되었다(정신승리!)

TL;DR

결과물은 별도의 리포지토리인 https://github.com/nicewook/todo-printer 에서 확인할 수 있다.

기본 설치

공식 리포지토리의 안내대로 하나씩 따라가 보겠다. 파이썬 패키지/프로젝트 매니저인 uv는 설치되어 있다고 가정한다.

uv init

uv init todo-printer
cd mcp-server-demo

uv init <project-name>은 새로운 Python 프로젝트를 초기화하는 명령어이다.

  • 기본적인 폴더 구조와 설정이 자동으로 구성된다.
  • pyproject.toml 파일을 생성해 프로젝트 정보를 정의하고, uv.lock 파일을 생성해 의존성 버전을 고정한다.
  • 가상환경도 자동 생성되며 별도로 .venv를 만들 필요가 없다.
    • 이후 uv add로 패키지를 설치하고 uv run으로 실행하면 자동으로 가상환경에서 명령이 처리된다.

uv add "mcp[cli]"

uv add "mcp[cli]"

이 명령은 mcp 패키지와 cli 패키지까지 설치해준다. mcp 패키지의 cli 명령을 쓸 수 있게 된다.

  • 여기서는 나중에 우리가 만든 MCP 서버를 클로드 데스크탑에 install 하는데 사용할 것이다.
  • cli 패티지는 typer, python-dotenv 패키키징다. mcp 패키지의 pyproject.toml 파일을 보면 다음 함목이 있다.
  • [project.optional-dependencies] rich = ["rich>=13.9.4"] cli = ["typer>=0.16.0", "python-dotenv>=1.0.0"] ws = ["websockets>=15.0.1"]

기능 구현

기존 코드 복붙

  • printer.py: 실제 프린터를 구동하는 코드는 기존에 구현했던 코드를 그대로 가져온다.
  • mcp_wrapper.py: Python SDK로 구현할 기능

기능 구현

프롬프트

> <https://github.com/modelcontextprotocol/python-sdk> 문서를 참고해서 \\
  @mcp_wrapper.py 파일의 구현 내용을 Python SDK를 활용한 버전으로 mcp_server.py 파일로 구현하려고 해. \\
  일단은 구현 계획부터 작성해줘 ultrathink

구현 완료

GitHub: https://github.com/nicewook/todo-printer

간단한 구현이기에 리포지토리를 참고하면 되겠다. 대략의 변경사항은 다음과 같다.

  • **MCP Python SDK** 적용 → mcp_server.py 파일이 89라인으로 줄어들었음. 가독성도 한결 개선
    • 이는 MCP 서버의 initialize, tools/list 부분을 내부에서 자동으로 처리해주는 덕분이다.
  • 실제 사용 경험을 바탕으로, 무조건 한 줄만 출력하도록 강제함.
    • 클로드 데스크탑에 출력 요청한 메모 한 줄만 출력하도록 강제하기가 어려웠음. 한 번씩 장황한 설명까지 출력됨
  • 특정 프린터 상태 확인 명령은 제거하였음. 실제 사용하지 않기도 하고, 프린터 목록 명령만으로 충분했음

클로드 데스크탑에 등록

공식 문서에 소개된 대로 다음과 같이 명령하면 바로 클로드 데스크탑에 등록이 된다.

uv run mcp install mcp_server.py

실제로는 claude_desktop_config.json 파일에 다음 내용이 추가되는 것이다.

  • 파일 경로는 MacOS 기준 ~/Library/Application Support/Claude/claude_desktop_config.json
{
    "todo-printer": {
      "command": "/path/to/bin/uv",
      "args": [
        "run",
        "--with",
        "mcp[cli]",
        "mcp",
        "run",
        "/path/to/todo-printer/mcp_server.py"
      ]
    }
  }
}

마무리

  • uv를 실제 사용해보며 왜 좋은지 경험해보았다 → 가상환경 관리, 속도
  • MCP Python SDK 가 상당히 잘 만들어져 있다. Go 버전도 나왔다는데 사용해보고 싶다.
  • 같은 기능을 다시 처음부터 만들어보는 것은 언제나 옳다.

결과물

출력 요청

클로드 코드에 다음과 같이 출력을 요청한다.

  • > 를 붙여서 메모하면 출력해준다.
  • 출력 해달라는 말을 명시적으로 할 수도 있다.
  • 하나의 프롬프트에 여러 개의 출력을 요청할 수도 있다.
  • 마지막의 경우가 가장 인상적인데 >  출력 요청을 명시적으로 하지 않았는데도 메모를 둘로 나누어서 출력해준다.
    • 클로드가 앞선 요청들의 맥락상 출력을 요청한 것으로 이해하고, 또한 별개의 두 메모라고 인식한 것이다.
    • 항상 이렇게 출력되는 것은 아니다(non-deterministic). 이를 좀더 강제하려면 description 등에 프롬프트 엔지니어링을 해주어야 할 것이다. 혹은 가까운 미래에 공짜 점심으로 AI가 의도를 더욱 잘 알아듣게 될 수도 있겠다.

출력 결과

이렇게 출력하여 테이블에 올려두었다가 하나씩 해결하며 오른쪽의 빈 용기에 넣어둔다.

 

반응형
반응형
잡학툰 뱃지
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함