Skip to content

ysys143/simple_MCP_host

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

23 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

MCP 호슀트 - AI λŒ€ν™” μ‹œμŠ€ν…œ

LangGraph와 Model Context Protocol을 ν™œμš©ν•œ μ§€λŠ₯ν˜• AI λŒ€ν™” μ‹œμŠ€ν…œ

πŸ“š ν”„λ‘œμ νŠΈ κ°œμš”

이 ν”„λ‘œμ νŠΈλŠ” Model Context Protocol(MCP)의 μž‘λ™ 방식을 μ΄ν•΄ν•˜κΈ° μœ„ν•œ ꡐ윑용 데λͺ¨ μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

πŸ“Ή κΈ°λ³Έ μ‚¬μš©λ²• 데λͺ¨

κΈ°λ³Έ μ‚¬μš©λ²• 데λͺ¨

기본적인 μ›Ή UI μ‚¬μš©λ²•κ³Ό AIμ™€μ˜ λŒ€ν™” 과정을 λ³΄μ—¬μ£ΌλŠ” 데λͺ¨ μ˜μƒμž…λ‹ˆλ‹€.

πŸ“Ή ReAct λͺ¨λ“œ 날씨 검색 데λͺ¨

ReAct λͺ¨λ“œ 데λͺ¨

ReAct νŒ¨ν„΄μ„ ν†΅ν•œ 볡합적인 날씨 검색 및 리포트 생성 과정을 λ³΄μ—¬μ£ΌλŠ” 데λͺ¨ μ˜μƒμž…λ‹ˆλ‹€. Think β†’ Act β†’ Observe 사이클을 톡해 λ‹¨κ³„λ³„λ‘œ 정보λ₯Ό μˆ˜μ§‘ν•˜κ³  λΆ„μ„ν•©λ‹ˆλ‹€.

πŸ“Ή Phoenix λͺ¨λ‹ˆν„°λ§ 데λͺ¨

Phoenix λͺ¨λ‹ˆν„°λ§ 데λͺ¨

Phoenix UIλ₯Ό ν†΅ν•œ AI μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 좔적 및 μ„±λŠ₯ 뢄석 과정을 λ³΄μ—¬μ£ΌλŠ” 데λͺ¨ μ˜μƒμž…λ‹ˆλ‹€.

MCPλŠ” AI μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ‹€μ–‘ν•œ 데이터 μ†ŒμŠ€μ™€ 도ꡬ에 μ•ˆμ „ν•˜κ³  ν‘œμ€€ν™”λœ λ°©μ‹μœΌλ‘œ μ—°κ²°ν•  수 있게 ν•΄μ£ΌλŠ” κ°œλ°©ν˜• ν”„λ‘œν† μ½œμž…λ‹ˆλ‹€. λ³Έ 데λͺ¨λ₯Ό 톡해 λ‹€μŒμ„ ν•™μŠ΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

🎯 ν•™μŠ΅ λͺ©ν‘œ

  • MCP ν”„λ‘œν† μ½œ 이해: ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ μ•„ν‚€ν…μ²˜μ™€ JSON-RPC 톡신 방식
  • μ‹€μ œ κ΅¬ν˜„ μ²΄ν—˜: LangChain MCP Adaptersλ₯Ό ν™œμš©ν•œ μ‹€μ œ MCP ν΄λΌμ΄μ–ΈνŠΈ κ΅¬ν˜„
  • λ‹€μ–‘ν•œ MCP μ„œλ²„ 연동: 더미 μ„œλ²„(ꡐ윑용)와 μ‹€μ œ μ„œλ²„(Context7) 비ꡐ μ²΄ν—˜
  • LangGraph μ›Œν¬ν”Œλ‘œμš°: MCP 도ꡬλ₯Ό ν™œμš©ν•œ λ³΅μž‘ν•œ AI μ›Œν¬ν”Œλ‘œμš° ꡬ성
  • ReAct νŒ¨ν„΄: 도ꡬ 기반 μΆ”λ‘  및 행동 νŒ¨ν„΄μ˜ μ‹€μ œ 적용

πŸ—οΈ ꡐ윑적 ꡬ성

  • 3개의 MCP μ„œλ²„: 2개 더미 μ„œλ²„(ν•™μŠ΅μš©) + 1개 μ‹€μ œ μ„œλ²„(μ‹€μš©μ„±)
  • 단계별 λ³΅μž‘λ„: λ‹¨μˆœ 도ꡬ 호좜 β†’ ReAct νŒ¨ν„΄ β†’ 볡합 μ›Œν¬ν”Œλ‘œμš°
  • μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§: Phoenixλ₯Ό ν†΅ν•œ AI μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄λΆ€ λ™μž‘ κ΄€μ°°
  • μ™„μ „ν•œ μ†ŒμŠ€μ½”λ“œ: λͺ¨λ“  κ΅¬ν˜„ 세뢀사항을 ν•™μŠ΅ν•  수 μžˆλŠ” μ˜€ν”ˆμ†ŒμŠ€

Python FastAPI LangGraph LangChain MCP License

🌟 μ£Όμš” κΈ°λŠ₯

  • πŸ€– μ‹€μ‹œκ°„ AI λŒ€ν™”: OpenAI GPT λͺ¨λΈμ„ ν™œμš©ν•œ μžμ—°μŠ€λŸ¬μš΄ λŒ€ν™”
  • ⚑ SSE μ‹€μ‹œκ°„ 슀트리밍: 토큰 λ‹¨μœ„ 응닡 슀트리밍으둜 μ¦‰μ‹œ λ°˜μ‘ν•˜λŠ” λŒ€ν™” κ²½ν—˜
  • πŸ’¬ Multi-Turn λŒ€ν™”: μ„Έμ…˜ 기반 μ»¨ν…μŠ€νŠΈ μœ μ§€λ‘œ 연속적이고 μ§€λŠ₯적인 λŒ€ν™” 지원
  • πŸ”§ 닀쀑 도ꡬ 톡합: 날씨, 파일 관리, λ¬Έμ„œ 검색 λ“± λ‹€μ–‘ν•œ MCP μ„œλ²„ 연동
  • πŸ”— LangChain MCP μ–΄λŒ‘ν„°: langchain_mcp_adaptersλ₯Ό ν†΅ν•œ ν‘œμ€€ MCP ν”„λ‘œν† μ½œ 지원
  • 🧠 ReAct νŒ¨ν„΄: λ³΅μž‘ν•œ μš”μ²­μ— λŒ€ν•œ 단계별 사고 및 행동 처리
  • 🌐 λ°˜μ‘ν˜• μ›Ή UI: μ‹€μ‹œκ°„ 타이핑 νš¨κ³Όμ™€ μ›Œν¬ν”Œλ‘œμš° 좔적이 κ°€λŠ₯ν•œ ν˜„λŒ€μ  μΈν„°νŽ˜μ΄μŠ€
  • πŸ“Š μ§€λŠ₯ν˜• μ„Έμ…˜ 관리: λŒ€ν™” νžˆμŠ€ν† λ¦¬, μ»¨ν…μŠ€νŠΈ μš”μ•½, 도ꡬ 호좜 κ²°κ³Ό 캐싱
  • πŸ”„ LangGraph μ›Œν¬ν”Œλ‘œμš°: μƒνƒœ 기반 μ›Œν¬ν”Œλ‘œμš° μ—”μ§„μœΌλ‘œ λ³΅μž‘ν•œ μž‘μ—… 처리
  • πŸ“ˆ Phoenix λͺ¨λ‹ˆν„°λ§: AI μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 좔적 및 μ„±λŠ₯ 뢄석 (선택적)

