소개
안녕하세요.
지난 글 지피터스 MCP 서버 구축 및 연동 사례에서 지피터스 데이터 파이프라인 플랫폼 구축 중에 MCP 서버를 연동한 사례를 공유드렸습니다. 그리고 이후 팀 내 회의에서 이 MCP 서버를 외부에 공개해서 지피터스 스터디 멤버들이 사용할 수 있도록 하자고 의견을 정했고, 이번 글에서는 그 과정을 공유 드리겠습니다.
기존에 개발한 MCP 서버는 벡터 DB에 질의해서 결과를 처리하고 MCP 인터페이스에 맞춰 처리하는 기능을 하나의 코드베이스로 구현했습니다. 내부적으로 사용할 용도라 이렇게 해도 문제가 될 것은 없었는데요.
하지만 외부에 배포하기로 한 이상 현재 서버를 그대로 공개하면 벡터 DB에 엑세스할 수 있는 키가 노출되기 때문에 벡터 DB에 질의하고 결과를 처리하는 부분은 별도 API 서버로 개발하고 MCP 서버는 이 API 서버를 호출하고 결과를 받아서 처리하는 부분만 담당하는 방향으로 개발했습니다.
그리고 MCP 서버 외부 배포는 현재 MCP 서버 검색, 등록할 때 가장 많이 사용하는 플랫폼인 Smithery에 등록했습니다. 아래는 Smithery 링크와 Github Repo 링크입니다.
Smithery 링크 : https://smithery.ai/server/@chat-prompt/gpters-search-mcp-server
GitHub Repo : https://github.com/chat-prompt/gpters-search-mcp-server
진행 방법
아키텍처 변경:
기존 MCP 서버에서 벡터 DB 접근 및 결과 처리 로직을 분리하여 별도의 비공개 API 서버로 개발(보안 강화)
새로운 API 서버에 인증 기능을 추가
기존 MCP 서버는 이 API 서버를 호출하고 결과를 받아 MCP 인터페이스에 맞게 처리하는 역할만 하도록 수정
기능 추가 개발:
사용자 편의를 위해 검색 기능을 확장
작성일시 기준 검색 (예: gpters에서 ~~를 찾아주고, 최근 1년 내의 사례 글에서 정리해줘.)
작성자 기준 검색 (예: gpters에서 작성자가 김태현이고 ~~ 관련한 게시물을 찾아서 정리해줘.)
게시판 이름 기준 검색 (예: gpters에서 "이미지 / 음악 / 영상" 게시판에서 검색해서 ~~ 관련한 게시물을 찾아서 정리해줘.)
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
Smithery 배포 실행:
Smithery.ai 플랫폼에 접속하여 서버를 등록/선택
'Settings' > 'Deployments' 탭에서 GitHub 저장소를 연결
Deploy 버튼 클릭해서 배포
Smithery가 자동으로 Docker 이미지를 빌드하고 설정된 명령어로 서버를 실행해서 배포 완료
테스트:
Smithery 서버 페이지의 'Tools' 탭에서, 설정값으로
apiSecretKey를 입력한 후, 실제 검색 쿼리를 날려 서버가 정상적으로 응답하는지 테스트
Smithery 배포 완료 화면:
Tools 탭에서 API 키 등록 후 테스트 결과:
결과와 배운 점
배운 점과 나만의 꿀팁을 알려주세요.
보안의 중요성: 내부용 서버를 외부에 공개할 때는 반드시 보안(특히 API 키, DB 접근 정보 등 민감 정보 노출)을 최우선으로 고려하고 아키텍처를 재설계해야 합니다. 민감 로직은 별도 API로 분리하고 인증을 추가하는 것이 좋은 방법입니다.
Smithery 배포의 핵심:
Dockerfile과smithery.yaml파일이 핵심입니다. 이 두 파일을 통해 서버 환경 구성과 실행 방식을 완벽하게 제어할 수 있습니다.민감 정보 관리: API 키와 같은 비밀 값은
smithery.yaml의configSchema로 정의하고,commandFunction내env객체를 통해 환경 변수로 전달하는 것이 Smithery에서 권장하는 안전한 방법입니다. 코드에 직접 하드코딩하는 것은 절대 피해야 합니다.문서화 및 테스트: 배포 설정 파일(
Dockerfile,smithery.yaml)에 주석을 잘 달아두면 나중에 관리하기 편리합니다. Smithery 배포 전 로컬에서 Docker 빌드 및 MCP 서버 테스트를 충분히 하는 것이 시행착오를 줄이는 데 도움이 됩니다.
과정 중에 어떤 시행착오를 겪었나요?
가장 큰 변화는 기존의 단일 코드베이스 서버를 MCP 서버와 백엔드 API 서버로 분리하는 아키텍처 변경이었습니다. 단순히 배포 플랫폼에 올리는 것 이상으로, 보안을 위해 추가 개발 공수가 필요했습니다. 이는 시행착오라기보다는 외부 공개를 위한 필수적인 과정이었습니다.
Smithery 설정 시
commandFunction에서 환경 변수를 정확히 설정하고, Python 코드에서 이를 올바르게 읽어오는지 확인하는 과정이 필요했습니다.
앞으로의 계획이 있다면 들려주세요.
현재 배포된 GPTers Search MCP 서버를 지피터스 스터디 멤버들이 원활하게 사용할 수 있도록 안정적으로 운영하고, 피드백을 받아 필요한 부분을 개선해나갈 계획입니다.
Smithery 배포 경험을 바탕으로 다른 MCP 서버 프로젝트에 도 적용해볼 수 있을 것 같습니다.