Smithery.ai 에 지피터스 커뮤니티 검색 MCP 서버 등록하기

소개

안녕하세요.

지난 글 지피터스 MCP 서버 구축 및 연동 사례에서 지피터스 데이터 파이프라인 플랫폼 구축 중에 MCP 서버를 연동한 사례를 공유드렸습니다. 그리고 이후 팀 내 회의에서 이 MCP 서버를 외부에 공개해서 지피터스 스터디 멤버들이 사용할 수 있도록 하자고 의견을 정했고, 이번 글에서는 그 과정을 공유 드리겠습니다.

기존에 개발한 MCP 서버는 벡터 DB에 질의해서 결과를 처리하고 MCP 인터페이스에 맞춰 처리하는 기능을 하나의 코드베이스로 구현했습니다. 내부적으로 사용할 용도라 이렇게 해도 문제가 될 것은 없었는데요.

하지만 외부에 배포하기로 한 이상 현재 서버를 그대로 공개하면 벡터 DB에 엑세스할 수 있는 키가 노출되기 때문에 벡터 DB에 질의하고 결과를 처리하는 부분은 별도 API 서버로 개발하고 MCP 서버는 이 API 서버를 호출하고 결과를 받아서 처리하는 부분만 담당하는 방향으로 개발했습니다.

그리고 MCP 서버 외부 배포는 현재 MCP 서버 검색, 등록할 때 가장 많이 사용하는 플랫폼인 Smithery에 등록했습니다. 아래는 Smithery 링크와 Github Repo 링크입니다.

진행 방법

  1. 아키텍처 변경:

    • 기존 MCP 서버에서 벡터 DB 접근 및 결과 처리 로직을 분리하여 별도의 비공개 API 서버로 개발(보안 강화)

    • 새로운 API 서버에 인증 기능을 추가

    • 기존 MCP 서버는 이 API 서버를 호출하고 결과를 받아 MCP 인터페이스에 맞게 처리하는 역할만 하도록 수정

  2. 기능 추가 개발:

    • 사용자 편의를 위해 검색 기능을 확장

      • 작성일시 기준 검색 (예: gpters에서 ~~를 찾아주고, **최근 1년 내**의 사례 글에서 정리해줘.)

      • 작성자 기준 검색 (예: gpters에서 **작성자가 김태현**이고 ~~ 관련한 게시물을 찾아서 정리해줘.)

      • 게시판 이름 기준 검색 (예: gpters에서 **"이미지 / 음악 / 영상" 게시판에서** 검색해서 ~~ 관련한 게시물을 찾아서 정리해줘.)

  3. Smithery 배포 준비:

    • GitHub: 수정된 MCP 서버 코드를 GitHub 저장소에 관리

      • Repo: https://github.com/chat-prompt/gpters-search-mcp-server

    • Docker (Dockerfile): MCP 서버(Python)를 실행할 Docker 이미지를 빌드하기 위해 Dockerfile을 작성했습니다. Python 환경 설정, 의존성 설치, 실행 명령어를 정의했습니다.

      Dockerfile

      # Generated by https://smithery.ai. See: https://smithery.ai/docs/config#dockerfile
      FROM python:3.12-slim
      
      # Set working directory
      WORKDIR /app
      
      # Copy project definition file
      COPY pyproject.toml ./
      
      # Generate requirements.txt from pyproject.toml dependencies
      # This step helps ensure dependencies are installed correctly
      RUN python -c "import tomllib; deps = tomllib.load(open('pyproject.toml', 'rb'))['project']['dependencies']; print('\n'.join(deps))" > requirements.txt
      
      # Install dependencies using pip from the generated requirements.txt
      RUN pip install --no-cache-dir -r requirements.txt
      
      # Copy the rest of the application source code
      COPY . /app
      
      # Command to run the application
      CMD ["python3", "gpters_search_mcp_server.py"]
      
    • Smithery 설정 (smithery.yaml): Smithery가 서버를 어떻게 시작하고 설정할지 정의하는 smithery.yaml 파일을 작성

      • startCommand.type: stdio 로 지정

      • configSchema: 서버 실행에 필요한 설정값(여기서는 apiSecretKey)을 정의하고, 필수 값으로 지정

      • commandFunction: JavaScript 함수를 사용해, 사용자가 입력한 apiSecretKey와 하드코딩된 API 서버 URL들을 환경 변수(env)로 주입하여 실제 실행 명령어(python3 gpters_search_mcp_server.py)를 생성하도록 했습니다. 이렇게 하면 민감한 정보가 코드에 노출되지 않습니다.

      YAML

      # Smithery configuration file: https://smithery.ai/docs/config#smitheryyaml
      
      startCommand:
        type: stdio
        configSchema:
          type: object
          required:
            - apiSecretKey # This API key is required for deployment
          properties:
            apiSecretKey:
              type: string
              description: "API secret key for GPTers search service"
        commandFunction:
          # A JS function that produces the CLI command based on the given config to start the MCP on stdio.
          |-
          (config) => ({
            command: 'python3',
            args: ['gpters_search_mcp_server.py'],
            env: {
              # URLs for the backend API server
              LOGIN_URL: "https://ztuufduvb5.execute-api.ap-northeast-2.amazonaws.com/dev/login",
              SEARCH_URL: "https://ztuufduvb5.execute-api.ap-northeast-2.amazonaws.com/dev/search",
              # Pass the secret key securely as an environment variable
              API_SECRET_KEY: config.apiSecretKey
            }
          })
        exampleConfig:
          # Example for users, replace with actual key during deployment
          apiSecretKey: YOUR_API_KEY_HERE
      
  4. Smithery 배포 실행:

    • Smithery.ai 플랫폼에 접속하여 서버를 등록/선택

    • 'Settings' > 'Deployments' 탭에서 GitHub 저장소를 연결

    • Deploy 버튼 클릭해서 배포

    • Smithery가 자동으로 Docker 이미지를 빌드하고 설정된 명령어로 서버를 실행해서 배포 완료

  5. 테스트:

    • Smithery 서버 페이지의 'Tools' 탭에서, 설정값으로 apiSecretKey를 입력한 후, 실제 검색 쿼리를 날려 서버가 정상적으로 응답하는지 테스트

  6. Smithery 배포 완료 화면:

    Word 'Knowledge Search Server'가있는 페이지의 스크린 샷
  7. Tools 탭에서 API 키 등록 후 테스트 결과:

    주황색 화면이있는 검은 색 화면의 스크린 샷

