The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Publicdata Kr listing page.
Korean public data API gateway. A Model Context Protocol (MCP) server that lets any MCP client discover, inspect, and call 80,000+ APIs on data.go.kr — weather, real estate, business registration, air quality, transit, and more. Built with C# and the official MCP C# SDK.
401/403 or SERVICE_KEY_IS_NOT_REGISTERED the cached key is invalidated and a re-elicit is attempted (session cap: 2 re-elicits)response/header/body/items wrapper, returns clean JSONAfter installation, the fieldcure-mcp-publicdata-kr command is available globally.
discover_api and describe_api depend on this API
(discover_api, describe_api 도구가 이 API를 사용합니다)This server requires a data.go.kr API key (공공데이터포털 인증키). Key resolution is lazy (on first tool call) and follows the FieldCure MCP Credential ADR:
DATA_GO_KR_API_KEY (canonical) or PUBLICDATA_API_KEY (legacy alias)tools/list still works and tool calls return a
structured error message asking the user to set the env var.--api-key <value> is also accepted as a CLI arg but is intended for manual testing only,
not as a supported configuration path.
Claude Code / Claude Desktop — add the key to your MCP config:
On Claude Code (≥ 2.1.76), if the env var is omitted the server prompts for the key via Elicitation on first use.
AssistStudio — the key is requested via Elicitation on first use and stored in Windows PasswordVault for subsequent launches; the host then injects it as an env var when starting the server.
Docker / CI — pass the key as a standard environment variable:
If the server receives an HTTP 401/403 or a resultCode=22 / SERVICE_KEY_IS_NOT_REGISTERED_ERROR
body from data.go.kr, it invalidates the cached key and re-requests via Elicitation
(session cap: 2 re-elicits per ApiKeyResolver lifetime). After exhausting retries, the
tool returns a soft-fail error message.
Note: On data.go.kr an HTTP 401 can mean either an invalid key or an API that you have not applied for (활용신청). If a re-elicitation prompt appears right after calling an API you haven't subscribed to, entering the same key will produce the final error envelope with details — at that point visit the API's data.go.kr page and apply for access.
Add to claude_desktop_config.json:
Claude Code supports MCP Elicitation, so DATA_GO_KR_API_KEY may be omitted — the
server will prompt for the key on first tool use.
Add to .vscode/mcp.json:
Install the dotnet tool first. AssistStudio does not auto-install external MCP servers (only built-in ones are managed via the AssistStudio auto-update path). The
fieldcure-mcp-publicdata-krcommand must be on PATH before you add the server, otherwise the connection fails with a generic "server shut down unexpectedly" message.
Then: Settings > MCP Servers > Add Server:
| Field | Value |
|---|---|
| Name | PublicData.Kr |
| Command | fieldcure-mcp-publicdata-kr |
| Arguments | (empty) |
| Environment | DATA_GO_KR_API_KEY = your data.go.kr API key (optional — AssistStudio can prompt via Elicitation if unset) |
| Description | (auto-filled on first connection) |
| Tool | Description |
|---|---|
discover_api | Search data.go.kr APIs by keyword — returns names, providers, endpoint URLs |
describe_api | Get operations, request parameters, and response fields for a specific API |
call_api | Call any data.go.kr API with automatic serviceKey injection and response normalization |
discover_apiSearch Korean public data APIs on data.go.kr by keyword. Results are deduplicated by service — each API appears once even if it has multiple operations.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Yes | Search keyword (e.g., 미세먼지, 부동산, 사업자) |
page | int | — | Page number (default: 1) |
pageSize | int | — | Results per page (default: 10, max: 50) |
describe_apiGet the request parameters and response fields of a specific API. Use the serviceId from discover_api results.
| Parameter | Type | Required | Description |
|---|---|---|---|
serviceId | string | Yes | Service ID (list_id) from discover_api |
call_apiCall a Korean public data API. The serviceKey is automatically injected — never pass it yourself. If the call fails with ACCESS_DENIED, the user needs to apply for access to that specific API at data.go.kr.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | Full endpoint URL from describe_api results |
params | string | — | Query parameters as a JSON string (not a raw object), e.g. '{"stationName":"종로구","dataTerm":"DAILY"}'. Parameter names must come from describe_api's request_parameters — do not guess. |
maxResults | int | — | Max items to return (default: 20, prevents context overflow) |
When a data.go.kr API returns an error, the server translates it into a Korean guidance message the LLM can relay directly:
| Code | Meaning | LLM receives |
|---|---|---|
| 12 | NO_OPENAPI_SERVICE | 이 API가 존재하지 않습니다. discover_api로 다시 검색해보세요. |
| 20 | ACCESS_DENIED | 이 API에 대한 활용신청이 필요합니다. (포털 링크 포함) |
| 22 | KEY_NOT_REGISTERED | API 키가 등록되지 않았습니다. |
| 30 | TRAFFIC_EXCEEDED | 일일 호출 한도를 초과했습니다. |
| 31 | UNREGISTERED_IP | 이 IP가 등록되지 않았습니다. |
| Variable | Required | Default | Description |
|---|---|---|---|
DATA_GO_KR_API_KEY | — | — | data.go.kr API key (인증키). If unset, the server requests it via MCP Elicitation on first tool call. |
PUBLICDATA_API_KEY | — | — | Legacy alias for DATA_GO_KR_API_KEY. Still accepted; prefer the canonical name for new setups. |
PUBLICDATA_TIMEOUT_SECONDS | — | 30 | Per-request timeout |
PUBLICDATA_MAX_RESPONSE_LENGTH | — | 50000 | Maximum response body length in characters |
CLI args (--api-key, --timeout, --max-response-length) override environment variables
and are intended for manual testing only — DATA_GO_KR_API_KEY and Elicitation are the
supported paths.
Naming note: the API key follows the external service naming convention (
DATA_GO_KR_API_KEY), while server-local configuration uses thePUBLICDATA_prefix. This keeps the key aligned with data.go.kr's own documentation so users don't have to configure it twice, while local tunables stay grouped under a single package namespace.
*** in any error output visible to the LLMcall_api only allows requests to approved hosts: api.odcloud.kr, apis.data.go.kr, api.data.go.kr, openapi.data.go.kr, www.law.go.kr, open.neis.go.krPUBLICDATA_MAX_RESPONSE_LENGTH (default: 50,000 chars)Part of the AssistStudio ecosystem.