본문 바로가기
나의 IT 기억

🚀 MCP Server - 나의 동료에게 설명하는 MCP

by 浪畅 (Làng Chàng) 2025. 5. 27.

MCP-SERVER 이건 또 뭐야


나의 저장소 주소: https://github.com/onesound71/enhanced-mcp-server

📚 목차

  1. MCP란 무엇인가?
  2. 프로젝트 구조 이해하기
  3. MCP 서버 동작 원리
  4. 소스코드 상세 분석
  5. 실습: MCP 서버 실행하기
  6. 커스텀 도구 만들기

🤔 MCP란 무엇인가?

MCP (Model Context Protocol)는 AI 모델이 외부 도구와 데이터에 안전하게 접근할 수 있게 해주는 표준 프로토콜입니다.

🏗️ MCP의 핵심 개념

┌─────────────┐    MCP Protocol    ┌─────────────┐
│   AI Model  │ ←──────────────→   │ MCP Server  │
│ (Cursor AI) │                    │ (우리 서버) │
└─────────────┘                    └─────────────┘
                                           │
                                           ▼
                                   ┌─────────────┐
                                   │   Tools &   │
                                   │    Data     │
                                   └─────────────┘

🤷‍♂️ 왜 MCP가 필요할까요?

Q: AI가 이미 똑똑한데 왜 MCP가 필요한가요?
A: AI는 학습된 데이터만 알고 있어요. 우리 회사의 실시간 직원 정보, 프로젝트 상태, 비밀 코드 등은 모릅니다!

Q: 그냥 AI에게 직접 데이터를 주면 안 되나요?
A: 보안상 위험하고, 데이터가 계속 변경되면 매번 AI를 다시 학습시켜야 해요. MCP는 실시간으로 안전하게 데이터를 제공합니다!

🌟 MCP의 강력한 장점: 한 번 만들면 어디서든 사용!

        🏢 우리가 만든 MCP 서버
                    │
    ┌───────────────┼───────────────┐
    │               │               │
    ▼               ▼               ▼
┌─────────┐   ┌─────────┐   ┌─────────┐
│Cursor AI│   │   n8n   │   │ Make.com│
│  코딩   │   │ 워크플로우│   │자동화툴 │
└─────────┘   └─────────┘   └─────────┘
    │               │               │
    ▼               ▼               ▼
"김개발 정보     "매일 오전      "Slack에
 알려줘"         직원 현황       급여 정보
                보고서 생성"     알림 전송"

🎯 실제 활용 시나리오

📝 시나리오 1: 개발자 (Cursor AI)

개발자: "김개발님이 담당한 프로젝트 진행률이 어떻게 되나요?"
AI: MCP 서버에서 데이터 조회 → "MCP-Integration 프로젝트 65% 완료"
개발자: "그럼 예상 완료일은?"
AI: "2025년 7월 15일 마감 예정입니다"

🔄 시나리오 2: 자동화 (n8n)

매일 오전 9시 자동 실행:
1. MCP 서버에서 모든 직원 정보 조회
2. 휴가 중인 직원 필터링
3. 관리자에게 이메일 발송
4. Slack 채널에 현황 업데이트

📊 시나리오 3: 노코드 자동화 (Make.com)

프로젝트 마감일 알림 시스템:
1. MCP 서버에서 프로젝트 상태 확인
2. 마감일 7일 전인 프로젝트 찾기
3. 담당자에게 자동 알림 전송
4. 진행률이 50% 미만이면 관리자에게 에스컬레이션

🔍 더 구체적인 질문과 답변

Q: MCP 서버 하나로 정말 여러 플랫폼에서 사용할 수 있나요?
A: 네! MCP는 표준 프로토콜이라서 한 번 만들면:

  • ✅ Cursor AI에서 코딩 도우미로
  • ✅ n8n에서 워크플로우 자동화로
  • ✅ Make.com에서 노코드 자동화로
  • ✅ 심지어 직접 만든 앱에서도 사용 가능!

Q: 보안은 어떻게 관리하나요?
A: MCP 서버에서 권한을 중앙 관리합니다:

// 예: 급여 정보는 HR 부서만 접근 가능
if (requestType === 'salary' && !user.hasRole('HR')) {
  throw new Error('권한이 없습니다');
}