πŸ”„ μ›Œν¬ν”Œλ‘œμš° μ•„ν‚€ν…μ²˜

πŸ“Š μ‹€μ œ μ›Œν¬ν”Œλ‘œμš° ꡬ쑰

πŸ”— μΈν„°λž™ν‹°λΈŒ μ›Œν¬ν”Œλ‘œμš° λ‹€μ΄μ–΄κ·Έλž¨ 보기

graph TD;
    __start__([Start]):::first
    parse_message(Parse)
    call_mcp_tool(MCP tool call)
    generate_response(Response)
    react_think(ReAct: think)
    react_act(ReAct: act)
    react_observe(ReAct: observe)
    react_finalize(ReAct: finalize)
    __end__([End]):::last
    
    __start__ --> parse_message
    
    %% 쑰건뢀 λΆ„κΈ°
    parse_message -.-> call_mcp_tool
    parse_message -.-> generate_response
    parse_message -.-> react_think
    
    %% 일반 μ›Œν¬ν”Œλ‘œμš°
    call_mcp_tool --> generate_response
    generate_response --> __end__
    
    %% ReAct μ›Œν¬ν”Œλ‘œμš° (μˆœν™˜)
    react_think -.-> react_act
    react_think -.-> react_finalize
    react_think -.-> generate_response
    
    react_act -.-> react_observe
    react_act -.-> react_finalize
    
    react_observe -.-> react_think
    react_observe -.-> react_finalize
    
    %% μ΅œμ’… μ’…λ£Œ
    react_finalize --> __end__
    
    classDef default fill:#f2f0ff,line-height:1.2
    classDef first fill:#e1f5fe
    classDef last fill:#bfb6fc
Loading

LangGraph 기반 μ›Œν¬ν”Œλ‘œμš° ꡬ쑰: μ‚¬μš©μž μž…λ ₯λΆ€ν„° μ΅œμ’… μ‘λ‹΅κΉŒμ§€μ˜ 전체 처리 흐름

πŸ” μ›Œν¬ν”Œλ‘œμš° μ„€λͺ…

  • μ‹€μ„  (β†’): 항상 μ‹€ν–‰λ˜λŠ” μ—°κ²°
  • 점선 (-.->): 쑰건뢀 λΆ„κΈ° (μƒνƒœμ— 따라 κ²°μ •)
  • ReAct 사이클: Think β†’ Act β†’ Observe μˆœν™˜ ꡬ쑰
  • 정상 μ’…λ£Œ: generate_response λ˜λŠ” react_finalizeμ—μ„œ λͺ…μ‹œμ μœΌλ‘œ END둜 μ—°κ²°
  • 비정상 μ’…λ£Œ: 각 λ…Έλ“œμ—μ„œ __end__둜 직접 μ—°κ²°λ˜λŠ” κ²½μš°λŠ” μ˜ˆμ™Έ μƒν™©μ΄λ‚˜ 였λ₯˜ λ°œμƒ μ‹œμ˜ μ•ˆμ „μž₯치

πŸ€– 두 κ°€μ§€ 처리 λͺ¨λ“œ

이 μ‹œμŠ€ν…œμ€ μš”μ²­μ˜ λ³΅μž‘μ„±μ— 따라 두 κ°€μ§€ λ‹€λ₯Έ λͺ¨λ“œλ‘œ λ™μž‘ν•©λ‹ˆλ‹€:

πŸ“‹ 일반 Tool Calling λͺ¨λ“œ

  • λ‹¨μˆœν•œ μš”μ²­: "μ„œμšΈ 날씨 μ•Œλ €μ€˜", "파일 λͺ©λ‘ λ³΄μ—¬μ€˜"
  • 직접 처리: LLM이 λ°”λ‘œ μ μ ˆν•œ 도ꡬλ₯Ό μ„ νƒν•˜μ—¬ ν•œ λ²ˆμ— 호좜
  • λΉ λ₯Έ 응닡: μ΅œμ†Œν•œμ˜ λ‹¨κ³„λ‘œ μ¦‰μ‹œ κ²°κ³Ό 제곡
  • μ˜ˆμ‹œ: 단일 μœ„μΉ˜ 날씨 쑰회, νŠΉμ • 파일 정보 확인

🧠 ReAct νŒ¨ν„΄ λͺ¨λ“œ

  • λ³΅μž‘ν•œ μš”μ²­: "μ„œμšΈ, λΆ€μ‚°, λŒ€κ΅¬ 날씨λ₯Ό λΉ„κ΅ν•΄μ€˜"
  • 단계별 사고: Think β†’ Act β†’ Observe 사이클 반볡
  • 닀쀑 도ꡬ 호좜: μ—¬λŸ¬ 도ꡬλ₯Ό 순차적으둜 μ‚¬μš©ν•˜μ—¬ 정보 μˆ˜μ§‘
  • μ’…ν•© 뢄석: μˆ˜μ§‘λœ 정보λ₯Ό λ°”νƒ•μœΌλ‘œ μ΅œμ’… λ‹΅λ³€ 생성
  • μ˜ˆμ‹œ: μ—¬λŸ¬ μœ„μΉ˜ 비ꡐ, 볡합적인 뢄석 μž‘μ—…

πŸ’¬ μ‹€μ‹œκ°„ λŒ€ν™” μ‹œμŠ€ν…œ

⚑ SSE (Server-Sent Events) 슀트리밍

이 μ‹œμŠ€ν…œμ€ μ‹€μ‹œκ°„ 토큰 λ‹¨μœ„ μŠ€νŠΈλ¦¬λ°μ„ 톡해 μžμ—°μŠ€λŸ¬μš΄ λŒ€ν™” κ²½ν—˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€:

