mcp

minchae-me/mcp

3.1

If you are the rightful owner of mcp and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.

This project demonstrates the automatic generation of an MCP server from an OpenAPI specification using FastMCP.

FastMCP OpenAPI μžλ™ 생성 데λͺ¨

이 ν”„λ‘œμ νŠΈλŠ” FastMCPλ₯Ό μ‚¬μš©ν•˜μ—¬ OpenAPI μŠ€νŽ™μ—μ„œ μžλ™μœΌλ‘œ MCP(Model Context Protocol) μ„œλ²„λ₯Ό μƒμ„±ν•˜κ³  Swagger UIλ₯Ό μ œκ³΅ν•˜λŠ” 데λͺ¨μž…λ‹ˆλ‹€.

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

  • OpenAPI μŠ€νŽ™ μžλ™ λ³€ν™˜: OpenAPI 3.0 μŠ€νŽ™μ„ MCP μ„œλ²„λ‘œ μžλ™ λ³€ν™˜
  • FastAPI 톡합: FastAPI 앱을 MCP μ„œλ²„λ‘œ μžλ™ λ³€ν™˜
  • Swagger UI 제곡: μ›Ή λΈŒλΌμš°μ €μ—μ„œ API λ¬Έμ„œ 확인 κ°€λŠ₯
  • μžλ™ ν…ŒμŠ€νŠΈ: μƒμ„±λœ MCP μ„œλ²„μ˜ κΈ°λŠ₯을 μžλ™μœΌλ‘œ ν…ŒμŠ€νŠΈ
  • ν˜„λŒ€μ μΈ 도ꡬ: uv, pyproject.toml μ‚¬μš©

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

1. uv μ„€μΉ˜ (ꢌμž₯)

# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows (PowerShell)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

# λ˜λŠ” pip둜 μ„€μΉ˜
pip install uv

2. ν”„λ‘œμ νŠΈ μ„€μ •

# ν”„λ‘œμ νŠΈ 클둠 및 디렉토리 이동
git clone <repository-url>
cd fastmcp-openapi-demo

# uv둜 κ°€μƒν™˜κ²½ 생성 및 μ˜μ‘΄μ„± μ„€μΉ˜
uv sync

# λ˜λŠ” 개발 μ˜μ‘΄μ„±κΉŒμ§€ ν¬ν•¨ν•΄μ„œ μ„€μΉ˜
uv sync --dev

3. 데λͺ¨ μ‹€ν–‰

# 방법 1: uv run으둜 직접 μ‹€ν–‰
uv run python run_demo.py

# 방법 2: 슀크립트 λͺ…λ Ήμ–΄ μ‚¬μš©
uv run fastmcp-demo

# 방법 3: κ°€μƒν™˜κ²½ ν™œμ„±ν™” ν›„ μ‹€ν–‰
source .venv/bin/activate  # Linux/macOS
# .venv\Scripts\activate   # Windows
python run_demo.py

πŸ› οΈ 개발 ν™˜κ²½ μ„€μ •

μ½”λ“œ ν’ˆμ§ˆ 도ꡬ

# μ½”λ“œ ν¬λ§·νŒ…
uv run black .

# λ¦°νŒ…
uv run ruff check .
uv run ruff check . --fix  # μžλ™ μˆ˜μ •

# νƒ€μž… 체킹
uv run mypy .

# ν…ŒμŠ€νŠΈ μ‹€ν–‰
uv run pytest

μƒˆλ‘œμš΄ μ˜μ‘΄μ„± μΆ”κ°€

# λŸ°νƒ€μž„ μ˜μ‘΄μ„± μΆ”κ°€
uv add package-name

# 개발 μ˜μ‘΄μ„± μΆ”κ°€
uv add --dev package-name

# νŠΉμ • 버전 μ§€μ •
uv add "fastapi>=0.104.0"

πŸ“‹ ν•΄κ²°λœ λ¬Έμ œλ“€

❌ κΈ°μ‘΄ λ¬Έμ œμ λ“€

  1. ν…ŒμŠ€νŠΈ 였λ₯˜: 'list' object has no attribute 'tools'
  2. asyncio 좩돌: Already running asyncio in this thread
  3. MCP μ—”λ“œν¬μΈνŠΈ 404: /mcp 경둜 μ ‘κ·Ό λΆˆκ°€
  4. νŒ¨ν‚€μ§€ 관리: 느린 pip, λ³΅μž‘ν•œ κ°€μƒν™˜κ²½ 관리

βœ… ν•΄κ²° λ°©μ•ˆ

  1. API ν˜Έν™˜μ„± κ°œμ„ : tools/resources 객체 νƒ€μž… 검사 μΆ”κ°€
  2. 독립 μ„œλ²„ 생성: standalone_mcp_server.py둜 asyncio 좩돌 ν•΄κ²°
  3. FastAPI 톡합 κ°œμ„ : MCP 정보 μ—”λ“œν¬μΈνŠΈ μΆ”κ°€
  4. ν˜„λŒ€μ μΈ 도ꡬ: uv μ‚¬μš©μœΌλ‘œ λΉ λ₯Έ μ˜μ‘΄μ„± 관리

🌐 μ›Ή μΈν„°νŽ˜μ΄μŠ€

FastAPI μ„œλ²„ μ‹€ν–‰ ν›„ λΈŒλΌμš°μ €μ—μ„œ λ‹€μŒ URL 접속:

