1. MCP란
Model Context Protocol(MCP)는 LLM 애플리케이션과 외부 데이터 소스 및 도구 간의 원활한 연동을 가능하게 해주는 오픈 프로토콜
AI 기반 IDE를 만들거나, 채팅 인터페이스를 개선하거나, 맞춤형 AI 워크플로우를 구축하든 MCP는 LLM이 필요한 컨텍스트에 표준화된 방식으로 접근할 수 있도록 도와준다.
1.1 왜 MCP인가?
- MCP는 LLM을 기반으로 에이전트와 복잡한 워크플로를 구축하는데 도움을 준다.
- LLM은 다양한 데이터 및 도구와의 통합이 자주 필요하며, MCP는 다음과 같은 방식으로 지원한다.
- LLM이 바로 사용할 수 있는 다양한 사전 구축 통합 기능 제공 (ex. DB, API, 외부 툴 등 쉽게 연동할 수 있는 통합 기능)
- LLM 제공자나 벤더 간 유연한 전환 가능 (ex. OpenAI, Anthropic, Google 등 다양한 LLM 서비스 사이를 쉽게 전환 가능)
- 자체 인프라 내에서 데이터를 안전하게 보호하기 위한 보안 모범 사례 제공
- 민감한 데이터가 외부로 유출되지 않도록 MCP는 보안 측면의 가이드라인과 도구를 함께 제공한다.
1.2 주요 구성요소

1) MCP Hosts
- 사용자가 사용하는 애플리케이션이나 AI 인터페이스로, LLM이 외부 데이터에 접근할 필요가 있을 때 MCP를 통해 데이터에 접근하려는 주체이다. 쉽게 말해, 데이터를 요청하는 주체이다.
- 예시: Claude Desktop, AI 도구, IDE(통합 개발 환경) 등
2) MCP Clients
- MCP 서버와 1:1 연결을 유지하는 프로토콜 클라이언트이다.
- 각 클라이언트는 특정 서버와의 통신을 담당하며, LLM의 요청을 MCP 서버에 전달하고 응답을 다시 받아온다.
- MCP 클라이언트의 역할
- LLM으로부터 요청 수신
- 적절한 MCP 서버로 요청 전달
- MCP 서버로부터 결과를 LLM에 반환
- 일종의 브릿지 역할을 하는 컴포넌트이다.
3) MCP Servers
- 경량화된 프로그램으로, 특정 기능(ex. 파일 검색, 데이터베이스 쿼리, API 호출 등)을 MCP 표준 형식에 맞춰 외부에 노출한다.
- LLM은 MCP 서버를 통해 다양한 도구나 데이터를 제어하거나 조회할 수 있다.
- 예시: 파일 시스템에 접근하는 MCP 서버, SQL을 실행하는 MCP 서버 등
4) Local Data Sources(로컬 데이터 소스)
- MCP 서버가 사용자 컴퓨터에 설치된 데이터 소스에 접근하여 정보를 가져오거나 수정할 수 있도록 한다.
- LLM이 클라우드가 아닌 로컬 리소스에 안전하게 접근할 수 있게 해주는 창구이다.
- 예시: 컴퓨터의 파일, 로컬 DB, 로컬 서비스 등
5) Remote Services(원격 서비스)
- 인터넷을 통해 접근 가능한 외부 시스템 또는 서비스이다.
- MCP 서버는 이들과 연동하여, LLM이 외부 데이터나 기능(API 등)을 사용할 수 있도록 지원한다.
- 예시: 외부 API, 클라우드 서비스, 웹 기반 시스템 등

즉, MCP는 LLM이 안전하고 구조화된 방식으로 로컬 및 원격 데이터를 사용할 수 있도록 돕는 아키텍처이며, 각 구성요소는 그 역할에 따라 요청자 역할의 MCP Host, 중개자 역할의 MCP Client, 실행자 역할의 MCP Server, 데이터 제공처 Local/Remote로 나뉘게 된다.
Workflow Example