πŸ”„ 슀트리밍 λ™μž‘ 방식

  • μ¦‰μ‹œ 응닡 μ‹œμž‘: μ‚¬μš©μž λ©”μ‹œμ§€ 전솑 μ¦‰μ‹œ AI 응닡이 토큰 λ‹¨μœ„λ‘œ 슀트리밍 μ‹œμž‘
  • μ‹€μ‹œκ°„ 타이핑 효과: 마치 AIκ°€ μ‹€μ‹œκ°„μœΌλ‘œ νƒ€μ΄ν•‘ν•˜λŠ” κ²ƒμ²˜λŸΌ μžμ—°μŠ€λŸ¬μš΄ 응닡 ν‘œμ‹œ
  • 쀑간 μƒνƒœ ν‘œμ‹œ: ReAct νŒ¨ν„΄μ—μ„œ "생각 쀑...", "도ꡬ 호좜 쀑..." λ“±μ˜ 쀑간 μƒνƒœ μ‹€μ‹œκ°„ ν‘œμ‹œ
  • μ—λŸ¬ 처리: μ—°κ²° λŠκΉ€μ΄λ‚˜ 였λ₯˜ λ°œμƒ μ‹œ μžλ™ μž¬μ—°κ²° 및 볡ꡬ

πŸ› οΈ 기술적 κ΅¬ν˜„

// ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ SSE μ—°κ²°
const eventSource = new EventSource(`/api/stream/${sessionId}`);
eventSource.onmessage = function(event) {
  const data = JSON.parse(event.data);
  // μ‹€μ‹œκ°„ UI μ—…λ°μ΄νŠΈ
};
# μ„œλ²„ μΈ‘ 슀트리밍 응닡
async def stream_response():
    async for chunk in workflow_stream:
        yield f"data: {json.dumps(chunk)}\n\n"

πŸ”„ Multi-Turn λŒ€ν™” 관리

πŸ“š μ»¨ν…μŠ€νŠΈ μœ μ§€ μ‹œμŠ€ν…œ

  • μ„Έμ…˜ 기반 λ©”λͺ¨λ¦¬: 각 μ‚¬μš©μž μ„Έμ…˜λ³„λ‘œ 독립적인 λŒ€ν™” νžˆμŠ€ν† λ¦¬ 관리
  • μž₯κΈ° μ»¨ν…μŠ€νŠΈ: 이전 λŒ€ν™” λ‚΄μš©μ„ 기반으둜 ν•œ 연속적인 λŒ€ν™” 지원
  • 도ꡬ 호좜 기둝: 이전에 μ‚¬μš©ν•œ 도ꡬ와 κ²°κ³Όλ₯Ό κΈ°μ–΅ν•˜μ—¬ 쀑볡 호좜 λ°©μ§€

🧠 μ§€λŠ₯ν˜• μ»¨ν…μŠ€νŠΈ ν™œμš©

# λŒ€ν™” μ˜ˆμ‹œ
μ‚¬μš©μž: "μ„œμšΈ 날씨 μ•Œλ €μ€˜"
AI: "μ„œμšΈμ˜ ν˜„μž¬ λ‚ μ”¨λŠ” λ§‘μŒ, 기온 15Β°Cμž…λ‹ˆλ‹€."

μ‚¬μš©μž: "그럼 뢀산은 μ–΄λ•Œ?"  # 이전 μ»¨ν…μŠ€νŠΈ(날씨 쑰회) μžλ™ 인식
AI: "λΆ€μ‚°μ˜ ν˜„μž¬ 날씨λ₯Ό ν™•μΈν•΄λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€..."

μ‚¬μš©μž: "두 λ„μ‹œ λΉ„κ΅ν•΄μ€˜"  # μ„œμšΈκ³Ό λΆ€μ‚° 날씨 데이터 ν™œμš©
AI: "μ„œμšΈκ³Ό λΆ€μ‚°μ˜ 날씨λ₯Ό λΉ„κ΅ν•˜λ©΄..."

πŸ” 슀마트 μ°Έμ‘° ν•΄κ²°

  • λŒ€λͺ…사 처리: "그것", "μ €κΈ°", "이전 κ²°κ³Ό" λ“±μ˜ λͺ¨ν˜Έν•œ μ°Έμ‘°λ₯Ό μ»¨ν…μŠ€νŠΈ 기반으둜 ν•΄κ²°
  • μ•”μ‹œμ  μš”μ²­: λͺ…μ‹œμ μœΌλ‘œ μ–ΈκΈ‰ν•˜μ§€ μ•Šμ•„λ„ 이전 λŒ€ν™” 흐름을 λ°”νƒ•μœΌλ‘œ μ˜λ„ νŒŒμ•…
  • μ—°κ΄€ 정보 ν™œμš©: 이전 도ꡬ 호좜 κ²°κ³Όλ₯Ό μƒˆλ‘œμš΄ μš”μ²­μ— μžλ™ ν™œμš©

πŸ“Š μ„Έμ…˜ μƒνƒœ 관리

class ConversationSession:
    """Multi-turn λŒ€ν™”λ₯Ό μœ„ν•œ μ„Έμ…˜ 관리 클래슀"""
    
    def __init__(self, session_id: str):
        self.session_id = session_id
        self.messages: List[BaseMessage] = []  # λŒ€ν™” νžˆμŠ€ν† λ¦¬
        self.tool_results: Dict[str, Any] = {}  # 도ꡬ 호좜 κ²°κ³Ό μΊμ‹œ
        self.context_summary: str = ""  # μž₯κΈ° μ»¨ν…μŠ€νŠΈ μš”μ•½
        
    async def add_message(self, message: BaseMessage):
        """μƒˆ λ©”μ‹œμ§€ μΆ”κ°€ 및 μ»¨ν…μŠ€νŠΈ μ—…λ°μ΄νŠΈ"""
        self.messages.append(message)
        await self._update_context()
        
    async def get_relevant_context(self, query: str) -> str:
        """ν˜„μž¬ 쿼리와 κ΄€λ ¨λœ μ»¨ν…μŠ€νŠΈ μΆ”μΆœ"""
        # 의미적 μœ μ‚¬λ„ 기반 κ΄€λ ¨ λŒ€ν™” μΆ”μΆœ
        # 졜근 N개 λ©”μ‹œμ§€ + κ΄€λ ¨μ„± 높은 이전 λŒ€ν™”

🎯 μ»¨ν…μŠ€νŠΈ μ΅œμ ν™”

  • 토큰 νš¨μœ¨μ„±: μ€‘μš”ν•œ μ •λ³΄λ§Œ μ„ λ³„ν•˜μ—¬ μ»¨ν…μŠ€νŠΈ μœˆλ„μš° 졜적 ν™œμš©
  • μš”μ•½ κΈ°λŠ₯: κΈ΄ λŒ€ν™”λŠ” μžλ™ μš”μ•½ν•˜μ—¬ 핡심 μ •λ³΄λ§Œ μœ μ§€
  • κ΄€λ ¨μ„± 필터링: ν˜„μž¬ μš”μ²­κ³Ό κ΄€λ ¨ μ—†λŠ” 이전 λŒ€ν™”λŠ” μ œμ™Έ

