ABOUT ME

공부좀해보자! 다른사람에게 보여준다기보다 지금은 개발노트

Today
Yesterday
Total
  • Python으로 MCP Server 만들기
    Language/Python 2025. 3. 7. 16:23

     

    프로젝트 생성

    $ mkdir mcp-python-250309

     

    소스코드

    python

    • server.py

    대충 로그 찍어두고 서버 기동하자

    from mcp.server.fastmcp import FastMCP
    import logging
    import sys
    
    # 로깅 설정
    logging.basicConfig(
        level=logging.DEBUG,
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        handlers=[
            logging.StreamHandler(sys.stdout)
        ]
    )
    
    logger = logging.getLogger("mcp-server")
    
    # Create an MCP server
    # mcp = FastMCP("MCP 서버")
    mcp = FastMCP(name="MCP 서버", debug=True)
    
    # Add an addition tool
    @mcp.tool()
    def add(a: int, b: int) -> int:
        """Add two numbers"""
        message = f"Add {a} and {b}"
        logger.info(message)  # 로거를 통한 로그 출력
        return a + b
    
    @mcp.tool()
    def echo_tool(message: str) -> str:
        """Echo a message as a tool"""
        log_message = f"Tool echo: {message}"
        logger.info(log_message)  # 로거를 통한 로그 출력
        return message
    
    @mcp.prompt()
    def echo_prompt(message: str) -> str:
        """Create an echo prompt"""
        log_message = f"Prompt echo: {message}"
        logger.info(log_message)
        return f"Please process this message: {message}"
    
    # Add a dynamic greeting resource
    @mcp.resource("greeting://{name}")
    def get_greeting(name: str) -> str:
        """Get a personalized greeting"""
        log_message = f"Greeting for: {name}"
        logger.info(log_message)
        return f"Hello, {name}!"
    
    @mcp.resource("echo://{message}")
    def echo_resource(message: str) -> str:
        """Echo a message as a resource"""
        log_message = f"Resource echo: {message}"
        logger.info(log_message)
        return f"Resource echo: {message}"
    
    
    if __name__ == "__main__":
        logger.info("Starting MCP server...")
        # transport 옵션을 변경해봅니다
        mcp.run(transport="sse")

     

    도커

    • requirements.txt
    mcp
    • Dockerfile
    FROM python:3.13-slim
    
    # pip 업그레이드
    # RUN pip install --no-cache-dir --upgrade pip
    
    WORKDIR /app
    
    COPY docker/requirements.txt .
    RUN pip install --no-cache-dir -r requirements.txt
    
    COPY . .
    
    EXPOSE 8000
    
    CMD ["python", "server.py"]
    • docker-compose.yml
    services:
      mcp-python-250309:
        build: .
        image: gundam/mcp-python-250309:1.0.0
        container_name: mcp-python-250309
        ports:
          - "8000:8000"
        volumes:
          - ./src:/app
        restart: unless-stopped
        networks:
          - mcp-network
        environment:
          - PYTHONUNBUFFERED=1
          - LOG_LEVEL=DEBUG
          - FASTMCP_PORT=8000
          - FASTMCP_TRANSPORT=sse
          - FASTMCP_DEBUG=true
          - FASTMCP_HOST=0.0.0.0
    networks:
      mcp-network:
        driver: bridge

     

    프로젝트 실행

    • 실행
    # 이미지 빌드 및 컨테이너 시작 및 백그라운드
    $ docker-compose up -d --build
    
    # 로그 확인 (백그라운드 실행 시)
    $ docker-compose logs -f
    
    # 서버 중지
    $ docker-compose down
    
    # 동시 실행
    $ docker-compose down & docker-compose up -d --build & docker-compose logs -f
    • 콘솔

    docker-compose down & docker-compose up -d --build & docker-compose logs -f

     

    Curser IDE에서 실행 및 테스트

    MCP Server 추가 (sse)

    MCP Server 추가 > mcp-python-250309

     

    Chat해서 확인해 보기

    2+6은? (mcp-python-250309)

    2+6은? (mcp-python-250309)

     

    잘된다..!!

     

     

    첨고)

    https://github.com/jlowin/fastmcp/issues/69

    https://github.com/punkpeye/fastmcp?tab=readme-ov-file

    https://github.com/modelcontextprotocol/python-sdk/pull/83

    https://github.com/modelcontextprotocol/python-sdk/tree/main

     

     

    'Language > Python' 카테고리의 다른 글

    댓글

Designed by Tistory.