2. MCP가 지원하는 전송 방식(Transport Mechanisms)
- Stdio (표준 입출력 기반 통신)
- Streamable HTTP (스트리밍 가능한 HTTP 통신)
2.1 Stdio Transport
- 표준 입출력(Standard Input/Output)을 통해 통신
- 주로 로컬에서 실행되는 프로세스 간 통신에 사용
- ex. 로컬에서 실행되는 CLI 도구와 백엔드 간 통신
장점
- 설치나 네트워크 설정이 필요없음
- 지연시간이 낮음
2.2 Streamable HTTP
- 이 방식에서는 MCP 서버가 독립적인 프로세스로 실행되며, 여러 클라이언트의 연결을 처리할 수 있다.
- 클라이언트와의 통신은 HTTP POST와 GET 요청을 통해 이루어집니다.
- 서브는 선택적으로 SSE(Server-Sent Events)를 사용하여 클라이언트에게 여러 개의 메세지를 스트리밍 방식으로 전송할 수 있다.
- 이를 통해 기본적인 요청-응답 외에도 서버에서 클라이언트로의 알림 및 요청이 가능한 더 풍부한 기능의 서버를 구현할 수 있다.
- 서버는 반드시 하나의 HTTP 엔드포인트 URL을 제공해야 하며, 해당 URL은 POST와 GET 요청 모두 지원해야 한다.
보안 주의사항 (Streamable HTTP 전송 사용 시)
Streamable HTTP 방식을 구현할 경우, 다음 보안 지침을 반드시 지켜야한다.
1. 서버는 모든 수신 요청의 Origin 헤더를 검증해야한다.
- 이를 통해 DNS rebinding 공격을 방지할 수 있다.
2. 로컬에서 실행할 경우, 서버는 127.0.0.1(localhost)에만 바인딩해야 하며, 0.0.0.0 (모든 인터페이스)에 바인딩해서는 안된다.
3. 서버는 모든 연결에 대해 적절한 인증 절차를 구현해야한다.
보안 조치를 하지 않으면, 공격자가 원격 웹사이트를 통해 로컬 MCP 서버에 접근할 수 있는 DNS rebinding 공격에 노출될 수 있다.
2.3 모든 전송 방식에서 공통적으로 사용되는 메시지 형식
JSON-RPC 2.0 프로토콜을 사용하여 메시지를 교환한다.
- JSON 기반의 원격 프로시저 호출(RPC) 형식
- 메시지는 다음과 같은 구조를 가진다.
{
"jsonrpc": "2.0",
"method": "example.method",
"params": { ... },
"id": 1
}
이는 요청과 응답 모두에 사용되며, 표준화된 방식으로 상호작용 가능
3. Connection lifecycle
3.1 Initialization

- 호스트가 MCP 클라이언트를 생성
- 클라이언트는 MCP 서버와 연결 설정
- 연결 설정 과정에서 프로토콜 버전, 기능, 권한 등 설정
3.2 Message Exchange
초기화가 완료되면, 클라이언트와 서버는 다음 두 가지 방식으로 메시지를 주고받을 수 있다.
1) 요청-응답 방식 (Request-Response)
- 클라이언트 또는 서버 중 어느 쪽이든 요청(request)을 보낼 수 있으며, 상대방은 해당 요청에 대해 응답(response)을 반환함.
- ex. "이 파일의 내용을 알려줘" → "다음은 파일 내용입니다"
2) 알림 방식 (Notifications)
- 단방향 메시지로, 상대방의 응답을 기대하지 않고 보내는 메시지
- ex. “이 설정이 변경되었습니다” 같은 상태 알림 등
서버와 클라이언트 모두 메시지를 보낼 수 있다.
3.3 Termination
MCP 연결은 클라이언트 또는 서버에서 다음 방식을 종료할 수 있다.
1) 정상 종료(Clean shutdown)
- close() 호출을 통해 의도적으로 연결 종료
- ex. 사용자 도구를 종료하거나 세션이 끝났을 때
2) 전송 연결 해제(Transport disconnection)
- TCP 또는 WebSocket 등의 기본 네트워크 연결이 끊어진 경우
- ex. 인터넷 연결이 끊기거나 시스템이 강제 종료된 경우
3) 오류 상황(Error conditions)
- 프로토콜 위반, 비정상적인 요청, 내부 오류 등이 발생했을 때 연결이 종료될 수 있다.
- 이 경우 클라이언트나 서버는 오류 메시지를 남기고 연결을 끊는다.
4. MCP 서버 구축
4.1 Core MCP Concepts
MCP는 다음 세가지 주요 유형의 기능을 제공한다.
- 리소스(Resources): 클라이언트가 읽을 수 있는 파일 형태의 데이터 (ex. API 응답 데이터, 텍스트 파일이나 문서 내용)
- 도구(Tools): LLM이 호출할 수 있는 함수 또는 명령어 (ex. 데이터베이스 쿼리 함수, 웹 요청을 보내는 기능)
- 프롬프트(Prompts): 사용자가 특정 작업을 수행할 수 있도록 도와주는 사전 작성된 프롬프트 템플릿이다. (ex. 보고서 요약 프롬프트, 이메일 작성 템플릿)
4.2 System requirements
Python 3.10 이상
Python MCP SDK 1.2.0 이상
4.3 개발 환경 설정
GitHub - astral-sh/uv: An extremely fast Python package and project manager, written in Rust.
An extremely fast Python package and project manager, written in Rust. - astral-sh/uv
github.com
uv 설치
- uv는 pip, venv, pip-tools, setuptools, virtualenv, pipenv, poetry 등을 대체할 수 있는 올인원 툴이다.
- Rust로 구현되어있어 속도가 매우 빠르며, 의존성 해식 및 설치, 가상환경 생성 등을 통합적으로 지원한다.
~$ pip install uv
~$ uv init fastmcp-test
~$ cd fastmcp-test
~$ uv venv
~$ source .venv/bin/activate
-
프로젝트를 생성하면 아래와 같은 파일들이 생성된다.

