smart-web-mcp 0.35.1 → 0.37.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.
@@ -0,0 +1,526 @@
1
+ import { formatError, httpGet, proxyGet } from "./proxy-client.js";
2
+ const KAKAO_KEYWORD_SEARCH = "https://dapi.kakao.com/v2/local/search/keyword.json";
3
+ const KAKAO_CATEGORY_SEARCH = "https://dapi.kakao.com/v2/local/search/category.json";
4
+ const GOOGLE_NEARBY_SEARCH = "https://maps.googleapis.com/maps/api/place/nearbysearch/json";
5
+ const GOOGLE_TEXT_SEARCH = "https://maps.googleapis.com/maps/api/place/textsearch/json";
6
+ const GOOGLE_GEOCODE = "https://maps.googleapis.com/maps/api/geocode/json";
7
+ const NAVER_LOCAL_SEARCH = "https://openapi.naver.com/v1/search/local.json";
8
+ function envFirst(names) {
9
+ for (const name of names) {
10
+ const value = process.env[name];
11
+ if (value)
12
+ return value;
13
+ }
14
+ return "";
15
+ }
16
+ function stripHtml(value) {
17
+ return value
18
+ .replace(/<\/?b>/gi, "")
19
+ .replace(/<[^>]+>/g, " ")
20
+ .replace(/&amp;/g, "&")
21
+ .replace(/&lt;/g, "<")
22
+ .replace(/&gt;/g, ">")
23
+ .replace(/&quot;/g, "\"")
24
+ .replace(/&#39;/g, "'")
25
+ .replace(/\s+/g, " ")
26
+ .trim();
27
+ }
28
+ function asNumber(value) {
29
+ const parsed = Number(String(value ?? "").replace(/,/g, ""));
30
+ return Number.isFinite(parsed) ? parsed : undefined;
31
+ }
32
+ function normalizeName(value) {
33
+ return stripHtml(value).toLowerCase().replace(/[\s·・.,'"()\[\]-]+/g, "");
34
+ }
35
+ function normalizedAddress(value) {
36
+ return stripHtml(value || "").toLowerCase().replace(/\s+/g, "");
37
+ }
38
+ function haversineM(lat1, lon1, lat2, lon2) {
39
+ const R = 6371000;
40
+ const dLat = ((lat2 - lat1) * Math.PI) / 180;
41
+ const dLon = ((lon2 - lon1) * Math.PI) / 180;
42
+ const a = Math.sin(dLat / 2) ** 2 + Math.cos((lat1 * Math.PI) / 180) * Math.cos((lat2 * Math.PI) / 180) * Math.sin(dLon / 2) ** 2;
43
+ return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
44
+ }
45
+ function providerUrl(url, params) {
46
+ const parsed = new URL(url);
47
+ for (const [key, value] of Object.entries(params)) {
48
+ if (value !== undefined && value !== "")
49
+ parsed.searchParams.set(key, String(value));
50
+ }
51
+ return parsed.toString();
52
+ }
53
+ function stringParams(params) {
54
+ const entries = {};
55
+ for (const [key, value] of Object.entries(params)) {
56
+ if (value !== undefined && value !== "")
57
+ entries[key] = String(value);
58
+ }
59
+ return entries;
60
+ }
61
+ async function kakaoLocalGet(path, directUrl, params, timeoutMs) {
62
+ const key = envFirst(["KAKAO_REST_API_KEY", "KAKAO_API_KEY"]);
63
+ if (key)
64
+ return httpGet(providerUrl(directUrl, params), { Authorization: `KakaoAK ${key}` }, timeoutMs);
65
+ return proxyGet(path, stringParams(params), timeoutMs);
66
+ }
67
+ function categoryForIntent(intent) {
68
+ if (intent === "food" || intent === "date")
69
+ return "FD6";
70
+ if (intent === "cafe" || intent === "work")
71
+ return "CE7";
72
+ if (intent === "errand")
73
+ return "CS2";
74
+ if (intent === "walk" || intent === "dog_walk")
75
+ return "AT4";
76
+ return undefined;
77
+ }
78
+ function defaultQueryForIntent(intent) {
79
+ switch (intent) {
80
+ case "food": return "맛집";
81
+ case "cafe": return "카페";
82
+ case "walk": return "공원 산책로";
83
+ case "dog_walk": return "강아지 산책 애견동반";
84
+ case "errand": return "편의점";
85
+ case "date": return "데이트 맛집";
86
+ case "work": return "작업하기 좋은 카페";
87
+ default: return "맛집";
88
+ }
89
+ }
90
+ function expandedQueries(query, intent) {
91
+ const primary = query.trim() || defaultQueryForIntent(intent);
92
+ const extras = intent === "dog_walk"
93
+ ? ["공원", "산책로", "애견동반 카페", "하천 산책"]
94
+ : intent === "walk"
95
+ ? ["공원", "산책로", "하천 산책"]
96
+ : intent === "work"
97
+ ? ["콘센트 카페", "조용한 카페"]
98
+ : [];
99
+ return [...new Set([primary, ...extras])].slice(0, 5);
100
+ }
101
+ function classifyCategory(types) {
102
+ const values = types || [];
103
+ if (values.includes("cafe"))
104
+ return "카페";
105
+ if (values.includes("restaurant") || values.includes("food"))
106
+ return "음식점";
107
+ if (values.includes("park"))
108
+ return "공원";
109
+ if (values.includes("convenience_store"))
110
+ return "편의점";
111
+ return values.slice(0, 3).join(" > ");
112
+ }
113
+ function toProviderError(provider, code, status, message) {
114
+ return { provider, code, status, message: message.replace(/\s+/g, " ").slice(0, 240) };
115
+ }
116
+ async function resolveAnchor(options, timeoutMs, errors) {
117
+ const label = options.location?.trim() || "input coordinates";
118
+ if (options.lat !== undefined && options.lon !== undefined)
119
+ return { label, lat: options.lat, lon: options.lon, provider: "input" };
120
+ if (!options.location?.trim())
121
+ return undefined;
122
+ const anchorParams = { query: options.location, size: 1 };
123
+ const anchorResult = await kakaoLocalGet("/v1/kakao-map/search/keyword", KAKAO_KEYWORD_SEARCH, anchorParams, timeoutMs);
124
+ if (anchorResult.ok) {
125
+ const doc = anchorResult.data.documents?.[0];
126
+ const lat = asNumber(doc?.y);
127
+ const lon = asNumber(doc?.x);
128
+ if (lat !== undefined && lon !== undefined)
129
+ return { label: doc?.place_name || options.location, lat, lon, provider: "kakao" };
130
+ }
131
+ else {
132
+ errors.push(toProviderError("anchor", anchorResult.code, anchorResult.status, formatError(anchorResult)));
133
+ }
134
+ const googleKey = envFirst(["GOOGLE_PLACES_API_KEY", "GOOGLE_MAPS_API_KEY", "GOOGLE_API_KEY"]);
135
+ if (googleKey) {
136
+ const url = providerUrl(GOOGLE_GEOCODE, { address: options.location, language: "ko", key: googleKey });
137
+ const result = await httpGet(url, {}, timeoutMs);
138
+ if (result.ok && result.data.status === "OK") {
139
+ const first = result.data.results?.[0];
140
+ const lat = asNumber(first?.geometry?.location?.lat);
141
+ const lon = asNumber(first?.geometry?.location?.lng);
142
+ if (lat !== undefined && lon !== undefined)
143
+ return { label: first?.formatted_address || options.location, lat, lon, provider: "google" };
144
+ }
145
+ else if (!result.ok) {
146
+ errors.push(toProviderError("anchor", result.code, result.status, formatError(result)));
147
+ }
148
+ else if (result.data.status && result.data.status !== "ZERO_RESULTS") {
149
+ errors.push(toProviderError("anchor", String(result.data.status).toLowerCase(), 0, result.data.error_message || result.data.status));
150
+ }
151
+ }
152
+ return undefined;
153
+ }
154
+ function kakaoItem(doc, anchor) {
155
+ const name = stripHtml(doc.place_name || "");
156
+ if (!name)
157
+ return null;
158
+ const lat = asNumber(doc.y);
159
+ const lon = asNumber(doc.x);
160
+ const parsedDistance = asNumber(doc.distance);
161
+ const distance = parsedDistance !== undefined ? Math.round(parsedDistance) : anchor && lat !== undefined && lon !== undefined ? Math.round(haversineM(anchor.lat, anchor.lon, lat, lon)) : undefined;
162
+ return {
163
+ name,
164
+ ...(doc.category_name ? { category: stripHtml(doc.category_name) } : {}),
165
+ ...(doc.address_name ? { address: stripHtml(doc.address_name) } : {}),
166
+ ...(doc.road_address_name ? { road_address: stripHtml(doc.road_address_name) } : {}),
167
+ ...(lat !== undefined ? { lat } : {}),
168
+ ...(lon !== undefined ? { lon } : {}),
169
+ ...(distance !== undefined ? { distance_m: distance } : {}),
170
+ ...(doc.phone ? { phone: stripHtml(doc.phone) } : {}),
171
+ ...(doc.id ? { kakao_place_id: doc.id } : {}),
172
+ links: { ...(doc.place_url ? { kakao: doc.place_url } : {}) },
173
+ providers: ["kakao"],
174
+ score: 0,
175
+ score_reasons: [],
176
+ };
177
+ }
178
+ function googleItem(place, anchor) {
179
+ const name = stripHtml(place.name || "");
180
+ if (!name)
181
+ return null;
182
+ const lat = asNumber(place.geometry?.location?.lat);
183
+ const lon = asNumber(place.geometry?.location?.lng);
184
+ const distance = anchor && lat !== undefined && lon !== undefined ? Math.round(haversineM(anchor.lat, anchor.lon, lat, lon)) : undefined;
185
+ const rating = asNumber(place.rating);
186
+ const reviewCount = asNumber(place.user_ratings_total);
187
+ return {
188
+ name,
189
+ ...(classifyCategory(place.types) ? { category: classifyCategory(place.types) } : {}),
190
+ ...(place.formatted_address || place.vicinity ? { address: stripHtml(place.formatted_address || place.vicinity || "") } : {}),
191
+ ...(lat !== undefined ? { lat } : {}),
192
+ ...(lon !== undefined ? { lon } : {}),
193
+ ...(distance !== undefined ? { distance_m: distance } : {}),
194
+ ...(rating !== undefined ? { rating } : {}),
195
+ ...(reviewCount !== undefined ? { review_count: reviewCount } : {}),
196
+ ...(place.opening_hours?.open_now !== undefined ? { open_now: place.opening_hours.open_now } : {}),
197
+ ...(place.business_status ? { business_status: place.business_status } : {}),
198
+ ...(place.place_id ? { google_place_id: place.place_id } : {}),
199
+ links: { ...(place.place_id ? { google: `https://www.google.com/maps/place/?q=place_id:${place.place_id}` } : {}) },
200
+ providers: ["google"],
201
+ score: 0,
202
+ score_reasons: [],
203
+ };
204
+ }
205
+ function naverItem(item) {
206
+ const name = stripHtml(item.title || "");
207
+ if (!name)
208
+ return null;
209
+ return {
210
+ name,
211
+ ...(item.category ? { category: stripHtml(item.category) } : {}),
212
+ ...(item.address ? { address: stripHtml(item.address) } : {}),
213
+ ...(item.roadAddress ? { road_address: stripHtml(item.roadAddress) } : {}),
214
+ ...(item.telephone ? { phone: stripHtml(item.telephone) } : {}),
215
+ ...(item.mapx ? { naver_mapx: item.mapx } : {}),
216
+ ...(item.mapy ? { naver_mapy: item.mapy } : {}),
217
+ links: { ...(item.link ? { naver: item.link } : {}) },
218
+ providers: ["naver"],
219
+ score: 0,
220
+ score_reasons: [],
221
+ };
222
+ }
223
+ function mergeItem(base, incoming) {
224
+ base.providers = [...new Set([...base.providers, ...incoming.providers])];
225
+ base.links = { ...base.links, ...incoming.links };
226
+ if (!base.category && incoming.category !== undefined)
227
+ base.category = incoming.category;
228
+ if (!base.address && incoming.address !== undefined)
229
+ base.address = incoming.address;
230
+ if (!base.road_address && incoming.road_address !== undefined)
231
+ base.road_address = incoming.road_address;
232
+ if (!base.phone && incoming.phone !== undefined)
233
+ base.phone = incoming.phone;
234
+ if (base.lat === undefined && incoming.lat !== undefined)
235
+ base.lat = incoming.lat;
236
+ if (base.lon === undefined && incoming.lon !== undefined)
237
+ base.lon = incoming.lon;
238
+ if (incoming.distance_m !== undefined)
239
+ base.distance_m = base.distance_m === undefined ? incoming.distance_m : Math.min(base.distance_m, incoming.distance_m);
240
+ const rating = Math.max(base.rating ?? 0, incoming.rating ?? 0);
241
+ if (rating > 0)
242
+ base.rating = rating;
243
+ const reviewCount = Math.max(base.review_count ?? 0, incoming.review_count ?? 0);
244
+ if (reviewCount > 0)
245
+ base.review_count = reviewCount;
246
+ const blogReviewCount = Math.max(base.blog_review_count ?? 0, incoming.blog_review_count ?? 0);
247
+ if (blogReviewCount > 0)
248
+ base.blog_review_count = blogReviewCount;
249
+ if (base.open_now === undefined && incoming.open_now !== undefined)
250
+ base.open_now = incoming.open_now;
251
+ if (!base.business_status && incoming.business_status !== undefined)
252
+ base.business_status = incoming.business_status;
253
+ if (!base.google_place_id && incoming.google_place_id !== undefined)
254
+ base.google_place_id = incoming.google_place_id;
255
+ if (!base.kakao_place_id && incoming.kakao_place_id !== undefined)
256
+ base.kakao_place_id = incoming.kakao_place_id;
257
+ if (!base.naver_mapx && incoming.naver_mapx !== undefined)
258
+ base.naver_mapx = incoming.naver_mapx;
259
+ if (!base.naver_mapy && incoming.naver_mapy !== undefined)
260
+ base.naver_mapy = incoming.naver_mapy;
261
+ }
262
+ function samePlace(a, b) {
263
+ if (a.google_place_id && b.google_place_id && a.google_place_id === b.google_place_id)
264
+ return true;
265
+ if (a.kakao_place_id && b.kakao_place_id && a.kakao_place_id === b.kakao_place_id)
266
+ return true;
267
+ const sameName = normalizeName(a.name) === normalizeName(b.name);
268
+ if (!sameName)
269
+ return false;
270
+ const addrA = normalizedAddress(a.road_address || a.address);
271
+ const addrB = normalizedAddress(b.road_address || b.address);
272
+ if (addrA && addrB && (addrA.includes(addrB) || addrB.includes(addrA)))
273
+ return true;
274
+ if (a.lat !== undefined && a.lon !== undefined && b.lat !== undefined && b.lon !== undefined)
275
+ return haversineM(a.lat, a.lon, b.lat, b.lon) <= 80;
276
+ return false;
277
+ }
278
+ function dedupeItems(items) {
279
+ const merged = [];
280
+ for (const item of items) {
281
+ const existing = merged.find((candidate) => samePlace(candidate, item));
282
+ if (existing)
283
+ mergeItem(existing, item);
284
+ else
285
+ merged.push(item);
286
+ }
287
+ return merged;
288
+ }
289
+ function scoreItem(item, options) {
290
+ const reasons = [];
291
+ let score = 0;
292
+ const rating = item.rating ?? 0;
293
+ const reviews = item.review_count ?? 0;
294
+ const distance = item.distance_m;
295
+ const nameMatch = options.query && normalizeName(item.name).includes(normalizeName(options.query));
296
+ if (distance !== undefined) {
297
+ const distanceScore = Math.max(0, 28 * (1 - Math.min(distance, options.radiusM) / Math.max(options.radiusM, 1)));
298
+ score += distanceScore;
299
+ reasons.push(`${distance}m`);
300
+ }
301
+ if (rating > 0) {
302
+ score += Math.max(0, Math.min(25, (rating - 3) * 12.5));
303
+ reasons.push(`평점 ${rating}`);
304
+ }
305
+ if (reviews > 0) {
306
+ score += Math.min(24, Math.log10(reviews + 1) * 8);
307
+ reasons.push(`리뷰 ${reviews.toLocaleString("ko-KR")}`);
308
+ }
309
+ if (item.providers.length > 1) {
310
+ score += item.providers.length * 4;
311
+ reasons.push(`${item.providers.length}개 지도 소스 일치`);
312
+ }
313
+ if (nameMatch) {
314
+ score += 5;
315
+ reasons.push("검색어 일치");
316
+ }
317
+ const category = `${item.category || ""} ${item.name}`;
318
+ if ((options.intent === "food" || options.intent === "date") && /음식|맛집|식당|한식|중식|일식|양식|고기|분식|술집/u.test(category))
319
+ score += 5;
320
+ if ((options.intent === "cafe" || options.intent === "work") && /카페|커피/u.test(category))
321
+ score += 5;
322
+ if ((options.intent === "walk" || options.intent === "dog_walk") && /공원|산책|하천|탄천|둘레길/u.test(category))
323
+ score += 6;
324
+ if (options.intent === "dog_walk" && /애견|반려견|강아지|공원|산책/u.test(category))
325
+ score += 5;
326
+ if (item.open_now === true) {
327
+ score += 2;
328
+ reasons.push("영업중");
329
+ }
330
+ item.score = Number(score.toFixed(2));
331
+ item.score_reasons = reasons.slice(0, 5);
332
+ }
333
+ function sortItems(items, sort) {
334
+ const distance = (item) => item.distance_m ?? Number.POSITIVE_INFINITY;
335
+ const rating = (item) => item.rating ?? 0;
336
+ const reviews = (item) => item.review_count ?? 0;
337
+ if (sort === "distance")
338
+ return items.sort((a, b) => distance(a) - distance(b) || b.score - a.score);
339
+ if (sort === "rating")
340
+ return items.sort((a, b) => rating(b) - rating(a) || reviews(b) - reviews(a) || distance(a) - distance(b));
341
+ if (sort === "review_count")
342
+ return items.sort((a, b) => reviews(b) - reviews(a) || rating(b) - rating(a) || distance(a) - distance(b));
343
+ return items.sort((a, b) => b.score - a.score || distance(a) - distance(b));
344
+ }
345
+ async function searchKakao(queries, anchor, options, timeoutMs, errors) {
346
+ const radius = options.radiusM ?? 1500;
347
+ const size = Math.min(15, Math.max(1, options.limit ?? 10));
348
+ const items = [];
349
+ const seen = new Set();
350
+ const category = categoryForIntent(options.intent ?? "auto");
351
+ const requests = [...queries];
352
+ if (category)
353
+ requests.push(`category:${category}`);
354
+ for (const query of requests) {
355
+ const isCategory = query.startsWith("category:");
356
+ const params = isCategory
357
+ ? { category_group_code: query.slice("category:".length), size, radius, sort: anchor ? "distance" : "accuracy" }
358
+ : { query, size, radius, sort: anchor ? "distance" : "accuracy" };
359
+ if (anchor) {
360
+ params.x = anchor.lon;
361
+ params.y = anchor.lat;
362
+ }
363
+ const dedupeKey = `${isCategory ? "category" : "keyword"}:${JSON.stringify(stringParams(params))}`;
364
+ if (seen.has(dedupeKey))
365
+ continue;
366
+ seen.add(dedupeKey);
367
+ const result = await kakaoLocalGet(isCategory ? "/v1/kakao-map/search/category" : "/v1/kakao-map/search/keyword", isCategory ? KAKAO_CATEGORY_SEARCH : KAKAO_KEYWORD_SEARCH, params, timeoutMs);
368
+ if (!result.ok) {
369
+ errors.push(toProviderError("kakao", result.code, result.status, formatError(result)));
370
+ continue;
371
+ }
372
+ for (const doc of result.data.documents || []) {
373
+ const item = kakaoItem(doc, anchor);
374
+ if (item)
375
+ items.push(item);
376
+ }
377
+ }
378
+ return items;
379
+ }
380
+ async function searchGoogle(queries, anchor, options, timeoutMs, errors) {
381
+ const key = envFirst(["GOOGLE_PLACES_API_KEY", "GOOGLE_MAPS_API_KEY", "GOOGLE_API_KEY"]);
382
+ if (!key)
383
+ return [];
384
+ const radius = options.radiusM ?? 1500;
385
+ const items = [];
386
+ const seen = new Set();
387
+ for (const query of queries.slice(0, 3)) {
388
+ const url = anchor
389
+ ? providerUrl(GOOGLE_NEARBY_SEARCH, { location: `${anchor.lat},${anchor.lon}`, radius, keyword: query, language: "ko", key })
390
+ : providerUrl(GOOGLE_TEXT_SEARCH, { query: [options.location, query].filter(Boolean).join(" "), language: "ko", key });
391
+ if (seen.has(url))
392
+ continue;
393
+ seen.add(url);
394
+ const result = await httpGet(url, {}, timeoutMs);
395
+ if (!result.ok) {
396
+ errors.push(toProviderError("google", result.code, result.status, formatError(result)));
397
+ continue;
398
+ }
399
+ if (result.data.status && !["OK", "ZERO_RESULTS"].includes(result.data.status)) {
400
+ errors.push(toProviderError("google", result.data.status.toLowerCase(), 0, result.data.error_message || result.data.status));
401
+ continue;
402
+ }
403
+ for (const place of result.data.results || []) {
404
+ const item = googleItem(place, anchor);
405
+ if (item)
406
+ items.push(item);
407
+ }
408
+ }
409
+ return items;
410
+ }
411
+ async function searchNaver(queries, options, timeoutMs, errors) {
412
+ const clientId = envFirst(["NAVER_CLIENT_ID", "NAVER_SEARCH_CLIENT_ID", "NAVER_OPENAPI_CLIENT_ID"]);
413
+ const clientSecret = envFirst(["NAVER_CLIENT_SECRET", "NAVER_SEARCH_CLIENT_SECRET", "NAVER_OPENAPI_CLIENT_SECRET"]);
414
+ if (!clientId || !clientSecret)
415
+ return [];
416
+ const display = Math.min(10, Math.max(1, options.limit ?? 10));
417
+ const items = [];
418
+ const seen = new Set();
419
+ for (const query of queries.slice(0, 3)) {
420
+ const searchQuery = [options.location, query].filter(Boolean).join(" ");
421
+ const url = providerUrl(NAVER_LOCAL_SEARCH, { query: searchQuery, display, start: 1, sort: "comment" });
422
+ if (seen.has(url))
423
+ continue;
424
+ seen.add(url);
425
+ const result = await httpGet(url, {
426
+ "X-Naver-Client-Id": clientId,
427
+ "X-Naver-Client-Secret": clientSecret,
428
+ }, timeoutMs);
429
+ if (!result.ok) {
430
+ errors.push(toProviderError("naver", result.code, result.status, formatError(result)));
431
+ continue;
432
+ }
433
+ for (const entry of result.data.items || []) {
434
+ const item = naverItem(entry);
435
+ if (item)
436
+ items.push(item);
437
+ }
438
+ }
439
+ return items;
440
+ }
441
+ export async function runPlaceSearch(options) {
442
+ const query = options.query?.trim() || defaultQueryForIntent(options.intent ?? "auto");
443
+ const intent = options.intent ?? "auto";
444
+ const sort = options.sort ?? "blended";
445
+ const radiusM = Math.max(50, Math.min(50000, Math.floor(options.radiusM ?? 1500)));
446
+ const limit = Math.max(1, Math.min(30, Math.floor(options.limit ?? 10)));
447
+ const timeoutMs = Math.max(3000, Math.min(60000, Math.floor(options.timeoutMs ?? 20000)));
448
+ const providersRequested = options.providers?.length ? [...new Set(options.providers)] : ["kakao", "google", "naver"];
449
+ const providerErrors = [];
450
+ const anchor = await resolveAnchor({ ...options, radiusM }, timeoutMs, providerErrors);
451
+ const queries = expandedQueries(query, intent);
452
+ const batches = [];
453
+ if (providersRequested.includes("kakao"))
454
+ batches.push(await searchKakao(queries, anchor, { ...options, radiusM, intent }, timeoutMs, providerErrors));
455
+ if (providersRequested.includes("google"))
456
+ batches.push(await searchGoogle(queries, anchor, { ...options, radiusM, intent }, timeoutMs, providerErrors));
457
+ if (providersRequested.includes("naver"))
458
+ batches.push(await searchNaver(queries, options, timeoutMs, providerErrors));
459
+ const providersUsed = [...new Set(batches.flat().flatMap((item) => item.providers))];
460
+ const items = dedupeItems(batches.flat());
461
+ for (const item of items)
462
+ scoreItem(item, { query, intent, sort, radiusM });
463
+ const ranked = sortItems(items, sort).slice(0, limit);
464
+ const warning = providersUsed.length === 0
465
+ ? "사용 가능한 장소 provider 결과가 없습니다. KAKAO_REST_API_KEY, GOOGLE_PLACES_API_KEY/GOOGLE_MAPS_API_KEY, NAVER_CLIENT_ID/NAVER_CLIENT_SECRET 중 하나 이상을 설정하거나 잠시 후 다시 시도하세요."
466
+ : anchor === undefined
467
+ ? "좌표 기준 검색이 불가능해 위치명+키워드 검색으로만 후보를 수집했습니다. lat/lon 또는 Kakao/Google 키를 제공하면 거리 랭킹이 좋아집니다."
468
+ : undefined;
469
+ return {
470
+ source: "kr-place-search",
471
+ query,
472
+ intent,
473
+ sort,
474
+ ...(options.location ? { location_hint: options.location } : {}),
475
+ ...(anchor ? { anchor } : {}),
476
+ radius_m: radiusM,
477
+ providers_requested: providersRequested,
478
+ providers_used: providersUsed,
479
+ provider_errors: providerErrors,
480
+ total: ranked.length,
481
+ items: ranked,
482
+ ...(warning ? { warning } : {}),
483
+ };
484
+ }
485
+ export function renderPlaceSearch(result) {
486
+ const lines = [];
487
+ const location = result.location_hint || result.anchor?.label || "지정 위치";
488
+ lines.push(`한국 장소 검색: ${location} · ${result.query}`);
489
+ if (result.anchor)
490
+ lines.push(`기준점: ${result.anchor.label} (${result.anchor.lat.toFixed(6)}, ${result.anchor.lon.toFixed(6)}, ${result.anchor.provider}) · 반경 ${result.radius_m}m`);
491
+ else
492
+ lines.push(`기준점: 좌표 없음 · 반경 ${result.radius_m}m`);
493
+ lines.push(`소스: ${result.providers_used.length ? result.providers_used.join("+") : "없음"} · 정렬: ${result.sort}`);
494
+ if (result.warning)
495
+ lines.push(`주의: ${result.warning}`);
496
+ if (result.items.length === 0) {
497
+ lines.push("검색 결과가 없습니다. 더 넓은 반경, 다른 키워드, 또는 지도 API 키 설정을 확인하세요.");
498
+ }
499
+ result.items.forEach((item, index) => {
500
+ const parts = [
501
+ item.category,
502
+ item.distance_m !== undefined ? `${item.distance_m}m` : undefined,
503
+ item.rating !== undefined ? `평점 ${item.rating}` : undefined,
504
+ item.review_count !== undefined ? `리뷰 ${item.review_count.toLocaleString("ko-KR")}` : undefined,
505
+ item.open_now === true ? "영업중" : item.open_now === false ? "영업외" : undefined,
506
+ ].filter(Boolean);
507
+ lines.push(`${index + 1}. ${item.name}${parts.length ? ` — ${parts.join(" · ")}` : ""}`);
508
+ const address = item.road_address || item.address;
509
+ if (address)
510
+ lines.push(` 주소: ${address}`);
511
+ if (item.phone)
512
+ lines.push(` 전화: ${item.phone}`);
513
+ if (item.score_reasons.length > 0)
514
+ lines.push(` 추천근거: ${item.score_reasons.join(", ")}`);
515
+ const links = Object.entries(item.links).filter(([, url]) => Boolean(url)).map(([provider, url]) => `${provider}: ${url}`);
516
+ if (links.length > 0)
517
+ lines.push(` 지도: ${links.join(" | ")}`);
518
+ });
519
+ if (result.provider_errors.length > 0) {
520
+ lines.push("Provider notes:");
521
+ for (const err of result.provider_errors.slice(0, 5))
522
+ lines.push(`- ${err.provider}: ${err.code} ${err.message}`);
523
+ }
524
+ return lines.join("\n");
525
+ }
526
+ //# sourceMappingURL=place-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"place-search.js","sourceRoot":"","sources":["../../src/korea/place-search.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import { SMARTFETCH_TARGETS } from "./smartfetch/targets.js";
5
5
  import { projectSmartcrawlOutput } from "./smartcrawl.js";
6
6
  import { resolveSmartfetchOutputBudget } from "./smartfetch.js";
7
7
  import { projectSmartsearchOutput } from "./smartsearch.js";
8
- import { renderCoupang, renderDart, renderDrugSafety, renderFineDust, renderFoodSafety, renderGeeknews, renderLaw, renderNaverNews, renderNaverShopping, renderPublicRestroom, renderRealEstate, renderSpellCheck, renderStock, renderSubway, renderWeather, renderZipcode, runCoupang, runDart, runDrugSafety, runFineDust, runFoodSafety, runGeeknews, runLaw, runNaverNews, runNaverShopping, runPublicRestroom, runRealEstate, runSpellCheck, runStock, runSubway, runWeather, runZipcode, } from "./korea/index.js";
8
+ import { renderCoupang, renderDart, renderDrugSafety, renderFineDust, renderFoodSafety, renderGeeknews, renderLaw, renderNaverNews, renderNaverShopping, renderPlaceSearch, renderPublicRestroom, renderRealEstate, renderSpellCheck, renderStock, renderSubway, renderWeather, renderZipcode, runCoupang, runDart, runDrugSafety, runFineDust, runFoodSafety, runGeeknews, runLaw, runNaverNews, runNaverShopping, runPlaceSearch, runPublicRestroom, runRealEstate, runSpellCheck, runStock, runSubway, runWeather, runZipcode, } from "./korea/index.js";
9
9
  const ISSUE_REPORT_GUIDANCE = "If smart-web returns reproducible incorrect or misleading output, open a GitHub issue on jojo-labs/smart-web with the exact input, arguments, observed output, expected behavior, and version. Skip obvious transient network/auth/rate-limit failures unless smart-web misclassified them.";
10
10
  function capMcpText(text, maxCharacters, label) {
11
11
  if (maxCharacters === undefined || text.length <= maxCharacters)
@@ -601,6 +601,37 @@ export function createSmartWebServer(version, runtime) {
601
601
  const r = result;
602
602
  return { structuredContent: r, content: [{ type: "text", text: renderLaw(r) }] };
603
603
  });
604
+ server.registerTool("kr_place_search", {
605
+ title: "한국 지도 장소 검색",
606
+ description: "카카오맵/구글 Places/네이버 로컬을 병합해 한국 내 맛집·카페·산책·강아지 산책·근처 장소 후보를 거리/평점/리뷰수 기준으로 추천. 위치 힌트 또는 위경도 입력 가능.",
607
+ inputSchema: {
608
+ query: z.string().optional().describe("검색어 (예: 삼겹살, 조용한 카페, 강아지 산책). 비우면 intent 기본값 사용"),
609
+ location: z.string().optional().describe("위치 힌트/기준점 (예: CU 성남만남밀알점, 하대원동, 현재 위치명)"),
610
+ lat: z.number().optional().describe("위도 (직접 입력 시 위치 해석 없이 거리 기준 검색)"),
611
+ lon: z.number().optional().describe("경도"),
612
+ radius_m: z.number().int().min(50).max(50000).optional().describe("검색 반경 m (기본 1500)"),
613
+ limit: z.number().int().min(1).max(30).optional().describe("반환 건수 (기본 10)"),
614
+ intent: z.enum(["auto", "food", "cafe", "walk", "dog_walk", "errand", "date", "work"]).optional().describe("추천 의도. dog_walk/walk는 공원·산책로·애견동반 후보를 확장 검색"),
615
+ sort: z.enum(["blended", "relevance", "distance", "rating", "review_count"]).optional().describe("정렬 기준 (기본 blended)"),
616
+ providers: z.array(z.enum(["kakao", "google", "naver"])).min(1).max(3).optional().describe("사용할 지도/장소 provider 목록 (기본 kakao+google+naver)"),
617
+ timeout_ms: z.number().int().min(3000).max(60000).optional(),
618
+ },
619
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: true },
620
+ }, async ({ query, location, lat, lon, radius_m, limit, intent, sort, providers, timeout_ms }) => {
621
+ const r = await runPlaceSearch({
622
+ ...(query === undefined ? {} : { query }),
623
+ ...(location === undefined ? {} : { location }),
624
+ ...(lat === undefined ? {} : { lat }),
625
+ ...(lon === undefined ? {} : { lon }),
626
+ ...(radius_m === undefined ? {} : { radiusM: radius_m }),
627
+ ...(limit === undefined ? {} : { limit }),
628
+ ...(intent === undefined ? {} : { intent }),
629
+ ...(sort === undefined ? {} : { sort }),
630
+ ...(providers === undefined ? {} : { providers }),
631
+ ...(timeout_ms === undefined ? {} : { timeoutMs: timeout_ms }),
632
+ });
633
+ return { structuredContent: r, content: [{ type: "text", text: renderPlaceSearch(r) }] };
634
+ });
604
635
  server.registerTool("kr_public_restroom", {
605
636
  title: "근처 공중화장실",
606
637
  description: "공공데이터포털 공중화장실 표준데이터 기반 근처 공중/개방화장실 조회. 위치 힌트(지명) 또는 위경도 직접 입력. 좌표 해석에 KAKAO_REST_API_KEY 환경변수 사용.",