@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
|
-
|
|
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: `
|
|
189
|
-
gender_analysis: `
|
|
190
|
-
device_analysis: `
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 사용자가 더 많이 구매하는 카테고리는?'
|
|
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: '화장품 쇼핑에서 남녀 비율은?'
|
|
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: '개발 도구는 어느 연령대가 많이 구매하나?'
|
|
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.
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|