결과와 배운 점

배운 점과 나만의 꿀팁을 알려주세요.

  • 보안의 중요성: 내부용 서버를 외부에 공개할 때는 반드시 보안(특히 API 키, DB 접근 정보 등 민감 정보 노출)을 최우선으로 고려하고 아키텍처를 재설계해야 합니다. 민감 로직은 별도 API로 분리하고 인증을 추가하는 것이 좋은 방법입니다.

  • Smithery 배포의 핵심: Dockerfilesmithery.yaml 파일이 핵심입니다. 이 두 파일을 통해 서버 환경 구성과 실행 방식을 완벽하게 제어할 수 있습니다.

  • 민감 정보 관리: API 키와 같은 비밀 값은 smithery.yamlconfigSchema로 정의하고, commandFunctionenv 객체를 통해 환경 변수로 전달하는 것이 Smithery에서 권장하는 안전한 방법입니다. 코드에 직접 하드코딩하는 것은 절대 피해야 합니다.

  • 문서화 및 테스트: 배포 설정 파일(Dockerfile, smithery.yaml)에 주석을 잘 달아두면 나중에 관리하기 편리합니다. Smithery 배포 전 로컬에서 Docker 빌드 및 MCP 서버 테스트를 충분히 하는 것이 시행착오를 줄이는 데 도움이 됩니다.

과정 중에 어떤 시행착오를 겪었나요?

  • 가장 큰 변화는 기존의 단일 코드베이스 서버를 MCP 서버와 백엔드 API 서버로 분리하는 아키텍처 변경이었습니다. 단순히 배포 플랫폼에 올리는 것 이상으로, 보안을 위해 추가 개발 공수가 필요했습니다. 이는 시행착오라기보다는 외부 공개를 위한 필수적인 과정이었습니다.

  • Smithery 설정 시 commandFunction에서 환경 변수를 정확히 설정하고, Python 코드에서 이를 올바르게 읽어오는지 확인하는 과정이 필요했습니다.

앞으로의 계획이 있다면 들려주세요.

  • 현재 배포된 GPTers Search MCP 서버를 지피터스 스터디 멤버들이 원활하게 사용할 수 있도록 안정적으로 운영하고, 피드백을 받아 필요한 부분을 개선해나갈 계획입니다.

  • Smithery 배포 경험을 바탕으로 다른 MCP 서버 프로젝트에도 적용해볼 수 있을 것 같습니다.

도움 받은 글

👉 이 게시글도 읽어보세요