← 모든 글

요즘 AI 에이전트 개발: MCP

MCP란 무엇인가?

  • MCP는 AI 모델과 외부 리소스를 원활하게 통합기 위한 오픈 프로토콜
  • 외부 리소스?
  • 도구가 될 수도 있고, 데이터도 될 수 있음
  • LSP (Language Server Protocol) 의 영감을 받아 구성하게 됨
  • lsp는 IDE 내에서 언어 서버와 개발 도구 간의 통신 프로토콜 표준화
  • IDE가 프로그래밍 언어 도구와 상호작용하는 방법 표준화
  • AI 모델 여러개와 여러개의 도구 복잡도 가진 문제(M*N)를 단순하게 M+N으로 바꾸는 목표
  • AI 애플리케이션이 외부 시스템과 상호 작용하는 방법 표준화

MCP 기술적 관점

아키텍처

  • 호스트
  • 사용자가 직접 상호작용하는 애플리케이션
  • 여러 MCP 클라이언트 관리
  • EX) ChatGPT, Claude 앱
  • 클라이언트
  • 호스트 애플리케이션 내 존재하는 코드
  • MCP 서버와 1:1 중계자 역할
  • 호스트와 상호작용하며, 서버로 Server to Server 로 통신
  • 서버
  • 도구, 리소스, 프롬프트 제공

통신 프로토콜

  • JSON PRC 2.0 기반으로 하며, streamable-http 사용 권장
  • stdio, SSE, streamable-http 3가지 있으며 SSE는 보안 우려 사항으로 폐기 예정
interface JSONRPCMessage {
	jsonrpc: "2.0";
	id?: string | number // 요청/응답 식별자
	method?: string; // 메서드 이름
	params?: object; // 매개변수
	result?: object; // 응답결과
	error?: {
		code: number;
		message: string;
		data?: unkwon;
	}

도구, 리소스, 프롬프트

  • 서버에서 주로 사용하는 대상
  • 도구 : LLM이 실행할 수 있는 함수
@mcp.tool()
async def sum_of_nums(nums: list[int]) -> int:
	""" 숫자 리스트의 총합 반환 """
	return sum(nums)
  • 리소스 : LLM이 접근할 수 있는 데이터
  • 정적 데이터 : 특정 디렉터리 내 파일, 이미지 같이 변하지 않는 데이터
  • 동적 데이터 : 입력 받은 파라미터에 따라 결과가 달라지는 데이터
@mcp.resource("dir://test")
def my_resource() -> list[str]:
	""" test 폴더에 있는 파일 리스트 """
	test = Path.home() / "test"
	return [str(f) for f in test.iterdir()]
  • 프롬프트 : 재사용 가능한 템플릿
@mcp.prompt("코드 리뷰")
def sample_prompt(language: str):
	""" 특정 프로그램 언어에 대한 리뷰 프롬프트 """
	return f"""{language}에 대한 코드 리뷰해주세요."

샘플 코드

from mcp.server.fastmcp import FastMCP

# FastMCP 인스턴스 생성
mcp = FastMCP("Simple MCP Server")

# MCP 도구 정의
@mcp.tool()
def hello(name: str) -> str:
    """ 간단한 인사말을 반환하는 도구 """
    return f"안녕하세요, {name}님!"

@mcp.tool()
def get_prompt(prompt_type: str = "general") -> str:
    """ 사전 정의된 프롬프트를 반환하는 도구 """
    prompts = {
        "general": "당신은 도움이 되는 AI 어시스턴트 입니다. 사용자의 질문에 정확하고 친절하게 답변해주세요.",
        "code_review": "다음 코드를 거토하고 개선점을 제안해주세요. 코드의 가독성, 성능, 보안 측면을 고려해주세요.",
        "translate": "다음 텍스트를 자연스러운 한국어로 번역해주세요.",
        "summarize": "다음 내용을 핵심 포인트 중심으로 간결하게 요약해주세요."
    }
    
    return prompts.get(prompt_type, prompts["general"])

@mcp.resource("simple://info")      # 리소스 정의
def get_server_info() -> str:
    """ 서버 정보를 제공하는 리소스 """
    return """
    Simple MCP 정보
    ====================================
    
    이 서버는 MCP(Model Context Protocol)의 기본 기능을 시연하는 간단한 예제입니다.
    
    제공하는 도구:
    - hello: 인사말 생성
    - get_prompt: 프롬프트 템플릿 제공
    
    제공하는 리소스
    - simple://info: 서버 정보
    """

if __name__ == "__main__":
    """서버를 실행"""
    mcp.run(transport="streamable-http")

이번 글 핵심 키워드

  • MCP (Model Context Protocol)
  • JSON RPC 2.0 에 맞춰 프로토콜 구성
  • streamable-http → MCP 권장 http 기반 스트리밍 통신 방식, 클라이언트와 서버 효율적 통신
  • 호스트, 클라이언트, 서버
  • 서버
  • 리소스
  • 도구
  • 프롬프트
  • 테스트를 위한 방법 2가지
  • 클로드 제공하는 mcp inspecter
  • 포스트맨
  • FastMCP → MCP 서버와 클라이언트를 파이썬으로 쉽게 구현할 수 있도록 돕는 라이브러리

TIL 느낀점

  • MCP에 대해서 어렵다고 느꼈는데, 공부하면서 간략하게 나마 구현해보고 테스트하면서 일반 API와 별반 다를 것이 없다는 것을 다시 느낌