🌐 μ›Ή UI μ‹€μ‹œκ°„ κΈ°λŠ₯

πŸ“± λ°˜μ‘ν˜• μ±„νŒ… μΈν„°νŽ˜μ΄μŠ€

  • μ‹€μ‹œκ°„ 타이핑 ν‘œμ‹œ: AI 응닡 생성 쀑 타이핑 인디케이터 ν‘œμ‹œ
  • λ©”μ‹œμ§€ μƒνƒœ ν‘œμ‹œ: 전솑 쀑, 처리 쀑, μ™„λ£Œ μƒνƒœ μ‹œκ°μ  ν‘œμ‹œ
  • 슀크둀 μžλ™ 좔적: μƒˆ λ©”μ‹œμ§€ 도착 μ‹œ μžλ™ 슀크둀
  • μ—°κ²° μƒνƒœ λͺ¨λ‹ˆν„°λ§: SSE μ—°κ²° μƒνƒœ μ‹€μ‹œκ°„ ν‘œμ‹œ

πŸ”„ μ‹€μ‹œκ°„ μ›Œν¬ν”Œλ‘œμš° 좔적

  • 단계별 μ§„ν–‰ ν‘œμ‹œ: ReAct νŒ¨ν„΄μ˜ Think β†’ Act β†’ Observe 단계 μ‹€μ‹œκ°„ ν‘œμ‹œ
  • 도ꡬ 호좜 μ‹œκ°ν™”: μ–΄λ–€ MCP μ„œλ²„μ˜ μ–΄λ–€ 도ꡬ가 ν˜ΈμΆœλ˜λŠ”μ§€ μ‹€μ‹œκ°„ ν‘œμ‹œ
  • 처리 μ‹œκ°„ ν‘œμ‹œ: 각 단계별 μ†Œμš” μ‹œκ°„ μΈ‘μ • 및 ν‘œμ‹œ

πŸš€ λΉ λ₯Έ μ‹œμž‘

1. μ €μž₯μ†Œ 클둠

git clone <repository-url>
cd MCP_test

2. ν™˜κ²½ μ„€μ •

# 개발 ν™˜κ²½ μ„€μ • (μ˜μ‘΄μ„± μ„€μΉ˜ + 디렉토리 생성)
make dev

# ν™˜κ²½λ³€μˆ˜ μ„€μ •
cp .env_example .env
# .env νŒŒμΌμ—μ„œ OPENAI_API_KEY μ„€μ •

3. μ„œλ²„ μ‹€ν–‰

# 개발 λͺ¨λ“œλ‘œ μ‹€ν–‰
make server

# λ˜λŠ” λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰
make run-bg

4. μ›Ή UI 접속

λΈŒλΌμš°μ €μ—μ„œ http://localhost:8000으둜 μ ‘μ†ν•˜μ—¬ AI와 λŒ€ν™”λ₯Ό μ‹œμž‘ν•˜μ„Έμš”!

πŸ“¦ μ„€μΉ˜ 및 μ„€μ •

μš”κ΅¬μ‚¬ν•­

  • Python 3.11+
  • Node.js 18+ (Context7 MCP μ„œλ²„μš©)
  • OpenAI API ν‚€
  • uv (Python νŒ¨ν‚€μ§€ κ΄€λ¦¬μž)
  • LangChain MCP Adapters (langchain_mcp_adapters)

상세 μ„€μΉ˜ κ°€μ΄λ“œ

  1. Python 및 Node.js ν™˜κ²½ μ€€λΉ„

    # Python 3.11+ 확인
    python --version
    
    # Node.js 18+ 확인 (Context7 μ„œλ²„μš©)
    node --version
    npm --version
    
    # uv μ„€μΉ˜ (μ—†λŠ” 경우)
    curl -LsSf https://astral.sh/uv/install.sh | sh
  2. ν”„λ‘œμ νŠΈ μ„€μ •

    # μ˜μ‘΄μ„± μ„€μΉ˜
    make install
    
    # λ˜λŠ” 직접 μ„€μΉ˜
    uv pip install -r requirements.txt
  3. ν™˜κ²½λ³€μˆ˜ μ„€μ •

    cp .env_example .env

    .env νŒŒμΌμ—μ„œ λ‹€μŒ 값듀을 μ„€μ •ν•˜μ„Έμš”:

    OPENAI_API_KEY=your_openai_api_key_here
    OPENAI_MODEL=gpt-4o-mini
    OPENAI_TEMPERATURE=0.1
    OPENAI_MAX_TOKENS=1000
    MCP_SERVERS_CONFIG=./mcp_servers.json
    
    # Phoenix λͺ¨λ‹ˆν„°λ§ (선택적)
    PHOENIX_ENABLED=true

🎯 μ‚¬μš©λ²•

μ›Ή UI μ‚¬μš©

  1. μ„œλ²„ μ‹€ν–‰: make server
  2. λΈŒλΌμš°μ €μ—μ„œ http://localhost:8000 접속
  3. μ±„νŒ…μ°½μ— λ©”μ‹œμ§€ μž…λ ₯
  4. AI의 μ‹€μ‹œκ°„ 응닡 확인

μ§€μ›λ˜λŠ” μš”μ²­ μ˜ˆμ‹œ

πŸ“‹ 일반 Tool Calling λͺ¨λ“œ

  • 날씨 쑰회: "μ„œμšΈ 날씨 μ•Œλ €μ€˜" (더미 날씨 μ„œλ²„)
  • 파일 관리: "파일 λͺ©λ‘ λ³΄μ—¬μ€˜" (더미 파일 μ„œλ²„)
  • λ¬Έμ„œ 검색: "React 라이브러리 정보 μ°Ύμ•„μ€˜" (Context7 μ‹€μ œ μ„œλ²„)
  • μ‹œμŠ€ν…œ 정보: "μ„œλ²„ μƒνƒœ ν™•μΈν•΄μ€˜", "μ‚¬μš© κ°€λŠ₯ν•œ 도ꡬ λͺ©λ‘"

