아는분 회사에서 스터디 겸 사이드 프로젝트를 진행하는데 MCP 서버를 작게나마 구축하는 역할을 맡게 되었다. 그때 경험했던 일련의 과정들을 정리하고자 한다.
1. 정의
- AI 모델과 외부 데이터 소스 간의 원활한 통신을 가능하게 만드는 프로토콜 (AI 를 위한 USB 포트에 비유)
2. 역할
- AI 모델이 파일, 데이터베이스, API, 시스템 정보 등에 접근 가능
- 사용자 허가를 통해 안전한 데이터 연동
- 다양한 AI 모델 에서 공통적으로 사용할 수 있는 표준 인터페이스 제공
3. 구조
1) MCP Client
- Claude Desktop
- Cursor
- 커스텀 Client
2) MCP Server
- FastMCP
- 다양한 언어 기반의 SDK 존재
- Python 으로 샘플 생성
3) MCP Inspector
- MCP Server 의 모든 기능 테스트
4. 기능
1) 리소스(Resource)
- AI 모델에게 필요한 정보와 컨텍스트 제공
- @mcp.resource(“config://app”)
2) 도구(tool)
- LLM 이 실행할 수 있는 함수로 등록
- @mcp.tool()
3) 프롬프트(prompt)
- LLM 과의 상호작용을 위한 템플릿
- 입력된 message 를 받아 LLM 에 전달할 재사용 가능한 지시문 제공
- @mcp.prompt()
5. 샘플링
1) 필요한 파일 및 라이브러리 설치
- Claude Desktop
- Python 버전 (3.10 이상)
- uvx, ux 등
2) 프로젝트 생성
- uvx create-mcp-server —path my_app(앱 이름)
3) 가상 환경 생성
- python3 -m vent myenv(가상환경 이름)
4) 가상 환경 활성화
- source myenv/bin/activate
5) 가상 환경에서 패키지 설치
- python -m pip install mcp-server
6) mcp server 로 활용할 .py 파일 생성 (여기선, demo.py 로 생성)
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Demo")
@mcp.tool()
def add(a: int, b: int) -> int:
return a + b
@mcp.tool()
def multiply(a: int, b: int) -> int:
return a * b
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
return f"Hello, {name}!"
@mcp.prompt()
def review_code(code: str) -> str:
return f"Please review this code:\n\n{code}"
if __name__ == "__main__":
mcp.run
해당 파일 작성 후 my_app/src/my_app/demo.py 경로로 저장
7) mcp[cli] 설치
- pip3 install "mcp[cli]"
8) mcp server 실행
- mcp install demo.py
- mcp dev demo.py
위 과정 실행 시, 결과 MCP Client(Claude Desktop) 측에 신규로 생성한 MCP Server(demo.py) 등록
@mcp.tool() 로 등록한 기능을 MCP Client 에서 사용할 수 있다.
사용 결과는 아래와 같다.
프롬프트에 더해달라, 곱해달라고 요청한 것은 자동으로 add, multiply 함수를 요청한 것으로 인식하여 이를 사용할 것인지 질문하는 것을 확인할 수 있었다. 그러나 빼달라고 요청한 것은 관련 함수를 등록한 것이 없기 때문에 자체적으로 응답하는 것을 확인했다.