728x90
🚀 FastAPI + MCP SSE 서버/클라이언트와 LangChain Function Calling 실습기
개요
최근 LLM 기반 애플리케이션에서 브라우저·서버 친화적인 통신 방식이 중요한 화두가 되고 있습니다. 특히 스트리밍 기반 상호작용이 필요한 경우 Server-Sent Events(SSE) 가 실용적인 대안이 됩니다. 이번 글에서는 FastAPI + MCP(Server/Client)로 SSE 서버를 구축하고, LangChain Function Calling 기능을 함께 연계한 예제를 정리합니다.
목표
- SSE 기반 MCP 서버 구축: FastAPI로 SSE 스트림을 제공하고, MCP 툴로 GPT 대화 기능을 노출.
- MCP SSE 클라이언트 구현: SSE 스트림에 연결해
chat툴을 호출하는 클라이언트 작성. - Function Calling 샘플 추가: LangChain의
AgentType.OPENAI_FUNCTIONS를 활용해 간단한 수학 툴 실행. - 환경 구성:
.env로 API Key와 기본 SSE URL 관리.
설계
프로토콜/전송
- SSE 채택: 브라우저/서버에서 쉽게 다룰 수 있고, LLM 스트리밍과 궁합이 좋음.
- 서버 엔드포인트:
/sse: 클라이언트 SSE 스트림 연결/messages/: 메시지 포스트백
서버 (sse_server.py)
@app.get("/sse")
async def handle_sse(...):
...
app.mount("/messages/", sse.handle_post_message)
@mcp.tool()
async def chat(input: str) -> str:
return await llm.ainvoke(input)
- LangChain:
ChatOpenAI(model="gpt-4o")로 단순 대화 툴 제공.
클라이언트 (sse_client.py)
- 기본 URL:
.env의SSE_URL또는http://127.0.0.1:3000/sse ClientSession으로 연결 후session.call_tool("chat", {...})호출- 응답은 문자열/JSON/dict 모두 대응 가능하게 안전 처리
quit입력 시 종료
Function Calling (function_calling.py)
from langchain.agents import initialize_agent, AgentType
# 샘플 툴 정의
def add(a, b): return a + b
def subtract(a, b): return a - b
agent = initialize_agent(
[add, subtract],
ChatOpenAI(model="gpt-4o"),
agent_type=AgentType.OPENAI_FUNCTIONS,
verbose=True,
)
"7에서 3을 빼줘"요청 시 →subtract(7, 3)툴 호출 → 응답 반환
실행 가이드
필수 패키지
pip install fastapi uvicorn python-dotenv langchain langchain-openai mcp starlette
환경 구성 (.env)
OPENAI_API_KEY=sk-...
SSE_URL=http://127.0.0.1:3000/sse
서버 실행
python test-server/sse_server.py
→ Uvicorn이 127.0.0.1:3000에서 /sse 제공
클라이언트 실행
python test-server/sse_client.py
→ 프롬프트에서 질의 입력, quit로 종료
Function Calling 실행
python test-server/function_calling.py
→ "7에서 3을 빼줘" → subtract 툴 호출 로그 확인
인사이트
- 엔드포인트 정합성: 클라이언트 기본 URL(
/sse)과 서버 라우트가 일치해 즉시 실행 가능. - 의존성 정리: 불필요한
mcp_client.py임포트 제거 권장. - 보안/운영:
.env기반 관리 → 프로덕션에서는 시크릿 매니저 권장. CORS/인증(토큰·IP 제한) 필요. - 확장 포인트:
- 토큰 단위 스트리밍 출력
- 검색/DB/RAG 툴 추가
- 대화 메모리, 에러·타임아웃 처리, 로깅/트레이싱
마무리
이번 실습을 통해 SSE 기반 MCP 서버/클라이언트를 활용해 LLM 대화를 구현하고, LangChain Function Calling을 결합해 툴 실행 패턴까지 확인했습니다. 앞으로 여기에 검색, DB 연동, RAG 등을 추가하면 확장성 있는 AI 애플리케이션 아키텍처로 발전시킬 수 있습니다.
PR: https://github.com/goodsosbva/Making-my-own-MCP/pull/3
728x90