본문 바로가기
study

Model Context Protocol(MCP) 알아보기

by dhleeone 2025. 4. 1.

최근 GPT를 비롯한 대형 언어 모델(LLM)을 다양한 서비스에 접목하려는 시도가 늘고 있습니다. 하지만 실제로 LLM을 도입하려고 하면 생각보다 다양한 문제에 부딪히게 됩니다.

• LLM이 실행해야 할 기능을 어떻게 정의하고 일관성을 유지할 수 있을까?
• 함수나 외부 API를 직접 연결하려면 어떤 구조가 필요할까?
• 단순한 문장 생성에서 벗어나 기능을 실행하게 만들 수 있을까?

이러한 문제를 해결하기 위해 Model Context Protocol(MCP)이 등장했습니다. MCP는 AI 모델이 단순히 텍스트를 생성하는 것을 넘어, 외부 데이터 소스 및 도구와 연결될 수 있도록 지원하는 개방형 표준 프로토콜입니다. 이를 통해 AI 시스템은 다양한 데이터 소스와 안전하게 상호작용할 수 있습니다.

 

MCP란 무엇인가?

MCP는 LLM을 데이터 소스, 시스템에 연결하기 위한 새로운 표준으로 활용될 수 있도록 설계된 연결 프로토콜입니다.

 

MCP는 다음과 같은 주요 구성 요소로 이루어져 있습니다.

MCP 호스트(Host): AI 모델이 실행되는 환경으로, 예를 들어 Cursor AI, Claude Desktop과 같은 애플리케이션이 이에 해당합니다.
MCP 클라이언트(Client): 호스트 애플리케이션 내부에서 동작하고 호스트와 서버 간의 통신을 관리하며, 프로토콜의 클라이언트 측을 구현합니다.
• MCP 서버(Server): 외부 데이터 소스나 도구에 대한 접근을 제공하며, 프로토콜의 서버 측을 구현합니다.

MCP는 클라이언트-서버 모델을 기반으로 작동합니다. 호스트 애플리케이션은 클라이언트를 통해 서버에 요청을 보내고, 서버는 해당 요청을 처리하여 결과를 반환합니다. 이 과정에서 JSON-RPC 2.0과 같은 표준화된 메시지 형식을 사용하여 통신의 일관성과 확장성을 보장합니다. 이러한 구조를 통해 MCP는 AI 모델과 외부 시스템 간의 원활한 통신을 지원합니다.

 

Cursor AI에서 MCP 활용 예시

fastmcp라는 Python 기반 MCP 프레임워크와 MCP를 지원하는 Cursor AI를 활용해 간단한 MCP 프로젝트를 실행해보았습니다.

예제에서는 MCP 서버에 개인 정보(이름과 생년월일)를 저장하고, 다시 불러오는 기능을 구현하였습니다.
💡 fastmcp는 Python으로 MCP 서버를 쉽고 빠르게 구축할 수 있도록 도와주는 프레임워크입니다.

 

	project/
	├── Dockerfile
	├── pyproject.toml
	├── src
	│   └── server.py
	└── uv.lock

 

FROM python:3.12-slim

WORKDIR /app
COPY . .

RUN apt-get update && apt-get install -y curl
RUN curl -LsSf https://astral.sh/uv/install.sh | sh

ENV PATH="/root/.local/bin:${PATH}"

RUN uv venv .venv && uv pip install -r pyproject.toml

EXPOSE 3000

ENTRYPOINT ["uv", "run", "mcp", "run", "src/server.py:mcp"]

 

위와 같은 프로젝트 구조와 Dockerfile을 작성하고 MCP 서버를 컨테이너로 실행했으며, 세부 세팅은 아래를 참고 부탁드립니다.

세팅 참고: https://github.com/modelcontextprotocol/python-sdk)https://github.com/modelcontextprotocol/python-sdk

 

아래는 주요한 mcp 관련 코드입니다.

# src/server.py
 
import os
import json
from mcp.server.fastmcp import FastMCP
 
 
# Create an MCP server
mcp = FastMCP("MyMCP")
 
