MCP Server

김민기·2025년 4월 20일
0

MCP Server를 사용해보기

간단하게 MCP Server를 사용하는 방법

다른 사람이 만들어놓은 MCP 서버를 등록해서 사용하는 방법부터 살펴보자.

MCP 서버의 구조

클라이언트/호스트 ↔ MCP 서버
  • 서버는 사용할 수 있는 리소스와 툴 목록을 호스트(Client)에 전달하고,
  • 클라이언트는 이를 기억하고 있다가 사용자의 요청 시 필요한 도구를 호출해 사용한다.

MCP 서버 실행 방법

외부 MCP Server 사용하기

  1. npx 또는 uvx 명령어로 외부 MCP 서버를 설치와 동시에 실행할 수 있다.
  2. 직접 만든 MCP 서버의 index.ts 경로나 실행 스크립트를 claude_desktop_config.json에 등록해서 실행할 수도 있다.

직접 MCP Server를 만들어서 사용하기

MCP Server SDK를 활용하면 직접 서버를 구현할 수 있다. 구현 후에는 Claude Desktop과 연동해서 동작 확인이 가능하다.


SQLite 데이터베이스 접근하기

초기 설정

다음 패키지들이 설치되어 있어야 한다.

brew install uv git sqlite

샘플 DB 생성

sqlite3 ~/test.db <<EOF
CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT,
  price REAL
);

INSERT INTO products (name, price) VALUES
  ('Widget', 19.99),
  ('Gadget', 29.99),
  ('Gizmo', 39.99),
  ('Smart Watch', 199.99),
  ('Wireless Earbuds', 89.99),
  ('Portable Charger', 24.99);
EOF

Claude Desktop 설정 예시

{
  "mcpServers": {
    "sqlite": {
      "command": "uvx",
      "args": ["mcp-server-sqlite", "--db-path", "/Users/YOUR_USERNAME/test.db"]
    }
  }
}

Claude Desktop 재시작

  • 반드시 완전히 종료 후 다시 실행해야 설정이 반영된다.
  • claude_desktop_config.json 파일을 기준으로 MCP 서버를 초기화한다.

동작 원리

Claude Desktop이 MCP 서버와 상호작용하는 흐름은 다음과 같다:

  1. 서버 발견
    • Claude Desktop이 MCP 서버에 연결해 기능을 확인
  2. 프로토콜 핸드셰이크
    • MCP 서버의 기능 협상
    • 리소스/툴 목록 수신
  3. 상호작용
    • Claude Desktop이 툴 실행 요청
    • MCP 서버가 SQLite 쿼리 수행
    • 결과 반환
  4. 보안
    • MCP 서버는 제한된 기능만 제공
    • 인터넷과 연결되지 않으며 로컬에서만 실행
    • 민감한 작업은 사용자 확인 필요

MCP 서버는 어디서 받아오는가?

uvx 명령어는 mcp-server-sqlite 패키지를 PyPI에서 자동으로 설치하고 실행한다.
npx 명령어는 https://www.npmjs.com/ 에서 패키지를 자동으로 설치하고 실행한다.

💡 마치 Docker 이미지가 로컬에 없을 경우 Docker Hub에서 받아오는 것과 비슷한 구조다 (추측)

{
  "mcpServers": {
    "sqlite": {
      "command": "uvx",
      "args": ["mcp-server-sqlite", "--db-path", "/Users/YOUR_USERNAME/test.db"]
    }
  }
}

날씨 예측

📚 참고 자료: 6MCP서버예제구현

해당 문서의 예제만으로는 실행이 정상적으로 되지 않으며, 몇 가지 보완이 필요하다.

수정 사항 요약

  1. env 경로 설정
    const __filename = fileURLToPath(import.meta.url);
    const __dirname = path.dirname(__filename);
    dotenv.config({ path: path.resolve(__dirname, "../.env") });
  2. setupHandlers 구현 필요
    private setupHandlers(): void {
      this.setupResourceHandlers();
      this.setupToolHandlers();
    }
  3. capabilities 채우기
    • resources / tools 항목을 정확히 선언하지 않으면 Claude가 MCP 서버의 기능을 인식하지 못함
  4. AbortController 오류 대응
    if (typeof global.AbortController === "undefined") {
      global.AbortController = (await import("abort-controller")).default;
    }

MCP 프로젝트 생성 팁

  • npx 실행 시 "Would you like to install this server for Claude.app?"라는 질문이 나오면 y를 입력할 것.
  • 자동으로 claude_desktop_config.json에 MCP 서버가 등록된다.
{
  "mcpServers": {
    "weather-server": {
      "command": "node",
      "args": [
        "/Users/gimmingi/Desktop/Study/weather-server/build/index.js"
      ]
    }
  }
}

코드 분석

📦 setupResourceHandlers()

Claude가 리소스 URI(weather://Seoul/current)에 접근하면 이 핸들러가 호출됨.
→ 실시간 날씨 요청 처리.

🛠️ setupToolHandlers()

Claude가 도구(get_forecast)를 실행하면 호출됨.
→ 날씨 예보 기능.

핵심적으로 MCP 서버는 리소스 및 툴 리스트를 전달하고,
실행 시 그 핸들러가 호출된다.

❓ 리소스는 필수인가?

리소스는 주로 정적인 데이터 전달용으로 쓰는 것이 좋다.
날씨처럼 동적 데이터는 툴로 처리하는 것이 더 적절해 보인다.


전체 코드
https://github.com/93minki/weather-forecast-mcp-server/blob/main/src/index.ts

📚 참고 자료

0개의 댓글