LLM, AI 도구 / / 2025. 4. 8. 07:00

MCP Server 개발 - Python

https://modelcontextprotocol.io/quickstart/server

MCP로 사용할 서버를 개발해보자. 서버를 만든다는 건 도구를 만든다고 생각하면 된다.

만들어볼 것

날씨 조회하는 도구를 만들어보자.
2가 종류를 모두 만들어보고 실행해보자.

  1. stdio
  2. sse

그리고 AI Cursor와 Claude에서 MCP를 연결해보자.

환경 설정

우선 uv 설치하고 python 환경 구성

MacOS/Linux

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

Windows

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

uv 명령어가 제대로 인식되도록 하기 위해, 이후 터미널을 반드시 재시작하자.

이제 프로젝트를 생성하고 설정해보자.

uv init 
uv venv
source .venv/bin/activate

uv add "mcp[cli]"

서버 만들기

package import하고 인스턴스 구성

mcp_server.py

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("weather")

@mcp.tool()
async def get_weather(location: str) -> str:
    """Get weather for location."""

    # 항상 맑음으로 리턴한다.
    # 실제로는 api를 조회하여 결과를 가져오게 하면 된다.

    return f"{location}은 항상 맑아요~~"


def run_server(transport: str = "stdio"):
    """MCP 서버를 실행합니다.

    Args:
        transport: 통신 방식 ("stdio" 또는 "sse")
    """
    mcp.run(transport=transport)

FastMCP 클래스는 Python의 타입 힌트와 docstring을 활용하여 도구 정의를 자동으로 생성한다. 이를 통해 MCP 도구를 쉽고 효율적으로 만들고 유지할 수 있다.

server_local.py

from mcp_server import run_server  

if __name__ == "__main__":  
    run_server(transport="stdio")

server_sse.py

from mcp_server import run_server  

if __name__ == "__main__":  
    run_server(transport="sse")

Cursor AI에서 MCP 서버 테스트하기

Cursor AI를 설치하고 MCP를 연결해보자.

1) stdio 방식 실행

stdio 방식은 호스트에서 직접 실행하는 방식이다.

Cursor 설정 > MCP에서 아래 부분을 추가한다.

{
    "mcpServers": {
        "weather": {
            "command": "uv",
            "args": [
                "--directory",
                "/Users/rudaks/mcp/server/weather",
                "run",
                "server_local.py"
            ]
        }
    }
}

그리고 MCP 도구 목록에서 녹색불이 들어와있는 것을 확인하면 정상적으로 연결된 것이다.

이제 cursor에서 질의를 날려보자.

잘 실행되는 것을 확인할 수 있다.

2) sse 방식 실행

sse 방식으로 실행을 해보자.

sse 방식은 웹서버를 실행하고 나서 호출하는 방식이므로 sse 서버를 실행하자.

그리고 나서 server_sse.py를 실행하자.

python server_sse.py

아래와 같이 uvicorn 서버가 실행되는 것을 확인할 수 있다.

INFO:     Started server process [41801]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

그리고 http://localhost:8000/sse로 접속하면 아래와 같은 화면이 표시된다.

event: endpoint
data: /messages/?session_id=83a70186a70e43ad90a1bf0e20375feb

이제 cursor 설정으로 다시 가서 sse 방식으로 변경을 해보자.

{
    "mcpServers": {
        "weather": {
            "url": "http://localhost:8000/sse"
        }
    }
}

mcp 목록에서 새로고침하고 녹색불이 표시되는지 확인하자.

이제 메시지를 날려보자. (서울 날씨 알려줘)

정상적으로 잘 호출되는 것을 확인할 수 있다.

Claude 데스크탑에서 MCP 서버 테스트하기

이제 Claude Desktop을 설치하고 MCP를 연결해보자.

Claude 무료 계정에서도 잘 된다.

1) stdio 방식 실행

설정 > 개발자 > 설정 편집에서 claude_desktop_config.json파일을 열고 아래를 추가해보자.

{
    "mcpServers": {
        "weather": {
            "command": "uv",
            "args": [
                "--directory",
                "/Users/rudaks/mcp/server/weather",
                "run",
                "server_local.py"
            ]
        }
    }
}

위의 --directory는 pyproject.toml이 있는 경로이다.

MCP 도구를 새로 적용하려면 Claude의 경우 claude 앱을 재시작해야 한다.

새로 시작하면 아래 망치(도구) 표시에 1 표시되는 것을 확인할 수 있고 클릭 시 사용가능한 도구가 표시된다.

이제 질의를 해보자. 그러면 도구를 허용할지 물어보면 허용을 해준다.

정상적으로 도구가 실행되는 것을 확인할 수 있다.

2) sse 방식 실행

sse 방식 실행을 위해 sse 서버를 실행하자.

uv run server_sse.py

그리고 나서 claude 설정을 sse 방식으로 변경하자.

{
    "mcpServers": {
        "weather": {
            "url": "http://localhost:8000/sse"
        }
    }
}

Claude 앱을 재시작하면 아래와 같은 오류가 표시된다.

확인해보니 Claude Desktop에서는 stdio 방식만 지원하며 sse 방식을 지원하지 않는다. (현재 : 2025/04)
sse를 사용하기 위해서는 gateway를 연결하는 방식을 사용할 수 있다고 한다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유