MCP Model Context Protocol
LLM이 외부도구 Tool, 데이터 Data, 시스템 System 과 표준 방식으로 연결하기 위한 프로토콜.
AI가 프로그램과 대화하기 위한 공통 언어.
기존의 서비스마다 연결 방식이 모두 달라 각각 api를 구현해야했던 단점을 mcp로 모든 tool을 동일한 방식으로 사용하여 통일화했다. 표준화, 확장성, 재사용성, 독립성
chatgpt -> api작성 -> db
chatgpt -> api작성 -> 파일
chatgpt -> api작성 -> git

MCP의 구조
MCP는 AI가 실제 시스템에 접근할 수 있게 해줌으로 보안이 매우 중요하고 최근 MCP 보안에 대한 연구와 권장사항도 활발히 나오고 있다.
Host: 사용자가 직접 사용하는AI애플리케이션, 질문을 받아 LLM을 실행한다. MCP Client를 통해 MCP Server와 통신한다.
Client: Host안에서 실행되는 MCP 통신 모듈, MCP Server를 연결하고 Tool 목록조회, Resource조회, Prompt 조회, Tool 을 실행한다 . search_file tool등을 호출한다. 내부구현은 중요하지않다.
Tool: LLM이 실행할 수 있는 함수, get_weather(), search_database(), send_email(), create_issue(), delete_file() .. LLM이 선택해서 실행하는 Tool
Resource: LLM이 읽기만 하는 데이터, 설정파일, PDF Markdown, 로그파일, SQL Schema, README..
Prompt 재사용가능한 프롬프트 템플릿
사용자
│
▼
┌─────────────────┐
│ Host │
│ ChatGPT Desktop │
│ Claude Desktop │
└────────┬────────┘
│
MCP Client
│
═════════════════════════════════════
Model Context Protocol
═════════════════════════════════════
│
┌────────▼────────┐
│ MCP Server │
├─────────────────┤
│ Tool │
│ Resource │
│ Prompt │
└─────────────────┘
│
Database / API / Files / GitHub
from mcp.server.fastmcp import FastMCP
# MCP Server 생성
mcp = FastMCP("Project Assistant")
# ==================================================
# Tool : LLM이 실행할 수 있는 함수
# ==================================================
@mcp.tool()
def search_file(keyword: str):
"""프로젝트에서 파일 검색"""
return f"'{keyword}'가 포함된 파일을 찾았습니다."
@mcp.tool()
def get_weather(city: str):
"""날씨 조회"""
return {
"city": city,
"temperature": 27,
"condition": "Sunny"
}
# ==================================================
# Resource : LLM이 읽기만 하는 데이터
# ==================================================
@mcp.resource("docs://readme")
def readme():
return """
# Project Assistant
이 프로젝트는 MCP(Model Context Protocol)를 이용하여
파일 검색과 문서 요약 기능을 제공합니다.
"""
# ==================================================
# Prompt : 재사용 가능한 프롬프트 템플릿
# ==================================================
@mcp.prompt()
def summarize(text: str):
return f"""
다음 내용을 핵심만 3줄로 요약하세요.
{text}
"""
# ==================================================
# MCP Server 실행
# ==================================================
if __name__ == "__main__":
mcp.run()
MCP는 아래의 서비스가 가능하다.
File 읽기, 저장, 조회
Database SQL 실행, 조회, 삽입, 수정, 삭제
Github Repository 조회, Issue 생성, PR 생성
Browser 웹검색, 스크린샷, 페이지 분석
Vector DB 유사도 검색, 문서검색, RAG
Email 메일조회 메일 발송
Calendar 일정조회, 일정 생성
@mcp.tool()
def read_file(path: str):
with open(path, "r", encoding="utf-8") as f:
return f.read()
@mcp.tool()
def save_file(path: str, content: str):
with open(path, "w", encoding="utf-8") as f:
f.write(content)
return "저장 완료"
import sqlite3
@mcp.tool()
def search_user(user_id: int):
conn = sqlite3.connect("user.db")
cur = conn.cursor()
cur.execute(
"SELECT * FROM users WHERE id=?",
(user_id,)
)
return cur.fetchone()
from github import Github
github = Github("TOKEN")
@mcp.tool()
def create_issue(title: str):
repo = github.get_repo("user/project")
issue = repo.create_issue(title=title)
return issue.html_url
import requests
@mcp.tool()
def search_web(keyword: str):
# 검색 API 호출(예시)
return f"{keyword} 검색 결과"
@mcp.tool()
def search_document(question: str):
# Chroma, Pinecone, FAISS 등 검색
return [
"문서1",
"문서2",
"문서3"
]
import smtplib
@mcp.tool()
def send_email(to: str, subject: str, body: str):
# SMTP 발송(예시)
return "메일 발송 완료"
@mcp.tool()
def create_event(title: str, date: str):
# Google Calendar API 호출(예시)
return f"{date} 일정 생성 완료"
@mcp.tool()은 "AI에게 이 함수를 공개(Public)하는 표시
MCP에서는 @mcp.tool()이라는 데코레이터(어노테이션)를 붙여서 "이 함수는 AI가 호출할 수 있는 Tool입니다." 라고 등록
실제 비즈니스 로직은 개발자가 직접 구현한다.
개발자가 구현하는 건 똑같은데 뭐가다른걸까?
구현이 아니라 연결 방식과 표준화가 다르다.
ChatGPT에 GitHub 기능을 붙인다고 하면 개발자가 직접 연결해야하지만 MCP에서는 @mcp.tool() tool로 등록해 ChatGPT든 Claude든 Cursor든 자동으로 읽어 AI가 Tool을 발견할 수 있게해 연결 로직을 직접 작성할 필요가없고 소스가 표준화, AI프로그램과 비즈니스 코드가 섞이지않고 명확히 구분된다는 장점이 있다.
함수을 만드는 일은 그대로지만 AI와 함수를 연결하는 방식이 표준화된것
if user_intent == "github":
github.create_issue()
elif user_intent == "email":
send_email()
elif user_intent == "calendar":
create_event()
일반적인 웹서버는 FastAPI나 Spring서버로 사용자나 애플리케이션의 HTTp 요청을 처리하지만 MCP Server는 사용자를 위한 서버가 아니라 AI를 위한 서버이다. MCP 전송방식은 여러가지가 지원되며 studio 로컬 프로세스간 통신, HTTP 웹서버 처럼 통신, Streamble HTTP 원격 MCP 서버에서 많이 사용한다. 내부적으로 FastAPI를 사용할 수도있지만 목적이 일반 웹 API 제공이 아니라 MCP 프로토콜을 통해 AI와 통신하는 것.
Function Calling과 MCP는 경쟁 기술이 아니라 서로 보완하는 기술로 비슷한것으로 오해하지만 역할이 다르다 .
Function Calling은 "이 질문에는 어떤 함수를 호출하면 좋을까?"를 결정하는 기능이고
MCP는 "이 AI가 사용할 수 있는 Tool은 무엇인가?"를 표준방식으로 알려주는 프로토콜이다 . 도구를 표준방식으로 공유하는 것이 목적즉 Function Calling은 함수가 프로그램 안에 있고, MCP는 함수가 별도의 MCP Server에 있다 .
LLM
│
├── get_weather()
├── send_email()
└── create_event()
LLM
│
▼
MCP Client
│
▼
MCP Server
│
├── Tool
├── Resource
└── Prompt
https://standout.tistory.com/1910
Function Calling이란? - 수동루프/자동실행 (feat.Docstring)
Function CallingFunction Calling은 LLM이 "이 함수를 호출하면 좋겠다"라고 판단하면 개발자가 만든 함수를 실행하는 기능 def get_weather(city): 함수를 개발했다면 사용자가 '서울날씨알려줘'라했을때 LLM이
standout.tistory.com
| Function Calling | MCP |
| LLM이 호출할 함수를 선택하는 기능 | AI와 외부 시스템을 연결하는 표준 프로토콜 |
| 함수(Function)를 등록 | Tool, Resource, Prompt를 제공 |
| 애플리케이션 내부에서 주로 사용 | 외부 서버와 표준 방식으로 통신 |
| OpenAI, Anthropic 등 모델마다 방식이 다를 수 있음 | MCP를 지원하는 AI에서 동일하게 사용 가능 |
| 작은 규모의 프로젝트에 적합 | 다양한 시스템을 연결하는 Agent에 적합 |
MCP가 Function Calling을 대체하는것이 아닌 오히려 함께 사용하는 경우가 많다 .
MCP Host에서 function calling, MCP, Tool실행을 모두 자동으로 처리한다.
예전 chat completions api에서는 function calling 이 보였으나
최신 SDK에서는 Function Calling을 SDK가 숨겨주기 때문에 코드에서 보이지않을 뿐이다 .
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "현재 날씨 조회",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
}
}
}
}
]
{
"tool_calls": [
{
"function": {
"name": "get_weather",
"arguments": {
"city": "서울"
}
}
}
]
}
사용자
↓
LLM
↓
Function Calling
(어떤 Tool을 사용할지 결정)
↓
MCP
(선택한 Tool을 실행)
↓
결과
↓
LLM