🧠 ReAct νŒ¨ν„΄ λͺ¨λ“œ

  • 볡합 날씨 뢄석: "μ„œμšΈ, λΆ€μ‚°, λŒ€κ΅¬ 날씨λ₯Ό λΉ„κ΅ν•΄μ€˜"
  • 닀쀑 파일 μž‘μ—…: "ν”„λ‘œμ νŠΈ νŒŒμΌλ“€μ„ λΆ„μ„ν•˜κ³  ꡬ쑰λ₯Ό μ„€λͺ…ν•΄μ€˜"
  • μ’…ν•© 정보 μˆ˜μ§‘: "React와 Vue.js 라이브러리λ₯Ό 비ꡐ λΆ„μ„ν•΄μ€˜"

ν˜„μž¬ κ΅¬μ„±λœ MCP μ„œλ²„λ“€

이 ꡐ윑용 데λͺ¨λŠ” ν•™μŠ΅ λ‹¨κ³„λ³„λ‘œ μ„€κ³„λœ 3개의 MCP μ„œλ²„λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€:

πŸ§ͺ 더미 μ„œλ²„λ“€ (MCP ν•™μŠ΅μš©)

λͺ©μ : MCP ν”„λ‘œν† μ½œμ˜ κΈ°λ³Έ λ™μž‘ 원리λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•œ λ‹¨μˆœν™”λœ μ„œλ²„

  • Weather Server (examples/dummy_weather_server.py)

    • ν•™μŠ΅ 포인트: 기본적인 MCP μ„œλ²„ κ΅¬ν˜„ 방법, JSON-RPC 톡신
    • κ°„λ‹¨ν•œ 날씨 정보 제곡 (ν•˜λ“œμ½”λ”©λœ 더미 데이터)
    • 도ꡬ: get_weather, get_forecast
    • ꡐ윑적 κ°€μΉ˜: FastMCP 라이브러리 μ‚¬μš©λ²•, 도ꡬ μ •μ˜ 및 κ΅¬ν˜„
  • File Manager (examples/dummy_file_server.py)

    • ν•™μŠ΅ 포인트: 파일 μ‹œμŠ€ν…œ 연동, λ³΄μ•ˆ 고렀사항 (읽기 μ „μš©)
    • 기본적인 파일 관리 κΈ°λŠ₯ (μ•ˆμ „ν•œ 읽기 μ „μš© λͺ¨λ“œ)
    • 도ꡬ: list_files, read_file, file_info
    • ꡐ윑적 κ°€μΉ˜: ν™˜κ²½λ³€μˆ˜ ν™œμš©, μ•ˆμ „ν•œ 파일 μ ‘κ·Ό νŒ¨ν„΄

🌐 μ‹€μ œ μ„œλ²„ (μ‹€μš©μ„± μ²΄ν—˜)

λͺ©μ : μ‹€μ œ 운영 ν™˜κ²½μ—μ„œμ˜ MCP μ„œλ²„ ν™œμš© 사둀 μ²΄ν—˜

  • Context7 (NPM νŒ¨ν‚€μ§€: @upstash/context7-mcp)
    • ν•™μŠ΅ 포인트: μ™ΈλΆ€ MCP μ„œλ²„ 연동, μ‹€μ œ 데이터 처리
    • μ‹€μ œ 라이브러리 λ¬Έμ„œ 검색 및 정보 제곡
    • 온라인 λ¬Έμ„œ λ°μ΄ν„°λ² μ΄μŠ€ 연동
    • 도ꡬ: 라이브러리 검색, λ¬Έμ„œ 쑰회 λ“±
    • ꡐ윑적 κ°€μΉ˜: μ„œλ“œνŒŒν‹° MCP μ„œλ²„ ν™œμš©, μ‹€μ œ API 연동 νŒ¨ν„΄

πŸ“– ν•™μŠ΅ μ§„ν–‰ μˆœμ„œ (ꢌμž₯)

  1. Weather Server: MCP κΈ°λ³Έ κ°œλ… 이해
  2. File Manager: 둜컬 λ¦¬μ†ŒμŠ€ 연동 방법 ν•™μŠ΅
  3. Context7: μ‹€μ œ μ™ΈλΆ€ μ„œλΉ„μŠ€ 연동 μ²΄ν—˜
  4. 볡합 μ‹œλ‚˜λ¦¬μ˜€: μ—¬λŸ¬ μ„œλ²„λ₯Ό μ‘°ν•©ν•œ ReAct νŒ¨ν„΄ μ‹€μŠ΅

πŸ’‘ μ›Œν¬ν”Œλ‘œμš° λ™μž‘ 방식: μœ„μ˜ μ›Œν¬ν”Œλ‘œμš° κ·Έλž˜ν”„μ—μ„œ λ³Ό 수 μžˆλ“―μ΄, λ³΅μž‘ν•œ μš”μ²­μ€ ReAct νŒ¨ν„΄μ„ 톡해 λ‹¨κ³„λ³„λ‘œ 처리되며, 각 MCP μ„œλ²„μ˜ 도ꡬ듀이 ν•„μš”μ— 따라 ν˜ΈμΆœλ©λ‹ˆλ‹€.

API μ—”λ“œν¬μΈνŠΈ

πŸ“€ λ©”μ‹œμ§€ 전솑 API

curl -X POST "http://localhost:8000/api/chat" \
  -H "Content-Type: application/json" \
  -d '{"message": "μ•ˆλ…•ν•˜μ„Έμš”", "session_id": "test-session"}'

응닡 ν˜•μ‹:

{
  "status": "success",
  "session_id": "test-session",
  "message_id": "msg_123",
  "timestamp": "2024-01-01T12:00:00Z"
}

⚑ SSE 슀트리밍 API

μ‹€μ‹œκ°„ AI 응닡을 λ°›κΈ° μœ„ν•œ Server-Sent Events μ—”λ“œν¬μΈνŠΈ:

// κΈ°λ³Έ SSE μ—°κ²°
const eventSource = new EventSource('/api/stream/test-session');

// 이벀트 λ¦¬μŠ€λ„ˆ μ„€μ •
eventSource.onmessage = function(event) {
  const data = JSON.parse(event.data);
  handleStreamData(data);
};

eventSource.onerror = function(event) {
  console.error('SSE μ—°κ²° 였λ₯˜:', event);
  // μžλ™ μž¬μ—°κ²° 둜직
};

슀트리밍 데이터 ν˜•μ‹:

{
  "type": "token",           // token, status, tool_call, error
  "content": "μ•ˆλ…•ν•˜μ„Έμš”",    // μ‹€μ œ 토큰 λ‚΄μš©
  "session_id": "test-session",
  "message_id": "msg_123",
  "timestamp": "2024-01-01T12:00:00.123Z",
  "metadata": {
    "node": "llm_response",  // ν˜„μž¬ μ‹€ν–‰ 쀑인 μ›Œν¬ν”Œλ‘œμš° λ…Έλ“œ
    "step": 1,               // ReAct νŒ¨ν„΄μ˜ 단계 번호
    "total_tokens": 150      // λˆ„μ  토큰 수
  }
}