Q: 실시간 데이터도 가능한가요?
A: 물론입니다!

// 실시간 시스템 모니터링
async getRealtimeSystemStatus() {
  return {
    cpu: getCurrentCPUUsage(),
    memory: getCurrentMemoryUsage(),
    timestamp: new Date().toISOString()
  };
}

🚀 MCP의 실제 비즈니스 가치

기존 방식 MCP 방식 개선 효과
매번 수동으로 데이터 확인 AI가 자동으로 조회 ⏰ 시간 90% 절약
각 툴마다 별도 연동 개발 한 번 개발로 모든 툴 연동 💰 개발비용 70% 절감
데이터 불일치 위험 단일 소스로 일관성 보장 🎯 정확도 99% 향상
보안 정책 분산 관리 중앙 집중식 보안 관리 🔒 보안 리스크 80% 감소

쉽게 말하면: AI가 "김개발 직원 정보 알려줘"라고 물어보면, MCP 서버가 회사 데이터베이스에서 정보를 찾아서 AI에게 전달해주는 중간 다리 역할을 합니다!


📁 프로젝트 구조 이해하기

enhanced-mcp-server/
├── 📄 package.json          # 프로젝트 설정 파일
├── 🔧 enhanced-server.js    # MCP 서버 메인 코드
├── 🎯 .cursor-mcp.json     # Cursor AI 연동 설정
├── 🧪 test-enhanced.js     # 테스트 파일
└── 📚 README.md            # 이 파일!

각 파일의 역할

파일 역할 신입사원이 알아야 할 점
package.json 프로젝트 정보와 의존성 관리 npm 패키지 관리의 기본
enhanced-server.js MCP 서버의 핵심 로직 가장 중요한 파일!
.cursor-mcp.json Cursor AI와의 연결 설정 AI가 우리 서버를 찾는 방법
test-enhanced.js 서버 테스트 코드 개발 후 검증하는 방법

⚙️ MCP 서버 동작 원리

1단계: 서버 초기화

// enhanced-server.js의 핵심 부분
class EnhancedMcpServer {
  constructor() {
    // 🗄️ 회사 데이터베이스 (AI가 모르는 정보!)
    this.companyDatabase = {
      employees: [
        { id: 'EMP001', name: '김개발', department: 'Engineering', salary: 8500 },
        // ... 더 많은 직원 정보
      ]
    };

    // 🔧 MCP 서버 생성
    this.server = new Server({
      name: 'enhanced-mcp-server',
      version: '2.0.0'
    });
  }
}

2단계: 도구(Tools) 등록

// AI가 사용할 수 있는 도구들을 정의
{
  name: 'query_employee_database',
  description: '🏢 회사 직원 데이터베이스에서 정보를 조회합니다',
  inputSchema: {
    type: 'object',
    properties: {
      query_type: { type: 'string', enum: ['all', 'by_department', 'by_name'] },
      filter: { type: 'string', description: '필터 값' }
    }
  }
}

3단계: 도구 실행 로직

// AI가 도구를 호출하면 실행되는 함수
async queryEmployeeDatabase(queryType, filter) {
  const employees = this.companyDatabase.employees;

  switch (queryType) {
    case 'by_name':
      return employees.filter(emp => emp.name.includes(filter));
    case 'by_department':
      return employees.filter(emp => emp.department === filter);
    default:
      return employees;
  }
}

🔍 소스코드 상세 분석

📄 package.json 분석

{
  "name": "enhanced-mcp-server",
  "version": "2.0.0",
  "type": "module",                    // ← ES6 모듈 사용
  "dependencies": {
    "@modelcontextprotocol/sdk": "^0.4.0"  // ← MCP 공식 SDK
  }
}

신입사원 포인트:

  • "type": "module": 최신 JavaScript 문법 사용
  • MCP SDK: OpenAI에서 만든 공식 라이브러리

🎯 .cursor-mcp.json 분석

{
  "mcpServers": {
    "enhanced-mcp-server": {
      "command": "node",
      "args": ["enhanced-server.js"],
      "cwd": "/Users/sangsoonhwang/Documents/GitHub/enhanced-mcp-server"
    }
  }
}