πŸ“‹ 파일 ꡬ쑰

.
β”œβ”€β”€ pyproject.toml           # ν”„λ‘œμ νŠΈ μ„€μ • 및 μ˜μ‘΄μ„±
β”œβ”€β”€ .python-version          # Python 버전 μ§€μ •
β”œβ”€β”€ uv.lock                  # μ˜μ‘΄μ„± 잠금 파일 (μžλ™ 생성)
β”œβ”€β”€ openapi_mcp_server.py    # 메인 MCP μ„œλ²„ κ΅¬ν˜„
β”œβ”€β”€ standalone_mcp_server.py # 독립 STDIO MCP μ„œλ²„
β”œβ”€β”€ test_mcp_client.py       # MCP ν΄λΌμ΄μ–ΈνŠΈ ν…ŒμŠ€νŠΈ
β”œβ”€β”€ run_demo.py             # 데λͺ¨ μ‹€ν–‰ 슀크립트
└── README.md               # 이 λ¬Έμ„œ

πŸ”§ κ΅¬ν˜„ 방법

1. OpenAPI μŠ€νŽ™μ—μ„œ MCP μ„œλ²„ 생성

from fastmcp import FastMCP
from fastmcp.server.openapi import RouteMap, MCPType
import httpx

# HTTP ν΄λΌμ΄μ–ΈνŠΈ 생성
client = httpx.AsyncClient(base_url="https://api.example.com")

# OpenAPI μŠ€νŽ™ λ‘œλ“œ
openapi_spec = {...}  # OpenAPI 3.0 μŠ€νŽ™

# MCP μ„œλ²„ 생성
mcp = FastMCP.from_openapi(
    openapi_spec=openapi_spec,
    client=client,
    name="My API Server"
)

# μ„œλ²„ μ‹€ν–‰
await mcp.run()

2. FastAPI μ•±μ—μ„œ MCP μ„œλ²„ 생성

from fastapi import FastAPI
from fastmcp import FastMCP

# FastAPI μ•± 생성
app = FastAPI()

@app.get("/items")
def get_items():
    return [{"id": 1, "name": "Item 1"}]

# FastAPIλ₯Ό MCP μ„œλ²„λ‘œ λ³€ν™˜
mcp = FastMCP.from_fastapi(app=app)

# μ„œλ²„ μ‹€ν–‰
await mcp.run()

πŸ§ͺ ν…ŒμŠ€νŠΈ

# λͺ¨λ“  ν…ŒμŠ€νŠΈ μ‹€ν–‰
uv run pytest

# νŠΉμ • ν…ŒμŠ€νŠΈ 파일 μ‹€ν–‰
uv run pytest test_mcp_client.py

# 컀버리지 포함 ν…ŒμŠ€νŠΈ
uv run pytest --cov=. --cov-report=html

πŸ†š uv vs pip 비ꡐ

κΈ°λŠ₯uvpip
μ†λ„πŸš€ 10-100λ°° λΉ λ¦„πŸŒ 느림
μ˜μ‘΄μ„± ν•΄κ²°βœ… κ³ κΈ‰ μ•Œκ³ λ¦¬μ¦˜βš οΈ 기본적
κ°€μƒν™˜κ²½βœ… 톡합 κ΄€λ¦¬βŒ 별도 도ꡬ ν•„μš”
잠금 νŒŒμΌβœ… uv.lock❌ μ—†μŒ
크둜슀 ν”Œλž«νΌβœ… μΌκ΄€λœ κ²½ν—˜βš οΈ ν”Œλž«νΌλ³„ 차이

πŸ’‘ uv μ‚¬μš© 팁

# ν”„λ‘œμ νŠΈ μ΄ˆκΈ°ν™”
uv init my-project
cd my-project

# Python 버전 μ„€μ •
uv python pin 3.12

# μ˜μ‘΄μ„± μ„€μΉ˜ (pyproject.toml 기반)
uv sync

# 슀크립트 μ‹€ν–‰
uv run python script.py

# νŒ¨ν‚€μ§€ μΆ”κ°€/제거
uv add requests
uv remove requests

# 개발 μ„œλ²„ μ‹€ν–‰
uv run uvicorn app:app --reload

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

  1. μ €μž₯μ†Œλ₯Ό ν¬ν¬ν•©λ‹ˆλ‹€
  2. κΈ°λŠ₯ 브랜치λ₯Ό λ§Œλ“­λ‹ˆλ‹€: git checkout -b feature/amazing-feature
  3. uvλ₯Ό μ‚¬μš©ν•΄ 개발 ν™˜κ²½μ„ μ„€μ •ν•©λ‹ˆλ‹€: uv sync --dev
  4. μ½”λ“œ ν’ˆμ§ˆ 도ꡬλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€: uv run black . && uv run ruff check .
  5. ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€: uv run pytest
  6. 변경사항을 μ»€λ°‹ν•©λ‹ˆλ‹€: git commit -m 'Add amazing feature'
  7. λΈŒλžœμΉ˜μ— ν‘Έμ‹œν•©λ‹ˆλ‹€: git push origin feature/amazing-feature
  8. Pull Requestλ₯Ό μ—½λ‹ˆλ‹€

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

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

πŸ“ž 지원

λ¬Έμ œκ°€ μžˆκ±°λ‚˜ 질문이 μžˆμœΌμ‹œλ©΄ 이슈λ₯Ό 생성해 μ£Όμ„Έμš”.