- 가상환경도 프로젝트 생성 시 .venv 경로에 자동으로 생성된다.
패키지 설치
GitHub - modelcontextprotocol/python-sdk: The official Python SDK for Model Context Protocol servers and clients
The official Python SDK for Model Context Protocol servers and clients - modelcontextprotocol/python-sdk
github.com
- mcp[cli] : MCP CLI 관련 기능
- httpx : HTTP 통신 라이브러리
~$ uv add "mcp[cli]" httpx
~$ touch fastmcp-test.py
- 현재 mcp에서 공식 지원하는 MCP SDK는 1.9.0이 가장 최신 버전
4.4 MCP 서버 구축
패키지 가져오기 및 인스턴스 설정
- mcp github에 나와있는 예제를 활용하여 테스트 진행.
- server.py를 아래와 같이 작성한다.
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Demo")
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
4.5 MCP 서버 실행
- 개발모드로 MCP 서버를 실행하려면 다음 명령어 사용
- MCP Inspector를 통해 테스트를 할 수 있다.
~$ mcp dev server.py
-
또는 Claude Desktop과 통합하여 사용하려면 다음 명령어를 실행한다.
~$ mcp install server.py
4.6 MCP 서버 테스트
- add 함수 호출
~$ curl -X POST http://localhost:5000 \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "method": "add", "params": {"a": 3, "b": 5}, "id": 1}'
- greeting 리소스 호출
~$ curl http://localhost:5000/greeting://daeun
5. MCP Inspector 사용하기
- mcp dev server.py로 실행하면 다음과 같이 MCP Inspector를 사용할 수 있다.
- MCP Inspector는 MCP 서버를 개발하거나 운영하는 과정에서 실시간 디버깅과 테스트를 도와주는 개발자 전용 도구이다.
- MCP Inspector를 사용하기 위해선, nvm, nodejs를 설치해주어야한다.

MCP Inspector는 두 구성요소로 이루어져있다.
- MCPI (MCP Inspector Client UI): 브라우저에서 접속 가능한 시각화된 디버깅 화면. (기본 포트: 6274)
- MCPP (MCP Proxy Server): MCP 서버와 클라이언트 UI 간 중계 역할을 하는 프록시 서버. (기본 포트: 6277)
MCP Inspector에서 Tools 사용 테스트(add 함수)

MCP Inspector에서 Resources 사용 테스트(get_greeting 함수)

참고
https://modelcontextprotocol.io
https://github.com/modelcontextprotocol/python-sdk
https://modulabs.co.kr/community/momos/8/feeds/653
https://blog.logto.io/ko/what-is-mcp