@isnow890/naver-search-mcp 1.0.49 → 1.0.51

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/README.md CHANGED
@@ -7,6 +7,17 @@
7
7
 
8
8
  MCP server for Naver Search API and DataLab API integration, enabling comprehensive search across various Naver services and data trend analysis.
9
9
 
10
+ > [!WARNING]
11
+ > ### ⚠️ [Archived] Project Discontinuation & Service End Notice
12
+ >
13
+ > Due to changes in Naver's API policies and terms of service, **active development and maintenance of this repository have been officially discontinued, and this repository is now archived (read-only)**.
14
+ >
15
+ > - **End of Maintenance**: No new features, bug fixes, issues, or pull requests will be supported.
16
+ > - **Kakao PlayMCP Discontinuation**: The zero-setup Kakao PlayMCP service integration has also been shut down.
17
+ > - **Code Preservation**: Existing code remains publicly available for reference and study under the MIT License.
18
+ >
19
+ > Thank you very much to everyone who supported, starred, and used `naver-search-mcp` throughout this project! 🙏
20
+
10
21
  ## ⚠️ Naver is migrating these APIs — read this before you set up
11
22
 
12
23
  Naver is moving Search, Search Trend, and Shopping Insight from the Naver Developers Center to **NAVER API HUB** on NAVER Cloud Platform, and is shutting down three search APIs entirely.
@@ -36,9 +47,9 @@ openclaw skills install naver-search-mcp
36
47
 
37
48
  The ClawHub skill uses the published npm package internally and needs **one** credential pair in your OpenClaw environment — either the NAVER API HUB pair (`NCP_APIGW_API_KEY_ID` / `NCP_APIGW_API_KEY`) or the Developers Center pair (`NAVER_CLIENT_ID` / `NAVER_CLIENT_SECRET`). OpenClaw's `apiKey` field maps to `NAVER_CLIENT_SECRET`; HUB users should set both HUB variables explicitly in the environment instead of using `apiKey`.
38
49
 
39
- ## Quick Start: Use Without API Key
50
+ ## ~~Quick Start: Use Without API Key (Discontinued)~~
40
51
 
41
- You can use this server immediately without API keys through [Kakao PlayMCP](https://playmcp.kakao.com/mcp/154). Simply visit the link and start using it right away!
52
+ > **Notice:** Following the archiving and discontinuation of this project, the zero-setup service on [Kakao PlayMCP](https://playmcp.kakao.com/mcp/154) has also been shut down. Thank you to everyone who tried it out!
42
53
 
43
54
  ## Tool Details
44
55
 
@@ -185,9 +185,9 @@ export const findCategoryHandler = async ({ query, max_results = 10 }) => {
185
185
  })),
186
186
  next_steps: {
187
187
  trend_analysis: `이제 datalab_shopping_category 도구로 각 카테고리의 트렌드 분석이 가능합니다`,
188
- age_analysis: `datalab_shopping_age 도구로 연령별 쇼핑 패턴을 분석할 수 있습니다`,
189
- gender_analysis: `datalab_shopping_gender 도구로 성별 쇼핑 패턴을 분석할 수 있습니다`,
190
- device_analysis: `datalab_shopping_device 도구로 디바이스별 쇼핑 패턴을 분석할 수 있습니다`
188
+ age_analysis: `datalab_shopping_by_age 도구로 연령별 쇼핑 패턴을 분석할 수 있습니다`,
189
+ gender_analysis: `datalab_shopping_by_gender 도구로 성별 쇼핑 패턴을 분석할 수 있습니다`,
190
+ device_analysis: `datalab_shopping_by_device 도구로 디바이스별 쇼핑 패턴을 분석할 수 있습니다`
191
191
  }
192
192
  };
193
193
  return responseData;
