https://modelcontextprotocol.io/quickstart/server
MCP로 사용할 서버를 개발해보자. 서버를 만든다는 건 도구를 만든다고 생각하면 된다.
만들어볼 것
날씨 조회하는 도구를 만들어보자.
2가 종류를 모두 만들어보고 실행해보자.
- stdio
- 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를 연결하는 방식을 사용할 수 있다고 한다.