MCP server that provides access to Naver Search API for Korean local information, including shopping prices, cafe reviews, news, blogs, and local business information
Single tool with adequate naming and present schema, but critical shortcomings in parameter descriptions, output documentation, and error handling. Tool name 'search_naver' correctly uses verb_noun pattern. However, parameter descriptions lack crucial constraints (e.g., enum values for 'category' are listed in tool docstring but NOT formalized in schema; 'display' has no bounds). Output is unstructured free-text string, not typed objects. Error handling returns raw exception strings without recovery guidance. The tool definition is explicitly registered in code (@mcp.tool() decorator), so not capped at 50. However, multiple pattern violations and missing documentation push the score to the lower-middle range.
네이버 검색 API를 사용하여 한국 현지 정보를 검색합니다. Args: query (str): 검색어 (예: "맥북프로 M4 최저가", "삼성전자 주가 뉴스") category (str): 검색 카테고리 - "shop": 쇼핑 최저가 검색 (★인기 기능) - "cafe": 네이버 카페 글 검색 (★찐 후기) - "news": 실시간 뉴스 기사 - "blog": 블로그 리뷰 - "local": 맛집, 장소 전화번호 display (int): 가져올 결과 개수 (기본 5개)
Category parameter accepts enumerated values ('shop', 'cafe', 'news', 'blog', 'local') but schema does not declare enum constraint. Free-form string invites hallucinated invalid values. LLM has no machine-parseable way to discover valid options.
Display parameter lacks bounds documentation. Schema specifies type integer with default 5, but no minimum/maximum constraints (e.g., 1-100). LLM could pass absurd values (0, -5, 10000) causing API errors or timeouts.
Output is unstructured free-text string. LLM cannot extract typed fields (title, price, link) programmatically. Response must be parsed by regex or natural-language understanding, inviting errors and wasting tokens. No pagination support despite potentially returning many results.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2026-07-28+ | v2 |
Error handling returns raw exception strings ('오류 발생: {str(e)}') without recovery guidance. LLM learns nothing about why it failed or what to try next. No categorization (retryable vs. fatal).
Tool description is in Korean, which is appropriate for localization, but mixes Korean UI strings with English parameter documentation. Parameter descriptions in schema (query, category, display) lack detailed constraints, category values are documented in the tool docstring but not in the JSON schema where the LLM discovers them.
No pagination support. Tool accepts 'display' parameter (how many results) but no way to fetch next page. If LLM requests 5 results and wants more, it must call the tool again with same query, wasting API quota and introducing duplicate handling logic.
Naver API credentials (NAVER_CLIENT_ID, NAVER_CLIENT_SECRET) are injected via environment variables, which is correct. However, if an error occurs (e.g., HTTP 401), the exception string might leak auth details. No sanitization of error responses before returning to LLM.