신입사원 포인트:

  • Cursor AI가 우리 서버를 찾는 GPS 같은 역할
  • command: 서버 실행 명령어
  • cwd: 서버가 있는 폴더 위치

🔧 enhanced-server.js 핵심 구조

1. 클래스 구조

class EnhancedMcpServer {
  constructor() {
    this.companyDatabase = { /* 데이터 */ };  // 📊 데이터 저장소
    this.server = new Server(/* 설정 */);     // 🔧 MCP 서버
    this.setupToolHandlers();                 // 🛠️ 도구 설정
  }
}

2. 도구 등록 과정

setupToolHandlers() {
  // 📋 사용 가능한 도구 목록 제공
  this.server.setRequestHandler(ListToolsRequestSchema, async () => {
    return {
      tools: [
        {
          name: 'query_employee_database',
          description: '직원 정보 조회',
          inputSchema: { /* 입력 형식 정의 */ }
        }
        // ... 더 많은 도구들
      ]
    };
  });

  // 🔧 도구 실행 처리
  this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
    const { name, arguments: args } = request.params;

    switch (name) {
      case 'query_employee_database':
        return await this.queryEmployeeDatabase(args.query_type, args.filter);
      // ... 다른 도구들
    }
  });
}

3. 실제 비즈니스 로직

async queryEmployeeDatabase(queryType, filter) {
  console.log(`🔍 직원 조회: ${queryType}, 필터: ${filter}`);

  const employees = this.companyDatabase.employees;
  let result;

  switch (queryType) {
    case 'by_name':
      result = employees.filter(emp => emp.name.includes(filter));
      break;
    case 'by_department':
      result = employees.filter(emp => emp.department === filter);
      break;
    case 'all':
    default:
      result = employees;
  }

  return {
    content: [{
      type: 'text',
      text: `📊 조회 결과: ${JSON.stringify(result, null, 2)}`
    }]
  };
}

🚀 실습: MCP 서버 실행하기

1단계: 의존성 설치

npm install

2단계: 서버 테스트

npm test

예상 출력:

🧪 간단한 MCP 테스트 시작...

📋 파일 확인:
✅ package.json - 존재함
✅ enhanced-server.js - 존재함
✅ .cursor-mcp.json - 존재함

🎉 기본 설정 확인 완료!

3단계: 서버 실행

npm start

4단계: 다양한 플랫폼에서 테스트

🎯 Cursor AI에서 테스트

  1. Cursor AI에서 이 프로젝트 폴더 열기
  2. MCP 서버 연결 허용
  3. 다음 질문들 시도해보기:
    • "우리 회사 Engineering 부서 직원들을 조회해줘"
    • "김개발 직원의 정보를 알려줘"
    • "ALPHA-7 코드를 해독해줘"

🔄 n8n에서 연동하기

{
  "nodes": [
    {
      "name": "MCP Server Call",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "url": "http://localhost:3000/mcp",
        "method": "POST",
        "body": {
          "tool": "query_employee_database",
          "args": {
            "query_type": "by_department",
            "filter": "Engineering"
          }
        }
      }
    }
  ]
}

n8n 워크플로우 예제:

  1. 스케줄러: 매일 오전 9시 실행
  2. MCP 호출: 직원 현황 조회
  3. 데이터 가공: 휴가자, 프로젝트별 분류
  4. 알림 발송: Slack/이메일로 보고서 전송

📊 Make.com에서 연동하기

// Make.com HTTP 모듈 설정
{
  "url": "http://localhost:3000/mcp",
  "method": "POST",
  "headers": {
    "Content-Type": "application/json"
  },
  "body": {
    "tool": "get_project_status",
    "args": {
      "project_name": "MCP-Integration"
    }
  }
}

Make.com 시나리오 예제:

  1. 트리거: Google Sheets 업데이트 감지
  2. MCP 조회: 해당 직원의 프로젝트 정보 확인
  3. 조건 분기: 진행률에 따른 다른 액션
  4. 액션: 자동 이메일 발송 또는 Slack 알림

🔌 직접 API 호출하기

# curl을 사용한 직접 호출
curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "tool": "query_employee_database",
    "args": {
      "query_type": "by_name",
      "filter": "김개발"
    }
  }'

