나의 저장소 주소: https://github.com/onesound71/enhanced-mcp-server
📚 목차
🤔 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에서 테스트
- Cursor AI에서 이 프로젝트 폴더 열기
- MCP 서버 연결 허용
- 다음 질문들 시도해보기:
- "우리 회사 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 워크플로우 예제:
- 스케줄러: 매일 오전 9시 실행
- MCP 호출: 직원 현황 조회
- 데이터 가공: 휴가자, 프로젝트별 분류
- 알림 발송: 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 시나리오 예제:
- 트리거: Google Sheets 업데이트 감지
- MCP 조회: 해당 직원의 프로젝트 정보 확인
- 조건 분기: 진행률에 따른 다른 액션
- 액션: 자동 이메일 발송 또는 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)`
}]
};
}
🎯 신입사원을 위한 핵심 포인트
✅ 꼭 기억해야 할 것들
- MCP = AI와 데이터 사이의 다리
- AI가 직접 접근할 수 없는 데이터를 안전하게 제공
- 도구(Tool) = AI가 사용할 수 있는 기능
- 각 도구는 명확한 목적과 입력/출력 형식을 가짐
- 스키마(Schema) = 도구 사용법 설명서
- AI가 도구를 올바르게 사용할 수 있도록 가이드
- 비동기 처리 (async/await)
- 모든 도구 실행은 비동기로 처리됨
🚨 주의사항
- 보안: 민감한 정보는 적절한 권한 검사 후 제공
- 에러 처리: 예상치 못한 입력에 대한 적절한 에러 메시지
- 성능: 대용량 데이터 처리 시 페이징 고려
🌐 다양한 플랫폼 연동 팁
Q: 어떤 플랫폼부터 시작하는 게 좋을까요?
A: 추천 순서:
- Cursor AI (가장 쉬움) → 개발하면서 바로 테스트
- n8n (중간 난이도) → 시각적 워크플로우로 자동화 구축
- Make.com (중간 난이도) → 노코드로 복잡한 시나리오 구현
- 직접 API 호출 (고급) → 커스텀 앱 개발
Q: 각 플랫폼의 장단점은?
플랫폼 | 장점 | 단점 | 추천 용도 |
---|---|---|---|
Cursor AI | 🟢 설정 간단, 즉시 사용 | 🔴 개발 환경에서만 사용 | 개발 중 데이터 조회 |
n8n | 🟢 오픈소스, 시각적 편집 | 🔴 서버 설치 필요 | 내부 워크플로우 자동화 |
Make.com | 🟢 클라우드, 다양한 연동 | 🔴 유료, 복잡한 설정 | 외부 서비스 연동 |
직접 API | 🟢 완전한 제어, 커스터마이징 | 🔴 개발 지식 필요 | 전용 앱 개발 |
📈 다음 단계
- 더 복잡한 도구 만들기: 데이터베이스 연동, API 호출 등
- 보안 강화: 인증, 권한 관리 시스템 추가
- 모니터링: 로깅, 메트릭 수집 시스템 구축
- 다중 플랫폼 지원: REST API 엔드포인트 추가
- 실시간 알림: WebSocket 연동으로 실시간 데이터 푸시
🤝 도움이 필요하다면
- MCP 공식 문서: https://modelcontextprotocol.io/
- GitHub Issues: 프로젝트 이슈 등록
- 팀 멘토: 궁금한 점은 언제든 질문하세요!
'나의 IT 기억' 카테고리의 다른 글
🎯 스타트업이 놓치기 쉬운 DB 리플리케이션 - 사용자 급증에 대비하라 (1) | 2025.05.28 |
---|---|
🤷♂️ 신입 개발자들이 가장 궁금해하는 질문들 - 현직 개발자의 솔직한 답변 (0) | 2025.05.27 |
SaaS 개발하면서 **멀티테넌시** 구성이 생각보다 복잡하더라고.. (1) | 2025.05.25 |
동료에게 배운 새로운 기술: NGINX 트래픽 미러링으로 안전한 마이그레이션 하기 (1) | 2025.05.24 |
MySQL에서 PostgreSQL로의 실시간 데이터 동기화 시스템 구축기 (1) | 2025.05.24 |