FastAPI-MCP: FastAPI 서버를 MCP Server로 간단하게 전환하는 라이브러리

  • 카카오톡 공유하기
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 링크 복사하기

데이터 제어를 위한 백엔드 시스템으로 Python과 FastAPI를 통해 구현하였다면, Model Context Protocol(MCP) 서버로 변환해주는 강력한 라이브러리인 FastAPI-MCP에 대해 알아보겠습니다.

FastAPI-MCP란 무엇인가?

FastAPI-MCP는 FastAPI로 작성된 API 서버의 모든 엔드포인트를 MCP 도구(tool)로 자동 변환해주는 라이브러리입니다. Model Context Protocol(MCP)은 Claude, Cursor와 같은 AI 도구들과 쉽게 통합되도록 고안된 프로토콜로, 이를 통해 여러분의 API를 AI 모델이 직접 활용할 수 있게 됩니다.

기존에는 FastAPI 앱을 외부 시스템에서 도구화하려면 별도의 API 문서를 만들거나, SDK를 생성하고, 커넥터를 개발하는 등의 과정이 필요했습니다. 하지만 FastAPI-MCP를 사용하면, 개발자는 기존 FastAPI 애플리케이션 코드를 거의 변경하지 않고도 MCP 서버로 확장할 수 있어 개발 생산성을 크게 향상시킬 수 있습니다. 특히 대규모 언어 모델(LLM) 기반 도구와의 연동이 필요한 프로젝트에서 매우 유용합니다.

주요 기능

FastAPI-MCP는 다음과 같은 강력한 기능들을 제공합니다

  • 간편한 통합: FastAPI 앱에 MCP 서버를 직접 마운트(Mount)할 수 있습니다.
  • 자동 엔드포인트 변환: FastAPI 엔드포인트를 자동으로 탐색하여 MCP 도구로 변환합니다.
  • 스키마 및 문서 유지: 요청/응답 모델의 JSON 스키마와 Swagger (OpenAPI) 문서에 정의된 설명 및 정보를 그대로 유지하여 MCP 도구에서도 활용할 수 있습니다.
  • 사용자 정의 도구 지원: 필요에 따라 사용자 정의 MCP 도구를 추가할 수 있습니다.
  • FastAPI 네이티브: 단순한 OpenAPI 변환기가 아닌, FastAPI의 기능을 최대한 활용합니다. 기존 FastAPI의 Depends()를 사용한 인증/인가 로직을 MCP 엔드포인트에도 동일하게 적용할 수 있습니다.
  • ASGI 전송: FastAPI 앱의 ASGI 인터페이스를 직접 사용하여 효율적으로 통신합니다.

설치 방법

FastAPI-MCP는 다음과 같은 방법으로 설치할 수 있습니다:

uv를 사용하는 경우 (권장)

pip를 사용하는 경우

기본 사용법

FastAPI-MCP를 사용하는 가장 간단한 방법은 다음과 같습니다:

from fastapi import FastAPI
from fastapi_mcp import add_mcp_server

app = FastAPI()

# FastAPI 앱에 MCP 서버를 마운트합니다.
# '/mcp' 경로에 "My API MCP"라는 이름으로 MCP 서버가 생성됩니다.
add_mcp_server(app, mount_path="/mcp", name="My API MCP")

# 이제 FastAPI 앱을 실행하면 /mcp 경로에서 MCP 서버가 함께 동작합니다.
# 예: uvicorn main:app --reload

이렇게 하면 여러분의 FastAPI 앱에 MCP 서버가 /mcp 경로에 마운트되어, 모든 API 엔드포인트가 자동으로 MCP 도구로 변환됩니다.

고급 설정 예시

더 세부적인 설정이 필요한 경우 다음과 같이 추가 매개변수를 사용할 수 있습니다:

from fastapi import FastAPI
from fastapi_mcp import add_mcp_server

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str | None = None):
    return {"item_id": item_id, "q": q}