🐍 Python에서 사용하기

import requests

def get_employee_info(name):
    response = requests.post('http://localhost:3000/mcp', json={
        'tool': 'query_employee_database',
        'args': {
            'query_type': 'by_name',
            'filter': name
        }
    })
    return response.json()

# 사용 예
employee = get_employee_info('김개발')
print(f"직원 정보: {employee}")

🛠️ 커스텀 도구 만들기

새로운 도구 추가하는 방법

1단계: 도구 정의 추가

// setupToolHandlers() 메서드의 tools 배열에 추가
{
  name: 'calculate_bonus',
  description: '직원 보너스 계산',
  inputSchema: {
    type: 'object',
    properties: {
      employee_id: { type: 'string', description: '직원 ID' },
      performance_score: { type: 'number', description: '성과 점수 (1-10)' }
    },
    required: ['employee_id', 'performance_score']
  }
}

2단계: 실행 로직 추가

// CallToolRequestSchema 핸들러의 switch문에 추가
case 'calculate_bonus':
  return await this.calculateBonus(args.employee_id, args.performance_score);

3단계: 메서드 구현

async calculateBonus(employeeId, performanceScore) {
  const employee = this.companyDatabase.employees.find(emp => emp.id === employeeId);

  if (!employee) {
    throw new McpError(ErrorCode.InvalidRequest, `직원 ${employeeId}를 찾을 수 없습니다`);
  }

  const baseBonus = employee.salary * 0.1; // 기본 보너스 10%
  const performanceMultiplier = performanceScore / 10;
  const finalBonus = baseBonus * performanceMultiplier;

  return {
    content: [{
      type: 'text',
      text: `💰 ${employee.name}님의 보너스: ${finalBonus.toLocaleString()}만원 (성과점수: ${performanceScore}/10)`
    }]
  };
}

🎯 신입사원을 위한 핵심 포인트

✅ 꼭 기억해야 할 것들

  1. MCP = AI와 데이터 사이의 다리
    • AI가 직접 접근할 수 없는 데이터를 안전하게 제공
  2. 도구(Tool) = AI가 사용할 수 있는 기능
    • 각 도구는 명확한 목적과 입력/출력 형식을 가짐
  3. 스키마(Schema) = 도구 사용법 설명서
    • AI가 도구를 올바르게 사용할 수 있도록 가이드
  4. 비동기 처리 (async/await)
    • 모든 도구 실행은 비동기로 처리됨

🚨 주의사항

  • 보안: 민감한 정보는 적절한 권한 검사 후 제공
  • 에러 처리: 예상치 못한 입력에 대한 적절한 에러 메시지
  • 성능: 대용량 데이터 처리 시 페이징 고려

🌐 다양한 플랫폼 연동 팁

Q: 어떤 플랫폼부터 시작하는 게 좋을까요?
A: 추천 순서:

  1. Cursor AI (가장 쉬움) → 개발하면서 바로 테스트
  2. n8n (중간 난이도) → 시각적 워크플로우로 자동화 구축
  3. Make.com (중간 난이도) → 노코드로 복잡한 시나리오 구현
  4. 직접 API 호출 (고급) → 커스텀 앱 개발

Q: 각 플랫폼의 장단점은?

플랫폼 장점 단점 추천 용도
Cursor AI 🟢 설정 간단, 즉시 사용 🔴 개발 환경에서만 사용 개발 중 데이터 조회
n8n 🟢 오픈소스, 시각적 편집 🔴 서버 설치 필요 내부 워크플로우 자동화
Make.com 🟢 클라우드, 다양한 연동 🔴 유료, 복잡한 설정 외부 서비스 연동
직접 API 🟢 완전한 제어, 커스터마이징 🔴 개발 지식 필요 전용 앱 개발

📈 다음 단계

  1. 더 복잡한 도구 만들기: 데이터베이스 연동, API 호출 등
  2. 보안 강화: 인증, 권한 관리 시스템 추가
  3. 모니터링: 로깅, 메트릭 수집 시스템 구축
  4. 다중 플랫폼 지원: REST API 엔드포인트 추가
  5. 실시간 알림: WebSocket 연동으로 실시간 데이터 푸시

🤝 도움이 필요하다면