μ λ¬Έμλ₯Ό μν 체κ³μ μΈ Model Context Protocol νμ΅ κ°μ΄λ
μ΄ νν 리μΌμ Model Context Protocol(MCP) μ μ²μ μ νλ κ°λ°μλ€μ μν μ€μ΅ μ€μ¬ νμ΅ μλ£μ λλ€. LangGraphμ MCPλ₯Ό ν΅ν©νμ¬ λ€μν μΈλΆ λꡬμ μλΉμ€λ₯Ό νμ©νλ κ°λ ₯ν AI μμ΄μ νΈλ₯Ό ꡬμΆνλ λ°©λ²μ λ¨κ³λ³λ‘ νμ΅ν©λλ€.
- MCPμ ν΅μ¬ κ°λ κ³Ό μν€ν μ² μ΄ν΄
- FastMCPλ₯Ό νμ©ν MCP μλ² κ°λ°
- LangGraphμ MCPμ ν¨κ³Όμ μΈ ν΅ν©
- λ€μ€ MCP μλ² κ΄λ¦¬ λ° μ€μΌμ€νΈλ μ΄μ
- μ€μ RAG μμ€ν ꡬν
- νμ€νλ νλ‘ν μ½: MCP νμ€μ λ°λ₯΄λ λꡬ μΈν°νμ΄μ€ ꡬν
- λ€μν μ μ‘ λ°©μ: stdio λ° Streamable HTTP μ§μ
- λμ λꡬ κ²μ: λ°νμ λꡬ μλ κ²μ λ° λ‘λ
- νμ₯ κ°λ₯ν μν€ν μ²: μ¬λ¬ MCP μλ² λμ μ°κ²° μ§μ
- μ€μ΅ μ€μ¬ νμ΅: Jupyter Notebookμ ν΅ν μΈν°λν°λΈ νμ΅
mcp-tutorial/
βββ 01-LangGraph-MCP-Tutorial.ipynb # λ©μΈ νν λ¦¬μΌ λ
ΈνΈλΆ
βββ server/ # MCP μλ² κ΅¬ν체
β βββ mcp_server_local.py # λ‘컬 λ μ¨ μλΉμ€ (stdio)
β βββ mcp_server_remote.py # μ격 μκ° μλΉμ€ (HTTP)
β βββ mcp_server_rag.py # RAG μλΉμ€ (λ²‘ν° κ²μ)
β βββ rag/ # RAG κ΄λ ¨ μ νΈλ¦¬ν°
β βββ base.py
β βββ pdf.py
β βββ utils.py
βββ assets/ # μ΄λ―Έμ§ λ° λ¦¬μμ€
βββ pyproject.toml # νλ‘μ νΈ μ€μ
βββ .env.example # νκ²½ λ³μ μμ
- Python 3.11 μ΄μ
- UV ν¨ν€μ§ λ§€λμ (μ€μΉ κ°μ΄λ)
- μ μ₯μ ν΄λ‘
git clone https://github.com/teddynote-lab/mcp-tutorial.git
cd mcp-tutorial
- νκ²½ λ³μ μ€μ
cp .env.example .env
# .env νμΌμ μ΄μ΄ νμν API ν€ μ
λ ₯
- μμ‘΄μ± μ€μΉ
# UVλ₯Ό μ¬μ©ν κ°μνκ²½ μμ± λ° ν¨ν€μ§ μ€μΉ
uv sync
# κ°μνκ²½ νμ±ν
source .venv/bin/activate # macOS/Linux
# λλ
.venv\Scripts\activate # Windows
- MCP νλ‘ν μ½ μ΄ν΄
- κΈ°λ³Έ μν€ν μ² νμ΅
- FastMCPλ₯Ό νμ©ν μλ² κ΅¬ν
- stdio μ μ‘ λ°©μ μ΄ν΄
- λ€μ€ μλ² κ΄λ¦¬ λ°©λ²
- λꡬ λμ λ‘λ
- LangGraph React Agent ꡬμ±
- MCP λꡬ λ°μΈλ©
- 컀μ€ν μν¬νλ‘μ° κ΅¬μΆ
- μΈλ°ν μ μ΄ κ΅¬ν
- Smithery AI νλ«νΌ μ°λ
- μλνν° λꡬ ν΅ν©
- Dify νλ«νΌ νμ©
- μ€μ ν΅ν© μμ
# λ‘컬 λ μ¨ μλ² (stdio)
uv run python server/mcp_server_local.py
# μ격 μκ° μλ² (HTTP, ν¬νΈ 8002)
uv run python server/mcp_server_remote.py
# RAG μλ² (λ¬Έμ κ²μ)
uv run python server/mcp_server_rag.py
# λΈλΌμ°μ μμ MCP μλ² ν
μ€νΈ
npx @modelcontextprotocol/inspector
# Jupyter Notebook μ€ν
jupyter notebook 01-LangGraph-MCP-Tutorial.ipynb
.env
νμΌμ λ€μ νκ²½ λ³μ μ€μ μ΄ νμν©λλ€:
# νμ
OPENAI_API_KEY=your_openai_api_key
TAVILY_API_KEY=your_tavily_api_key
# μ ν (μΆκ° κΈ°λ₯)
LANGCHAIN_API_KEY=your_langchain_api_key
CONTEXT7_API_KEY=your_context7_api_key
- LangGraph: AI μμ΄μ νΈ μν¬νλ‘μ° κ΅¬μΆ
- FastMCP: MCP μλ² κ°λ° νλ μμν¬
- langchain-mcp-adapters: LangChain-MCP ν΅ν©
- FAISS: λ²‘ν° μ€ν λ¦¬μ§ (RAGμ©)
- PyMuPDF: PDF λ¬Έμ μ²λ¦¬
μ΄ νλ‘μ νΈλ κ΅μ‘ λͺ©μ μΌλ‘ μ μλμμ΅λλ€. κ°μ μ¬νμ΄λ λ²κ·Έλ₯Ό λ°κ²¬νμλ©΄ Issueλ₯Ό λ±λ‘ν΄ μ£ΌμΈμ.
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature
) - Commit your Changes (
git commit -m 'Add some AmazingFeature'
) - Push to the Branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
μ΄ νλ‘μ νΈλ κ΅μ‘ λͺ©μ μΌλ‘λ§ μ¬μ© κ°λ₯ν©λλ€. μμΈν λ΄μ©μ LICENSE νμΌμ μ°Έμ‘°νμΈμ.
Made by TeddyNote LAB
MCPμ LangGraphλ‘ μ°¨μΈλ AI μμ΄μ νΈλ₯Ό ꡬμΆνμΈμ! π