πŸ”„ 슀트리밍 이벀트 νƒ€μž…

νƒ€μž… μ„€λͺ… μ˜ˆμ‹œ
token AI 응닡 토큰 {"type": "token", "content": "μ•ˆλ…•"}
status 처리 μƒνƒœ μ—…λ°μ΄νŠΈ {"type": "status", "content": "도ꡬ 호좜 쀑..."}
tool_call MCP 도ꡬ 호좜 정보 {"type": "tool_call", "tool": "get_weather", "args": {...}}
tool_result 도ꡬ μ‹€ν–‰ κ²°κ³Ό {"type": "tool_result", "result": {...}}
thinking ReAct 사고 κ³Όμ • {"type": "thinking", "content": "날씨 정보λ₯Ό 확인해야겠닀"}
error 였λ₯˜ λ°œμƒ {"type": "error", "message": "μ—°κ²° μ‹€νŒ¨"}
complete 응닡 μ™„λ£Œ {"type": "complete", "final_response": "..."}

πŸ› οΈ κ³ κΈ‰ SSE μ‚¬μš©λ²•

class MCPChatClient {
  constructor(sessionId) {
    this.sessionId = sessionId;
    this.eventSource = null;
    this.reconnectAttempts = 0;
    this.maxReconnectAttempts = 5;
  }
  
  connect() {
    this.eventSource = new EventSource(`/api/stream/${this.sessionId}`);
    
    this.eventSource.onopen = () => {
      console.log('SSE μ—°κ²° 성곡');
      this.reconnectAttempts = 0;
    };
    
    this.eventSource.onmessage = (event) => {
      const data = JSON.parse(event.data);
      this.handleMessage(data);
    };
    
    this.eventSource.onerror = () => {
      this.handleReconnect();
    };
  }
  
  handleMessage(data) {
    switch(data.type) {
      case 'token':
        this.appendToken(data.content);
        break;
      case 'status':
        this.updateStatus(data.content);
        break;
      case 'tool_call':
        this.showToolCall(data.tool, data.args);
        break;
      case 'thinking':
        this.showThinking(data.content);
        break;
      case 'complete':
        this.onComplete(data.final_response);
        break;
      case 'error':
        this.handleError(data.message);
        break;
    }
  }
  
  handleReconnect() {
    if (this.reconnectAttempts < this.maxReconnectAttempts) {
      setTimeout(() => {
        this.reconnectAttempts++;
        this.connect();
      }, 1000 * Math.pow(2, this.reconnectAttempts)); // μ§€μˆ˜ λ°±μ˜€ν”„
    }
  }
}

πŸ“Š μ„Έμ…˜ 관리 API

# μƒˆ μ„Έμ…˜ 생성
curl -X POST "http://localhost:8000/api/sessions" \
  -H "Content-Type: application/json" \
  -d '{"user_id": "user123"}'

# μ„Έμ…˜ 정보 쑰회
curl "http://localhost:8000/api/sessions/test-session"

# μ„Έμ…˜ νžˆμŠ€ν† λ¦¬ 쑰회
curl "http://localhost:8000/api/sessions/test-session/history"

# μ„Έμ…˜ μ‚­μ œ
curl -X DELETE "http://localhost:8000/api/sessions/test-session"

πŸ” μ‹œμŠ€ν…œ μƒνƒœ API

# MCP μ„œλ²„ μƒνƒœ 확인
curl "http://localhost:8000/api/status/mcp-servers"

# μ‚¬μš© κ°€λŠ₯ν•œ 도ꡬ λͺ©λ‘
curl "http://localhost:8000/api/tools"

# μ‹œμŠ€ν…œ ν—¬μŠ€μ²΄ν¬
curl "http://localhost:8000/health"

πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰

MCP_test/
β”œβ”€β”€ mcp_host/                   # 메인 νŒ¨ν‚€μ§€
β”‚   β”œβ”€β”€ adapters/              # MCP ν΄λΌμ΄μ–ΈνŠΈ μ–΄λŒ‘ν„°
β”‚   β”‚   └── client.py          # langchain_mcp_adapters 기반 ν΄λΌμ΄μ–ΈνŠΈ
β”‚   β”œβ”€β”€ config/                # μ„€μ • 관리
β”‚   β”œβ”€β”€ models/                # 데이터 λͺ¨λΈ
β”‚   β”œβ”€β”€ services/              # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
β”‚   β”œβ”€β”€ sessions/              # μ„Έμ…˜ 관리
β”‚   β”œβ”€β”€ streaming/             # SSE 슀트리밍
β”‚   β”œβ”€β”€ visualize/             # μ‹œκ°ν™” 도ꡬ
β”‚   └── workflows/             # LangGraph μ›Œν¬ν”Œλ‘œμš°
β”‚       β”œβ”€β”€ nodes.py           # μ›Œν¬ν”Œλ‘œμš° λ…Έλ“œ
β”‚       β”œβ”€β”€ llm_nodes.py       # LLM 기반 λ…Έλ“œ
β”‚       β”œβ”€β”€ react_nodes.py     # ReAct νŒ¨ν„΄ λ…Έλ“œ
β”‚       └── graph.py           # μ›Œν¬ν”Œλ‘œμš° κ·Έλž˜ν”„
β”œβ”€β”€ examples/                  # MCP μ„œλ²„ 예제
β”‚   β”œβ”€β”€ dummy_weather_server.py # 더미 날씨 μ„œλ²„
β”‚   └── dummy_file_server.py   # 더미 파일 관리 μ„œλ²„
β”œβ”€β”€ static/                    # 정적 파일 (CSS, JS)
β”œβ”€β”€ logs/                      # 둜그 파일
β”œβ”€β”€ tests/                     # ν…ŒμŠ€νŠΈ μ½”λ“œ
β”œβ”€β”€ main.py                    # μ„œλ²„ μ§„μž…μ 
β”œβ”€β”€ mcp_servers.json          # MCP μ„œλ²„ μ„€μ • (3개 μ„œλ²„)
β”œβ”€β”€ Makefile                  # 개발 도ꡬ
└── requirements.txt          # μ˜μ‘΄μ„±

πŸ› οΈ 개발 κ°€μ΄λ“œ

Makefile λͺ…λ Ήμ–΄

# ν…ŒμŠ€νŠΈ
make test-basic              # κΈ°λ³Έ 톡합 ν…ŒμŠ€νŠΈ
make test-pytest            # 전체 pytest μ‹€ν–‰

