mcp-server-template

joonheeu/mcp-server-template

3.2

If you are the rightful owner of mcp-server-template 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 is a template for creating a Model Context Protocol (MCP) server using FastAPI and FastMCP.

Tools
  1. get_data_by_id

    Retrieve specific data by its ID.

  2. search_data_by_query

    Search for data using keywords.

  3. create_new_data

    Create new data entries.

  4. update_existing_data

    Update existing data entries.

  5. delete_data_by_id

    Delete data by its ID.

MCP Server Template

이 ν”„λ‘œμ νŠΈλŠ” FastAPI와 FastMCPλ₯Ό μ‚¬μš©ν•œ MCP(Model Context Protocol) μ„œλ²„ ν…œν”Œλ¦Ώμž…λ‹ˆλ‹€. Python + uv + FastMCP + FastAPI + Scalar UIλ₯Ό κ²°ν•©ν•˜μ—¬ λΉ λ₯΄κ³  효율적인 MCP μ„œλ²„ κ°œλ°œμ„ μ§€μ›ν•©λ‹ˆλ‹€.

πŸš€ μ‹œμž‘ν•˜κΈ°

1. 가상 ν™˜κ²½ 생성 및 ν™œμ„±ν™”

uvλ₯Ό μ‚¬μš©ν•˜μ—¬ Python 가상 ν™˜κ²½μ„ μƒμ„±ν•˜κ³  ν™œμ„±ν™”ν•©λ‹ˆλ‹€:

# uv μ‚¬μš© (ꢌμž₯)
uv venv
source .venv/bin/activate  # Linux/macOS
# λ˜λŠ” .venv\Scripts\activate  # Windows

# λ˜λŠ” κΈ°μ‘΄ venv μ‚¬μš©
python -m venv .venv
source .venv/bin/activate

2. μ˜μ‘΄μ„± μ„€μΉ˜

# uv μ‚¬μš© μ‹œ (ꢌμž₯)
uv pip install -r requirements.txt

# λ˜λŠ” pyproject.toml μ‚¬μš©
uv sync

# pip μ‚¬μš© μ‹œ
pip install -r requirements.txt

3. ν™˜κ²½ λ³€μˆ˜ μ„€μ •

env.example νŒŒμΌμ„ λ³΅μ‚¬ν•˜μ—¬ .env νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€:

cp env.example .env

μƒμ„±λœ .env νŒŒμΌμ„ μ—΄μ–΄ ν•„μš”ν•œ ν™˜κ²½ λ³€μˆ˜λ₯Ό μ„€μ •ν•˜μ„Έμš”:

# Server Configuration
SERVER_NAME=my-awesome-mcp-server
SERVER_VERSION=1.0.0
SERVER_DESCRIPTION="My awesome MCP server"

# API Configuration
API_HOST=localhost
API_PORT=8001

# External API Configuration (μ‹€μ œ API에 맞게 μˆ˜μ •)
EXTERNAL_API_KEY=your_actual_api_key
EXTERNAL_API_SECRET=your_actual_api_secret
EXTERNAL_API_BASE_URL=https://your-api.example.com

πŸ–₯️ μ„œλ²„ μ‹€ν–‰

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

# uvicorn으둜 μ‹€ν–‰ (hot reload 포함)
uvicorn app.main:app --host 0.0.0.0 --port 8001 --reload

# λ˜λŠ” Python으둜 직접 μ‹€ν–‰
python -m app.main

ν”„λ‘œλ•μ…˜ λͺ¨λ“œλ‘œ μ‹€ν–‰

uvicorn app.main:app --host 0.0.0.0 --port 8001

μ„œλ²„κ°€ μ‹€ν–‰λ˜λ©΄ λ‹€μŒ URL듀에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€:

  • Scalar UI: http://localhost:8001/scalar (μΆ”μ²œ)
  • Swagger UI: http://localhost:8001/docs
  • MCP SSE μ—”λ“œν¬μΈνŠΈ: http://localhost:8001/mcp/sse
  • Health Check: http://localhost:8001/health

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

mcp-server-template/
β”œβ”€β”€ app/                          # 메인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œ
β”‚   β”œβ”€β”€ main.py                   # FastAPI μ•± 및 MCP μ„œλ²„ μ„€μ •
β”‚   β”œβ”€β”€ config.py                 # ν™˜κ²½ λ³€μˆ˜ 및 μ„€μ • 관리
β”‚   └── services/                 # μ™ΈλΆ€ μ„œλΉ„μŠ€ 연동 둜직
β”‚       └── example_api_client.py # μ˜ˆμ‹œ API ν΄λΌμ΄μ–ΈνŠΈ
β”œβ”€β”€ static/                       # 정적 파일
β”‚   └── scalar.html              # Scalar UI HTML
β”œβ”€β”€ docs/                        # λ¬Έμ„œ (선택사항)
β”œβ”€β”€ pyproject.toml               # uv/Python ν”„λ‘œμ νŠΈ μ„€μ •
β”œβ”€β”€ requirements.txt             # Python μ˜μ‘΄μ„± λͺ©λ‘
β”œβ”€β”€ env.example                  # ν™˜κ²½ λ³€μˆ˜ μ˜ˆμ‹œ
└── README.md                    # ν”„λ‘œμ νŠΈ λ¬Έμ„œ

