[MCP] FastAPI + MCP SSE 서버/클라이언트와 LangChain Function Calling 실습기

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: .envSSE_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