add_mcp_server(
    app,
    mount_path="/custom-mcp-path",  # MCP 서버의 마운트 경로 변경
    name="My Advanced API MCP",    # MCP 서버의 이름 지정
    describe_all_responses=True,   # 모든 응답에 대한 설명을 포함할지 여부
    describe_full_response_schema=True # 전체 응답 스키마를 설명에 포함할지 여부
)

사용자 정의 MCP 도구 추가하기

기존 API 엔드포인트 외에도 사용자 정의 MCP 도구를 추가할 수 있습니다:

from fastapi import FastAPI
from fastapi_mcp import FastApiMCP # FastApiMCP 클래스를 임포트
from datetime import datetime

app = FastAPI()

# 1. FastApiMCP 인스턴스 생성
mcp_server = FastApiMCP(app, name="My Custom Tools MCP")

# 2. @mcp_server.tool() 데코레이터를 사용하여 사용자 정의 함수를 MCP 도구로 등록
@mcp_server.tool()
async def get_server_time() -> str:
    """현재 서버의 ISO 형식 시간 문자열을 반환합니다."""
    return datetime.now().isoformat()

# 3. MCP 서버를 FastAPI 앱에 마운트 (기본 경로는 /mcp)
mcp_server.mount(mount_path="/my-tools-mcp")

# FastAPI 엔드포인트 예시
@app.get("/hello")
async def hello():
    return {"message": "Hello World"}

# FastAPI-MCP는 /hello 엔드포인트도 자동으로 MCP 도구로 변환합니다.
# 그리고 get_server_time 함수는 별도의 MCP 도구로 추가됩니다.

고급 구성

스키마 설명 사용자 정의

FastAPI-MCP 스키마를 직접 지정할 수 있습니다:


from fastapi import FastAPI
from fastapi_mcp import FastApiMCP

app = FastAPI()    

mcp = FastApiMCP(
    app,
    name="내 API MCP",
    base_url="http://localhost:8000",
    describe_all_responses=True,  # 가능한 모든 응답 스키마 포함
    describe_full_response_schema=True  # 전체 JSON 스키마 세부정보 포함
)    

# FastAPI 앱에 MCP 서버 마운트
mcp.mount()

MCP 도구 이름 및 운영 ID 이해하기

“get_user_info”가 됩니다. AI 에이전트가 도구와 상호 작용할 때 더 나은 사용성을 위해 명확하고 설명적인 운영 ID를 명시적으로 정의하는 것이 좋습니다


# operation_id를 정의하여, 도구로써 네이밍을 정의할 수 있음
@app.get("/users/{user_id}", operation_id="get_user_info")
async def read_user(user_id: int):
    return {"user_id": user_id}
    
# operation ID로 특정 작업"get_user_info" 만 포함해서 MCP서버로 응답이 가능하도록 filtering
mcp = FastApiMCP(
    app,
    include_operations=["get_user_info"]
)    

엔드포인트 필터링 케이스

@app.get()과 같은 엔드포인트가 MCP에서 선택적으로 사용될수 있도록 필터링을 합니다.

# operation ID로 특정 작업만 포함
mcp = FastApiMCP(
    app,
    include_operations=["get_user", "create_user"]
)

# 특정 작업 제외
mcp = FastApiMCP(
    app,
    exclude_operations=["delete_user"]
)

# 태그별 필터
mcp = FastApiMCP(
    app,
    include_tags=["users", "public"]
)

# 태그별 제외
mcp = FastApiMCP(
    app,
    exclude_tags=["admin", "internal"]
)

# 필터링 전략 결합
mcp = FastApiMCP(
    app,
    include_operations=["user_login"],
    include_tags=["public"]
)

Claude Desktop에서 사용하기

