Seoul OpenData MCP
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Seoul OpenData MCPIs Gangnam crowded right now?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Seoul OpenData MCP
An MCP server that wraps Seoul's real-time city data (Seoul Open Data Plaza) into 19 tools any MCP client can call, with zero setup beyond an optional API key. | 서울 열린데이터광장의 실시간 도시데이터를 19개 tool로 감싸는 MCP 서버로, 인증키 없이도 바로 사용할 수 있습니다.
English
Overview
Seoul OpenData MCP is a stdio MCP server, written in TypeScript, that exposes Seoul's real-time city data (Seoul Open Data Plaza) as 19 tools grouped into 8 categories — population and commercial activity, transit, culture, environment, batch statistics, health, and a dataset catalog. It also ships a searchable catalog covering 28 raw Seoul Open Data datasets, so an MCP client such as Claude can go from a dataset id straight to a live API call. The server needs no setup beyond an optional API key — it runs in a scope-limited sample mode out of the box.
Related MCP server: k-skill-korea
Features
Hotspot resolution & live snapshot —
search_placefuzzy-matches a free-form place name to one of 121 official real-time hotspots, andget_city_snapshot/get_disaster_alertsreturn a combined population + weather + traffic + events snapshot, or recent emergency alerts, for one.12-hour AI population forecast & congestion —
get_populationreports real-time population, a 4-level congestion label (여유/보통/약간 붐빔/붐빔), demographics, and an optional 12-hour AI-generated forecast.Card-payment commercial activity —
get_commercial_activitysurfaces real-time, card-payment-based commercial activity levels and per-industry breakdowns across 82 of the 121 hotspots.Transit suite —
get_subway_arrivals,get_bike_stations,get_parking, andget_road_trafficcover realtime subway arrivals, Ttareungi bike-share availability, public parking space counts, and road speed/incidents.Batch statistics —
get_subway_ridership,get_living_population,get_real_estate_prices, andfind_pharmaciescover daily ridership, de-facto living population, real-estate transactions, and pharmacy hours from batch (lagged) datasets.Dataset catalog —
search_dataset,get_dataset_spec, andcall_datasetsearch, inspect, and directly call any of the 28 curated Seoul Open Data datasets, including the 15 that have no dedicated tool.Zero-config sample mode, dual API keys, caching — runs with no keys at all, supports two independent API keys (general + subway) with fallback, and caches every upstream response in memory (TTL tuned per dataset) to protect the ~1,000-call/day free quota.
Architecture
flowchart TD
MCPClient["MCP Client<br/>(Claude Desktop / Code)"] -->|"stdio JSON-RPC"| Server["seoul-opendata-mcp<br/>19 tools"]
Server --> ToolsLayer["Tools layer"]
ToolsLayer --> Normalize["Normalize<br/>(envelope unwrap · 8 shapes + normalizers)"]
Normalize --> Client["SeoulApiClient<br/>TTL cache · retry · key masking · sample clamp"]
Client --> APIs[("Seoul Open Data Plaza<br/>openapi.seoul.go.kr")]
Client --> Subway[("swopenapi<br/>realtime arrivals")]
ENV[".env / env keys"] -.-> ClientEvery upstream call goes through a single HTTP path in
SeoulApiClient(recorded as ADR-003), so caching, retry, sample clamping, and error handling are implemented once for every tool.Every tool returns the same
{data, asOf, source, notes}envelope, regardless of which of the 8 raw upstream shapes it started from.Per-service cache TTLs (60s citydata, 5min bike/parking/air, 1h cultural events, 15s subway arrivals) protect the ~1,000-call/day free quota.
API keys are masked before they can ever appear in a log line or an error message.
Prerequisites
Node.js 18 or later
An MCP client (Claude Desktop, Claude Code, or any MCP-compatible client)
(Optional) Seoul Open Data API keys — the server runs in sample mode without them
Installation
Claude Desktop
Add this to your claude_desktop_config.json (config file location):
{
"mcpServers": {
"seoul-opendata": {
"command": "npx",
"args": ["-y", "seoul-opendata-mcp"],
"env": { "SEOUL_API_KEY": "YOUR_KEY" }
}
}
}Restart Claude Desktop and the 19 tools below become available.
Claude Code
The
.mcpbbundle is for Claude Desktop (the chat app) only. For Claude Code (CLI and desktop app), install as below — register once in the terminal and the same server is available in the Claude Code desktop app as well.
Install from source
git clone https://github.com/whchoi98/seoul-opendata-mcp.git && cd seoul-opendata-mcp
npm install && npm run build
claude mcp add seoul-opendata \
-e SEOUL_API_KEY=YOUR_KEY \
-e SEOUL_SUBWAY_API_KEY=YOUR_SUBWAY_KEY \
--scope user \
-- node $(pwd)/dist/index.jsSEOUL_API_KEY— issued free at data.seoul.go.kr. Leave empty for sample mode (single 광화문·덕수궁 hotspot only)SEOUL_SUBWAY_API_KEY— dedicated key for realtime subway arrivals (optional). Falls back toSEOUL_API_KEYwhen empty--scope user— available in every project. Omit it to register for the current project only (default: local)
Verify the installation
claude mcp list # look for ✓ seoul-opendataRun /mcp inside a Claude Code session (desktop app included) to confirm the 19 tools are loaded, then test with "지금 강남역 지하철 도착 알려줘".
Import from Claude Desktop (macOS/WSL)
If the server is already installed in Claude Desktop, import the configuration as-is:
claude mcp add-from-claude-desktopCodex CLI
codex mcp add seoul-opendata --env SEOUL_API_KEY=YOUR_KEY -- npx -y seoul-opendata-mcpOr add it directly to ~/.codex/config.toml:
[mcp_servers.seoul-opendata]
command = "npx"
args = ["-y", "seoul-opendata-mcp"]
env = { SEOUL_API_KEY = "YOUR_KEY" }Kiro CLI
kiro-cli mcp add --name seoul-opendata --command npx --args "-y,seoul-opendata-mcp" \
--env SEOUL_API_KEY=YOUR_KEY --scope globalThe server is saved to ~/.kiro/settings/mcp.json (use --scope workspace for a per-project setup). Verify with kiro-cli mcp list.
One-click (MCPB)
Download the .mcpb bundle from the latest release and double-click it — Claude Desktop installs the server with no terminal required.
Getting API Keys (5 minutes)
The server works out of the box in sample mode (see limits below), but real keys remove the limits and are free:
Sign in (or sign up) at data.seoul.go.kr.
Open the authentication-key request page ("인증키 신청") and submit the short application form.
The key is issued immediately — no waiting for approval.
Put it in
SEOUL_API_KEY(as shown above) and restart your MCP client.
Without SEOUL_API_KEY, the server falls back to a built-in sample key: the citydata-family tools (get_city_snapshot, get_population, get_commercial_activity, get_road_traffic, get_weather, get_disaster_alerts) only work for the single 광화문·덕수궁 (Gwanghwamun·Deoksugung) hotspot, and the other tools return at most 5 rows. Every sample-mode response includes a note reminding you of this.
There are two keys in total:
SEOUL_API_KEY— the general key, used by every tool except realtime subway arrivals.SEOUL_SUBWAY_API_KEY— a separate key forget_subway_arrivals(realtime subway arrivals), requested independently on data.seoul.go.kr. Optional — if unset, the server falls back toSEOUL_API_KEY.
Local development with .env
Copy .env.example to .env and fill in your key(s):
cp .env.example .env
# then edit .env: SEOUL_API_KEY=... (and optionally SEOUL_SUBWAY_API_KEY=...).env is listed in .gitignore and is never committed — only the empty .env.example template is tracked in the repo.
Usage
"지금 강남역 혼잡도 어때?"— congestion level right now"홍대 앞으로 12시간 동안 인구가 어떻게 변할까?"— 12-hour population forecast"성수동 상권 요즘 분위기 어때?"— commercial activity trend"여의도 근처에 따릉이 자전거 있어?"— nearby Ttareungi bike availability"이번 주말 마포구 무료 공연 있어?"— free cultural events this weekend"오늘 강남구 미세먼지 어때?"— today's fine dust level"어제 강남역 승하차 몇 명이야?"— yesterday's boarding/alighting count at Gangnam station"서울 공공와이파이 데이터 찾아줘"— find Seoul's public WiFi dataset
Configuration
Variable | Description | Default |
| General API key, used by every tool except realtime subway arrivals. Falls back to a built-in, scope-limited sample key when unset. |
|
| Optional, dedicated key for | (falls back to |
.env is read by a dependency-free loader that only fills variables not already set on process.env. Precedence is: explicit environment variables > .env file > built-in sample key.
Tools
19 tools grouped into 8 categories:
Tool | Description | Key arguments |
Common | ||
| Resolve a free-form place name to one of Seoul's 121 official real-time hotspots. Use this first when the user mentions a Seoul location. |
|
| One-shot combined snapshot (population/congestion + weather + road traffic + top events) of a hotspot. Best for broad "how is X right now?" questions. |
|
| Recent emergency disaster text alerts (긴급재난문자) issued for a hotspot area. |
|
Population & Commerce | ||
| Real-time population, congestion level (여유/보통/약간 붐빔/붐빔), demographics, and optional 12-hour AI forecast. |
|
| Real-time card-payment-based commercial activity level and per-industry breakdown (82 supported places). |
|
Transit | ||
| Real-time subway train arrivals for a station. |
|
| Find Ttareungi (서울 공공자전거) stations by name keyword and/or coordinates, with real-time available bike counts. |
|
| Real-time available spaces in Seoul public parking lots, filtered by a place/district keyword. |
|
| Average road speed, congestion message, and accident/control incidents around a hotspot. |
|
Culture | ||
| Search Seoul cultural events (concerts, exhibitions, festivals) by keyword/category/district/date range/free-only. |
|
Environment | ||
| Real-time air quality (PM10/PM2.5, grade) by district. Omit district for all 25. |
|
| Current temperature, precipitation, fine dust (PM10/PM2.5), UV, sunrise/sunset and weather warnings at a hotspot. |
|
Statistics (batch) | ||
| Per-station daily subway boarding/alighting counts for a date (data available up to ~2-4 days ago). |
|
| De-facto (living) population estimates by administrative dong and hour (batch, ~5-day lag). |
|
| Seoul real-estate sale transaction records (price in 만원/10k KRW), filterable by district/dong/year. |
|
Health | ||
| Find Seoul pharmacies by district or name keyword, with per-day operating hours. |
|
Catalog | ||
| Search the curated catalog of 28 Seoul Open Data datasets by keyword (e.g. public WiFi, cooling shelters). |
|
| Get the path parameters, response fields, and a call example for a catalog dataset id. |
|
| Call a catalog dataset by id and get raw (non-normalized) rows — for datasets without a dedicated tool. |
|
Coverage & Limits
121 official hotspots, 5 official categories —
search_place,get_city_snapshot,get_population,get_road_traffic, andget_weatheronly cover these named locations: palaces & cultural heritage (고궁·문화유산), tourist zones (관광특구), parks (공원), commercial districts (발달상권), and dense hotspots (인구밀집지역).Commercial activity: 82 of the 121 hotspots —
get_commercial_activityreturnssupported: falsewith nearby alternatives for the other 39.Population has ~15 minutes of delay — it's a telecom-based estimate with correction, not instantaneous.
Free quota is ~1,000 calls/day per key — the server caches responses in memory (60s for city data, 5 min for air/bike/parking, 1 hour for cultural events) to help stay within this.
Bike stations, parking lots, air quality, cultural events, subway arrivals, pharmacies, and the batch statistics tools are not limited to the 121 hotspots — they cover their respective full Seoul-wide datasets (e.g. all 25 districts for air quality, ~3,000 bike stations).
Catalog tools cover 28 curated datasets —
search_dataset/get_dataset_spec/call_datasetgive raw access to datasets that don't (yet) have a dedicated normalized tool.
Project Structure
seoul-opendata-mcp/
src/
client/ # HTTP client: SeoulApiClient (cache, retry, env loading)
normalize/ # Envelope unwrap (8 shapes) + per-domain normalizers
tools/ # 19 MCP tools grouped into 8 categories
data/ # 121 hotspots + 28-dataset catalog
tests/ # 105 unit tests + 4 live tests; fixtures are real captures
scripts/ # capture-fixtures, live-sweep, setup
docs/ # architecture, api-reference, ADRsTesting
# Unit tests (105 tests, fixtures are real captured API responses)
npm test
# Live tests against the real Seoul Open Data API (4 tests, needs a real key)
RUN_LIVE=1 npx vitest run live
# Exercise all 19 tools end-to-end against the real API
npx tsx scripts/live-sweep.tsData Attribution
Data is provided by the Seoul Open Data Plaza (서울 열린데이터광장, data.seoul.go.kr) "Seoul Real-time City Data" (서울 실시간 도시데이터) service, which fuses telecom population data (KT/SKT), card-payment data (Shinhan Card), and transit tap-in/tap-out data (Tmoney), along with the Seoul public bike, parking, air-quality, cultural-event, and subway-arrival open APIs.
Contributing
Fork the repository
Create your branch (
git checkout -b feat/amazing-feature)Commit changes (
git commit -m 'feat: add amazing feature')Push to the branch (
git push origin feat/amazing-feature)Open a Pull Request
Commit messages follow Conventional Commits (feat:, fix:, docs:, test:, chore:, ...).
License
MIT © 2026 whchoi98
Contact
Maintainer: whchoi98
Issues: https://github.com/whchoi98/seoul-opendata-mcp/issues
Email: whchoi98@gmail.com
한국어
개요
Seoul OpenData MCP는 TypeScript로 작성된 stdio MCP 서버로, 서울 열린데이터광장의 실시간 도시데이터를 8개 카테고리, 19개 tool로 노출합니다 — 인구·상권, 교통, 문화, 환경, 배치 통계, 보건, 데이터셋 카탈로그. 또한 서울 열린데이터광장 원본 데이터셋 28종을 검색할 수 있는 카탈로그를 함께 제공해, Claude 같은 MCP 클라이언트가 데이터셋 id만으로 바로 실시간 API를 호출할 수 있습니다. 인증키 없이도 범위가 제한된 샘플 모드로 바로 동작하므로 별도 설정이 필요 없습니다.
주요 기능
핫스팟 매칭 & 실시간 스냅샷 —
search_place가 자연어 장소명을 서울 실시간 도시데이터 핫스팟 121곳 중 하나로 매칭하고,get_city_snapshot/get_disaster_alerts가 핫스팟의 인구+날씨+도로교통+주요 행사를 한 번에 조회하거나 최근 긴급재난문자를 반환합니다.12시간 AI 인구 예측 & 혼잡도 —
get_population이 실시간 인구, 4단계 혼잡도(여유/보통/약간 붐빔/붐빔), 성연령 비율, 선택적 12시간 AI 예측을 제공합니다.카드 결제 기반 상권 활성도 —
get_commercial_activity가 121개 핫스팟 중 82곳에 대해 신한카드 실시간 결제 기반 상권 활성도와 업종별 현황을 제공합니다.교통 tool 모음 —
get_subway_arrivals,get_bike_stations,get_parking,get_road_traffic이 지하철 실시간 도착, 따릉이 잔여 대수, 공영주차장 여석, 도로 속도·사고/통제 현황을 다룹니다.배치 통계 —
get_subway_ridership,get_living_population,get_real_estate_prices,find_pharmacies가 지하철 일별 승하차, 생활인구, 부동산 실거래가, 약국 운영시간을 배치(지연) 데이터로 제공합니다.데이터셋 카탈로그 —
search_dataset,get_dataset_spec,call_dataset이 서울 열린데이터광장 큐레이션 데이터셋 28종(정식 tool이 없는 15종 포함)을 검색·조회·직접 호출합니다.무설정 샘플 모드, 키 2종, 캐싱 — 인증키가 전혀 없어도 동작하고, 독립된 키 2종(일반+지하철)을 폴백과 함께 지원하며, 데이터셋별로 조정된 TTL로 응답을 메모리에 캐시해 하루 약 1,000회 무료 쿼터를 보호합니다.
아키텍처
flowchart TD
MCPClient["MCP Client<br/>(Claude Desktop / Code)"] -->|"stdio JSON-RPC"| Server["seoul-opendata-mcp<br/>19 tools"]
Server --> ToolsLayer["Tools layer"]
ToolsLayer --> Normalize["Normalize<br/>(envelope unwrap · 8 shapes + normalizers)"]
Normalize --> Client["SeoulApiClient<br/>TTL cache · retry · key masking · sample clamp"]
Client --> APIs[("Seoul Open Data Plaza<br/>openapi.seoul.go.kr")]
Client --> Subway[("swopenapi<br/>realtime arrivals")]
ENV[".env / env keys"] -.-> Client모든 업스트림 호출은
SeoulApiClient내 단 하나의 HTTP 경로를 거칩니다(ADR-003으로 기록). 캐싱, 재시도, 샘플 클램핑, 에러 처리를 모든 tool에 대해 한 곳에서만 구현합니다.모든 tool은 업스트림의 8가지 원본 형태 중 무엇에서 시작했든 동일한
{data, asOf, source, notes}봉투로 응답합니다.서비스별 캐시 TTL(citydata 60초, 따릉이/주차/대기질 5분, 문화행사 1시간, 지하철 도착 15초)이 하루 약 1,000회 무료 쿼터를 보호합니다.
API 키는 로그나 에러 메시지에 노출되기 전에 항상 마스킹됩니다.
사전 요구 사항
Node.js 18 이상
MCP 클라이언트 (Claude Desktop, Claude Code, 또는 다른 MCP 호환 클라이언트)
(선택) 서울 열린데이터광장 인증키 — 없어도 샘플 모드로 동작합니다
설치 방법
Claude Desktop
claude_desktop_config.json(설정 파일 위치)에 아래 내용을 추가하세요.
{
"mcpServers": {
"seoul-opendata": {
"command": "npx",
"args": ["-y", "seoul-opendata-mcp"],
"env": { "SEOUL_API_KEY": "YOUR_KEY" }
}
}
}Claude Desktop을 재시작하면 아래 19개 tool을 바로 사용할 수 있습니다.
Claude Code
.mcpb파일은 Claude Desktop(채팅 앱) 전용입니다. Claude Code(CLI 및 데스크톱 앱)는 아래 방법으로 설치하세요. 터미널에서 한 번 등록하면 Claude Code 데스크톱 앱에서도 동일하게 사용할 수 있습니다.
소스에서 설치
git clone https://github.com/whchoi98/seoul-opendata-mcp.git && cd seoul-opendata-mcp
npm install && npm run build
claude mcp add seoul-opendata \
-e SEOUL_API_KEY=YOUR_KEY \
-e SEOUL_SUBWAY_API_KEY=YOUR_SUBWAY_KEY \
--scope user \
-- node $(pwd)/dist/index.jsSEOUL_API_KEY— data.seoul.go.kr에서 무료 발급. 비우면 샘플 모드(광화문·덕수궁 단일 핫스팟 한정)로 동작SEOUL_SUBWAY_API_KEY— 지하철 실시간 도착 전용 키(선택). 비우면SEOUL_API_KEY로 폴백--scope user— 모든 프로젝트에서 사용. 현재 프로젝트에서만 쓰려면 생략(기본값 local)
설치 확인
claude mcp list # ✓ seoul-opendata 표시 확인Claude Code 세션(데스크톱 앱 포함)에서 /mcp를 실행하면 19개 tool이 로드된 것을 확인할 수 있습니다. "지금 강남역 지하철 도착 알려줘"로 동작을 테스트하세요.
Claude Desktop에서 가져오기 (macOS/WSL)
Claude Desktop에 이미 설치한 경우 구성을 그대로 가져올 수 있습니다.
claude mcp add-from-claude-desktopCodex CLI
codex mcp add seoul-opendata --env SEOUL_API_KEY=YOUR_KEY -- npx -y seoul-opendata-mcp또는 ~/.codex/config.toml에 직접 추가할 수 있습니다.
[mcp_servers.seoul-opendata]
command = "npx"
args = ["-y", "seoul-opendata-mcp"]
env = { SEOUL_API_KEY = "YOUR_KEY" }Kiro CLI
kiro-cli mcp add --name seoul-opendata --command npx --args "-y,seoul-opendata-mcp" \
--env SEOUL_API_KEY=YOUR_KEY --scope global서버 설정은 ~/.kiro/settings/mcp.json에 저장됩니다(프로젝트 단위로 쓰려면 --scope workspace). kiro-cli mcp list로 등록을 확인할 수 있습니다.
원클릭 설치 (MCPB)
최신 릴리스에서 .mcpb 파일을 내려받아 더블클릭하면, 터미널 없이 Claude Desktop에 서버가 설치됩니다.
API 키 발급 (5분)
인증키 없이도 샘플 모드로 바로 동작합니다(아래 한계 참고). 하지만 실제 키는 무료이고 이런 제한이 사라지니 발급을 권장합니다.
data.seoul.go.kr에 로그인(또는 회원가입)합니다.
"인증키 신청" 페이지에서 간단한 신청서를 작성해 제출합니다.
승인 대기 없이 즉시 발급됩니다.
발급받은 키를 위 설정의
SEOUL_API_KEY에 넣고 MCP 클라이언트를 재시작하세요.
SEOUL_API_KEY를 설정하지 않으면 서버는 내장된 sample 키로 동작합니다. 이 경우 citydata 계열 tool(get_city_snapshot, get_population, get_commercial_activity, get_road_traffic, get_weather, get_disaster_alerts)은 광화문·덕수궁 단일 핫스팟 1곳만 조회 가능하고, 나머지 tool은 최대 5건까지만 반환됩니다. 샘플 모드 응답에는 이 제약을 알리는 안내가 항상 포함됩니다.
인증키는 총 2종입니다.
SEOUL_API_KEY— 일반 인증키. 지하철 실시간 도착을 제외한 모든 tool이 사용합니다.SEOUL_SUBWAY_API_KEY— 지하철 실시간 도착(get_subway_arrivals) 전용 인증키. data.seoul.go.kr에서 별도로 신청합니다. 선택 항목이며, 설정하지 않으면SEOUL_API_KEY를 대신 사용합니다.
.env로 로컬 개발하기
.env.example을 .env로 복사한 뒤 키를 입력하세요.
cp .env.example .env
# 이후 .env를 편집: SEOUL_API_KEY=... (선택적으로 SEOUL_SUBWAY_API_KEY=...).env는 .gitignore에 등록되어 있어 절대 커밋되지 않습니다 — 저장소에는 값이 빈 .env.example 템플릿만 추적됩니다.
사용법
"지금 강남역 혼잡도 어때?"— 실시간 혼잡도"홍대 앞으로 12시간 동안 인구가 어떻게 변할까?"— 12시간 인구 예측"성수동 상권 요즘 분위기 어때?"— 상권 활성도 추이"여의도 근처에 따릉이 자전거 있어?"— 인근 따릉이 잔여 대수"이번 주말 마포구 무료 공연 있어?"— 주말 무료 문화행사"오늘 강남구 미세먼지 어때?"— 오늘의 미세먼지 수준"어제 강남역 승하차 몇 명이야?"— 어제 강남역 승하차 인원"서울 공공와이파이 데이터 찾아줘"— 공공와이파이 데이터셋 검색
환경 설정
Variable | Description | Default |
| 일반 인증키. 지하철 실시간 도착을 제외한 모든 tool이 사용합니다. 미설정 시 범위가 제한된 내장 샘플 키로 폴백합니다. |
|
| 지하철 실시간 도착( | ( |
.env는 process.env에 아직 설정되지 않은 값만 채우는 의존성 없는 로더가 읽습니다. 우선순위는 명시적 환경변수 > .env 파일 > 내장 샘플 키 순입니다.
Tools
19개 tool을 8개 카테고리로 나누어 제공합니다.
Tool | 설명 | 주요 인자 |
공통 | ||
| 자연어 장소명을 서울 실시간 도시데이터 핫스팟 121곳 중 하나로 매칭합니다. 사용자가 서울의 특정 장소를 언급하면 가장 먼저 사용하세요. |
|
| 핫스팟의 인구/혼잡도 + 날씨 + 도로교통 + 주요 행사를 한 번에 조회합니다. "지금 홍대 어때?" 같은 포괄적 질문에 적합합니다. |
|
| 핫스팟 지역에 발령된 최근 긴급재난문자를 조회합니다. |
|
생활인구 | ||
| 실시간 인구, 혼잡도(여유/보통/약간 붐빔/붐빔), 성연령 비율, 선택적으로 12시간 AI 예측을 조회합니다. |
|
| 신한카드 실시간 결제 기반 상권 활성도와 업종별 현황을 조회합니다(지원 82곳). |
|
교통 | ||
| 지하철역의 실시간 열차 도착 정보를 조회합니다. |
|
| 이름 키워드 및/또는 좌표로 따릉이 대여소를 찾고 실시간 잔여 대수를 조회합니다. |
|
| 장소/자치구 키워드로 서울 공영주차장의 실시간 주차 가능 면수를 조회합니다. |
|
| 핫스팟 주변의 평균 도로 속도, 소통 메시지, 사고/통제 현황을 조회합니다. |
|
문화 | ||
| 키워드/분류/자치구/기간/무료 여부로 서울시 문화행사(공연·전시·축제)를 검색합니다. |
|
환경 | ||
| 자치구별 실시간 대기질(PM10/PM2.5, 등급)을 조회합니다. 자치구를 생략하면 25개 전체를 반환합니다. |
|
| 핫스팟 기준 현재 기온, 강수, 미세먼지(PM10/PM2.5), 자외선, 일출/일몰, 기상특보를 조회합니다. |
|
통계(배치) | ||
| 지하철 역별 일별 승하차 인원을 조회합니다(보통 2~4일 전 데이터까지 제공). |
|
| 행정동·시간대별 생활인구 통계를 조회합니다(배치, 약 5일 지연). |
|
| 서울 부동산 매매 실거래가(단위: 만원)를 자치구/법정동/연도로 필터링해 조회합니다. |
|
보건 | ||
| 자치구 또는 약국명 키워드로 서울 약국을 찾고 요일별 운영시간을 조회합니다. |
|
카탈로그 | ||
| 서울 열린데이터광장 카탈로그(28개 데이터셋)를 키워드로 검색합니다(예: 공공와이파이, 무더위쉼터). |
|
| 카탈로그 데이터셋 id의 경로 파라미터, 응답 필드, 호출 예시를 확인합니다. |
|
| 정식 tool이 없는 카탈로그 데이터셋을 id로 직접 호출해 원본(비정규화) 데이터를 가져옵니다. |
|
커버리지와 한계
핫스팟 121곳, 정식 카테고리 5종 —
search_place,get_city_snapshot,get_population,get_road_traffic,get_weather는 지정된 121개 장소만 지원합니다: 고궁·문화유산, 관광특구, 공원, 발달상권, 인구밀집지역.상권은 121곳 중 82곳만 지원 —
get_commercial_activity는 나머지 39곳에 대해supported: false와 인접 대안 장소를 반환합니다.인구는 약 15분 지연 — 통신사 집계 기반 추정치에 보정을 거치기 때문에 실시간이 아닙니다.
무료 쿼터는 키당 하루 약 1,000회 — 서버는 메모리 캐시(도시데이터 60초, 대기질/따릉이/주차 5분, 문화행사 1시간)로 쿼터 소진을 완화합니다.
따릉이 대여소, 공영주차장, 대기질, 문화행사, 지하철 도착 정보, 약국, 배치 통계 tool은 121개 핫스팟에 한정되지 않고 서울 전역 데이터를 다룹니다(예: 대기질은 25개 자치구 전체, 따릉이는 약 3천 개 대여소).
카탈로그 tool은 28개 큐레이션 데이터셋을 다룹니다 —
search_dataset/get_dataset_spec/call_dataset은 아직 정규화된 정식 tool이 없는 데이터셋을 원본 그대로 조회할 수 있게 해줍니다.
프로젝트 구조
seoul-opendata-mcp/
src/
client/ # HTTP 클라이언트: SeoulApiClient (캐시, 재시도, env 로딩)
normalize/ # 봉투 언랩(8가지 형태) + 도메인별 정규화
tools/ # 8개 카테고리로 묶인 19개 MCP tool
data/ # 121개 핫스팟 + 28개 데이터셋 카탈로그
tests/ # 유닛 테스트 105개 + 라이브 테스트 4개, fixture는 실제 캡처본
scripts/ # capture-fixtures, live-sweep, setup
docs/ # architecture, api-reference, ADR테스트
# 유닛 테스트 (105개, fixture는 실제 캡처한 API 응답)
npm test
# 실제 서울 열린데이터광장 API를 대상으로 하는 라이브 테스트 (4개, 실제 키 필요)
RUN_LIVE=1 npx vitest run live
# 19개 tool 전체를 실제 API로 전수 점검
npx tsx scripts/live-sweep.ts데이터 출처 고지
이 서버는 서울 열린데이터광장(data.seoul.go.kr)의 '서울 실시간 도시데이터' 서비스를 사용합니다. 이 데이터는 통신사(KT/SKT) 인구 데이터, 신한카드 결제 데이터, 티머니(Tmoney) 대중교통 승하차 데이터를 융합한 것이며, 서울시 공공자전거·주차장·대기환경·문화행사·지하철 도착정보 오픈 API도 함께 사용합니다.
기여 방법
Fork the repository
Create your branch (
git checkout -b feat/amazing-feature)Commit changes (
git commit -m 'feat: add amazing feature')Push to the branch (
git push origin feat/amazing-feature)Open a Pull Request
커밋 메시지는 Conventional Commits 규약(feat:, fix:, docs:, test:, chore: 등)을 따릅니다.
라이선스
MIT © 2026 whchoi98
연락처
Maintainer: whchoi98
Issues: https://github.com/whchoi98/seoul-opendata-mcp/issues
Email: whchoi98@gmail.com
Available Tools
19 toolscall_datasetCall a catalog dataset (raw fields)A
Invoke a catalog dataset by id and get RAW (non-normalized) rows; check get_dataset_spec first for required params. 카탈로그 데이터셋을 직접 호출합니다. 응답은 정규화되지 않은 원본 필드입니다.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | 카탈로그 데이터셋 id | |
| limit | No | 최대 행 수 (기본 10, 최대 50) | |
| params | No | 경로 파라미터 (get_dataset_spec의 pathParams 순서대로) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It adds the key detail that output is raw/non-normalized and references get_dataset_spec for parameters, but it omits read-only behavior, error handling, or pagination details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The English sentence is concise and front-loaded with the main action. The Korean sentence is a direct translation that adds redundancy, though it is short and doesn't significantly harm clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations and output schema, the description mentions raw rows and the spec-check prerequisite but does not clarify the tool's scope (generic for all catalog datasets) or return value structure. This is adequate but leaves gaps for an agent to fully understand behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already documented with meanings (e.g., limit default/max, params order). The description adds only a dependency hint to get_dataset_spec, which is already referenced in the params schema, providing no additional semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Invoke') with a clear resource ('catalog dataset by id') and states the output ('RAW non-normalized rows'). It distinguishes itself from siblings like get_dataset_spec by emphasizing data invocation rather than metadata retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs to 'check get_dataset_spec first for required params,' establishing a prerequisite for use. However, it does not explicitly contrast with alternatives like search_dataset or specialized getters, leaving some ambiguity about when to use this over them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_pharmaciesFind pharmacies with operating hoursA
Find Seoul pharmacies by district or name keyword, with per-day operating hours. 약국 위치·전화·요일별 운영시간. "강남구 약국 몇 시까지 해?" 류 질문에 사용.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | 약국명 키워드 | |
| limit | No | 최대 건수 (기본 10) | |
| district | No | 자치구/주소 키워드 (예: "강남구", "역삼동") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden. It discloses that results include location, phone, and per-day operating hours (via Korean text) and that this is a read-only find operation, which is sufficient for an agent to understand side-effect-free behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: one English sentence, a Korean equivalent, and a usage example. It is front-loaded with the action and avoids fluff; the Korean portions serve local users without bloating the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the main returned attributes (location, phone, hours) and giving a concrete example. It doesn't mention edge cases like empty results or combined filters, but for a simple optional-parameter search tool this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters with descriptions, so the baseline is 3. The description adds a natural-language summary of the district/name search and an example query, slightly enriching the schema by tying parameters to real user intents, though it does not add new constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Find', names the resource 'Seoul pharmacies', and specifies search criteria ('by district or name keyword') plus key output ('per-day operating hours'), clearly distinguishing it from generic sibling search_place.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides an explicit use case with an example query ('What time does a Gangnam-gu pharmacy close?') and states the tool is for pharmacy-specific lookups. It does not explicitly name siblings as alternatives, so no full when-not-to-use list, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_air_qualityReal-time air quality by districtA
Get real-time air quality (PM10/PM2.5, grade) for Seoul districts. Omit district to get all 25. 자치구별 실시간 대기질. "오늘 강남구 미세먼지 어때?" 류 질문에 사용.
| Name | Required | Description | Default |
|---|---|---|---|
| district | No | 자치구명 (예: "강남구") — 생략 시 25개 전체 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral disclosure burden. It reveals one key behavior: omitting the district parameter returns all 25 districts. It also notes that data is real-time and includes specific metrics (PM10/PM2.5, grade). However, it does not describe the output structure, error handling, or any broader behavioral traits, so transparency is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence gives the core purpose, the second covers the optional scope, and the Korean text provides a usage example. Every sentence earns its place, and the structure is easy to scan. It is concise without being under-specified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional parameter, no output schema), the description is largely sufficient. It explains the tool's purpose, the data returned, and the option to fetch all districts. However, it does not specify the exact return format or any authentication/rate limits, which would improve completeness—though for a read-only, low-complexity tool, this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides a full description for the 'district' parameter: '자치구명 (예: "강남구") — 생략 시 25개 전체', which covers the omit behavior. The tool description essentially repeats this with 'Omit district to get all 25', adding no new semantic information. Since schema coverage is 100%, the description's redundant repetition yields no extra credit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: 'Get real-time air quality (PM10/PM2.5, grade) for Seoul districts.' It clearly identifies the resource (Seoul districts) and the data captured (PM10/PM2.5, grade), and the clause 'Omit district to get all 25' further distinguishes it from sibling tools like get_weather or get_city_snapshot. This is a clear, unambiguous purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear usage context: it is intended for air quality queries about Seoul districts, with the example question '"오늘 강남구 미세먼지 어때?" 류 질문에 사용.' This tells an agent when to invoke the tool. However, it does not mention when not to use it or name alternative tools, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bike_stationsTtareungi (Seoul bike) station availabilityA
Find Seoul public bike (따릉이) stations by name keyword and/or coordinates, with real-time available bike counts. 따릉이 대여소 실시간 잔여 대수. 장소 기반은 대여소 이름 키워드 매칭으로 동작 (예: query="강남역").
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | 중심 위도 (radiusM와 함께 사용) | |
| lng | No | 중심 경도 | |
| limit | No | 최대 건수 (기본 10) | |
| query | No | 대여소 이름 키워드 (예: "망원", "강남역") | |
| radiusM | No | 반경 미터 (기본 500) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral details such as 'real-time available bike counts' and 'location-based works via name keyword matching.' However, it does not clarify how lat/lng and radiusM interact, what happens when both query and coordinates are provided, or what the response structure is. Given no annotations, more disclosure is needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively concise, using two sentences. There is some bilingual redundancy, but the Korean note adds a behavioral clarification. It is front-loaded with the main purpose and does not waste words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the primary purpose and real-time counts, but it does not explain the response format, default behaviors, or parameter interactions. Since there is no output schema, the description should better describe what the returned data contains. The gap is moderate but notable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers all 5 parameters with descriptions (100% coverage), so the description does not need to repeat them. It adds a query example ('강남역') and clarifies that query is a name keyword, but this is marginal beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Find Seoul public bike stations by name keyword and/or coordinates, with real-time available bike counts.' This specifies the verb, resource, and outcome, and the focus on bike stations distinguishes it from sibling location tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for bike station queries by stating its purpose, but it does not explicitly mention when to use this tool versus alternatives like search_place or get_city_snapshot. It provides context through 'real-time available bike counts' but lacks exclusions or explicit alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_city_snapshotOne-shot city snapshot of a hotspotA
Get a combined snapshot (population/congestion + weather + road + top events) of a Seoul hotspot in ONE call. Prefer this for broad "how is X right now?" questions. 핫스팟 종합 현황 1회 요약. "지금 홍대 어때?" 같은 포괄 질문에 사용.
| Name | Required | Description | Default |
|---|---|---|---|
| place | Yes | 핫스팟 장소명 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions the tool is a 'ONE call' snapshot, implying aggregation, but does not disclose potential caveats such as data freshness, rate limits, failure behavior on invalid places, or whether the response is real-time or cached. The description focuses on capabilities rather than behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, with the core purpose in the first sentence and usage guidance in the second. The Korean sentences that follow largely repeat the English content, introducing some redundancy but also serving localization. Every sentence contributes, though the bilingual duplication prevents a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must convey the return contents. It lists the categories (population/congestion, weather, road, top events) but leaves terms like 'population/congestion' and 'top events' ambiguous (top by what? congestion of traffic or people?). Given the tool aggregates multiple data sources, more detail about the combined response structure would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% coverage for the single 'place' parameter, with a description '핫스팟 장소명' (hotspot place name). The tool description adds a concrete example ('지금 홍대 어때?') and clarifies the scope is 'Seoul hotspot', reinforcing the meaning. However, it does not add significant additional semantics beyond the schema, matching the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('Get a combined snapshot') and resource ('of a Seoul hotspot'), and explicitly enumerates the combined content ('population/congestion + weather + road + top events'). It is easily distinguished from siblings like get_weather or get_road_traffic, which cover individual data types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Prefer this for broad "how is X right now?" questions.' It also includes a Korean equivalent, reinforcing the context. However, it does not explicitly name alternative tools or state when NOT to use it, though the sibling list makes the alternatives implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_commercial_activityReal-time commercial (card payment) activityA
Get real-time card-payment based commercial activity level (한산한→분주한 4 levels) and per-industry breakdown for a Seoul hotspot (82 supported places). 신한카드 실시간 결제 기반 상권 현황. "지금 성수동 장사 잘돼?" 류 질문에 사용.
| Name | Required | Description | Default |
|---|---|---|---|
| place | Yes | 핫스팟 장소명 (상권은 82곳만 지원) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the real-time nature, the data source (신한카드 실시간 결제 기반), the output granularity (4 levels and per-industry breakdown), and the supported scope (82 places). It does not detail error handling or return format, but the provided traits are substantial for a read-only retrieval tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: one English sentence describes the core function and scope, followed by two short Korean phrases for data source and usage example. Every clause earns its place with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with no output schema, the description provides key completion details: return content (activity level and industry breakdown), supported scope (82 places), and an example user question. It could mention unsupported place behavior, but the overall context is adequate for selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% coverage: the 'place' parameter description says '핫스팟 장소명 (상권은 82곳만 지원)'. The tool description repeats this ('Seoul hotspot (82 supported places)') but adds no new parameter-level meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb 'Get' and clearly defines the resource: 'real-time card-payment based commercial activity level' with a 4-level scale and 'per-industry breakdown for a Seoul hotspot (82 supported places).' This clearly distinguishes it from sibling tools like get_population or get_city_snapshot by naming the data source and specific output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete usage context: 'Seoul hotspot (82 supported places)' and a Korean example query '지금 성수동 장사 잘돼?' (Is business good in Seongsu-dong right now?). This implies when to use it, though it does not explicitly name alternative tools or edge-case exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dataset_specGet dataset call specificationA
Get the path parameters, response fields, and call example for a catalog dataset id. call_dataset 호출 전 파라미터 명세를 확인합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | 카탈로그 데이터셋 id (예: "CardSubwayStatsNew") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. 'Get' clearly implies a read-only operation, and listing the returned spec elements (path parameters, response fields, call example) gives useful context. However, it does not disclose error behavior, authentication requirements, or the fact that this is metadata rather than an actual data call, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the key information. However, the second sentence in Korean largely repeats the first sentence's meaning, which is redundant for an AI agent. It is still efficient, but not every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema), the description covers the essential aspects: what it returns, and when to use it. It does not explain return formatting or error conditions, but that is not critical for a straightforward spec-fetching tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description only mentions 'catalog dataset id' in passing and does not add semantic detail beyond what the schema already provides for the 'id' parameter. It adds no additional meaning about the parameter's format or usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Get' and a clear resource 'dataset call specification', explicitly listing the return contents (path parameters, response fields, call example). It distinguishes itself from sibling data-retrieval tools by referencing call_dataset, indicating it is a preparatory metadata tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'call_dataset 호출 전' (before calling call_dataset) and '확인합니다' (check). It implies this tool is for pre-call preparation, but it does not mention exclusions or alternative tools, so it lacks a full when-not-to-use clause.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_disaster_alertsEmergency disaster alerts near a hotspotA
Get recent emergency disaster text alerts (긴급재난문자) issued for a Seoul hotspot area. 핫스팟 지역 긴급재난문자. "지금 재난문자 온 거 있어?" 류 질문에 사용.
| Name | Required | Description | Default |
|---|---|---|---|
| place | Yes | 핫스팟 장소명 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It indicates a read operation fetching text alerts, but does not disclose details like time window, response format, or any limitations. This is minimal but not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, but includes some redundancy: the English sentence and Korean sentence say the same thing. The usage example adds value, but the duplicate translation could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with no annotations or output schema, the description appropriately conveys the core function and typical usage. It does not describe the return value structure, but that gap is minor for a getter of text alerts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'place' has a schema description ('핫스팟 장소명'). The tool description adds little beyond that, just using the term 'hotspot area'. With 100% schema coverage, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves recent emergency disaster text alerts for a Seoul hotspot area. This is distinct from all sibling tools which cover other location-based data (population, traffic, weather), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a concrete example query ('지금 재난문자 온 거 있어?' - 'Is there a disaster text right now?') that signals when to use this tool. It does not explicitly mention alternatives or when not to use, but the use case is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_living_populationLiving population by administrative dongA
Get de-facto (living) population estimates by administrative dong and hour. 행정동·시간대별 생활인구 통계. 실시간 아님 — 실시간 혼잡은 get_population 사용.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | 기준일자 YYYYMMDD (약 5일 지연) | |
| limit | No | 최대 건수 (기본 20) | |
| dongCode | No | 행정동코드 8자리 (date, timeSlot과 함께 사용) | |
| timeSlot | No | 시간대 00~23 (date와 함께 사용) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden of behavioral disclosure. It reveals a key trait: the data is de-facto (living) and not real-time, implying a delay. However, it does not mention return format, authentication, rate limits, or pagination, leaving some transparency gaps. The non-real-time distinction is valuable but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two succinct sentences: the first states the core purpose, the second (Korean) provides a crucial usage exclusion. No filler, front-loaded, and perfectly sized for an agent to scan quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has four optional parameters and no output schema, and the description provides enough context for selection: what data it returns, the key non-real-time caveat, and the sibling alternative. Minor omissions—behavior when no parameters are supplied or what the response looks like—prevent a perfect score, but overall it is well contextualized.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%—each parameter already has a description (e.g., date format, timeSlot pattern, dongCode usage). The description mentions 'by administrative dong and hour' which maps to dongCode and timeSlot, but adds little beyond what the schema already provides. Thus the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb 'Get' and names the resource: de-facto (living) population estimates by administrative dong and hour. It clearly distinguishes from sibling get_population by explicitly stating this is not real-time, making its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit exclusion and alternative: '실시간 아님 — 실시간 혼잡은 get_population 사용' (not real-time, use get_population for real-time congestion). This tells the agent exactly when to choose this tool over the sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_parkingPublic parking availabilityA
Get real-time available spaces in Seoul public parking lots, filtered by place/district keyword matched against lot name and address. 공영주차장 실시간 주차 가능 면수 (실시간 연계 122곳 한정). "종로 주차 자리 있어?" 류 질문에 사용.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 최대 건수 (기본 10) | |
| query | Yes | 장소/자치구 키워드 (예: "종로", "세종로", "강남") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It adds valuable context beyond the schema by noting the real-time nature and the limitation to 122 linked parking lots ('실시간 연계 122곳 한정'). It also clarifies that keyword matching applies to lot name and address. This is strong for a read-only tool, though it does not describe return format or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: a clear English sentence, a Korean restatement with a key limitation, and a concrete usage example. Every sentence contributes value, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description covers the essential aspects: purpose, filtering behavior, limitation, and usage context. It does not explicitly describe the return format, but the tool name and phrasing 'available spaces' make this fairly clear. Minor gaps remain around result ordering or no-match behavior, but overall it is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds extra meaning for the query parameter by specifying that it matches against 'lot name and address,' which is not in the schema description. This additional semantic nuance justifies a score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get real-time available spaces in Seoul public parking lots, filtered by place/district keyword matched against lot name and address.' It uses a specific verb and resource, and the mention of keyword-based filtering distinguishes it from sibling tools like get_bike_stations or search_place.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes an explicit usage example: '"종로 주차 자리 있어?" 류 질문에 사용.' This provides clear context for when to apply the tool, but it does not mention alternatives or explicitly state when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_populationReal-time population & congestionA
Get real-time population, congestion level (여유/보통/약간 붐빔/붐빔), demographics, and optional 12-hour AI forecast for a Seoul hotspot. 서울 핫스팟의 실시간 인구·혼잡도·성연령 비율·12시간 예측을 조회합니다. "지금 강남역 혼잡해?" 류 질문에 사용.
| Name | Required | Description | Default |
|---|---|---|---|
| place | Yes | 핫스팟 장소명 (search_place로 확정한 name 권장) | |
| includeForecast | No | 향후 12시간 인구 예측 포함 여부 (기본 false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It transparently describes the operation as a query ("조회합니다") and lists the returned data types: real-time population, congestion level, demographics, and optional forecast. It does not mention limitations like stale data or error behavior, but for a read-only lookup, this is reasonably complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: two sentences (one English, one Korean) plus a usage example. It front-loads the core purpose, includes a bilingual summary, and gives a concrete user query example—all without fluff. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description sufficiently explains what the tool returns (population, congestion, demographics, forecast). It also clarifies the optional forecasting behavior. However, it does not explain return format, error handling, or the need for a validated place (though that is in the schema). For a simple 2-param read tool, it is mostly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with detailed parameter descriptions for 'place' (recommending search_place) and 'includeForecast' (default false). The tool description adds further context that the forecast is a '12-hour AI forecast', enhancing understanding beyond the raw schema. This exceeds the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: 'Get real-time population, congestion level (여유/보통/약간 붐빔/붐빔), demographics, and optional 12-hour AI forecast for a Seoul hotspot.' This specific verb+resource combination distinguishes it from siblings like get_living_population and get_city_snapshot by focusing on hotspot congestion with demographic data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides when-to-use context with the Korean query example ("지금 강남역 혼잡해?" 류 질문에 사용) and recommends using search_place to confirm the place name. However, it does not explicitly state exclusions or alternatives, so it lacks complete when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_real_estate_pricesReal estate transaction pricesA
Get Seoul real-estate sale transaction records (price in 만원), filterable by district/dong/year. 부동산 매매 실거래가. "강남구 아파트 실거래가?" 류 질문에 사용.
| Name | Required | Description | Default |
|---|---|---|---|
| dong | No | 법정동명 (예: "역삼동") | |
| year | No | 접수연도 YYYY | |
| limit | No | 최대 건수 (기본 10) | |
| district | No | 자치구명 (예: "강남구") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden. It adds useful details like the geographic scope (Seoul), price unit, and filterability. However, it doesn't specify return format, property types (e.g., apartments vs. all types), sorting, or default behavior when no filters are provided, leaving some ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded. The main verb and resource appear first, followed by a parenthetical unit note and filtering possibilities. The Korean title and usage example are efficient and directly relevant, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only query tool with no output schema, the description is reasonably complete but leaves gaps. It doesn't clarify whether results are limited to apartments, what the default scope is when no filters are given, or what fields are in the output. The schema helps with parameters but not with return semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter described. The description mentions filterable by district/dong/year, which mirrors the schema but adds little new meaning. It doesn't explain nuances like the limit parameter or combinations of filters, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb and resource: 'Get Seoul real-estate sale transaction records'. It also mentions the price unit (만원) and filter criteria, making it distinctly different from sibling tools like get_weather or get_population.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a concrete usage example in Korean: 'Use for questions like "Gangnam-gu apartment real transaction price?"'. This gives clear context for when to use the tool, although it doesn't explicitly enumerate exclusions or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_road_trafficRoad traffic & incidents around a hotspotA
Get average road speed, congestion message, and accident/control incidents around a Seoul hotspot. 핫스팟 주변 도로소통·사고통제 현황. "광화문 근처 길 막혀?" 류 질문에 사용.
| Name | Required | Description | Default |
|---|---|---|---|
| place | Yes | 핫스팟 장소명 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It clearly indicates a read-only operation through the verb 'Get' and describes the returned data (speed, congestion, incidents). It does not mention side effects, permissions, or error behavior, but for a straightforward data-retrieval tool, this is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and front-loaded with the main function. It includes a Korean translation and an example, all in about 30 words. The translation is somewhat redundant for English speakers but does not bloat the description excessively. Overall, it is concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers the essential context: what data is returned, the geographic scope, and a usage example. It does not mention output format or data freshness, but these are not critical for understanding how to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes the parameter 'place' as '핫스팟 장소명' (hotspot place name). The description adds significant meaning by specifying 'around a Seoul hotspot' and giving an example (Gwanghwamun), clarifying the geographic scope and what kind of place is expected. This goes beyond the schema's minimal description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get average road speed, congestion message, and accident/control incidents around a Seoul hotspot.' It specifies a concrete verb (Get), the data returned, and the geographic scope. This clearly distinguishes it from sibling tools like get_disaster_alerts or get_weather.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a specific usage example: '"광화문 근처 길 막혀?" 류 질문에 사용' (use for questions like 'Is the road near Gwanghwamun blocked?'). This gives clear context on when to use the tool. However, it does not explicitly mention when not to use it or suggest alternative tools, so it stops short of a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_subway_arrivalsReal-time subway arrivalsA
Get real-time subway train arrivals for a Seoul station. Pass the station name WITHOUT the "역" suffix if possible (e.g. "강남"). 지하철역 실시간 도착 정보. "2호선 강남역 열차 언제 와?" 류 질문에 사용.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 최대 건수 (기본 10) | |
| station | Yes | 지하철역명 (예: "강남", "서울역"은 "서울") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses input formatting rules (omit '역' suffix, use '서울' for '서울역') and offers a Korean usage example, which is useful. However, it does not disclose error behavior (e.g., unknown station) or response format, leaving some ambiguity for a tool that likely returns real-time data with limited context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded: the English purpose statement comes first, followed by a usage hint in English, then the same information is repeated in Korean along with a sample query. The repetition is somewhat redundant (English and Korean say similar things), but the overall length is appropriate and each sentence contributes to usability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (two params, no output schema). The description covers the core purpose and input format but omits what the response looks like (e.g., next train times, directions, count). Given no output schema, the description could have disclosed return value structure or note that data is real-time and may vary. It is adequate for invocation but not fully complete for setting expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (both station and limit are described). The description adds an English-language rule about omitting the '역' suffix and gives an explicit example ('강남'), which complements the Korean schema description. It also clarifies the station parameter's intended value in a way that is accessible to non-Korean speakers, adding meaningful semantic context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a clear verb and resource: 'Get real-time subway train arrivals for a Seoul station.' This precisely states the tool's function and distinguishes it from siblings like get_subway_ridership (ridership statistics vs. live arrivals). The added example and Korean usage hint reinforce specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides concrete guidance: 'Pass the station name WITHOUT the "역" suffix if possible (e.g. "강남").' and includes a sample query in Korean ("2호선 강남역 열차 언제 와?") to indicate the intended use case. While it does not explicitly list alternatives or when-not-to-use, the real-time scope and contrast with siblings like get_subway_ridership imply appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_subway_ridershipDaily subway ridership statisticsA
Get per-station daily subway boarding/alighting counts for a date (data available up to ~2-4 days ago). 지하철 역별 일별 승하차 인원. "강남역 하루 승객 몇 명?" 류 질문에 사용.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | 사용일자 YYYYMMDD (오늘 데이터는 없음 — 보통 2~4일 전까지 제공) | |
| line | No | 호선 필터 (부분일치, 예: "2호선") | |
| limit | No | 최대 건수 (기본 20) | |
| station | No | 역명 필터 (부분일치, 예: "강남") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the data availability lag (2-4 days ago) and describes the output as per-station boarding/alighting counts. It does not mention operational details like rate limits, but for a read-only data lookup this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat repetitive with the bilingual phrasing (English and Korean) and an example query, but it remains compact and front-loaded with the core action. It earns a 4 for being efficient despite minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description provides sufficient context for an agent to understand what the tool returns and its limitations. It could explicitly list return fields, but 'boarding/alighting counts' and station/line filters are clear enough for a data retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage with descriptions for all 4 parameters (date pattern, line partial match, limit range, station partial match). The description adds a usage example but no additional parameter semantics beyond what the schema already provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb 'Get' and resource 'per-station daily subway boarding/alighting counts for a date', which clearly distinguishes from siblings like get_subway_arrivals by focusing on daily boarding/alighting instead of real-time arrivals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: data available up to 2-4 days ago and an example query for daily passenger counts. It does not explicitly exclude real-time use or name alternatives, but the phrasing implies historical ridership queries rather than live arrivals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_weatherWeather & fine dust at a hotspotA
Get current temperature, precipitation, fine dust (PM10/PM2.5), UV, sunrise/sunset and weather warnings for a Seoul hotspot. 핫스팟 기준 날씨·미세먼지·기상특보. "지금 여의도 날씨 어때?" 류 질문에 사용.
| Name | Required | Description | Default |
|---|---|---|---|
| place | Yes | 핫스팟 장소명 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It clearly states that the tool returns current conditions and lists all included data types. It also specifies the geographic scope (Seoul hotspot). This is adequate for a simple, read-only weather tool, though it doesn't mention units or handling of unknown places, which are minor gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core purpose. It includes both English and Korean versions, which is slightly redundant but the Korean portion adds the example use case. Overall, every sentence contributes value without excessive length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description is sufficiently complete. It enumerates all returned data fields, specifies the geographic context, and gives an example query. It doesn't describe the return format in detail, but the list of attributes compensates for the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes the only parameter 'place' as '핫스팟 장소명' (hotspot place name), and the description adds 'Seoul hotspot' and an example ('여의도'). This gives the agent a clear understanding of what values to provide, going beyond the schema's minimal description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb 'Get' and specifies the resource: current weather data including temperature, precipitation, fine dust, UV, sunrise/sunset, and weather warnings for a Seoul hotspot. This detailed list makes the tool's purpose unambiguous and distinguishes it from sibling tools like get_air_quality, which focuses only on air quality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: 'for a Seoul hotspot' and includes a concrete example question, '지금 여의도 날씨 어때?' (What's the weather in Yeouido now?). While it doesn't explicitly exclude alternatives like get_air_quality, the example and wording strongly imply use for general weather inquiries, giving reasonable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_cultural_eventsSearch Seoul cultural eventsA
Search Seoul cultural events (concerts, exhibitions, festivals) by keyword/category/district/date-range/free-only. 서울시 문화행사 검색. "이번 주말 마포구 무료 공연 있어?" 류 질문에 사용.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | 기간 끝 YYYY-MM-DD | |
| from | No | 기간 시작 YYYY-MM-DD | |
| limit | No | 최대 건수 (기본 15) | |
| keyword | No | 행사명 키워드 (API TITLE 검색) | |
| category | No | 분류 (예: 콘서트, 전시/미술, 축제-문화/예술) | |
| district | No | 자치구 (예: 마포구) | |
| freeOnly | No | 무료만 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It reveals that the tool can handle natural-language-style questions and supports filtering by multiple criteria. However, it does not explain the return format, default behavior with no parameters, or data source, which would add further transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with a clear English sentence, followed by a Korean translation and an example. The Korean translation is redundant since it mirrors the title, but the example adds value and the overall length is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with 7 optional parameters and no output schema, the description provides a solid overview including event categories, filter dimensions, and an example use case. It could be enhanced by mentioning default result limits or the nature of events covered, but it is adequate for invoking the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so the baseline is 3. The description groups parameters into meaningful categories (keyword/category/district/date-range/free-only), which adds a useful high-level overview, but it does not add semantics beyond what the schema already provides for each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches Seoul cultural events, listing specific event categories (concerts, exhibitions, festivals) and filter dimensions (keyword, category, district, date-range, free-only). This is specific and easily distinguishable from sibling tools like search_place or get_weather.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a concrete example query ('이번 주말 마포구 무료 공연 있어?' meaning 'Is there a free performance in Mapo-gu this weekend?') which illustrates a natural language usage scenario. It does not explicitly name alternative tools or state when not to use it, but the domain is clear enough and distinct from siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_datasetSearch the Seoul dataset catalogA
Search the curated catalog of 28 Seoul Open Data datasets by keyword; entries with a dedicated tool point you to it. 카탈로그에서 데이터셋을 검색합니다. 정식 tool이 없는 데이터는 call_dataset으로 호출하세요.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 키워드 (예: "와이파이", "실거래가", "무더위쉼터") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the transparency burden. It discloses the catalog size, the routing behavior to dedicated tools, and the fallback to call_dataset. This is useful contextual behavior beyond a basic search, though it doesn't specify the response format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, but the Korean sentence partly repeats the English sentence. However, it also adds the call_dataset instruction, so each sentence contributes something distinct.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple search tool with one parameter and no output schema, the description provides sufficient context: it names the catalog, explains the routing logic, and points to the alternative for tools without dedicated access. Minor omission is the result format, but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of the query parameter with a Korean description and examples. The description adds no extra parameter-level detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches a curated catalog of 28 Seoul Open Data datasets by keyword, which is a specific verb-resource pair. It also distinguishes from siblings like search_place and search_cultural_events, which search different types of data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: entries with a dedicated tool point you to it, and data without a dedicated tool should be accessed via call_dataset. This clarifies when to use this tool versus the alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_placeSearch Seoul hotspot placesA
Resolve a free-form place name to one of Seoul's 121 official real-time hotspots. Use FIRST when the user mentions a Seoul location. 자연어 장소명을 서울 실시간 도시데이터 핫스팟 121곳에 매칭합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 장소명 (예: "강남역", "홍대", "코엑스", "Gangnam") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that the tool maps to a fixed set of 121 official real-time hotspots, implying a constrained resolution rather than a general search. However, it does not describe what happens on no match, the output format, or any other behavioral edge cases, leaving a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, with the key purpose clear in the first sentence. However, it includes a bilingual repetition of the same message in Korean, which adds length without new information. A single-language description would have been more efficient, so not every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple one-parameter tool with no annotations and no output schema, so the description needs to cover core behavior and return expectations. It correctly explains the purpose and scope (matching to 121 hotspots) and gives usage guidance, but it lacks any description of the return value or failure behavior. Given the absence of an output schema, this is a meaningful gap, though the tool is simple enough that the description is not fatally inadequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the 'query' parameter with examples (100% coverage), so the baseline is 3. The description adds semantic value by characterizing the input as 'free-form place name' and '자연어 장소명' (natural language place name), clarifying that it accepts natural language phrasing rather than structured identifiers. This goes beyond the schema's mere label.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Resolve a free-form place name to one of Seoul's 121 official real-time hotspots.' This specifies a concrete verb ('Resolve') and a well-defined resource (Seoul's 121 official hotspots), distinguishing it from the many data-fetching sibling tools like get_subway_arrivals or get_weather.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use FIRST when the user mentions a Seoul location.' This tells the agent exactly when to invoke this tool, but it does not name specific alternative tools or state when not to use it, so it stops short of the full 'when/when-not/alternatives' criterion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
19 tool updates
v0.2.0- First observed
call_dataset - First observed
find_pharmacies - First observed
get_air_quality - First observed
get_bike_stations - First observed
get_city_snapshot - First observed
get_commercial_activity - First observed
get_dataset_spec - First observed
get_disaster_alerts - First observed
get_living_population - First observed
get_parking - First observed
get_population - First observed
get_real_estate_prices - First observed
get_road_traffic - First observed
get_subway_arrivals - First observed
get_subway_ridership - First observed
get_weather - First observed
search_cultural_events - First observed
search_dataset - First observed
search_place
TDQS
Most tools target distinct domains (subway, parking, weather, etc.), but get_weather and get_air_quality overlap on fine dust data, and get_population vs get_living_population could be confused despite clarifying descriptions. Overall, boundaries are clear enough with the provided intent examples.
All tools follow a consistent verb_noun pattern (get_, search_, find_, call_). Verbs are semantically appropriate and nouns are specific, making the set predictable and easy to navigate.
19 tools is slightly heavy but well-justified for a comprehensive city data server covering real-time, historical, and catalog-based access. The count is within a manageable range and each tool has a distinct role, though a few could arguably be consolidated.
The tool surface covers a wide range of Seoul open data domains: place resolution, real-time congestion, weather, transport, commercial activity, cultural events, and administrative statistics. The catalog tools (search_dataset, get_dataset_spec, call_dataset) provide a fallback for any dataset without a dedicated tool, ensuring no dead ends.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
This MCP server provides seamless access to Malaysia's government open data, including datasets, w…
MCP server for searching Airweave collections with natural language queries.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server providing access to 1M synthetic Korean personas based on KOSIS statistics, enabling persona sampling, search, and analysis via natural language queries.12MIT
- FlicenseNot gradedqualityBmaintenanceA read-only MCP server providing access to various Korean public data such as subway arrivals, weather, fine dust, bike availability, real estate, and more.-
- FlicenseNot gradedqualityCmaintenanceThis MCP server integrates South Korea's national law information, building registers from MOLIT, and KOSIS statistics for housing development research. It enables searching laws, retrieving building details, and accessing statistical data through natural language.-
- FlicenseAqualityCmaintenanceEnables querying Korean public datasets (apartment prices, weather, air quality) via natural language using an MCP server and local LLM agent.5-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/whchoi98/seoul-opendata-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server