package/dist/src/index.js CHANGED
@@ -80,7 +80,7 @@ export function createNaverSearchServer({ config, }) {
80
80
  const client = NaverSearchClient.getInstance();
81
81
  client.initialize(credentials);
82
82
  server.registerTool("search_webkr", {
83
- description: "🌐 Search Korean web documents and general content. Comprehensive search across Korean websites and online content. Find articles, information, and documents from various Korean sources. For recent content or 'today's results', use get_current_korean_time first. (네이버 웹문서 검색 - 한국 웹사이트 종합 검색, 최근 콘텐츠나 오늘 결과를 찾을 때는 먼저 get_current_korean_time으로 현재 시간을 확인하세요)",
83
+ description: "🌐 Search Korean web documents and general content. Comprehensive search across Korean websites and online content. Find articles, information, and documents from various Korean sources. (네이버 웹문서 검색 - 한국 웹사이트 종합 검색)",
84
84
  inputSchema: SearchArgsSchema.shape,
85
85
  }, async (args) => {
86
86
  const result = await searchToolHandlers.search_webkr(args);
@@ -89,7 +89,7 @@ export function createNaverSearchServer({ config, }) {
89
89
  };
90
90
  });
91
91
  server.registerTool("search_news", {
92
- description: "📰 Search latest Korean news articles from major outlets. Perfect for current events, breaking news, and recent developments. Covers politics, economy, society, and international news. For today's news or current events, use get_current_korean_time first to understand what 'today' means. (네이버 뉴스 검색 - 최신 뉴스와 시사 정보, 오늘 뉴스를 찾을 때는 먼저 get_current_korean_time으로 현재 시간을 확인하세요)",
92
+ description: "📰 Search latest Korean news articles from major outlets. Perfect for current events, breaking news, and recent developments. Covers politics, economy, society, and international news. (네이버 뉴스 검색 - 최신 뉴스와 시사 정보)",
93
93
  inputSchema: SearchArgsSchema.shape,
94
94
  }, async (args) => {
95
95
  const result = await searchToolHandlers.search_news(args);
@@ -98,7 +98,7 @@ export function createNaverSearchServer({ config, }) {
98
98
  };
99
99
  });
100
100
  server.registerTool("search_blog", {
101
- description: "✍️ Search personal blogs and reviews for authentic user experiences. Great for product reviews, personal stories, detailed tutorials, and real user opinions. Find genuine Korean perspectives. For recent posts or 'today's content', use get_current_korean_time first. (네이버 블로그 검색 - 실제 사용자 후기와 개인적 경험, 최근 글이나 오늘 내용을 찾을 때는 먼저 get_current_korean_time으로 현재 시간을 확인하세요)",
101
+ description: "✍️ Search personal blogs and reviews for authentic user experiences. Great for product reviews, personal stories, detailed tutorials, and real user opinions. Find genuine Korean perspectives. (네이버 블로그 검색 - 실제 사용자 후기와 개인적 경험)",
102
102
  inputSchema: SearchArgsSchema.shape,
103
103
  }, async (args) => {
104
104
  const result = await searchToolHandlers.search_blog(args);
@@ -107,7 +107,7 @@ export function createNaverSearchServer({ config, }) {
107
107
  };
108
108
  });
109
109
  server.registerTool("search_image", {
110
- description: "🖼️ Search for images with Korean context and relevance. Find visual content, infographics, charts, and photos related to your search terms. Great for visual research and content discovery. For recent images or current visual content, use get_current_korean_time first. (네이버 이미지 검색 - 시각적 컨텐츠 발견, 최근 이미지나 현재 시각 자료를 찾을 때는 먼저 get_current_korean_time으로 현재 시간을 확인하세요)",
110
+ description: "🖼️ Search for images with Korean context and relevance. Find visual content, infographics, charts, and photos related to your search terms. Great for visual research and content discovery. (네이버 이미지 검색 - 시각적 컨텐츠 발견)",
111
111
  inputSchema: SearchArgsSchema.shape,
112
112
  }, async (args) => {
113
113
  const result = await searchToolHandlers.search_image(args);
@@ -116,7 +116,7 @@ export function createNaverSearchServer({ config, }) {
116
116
  };
117
117
  });
118
118
  server.registerTool("search_kin", {
119
- description: "❓ Search Naver KnowledgeiN for Q&A and community-driven answers. Find solutions to problems, get expert advice, and discover community insights on various topics. For recent questions or current discussions, use get_current_korean_time first. (네이버 지식iN 검색 - 질문과 답변, 커뮤니티 지식, 최근 질문이나 현재 토론을 찾을 때는 먼저 get_current_korean_time으로 현재 시간을 확인하세요)",
119
+ description: "❓ Search Naver KnowledgeiN for Q&A and community-driven answers. Find solutions to problems, get expert advice, and discover community insights on various topics. (네이버 지식iN 검색 - 질문과 답변, 커뮤니티 지식)",
120
120
  inputSchema: SearchArgsSchema.shape,
121
121
  }, async (args) => {
122
122
  const result = await searchToolHandlers.search_kin(args);
@@ -125,7 +125,7 @@ export function createNaverSearchServer({ config, }) {
125
125
  };
126
126
  });
127
127
  server.registerTool("search_encyc", {
128
- description: "📖 Search Naver Encyclopedia for authoritative knowledge and definitions. Best for academic research, getting reliable information, and understanding Korean concepts and terminology. For current definitions or recent updates, use get_current_korean_time for context. (네이버 지식백과 검색 - 신뢰할 수 있는 정보와 정의, 현재 정의나 최근 업데이트를 찾을 때는 get_current_korean_time으로 상황을 파악하세요)",
128
+ description: "📖 Search Naver Encyclopedia for authoritative knowledge and definitions. Best for academic research, getting reliable information, and understanding Korean concepts and terminology. (네이버 지식백과 검색 - 신뢰할 수 있는 정보와 정의)",
129
129
  inputSchema: SearchArgsSchema.shape,
130
130
  }, async (args) => {
131
131
  const result = await searchToolHandlers.search_encyc(args);
@@ -134,7 +134,7 @@ export function createNaverSearchServer({ config, }) {
134
134
  };
135
135
  });
136
136
  server.registerTool("search_local", {
137
- description: "📍 Search for local businesses, restaurants, and places in Korea. Find location information, reviews, contact details, and business hours for Korean establishments. For current business hours or today's availability, use get_current_korean_time first. (네이버 지역 검색 - 지역 업체와 장소 정보, 현재 영업시간이나 오늘 이용 가능 여부를 확인할 때는 먼저 get_current_korean_time으로 현재 시간을 확인하세요)",
137
+ description: "📍 Search for local businesses, restaurants, and places in Korea. Find location information, reviews, contact details, and business hours for Korean establishments. (네이버 지역 검색 - 지역 업체와 장소 정보)",
138
138
  inputSchema: NaverLocalSearchParamsSchema.shape,
139
139
  }, async (args) => {
140
140
  const result = await searchToolHandlers.search_local(args);
@@ -143,7 +143,7 @@ export function createNaverSearchServer({ config, }) {
143
143
  };
144
144
  });
145
145
  server.registerTool("search_cafearticle", {
146
- description: "☕ Search Naver Cafe articles for community discussions and specialized content. Find niche communities, hobby groups, and specialized discussions on various topics. For recent discussions or current community topics, use get_current_korean_time first. (네이버 카페글 검색 - 커뮤니티 토론과 전문 정보, 최근 논의나 현재 커뮤니티 주제를 찾을 때는 먼저 get_current_korean_time으로 현재 시간을 확인하세요)",
146
+ description: "☕ Search Naver Cafe articles for community discussions and specialized content. Find niche communities, hobby groups, and specialized discussions on various topics. (네이버 카페글 검색 - 커뮤니티 토론과 전문 정보)",
147
147
  inputSchema: SearchArgsSchema.shape,
148
148
  }, async (args) => {
149
149
  const result = await searchToolHandlers.search_cafearticle(args);
@@ -153,7 +153,7 @@ export function createNaverSearchServer({ config, }) {
153
153
  });
154
154
  // Register datalab tools
155
155
  server.registerTool("datalab_search", {
156
- description: "📊 Analyze search keyword trends over time using Naver DataLab. Track popularity changes, seasonal patterns, and compare multiple keywords. Perfect for market research and trend analysis. For current trend analysis or 'recent trends', use get_current_korean_time to determine proper date ranges. (네이버 데이터랩 검색어 트렌드 분석, 현재 트렌드나 최근 동향 분석 시 get_current_korean_time으로 적절한 날짜 범위를 설정하세요)",
156
+ description: "📊 Analyze search keyword trends over time using Naver DataLab. Track popularity changes, seasonal patterns, and compare multiple keywords. Perfect for market research and trend analysis. (네이버 데이터랩 검색어 트렌드 분석)",
157
157
  inputSchema: DatalabSearchSchema.shape,
158
158
  }, async (args) => {
159
159
  const result = await datalabToolHandlers.datalab_search(args);
@@ -162,7 +162,7 @@ export function createNaverSearchServer({ config, }) {
162
162
  };
163
163
  });
164
164
  server.registerTool("datalab_shopping_category", {
165
- description: "🛍️ STEP 2: Analyze shopping category trends over time. Use find_category first to get category codes. BUSINESS CASES: Market size analysis, seasonal trend identification, category performance comparison. EXAMPLE: Compare '패션의류' vs '화장품' trends over 6 months. For current period analysis, use get_current_korean_time to set proper date ranges. (네이버 쇼핑 카테고리별 트렌드 분석 - 먼저 find_category 도구로 카테고리 코드를 찾고, 현재 기간 분석시 get_current_korean_time으로 적절한 날짜 범위 설정)",
165
+ description: "🛍️ STEP 2: Analyze shopping category trends over time. Use find_category first to get category codes. BUSINESS CASES: Market size analysis, seasonal trend identification, category performance comparison. EXAMPLE: Compare '패션의류' vs '화장품' trends over 6 months. (네이버 쇼핑 카테고리별 트렌드 분석 - 먼저 find_category 도구로 카테고리 코드를 찾으세요)",
166
166
  inputSchema: DatalabShoppingSchema.shape,
167
167
  }, async (args) => {
168
168
  const result = await datalabToolHandlers.datalab_shopping_category(args);
@@ -171,7 +171,7 @@ export function createNaverSearchServer({ config, }) {
171
171
  };
172
172
  });
173
173
  server.registerTool("datalab_shopping_by_device", {
174
- description: "📱 Analyze shopping trends by device (PC vs Mobile). Use find_category first. BUSINESS CASES: Mobile commerce strategy, responsive design priority, device-specific campaigns. EXAMPLE: 'PC 사용자가 더 많이 구매하는 카테고리는?' For current device trends, use get_current_korean_time to set proper analysis period. (기기별 쇼핑 트렌드 분석 - 먼저 find_category 도구로 카테고리 코드를 찾고, 현재 기기 트렌드 분석시 get_current_korean_time으로 적절한 분석 기간 설정)",
174
+ description: "📱 Analyze shopping trends by device (PC vs Mobile). Use find_category first. BUSINESS CASES: Mobile commerce strategy, responsive design priority, device-specific campaigns. EXAMPLE: 'PC 사용자가 더 많이 구매하는 카테고리는?' (기기별 쇼핑 트렌드 분석 - 먼저 find_category 도구로 카테고리 코드를 찾으세요)",
175
175
  inputSchema: DatalabShoppingDeviceSchema.pick({
176
176
  startDate: true,
177
177
  endDate: true,
@@ -186,7 +186,7 @@ export function createNaverSearchServer({ config, }) {
186
186
  };
187
187
  });
188
188
  server.registerTool("datalab_shopping_by_gender", {
189
- description: "👥 Analyze shopping trends by gender (Male vs Female). Use find_category first. BUSINESS CASES: Gender-targeted marketing, product positioning, demographic analysis. EXAMPLE: '화장품 쇼핑에서 남녀 비율은?' For current gender trends, use get_current_korean_time to set proper analysis period. (성별 쇼핑 트렌드 분석 - 먼저 find_category 도구로 카테고리 코드를 찾고, 현재 성별 트렌드 분석시 get_current_korean_time으로 적절한 분석 기간 설정)",
189
+ description: "👥 Analyze shopping trends by gender (Male vs Female). Use find_category first. BUSINESS CASES: Gender-targeted marketing, product positioning, demographic analysis. EXAMPLE: '화장품 쇼핑에서 남녀 비율은?' (성별 쇼핑 트렌드 분석 - 먼저 find_category 도구로 카테고리 코드를 찾으세요)",
190
190
  inputSchema: DatalabShoppingGenderSchema.pick({
191
191
  startDate: true,
192
192
  endDate: true,
@@ -201,7 +201,7 @@ export function createNaverSearchServer({ config, }) {
201
201
  };
202
202
  });
203
203
  server.registerTool("datalab_shopping_by_age", {
204
- description: "👶👦👨👴 Analyze shopping trends by age groups (10s, 20s, 30s, 40s, 50s, 60s+). Use find_category first. BUSINESS CASES: Age-targeted products, generational preferences, lifecycle marketing. EXAMPLE: '개발 도구는 어느 연령대가 많이 구매하나?' For current age trends, use get_current_korean_time to set proper analysis period. (연령별 쇼핑 트렌드 - 먼저 find_category 도구로 카테고리 코드를 찾고, 현재 연령 트렌드 분석시 get_current_korean_time으로 적절한 분석 기간 설정)",
204
+ description: "👶👦👨👴 Analyze shopping trends by age groups (10s, 20s, 30s, 40s, 50s, 60s+). Use find_category first. BUSINESS CASES: Age-targeted products, generational preferences, lifecycle marketing. EXAMPLE: '개발 도구는 어느 연령대가 많이 구매하나?' (연령별 쇼핑 트렌드 - 먼저 find_category 도구로 카테고리 코드를 찾으세요)",
205
205
  inputSchema: DatalabShoppingAgeSchema.pick({
206
206
  startDate: true,
207
207
  endDate: true,
@@ -216,7 +216,7 @@ export function createNaverSearchServer({ config, }) {
216
216
  };
217
217
  });
218
218
  server.registerTool("datalab_shopping_keywords", {
219
- description: "🔍 Compare specific keywords within a shopping category. Use find_category first. BUSINESS CASES: Product keyword optimization, competitor analysis, search trend identification. EXAMPLE: Within '패션' category, compare '원피스' vs '자켓' vs '드레스' trends. For current keyword trends, use get_current_korean_time to set proper analysis period. (카테고리 내 키워드 비교 - 먼저 find_category 도구로 카테고리 코드를 찾고, 현재 키워드 트렌드 분석시 get_current_korean_time으로 적절한 분석 기간 설정)",
219
+ description: "🔍 Compare specific keywords within a shopping category. Use find_category first. BUSINESS CASES: Product keyword optimization, competitor analysis, search trend identification. EXAMPLE: Within '패션' category, compare '원피스' vs '자켓' vs '드레스' trends. (카테고리 내 키워드 비교 - 먼저 find_category 도구로 카테고리 코드를 찾으세요)",
220
220
  inputSchema: DatalabShoppingKeywordsSchema.shape,
221
221
  }, async (args) => {
222
222
  const result = await datalabToolHandlers.datalab_shopping_keywords(args);
@@ -11,7 +11,12 @@
11
11
  export declare function resolveDate(dateStr: string): string;
12
12
  /**
13
13
  * Get current Korean Standard Time (KST) date string
14
- * KST is UTC+9
14
+ *
15
+ * 직접 오프셋을 더하지 않는다. now.getTime() 은 이미 UTC 기준 epoch 이라
16
+ * 거기에 9시간과 getTimezoneOffset() 을 함께 더하면 프로세스의 로컬
17
+ * 타임존만큼 이중 보정된다. TZ=Asia/Seoul 인 호스트에서는 00:00~09:00 KST
18
+ * 사이에 하루 전 날짜가 나온다. 타임존 변환은 Intl 에 맡긴다.
19
+ * en-CA 로케일이 yyyy-mm-dd 를 준다.
15
20
  *
16
21
  * @returns Date string in yyyy-mm-dd format
17
22
  */
@@ -22,19 +22,22 @@ export function resolveDate(dateStr) {
22
22
  }
23
23
  /**
24
24
  * Get current Korean Standard Time (KST) date string
25
- * KST is UTC+9
25
+ *
26
+ * 직접 오프셋을 더하지 않는다. now.getTime() 은 이미 UTC 기준 epoch 이라
27
+ * 거기에 9시간과 getTimezoneOffset() 을 함께 더하면 프로세스의 로컬
28
+ * 타임존만큼 이중 보정된다. TZ=Asia/Seoul 인 호스트에서는 00:00~09:00 KST
29
+ * 사이에 하루 전 날짜가 나온다. 타임존 변환은 Intl 에 맡긴다.
30
+ * en-CA 로케일이 yyyy-mm-dd 를 준다.
26
31
  *
27
32
  * @returns Date string in yyyy-mm-dd format
28
33
  */
29
34
  export function getKoreanToday() {
30
- const now = new Date();
31
- // Convert to KST (UTC+9)
32
- const kstOffset = 9 * 60 * 60 * 1000; // 9 hours in milliseconds
33
- const kstTime = new Date(now.getTime() + kstOffset + (now.getTimezoneOffset() * 60 * 1000));
34
- const year = kstTime.getUTCFullYear();
35
- const month = String(kstTime.getUTCMonth() + 1).padStart(2, '0');
36
- const day = String(kstTime.getUTCDate()).padStart(2, '0');
37
- return `${year}-${month}-${day}`;
35
+ return new Intl.DateTimeFormat('en-CA', {
36
+ timeZone: 'Asia/Seoul',
37
+ year: 'numeric',
38
+ month: '2-digit',
39
+ day: '2-digit',
40
+ }).format(new Date());
38
41
  }
39
42
  /**
40
43
  * Resolve both startDate and endDate, handling "today" keyword
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isnow890/naver-search-mcp",
3
- "version": "1.0.49",
3
+ "version": "1.0.51",
4
4
  "description": "Naver Search MCP Server",
5
5
  "main": "dist/src/index.js",
6
6
  "module": "./src/index.ts",