FastAPI-MCP로 생성한 MCP 서버는 Claude Desktop과 같은 AI 도구에서 바로 사용할 수 있습니다. 이를 위해 mcp-proxy를 활용할 수 있습니다:

  1. mcp-proxy 설치:
    # uv를 사용하는 경우
    uv tool install mcp-proxy
    # pipx 또는 다른 Python CLI 도구 관리자를 사용할 수도 있습니다.
  2. MCP 서버 URL 설정:
    mcp-proxy를 실행할 때, 여러분의 FastAPI-MCP 서버 URL(예: http://localhost:8000/mcp)을 JSON 설정 파일이나 환경 변수를 통해 지정합니다.
  3. AI 도구에서 사용:
    mcp-proxy가 실행되면, Claude Desktop과 같은 도구가 mcp-proxy를 통해 FastAPI-MCP 서버에 정의된 모든 도구들을 자동으로 인식하고 사용할 수 있게 됩니다.

주의사항

  • Python 3.10 이상이 필요하며, Python 3.12가 권장됩니다.
  • 인증이 필요한 API의 경우, FastAPI의 기존 의존성 시스템을 활용하여 MCP 서버에서도 인증을 유지할 수 있습니다.
  • 복잡한 응답 모델을 사용하는 경우 describe_full_response_schema=True 옵션을 사용하여 전체 스키마를 노출시키는 것이 좋습니다.
  • MCP 서버의 성능은 기본 FastAPI 앱의 성능에 의존하므로, 기존 앱의 최적화가 중요합니다.

실제 사용 예제

간단한 TODO API를 MCP 서버로 변환하기

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Optional
from fastapi_mcp import FastApiMCP

app = FastAPI(title="TODO API")

class TodoItem(BaseModel):
id: Optional[int] = None
title: str
description: Optional[str] = None
completed: bool = False

todos = []
counter = 1

@app.post("/todos/", response_model=TodoItem)
async def create_todo(todo: TodoItem):
"""새로운 할 일을 생성합니다."""
global counter
todo.id = counter
counter += 1
todos.append(todo)
return todo

@app.get("/todos/", response_model=List[TodoItem])
async def get_todos():
"""모든 할 일 목록을 반환합니다."""
return todos

@app.get("/todos/{todo_id}", response_model=TodoItem)
async def get_todo(todo_id: int):
"""특정 ID의 할 일을 반환합니다."""
for todo in todos:
if todo.id == todo_id:
return todo
raise HTTPException(status_code=404, detail="Todo not found")

# MCP 서버 추가
mcp = FastApiMCP(app)
mcp.mount()

# 사용자 정의 MCP 도구 추가
@mcp.tool()
async def count_todos() -> int:
"""할 일의 총 개수를 반환합니다."""
return len(todos)

이제 Claude Desktop이나 다른 MCP 지원 도구에서 이 API를 직접 사용할 수 있습니다. 예를 들어, Claude에게 “새로운 할 일을 추가하고 모든 할 일 목록을 보여줘”라고 요청하면 Claude는 자동으로 적절한 API 엔드포인트를 호출하여 작업을 수행할 수 있습니다.

라이선스

FastAPI-MCP 프로젝트는 MIT 라이선스로 공개 및 배포되고 있으며, 상업적 사용에 제약이 없습니다.

관련 리소스

마무리

최근에 python 기반으로 RAG 시스템을 갖춘 MCP Server 를 만들어 보고 있었습니다. FastAPI 를 이용하여, Ingest, Embedding, 요약 처리 등 백엔드 구성을 완료하였는데, 이렇게 저장된 벡터 문서를 질의를 통해서 리턴하는 하는 시스템을 만들었지만, MCP Client와 연결하는데, 많이 헤맸습니다.

그 구성을 크게 수정하지 않고, 라이브러리 하나만으로 전체적인 큰 수정없이 바로 MCP서버로 변경하는 것에 매우 놀라웠습니다.

FastAPI-MCP는 FastAPI 애플리케이션을 AI 시대에 맞게 진화시키는 강력한 도구입니다. 별도의 복잡한 설정 없이 기존 API를 Claude와 같은 AI 모델이 직접 활용할 수 있는 MCP 도구로 변환해주므로, AI 기반 애플리케이션 개발 시간을 크게 단축할 수 있습니다.


게시됨

카테고리

,

작성자

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다