[κ°λ ] λͺ¨λΈ 컨ν μ€νΈ νλ‘ν μ½(MCP) μμ μ 볡
μλ³Έ κ²μκΈ: https://velog.io/@euisuk-chung/MCP-μμ -μ 볡νκΈ°
AIμ USB μλκ° μμλλ€
μ΅κ·Ό AI κ°λ° μνκ³μμ βMCP(Model Context Protocol)βλΌλ ν€μλκ° μ¬μμΉ μμ μ£Όλͺ©μ λ°κ³ μμ΅λλ€. ChatGPT, Claude, Cursor λ± λ€μν AI μλν°μ μμ΄μ νΈ νκ²½μ΄ μ겨λλ κ°μ΄λ°, LLM(Large Language Model)κ³Ό μΈλΆ λꡬλ₯Ό μ°κ²°νλ βνμ€ μΈν°νμ΄μ€βκ° νμνλ€λ μΈμμ΄ λμμ‘κ³ , κ·Έ ν΄κ²°μ± μΌλ‘ λ±μ₯ν κ²μ΄ λ°λ‘ MCPμ λλ€.
MCPλ λ¨μν κΈ°μ μμλ₯Ό λμ΄, AI λꡬ μνκ³λ₯Ό νλμ ν΅ν©λ νλ«νΌμΌλ‘ νμ₯μν€λ κ°λ μ λλ€. AIκ° λ¨μν ν μ€νΈ μμ±μ κ·ΈμΉμ§ μκ³ , μ€μ λ‘ λ¬΄μΈκ°λ₯Ό βν μ μλβ μμ΄μ νΈκ° λκΈ° μν΄μλ λ€μν μΈλΆ λꡬμμ μ°κ²°μ΄ νμμ μΈλ°, μ΄ μ°κ²°μ μ΄λ»κ² ν¨μ¨μ μ΄κ³ 보νΈμ μΈ λ°©μμΌλ‘ ꡬνν κ²μΈκ°μ λν ν΄λ΅μ΄ λ°λ‘ MCPμ λλ€.
λ°μ΄ν°κ³Όνμ μ μ₯μμ 보면, λͺ¨λΈμ΄ μμΈ‘μ λμ΄μ μ§μ νλ(μ: νμΌ μ΄κΈ°, μ΄λ©μΌ μ μ‘, DB μ§μ λ±)μ νλ €λ©΄ μ€μ μΈκ³μμ μ°κ²°μ΄ νμν©λλ€. κ·Έ μ°κ²°μ λ€λ¦¬κ° λ°λ‘ MCPμ΄λ©°, μ΄λ λ§€μ° κ΅¬μ‘°νλ λ°©μμΌλ‘ μ΄λ£¨μ΄μ§λλ€. μ΄ κΈμμλ μ΅λν μΉμ νκ³ λΉμ 곡μλ μ΄ν΄ν μ μλλ‘ MCP κ°λ μ μ€λͺ νκ³ , μ€μ μ¬μ© μ¬λ‘μ ν¨κ» μ°¨κ·Όμ°¨κ·Ό μλ΄λ릴 μμ μ λλ€.
MCP(Model Context Protocol)
λ LLMμ΄ μΈλΆ λꡬ(ν΄), λ°μ΄ν°, μ ν리μΌμ΄μ
λ±κ³Ό μνΈμμ©ν μ μκ² ν΄μ£Όλ κ°λ°©ν μΈν°νμ΄μ€ κ·μ½μ
λλ€.
μ‘°κΈ λ μ½κ² λ§νλ©΄, AI λͺ¨λΈμ΄ μΈν°λ· κ²μ, νμΌ μ μ₯, μ½λ μ€ν, λ°μ΄ν°λ² μ΄μ€ μ§μ κ°μ μΌμ ν μ μλλ‘ λꡬ(tool)λ₯Ό μ¬μ©ν μ μκ² ν΄ μ£Όλ 곡ν΅μ μ¬μ© μ€λͺ μλΌκ³ μκ°νλ©΄ λ©λλ€.
λΉμ : USB-C κ·κ²©
MCPλ AI μνκ³μ USB-Cλ€.
μ€λ§νΈν°, λ ΈνΈλΆ, μΉ΄λ©λΌ λ± λ€μν κΈ°κΈ°λ€μ΄ USB-CλΌλ νλμ νμ€ ν¬νΈλ₯Ό ν΅ν΄ μΆ©μ /λ°μ΄ν° μ μ‘μ΄ κ°λ₯ν΄μ§ κ²μ²λΌ, MCPλ λ€μν AI ν΄κ³Ό μ ν리μΌμ΄μ μ βνμ€ μΈν°νμ΄μ€β νλλ‘ LLMκ³Ό μ°κ²°ν μ μλλ‘ λ§λ€μ΄μ€λλ€.
μ¦, MCPλ LLMμ΄ μΈλΆ κΈ°λ₯μ βν둬ννΈβλ§μΌλ‘ νΈμΆνκ³ μ μ΄ν μ μκ² νλ API νμ€μ΄λΌκ³ λ³Ό μ μμ΅λλ€.
μμ μλ λͺ¨λΈμ΄ νμΌμ μ μ₯νλ €λ©΄ βνμΌ μ μ₯μ© μ½λβλ₯Ό μ§μ μ°κ²°ν΄μΌ νμ§λ§, μ΄μ λ MCPλ‘ λνλ λκ΅¬λ§ μμΌλ©΄ μ΄λ AIλ κ³΅ν΅ λ°©μμΌλ‘ λΆλ¬ μ¬μ©ν μ μκ² λ κ²μ λλ€.
κΈ°μ‘΄ λ°©μμ νκ³
μμ μλ AIκ° μΈλΆ λꡬλ₯Ό μ°λ €λ©΄ λ€μκ³Ό κ°μ 볡μ‘ν μ‘°κ±΄μ΄ νμνμ΅λλ€:
- νΉμ νλ μμν¬(μ:
LangChain
,LanGraph
)λ₯Ό λ°°μμΌ νκ³ , - κ°κ°μ λꡬμ λ§κ² 컀μ€ν μ½λλ‘ μ°κ²°ν΄μΌ νλ©°,
- λͺ¨λΈλ§λ€ μ°λ λ°©μμ΄ λ¬λΌ μ€λ³΅ κ°λ°μ΄ λ§μκ³ ,
- λ€μν λꡬλ₯Ό ν λ²μ μ°λνκΈ° μ΄λ €μ μ΅λλ€.
MCPμ λμ ν¨κ³Ό
μ΄λ° λΉν¨μ¨μ±μ μ€μ΄κΈ° μν΄, MCPλ λ€μμ κ°λ₯νκ² λ§λλλ€:
- μ΄λ€ λꡬλ νμ€νλ λ°©μμΌλ‘ μ°κ²°ν μ μμ
- μ΄λ€ AI λͺ¨λΈ(GPT, Claude λ±)μ΄λ λμΌν λ°©μμΌλ‘ νΈμΆ κ°λ₯
- κ°λ°μλ μΌλ° μ¬μ©μλ μ½κ² μ¬μ©ν μ μλλ‘ μ§κ΄μ μΈ κ΅¬μ‘°
- λꡬ μνκ³κ° βμ±μ€ν μ΄βμ²λΌ νμ₯ κ°λ₯ν¨
μΆμ²: https://changelog.langchain.com/announcements/mcp-adapters-for-langchain-and-langgraph
νλ§λλ‘, AIκ° μ€μΈκ³μμ λ€μν μμ μ νλ €λ©΄ κ·Έ κΈ°λ°μ΄ λλ λꡬλ€μ μ°κ²° κ΅¬μ‘°κ° νμνκ³ , MCPλ μ΄κ±Έ λͺ¨λμκ² μ΄λ € μλ λ°©μμΌλ‘ μ 곡νλ κ²μ λλ€.
κ΄λ ¨ λ§ν¬
μ΄λ ΅κ² μκ°νμ§ λ§κ³ , μ¬λ-λꡬ-μ€κ³μ κ΅¬μ‘°λ‘ μ΄ν΄νμ
MCP(Multi-Agent Control Protocol)
λ 볡μ‘ν λꡬ μ μ΄ νκ²½μ λ¨μννκΈ° μν΄ νΈμ€νΈ(Host), ν΄λΌμ΄μΈνΈ(Client), μλ²(Server)λ‘ κ΅¬μ±λ 3κ³μΈ΅ ꡬ쑰λ₯Ό λ°λ¦
λλ€.
μΆμ²: https://github.com/langchain-ai/langchain-mcp-adapters/tree/main
μ΄ κ΅¬μ‘°λ βAI μ± β ν΅μμ β λꡬβ κ΄κ³λ‘ μ΄ν΄ν μ μμ΅λλ€.
π§© μ 체 ꡬ쑰 μμ½
μν | ꡬμ±μμ | ν΅μ¬ κΈ°λ₯ |
---|---|---|
π§ Host (AI App) | LangGraph Agent, Claude App λ± | μ¬μ©μμ λͺ λ Ήμ μ΄ν΄νκ³ ν΄λΌμ΄μΈνΈλ₯Ό ν΅ν΄ μ€ν μ§μ |
π£οΈ Client (MCP ν΄λΌμ΄μΈνΈ) | Py Client, Claude Client λ± | Host β Server κ° μ€κ° λ€λ¦¬ μν . μμ²μ νλ‘ν μ½ νμμΌλ‘ λ²μ |
π οΈ Server (MCP μλ²) | Tool Server (Math, Data λ±) | μ€μ λ‘ μμ μ μννλ λꡬ μ€νκΈ° |
1) π§ Host (APP, LangGraph λ±)
μ¬μ©μμ μνΈμμ©νλ©° ν΄λΌμ΄μΈνΈλ₯Ό ν΅ν΄ μμ²μ μ λ¬νλ AI μ ν리μΌμ΄μ
- Claude, Cursor λ±μ μ¬μ©μμ μμ°μ΄ λͺ λ Ήμ μ΄ν΄νκ³ μμ μ μννκΈ° μν μ€λΉλ₯Ό ν©λλ€.
- νμ§λ§ μ§μ MCP μλ²μ ν΅μ ν μλ μκ³ , μ€κ°μ ν΄λΌμ΄μΈνΈ(Client)κ° νμν©λλ€.
- μ¦, Hostλ μ¬μ©μμ μμ²μ μ΄ν΄ν λ€ μ€μ μμ
μ MCP ν΄λΌμ΄μΈνΈκ° λμ μνν μ μλλ‘ μμ²μ μ λ¬ν©λλ€.
- λ€λ₯΄κ² νννλ©΄, μ§μ μ€ννμ§ μκ³ ν΄λΌμ΄μΈνΈμκ² μμ μνμ μμ²νλ μν λ§ ν©λλ€.
π μμ
- LangGraph μν¬νλ‘μ°μμ βλ΄μ€ κ²μβ λ Έλ μ€ν
- Cursor AIμμ βPDF μμ½β μμ²
2) π£οΈ Client (MCP ν΄λΌμ΄μΈνΈ, Protocol Adapter)
Hostμ Server κ° ν΅μ μ μ€κ³νλ βν΅μμ¬β μν
- νΈμ€νΈ λ΄λΆμ λ΄μ₯λλ©°, λꡬ μλ²μμ μ°κ²°μ 1:1λ‘ μ μ§ν©λλ€.
- μλ²κ° μ΄ν΄ν μ μλλ‘ μμ²μ JSON-RPC νμμΌλ‘ λ²μνμ¬ μ λ¬ν©λλ€.
- κ²°κ³Όλ₯Ό λ€μ νΈμ€νΈκ° μ΄ν΄ν μ μλ ννλ‘ μλ³νν©λλ€.
π μμ
- LangGraphμμ
load_mcp_tools()
ν¨μλ‘ MCP ν΄λΌμ΄μΈνΈλ₯Ό λ‘λ© - Claude μ± λ΄λΆμ MCP clientκ° νμ¬λμ΄ μλ²μ ν΅μ μν
β νΉμ§
- ν΄λΌμ΄μΈνΈκ° μμΌλ©΄, Hostλ MCP μλ²μ μ§μ ν΅μ ν μ μμ
- μ¬λ¬ MCP μλ²μ λν μ°κ²°μ κ°λ³λ‘ κ΄λ¦¬ (1:1 ꡬ쑰)
- μΌλ°μ μΌλ‘ Adapter ννλ‘ λ°°ν¬λμ΄ μμ½κ² μ°λ κ°λ₯
3) π οΈ Server (MCP Servers)
μμ²μ μ€μ λ‘ βμ²λ¦¬βνλ κΈ°λ₯ μ€ν 주체
- βPDF μμ½β, βDB μ§μβ, βλ μ¨ νμΈβ λ±μ μ€μ κΈ°λ₯ λ‘μ§μ΄ ꡬνλ μλ²μ λλ€.
- νλμ μλ² μμ μ¬λ¬ κ°μ λꡬλ₯Ό κ°μ§ μ μμΌλ©°, κ°κ°μ λꡬλ λ 립λ APIμ²λΌ λμν©λλ€.
- SSE λλ STDIO λ°©μμΌλ‘ ν΄λΌμ΄μΈνΈμ μλ΅μ μ£Όκ³ λ°μ΅λλ€.
π μμ
- Math μλ²:
add()
,divide()
λ± μμΉ κ³μ° κΈ°λ₯ - Data μλ²:
search_documents()
,get_summary()
λ± μ 보 μ‘°ν κΈ°λ₯
β νΉμ§
- ν΄λΌμ΄μΈνΈκ° μμ²ν λͺ λ Ήμ μ€μ μννκ³ μλ΅ μ λ¬
- λꡬ λ¨μλ‘ κ΅¬λΆλ μΈν°νμ΄μ€ μ 곡
- λ‘컬μμλ μλ κ°λ₯, λλ μΈλΆ API μλ²λ‘ μ΄μ κ°λ₯
λ°μ΄ν°κ³Όνμ μ
μ₯μμ μ΄ν΄νλ©΄, λ§μΉ pandas
λ sklearn
μμ ν¨μ νΈμΆν λ, ν¨μ μ΄λ¦, μΈμ, κ²°κ³Όκ°μ ν¬λ§·μ λ§μΆ°μΌ νλ― MCPλ κ·Έλ° μΈν°νμ΄μ€ κ·κ²©μ μ ν΄λμ κ²μ
λλ€.
μ€μ μ¬μ© μμ: βλ΄ μ»΄ν¨ν°μμ ν° νμΌ μ°Ύμμ€β
-
μ¬μ©μλ Claude κ°μ AIμκ² λ§ν©λλ€:
βλ΄ μ»΄ν¨ν°μμ κ°μ₯ ν° νμΌ 5κ° μλ €μ€β
- Claudeλ μ΄ μμ²μ λ³΄κ³ βνμΌ κ²μ ν΄μ΄ νμνκ² κ΅°βμ΄λΌκ³ νλ¨ν©λλ€.
- Claudeλ μμ μ΄ μ°κ²°λ λꡬ μ€μμ βνμΌ κ²μ ν΄(MCP Server)βμ΄ μλμ§ μ°Ύμ΅λλ€.
-
μ°Ύμ ν΄μ λν΄ μ¬μ©μμκ² λ¬Όμ΄λ΄ λλ€:
βμ΄ λꡬλ₯Ό μ¬μ©ν΄λ λ κΉμ?β
- μ¬μ©μκ° νμ©νλ©΄ Claudeλ ν΄λΉ λꡬμ MCP λ°©μμΌλ‘ μμ²μ 보λ λλ€.
- λκ΅¬κ° μλ΅ν©λλ€: βμ΄λ° νμΌλ€μ΄ μμ΄μ~β
- Claudeλ μ΄κ±Έ λ€μ μμ°μ΄λ‘ μμκ² μ 리ν΄μ μ°λ¦¬μκ² λ³΄μ¬μ€λλ€.
μ΄ λͺ¨λ κ³Όμ μ κΈ°μ‘΄ λ°©μμ²λΌ 볡μ‘ν μ½λ μμ± μμ΄, ν둬ννΈ κΈ°λ° λνλ‘ μ΄λ£¨μ΄μ§λλ€. κ·Έλ¦¬κ³ λꡬμ AI κ°μ μ°κ²°μ λͺ¨λ MCP κ·μ½μΌλ‘ μΌκ΄λκ² μ²λ¦¬λλ―λ‘, λ§€μ° μμ μ μ΄κ³ νμ₯ κ°λ₯νκ² μ€κ³λ©λλ€.
- Claude, Cursor, AIXE λ± μ£Όμ νλ«νΌμμ μ μ μ§μ
- λꡬλ€μ μμ λ‘κ² λ±λ‘ν μ μλ MCP λ§μΌνλ μ΄μ€ κΈμ±μ₯
- λꡬλ Pythonλ§ μλ©΄ ν΄μ λ§λ€μ΄ λ±λ‘ν μ μμ
- λꡬ μνκ³κ° 컀μ§λ©΄ μ¬μ©μλ λ λ§μμ§ β μ μν ꡬ쑰
λΉκ°λ°μμκ²λ μ€μν λ³ν
κΈ°μ‘΄μλ κ°λ°μκ° λꡬλ₯Ό λ§λ€μ΄μΌλ§ AIκ° νλν μ μμμ§λ§,
μ΄μ λ κ·Έ λꡬλ€μ΄ λ§μΌνλ μ΄μ€μ μ¬λΌμ μκΈ° λλ¬Έμ,
λ°μ΄ν°κ³Όνμλ μΌλ° μ¬μ©μλ MCP λ§μΌμμ νμν κΈ°λ₯μ λ°λ‘ κ°μ Έλ€ μΈ μ μκ² λ κ²μ λλ€.
λ€μμ κ°μ₯ κΈ°λ³Έμ μΈ MCP ν΄ μμ μ λλ€. μ΄λ¦μ λ°μ μΈμ¬λ§μ μΆλ ₯ν΄μ£Όλ λꡬμ λλ€:
1
2
3
4
5
6
7
8
9
from fastmcp import tool, FastMCP
from fastapi import FastAPI
app = FastAPI()
mcp = FastMCP(app)
@tool(name="hello", description="μΈμ¬λ§μ μΆλ ₯ν©λλ€")
def hello(name: str):
return f"μλ
νμΈμ, {name}λ!"
μ΄μ²λΌ MCP ν΄μ μ€μ κΈ°λ₯μ ν¨μλ‘ κ΅¬νν ν, @tool
μ΄λΌλ λ°μ½λ μ΄ν°λ§ λΆμ΄λ©΄ μλμΌλ‘ MCP νμμ΄ λ©λλ€.
μ΄μ μ΄ ν΄μ μ€νν΄ MCP μλ²λ‘ λμ°κ³ , ν΄λΌμ΄μΈνΈμ λ±λ‘νλ©΄ Claudeλ Cursorμμ μ΄ κΈ°λ₯μ λΆλ¬ μΈ μ μκ² λ©λλ€.
λ°μ΄ν°κ³Όνμμ κ΄μ μμ 보면, μμ μ Flaskλ FastAPIλ‘ κ°λ¨ν API μλ² λ§λ€λ κ²½νμ΄ μλ€λ©΄ MCP ν΄ κ°λ°μ λ§€μ° μΉμνκ³ λ¨μν©λλ€.
μ°λ¦¬λ μ§κΈ AI μνκ³κ° λ¨μν ν μ€νΈ μμ±μμ λꡬ μ€ν, νλ κΈ°λ° μμ μΌλ‘ μ§ννλ μμ μ μμ΅λλ€. MCPλ μ΄ νλ¦μ ν΅μ¬ κΈ°μ λ‘ μ리 μ‘κ³ μμΌλ©°, λ§μΉ μ±μ€ν μ΄, USB-Cμ²λΌ νλ«νΌ λ 립μ μΈ νμ€μ΄ λ κ°λ₯μ±μ΄ ν½λλ€.
π μμΌλ‘ μμλλ λ³ν
- κΈ°μ μ루μ , SaaS μ νμ΄ MCP ν΄λ‘ λνλμ΄ AIμ μ°κ²°λ¨
- μ¬μ©μ λ§μΆ€ν μμ΄μ νΈλ₯Ό λ§λ€ λ MCP λꡬ μ°κ²°μ΄ κΈ°λ³Έ
- μ€νμμ€ ν΄, λΉμ¦λμ€ μλν λκ΅¬κ° MCPνλμ΄ μ¬μ© κ°λ₯
π λ°μ΄ν°κ³Όνμμκ² μλ―Ένλ λ°
- μμ μ΄ λ§λ λΆμ ν¨μ, λ°μ΄ν° νμ΄νλΌμΈλ MCP ν΄λ‘ λν κ°λ₯
- λ°μ΄ν° μ κ·Ό, μ μ , μκ°ν λ± λ°λ³΅ μμ μ AIμκ² μν¬ μ μμ
- GPTλ Claude κΈ°λ° μμ΄μ νΈμκ² βλ΄ ν΄βμ λ§‘κΈ°λ κ²μ΄ νμ€νλ¨
λ§μΉλ©°
MCPλ λ¨μν κΈ°μ κ·μ½μ΄ μλλλ€.
μ΄κ²μ AI λͺ¨λΈμ΄ μ§μ§λ‘ βμΌμ ν μ μλβ μΈμμΌλ‘ κ°λ λ¬Έμ΄λ©°, κ·Έ λ¬Έμ μ¬λ κ³΅ν΅ ν€(key)μ λλ€. USB-Cκ° λͺ¨λ κΈ°κΈ°λ₯Ό νλλ‘ μ°κ²°ν κ²μ²λΌ, MCPλ λͺ¨λ AIμ λꡬλ₯Ό νλλ‘ λ¬Άλ μνκ³μ μμμ λλ€. λ°μ΄ν°κ³Όνμλ , κ°λ°μλ , μΌλ° μ¬μ©μλ μ§κΈ μ΄ νλ¦μ μ¬λΌνμΌ ν μ΄μ λ λΆλͺ ν©λλ€.
μμ§ λ¦μ§ μμμ΅λλ€!!
μ§κΈλΆν° MCP λ§μΌνλ μ΄μ€μ μμ ν΄λ€μ μ€νν΄ λ³΄λ©΄μ, λΉμ λ§μ μμ΄μ νΈ νκ²½μ λ§λ€μ΄ 보μΈμπ‘
μ½μ΄μ£Όμ μ κ°μ¬ν©λλ€.