content-genie-mcp 2.0.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -5,11 +5,11 @@ import { z } from "zod";
5
5
  import axios from "axios";
6
6
  import * as cheerio from "cheerio";
7
7
  // =============================================================================
8
- // Content Genie MCP v2.0 - 한국 콘텐츠 크리에이터를 위한 AI 어시스턴트 (고도화 버전)
8
+ // Content Genie MCP v2.5 - 한국 콘텐츠 크리에이터를 위한 AI 어시스턴트 (프로 버전)
9
9
  // =============================================================================
10
10
  const server = new McpServer({
11
11
  name: "content-genie-mcp",
12
- version: "2.0.0",
12
+ version: "2.5.0",
13
13
  });
14
14
  // =============================================================================
15
15
  // 공통 스키마
@@ -19,56 +19,126 @@ const TrendCategorySchema = z.enum(["general", "news", "shopping", "entertainmen
19
19
  const ContentTypeSchema = z.enum(["blog", "youtube", "instagram", "tiktok", "newsletter", "threads", "twitter", "all"]);
20
20
  const ToneSchema = z.enum(["professional", "casual", "humorous", "educational", "inspirational", "provocative", "storytelling"]);
21
21
  // =============================================================================
22
- // 한국 기념일/이벤트 대형 DB (2025-2026)
22
+ // 한국 기념일/이벤트 메가 DB (2025-2026) - 100개 이상
23
23
  // =============================================================================
24
24
  const KOREAN_EVENTS_DB = [
25
- // 공휴일
26
- { date: "01-01", name: "새해", type: "holiday", contentIdeas: ["신년 계획", "새해 다짐", "2025 트렌드"] },
27
- { date: "01-28", name: "설날 연휴", type: "holiday", contentIdeas: ["설날 음식", "세뱃돈", "귀성길 "] },
28
- { date: "01-29", name: "설날", type: "holiday", contentIdeas: ["설날 인사말", "전통 놀이", "가족 모임"] },
29
- { date: "03-01", name: "삼일절", type: "holiday", contentIdeas: ["독립운동", "역사 콘텐츠"] },
30
- { date: "05-05", name: "어린이날", type: "holiday", contentIdeas: ["선물 추천", "가족 나들이", "키즈 콘텐츠"] },
31
- { date: "05-06", name: "대체공휴일", type: "holiday", contentIdeas: ["황금연휴", "여행지 추천"] },
32
- { date: "05-15", name: "부처님오신날", type: "holiday", contentIdeas: ["사찰 여행", "템플스테이"] },
33
- { date: "06-06", name: "현충일", type: "holiday", contentIdeas: ["호국 영웅", "추모 콘텐츠"] },
34
- { date: "08-15", name: "광복절", type: "holiday", contentIdeas: ["독립 역사", "애국 콘텐츠"] },
35
- { date: "10-03", name: "개천절", type: "holiday", contentIdeas: ["단군 신화", "한국 역사"] },
36
- { date: "10-05", name: "추석 연휴", type: "holiday", contentIdeas: ["추석 음식", "송편 만들기", "한복"] },
37
- { date: "10-06", name: "추석", type: "holiday", contentIdeas: ["가족 모임", "성묘", "보름달"] },
38
- { date: "10-09", name: "한글날", type: "holiday", contentIdeas: ["한글 사랑", "국어 콘텐츠"] },
39
- { date: "12-25", name: "크리스마스", type: "holiday", contentIdeas: ["크리스마스 선물", "연말 분위기", "캐롤"] },
40
- // 상업 이벤트
41
- { date: "02-14", name: "발렌타인데이", type: "commercial", contentIdeas: ["초콜릿 추천", "커플 데이트", "고백 "] },
42
- { date: "03-14", name: "화이트데이", type: "commercial", contentIdeas: ["사탕 선물", "답례 아이디어"] },
43
- { date: "04-14", name: "블랙데이", type: "commercial", contentIdeas: ["자장면", "솔로 위로"] },
44
- { date: "05-08", name: "어버이날", type: "commercial", contentIdeas: ["부모님 선물", "효도 여행", "카네이션"] },
45
- { date: "05-14", name: "로즈데이", type: "commercial", contentIdeas: ["장미 선물", "데이트 코스"] },
46
- { date: "05-15", name: "스승의날", type: "event", contentIdeas: ["감사 편지", "선생님 선물"] },
47
- { date: "05-21", name: "부부의날", type: "commercial", contentIdeas: ["부부 여행", "결혼 기념"] },
48
- { date: "06-14", name: "키스데이", type: "commercial", contentIdeas: ["커플 콘텐츠"] },
49
- { date: "07-14", name: "실버데이", type: "commercial", contentIdeas: ["어른 선물", "효도 콘텐츠"] },
50
- { date: "08-14", name: "그린데이", type: "commercial", contentIdeas: ["야외 데이트", "소풍"] },
51
- { date: "09-14", name: "포토데이", type: "commercial", contentIdeas: ["커플 사진", "포토존"] },
52
- { date: "10-14", name: "와인데이", type: "commercial", contentIdeas: ["와인 추천", "분위기 있는 데이트"] },
53
- { date: "11-11", name: "빼빼로데이", type: "commercial", contentIdeas: ["빼빼로 만들기", "선물 포장", "DIY"] },
54
- { date: "11-14", name: "무비데이", type: "commercial", contentIdeas: ["영화 추천", "영화관 데이트"] },
55
- { date: "12-14", name: "허그데이", type: "commercial", contentIdeas: ["겨울 데이트", "따뜻한 콘텐츠"] },
56
- // 시즌 이벤트
57
- { date: "01-15", name: "정월대보름", type: "traditional", contentIdeas: ["오곡밥", "부럼 깨기", "달맞이"] },
58
- { date: "04-05", name: "식목일", type: "event", contentIdeas: ["나무 심기", "환경 콘텐츠"] },
59
- { date: "07-17", name: "제헌절", type: "event", contentIdeas: ["헌법 이야기", "민주주의"] },
60
- { date: "10-31", name: "할로윈", type: "commercial", contentIdeas: ["코스튬", "할로윈 파티", "공포 콘텐츠"] },
61
- { date: "11-28", name: "블랙프라이데이", type: "commercial", contentIdeas: ["할인 정보", "쇼핑 리스트", "구매 가이드"] },
62
- { date: "12-31", name: "연말", type: "event", contentIdeas: ["연말 정산", "올해의 회고", "새해 계획"] },
63
- // 시험/입시
64
- { date: "03-02", name: "개학", type: "event", contentIdeas: ["새학기 준비", "학용품", "학교생활"] },
65
- { date: "06-01", name: "수능 D-180", type: "event", contentIdeas: ["수험생 응원", "공부 "] },
66
- { date: "11-14", name: "수능", type: "event", contentIdeas: ["수능 응원", "수능 후 계획", "대입 전략"] },
67
- // 쇼핑 시즌
68
- { date: "01-02", name: "신년 세일 시즌", type: "shopping", contentIdeas: ["할인 정보", "신년 쇼핑"] },
69
- { date: "06-01", name: "여름 세일 시작", type: "shopping", contentIdeas: ["여름 패션", "에어컨", "휴가 준비"] },
70
- { date: "09-01", name: "가을 신상", type: "shopping", contentIdeas: ["가을 패션", "트렌치코트", "니트"] },
71
- { date: "12-01", name: "연말 세일 시즌", type: "shopping", contentIdeas: ["선물 추천", "연말 쇼핑"] },
25
+ // ===== 공휴일 (14개) =====
26
+ { date: "01-01", name: "새해", type: "holiday", contentIdeas: ["신년 계획", "새해 다짐", "2025 트렌드"], priority: "high" },
27
+ { date: "01-27", name: "설날 연휴 시작", type: "holiday", contentIdeas: ["귀성길 ", "고속도로 정보"], priority: "high" },
28
+ { date: "01-28", name: "설날 연휴", type: "holiday", contentIdeas: ["설날 음식", "세뱃돈", "귀성길 "], priority: "high" },
29
+ { date: "01-29", name: "설날", type: "holiday", contentIdeas: ["설날 인사말", "전통 놀이", "가족 모임"], priority: "high" },
30
+ { date: "01-30", name: "설날 연휴 마지막", type: "holiday", contentIdeas: ["유턴 정보", " 연휴 마무리"], priority: "medium" },
31
+ { date: "03-01", name: "삼일절", type: "holiday", contentIdeas: ["독립운동", "역사 콘텐츠", "태극기 게양"], priority: "medium" },
32
+ { date: "05-05", name: "어린이날", type: "holiday", contentIdeas: ["선물 추천", "가족 나들이", "키즈 콘텐츠"], priority: "high" },
33
+ { date: "05-06", name: "대체공휴일", type: "holiday", contentIdeas: ["황금연휴", "여행지 추천"], priority: "medium" },
34
+ { date: "05-15", name: "부처님오신날", type: "holiday", contentIdeas: ["사찰 여행", "템플스테이", "연등 축제"], priority: "medium" },
35
+ { date: "06-06", name: "현충일", type: "holiday", contentIdeas: ["호국 영웅", "추모 콘텐츠", "국립묘지"], priority: "medium" },
36
+ { date: "08-15", name: "광복절", type: "holiday", contentIdeas: ["독립 역사", "애국 콘텐츠", "광복절 행사"], priority: "medium" },
37
+ { date: "10-03", name: "개천절", type: "holiday", contentIdeas: ["단군 신화", "한국 역사", "건국이념"], priority: "medium" },
38
+ { date: "10-05", name: "추석 연휴 시작", type: "holiday", contentIdeas: ["추석 준비", "귀성 정보"], priority: "high" },
39
+ { date: "10-06", name: "추석", type: "holiday", contentIdeas: ["가족 모임", "성묘", "보름달", "송편"], priority: "high" },
40
+ { date: "10-07", name: "추석 연휴", type: "holiday", contentIdeas: ["추석 음식", "한복", "전통놀이"], priority: "high" },
41
+ { date: "10-08", name: "추석 연휴 마지막", type: "holiday", contentIdeas: ["유턴 정보", "연휴 마무리"], priority: "medium" },
42
+ { date: "10-09", name: "한글날", type: "holiday", contentIdeas: ["한글 사랑", "세종대왕", "국어 콘텐츠"], priority: "medium" },
43
+ { date: "12-25", name: "크리스마스", type: "holiday", contentIdeas: ["크리스마스 선물", "연말 분위기", "캐롤", "트리"], priority: "high" },
44
+ // ===== 데이 시리즈 (14일 데이) (12개) =====
45
+ { date: "01-14", name: "다이어리데이", type: "commercial", contentIdeas: ["다이어리 추천", "플래너 꾸미기", "신년 계획"], priority: "low" },
46
+ { date: "02-14", name: "발렌타인데이", type: "commercial", contentIdeas: ["초콜릿 추천", "커플 데이트", "고백 팁", "DIY 초콜릿"], priority: "high" },
47
+ { date: "03-14", name: "화이트데이", type: "commercial", contentIdeas: ["사탕 선물", "답례 아이디어", "데이트 코스"], priority: "high" },
48
+ { date: "04-14", name: "블랙데이", type: "commercial", contentIdeas: ["자장면", "솔로 위로", "혼밥 맛집"], priority: "medium" },
49
+ { date: "05-14", name: "로즈데이", type: "commercial", contentIdeas: ["장미 선물", "데이트 코스", "꽃 카페"], priority: "medium" },
50
+ { date: "06-14", name: "키스데이", type: "commercial", contentIdeas: ["커플 콘텐츠", "연애 팁"], priority: "low" },
51
+ { date: "07-14", name: "실버데이", type: "commercial", contentIdeas: ["어른 선물", "효도 콘텐츠", "부모님 소개"], priority: "low" },
52
+ { date: "08-14", name: "그린데이", type: "commercial", contentIdeas: ["야외 데이트", "소풍", "숲 캠핑"], priority: "low" },
53
+ { date: "09-14", name: "포토데이", type: "commercial", contentIdeas: ["커플 사진", "포토존", "인생샷 명소"], priority: "medium" },
54
+ { date: "10-14", name: "와인데이", type: "commercial", contentIdeas: ["와인 추천", "분위기 있는 데이트", "와인바"], priority: "medium" },
55
+ { date: "11-14", name: "무비데이", type: "commercial", contentIdeas: ["영화 추천", "영화관 데이트", "넷플릭스"], priority: "medium" },
56
+ { date: "12-14", name: "허그데이", type: "commercial", contentIdeas: ["겨울 데이트", "따뜻한 콘텐츠"], priority: "low" },
57
+ // ===== 가정/효도 관련 (8개) =====
58
+ { date: "05-08", name: "어버이날", type: "commercial", contentIdeas: ["부모님 선물", "효도 여행", "카네이션", "감사 편지"], priority: "high" },
59
+ { date: "05-15", name: "스승의날", type: "event", contentIdeas: ["감사 편지", "선생님 선물", "은사 감사"], priority: "medium" },
60
+ { date: "05-21", name: "부부의날", type: "commercial", contentIdeas: ["부부 여행", "결혼 기념", "데이트"], priority: "medium" },
61
+ { date: "07-07", name: "칠석", type: "traditional", contentIdeas: ["견우직녀", "전통 이야기", " 보기"], priority: "low" },
62
+ { date: "10-02", name: "노인의날", type: "event", contentIdeas: ["효도 콘텐츠", "어르신 선물", "경로당 봉사"], priority: "low" },
63
+ { date: "11-22", name: "좋은 부부의 날", type: "commercial", contentIdeas: ["부부 선물", "결혼 기념일"], priority: "low" },
64
+ { date: "05-02", name: "근로자의 날", type: "event", contentIdeas: ["직장인 위로", "워라밸", "번아웃"], priority: "medium" },
65
+ { date: "08-08", name: "효도의 ", type: "event", contentIdeas: ["부모님 감사", "효도 선물"], priority: "low" },
66
+ // ===== 전통 절기/명절 (15개) =====
67
+ { date: "01-15", name: "정월대보름", type: "traditional", contentIdeas: ["오곡밥", "부럼 깨기", "달맞이", "쥐불놀이"], priority: "medium" },
68
+ { date: "02-04", name: "입춘", type: "traditional", contentIdeas: [" 시작", "입춘대길", "새해 다짐"], priority: "low" },
69
+ { date: "03-05", name: "경칩", type: "traditional", contentIdeas: [" 날씨", "개구리", "봄맞이"], priority: "low" },
70
+ { date: "04-05", name: "식목일", type: "event", contentIdeas: ["나무 심기", "환경 콘텐츠", "에코라이프"], priority: "medium" },
71
+ { date: "04-20", name: "곡우", type: "traditional", contentIdeas: ["봄비", "농사 시작", " 마시기"], priority: "low" },
72
+ { date: "05-05", name: "단오", type: "traditional", contentIdeas: ["창포물 머리감기", "그네뛰기", "씨름"], priority: "low" },
73
+ { date: "06-21", name: "하지", type: "traditional", contentIdeas: ["여름 시작", "가장 긴 낮", "더위 준비"], priority: "low" },
74
+ { date: "07-18", name: "초복", type: "traditional", contentIdeas: ["삼계탕", "보양식", "더위 극복"], priority: "medium" },
75
+ { date: "07-28", name: "중복", type: "traditional", contentIdeas: ["삼계탕", "보양식", "여름 건강"], priority: "medium" },
76
+ { date: "08-07", name: "말복", type: "traditional", contentIdeas: ["삼계탕", "여름 마무리", "가을 준비"], priority: "medium" },
77
+ { date: "08-23", name: "처서", type: "traditional", contentIdeas: ["더위 끝", "가을 시작", "환절기"], priority: "low" },
78
+ { date: "09-23", name: "추분", type: "traditional", contentIdeas: ["밤낮 같음", "가을 본격", "단풍"], priority: "low" },
79
+ { date: "11-07", name: "입동", type: "traditional", contentIdeas: ["겨울 시작", "김장철", "월동 준비"], priority: "medium" },
80
+ { date: "12-21", name: "동지", type: "traditional", contentIdeas: ["팥죽", "가장 긴 밤", "동지팥죽"], priority: "medium" },
81
+ { date: "07-17", name: "제헌절", type: "event", contentIdeas: ["헌법 이야기", "민주주의", "법치주의"], priority: "low" },
82
+ // ===== 글로벌/상업 이벤트 (15개) =====
83
+ { date: "10-31", name: "할로윈", type: "commercial", contentIdeas: ["코스튬", "할로윈 파티", "공포 콘텐츠", "할로윈 메이크업"], priority: "high" },
84
+ { date: "11-11", name: "빼빼로데이", type: "commercial", contentIdeas: ["빼빼로 만들기", "선물 포장", "DIY", "꾸미기"], priority: "high" },
85
+ { date: "11-29", name: "블랙프라이데이", type: "commercial", contentIdeas: ["할인 정보", "쇼핑 리스트", "구매 가이드", "직구"], priority: "high" },
86
+ { date: "12-02", name: "사이버먼데이", type: "commercial", contentIdeas: ["온라인 할인", "전자제품", "쇼핑 팁"], priority: "medium" },
87
+ { date: "12-26", name: "박싱데이", type: "commercial", contentIdeas: ["연말 세일", "크리스마스 후 쇼핑"], priority: "low" },
88
+ { date: "04-01", name: "만우절", type: "event", contentIdeas: ["장난 아이디어", "몰래카메라", "유머"], priority: "medium" },
89
+ { date: "04-22", name: "지구의날", type: "event", contentIdeas: ["환경보호", "에코라이프", "제로웨이스트"], priority: "medium" },
90
+ { date: "03-08", name: "세계 여성의 날", type: "event", contentIdeas: ["여성 리더", "젠더 평등", "워킹맘"], priority: "medium" },
91
+ { date: "03-22", name: "세계 물의 날", type: "event", contentIdeas: ["물 절약", "환경"], priority: "low" },
92
+ { date: "06-05", name: "세계 환경의 날", type: "event", contentIdeas: ["환경보호", "플라스틱 줄이기"], priority: "medium" },
93
+ { date: "09-21", name: "세계 평화의 날", type: "event", contentIdeas: ["평화", "힐링"], priority: "low" },
94
+ { date: "10-10", name: "세계 정신건강의 날", type: "event", contentIdeas: ["멘탈케어", "스트레스 관리", "마음 건강"], priority: "medium" },
95
+ { date: "11-19", name: "세계 남성의 날", type: "event", contentIdeas: ["남성 건강", "아버지"], priority: "low" },
96
+ { date: "12-01", name: "세계 에이즈의 날", type: "event", contentIdeas: ["건강 정보", "예방"], priority: "low" },
97
+ { date: "02-04", name: "세계 암의 날", type: "event", contentIdeas: ["암 예방", "건강 검진"], priority: "low" },
98
+ // ===== 학교/입시 관련 (10개) =====
99
+ { date: "03-02", name: "개학", type: "event", contentIdeas: ["새학기 준비", "학용품", "학교생활"], priority: "medium" },
100
+ { date: "06-01", name: "수능 D-180", type: "event", contentIdeas: ["수험생 응원", "공부 팁", "학습 전략"], priority: "low" },
101
+ { date: "09-01", name: "수능 D-100", type: "event", contentIdeas: ["수험생 응원", "집중 공부법"], priority: "medium" },
102
+ { date: "11-14", name: "수능", type: "event", contentIdeas: ["수능 응원", "수능 후 계획", "대입 전략"], priority: "high" },
103
+ { date: "12-15", name: "대학 원서 마감", type: "event", contentIdeas: ["대입 정보", "자소서 팁"], priority: "medium" },
104
+ { date: "02-01", name: "졸업시즌", type: "event", contentIdeas: ["졸업 선물", "졸업 사진", "졸업 축하"], priority: "medium" },
105
+ { date: "03-01", name: "입학시즌", type: "event", contentIdeas: ["입학 선물", "학교 준비", "신입생 팁"], priority: "medium" },
106
+ { date: "07-20", name: "여름방학 시작", type: "event", contentIdeas: ["방학 계획", "여름 캠프", "체험학습"], priority: "medium" },
107
+ { date: "08-20", name: "개학 준비", type: "event", contentIdeas: ["2학기 준비", "학용품 쇼핑"], priority: "low" },
108
+ { date: "12-20", name: "겨울방학 시작", type: "event", contentIdeas: ["겨울 방학", "스키", "해외여행"], priority: "medium" },
109
+ // ===== 쇼핑 시즌 (10개) =====
110
+ { date: "01-02", name: "신년 세일 시즌", type: "shopping", contentIdeas: ["할인 정보", "신년 쇼핑", "가전 세일"], priority: "high" },
111
+ { date: "04-01", name: "봄 세일 시작", type: "shopping", contentIdeas: ["봄 패션", "아우터", "봄 신상"], priority: "medium" },
112
+ { date: "06-01", name: "여름 세일 시작", type: "shopping", contentIdeas: ["여름 패션", "에어컨", "휴가 준비"], priority: "high" },
113
+ { date: "07-15", name: "여름 중간 세일", type: "shopping", contentIdeas: ["여름 할인", "시즌오프"], priority: "medium" },
114
+ { date: "09-01", name: "가을 신상", type: "shopping", contentIdeas: ["가을 패션", "트렌치코트", "니트"], priority: "high" },
115
+ { date: "10-15", name: "가을 세일", type: "shopping", contentIdeas: ["가을 할인", "겨울 준비"], priority: "medium" },
116
+ { date: "11-01", name: "프리블랙프라이데이", type: "shopping", contentIdeas: ["얼리버드 할인", "쇼핑 준비"], priority: "medium" },
117
+ { date: "12-01", name: "연말 세일 시즌", type: "shopping", contentIdeas: ["선물 추천", "연말 쇼핑", "크리스마스"], priority: "high" },
118
+ { date: "12-26", name: "연말 정리 세일", type: "shopping", contentIdeas: ["재고 정리", "추가 할인"], priority: "medium" },
119
+ { date: "08-15", name: "가전 할인대전", type: "shopping", contentIdeas: ["가전제품", "에어컨", "냉장고"], priority: "medium" },
120
+ // ===== 시즌/날씨 관련 (12개) =====
121
+ { date: "12-31", name: "연말", type: "event", contentIdeas: ["연말 정산", "올해의 회고", "새해 계획", "카운트다운"], priority: "high" },
122
+ { date: "03-20", name: "봄 시작", type: "event", contentIdeas: ["봄맞이", "봄 패션", "봄 나들이"], priority: "medium" },
123
+ { date: "04-10", name: "벚꽃 시즌", type: "event", contentIdeas: ["벚꽃 명소", "벚꽃 사진", "봄 피크닉"], priority: "high" },
124
+ { date: "05-01", name: "가정의 달 시작", type: "event", contentIdeas: ["가족 이벤트", "효도", "어린이날 준비"], priority: "medium" },
125
+ { date: "07-01", name: "여름휴가 시즌", type: "event", contentIdeas: ["휴가지 추천", "바캉스", "물놀이"], priority: "high" },
126
+ { date: "08-01", name: "휴가 피크 시즌", type: "event", contentIdeas: ["피서지", "워터파크", "해외여행"], priority: "high" },
127
+ { date: "10-20", name: "단풍 시즌", type: "event", contentIdeas: ["단풍 명소", "가을 산행", "드라이브"], priority: "medium" },
128
+ { date: "11-15", name: "김장철", type: "event", contentIdeas: ["김장 레시피", "김치 담그기", "김장 재료"], priority: "medium" },
129
+ { date: "12-15", name: "연말 파티 시즌", type: "event", contentIdeas: ["송년회", "연말 파티", "홈파티"], priority: "medium" },
130
+ { date: "06-15", name: "장마 시작", type: "event", contentIdeas: ["장마 대비", "우산", "레인부츠"], priority: "medium" },
131
+ { date: "01-10", name: "한파 시즌", type: "event", contentIdeas: ["한파 대비", "방한용품", "겨울철 건강"], priority: "medium" },
132
+ { date: "07-25", name: "폭염 시즌", type: "event", contentIdeas: ["폭염 대비", "에어컨", "열사병 예방"], priority: "medium" },
133
+ // ===== 콘텐츠 크리에이터 특화 (8개) =====
134
+ { date: "01-10", name: "연간 콘텐츠 기획", type: "event", contentIdeas: ["연간 계획", "콘텐츠 전략", "채널 목표"], priority: "medium" },
135
+ { date: "04-15", name: "유튜브 알고리즘 시즌", type: "event", contentIdeas: ["알고리즘 팁", "조회수 올리기"], priority: "low" },
136
+ { date: "06-20", name: "여름 콘텐츠 기획", type: "event", contentIdeas: ["여름 브이로그", "휴가 콘텐츠"], priority: "medium" },
137
+ { date: "09-15", name: "가을 콘텐츠 시즌", type: "event", contentIdeas: ["가을 감성", "ASMR", "독서"], priority: "medium" },
138
+ { date: "11-25", name: "연말 콘텐츠 준비", type: "event", contentIdeas: ["연말 기획", "베스트 영상", "회고"], priority: "medium" },
139
+ { date: "03-15", name: "봄 브랜드 콜라보 시즌", type: "event", contentIdeas: ["브랜드 협업", "PPL", "협찬"], priority: "low" },
140
+ { date: "10-01", name: "구독자 이벤트 시즌", type: "event", contentIdeas: ["구독자 감사", "이벤트", "선물"], priority: "low" },
141
+ { date: "12-10", name: "연말결산 콘텐츠", type: "event", contentIdeas: ["올해의 정리", "베스트 모음", "연말 특집"], priority: "medium" },
72
142
  ];
73
143
  // =============================================================================
74
144
  // Tool 1: 실시간 한국 트렌드 분석 (get_korean_trends) - 고도화
@@ -1600,11 +1670,635 @@ function getMonthlyFocus() {
1600
1670
  return focuses[month] || focuses[1];
1601
1671
  }
1602
1672
  // =============================================================================
1673
+ // Tool 13: 썸네일 분석 (analyze_thumbnail) - v2.5 신규
1674
+ // =============================================================================
1675
+ server.tool("analyze_thumbnail", "YouTube/Instagram 썸네일 컨셉을 분석하고 개선점을 제안합니다. 클릭률 최적화 가이드를 제공합니다.", {
1676
+ title: z.string().describe("콘텐츠 제목"),
1677
+ thumbnail_description: z.string().describe("썸네일 설명 (예: 놀란 표정의 사람, 음식 클로즈업)"),
1678
+ platform: z.enum(["youtube", "instagram", "tiktok", "blog"]).describe("플랫폼"),
1679
+ content_category: z.string().optional().describe("콘텐츠 카테고리 (예: 먹방, 뷰티, 테크)"),
1680
+ }, async ({ title, thumbnail_description, platform, content_category = "일반" }) => {
1681
+ try {
1682
+ const analysis = analyzeThumbnailConcept(title, thumbnail_description, platform, content_category);
1683
+ return {
1684
+ content: [{ type: "text", text: JSON.stringify(analysis, null, 2) }],
1685
+ };
1686
+ }
1687
+ catch (error) {
1688
+ return {
1689
+ content: [{ type: "text", text: `썸네일 분석 중 오류 발생: ${error}` }],
1690
+ isError: true,
1691
+ };
1692
+ }
1693
+ });
1694
+ // =============================================================================
1695
+ // Tool 14: 스크립트/대본 아웃라인 생성 (generate_script_outline) - v2.5 신규
1696
+ // =============================================================================
1697
+ server.tool("generate_script_outline", "유튜브, 팟캐스트, 릴스용 스크립트 아웃라인을 자동 생성합니다.", {
1698
+ topic: z.string().describe("콘텐츠 주제"),
1699
+ format: z.enum(["youtube_long", "youtube_short", "podcast", "reels", "tiktok", "live"]).describe("콘텐츠 형식"),
1700
+ duration: z.string().optional().describe("예상 길이 (예: 10분, 30초)"),
1701
+ style: z.enum(["educational", "entertainment", "storytelling", "review", "tutorial", "interview", "vlog"]).optional().describe("스타일"),
1702
+ include_hooks: z.boolean().optional().describe("오프닝 훅 포함. 기본값: true"),
1703
+ }, async ({ topic, format, duration, style = "educational", include_hooks = true }) => {
1704
+ try {
1705
+ const outline = generateScriptOutline(topic, format, duration, style, include_hooks);
1706
+ return {
1707
+ content: [{ type: "text", text: JSON.stringify(outline, null, 2) }],
1708
+ };
1709
+ }
1710
+ catch (error) {
1711
+ return {
1712
+ content: [{ type: "text", text: `스크립트 생성 중 오류 발생: ${error}` }],
1713
+ isError: true,
1714
+ };
1715
+ }
1716
+ });
1717
+ // =============================================================================
1718
+ // Tool 15: 콘텐츠 리퍼포징 (repurpose_content) - v2.5 신규
1719
+ // =============================================================================
1720
+ server.tool("repurpose_content", "하나의 콘텐츠를 여러 플랫폼용으로 변환하는 전략을 제안합니다.", {
1721
+ original_content: z.string().describe("원본 콘텐츠 (제목 또는 설명)"),
1722
+ source_platform: z.enum(["youtube", "blog", "podcast", "instagram", "newsletter"]).describe("원본 플랫폼"),
1723
+ target_platforms: z.array(z.enum(["youtube", "youtube_shorts", "instagram_post", "instagram_reels", "tiktok", "blog", "newsletter", "twitter", "threads", "linkedin"])).describe("변환할 플랫폼 목록"),
1724
+ }, async ({ original_content, source_platform, target_platforms }) => {
1725
+ try {
1726
+ const repurposed = repurposeContent(original_content, source_platform, target_platforms);
1727
+ return {
1728
+ content: [{ type: "text", text: JSON.stringify(repurposed, null, 2) }],
1729
+ };
1730
+ }
1731
+ catch (error) {
1732
+ return {
1733
+ content: [{ type: "text", text: `리퍼포징 전략 생성 중 오류 발생: ${error}` }],
1734
+ isError: true,
1735
+ };
1736
+ }
1737
+ });
1738
+ // =============================================================================
1739
+ // Tool 16: 인플루언서 콜라보 분석 (analyze_influencer_collab) - v2.5 신규
1740
+ // =============================================================================
1741
+ server.tool("analyze_influencer_collab", "인플루언서 협업 전략 및 적합도를 분석합니다. 브랜드-인플루언서 매칭 가이드를 제공합니다.", {
1742
+ brand_category: z.string().describe("브랜드/제품 카테고리"),
1743
+ target_audience: z.string().describe("타겟 오디언스"),
1744
+ budget_range: z.enum(["low", "medium", "high", "premium"]).optional().describe("예산 범위"),
1745
+ campaign_goal: z.enum(["awareness", "engagement", "conversion", "content"]).optional().describe("캠페인 목표"),
1746
+ }, async ({ brand_category, target_audience, budget_range = "medium", campaign_goal = "engagement" }) => {
1747
+ try {
1748
+ const analysis = analyzeInfluencerCollab(brand_category, target_audience, budget_range, campaign_goal);
1749
+ return {
1750
+ content: [{ type: "text", text: JSON.stringify(analysis, null, 2) }],
1751
+ };
1752
+ }
1753
+ catch (error) {
1754
+ return {
1755
+ content: [{ type: "text", text: `인플루언서 분석 중 오류 발생: ${error}` }],
1756
+ isError: true,
1757
+ };
1758
+ }
1759
+ });
1760
+ // =============================================================================
1761
+ // Tool 17: 콘텐츠 성과 예측 (predict_content_performance) - v2.5 신규
1762
+ // =============================================================================
1763
+ server.tool("predict_content_performance", "콘텐츠의 예상 성과를 AI 기반으로 예측합니다. 조회수, 참여율, 공유 가능성을 분석합니다.", {
1764
+ title: z.string().describe("콘텐츠 제목"),
1765
+ description: z.string().optional().describe("콘텐츠 설명"),
1766
+ platform: ContentTypeSchema.describe("플랫폼"),
1767
+ category: z.string().optional().describe("카테고리"),
1768
+ posting_time: z.string().optional().describe("게시 예정 시간 (예: 평일 저녁 7시)"),
1769
+ has_trending_topic: z.boolean().optional().describe("트렌딩 주제 포함 여부"),
1770
+ }, async ({ title, description = "", platform, category = "일반", posting_time, has_trending_topic = false }) => {
1771
+ try {
1772
+ const prediction = predictContentPerformance(title, description, platform, category, posting_time, has_trending_topic);
1773
+ return {
1774
+ content: [{ type: "text", text: JSON.stringify(prediction, null, 2) }],
1775
+ };
1776
+ }
1777
+ catch (error) {
1778
+ return {
1779
+ content: [{ type: "text", text: `성과 예측 중 오류 발생: ${error}` }],
1780
+ isError: true,
1781
+ };
1782
+ }
1783
+ });
1784
+ // =============================================================================
1785
+ // v2.5 신규 Helper Functions
1786
+ // =============================================================================
1787
+ // 썸네일 분석
1788
+ function analyzeThumbnailConcept(title, description, platform, category) {
1789
+ const elements = {
1790
+ face_detected: /얼굴|표정|사람|인물/.test(description),
1791
+ text_overlay: /텍스트|글자|문구/.test(description),
1792
+ bright_colors: /밝은|화려한|눈에 띄는|빨간|노란/.test(description),
1793
+ food_closeup: /음식|클로즈업|맛있/.test(description),
1794
+ before_after: /비포|애프터|전후|변화/.test(description),
1795
+ arrow_pointing: /화살표|포인팅|가리키/.test(description),
1796
+ emoji_use: /이모지|이모티콘/.test(description),
1797
+ };
1798
+ let score = 50;
1799
+ const improvements = [];
1800
+ const strengths = [];
1801
+ // 얼굴 감지 (유튜브에서 중요)
1802
+ if (elements.face_detected) {
1803
+ score += 15;
1804
+ strengths.push("얼굴/표정이 포함되어 있어 클릭률 상승 기대");
1805
+ }
1806
+ else {
1807
+ improvements.push("사람의 얼굴이나 표정을 추가하면 CTR 15-30% 상승");
1808
+ }
1809
+ // 텍스트 오버레이
1810
+ if (elements.text_overlay) {
1811
+ score += 10;
1812
+ strengths.push("텍스트 오버레이로 핵심 메시지 전달");
1813
+ }
1814
+ else {
1815
+ improvements.push("핵심 키워드 2-3개를 텍스트로 추가");
1816
+ }
1817
+ // 밝은 색상
1818
+ if (elements.bright_colors) {
1819
+ score += 8;
1820
+ strengths.push("눈에 띄는 색상 사용");
1821
+ }
1822
+ else {
1823
+ improvements.push("노란색, 빨간색 등 눈에 띄는 색상 활용");
1824
+ }
1825
+ // 플랫폼별 추가 점수
1826
+ if (platform === "youtube" && elements.face_detected)
1827
+ score += 5;
1828
+ if (platform === "instagram" && elements.bright_colors)
1829
+ score += 5;
1830
+ const platformBestPractices = {
1831
+ youtube: [
1832
+ "1280x720 이상의 해상도 사용",
1833
+ "얼굴은 프레임의 1/3 이상 차지",
1834
+ "텍스트는 3-5단어 이내",
1835
+ "대비가 강한 색상 조합",
1836
+ "호기심 자극하는 표정/포즈",
1837
+ ],
1838
+ instagram: [
1839
+ "1:1 또는 4:5 비율 권장",
1840
+ "밝고 따뜻한 톤",
1841
+ "일관된 필터/색감",
1842
+ "미니멀한 구도",
1843
+ "브랜드 컬러 활용",
1844
+ ],
1845
+ tiktok: [
1846
+ "9:16 세로 비율 필수",
1847
+ "첫 0.5초 내 시선 집중",
1848
+ "트렌디한 비주얼",
1849
+ "빠른 동작/표정",
1850
+ ],
1851
+ };
1852
+ const categoryTips = {
1853
+ 먹방: ["음식 클로즈업 + 김 오르는 장면", "먹는 표정 강조", "양 많아 보이게"],
1854
+ 뷰티: ["비포-애프터 구도", "제품 + 결과물", "깨끗한 피부 강조"],
1855
+ 테크: ["제품 + 손 포함", "스펙 텍스트 오버레이", "미래지향적 느낌"],
1856
+ 브이로그: ["자연스러운 표정", "장소가 드러나는 구도", "감성적 색감"],
1857
+ 교육: ["핵심 포인트 텍스트", "진지한 표정", "전문가 느낌"],
1858
+ };
1859
+ return {
1860
+ title,
1861
+ platform,
1862
+ category,
1863
+ thumbnail_score: Math.min(score, 100),
1864
+ grade: score >= 85 ? "A (매우 우수)" : score >= 70 ? "B (우수)" : score >= 55 ? "C (보통)" : "D (개선 필요)",
1865
+ detected_elements: elements,
1866
+ strengths,
1867
+ improvements,
1868
+ platform_best_practices: platformBestPractices[platform] || platformBestPractices.youtube,
1869
+ category_specific_tips: categoryTips[category] || ["카테고리에 맞는 시각적 요소 강조", "타겟 오디언스가 관심 가질 요소 포함"],
1870
+ color_psychology: {
1871
+ red: "긴급함, 열정 - 할인, 긴급 콘텐츠",
1872
+ yellow: "주목, 행복 - 정보성 콘텐츠",
1873
+ blue: "신뢰, 전문성 - 교육, 테크",
1874
+ green: "건강, 자연 - 웰빙, 에코",
1875
+ orange: "에너지, 창의성 - 엔터테인먼트",
1876
+ },
1877
+ ctr_prediction: {
1878
+ current: `${score >= 70 ? "높음" : score >= 50 ? "보통" : "낮음"}`,
1879
+ potential_with_improvements: "높음 (5-10% CTR 예상)",
1880
+ },
1881
+ };
1882
+ }
1883
+ // 스크립트 아웃라인 생성
1884
+ function generateScriptOutline(topic, format, duration, style, includeHooks) {
1885
+ const formatSettings = {
1886
+ youtube_long: {
1887
+ recommended_duration: "8-15분",
1888
+ sections: ["인트로", "훅", "본문1", "본문2", "본문3", "정리", "CTA", "아웃트로"],
1889
+ hook_time: "0-30초",
1890
+ },
1891
+ youtube_short: {
1892
+ recommended_duration: "30-60초",
1893
+ sections: ["훅", "핵심 포인트", "CTA"],
1894
+ hook_time: "0-3초",
1895
+ },
1896
+ podcast: {
1897
+ recommended_duration: "20-45분",
1898
+ sections: ["인트로", "주제 소개", "본론1", "본론2", "질문/토론", "정리", "아웃트로"],
1899
+ hook_time: "0-60초",
1900
+ },
1901
+ reels: {
1902
+ recommended_duration: "15-30초",
1903
+ sections: ["훅", "메인 콘텐츠", "반전/CTA"],
1904
+ hook_time: "0-1초",
1905
+ },
1906
+ tiktok: {
1907
+ recommended_duration: "15-60초",
1908
+ sections: ["훅", "스토리", "포인트", "CTA"],
1909
+ hook_time: "0-1초",
1910
+ },
1911
+ live: {
1912
+ recommended_duration: "30-60분",
1913
+ sections: ["인사", "오늘의 주제", "메인 콘텐츠", "Q&A", "마무리"],
1914
+ hook_time: "0-5분",
1915
+ },
1916
+ };
1917
+ const settings = formatSettings[format] || formatSettings.youtube_long;
1918
+ const hooks = [
1919
+ `"${topic}에 대해 이런 건 몰랐을 거예요"`,
1920
+ `"오늘 알려드릴 ${topic} 팁, 진짜 중요합니다"`,
1921
+ `"${topic} 관련해서 가장 많이 받는 질문이에요"`,
1922
+ `"이거 알고 나면 ${topic}이 완전 달라집니다"`,
1923
+ `"3년간 ${topic} 하면서 깨달은 것들"`,
1924
+ ];
1925
+ const styleGuides = {
1926
+ educational: {
1927
+ tone: "전문적이지만 친근하게",
1928
+ structure: "문제 → 해결책 → 실습",
1929
+ tips: ["전문 용어는 쉽게 풀어서 설명", "실제 예시 풍부하게", "요약 정리 포함"],
1930
+ },
1931
+ entertainment: {
1932
+ tone: "활기차고 재미있게",
1933
+ structure: "훅 → 스토리 → 반전",
1934
+ tips: ["유머 포인트 삽입", "빠른 템포", "시청자 참여 유도"],
1935
+ },
1936
+ storytelling: {
1937
+ tone: "감성적이고 몰입감 있게",
1938
+ structure: "도입 → 갈등 → 해결",
1939
+ tips: ["개인적 경험 공유", "감정선 구축", "교훈으로 마무리"],
1940
+ },
1941
+ review: {
1942
+ tone: "객관적이고 솔직하게",
1943
+ structure: "소개 → 장점 → 단점 → 총평",
1944
+ tips: ["구체적 스펙/기능 언급", "비교 대상 제시", "별점/추천도"],
1945
+ },
1946
+ tutorial: {
1947
+ tone: "차분하고 명확하게",
1948
+ structure: "개요 → 단계별 설명 → 마무리",
1949
+ tips: ["화면 보며 따라할 수 있게", "실수 포인트 미리 안내", "팁 추가"],
1950
+ },
1951
+ };
1952
+ const outline = {
1953
+ topic,
1954
+ format,
1955
+ recommended_duration: duration || settings.recommended_duration,
1956
+ style,
1957
+ style_guide: styleGuides[style] || styleGuides.educational,
1958
+ hook_examples: includeHooks ? hooks : [],
1959
+ sections: [],
1960
+ };
1961
+ settings.sections.forEach((section, index) => {
1962
+ const sectionDetail = {
1963
+ order: index + 1,
1964
+ name: section,
1965
+ estimated_time: calculateSectionTime(section, format),
1966
+ key_points: [],
1967
+ script_template: "",
1968
+ };
1969
+ if (section === "인트로") {
1970
+ sectionDetail.key_points = ["채널 소개", "오늘의 주제 예고", "시청 이유 제시"];
1971
+ sectionDetail.script_template = `안녕하세요, [채널명]입니다. 오늘은 ${topic}에 대해 이야기해볼게요.`;
1972
+ }
1973
+ else if (section === "훅") {
1974
+ sectionDetail.key_points = ["호기심 자극", "문제 제기", "결과 미리보기"];
1975
+ sectionDetail.script_template = hooks[0];
1976
+ }
1977
+ else if (section.includes("본문") || section.includes("본론")) {
1978
+ sectionDetail.key_points = [`${topic}의 핵심 포인트`, "구체적 예시", "실용적 팁"];
1979
+ sectionDetail.script_template = `[핵심 내용]에 대해 자세히 설명드릴게요...`;
1980
+ }
1981
+ else if (section === "CTA") {
1982
+ sectionDetail.key_points = ["구독/좋아요 요청", "다음 영상 예고", "댓글 유도"];
1983
+ sectionDetail.script_template = "이 영상이 도움이 되셨다면 구독과 좋아요 부탁드려요!";
1984
+ }
1985
+ else if (section === "아웃트로") {
1986
+ sectionDetail.key_points = ["핵심 요약", "감사 인사", "다음 콘텐츠 예고"];
1987
+ sectionDetail.script_template = `오늘 ${topic}에 대해 알아봤는데요, 도움이 되셨길 바랍니다.`;
1988
+ }
1989
+ outline.sections.push(sectionDetail);
1990
+ });
1991
+ outline.production_tips = {
1992
+ filming: ["조명은 자연광 또는 3점 조명", "음질이 화질보다 중요", "배경 정리"],
1993
+ editing: ["점프컷으로 템포 유지", "자막 필수", "BGM 볼륨은 음성의 10-20%"],
1994
+ thumbnail: ["제목과 연계된 이미지", "얼굴 표정 강조", "텍스트 3-5단어"],
1995
+ };
1996
+ return outline;
1997
+ }
1998
+ function calculateSectionTime(section, format) {
1999
+ const times = {
2000
+ youtube_long: {
2001
+ 인트로: "30초-1분",
2002
+ 훅: "30초",
2003
+ 본문1: "3-4분",
2004
+ 본문2: "3-4분",
2005
+ 본문3: "2-3분",
2006
+ 정리: "1분",
2007
+ CTA: "30초",
2008
+ 아웃트로: "30초",
2009
+ },
2010
+ youtube_short: { 훅: "3초", "핵심 포인트": "20-40초", CTA: "5초" },
2011
+ reels: { 훅: "1초", "메인 콘텐츠": "20초", "반전/CTA": "5초" },
2012
+ tiktok: { 훅: "1초", 스토리: "15-30초", 포인트: "10초", CTA: "3초" },
2013
+ };
2014
+ return times[format]?.[section] || "적절히 조절";
2015
+ }
2016
+ // 콘텐츠 리퍼포징
2017
+ function repurposeContent(original, source, targets) {
2018
+ const repurposingStrategies = {
2019
+ youtube_shorts: {
2020
+ approach: "핵심 하이라이트 추출",
2021
+ format: "세로 9:16",
2022
+ duration: "60초 이내",
2023
+ tips: ["가장 임팩트 있는 장면 선택", "자막 필수", "훅으로 시작"],
2024
+ },
2025
+ instagram_post: {
2026
+ approach: "핵심 포인트 카드뉴스화",
2027
+ format: "1:1 또는 4:5 캐러셀",
2028
+ tips: ["10장 이내 슬라이드", "각 슬라이드 하나의 포인트", "마지막에 CTA"],
2029
+ },
2030
+ instagram_reels: {
2031
+ approach: "15-30초 하이라이트",
2032
+ format: "세로 9:16",
2033
+ tips: ["트렌딩 오디오 활용", "빠른 컷 편집", "캡션에 풀버전 링크"],
2034
+ },
2035
+ tiktok: {
2036
+ approach: "바이럴 포인트 추출",
2037
+ format: "세로 9:16, 15-60초",
2038
+ tips: ["트렌딩 사운드 필수", "첫 1초 승부", "댓글 유도형 마무리"],
2039
+ },
2040
+ blog: {
2041
+ approach: "상세 텍스트 버전 작성",
2042
+ format: "2000-3000자 글",
2043
+ tips: ["SEO 키워드 포함", "H2/H3 구조화", "이미지 5-10개"],
2044
+ },
2045
+ newsletter: {
2046
+ approach: "핵심 인사이트 요약",
2047
+ format: "800-1200자",
2048
+ tips: ["개인적인 톤", "actionable 팁", "다음 호 예고"],
2049
+ },
2050
+ twitter: {
2051
+ approach: "핵심 문장 + 스레드",
2052
+ format: "280자 × 여러 개",
2053
+ tips: ["첫 트윗이 핵심", "숫자/통계 활용", "마지막에 원본 링크"],
2054
+ },
2055
+ threads: {
2056
+ approach: "대화형 스레드",
2057
+ format: "500자 이내 × 여러 개",
2058
+ tips: ["스토리텔링 형식", "이미지 함께", "인스타 연동"],
2059
+ },
2060
+ linkedin: {
2061
+ approach: "전문적 인사이트 버전",
2062
+ format: "1000-1500자",
2063
+ tips: ["전문성 강조", "데이터/결과 중심", "업계 해시태그"],
2064
+ },
2065
+ };
2066
+ const results = targets.map(target => ({
2067
+ platform: target,
2068
+ strategy: repurposingStrategies[target] || { approach: "플랫폼에 맞게 변환", tips: [] },
2069
+ adapted_title: adaptTitleForPlatform(original, target),
2070
+ content_adjustments: getContentAdjustments(source, target),
2071
+ estimated_effort: getEffortEstimate(source, target),
2072
+ priority: getPriorityScore(target),
2073
+ }));
2074
+ return {
2075
+ original_content: original,
2076
+ source_platform: source,
2077
+ repurposing_plan: results.sort((a, b) => b.priority - a.priority),
2078
+ workflow_tip: "고품질 원본 하나로 5-7개 플랫폼 커버 가능",
2079
+ time_saving: "평균 60-70% 시간 절약",
2080
+ recommended_order: results.map(r => r.platform),
2081
+ };
2082
+ }
2083
+ function adaptTitleForPlatform(original, platform) {
2084
+ const adaptations = {
2085
+ youtube_shorts: `${original} #shorts`,
2086
+ instagram_post: original.length > 50 ? original.substring(0, 47) + "..." : original,
2087
+ instagram_reels: `${original} 🔥`,
2088
+ tiktok: `${original} 알려줌`,
2089
+ twitter: original.length > 100 ? original.substring(0, 97) + "..." : original,
2090
+ threads: original,
2091
+ linkedin: `[인사이트] ${original}`,
2092
+ blog: `${original} - 완벽 가이드`,
2093
+ newsletter: `📧 ${original}`,
2094
+ };
2095
+ return adaptations[platform] || original;
2096
+ }
2097
+ function getContentAdjustments(source, target) {
2098
+ const adjustments = [];
2099
+ if (source === "youtube" && target.includes("short")) {
2100
+ adjustments.push("긴 영상에서 핵심 15-60초 추출");
2101
+ }
2102
+ if (target === "blog") {
2103
+ adjustments.push("영상 스크립트를 글로 확장");
2104
+ adjustments.push("스크린샷 추가");
2105
+ }
2106
+ if (target.includes("instagram")) {
2107
+ adjustments.push("비주얼 중심으로 재구성");
2108
+ adjustments.push("해시태그 20-25개 추가");
2109
+ }
2110
+ return adjustments.length > 0 ? adjustments : ["플랫폼 특성에 맞게 조정"];
2111
+ }
2112
+ function getEffortEstimate(source, target) {
2113
+ if (source === target)
2114
+ return "0분";
2115
+ if (target.includes("short") || target.includes("reels"))
2116
+ return "15-30분";
2117
+ if (target === "blog")
2118
+ return "1-2시간";
2119
+ if (target === "newsletter")
2120
+ return "30분-1시간";
2121
+ return "20-40분";
2122
+ }
2123
+ function getPriorityScore(platform) {
2124
+ const scores = {
2125
+ instagram_reels: 95,
2126
+ tiktok: 90,
2127
+ youtube_shorts: 88,
2128
+ instagram_post: 80,
2129
+ twitter: 70,
2130
+ threads: 65,
2131
+ linkedin: 60,
2132
+ blog: 75,
2133
+ newsletter: 70,
2134
+ };
2135
+ return scores[platform] || 50;
2136
+ }
2137
+ // 인플루언서 협업 분석
2138
+ function analyzeInfluencerCollab(category, audience, budget, goal) {
2139
+ const tierInfo = {
2140
+ nano: { followers: "1K-10K", engagement: "5-10%", cost: "10-50만원", pros: ["높은 참여율", "진정성", "저비용"], cons: ["도달 제한", "전문성 부족 가능"] },
2141
+ micro: { followers: "10K-50K", engagement: "3-8%", cost: "50-200만원", pros: ["좋은 참여율", "타겟 정확", "비용 효율"], cons: ["도달 중간", "협상 필요"] },
2142
+ mid: { followers: "50K-500K", engagement: "2-5%", cost: "200-1000만원", pros: ["넓은 도달", "전문성", "콘텐츠 품질"], cons: ["비용 상승", "광고 느낌"] },
2143
+ macro: { followers: "500K-1M", engagement: "1-3%", cost: "1000-3000만원", pros: ["큰 도달", "신뢰도", "브랜드 인지도"], cons: ["높은 비용", "낮은 참여율"] },
2144
+ mega: { followers: "1M+", engagement: "1-2%", cost: "3000만원+", pros: ["최대 도달", "화제성", "브랜드 이미지"], cons: ["매우 높은 비용", "진정성 의문"] },
2145
+ };
2146
+ const budgetTiers = {
2147
+ low: ["nano", "micro"],
2148
+ medium: ["micro", "mid"],
2149
+ high: ["mid", "macro"],
2150
+ premium: ["macro", "mega"],
2151
+ };
2152
+ const recommendedTiers = budgetTiers[budget] || ["micro", "mid"];
2153
+ const platformsByCategory = {
2154
+ 뷰티: ["인스타그램", "유튜브", "틱톡"],
2155
+ 패션: ["인스타그램", "유튜브"],
2156
+ 푸드: ["유튜브", "인스타그램", "블로그"],
2157
+ 테크: ["유튜브", "블로그"],
2158
+ 라이프스타일: ["인스타그램", "유튜브", "블로그"],
2159
+ 게임: ["유튜브", "트위치", "틱톡"],
2160
+ 육아: ["인스타그램", "블로그", "유튜브"],
2161
+ 여행: ["인스타그램", "유튜브", "블로그"],
2162
+ };
2163
+ const collabTypes = [
2164
+ { type: "제품 협찬", description: "제품 제공 + 솔직 리뷰", suitable_for: ["awareness", "content"] },
2165
+ { type: "유료 광고", description: "정해진 가이드라인 콘텐츠", suitable_for: ["awareness", "conversion"] },
2166
+ { type: "어필리에이트", description: "판매 수수료 기반", suitable_for: ["conversion"] },
2167
+ { type: "앰버서더", description: "장기 파트너십", suitable_for: ["awareness", "engagement"] },
2168
+ { type: "콘텐츠 공동제작", description: "함께 기획/제작", suitable_for: ["content", "engagement"] },
2169
+ ];
2170
+ return {
2171
+ brand_category: category,
2172
+ target_audience: audience,
2173
+ budget_range: budget,
2174
+ campaign_goal: goal,
2175
+ recommended_influencer_tiers: recommendedTiers.map(tier => ({
2176
+ tier,
2177
+ ...tierInfo[tier],
2178
+ })),
2179
+ recommended_platforms: platformsByCategory[category] || ["인스타그램", "유튜브"],
2180
+ suitable_collab_types: collabTypes.filter(c => c.suitable_for.includes(goal)),
2181
+ success_metrics: {
2182
+ awareness: ["도달수", "노출수", "브랜드 검색량"],
2183
+ engagement: ["좋아요", "댓글", "저장", "공유"],
2184
+ conversion: ["클릭수", "구매수", "ROAS"],
2185
+ content: ["콘텐츠 품질", "재사용 가능성"],
2186
+ }[goal] || ["도달수", "참여율"],
2187
+ negotiation_tips: [
2188
+ "명확한 KPI 설정",
2189
+ "콘텐츠 사용권 협의",
2190
+ "수정 횟수 명시",
2191
+ "게시 일정 확정",
2192
+ "성과 리포트 요청",
2193
+ ],
2194
+ red_flags: [
2195
+ "팔로워 대비 참여율 너무 낮음 (1% 미만)",
2196
+ "댓글이 대부분 이모지나 봇성",
2197
+ "최근 콘텐츠 업로드 없음",
2198
+ "브랜드 이미지와 맞지 않는 과거 콘텐츠",
2199
+ ],
2200
+ };
2201
+ }
2202
+ // 콘텐츠 성과 예측
2203
+ function predictContentPerformance(title, description, platform, category, postingTime, hasTrending) {
2204
+ let baseScore = 50;
2205
+ const factors = {};
2206
+ // 제목 분석
2207
+ const titleFactors = {
2208
+ has_numbers: /\d/.test(title),
2209
+ has_question: /\?/.test(title),
2210
+ has_emotional: /놀라운|충격|비밀|최고|완벽|필수|대박|꿀팁|진짜/.test(title),
2211
+ optimal_length: title.length >= 20 && title.length <= 60,
2212
+ has_brackets: /[\[\]【】]/.test(title),
2213
+ };
2214
+ factors.title = titleFactors;
2215
+ if (titleFactors.has_numbers)
2216
+ baseScore += 8;
2217
+ if (titleFactors.has_question)
2218
+ baseScore += 5;
2219
+ if (titleFactors.has_emotional)
2220
+ baseScore += 10;
2221
+ if (titleFactors.optimal_length)
2222
+ baseScore += 5;
2223
+ if (titleFactors.has_brackets)
2224
+ baseScore += 3;
2225
+ // 트렌딩 토픽
2226
+ if (hasTrending) {
2227
+ baseScore += 15;
2228
+ factors.trending_boost = true;
2229
+ }
2230
+ // 게시 시간
2231
+ const timeScores = {
2232
+ "평일 아침": 60,
2233
+ "평일 점심": 75,
2234
+ "평일 저녁": 90,
2235
+ "주말 오후": 85,
2236
+ "주말 저녁": 80,
2237
+ };
2238
+ if (postingTime) {
2239
+ const timeMatch = Object.keys(timeScores).find(t => postingTime.includes(t.split(" ")[1]));
2240
+ if (timeMatch) {
2241
+ baseScore += (timeScores[timeMatch] - 50) / 5;
2242
+ factors.posting_time_score = timeScores[timeMatch];
2243
+ }
2244
+ }
2245
+ // 플랫폼별 가중치
2246
+ const platformMultiplier = {
2247
+ tiktok: 1.2,
2248
+ instagram: 1.1,
2249
+ youtube: 1.0,
2250
+ blog: 0.9,
2251
+ twitter: 0.95,
2252
+ };
2253
+ baseScore *= platformMultiplier[platform] || 1;
2254
+ const finalScore = Math.min(Math.round(baseScore), 100);
2255
+ // 예상 성과
2256
+ const performanceRanges = {
2257
+ youtube: {
2258
+ high: { views: "10K-50K", engagement: "5-8%", shares: "100-500" },
2259
+ medium: { views: "1K-10K", engagement: "3-5%", shares: "20-100" },
2260
+ low: { views: "100-1K", engagement: "1-3%", shares: "5-20" },
2261
+ },
2262
+ instagram: {
2263
+ high: { reach: "5K-20K", engagement: "6-10%", saves: "50-200" },
2264
+ medium: { reach: "1K-5K", engagement: "3-6%", saves: "10-50" },
2265
+ low: { reach: "200-1K", engagement: "1-3%", saves: "2-10" },
2266
+ },
2267
+ tiktok: {
2268
+ high: { views: "50K-500K", engagement: "8-15%", shares: "500-2K" },
2269
+ medium: { views: "5K-50K", engagement: "5-8%", shares: "50-500" },
2270
+ low: { views: "500-5K", engagement: "2-5%", shares: "10-50" },
2271
+ },
2272
+ };
2273
+ const tier = finalScore >= 75 ? "high" : finalScore >= 50 ? "medium" : "low";
2274
+ const platformPerf = performanceRanges[platform] || performanceRanges.youtube;
2275
+ return {
2276
+ title,
2277
+ platform,
2278
+ category,
2279
+ performance_score: finalScore,
2280
+ grade: finalScore >= 85 ? "A (높은 성과 예상)" : finalScore >= 70 ? "B (좋은 성과 예상)" : finalScore >= 50 ? "C (보통)" : "D (개선 필요)",
2281
+ analysis_factors: factors,
2282
+ predicted_performance: platformPerf[tier],
2283
+ confidence_level: hasTrending ? "높음 (트렌딩 반영)" : "보통",
2284
+ optimization_suggestions: [
2285
+ !titleFactors.has_numbers ? "제목에 숫자 추가 (예: 5가지, TOP 10)" : null,
2286
+ !titleFactors.has_emotional ? "감정을 자극하는 단어 추가" : null,
2287
+ !titleFactors.optimal_length ? "제목 길이 20-60자 권장" : null,
2288
+ !hasTrending ? "트렌딩 키워드 연계 고려" : null,
2289
+ ].filter(Boolean),
2290
+ best_posting_windows: {
2291
+ weekday: "오전 7-9시, 점심 12-1시, 저녁 7-10시",
2292
+ weekend: "오후 2-4시, 저녁 7-9시",
2293
+ },
2294
+ };
2295
+ }
2296
+ // =============================================================================
1603
2297
  // Server Start
1604
2298
  // =============================================================================
1605
2299
  async function main() {
1606
2300
  const transport = new StdioServerTransport();
1607
2301
  await server.connect(transport);
1608
- console.error("Content Genie MCP Server v2.0 running on stdio");
2302
+ console.error("Content Genie MCP Server v2.5 running on stdio");
1609
2303
  }
1610
2304
  main().catch(console.error);