@mcp.tool()
def save_person_info(name: str, birthdate: str) -> str:
    """
    이름과 생년월일 정보를 JSON 파일에 저장합니다.
    파일명은 '이름.json' 형식으로 생성됩니다.
 
        name (str): 저장할 이름
        birthdate (str): 저장할 생년월일 (예: 'YYYY-MM-DD')
    """
    # 파일명 생성
    filename = f"{name}.json"
    file_path = os.path.join(os.getcwd(), filename)
 
    # 데이터 구성
    data = {
        "name": name,
        "birthdate": birthdate
    }
 
    # JSON 파일에 데이터 저장
    with open(file_path, 'w', encoding='utf-8') as file:
        json.dump(data, file, ensure_ascii=False, indent=4)
 
    return f"데이터가 {file_path}에 성공적으로 저장되었습니다."
 
@mcp.tool()
def read_person_info(name: str) -> dict:
    """
    '이름.json' 형식의 파일에서 정보를 읽어옵니다.
 
        name (str): 조회할 이름
    """
    # 파일명 생성
    filename = f"{name}.json"
    file_path = os.path.join(os.getcwd(), filename)
 
    # 파일 존재 여부 확인
    if not os.path.exists(file_path):
        return {"error": f"{file_path} 파일을 찾을 수 없습니다."}
 
    # JSON 파일에서 데이터 읽기
    with open(file_path, 'r', encoding='utf-8') as file:
        data = json.load(file)
 
    return data
 
if __name__ == "__main__":
    print('mcp server start...')
    mcp.run()

 

@mcp.tool() 데코레이터를 사용하여 MCP 메서드를 정의하면, Cursor 등 호스트 애플리케이션에서 이 메서드를 자동으로 인식하게 됩니다. 메서드는 개인정보를 json파일로 저장, 조회하도록 각각 하나씩 만들었습니다.

 

Cursor에 MCP 서버 등록하기

Docker 이미지로 MCP 서버를 빌드한 후, Cursor의 설정 화면에서 mcp 서버 등록하기 버튼을 클릭하면 JSON 입력창이 나타납니다.

 

위와 같은 형식으로 MCP 설정을 입력해 서버를 등록할 수 있습니다. 설정 내용에는 mcp 서버를 구동하기 위한 명령어가 들어 있습니다.

 

등록이 완료되면, Cursor에서 MCP 서버가 연결되었고 사용 가능한 툴이 노출된 것을 확인할 수 있습니다.

 

실제 Cursor에서 툴 호출 예시

이제 Cursor 프롬프트에서 "이름 홍길동, 생년월일: 1995.01.01 정보를 저장해줘"라고 입력해보았습니다.

Cursor는 이 명령을 이해하고 정보 저장 MCP 툴(save_person_info)을 선택해 자동으로 파라미터를 구성한 뒤, 호출하여 정보 저장에 성공한 것을 확인할 수 있습니다.

이후, "홍길동의 개인정보를 읽어줘"라고 프롬프트에 재입력하면 마찬가지로 정보 조회 MCP 툴(read_person_info)로 앞서 저장했던 JSON 파일에서 정보를 읽어와 결과를 출력합니다.

 

만약 저장하지 않은 이름의 개인정보를 불러오라고 입력하면 아래와 같이 오류 문구를 응답합니다.

 

MCP 서버 로그 확인

혹시 Cursor가 대화 문맥을 바탕으로 결과값을 만든 것은 아닌가? 하는 궁금증이 들어, Cursor가 실제로 MCP 서버를 호출했는지 확인하기 위해 Docker 컨테이너의 로그를 확인해보았습니다.

로그를 보면 save_person_info와 read_person_info 툴이 실제로 호출된 것을 확인할 수 있습니다. 즉, 단순히 LLM이 대답한 것이 아니라 Cursor → MCP → Tool 호출 → 응답이라는 전체 워크플로우가 제대로 작동하고 있음을 알 수 있습니다.

 

예제처럼 단순한 구조에서도, MCP를 통해 AI 모델이 실제 외부 시스템과 상호작용할 수 있다는 가능성을 확인할 수 있었습니다.

 

이처럼 MCP를 활용하면 AI 모델은 더 이상 단순한 텍스트 생성기를 넘어, 직관적이고 유연한 인터페이스를 갖춘 실질적인 업무 도구로 발전할 수 있을 것이라 생각합니다.