πŸ”— MCP (Model Context Protocol) μ‚¬μš©

MCP ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ—°κ²°

MCP ν΄λΌμ΄μ–ΈνŠΈ μ„€μ • νŒŒμΌμ— λ‹€μŒκ³Ό 같이 μΆ”κ°€ν•˜μ„Έμš”:

{
  "mcpServers": {
    "My MCP Server": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote@latest",
        "http://localhost:8001/sse"
      ]
    }
  }
}

μ§€μ›λ˜λŠ” MCP 도ꡬ

이 ν…œν”Œλ¦Ώμ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ MCP 도ꡬ듀:

  • get_data_by_id: 데이터 ID둜 νŠΉμ • 데이터 쑰회
  • search_data_by_query: ν‚€μ›Œλ“œλ‘œ 데이터 검색
  • create_new_data: μƒˆλ‘œμš΄ 데이터 생성
  • update_existing_data: κΈ°μ‘΄ 데이터 μ—…λ°μ΄νŠΈ
  • delete_data_by_id: 데이터 μ‚­μ œ

πŸ› οΈ μ»€μŠ€ν„°λ§ˆμ΄μ§•

1. API ν΄λΌμ΄μ–ΈνŠΈ μˆ˜μ •

app/services/example_api_client.py νŒŒμΌμ„ μ‹€μ œ μ‚¬μš©ν•  μ™ΈλΆ€ API에 맞게 μˆ˜μ •ν•˜μ„Έμš”:

# μ‹€μ œ API μ—”λ“œν¬μΈνŠΈ 및 인증 방식에 맞게 μˆ˜μ •
class YourAPIClient:
    def __init__(self):
        self.base_url = "https://your-api.example.com"
        self.api_key = "your-api-key"
    
    async def your_custom_method(self, param: str):
        # μ‹€μ œ API 호좜 둜직 κ΅¬ν˜„
        pass

2. MCP 도ꡬ μΆ”κ°€

app/main.pyμ—μ„œ μƒˆλ‘œμš΄ MCP 도ꡬλ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

@mcp.tool(description="μƒˆλ‘œμš΄ κΈ°λŠ₯을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.")
async def new_tool(param: str) -> str:
    """μƒˆλ‘œμš΄ 도ꡬ μ„€λͺ…"""
    try:
        # μ‹€μ œ 둜직 κ΅¬ν˜„
        result = {"message": f"처리 μ™„λ£Œ: {param}"}
        return json.dumps(result, indent=2, ensure_ascii=False)
    except Exception as e:
        return json.dumps({"error": str(e)}, indent=2, ensure_ascii=False)

3. FastAPI μ—”λ“œν¬μΈνŠΈ μΆ”κ°€

REST API μ—”λ“œν¬μΈνŠΈλ„ μ‰½κ²Œ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

@app.get("/new-endpoint", tags=["Custom"])
async def new_endpoint():
    """μƒˆλ‘œμš΄ REST API μ—”λ“œν¬μΈνŠΈ"""
    return {"message": "Hello from new endpoint!"}

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

# ν…ŒμŠ€νŠΈ μ‹€ν–‰ (pytest μ„€μΉ˜ ν›„)
pytest

# 컀버리지와 ν•¨κ»˜ ν…ŒμŠ€νŠΈ
pytest --cov=app

πŸ“ˆ 개발 도ꡬ

이 ν…œν”Œλ¦Ώμ€ λ‹€μŒ 개발 도ꡬ듀을 μ§€μ›ν•©λ‹ˆλ‹€:

  • Black: μ½”λ“œ ν¬λ§€νŒ…
  • Ruff: λ¦°νŒ… 및 μ½”λ“œ ν’ˆμ§ˆ 검사
  • pytest: ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬
# μ½”λ“œ ν¬λ§€νŒ…
black app/

# λ¦°νŒ…
ruff check app/

# μžλ™ μˆ˜μ •
ruff check app/ --fix

🐳 Docker 지원

Dockerλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ‹€μŒ Dockerfile을 μΆ”κ°€ν•˜μ„Έμš”:

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8001

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8001"]

πŸ“š μ°Έκ³  자료

🀝 κΈ°μ—¬

μ΄μŠˆλ‚˜ κ°œμ„ μ‚¬ν•­μ΄ μžˆμœΌμ‹œλ©΄ μ–Έμ œλ“ μ§€ κΈ°μ—¬ν•΄ μ£Όμ„Έμš”!

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

MIT License