Korean public data gateway — data.go.kr (80,000+ APIs)
Three tools with strong naming (verb_noun pattern: discover_api, describe_api, call_api) and comprehensive descriptions (180-280 chars each). All parameters have type definitions and descriptions. Tool descriptions include workflow guidance and error recovery hints. However, output schemas are not formally documented in the visible code, responses are inferred from implementation. Parameter descriptions are detailed but could be more concise. No enum constraints on string parameters. Error handling is present but generic (returns JSON error objects without actionable recovery guidance beyond 'apply for access').
Call a Korean public data API with automatic serviceKey injection. WORKFLOW: always discover_api → describe_api → call_api. Do NOT call this tool with a serviceId from discover_api; call_api takes a full 'url' string returned by describe_api under operations[].url, NOT a serviceId. The 'params' argument is a JSON STRING (not an object), e.g. params="{\"pageNo\":\"1\",\"numOfRows\":\"5\"}". If the call fails with ACCESS_DENIED, the user needs to apply for access to this specific API at data.go.kr.
Get the request parameters and response schema of a specific data.go.kr API. Input is the serviceId from discover_api results. Returns operations[].url and request_parameters[] — these are the required inputs for call_api. Always call this between discover_api and call_api; never pass a serviceId directly to call_api.
Search Korean public data APIs on data.go.kr by keyword. Returns API names, descriptions, providers, and serviceIds. Use this when the user asks about Korean government data. WORKFLOW: the returned serviceId is the input for describe_api (not call_api). Always follow up with describe_api to get the actual endpoint url and parameter schema before calling call_api.
Output schemas not formally documented. Tool descriptions mention what is returned (e.g., 'operations[].url', 'request_parameters[]') but no JSON Schema or structured schema definition is visible in code. LLMs cannot reliably parse unstructured responses.
Error responses are generic JSON objects with 'error' field. No error classification (retryable vs. user-fixable vs. fatal) or actionable recovery guidance. E.g., 'Invalid params JSON' does not suggest what format is expected; 'Request timed out' does not suggest retry strategy.
Parameter 'params' in call_api requires JSON string format but description includes escaped quotes in example ('{\"pageNo\":\"1\",\"numOfRows\":\"5\"}'), which is confusing. LLMs may misinterpret escaping rules and pass malformed JSON.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | <=2025-11-25 | v2 |
No pagination parameters visible in discover_api (page, pageSize are present but no total count or next_cursor returned). Large result sets could overflow context. Tool description does not state result limit.
call_api accepts 'url' as free-form string with domain whitelist validation, but no enum or pattern constraint in schema. Validation happens at runtime; LLM has no upfront guidance on valid URL formats.