무설치 실행 가능한 Python 패키지 만들기
서론
Model Context Protocol을 찍먹해보고 있는데, Python으로 MCP 서버를 만들다 보니 다음 과정이 매우 눈에 거슬렸다.
{
"mcpServers": {
"my-awesome-mcp": {
"command": "/home/goat/proj/awesome/mcp/project/.venv/bin/uv",
"args": [ "very", "long", "command", "line", "arguments" ],
"env": {
"PWD": "/home/goat/proj/survived/spreadsheet-mcp/"
}
}
}
}
오늘의 문제 - 파이썬 앱을 간단하게 배포할 수 있도록 포장해보시오
아… mcp 용으로 위와 같은 설정을 여기저기 추가하는게 맞는 건가? 매번 기다란 path를 포함시켜서? 남들한테 이걸 어떻게 배포하지…? 번거롭다? 이상하다? 싶은 느낌이 들었다. 그냥 배포용 패키지를 하나 제공해주고 이걸 요렇게 실행하세요 하면 좋지 않겠는가.
다만 Rust였다면 binary 파일 하나면 되는데 Python 앱의 경우… 패키지만 넣어서 될 게 아니라 패키지가 의존하는 다른 패키지들도 모아모아 한번에 제공해주고 거기다 python 인터프리터까지 모아서 한번에 제공해줘야 한다.
그런데 Python first party나 패키지 관리자에선 이런 기능을 크게 필요로 하진 않는지 기본기능으로는 제공이 안되고 있더라.
오늘의 대안 - PyInstaller를 사용하세요
이런 비슷한 기능을 제공하는 성공적인 Python 프로젝트가 뭐가 있을까 하다가 yt-dlp가 문득 떠올랐다. 슬쩍 뭐 하나 해본 적도 있고 해서 이게 윈도우용으로는 exe 바이너리를 제공한다는 것을 알고 있던 터라 그냥 여기서 쓰는 빌드 툴을 따라서 쓰면 되겠다 싶었다. 얘네는 pyinstaller를 쓰는 듯 해서, 거의 그대로 따라해봤다.
Give me the demo
import my_awesome_project.__main__
이런 내용의 app.py를 만들어준 다음에
uv run pyinstaller -F app.py
요 커맨드를 실행하면?
쨔잔! venv의 내용물을 잔뜩 포함하고 있는 아주 뚱뚱한 app
바이너리가 생성됩니다! (단 용량은 매우 클 수 있음)
결론
되긴 되는데, 요즘 mcp의 트렌드는 remote 서비스로 가는듯 해서 아마 이런 류의 접근이 널리 이용되지는 않을 것 같다.
여담
하여튼 이런류의 mcp 구현을 만들면서 테스트해보고 있는데, 아직 적절한 오픈모델/오픈소스 적용 구현은 많지 않은 것 같다. 심지어 자체 client 툴보다 그냥 Cursor 에디터에 global mcp로 등록해서 쓰는게 더 편할 지경이니 말 다했다. mcp가 크게 유행할 수 있을 것 같긴 한데 아직 무르익지는 않은 느낌이다. 아마 블루오션일 때 이런저런 integration 잔뜩 만들어서 유료 서비스로 파는 것도 소소한 돈벌이가 되지 않을까?