# μ„œλ²„ 관리
make server                 # 개발 λͺ¨λ“œ μ‹€ν–‰
make run-bg                 # λ°±κ·ΈλΌμš΄λ“œ μ‹€ν–‰
make stop-bg                # λ°±κ·ΈλΌμš΄λ“œ μ„œλ²„ 쀑지
make status                 # μ„œλ²„ μƒνƒœ 확인
make logs                   # 둜그 확인

# μ½”λ“œ ν’ˆμ§ˆ
make check                  # 전체 ν’ˆμ§ˆ 검사
make format                 # μ½”λ“œ ν¬λ§·νŒ… (Black)
make lint                   # 린트 검사 (Flake8)

# μœ μ§€λ³΄μˆ˜
make clean                  # μΊμ‹œ 정리
make dev                    # 개발 ν™˜κ²½ μ„€μ •

ν…ŒμŠ€νŠΈ μ‹€ν–‰

# λΉ λ₯Έ κΈ°λ³Έ ν…ŒμŠ€νŠΈ
make test-basic

# 전체 ν…ŒμŠ€νŠΈ (pytest ν•„μš”)
make test-pytest

μ½”λ“œ ν’ˆμ§ˆ 관리

# μ½”λ“œ ν¬λ§·νŒ…
make format

# 린트 검사
make lint

# 전체 ν’ˆμ§ˆ 검사 (ν¬λ§·νŒ… + 린트 + ν…ŒμŠ€νŠΈ)
make check

βš™οΈ μ„€μ •

MCP μ„œλ²„ μ„€μ • (mcp_servers.json)

ν˜„μž¬ ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©ν•˜λŠ” μ‹€μ œ μ„€μ •:

{
  "weather": {
    "command": "python",
    "args": ["/path/to/MCP_test/examples/dummy_weather_server.py"],
    "transport": "stdio"
  },
  "file-manager": {
    "command": "python", 
    "args": ["/path/to/MCP_test/examples/dummy_file_server.py"],
    "transport": "stdio",
    "env": {
      "PYTHONPATH": "/path/to/MCP_test",
      "SAFE_MODE": "true"
    }
  },
  "context7": {
    "command": "npx",
    "args": [
      "-y",
      "@upstash/context7-mcp@latest"
    ],
    "transport": "stdio"
  }
}

μ„œλ²„λ³„ νŠΉμ§•:

  • 더미 μ„œλ²„λ“€: Python FastMCP둜 κ΅¬ν˜„, 둜컬 파일 μ‹€ν–‰
  • Context7: NPM νŒ¨ν‚€μ§€λ‘œ μ„€μΉ˜, μ‹€μ œ 온라인 μ„œλΉ„μŠ€ 연동

ν™˜κ²½λ³€μˆ˜ 상세 μ„€λͺ…

λ³€μˆ˜λͺ… μ„€λͺ… κΈ°λ³Έκ°’ ν•„μˆ˜
OPENAI_API_KEY OpenAI API ν‚€ - βœ…
OPENAI_MODEL μ‚¬μš©ν•  GPT λͺ¨λΈ gpt-4o-mini ❌
OPENAI_TEMPERATURE λͺ¨λΈ μ°½μ˜μ„± (0.0-2.0) 0.1 ❌
OPENAI_MAX_TOKENS μ΅œλŒ€ 토큰 수 1000 ❌
MCP_SERVERS_CONFIG MCP μ„œλ²„ μ„€μ • 파일 경둜 ./mcp_servers.json ❌
PHOENIX_ENABLED Phoenix λͺ¨λ‹ˆν„°λ§ ν™œμ„±ν™” false ❌

πŸ”§ νŠΈλŸ¬λΈ”μŠˆνŒ…

자주 λ°œμƒν•˜λŠ” λ¬Έμ œλ“€

1. OpenAI API ν‚€ 였λ₯˜

Error: OpenAI API key not found

해결방법: .env νŒŒμΌμ— μ˜¬λ°”λ₯Έ OPENAI_API_KEY μ„€μ •

2. MCP μ„œλ²„ μ—°κ²° μ‹€νŒ¨

Error: Failed to connect to MCP server

해결방법:

  • mcp_servers.json μ„€μ • 확인 (κ²½λ‘œκ°€ μ ˆλŒ€κ²½λ‘œλ‘œ μ„€μ •λ˜μ–΄ μžˆλŠ”μ§€)
  • 더미 μ„œλ²„λ“€: Python 파일이 μ‘΄μž¬ν•˜κ³  μ‹€ν–‰ κ°€λŠ₯ν•œμ§€ 확인
  • Context7 μ„œλ²„: Node.js와 npx λͺ…λ Ήμ–΄κ°€ μ‚¬μš© κ°€λŠ₯ν•˜κ³  인터넷 연결이 λ˜μ–΄ μžˆλŠ”μ§€ 확인
  • langchain_mcp_adapters νŒ¨ν‚€μ§€κ°€ μ˜¬λ°”λ₯΄κ²Œ μ„€μΉ˜λ˜μ—ˆλŠ”μ§€ 확인

3. 포트 좩돌

Error: Port 8000 already in use

해결방법:

  • κΈ°μ‘΄ ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œ: make stop-bg
  • λ˜λŠ” λ‹€λ₯Έ 포트 μ‚¬μš©: PORT=8001 python main.py

4. μ˜μ‘΄μ„± 였λ₯˜

ModuleNotFoundError: No module named 'xxx'

해결방법: make install λ˜λŠ” uv pip install -r requirements.txt

5. Node.js κ΄€λ ¨ 였λ₯˜

Error: npx command not found

해결방법:

  • Node.js 18+ μ„€μΉ˜: https://nodejs.org/
  • macOS: brew install node
  • Ubuntu: sudo apt install nodejs npm
  • Windows: Node.js 곡식 μ„€μΉ˜ ν”„λ‘œκ·Έλž¨ μ‚¬μš©

6. Phoenix UI 접속 λΆˆκ°€

Phoenix UI 링크가 λΉ„ν™œμ„±ν™”λ˜μ–΄ 있음

해결방법:

  • .env νŒŒμΌμ—μ„œ PHOENIX_ENABLED=true μ„€μ • 확인
  • μ„œλ²„ μž¬μ‹œμž‘ ν›„ 첫 번째 λŒ€ν™” μ‹œμž‘ (링크가 μžλ™ ν™œμ„±ν™”λ¨)
  • Phoenix κ΄€λ ¨ νŒ¨ν‚€μ§€ μ„€μΉ˜: uv pip install arize-phoenix openinference-instrumentation-langchain

둜그 확인

# μ‹€μ‹œκ°„ 둜그 확인
make logs

# λ˜λŠ” 직접 확인
tail -f logs/server.log

🀝 κΈ°μ—¬ν•˜κΈ°

