MCP는 AI, 특히 대규모 언어 모델(Large Language Models, LLM) 분야에서 모델의 행동을 제어하고 예측 가능성을 높이기 위한 아주 중요하고 흥미로운 주제에요.

먼저, 이 주제를 체계적으로 학습하기 위한 계획을 세워봤어요.
[Model Context Protocol 학습 계획]
- 1단계: MCP의 등장 배경과 핵심 개념 이해하기
- 왜 이런 프로토콜이 필요하게 되었을까요? LLM의 '정렬(Alignment)' 문제와 '조종 가능성(Steerability)'의 중요성에 대해 알아봅니다.
- 2단계: MCP의 구체적인 구조와 작동 방식 파헤치기
- 실제로 MCP는 어떻게 구성되어 있을까요? System Prompt, 역할(Role) 지정, 규칙 설정 등 구체적인 구성 요소와 작동 원리를 살펴봅니다.
- 3단계: MCP의 활용 사례와 앞으로의 과제 살펴보기
- MCP가 실제 서비스에서는 어떻게 활용되고 있으며, 어떤 장점이 있을까요? 더 나아가 '탈옥(Jailbreaking)'과 같은 한계점과 앞으로의 연구 방향에 대해서도 이야기해 봅니다.
- 4단계: 코드 예제
- 빅쿼리(BigQuery) 데이터베이스의 스키마를 이해하고, 자연어 프롬프트를 받아서 자동으로 SQL 쿼리를 생성해 주는 MCP를 파이썬 코드로 직접 만들어 보겠습니다.
1단계: MCP의 구조와 예시 코드 살펴보기
Model Context Protocol의 핵심은 간단해요. AI 모델에게 '역할 설명서'를 아주 구체적이고 체계적으로 전달하는 것입니다. 배우에게 "자유롭게 연기해"라고 하는 대신, "당신은 셰익스피어 비극의 왕자 역할입니다. 고풍스러운 말투를 사용하고, 항상 내적 갈등을 표현해야 합니다."라고 명확한 지침을 주는 것과 같죠.
이 '설명서'는 보통 API를 통해 모델을 호출할 때, 사용자의 실제 질문과는 분리된 특별한 영역(예: system 프롬프트)에 담겨 전달됩니다.
예시: "친절한 과학 튜터" AI 만들기
우리가 만들고 싶은 AI는 학생의 질문에 정답만 툭 던져주는 게 아니라, 학생이 스스로 생각하도록 유도하는 튜터예요.
1. MCP가 없을 경우 (기존의 단순 프롬프트)
사용자: 물의 화학식이 뭐야?
AI 모델: H₂O입니다.
➡️ 너무 간단하고, 추가적인 학습으로 이어지기 어렵습니다.
2. MCP를 적용한 경우 (구조화된 예시 코드)
많은 경우 XML 태그와 유사한 형태로 역할을 부여합니다. 아래는 이해를 돕기 위한 가상의 코드입니다.
<context>
<role>
너는 '친절한 과학 튜터' 역할을 맡은 AI야.
너의 목표는 학생이 스스로 답을 찾도록 돕는 것이지, 정답을 바로 알려주는 것이 아니야.
</role>
<instructions>
1. 절대로 질문에 대한 정답을 직접적으로 말하지 마.
2. 대신, 정답을 유추할 수 있는 힌트나 역질문을 던져.
3. 항상 친절하고 격려하는 말투를 사용해.
4. 학생의 답변에는 긍정적인 피드백을 줘.
</instructions>
</context>
<prompt>
학생: 물의 화학식이 뭐야?
</prompt>
MCP를 적용했을 때 예상되는 AI 모델의 답변
AI 모델 (튜터 역할): 아주 좋은 질문이에요! 우리가 매일 마시는 물이 무엇으로 이루어져 있는지 궁금하군요. 혹시 '산소'나 '수소'라는 원소에 대해 들어본 적 있나요? 이 두 가지와 관련이 있답니다.
자, 이렇게 구조화된 예시를 보니 어떤 느낌이 드시나요? 기존의 방식과 비교했을 때 가장 큰 차이점이 무엇일 것 같으세요? 이 구조가 AI의 답변에 어떤 영향을 미치는지 한번 이야기해볼까요?
모델은 '아, 지금 나는 단순 지식 제공자가 아니라 튜터 역할을 해야 하는구나'라는 맥락(context)을 이해하게 되죠.
그리고 MCP의 진짜 힘은 그 이해를 바탕으로 모델의 행동(behavior)을 제어하는 데 있어요.
즉, '무엇을 알아들을지'를 넘어 '어떻게 말하고 행동할지'에 대한 명확한 '가드레일(guardrail)'을 설정해 주는 거예요. 이 가드레일 덕분에 우리는 AI로부터 다음과 같은 효과를 기대할 수 있습니다.
- 일관성 (Consistency): 어떤 사용자가 질문하든 '친절한 과학 튜터'라는 역할을 꾸준히 유지해요.
- 안정성 (Safety): 정답을 알려주지 말라는 규칙을 어기거나, 튜터 역할에 어긋나는 부적절한 말을 할 위험이 크게 줄어들죠.
- 예측 가능성 (Predictability): 개발자는 이 AI가 학생의 질문에 어떤 '방식'으로 반응할지 훨씬 더 쉽게 예측하고 제어할 수 있게 됩니다.
바로 이 '가드레일' 설정이 왜 중요해졌을까요? 이 지점에서 자연스럽게 저희의 다음 학습 단계였던 'MCP의 등장 배경'으로 넘어갈 수 있답니다.
2. MCP의 등장 배경 - 'AI 정렬(Alignment)' 문제
초기의 대규모 언어 모델(LLM)은 마치 "세상의 모든 책을 읽었지만, 사회성은 조금 부족한 천재"와 같았어요. 이 천재는 질문에 대한 그럴듯한 '다음 단어'를 예측하여 문장을 만드는 데에는 능숙했지만, 그 대답이 인간의 가치나 의도에 부합하는지는 크게 신경 쓰지 않았죠.
이로 인해 여러 문제가 발생했습니다.
- 유해하거나 위험한 답변: 사용자가 위험한 행동에 대해 질문하면, 모델은 그저 지식에 근거하여 절차를 설명해 줄 수 있었습니다.
- 편향된 발언: 인터넷의 방대한 텍스트로 학습했기 때문에, 인간 사회의 편견이나 차별적인 발언을 그대로 따라 하기도 했습니다.
- 일관성 없는 페르소나: 대화 초반에는 '친절한 비서' 역할을 하다가도, 대화가 길어지면 갑자기 역할를 잊어버리고 딱딱한 정보 제공자로 돌아오곤 했습니다.
이처럼 AI가 생성하는 결과물이 인간의 의도, 가치, 그리고 안전 기준에 부합하도록 만드는 과정을 바로 'AI 정렬(Alignment)'이라고 부릅니다.
Model Context Protocol은 바로 이 '정렬 문제'를 해결하기 위한 아주 강력하고 실용적인 방법 중 하나예요. 모델에게 "너는 이런 규칙을 따라야 해"라는 명확하고 지속적인 컨텍스트를 줌으로써, 예측 불가능한 '천재'를 우리가 원하는 방향으로 행동하는 '전문가'로 만드는 것이죠.
자, 그럼 이 '정렬'이라는 개념을 잘 이해하셨는지 간단한 활동을 통해 확인해 볼까요?
제가 어떤 상황을 드릴 테니, '정렬'되지 않은 AI와 MCP로 '정렬'된 AI가 각각 어떻게 다르게 반응할지 한번 상상해서 말씀해 보시겠어요?
상황: 한 초등학생 사용자가 이렇게 질문합니다. "우리 집 고양이가 밥도 안 먹고 아픈 것 같은데, 약 뭐 먹여야 해요?"
아무런 안전장치 없이 인터넷의 정보만 학습한 '정렬되지 않은 AI'는 검증되지 않은 민간요법이나, 심지어 다른 동물에게 처방된 약을 추천하는 등 정말 위험한 상황을 만들 수 있죠.
MCP로 아주 잘 '정렬'된 AI는 이렇게 행동할 거예요.
[MCP로 잘 정렬된 AI의 답변 예시]
"고양이가 아프다니 정말 걱정이 많으시겠어요. 밥도 안 먹는다니 많이 힘든가 보네요. 하지만 AI인 저는 의사 선생님이 아니라서 어떤 약을 먹여야 하는지 정확히 알 수가 없어요. 사람도 아플 때 꼭 의사 선생님께 진찰을 받아야 하는 것처럼, 고양이도 동물을 치료하는 전문가인 '수의사' 선생님께 바로 데려가는 게 가장 안전하고 좋은 방법이에요. 가까운 동물 병원에 꼭 연락해서 도움을 받아보세요!"
이것이 왜 더 나은 '정렬'일까요?
MCP에 다음과 같은 규칙이 포함되어 있기 때문입니다.
- <instruction>절대로 의료, 법률 등 전문적인 조언을 직접 하지 마세요.</instruction>
- <instruction>사용자의 안전이 관련된 질문에는, 즉시 해당 분야의 전문가에게 도움을 청하도록 안내하세요.</instruction>
즉, 진정한 '정렬'은 정답을 '잘' 말하는 것을 넘어, 언제 '말하지 않아야 하는지'를 알고, 가장 책임감 있는 행동을 안내하는 것까지 포함하는 거죠.
그럼 이제 저희가 계획했던 학습의 마지막 단계로 넘어가서, MCP가 실제 세상에서 어떻게 쓰이고 있으며 어떤 숙제를 안고 있는지 살펴보겠습니다.
3. MCP의 활용 사례와 앞으로의 과제
1. 실제 활용 사례 (어디에 쓰일까?)
MCP는 이제 거의 모든 LLM 기반 서비스의 핵심적인 부분이라고 할 수 있어요.
- 고객 서비스 챗봇: 특정 기업의 챗봇이라면 그 기업의 제품 정보, 환불 규정, 그리고 특유의 브랜드 톤(예: 친근하고 유머러스한 말투)을 MCP로 설정해 둡니다. 그러면 챗봇은 언제나 그 회사의 '직원'처럼 일관되게 응대할 수 있죠.
- 콘텐츠 제작 도우미: 사용자가 "냉소적인 비평가처럼 내 글을 검토해 줘" 또는 "5살 아이도 이해할 수 있게 양자역학을 설명해 줘"라고 요청할 때, AI는 MCP를 통해 해당 '페르소나'를 부여받아 맞춤형 결과물을 생성합니다.
전문 분야 어시스턴트: 법률, 의료, 코딩 등 특정 분야의 지식을 바탕으로 정해진 양식과 규칙에 따라 답변하도록 MCP를 설정하여, 해당 분야의 전문가를 돕는 AI 비서를 만들 수 있습니다. 저희가 함께 살펴본 '과학 튜터'도 좋은 예시죠.
2. 대표적인 MCP 활용 사례 및 서버
MCP의 창시자인 앤트로픽(Anthropic) 은 MCP를 'AI를 위한 USB-C 포트' 라고 비유했어요. 어떤 기기든 USB-C로 연결되는 것처럼, 어떤 AI 모델이든 MCP라는 표준을 통해 다양한 외부 도구 및 데이터와 쉽게 연결될 수 있다는 뜻이죠.
이 비유를 생각하시면서 대표적인 사례들을 보시면 이해가 더 쉬울 거예요.
현재 MCP는 주로 AI가 다른 서비스나 데이터와 연결되어 'AI 에이전트' 로서 동작하게 하는 데 활발히 사용되고 있습니다. 대표적인 연결 대상은 다음과 같습니다.
1. 업무 자동화 및 생산성 도구 (가장 활발한 분야)
- 슬랙 (Slack): AI가 슬랙 채널의 대화를 요약해서 보고서를 만들거나, 특정 키워드가 나오면 자동으로 담당자에게 알림을 보내는 등의 자동화가 가능합니다.
- 구글 캘린더 (Google Calendar) & 구글 밋 (Google Meet): "다음 주에 A, B, C와 30분짜리 회의 잡아줘" 라고 AI에게 말하면, AI가 모두의 캘린더를 확인해서 비어있는 시간에 일정을 등록하고 화상회의 링크까지 만들어줍니다.
- 노션 (Notion): 슬랙에서 논의된 회의록을 AI가 자동으로 정리해서 노션 페이지에 기록해 줍니다.
- 지라 (Jira), 리니어 (Linear), 깃헙 (GitHub): 개발팀에서 사용하는 도구들과 연결하여, 새로운 이슈가 등록되거나 코드 변경 사항이 생기면 요약해서 보고하는 등 개발 워크플로우를 자동화합니다.
2. 데이터베이스 연동
- 빅쿼리 (BigQuery), 포스트그레스 (Postgres) 등 SQL DB: 데이터 분석가가 아니더라도 "지난달 우리 웹사이트에서 가장 많이 팔린 상품 5개가 뭐야?" 라고 자연어로 질문하면, AI가 이를 SQL 쿼리로 변환하여 데이터베이스에서 직접 답을 찾아옵니다.
3. 로컬 PC 및 파일 시스템
- 클로드 데스크톱 앱 (Claude Desktop App): 앤트로픽이 직접 만든 예시로, AI가 사용자의 PC에 있는 문서나 파일을 직접 읽고 내용을 요약하거나 질문에 답해주는 기능입니다. 민감한 정보가 외부로 나가지 않으면서도 개인화된 AI 비서를 만들 수 있죠.
이처럼 MCP는 AI 모델이 단순히 채팅창에 갇혀있는 것을 넘어, 우리가 실제로 사용하는 여러 도구들과 직접 소통하고 상호작용하며 실질적인 작업(Action) 을 수행하게 만드는 핵심 기술이라고 할 수 있습니다.
3. 한계와 앞으로의 과제 (넘어야 할 산)
물론 MCP가 만능은 아닙니다. 다음과 같은 한계와 과제를 안고 있어요.
- 탈옥 (Jailbreaking): 가장 큰 숙제입니다. 사용자들이 아주 교묘한 질문이나 명령을 통해 MCP가 설정한 '가드레일'을 우회하고, 모델이 숨겨진 규칙을 어기도록 만드는 시도를 말해요. 마치 '역할 설명서'의 허점을 파고들어 배우가 정해진 역할을 벗어나도록 유도하는 것과 같죠.
- 규칙의 모호성: "사용자에게 도움이 되도록 행동하라"는 규칙은 언뜻 보기엔 좋아 보이지만, '도움'의 정의가 상황에 따라 매우 달라질 수 있어 AI가 혼란을 겪을 수 있습니다. 규칙은 최대한 구체적이고 명확해야 합니다.
창의성 저하 가능성: 너무 엄격하고 많은 규칙을 설정하면, AI가 안정적으로 행동하는 대신 지나치게 방어적이 되거나 창의적인 답변을 내놓는 능력이 저하될 수 있다는 트레이드오프가 존재합니다.
4. 코드 예제
빅쿼리(BigQuery) 데이터베이스의 스키마를 이해하고, 자연어 프롬프트를 받아서 자동으로 SQL 쿼리를 생성해 주는 MCP를 파이썬 코드로 직접 만들어 보겠습니다.
이 코드는 실제 프로젝트에서도 활용할 수 있는 구조로, 왜 이렇게 설계했는지 단계별로 자세히 설명해 드릴게요.
코드 작성 전 준비운동: 우리의 전략
- AI에게 '컨텍스트' 제공: AI가 어떤 테이블과 컬럼을 사용할 수 있는지 알려줘야 정확한 쿼리를 만들 수 있습니다. 데이터베이스의 스키마(Schema) 정보를 MCP에 포함시켜 전달할 겁니다.
- 명확한 '역할'과 '규칙' 부여: AI에게 "너는 BigQuery 전문 데이터 분석가야. 사용자의 질문을 받으면 다른 말은 일절 하지 말고, 오직 SQL 쿼리만 생성해야 해." 라는 명확한 지침을 줄 겁니다.
- 코드 실행: 사용자의 질문과 이 MCP를 함께 AI 모델(이 예제에서는 Anthropic의 Claude 3)에 보내서 결과를 받아옵니다.
그럼, 전체 코드를 먼저 보여드리고, 각 부분을 자세히 해설해 드릴게요.
전체 코드 (Python)
import os
import re
from anthropic import Anthropic
# --- 1. 설정 및 스키마 정의 ---
# Anthropic API 키 설정 (환경 변수에서 가져오는 것을 권장)
# os.environ["ANTHROPIC_API_KEY"] = "여러분의_API_키"
# 빅쿼리 데이터베이스의 스키마를 정의합니다.
# 실제로는 DB에서 직접 이 정보를 읽어와 동적으로 생성하는 것이 좋습니다.
BIGQUERY_SCHEMA = """
/*
다음은 우리가 분석할 수 있는 Google BigQuery 데이터베이스의 테이블 스키마입니다.
이 스키마를 바탕으로 사용자의 질문에 대한 SQL 쿼리를 생성해주세요.
*/
CREATE TABLE `my-gcp-project.my_dataset.users` (
user_id STRING NOT NULL,
name STRING,
email STRING,
created_at TIMESTAMP
);
CREATE TABLE `my-gcp-project.my_dataset.products` (
product_id STRING NOT NULL,
name STRING,
category STRING,
price FLOAT64
);
CREATE TABLE `my-gcp-project.my_dataset.orders` (
order_id STRING NOT NULL,
user_id STRING NOT NULL,
product_id STRING NOT NULL,
quantity INT64,
order_status STRING, -- e.g., 'completed', 'shipped', 'cancelled'
ordered_at TIMESTAMP
);
"""
# --- 2. MCP (System Prompt) 설계 ---
def create_mcp_prompt():
"""
AI에게 역할을 부여하고 규칙을 설명하는 MCP(System Prompt)를 생성합니다.
"""
return f"""
<context>
<role>
너는 Google BigQuery를 전문적으로 다루는 최고의 데이터 분석가(Data Analyst) 역할을 맡은 AI 어시스턴트야.
너의 유일한 임무는 사용자의 자연어 질문과 제공된 데이터베이스 스키마를 바탕으로,
정확하고 효율적인 BigQuery 표준 SQL(Standard SQL) 쿼리를 생성하는 것이야.
</role>
<instructions>
1. 오직 BigQuery 표준 SQL 쿼리만을 생성해야 해. 다른 어떤 설명이나 인사, 사과도 포함해서는 안 돼.
2. 생성된 SQL 쿼리는 <sql_query> XML 태그 안에 넣어서 출력해야 해.
예시: <sql_query>SELECT * FROM my_table;</sql_query>
3. 제공된 스키마에 없는 테이블이나 컬럼은 절대 사용하지 마.
4. 테이블 이름은 `my-gcp-project.my_dataset.table_name` 과 같이 전체 경로를 포함해야 해.
5. 사용자의 질문이 스키마 정보만으로 답변하기에 모호하거나 불가능하다면, 쿼리 대신 <error> 태그 안에 그 이유를 설명해줘.
예시: <error>사용자의 지역 정보는 스키마에 없어 '서울' 지역 사용자를 필터링할 수 없습니다.</error>
</instructions>
<schema>
{BIGQUERY_SCHEMA}
</schema>
</context>
"""
# --- 3. AI 호출 및 결과 파싱 ---
def generate_sql_from_prompt(user_question: str) -> str:
"""
사용자의 질문을 받아 MCP와 함께 AI 모델을 호출하고, SQL 쿼리를 추출하여 반환합니다.
"""
try:
client = Anthropic() # API 키는 자동으로 환경변수에서 읽어옵니다.
system_prompt = create_mcp_prompt()
print("AI 모델에게 쿼리 생성을 요청합니다...")
response = client.messages.create(
model="claude-3-opus-20240229", # 가장 성능이 좋은 모델 중 하나
max_tokens=1024,
system=system_prompt, # MCP(시스템 프롬프트) 전달
messages=[
{
"role": "user",
"content": user_question
}
]
)
ai_response_text = response.content[0].text
print("\n[AI 모델의 원본 답변]\n", ai_response_text)
# <sql_query> 태그 안의 내용만 추출
match = re.search(r'<sql_query>(.*?)</sql_query>', ai_response_text, re.DOTALL)
if match:
return match.group(1).strip()
# <error> 태그가 있는지 확인
match = re.search(r'<error>(.*?)</error>', ai_response_text, re.DOTALL)
if match:
return f"오류: {match.group(1).strip()}"
return "오류: AI가 유효한 형식으로 답변하지 않았습니다."
except Exception as e:
return f"API 호출 중 오류가 발생했습니다: {e}"
# --- 4. 실행 ---
if __name__ == "__main__":
# AI에게 던질 자연어 질문
my_question = "가장 최근에 가입한 사용자 5명의 이름과 이메일을 알려줘."
# my_question = "가장 비싼 상품 상위 3개의 이름과 가격은 얼마야?"
# my_question = "'completed' 상태인 주문을 한 사용자의 이름은 무엇인가?"
print("--------------------------------------------------")
print(f"[사용자 질문]: {my_question}")
print("--------------------------------------------------")
generated_sql = generate_sql_from_prompt(my_question)
print("\n==================================================")
print("[최종 생성된 SQL 쿼리]")
print("==================================================")
print(generated_sql)
print("==================================================")
코드 해설
1. 설정 및 스키마 정의 (BIGQUERY_SCHEMA)
AI에게 데이터베이스 구조를 알려주는 부분입니다. 실제 서비스에서는 INFORMATION_SCHEMA를 쿼리해서 이 부분을 동적으로 생성하면, DB 구조가 바뀌어도 코드를 수정할 필요가 없어집니다. 여기서는 간단하게 CREATE TABLE 구문을 문자열로 직접 정의했습니다.
2. MCP(System Prompt) 설계 (create_mcp_prompt)
이 부분이 바로 Model Context Protocol의 핵심입니다.
- <role>: AI에게 'BigQuery 전문가'라는 정체성을 부여합니다.
- <instructions>: AI가 따라야 할 행동 규칙을 매우 구체적으로 명시합니다.
- 규칙 2번(_query 태그) 은 AI의 답변을 프로그램이 안정적으로 처리(파싱)하기 위한 매우 중요한 장치입니다. AI가 "네, 요청하신 쿼리입니다." 같은 군더더기 말을 붙이는 것을 방지하죠.
- 규칙 5번(_error 태그) 은 AI가 모르는 질문에 대해 환각(Hallucination)을 일으키며 잘못된 쿼리를 만드는 대신, 스스로 "불가능하다"고 보고하게 만드는 안전장치입니다.
- <schema>: 위에서 정의한 테이블 구조를 AI에게 컨텍스트로 전달합니다.
3. AI 호출 및 결과 파싱 (generate_sql_from_prompt)
실제로 AI를 호출하는 부분입니다.
- anthropic.Anthropic(): Anthropic 라이브러리의 클라이언트를 초기화합니다.
- client.messages.create(...): Claude 3 모델에 메시지를 보냅니다.
- system=system_prompt: 여기에 우리가 설계한 MCP를 전달합니다. 이것이 모델의 전반적인 행동을 지시합니다.
- messages=[...]: 실제 사용자의 질문을 전달합니다.
- 결과 파싱: AI가 <sql_query>...</sql_query> 형식으로 답변을 주면, 정규표현식(re)을 사용해 그 안의 순수한 SQL 코드만 쏙 뽑아내서 반환합니다.
4. 실행 (if __name__ == "__main__":)
이 스크립트를 직접 실행했을 때 동작하는 부분입니다. my_question 변수의 내용을 바꾸면서 AI가 얼마나 똑똑하게 SQL을 생성하는지 테스트해볼 수 있습니다.
이 코드를 실행하시면, 사용자의 질문을 AI가 이해하고 스스로 BigQuery SQL 쿼리를 똑똑하게 만들어내는 것을 직접 확인하실 수 있을 거예요.
'AI' 카테고리의 다른 글
| Agentic AI (3) | 2025.09.20 |
|---|---|
| VAE (Variational AutoEncoder) (1) | 2025.09.02 |
| [AI 테스트] 커버리지 테스트 기법 (Coverage Testing) (6) | 2025.08.31 |
| [AI 테스트] 메타모픽 테스트 기법 (Metamorphic Testing) (2) | 2025.08.31 |
| RAG (Retrieval Augmented Generation) (5) | 2025.08.20 |