개발 ν™˜κ²½ μ„€μ •

  1. μ €μž₯μ†Œ 포크
  2. λ‘œμ»¬μ— 클둠: git clone <your-fork>
  3. 개발 ν™˜κ²½ μ„€μ •: make dev
  4. 브랜치 생성: git checkout -b feature/your-feature

μ½”λ”© μŠ€νƒ€μΌ

  • ν¬λ§·νŒ…: Black (120자 μ œν•œ)
  • 린트: Flake8
  • νƒ€μž… 힌트: λͺ¨λ“  ν•¨μˆ˜μ— νƒ€μž… 힌트 μΆ”κ°€
  • λ¬Έμ„œν™”: Docstring μž‘μ„± (Google μŠ€νƒ€μΌ)

Pull Request κ°€μ΄λ“œλΌμΈ

  1. μ½”λ“œ ν’ˆμ§ˆ 검사 톡과: make check
  2. ν…ŒμŠ€νŠΈ μΆ”κ°€ 및 톡과: make test-basic
  3. λͺ…ν™•ν•œ 컀밋 λ©”μ‹œμ§€ μž‘μ„±
  4. PR μ„€λͺ…에 변경사항 상세 기술

πŸ“„ λΌμ΄μ„ μŠ€

이 ν”„λ‘œμ νŠΈλŠ” MIT λΌμ΄μ„ μŠ€ ν•˜μ— λ°°ν¬λ©λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ LICENSE νŒŒμΌμ„ μ°Έμ‘°ν•˜μ„Έμš”.

πŸ”— κ΄€λ ¨ 링크

πŸš€ ν–₯ν›„ μΆ”κ°€ μ˜ˆμ • κΈ°λŠ₯

πŸ“š ꡐ윑 κΈ°λŠ₯ κ°•ν™”

πŸŽ“ MCP ν•™μŠ΅ λͺ¨λ“œ

  • 단계별 νŠœν† λ¦¬μ–Ό: MCP ν”„λ‘œν† μ½œ ν•™μŠ΅μ„ μœ„ν•œ κ°€μ΄λ“œ λͺ¨λ“œ
  • μ½”λ“œ μ„€λͺ… μ˜€λ²„λ ˆμ΄: μ‹€ν–‰ 쀑인 MCP 톡신 과정을 μ½”λ“œμ™€ ν•¨κ»˜ μ„€λͺ…
  • μΈν„°λž™ν‹°λΈŒ λ¬Έμ„œ: μ‹€μ œ λ™μž‘ν•˜λŠ” μ˜ˆμ œμ™€ ν•¨κ»˜ν•˜λŠ” MCP κ°€μ΄λ“œ

πŸ“Š MCP μ„œλ²„ λͺ¨λ‹ˆν„°λ§ λŒ€μ‹œλ³΄λ“œ (ꡐ윑용)

  • μ„œλ²„ μƒνƒœ 상세 보기: ν˜„μž¬ 'μ„œλ²„ 3개 - 도ꡬ 7개' ν‘œμ‹œλ₯Ό ν΄λ¦­ν•˜λ©΄ 상세 정보 확인
    • 각 MCP μ„œλ²„λ³„ μ—°κ²° μƒνƒœ 및 μ΄ˆκΈ°ν™” μ§„ν–‰ 상황
    • μ„œλ²„λ³„ μ‚¬μš© κ°€λŠ₯ν•œ 도ꡬ λͺ©λ‘κ³Ό μ„€λͺ…
    • μ‹€μ‹œκ°„ μ„œλ²„ ν—¬μŠ€μ²΄ν¬ 및 응닡 μ‹œκ°„
    • 도ꡬ별 호좜 횟수 및 성곡/μ‹€νŒ¨ 톡계
  • ν•™μŠ΅ 관점: MCP μ„œλ²„ 생λͺ…주기와 μƒνƒœ 관리 이해

πŸ” μ‹€μ‹œκ°„ 데이터 톡신 λͺ¨λ‹ˆν„°λ§ (ꡐ윑용)

  • 톡합 개발자 λ·°: 챗봇 ν™”λ©΄κ³Ό λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€μ—μ„œ 데이터 흐름 확인
    • JSON-RPC μš”μ²­/응닡 μ‹€μ‹œκ°„ ν‘œμ‹œ: MCP ν”„λ‘œν† μ½œ λ©”μ‹œμ§€ ꡬ쑰 ν•™μŠ΅
    • MCP ν”„λ‘œν† μ½œ λ©”μ‹œμ§€ 좔적: ν‘œμ€€ λ©”μ‹œμ§€ ν˜•μ‹κ³Ό 흐름 이해
    • LangGraph μ›Œν¬ν”Œλ‘œμš° μƒνƒœ λ³€ν™” μ‹œκ°ν™”: μƒνƒœ 기반 μ›Œν¬ν”Œλ‘œμš° ν•™μŠ΅
    • ReAct νŒ¨ν„΄ 사고 κ³Όμ • 단계별 ν‘œμ‹œ: AI μΆ”λ‘  κ³Όμ • μ‹œκ°ν™”
    • 토큰 μ‚¬μš©λŸ‰ 및 API 호좜 λΉ„μš© 좔적: μ‹€μ œ 운영 λΉ„μš© 이해
  • Phoenix 톡합 κ°•ν™”: ν˜„μž¬ 별도 μ°½μ—μ„œ μ œκ³΅λ˜λŠ” Phoenix UIλ₯Ό 메인 μΈν„°νŽ˜μ΄μŠ€μ— 톡합

🎯 μΆ”κ°€ κ³„νš κΈ°λŠ₯

  • μ»€μŠ€ν…€ MCP μ„œλ²„ μΆ”κ°€: μ›Ή UIμ—μ„œ μƒˆλ‘œμš΄ μ„œλ²„ μ„€μ • 및 ν…ŒμŠ€νŠΈ (ν•™μŠ΅μžκ°€ 직접 MCP μ„œλ²„ ꡬ성 μ²΄ν—˜)
  • μ›Œν¬ν”Œλ‘œμš° 좔적 κΈ°λŠ₯: μ‹€ν–‰ 쀑인 LangGraph λ…Έλ“œμ˜ ν”Œλ‘œμš°λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ 좔적 및 μ‹œκ°ν™”
  • λŒ€ν™” νžˆμŠ€ν† λ¦¬ 관리: μ„Έμ…˜λ³„ λŒ€ν™” μ €μž₯ 및 검색
  • MCP μ„œλ²„ 개발 도ꡬ: μƒˆλ‘œμš΄ MCP μ„œλ²„ κ°œλ°œμ„ μœ„ν•œ ν…œν”Œλ¦Ώκ³Ό ν…ŒμŠ€νŠΈ 도ꡬ

Made with ❀️ using LangGraph and MCP

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors