ECOS MCP Server
Click on "Deploy 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., "@ECOS MCP ServerWhat's the recent trend in the base rate?"
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.
๐ฆ ECOS MCP Server
ํ๊ตญ์ํ ๊ฒฝ์ ํต๊ณ์์คํ (ECOS) Open API๋ฅผ ์ํ ์ต์ MCP(Model Context Protocol) ์๋ฒ์ ๋๋ค.
AI ์์ด์ ํธ(Claude Desktop, Cursor ๋ฑ)๊ฐ ํ๊ตญ ๊ฑฐ์๊ฒฝ์ ํต๊ณ ๋ฐ์ดํฐ๋ฅผ ์์ฐ์ด๋ก ์ค์๊ฐ ๊ฒ์ํ๊ณ ๊ณ ํจ์จ ์๊ณ์ด ๋ถ์์ ์ํํ ์ ์๊ฒ ํด์ค๋๋ค.
โจ ํต์ฌ ๊ธฐ๋ฅ
๐ ๏ธ MCP Tools (7๊ฐ)
๋ชจ๋ ๋๊ตฌ๋ ์ฝ๊ธฐ ์ ์ฉ(readOnlyHint)์ผ๋ก ํ์๋์ด ์๊ณ , ์คํจ ์ MCP ํ์ค ์๋ฌ(isError: true)๋ฅผ ๋ฐํํฉ๋๋ค.
Tool | ์ค๋ช | ์ฃผ์ ํน์ง |
| 1-Shot ์ธ๊ธฐ ์งํ ์ฆ์ ์กฐํ | ๊ธฐ์ค๊ธ๋ฆฌ, ์ฑ์ฅ๋ฅ , ๋ฌผ๊ฐ์์น๋ฅ , ํ์จ ๋ฑ์ ์ฝ๋ ๊ฒ์ ์์ด ํ ๋ฒ์ ํธ์ถ๋ก ์กฐํ |
| ํต๊ณ ์๊ณ์ด ๋ฐ์ดํฐ ์กฐํ (ํต์ฌ) | ์ค๋งํธ ๋ ์ง, ์ต์ ๊ตฌ๊ฐ ์ฐ์ , ์ฆ๊ฐ๋ฅ ๊ณ์ฐ( |
| ํต๊ณํ ๊ฒ์ยท๊ณ์ธต ํ์ | ๋ก์ปฌ ์ธ๋ฑ์ค๋ก ์ฆ์ ์๋ต. ๋์ด์ฐ๊ธฐ ๋ฌด์ยท๋ค์ค ๋จ์ดยท๊ด๋ จ๋ ์ ์ ๋ ฌ, |
| 100๋ ์ฃผ์ ๊ฒฝ์ ์งํ ์กฐํ | GDP, ๊ธฐ์ค๊ธ๋ฆฌ, ํ์จ, ํตํ๋ ๋ฑ ์ค์๊ฐ ํต์ฌ ์งํ |
| ํต๊ณ ์ฉ์ด ์ฌ์ ๊ฒ์ | ํ๊ตญ์ํ ๊ณต์ ์ฉ์ด ํด์ค |
| ํต๊ณํ ์ธ๋ถํญ๋ชฉ ๋ชฉ๋ก ์กฐํ | ํญ๋ชฉ์ฝ๋, ์ง์ ์ฃผ๊ธฐ, ์๋ก ๊ธฐ๊ฐ, ๋จ์ ํ์ธ (๊ฒฐ๊ณผ ์บ์) |
| ํต๊ณ ๋ฉํ๋ฐ์ดํฐ ์กฐํ | ํต๊ณ ์์ฑ ๋ฐฐ๊ฒฝ, ์์ฑ ์ฃผ๊ธฐ, ํธ์ ๊ธฐ์ค ๋ฑ (๊ฒฐ๊ณผ ์บ์) |
โก ํ ํฐ ์ต์ ํ ํฌ๋งท (output_format)
์๊ณ์ด ์กฐํ(search_statistics, get_popular_statistic) ๊ฒฐ๊ณผ๋ ๊ณต๋ฐฑ ์๋ JSON์ผ๋ก ๋ฐํ๋ฉ๋๋ค.
"compact"(๊ธฐ๋ณธ๊ฐ): ๊ณ์ด(ํญ๋ชฉ)๋ณ๋ก ์ด๋ฆยท๋จ์๋ฅผ ํ ๋ฒ๋ง ์ฐ๊ณ ๊ฐ์[์์ , ๊ฐ]๋ฐฐ์ด๋ก ๋ฐํ"csv": ํ ์ค์ ๊ด์ธก์น ํ๋. ์ฌ๋ฌ ํญ๋ชฉ์ ํยท์ฐจํธ๋ก ์ฎ๊ธธ ๋ ํธ๋ฆฌ"json": ECOS ์๋ณธ ํ ๊ทธ๋๋ก
์ธก์ ์์(์๋น์๋ฌผ๊ฐ์ง์ 24๊ฐ์ ๋จ์ผ ๊ณ์ด, ๋ฌธ์ ์ ๊ธฐ์ค): ์๋ณธ JSON 6,545์ โ compact 605์(์ฝ 91% ์ถ์), csv 805์.
๐ ์ฆ๊ฐ๋ฅ ยท๋ณ๊ฒฝ ์์ (transform, changes_only)
transform="yoy": ์ ๋ ๋๊ธฐ๋๋น ์ฆ๊ฐ๋ฅ (%) ์ด(yoy_pct) ์ถ๊ฐ. ๊ธฐ์ค ์์ ๋ฐ์ดํฐ๋ ์๋์ผ๋ก ํจ๊ป ์กฐํํฉ๋๋ค.transform="pop": ์ง์ ๊ด์ธก์น ๋๋น ์ฆ๊ฐ๋ฅ (%) ์ด(pop_pct) ์ถ๊ฐchanges_only=True: ๊ฐ์ด ๋ฐ๋ ์์ ๋ง ๋ฐํ (์: ์ผ๋ณ ๊ธฐ์ค๊ธ๋ฆฌ 2๋ ์น ์ฝ 500ํ โ ๋ณ๊ฒฝ ์์ ๋ช ํ)
๐๏ธ ์ค๋งํธ ๋ ์ง & ์ต์ ๊ตฌ๊ฐ ์ฐ์
start_date/end_date๋ฅผ ์๋ตํ๋ฉด ์ผ๊ฐ(D)์ ์ต๊ทผ 3๊ฐ์, ๊ทธ ์ธ ์ฃผ๊ธฐ๋ ์ต๊ทผ 2๋ ์ด ์๋ ์ค์ ๋ฉ๋๋ค.๊ฒฐ๊ณผ๊ฐ ํ ๋ฒ์ ๋ค ๋ด๊ธฐ์ง ์์ผ๋ฉด(
end_count์ด๊ณผ, sample ํค๋ 10๊ฑด) ๊ฐ์ฅ ์ต๊ทผ ๊ตฌ๊ฐ์ ๋ฐํํ๊ณtruncated: true์ ์๋ด ๋ฌธ๊ตฌ๋ฅผ ๋ถ์ ๋๋ค. ๊ณผ๊ฑฐ๋ถํฐ ํ์ด์ง ๋จ์๋ก ๋ฐ์ผ๋ ค๋ฉดprefer_latest=False๋ฅผ ์ฐ์ธ์.
Related MCP server: kosis-mcp
๐ MCP Resources & Prompts
Resources
ecos://popular-indicators: ํ๊ตญ์ํ ์ฃผ์ ํต์ฌ ๊ฒฝ์ ์งํ(๊ธฐ์ค๊ธ๋ฆฌ, ์ค์ง GDP, ์๋น์๋ฌผ๊ฐ์ง์, ํ์จ, M2 ๋ฑ) ํ๋ฆฌ์ ๋งคํํecos://date-format-guide: ์ฃผ๊ธฐ(Cycle)๋ณ ์ฌ๋ฐ๋ฅธ ๋ ์ง ํฌ๋งท ๊ท๊ฒฉ ์๋ด์
Prompts
macro-economic-briefing: 100๋ ์งํ์ ์ฑ์ฅ๋ฅ ยท๋ฌผ๊ฐ์์น๋ฅ ยท๊ธฐ์ค๊ธ๋ฆฌยทํ์จ ์ถ์ด ๊ธฐ๋ฐ ๊ฒฝ์ ํํฉ ๋ธ๋ฆฌํanalyze-economic-trend: ํน์ ๊ฒฝ์ ์งํ(์๋น์๋ฌผ๊ฐ์ง์ ๋ฑ) ์๊ณ์ด ์ถ์ด ๋ฐ ์ ์ฑ ์์ฌ์ ์ฌ์ธต ๋ถ์
๐ ์ฃผ๊ธฐ(Cycle)๋ณ ๋ ์ง ํฌ๋งท ๊ท์น
์ฃผ๊ธฐ ์ฝ๋ | ์ฃผ๊ธฐ๋ช | ์์/์ข ๋ฃ์ผ ํฌ๋งท ๊ท๊ฒฉ | ์์ |
| ์ฐ๊ฐ |
|
|
| ๋ฐ๊ธฐ |
|
|
| ๋ถ๊ธฐ |
|
|
| ์๊ฐ |
|
|
| ๋ฐ์ |
|
|
| ์ผ๊ฐ |
|
|
๐ ์ฃผ์ ์ธ๊ธฐ ํต๊ณํ ํ๋ฆฌ์
์งํ๋ช | ํค์๋(๋ณ์นญ) | ํต๊ณํ์ฝ๋ | ์ฃผ๊ธฐ | ํญ๋ชฉ์ฝ๋ | ๊ธฐ๋ณธ ์ฒ๋ฆฌ |
ํ๊ตญ์ํ ๊ธฐ์ค๊ธ๋ฆฌ |
|
|
|
| ๋ณ๊ฒฝ ์์ ๋ง |
๊ฒฝ์ ์ฑ์ฅ๋ฅ (์ค์ง, ์ ๊ธฐ๋น %) |
|
|
|
| |
์ค์ง GDP(๋ถ๊ธฐ, ์ญ์ต์) |
|
|
|
| |
์๋น์๋ฌผ๊ฐ์์น๋ฅ (%) |
|
|
|
|
|
์๋น์๋ฌผ๊ฐ์ง์(CPI) |
|
|
|
| |
์/๋ฌ๋ฌ ํ์จ(์ผ๋ณ) |
|
|
|
| |
์/๋ฌ๋ฌ ํ์จ(์ํ๊ท ) |
|
|
|
| |
๋ณธ์ํตํ(ํ์) |
|
|
|
| |
M2 ๊ด์ํตํ |
|
|
|
| |
๊ตญ๊ณ ์ฑ(3๋ ) ์์ต๋ฅ (์ผ๋ณ) |
|
|
|
| |
๊ตญ๊ณ ์ฑ(3๋ ) ์์ต๋ฅ (์ํ๊ท ) |
|
|
|
| |
์์ฐ์๋ฌผ๊ฐ์ง์(PPI) |
|
|
|
|
"ํตํ", "์ง์"์ฒ๋ผ ์ฌ๋ฌ ์งํ์ ๊ฑธ์น๋ ํค์๋๋ ํ๋ณด ๋ชฉ๋ก์ ๋ด์ ์๋ฌ๋ฅผ ๋๋ ค์ฃผ๋ฏ๋ก, ๋ ๊ตฌ์ฒด์ ์ธ ํค์๋๋ id๋ฅผ ์ฐ๋ฉด ๋ฉ๋๋ค.
๐ ๋น ๋ฅธ ์์
1. ์ค์น (๋ก์ปฌ ๊ฐ๋ฐ ์)
git clone https://github.com/kgy0617/ecos_mcp.git
cd ecos_mcp
uv sync2. API ํค ์ค์ (์ ํ)
cp .env.example .env
# .env ํ์ผ์์ ECOS_API_KEY ์
๋ ฅ (๋ฏธ์
๋ ฅ ์ sample ํค ์๋ ์ ์ฉ)๐ก API ํค ์์ด๋
sampleํค๋ก ํ ์คํธ ๊ฐ๋ฅํ๋ฉฐ, 1ํ ์ต๋ ํ์ฉ์น(10๊ฑด)๋ก ์๋ ํด๋จํ๋ฉ๋๋ค.
3. ์๊ฐ ์ง๋จ ํฌ์ค์ฒดํฌ ์คํ
uv run ecos-mcp --check๋คํธ์ํฌ ์ฐ๊ฒฐ, API ํค ์ํ, ํต๊ณํ ์ธ๋ฑ์ค ๋ก๋๊ฐ ์๋์ผ๋ก ์ง๋จ๋ฉ๋๋ค.
๐ง MCP ํด๋ผ์ด์ธํธ ์ค์
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json:
๋ฐฉ๋ฒ A: GitHub URL ์ง์ ์คํ (ํด๋ก ๋ถํ์, ์ถ์ฒ โญ)
{
"mcpServers": {
"ecos": {
"command": "uvx",
"args": ["--from", "git+https://github.com/kgy0617/ecos_mcp", "ecos-mcp"],
"env": {
"ECOS_API_KEY": "your_api_key_here"
}
}
}
}๋ฐฉ๋ฒ B: ๋ก์ปฌ ํด๋ก ์คํ
{
"mcpServers": {
"ecos": {
"command": "uv",
"args": ["--directory", "/path/to/ecos_mcp", "run", "ecos-mcp"],
"env": {
"ECOS_API_KEY": "your_api_key_here"
}
}
}
}Claude Code
claude mcp add ecos -e ECOS_API_KEY=your_api_key_here -- uvx --from git+https://github.com/kgy0617/ecos_mcp ecos-mcpCursor
Settings > Features > MCP Servers > Add New MCP Server:
๋ฐฉ๋ฒ A (GitHub ์ง์ ์คํ):
Name:
ecosType:
commandCommand:
uvx --from git+https://github.com/kgy0617/ecos_mcp ecos-mcp
๋ฐฉ๋ฒ B (๋ก์ปฌ ํด๋ก ):
Name:
ecosType:
commandCommand:
uv --directory /path/to/ecos_mcp run ecos-mcp
๐ ์ฌ์ฉ ์์
1. ์ธ๊ธฐ ์งํ ์์คํฑ ์กฐํ (get_popular_statistic)
์ฌ์ฉ์: "์ต๊ทผ ํ๊ตญ ๊ธฐ์ค๊ธ๋ฆฌ ์ด๋ป๊ฒ ๋ฐ๋์์ด?"
Tool ํธ์ถ:
{
"indicator": "๊ธฐ์ค๊ธ๋ฆฌ",
"recent_years": 2,
"output_format": "compact"
}์๋ต ์์ (์ผ๋ณ 500์ฌ ํ ๋์ changes_only=True๊ฐ ๊ธฐ๋ณธ ์ ์ฉ๋์ด ๊ธ๋ฆฌ ๋ณ๋ ์์ ๋ง ๊ฐ๊ฒฐํ๊ฒ ๋ฐํ):
{
"stat_code": "722Y001",
"stat_name": "ํ๊ตญ์ํ ๊ธฐ์ค๊ธ๋ฆฌ ๋ฐ ์ฌ์์ ๊ธ๋ฆฌ",
"indicator": "base_rate",
"total_count": 500,
"count": 3,
"columns": ["time", "value"],
"series": [
{
"item": "ํ๊ตญ์ํ ๊ธฐ์ค๊ธ๋ฆฌ",
"item_code": "0101000",
"unit": "์ฐ%",
"data": [
["20230113", 3.5],
["20241011", 3.25],
["20241128", 3.0]
]
}
]
}2. ๋ฌผ๊ฐ์์น๋ฅ CSV ์์ ํ ์ฐจํธ ๋ถ์
์ฌ์ฉ์: "์๋น์๋ฌผ๊ฐ ์์น๋ฅ ์ต๊ทผ ๋ฐ์ดํฐ CSV๋ก ๋ฝ์์ ๋ถ์ํด์ค"
Tool ํธ์ถ:
{
"indicator": "๋ฌผ๊ฐ์์น๋ฅ ",
"recent_years": 1,
"output_format": "csv"
}์๋ต ์์ (transform="yoy"๊ฐ ์๋ ์ ์ฉ๋์ด ์ ๋
๋๊ธฐ๋๋น ์ฆ๊ฐ๋ฅ ์ด์ธ YOY_PCT๊ฐ ํฌํจ๋จ):
# stat_code: 901Y009
# stat_name: 4.2.1. ์๋น์๋ฌผ๊ฐ์ง์
# indicator: inflation_rate
# total_count: 12
# count: 12
TIME,ITEM_CODE,ITEM,VALUE,UNIT,YOY_PCT
202401,0,์ด์ง์,113.15,2020=100,2.8
202402,0,์ด์ง์,113.77,2020=100,3.1
202403,0,์ด์ง์,113.94,2020=100,3.1
202404,0,์ด์ง์,114.09,2020=100,2.9
202405,0,์ด์ง์,114.14,2020=100,2.7
...3. ํต๊ณํ ํค์๋ ๊ฒ์ ๋ฐ ๊ณ์ธต ํ์ (search_statistic_tables)
์ฌ์ฉ์: "์๋น์๋ฌผ๊ฐ ๊ด๋ จ ํต๊ณํ ์ฐพ์์ค"
Tool ํธ์ถ:
{
"keyword": "์๋น์ ๋ฌผ๊ฐ",
"searchable_only": true,
"limit": 3
}์๋ต ์์ (๋ก์ปฌ ์ธ๋ฑ์ค ๊ธฐ๋ฐ์ผ๋ก ๋์ด์ฐ๊ธฐ ๋ฌด์ ๋ฐ ๊ด๋ จ๋ ์ ์ ๋ ฌ):
{
"query": "์๋น์ ๋ฌผ๊ฐ",
"total_matches": 3,
"count": 2,
"searchable_only": true,
"index_generated_at": "2026-09-26",
"rows": [
{
"P_STAT_CODE": "0000000211",
"STAT_CODE": "901Y009",
"STAT_NAME": "4.2.1. ์๋น์๋ฌผ๊ฐ์ง์",
"CYCLE": "M",
"SRCH_YN": "Y",
"ORG_NAME": "๊ตญ๊ฐ๋ฐ์ดํฐ์ฒ(02-2012-9114)"
},
{
"P_STAT_CODE": "0000000211",
"STAT_CODE": "901Y010",
"STAT_NAME": "4.2.2. ์๋น์๋ฌผ๊ฐ์ง์(ํน์๋ถ๋ฅ)",
"CYCLE": "M",
"SRCH_YN": "Y",
"ORG_NAME": "๊ตญ๊ฐ๋ฐ์ดํฐ์ฒ(02-2012-9114)"
}
]
}Tip: parent_code="0000000211"๋ฅผ ์ง์ ํ๋ฉด ํด๋น ๋ถ๋ฅ์ ํ์ ํต๊ณํ ํธ๋ฆฌ๋ฅผ ์ง์ ํ์ํ ์๋ ์์ต๋๋ค.
4. ํต๊ณ ์ฉ์ด ์ฌ์ ๊ฒ์ (search_statistic_word)
์ฌ์ฉ์: "ํ๊ตญ์ํ์์ ์ ์ํ๋ ๊ธฐ์ค๊ธ๋ฆฌ์ ์ ํํ ์๋ฏธ๊ฐ ๋ญ์ผ?"
Tool ํธ์ถ:
{
"word": "๊ธฐ์ค๊ธ๋ฆฌ"
}์๋ต ์์:
{
"total_count": 1,
"count": 1,
"rows": [
{
"WORD": "๊ธฐ์ค๊ธ๋ฆฌ",
"CONTENT": "ํ๊ตญ์ํ์ด ๊ธ์ต๊ธฐ๊ด๊ณผ ํ๋งค์กฐ๊ฑด๋ถ์ฆ๊ถ(RP) ๋งค๋งค, ์๊ธ์กฐ์ ์๊ธ ๋ฐ ๋์ถ ๋ฑ์ ๊ฑฐ๋๋ฅผ ํ ๋ ๊ธฐ์ค์ด ๋๋ ์ ์ฑ
๊ธ๋ฆฌ"
}
]
}๐งช ํ ์คํธ ์คํ
uv run pytest # ์คํ๋ผ์ธ ๋จ์ ํ
์คํธ (ECOS API๋ฅผ ๋ชจํน, ๋คํธ์ํฌ ๋ถํ์)
uv run pytest -m live # ์ค์ ECOS API ํธ์ถ ํ
์คํธ (๋ชจ๋ ํ๋ฆฌ์
์กฐํ ํ์ธ)๐ ๋ผ์ด์ ์ค
MIT License
Available Tools
7 toolsget_key_statistics100๋ ์ฃผ์ ๊ฒฝ์ ์งํARead-onlyIdempotent
100๋ ์ฃผ์ ๊ฒฝ์ ์งํ๋ฅผ ์กฐํํฉ๋๋ค.
GDP ์ฑ์ฅ๋ฅ , ๊ธฐ์ค๊ธ๋ฆฌ, ์๋น์๋ฌผ๊ฐ ์์น๋ฅ , ์ค์
๋ฅ , M1/M2 ํตํ๋ ๋ฑ
ํ๊ตญ ๊ฒฝ์ ์ ํต์ฌ ์งํ๋ฅผ ํ ๋ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
Args:
start_count: ์กฐํ ์์ ์๋ฒ (๊ธฐ๋ณธ๊ฐ: 1)
end_count: ์กฐํ ๋ ์๋ฒ (๊ธฐ๋ณธ๊ฐ: 100, sample ํค๋ ์ต๋ 10๊ฑด์ผ๋ก ์๋ ์ ํ)
language: ์๋ต ์ธ์ด โ "kr"(ํ๊ตญ์ด) ๋๋ "en"(์์ด)
Returns:
์ฃผ์ ๊ฒฝ์ ์งํ ๋ชฉ๋ก
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | kr | |
| end_count | No | ||
| start_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds minor behavioral details such as the sample key being limited to 10 items and default language behavior, but it does not disclose the return response structure or pagination semantics. These additions are useful but not extensive.
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 well-structured, with a one-line summary, a brief list of example indicators, and clearly separated Args and Returns sections. It is front-loaded with the purpose and contains no redundant sentences.
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 read-only tool, the description explains parameters and indicates a list return, but it does not detail the exact fields of each indicator or any error handling. Given there is no output schema, the description could be more explicit about the response structure, but the tool's simplicity and annotation coverage partially compensate.
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 0%, so the description bears the full burden of explaining parameters. It clearly describes start_count (start order), end_count (end order), and language options (kr/en), including defaults and the automatic limit of 10 for sample keys. This adds meaningful context beyond the bare schema fields.
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 queries the top 100 key economic indicators, listing specific examples like GDP growth, base rate, CPI, unemployment, and M1/M2 money supply. It distinguishes itself from siblings (e.g., search_statistics) because it provides a pre-defined curated list, not a search function.
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?
No guidance is provided on when to use this tool versus its siblings. It does not mention alternatives, exclusions, or conditions for preferring this tool over search_statistics or get_popular_statistic. The agent is left to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_popular_statistic์ธ๊ธฐ ๊ฒฝ์ ์งํ ์ฆ์ ์กฐํARead-onlyIdempotent
ํ๊ตญ์ํ ํต์ฌ ๊ฒฝ์ ์งํ๋ฅผ ์ฝ๋ ๊ฒ์ ์์ด ๋จ 1๋ฒ์ ํธ์ถ๋ก ์ฆ์ ์กฐํํฉ๋๋ค.
์ฌ์ฉ์๊ฐ "๊ธฐ์ค๊ธ๋ฆฌ ์๋ ค์ค", "์ต๊ทผ ์ฑ์ฅ๋ฅ ", "๋ฌผ๊ฐ์์น๋ฅ ์ถ์ด" ๋ฑ์ ๋ฌผ์ ๋
ํต๊ณํ์ฝ๋๋ ํญ๋ชฉ์ฝ๋๋ฅผ ๊ฒ์ํ ํ์ ์์ด ์ฆ๊ฐ์ ์ผ๋ก ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
์ง์ํ๋ ์งํ ํค์๋:
- ๊ธฐ์ค๊ธ๋ฆฌ ("๊ธฐ์ค๊ธ๋ฆฌ", "๊ธ๋ฆฌ", "์ ์ฑ
๊ธ๋ฆฌ") โ ๋ณ๊ฒฝ ์์ ๋ง ๋ฐํ(changes_only ๊ธฐ๋ณธ True)
- ๊ฒฝ์ ์ฑ์ฅ๋ฅ ("๊ฒฝ์ ์ฑ์ฅ๋ฅ ", "์ฑ์ฅ๋ฅ ", "GDP์ฑ์ฅ๋ฅ ") โ ์ค์ง GDP ์ ๊ธฐ๋น %
- ๊ตญ๋ด์ด์์ฐ ("GDP", "์ค์งGDP", "๊ตญ๋ด์ด์์ฐ") โ ์ค์ง GDP ์์ค(์ญ์ต์)
- ์๋น์๋ฌผ๊ฐ์์น๋ฅ ("๋ฌผ๊ฐ์์น๋ฅ ", "์ธํ๋ ์ด์
") โ CPI ์ ๋
๋์๋น %(yoy_pct)
- ์๋น์๋ฌผ๊ฐ์ง์ ("CPI", "์๋น์๋ฌผ๊ฐ", "๋ฌผ๊ฐ") โ ์ง์ ์์ค(2020=100)
- ์/๋ฌ๋ฌ ํ์จ ("ํ์จ", "์๋ฌ๋ฌ", "๋ฌ๋ฌ", "USD") โ ์ผ๋ณ / ("์ํ๊ท ํ์จ") โ ์ํ๊ท
- ๋ณธ์ํตํ ("๋ณธ์ํตํ", "์ค์์ํ๋ถ์ฑ")
- M2 ๊ด์ํตํ ("M2", "ํตํ๋", "๊ด์ํตํ")
- ๊ตญ๊ณ ์ฑ 3๋
("๊ตญ๊ณ ์ฑ", "๊ตญ๊ณ ์ฑ3๋
", "์ฑ๊ถ๊ธ๋ฆฌ") โ ์ผ๋ณ / ("๊ตญ๊ณ ์ฑ์ํ๊ท ") โ ์ํ๊ท
- ์์ฐ์๋ฌผ๊ฐ์ง์ ("PPI", "์์ฐ์๋ฌผ๊ฐ")
Args:
indicator: ์กฐํํ ์งํ๋ช
๋๋ ํค์๋ (์: "๊ธฐ์ค๊ธ๋ฆฌ", "๋ฌผ๊ฐ์์น๋ฅ ", "์ฑ์ฅ๋ฅ ", "ํ์จ")
recent_years: start_date ๋ฏธ์ง์ ์ ์ต๊ทผ ๋ช ๋
์น๋ฅผ ์กฐํํ ์ง (๊ธฐ๋ณธ: ์ผ๋ณ ์งํ ์ต๊ทผ 3๊ฐ์, ๊ทธ ์ธ 2๋
)
start_date: ๊ฒ์ ์์์ผ (์ฃผ๊ธฐ์ ๋ง๋ ํฌ๋งท. ๋ฏธ์
๋ ฅ ์ ์๋ ๊ณ์ฐ)
end_date: ๊ฒ์ ์ข
๋ฃ์ผ (๋ฏธ์
๋ ฅ ์ ํ์ฌ ์์ )
output_format: "compact"(๊ธฐ๋ณธ๊ฐ, ๊ณ์ด๋ณ [์์ , ๊ฐ] ๋ฐฐ์ด), "csv", "json"(ECOS ์๋ณธ ํ)
transform: "yoy"(์ ๋
๋๊ธฐ๋๋น %), "pop"(์ง์ ๊ด์ธก์น ๋๋น %), "none". ๋ฏธ์ง์ ์ ์งํ ๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ
changes_only: True๋ฉด ๊ฐ์ด ๋ฐ๋ ์์ ๋ง ๋ฐํ. ๋ฏธ์ง์ ์ ์งํ ๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ
Returns:
ํต์ฌ ๊ฒฝ์ ์งํ ์๊ณ์ด ๋ฐ์ดํฐ. ๊ฒฐ๊ณผ๊ฐ ํ ๋ฒ์ ๋ค ๋ด๊ธฐ์ง ์์ผ๋ฉด ์ต์ ๊ตฌ๊ฐ์ ์ฐ์ ๋ฐํํฉ๋๋ค.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | ||
| indicator | Yes | ||
| transform | No | ||
| start_date | No | ||
| changes_only | No | ||
| recent_years | No | ||
| output_format | No | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, and the description adds per-indicator defaults (e.g., changes_only ๊ธฐ๋ณธ True for ๊ธฐ์ค๊ธ๋ฆฌ), output format semantics, and the fallback behavior of returning the latest period if results are too large. This is beyond the annotations and no contradiction exists.
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 long but organized into distinct sections (overview, supported indicators, Args, Returns) with no redundant prose. Each bullet adds keyword mappings or parameter semantics that are absent from the schema.
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 tool with 7 parameters and no output schema, the description covers return formats and behavior. However, it leaves some details vague, such as exact date string formats per frequency and per-indicator defaults for transform/changes_only, so an agent may still need to infer them.
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?
With 0% schema description coverage, the Args section documents all seven parameters, including defaults for recent_years, output_format, and allowed transform values. It also maps indicator keywords to their meanings, which the raw schema cannot convey.
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 immediately states it retrieves Bank of Korea core economic indicators in a single call without code lookup ('์ฝ๋ ๊ฒ์ ์์ด'), and enumerates the supported indicators. This specific verb+resource framing clearly differentiates it from sibling tools that search statistics tables or items.
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 says to use this tool when users request popular indicators like ๊ธฐ์ค๊ธ๋ฆฌ, ์ฑ์ฅ๋ฅ , or ๋ฌผ๊ฐ์์น๋ฅ , eliminating the need to search codes. However, it never names sibling tools or states when not to use it, so the guidance is contextual but not exclusionary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statistic_metaํต๊ณ ๋ฉํ๋ฐ์ดํฐARead-onlyIdempotent
ํต๊ณ ๋ฐ์ดํฐ์ ์ ๋ฉํ๋ฐ์ดํฐ(๊ตฌ์กฐ, ์์ฑ๋ฐฉ๋ฒ, ์ค๋ช )๋ฅผ ์กฐํํฉ๋๋ค.
Args:
data_name: ๋ฐ์ดํฐ์
์ด๋ฆ (ํ์). ์: "๊ฒฝ์ ์ฌ๋ฆฌ์ง์", "์๋น์๋ฌผ๊ฐ์ง์"
start_count: ์กฐํ ์์ ์๋ฒ (๊ธฐ๋ณธ๊ฐ: 1)
end_count: ์กฐํ ๋ ์๋ฒ (๊ธฐ๋ณธ๊ฐ: 100)
language: ์๋ต ์ธ์ด โ "kr" ๋๋ "en"
Returns:
๋ฉํ๋ฐ์ดํฐ
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | kr | |
| data_name | Yes | ||
| end_count | No | ||
| start_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and non-destructive behavior, so no contradiction exists; the description's '์กฐํ' matches readOnlyHint. It adds useful context about the content returned (structure, creation method, description) but not deeper behavioral details such as pagination limits or unknown-name handling.
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 purpose is front-loaded and the Args section is compactly organized. The only minor waste is the final 'Returns: ๋ฉํ๋ฐ์ดํฐ' line, which largely restates the opening sentence.
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 metadata lookup with four simple parameters, the description covers the required argument, defaults, allowed language values, and an example data_name. Without an output schema, the return description is still thin (just '๋ฉํ๋ฐ์ดํฐ'), but the description is enough to select and 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?
Schema description coverage is 0%, so the description carries the burden; it provides a required data_name example, defines start_count/end_count as sequence bounds with defaults, and constrains language to 'kr' or 'en'. This adds real value beyond the typed schema fields.
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 ('์กฐํ' / retrieve) and a concrete resource: metadata of a statistics dataset, including structure, methodology, and description. This clearly separates it from sibling tools that search statistics or return key statistics values.
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 purpose sentence implies use when the agent needs dataset metadata, but it never states explicit conditions or names alternatives such as get_key_statistics or search_statistics. No 'when not to use' guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_statistic_itemsํต๊ณํ ์ธ๋ถํญ๋ชฉARead-onlyIdempotent
ํน์ ํต๊ณํ์ ์ธ๋ถ ํญ๋ชฉ(ํญ๋ชฉ์ฝ๋, ์ง์ ์ฃผ๊ธฐ, ์๋ก ๊ธฐ๊ฐ, ๋จ์)์ ์กฐํํฉ๋๋ค.
Args:
stat_code: ํต๊ณํ์ฝ๋ (ํ์). search_statistic_tables์์ ์ฐพ์ ์ฝ๋ ์
๋ ฅ.
start_count: ์กฐํ ์์ ์๋ฒ (๊ธฐ๋ณธ๊ฐ: 1)
end_count: ์กฐํ ๋ ์๋ฒ (๊ธฐ๋ณธ๊ฐ: 500)
language: ์๋ต ์ธ์ด โ "kr" ๋๋ "en"
Returns:
์ธ๋ถํญ๋ชฉ ๋ชฉ๋ก (has_more=true๋ฉด start_count๋ฅผ ๋๋ ค ๋ค์ ํ์ด์ง ์กฐํ)
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | kr | |
| end_count | No | ||
| stat_code | Yes | ||
| start_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds value by explaining pagination behavior (has_more=true means increase start_count) and the language parameter, which are not available from annotations. No contradiction exists.
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, front-loaded with the purpose in the first sentence, and uses a structured Args/Returns layout. Every elementโpurpose, parameter semantics, pagination hintโhas a purpose, with no 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?
Despite having no output schema, the description discloses the shape of the result (a list of ์ธ๋ถํญ๋ชฉ) and the pagination contract, while all four parameters are documented. For a simple read-only listing tool, nothing needed for a correct first call is missing.
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?
With 0% schema description coverage, the description carries the full burden and succeeds: it explains stat_code is mandatory and where to obtain it, provides defaults for start_count/end_count, and lists the accepted values for language ('kr' or 'en'). This goes beyond the schema's bare types and defaults.
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 ('์กฐํํฉ๋๋ค') and a precise resource: the detailed items of a particular statistical table, listing the fields returned (ํญ๋ชฉ์ฝ๋, ์ง์ ์ฃผ๊ธฐ, ์๋ก ๊ธฐ๊ฐ, ๋จ์). It does not explicitly contrast with sibling tools, but the scope is unambiguous and it references search_statistic_tables as the source of the required stat_code.
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 Args section gives clear context: stat_code is required and must come from search_statistic_tables, and start_count/end_count control pagination. It does not state when not to use this tool or name alternative tools for the same purpose, so it earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_statisticsํต๊ณ ์๊ณ์ด ์กฐํARead-onlyIdempotent
ํต๊ณ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์กฐ๊ฑด๋ณ๋ก ์กฐํํฉ๋๋ค.
โ
์ค๋งํธ ๋ ์ง: start_date, end_date๋ฅผ ์๋ตํ๋ฉด ์ผ๊ฐ(D)์ ์ต๊ทผ 3๊ฐ์, ๊ทธ ์ธ ์ฃผ๊ธฐ๋ ์ต๊ทผ 2๋
์ด ์๋ ์ค์ ๋ฉ๋๋ค.
โ
์ต์ ์ฐ์ : ๊ฒฐ๊ณผ๊ฐ end_count๋ฅผ ๋์ผ๋ฉด ๊ฐ์ฅ ์ต๊ทผ ๊ตฌ๊ฐ์ ๋ฐํํ๊ณ truncated=true์ ์๋ด๋ฅผ ๋ถ์
๋๋ค.
โ
์ฆ๊ฐ๋ฅ : transform="yoy"(์ ๋
๋๊ธฐ๋๋น %) ๋๋ "pop"(์ง์ ๊ด์ธก์น ๋๋น %)๋ฅผ ์ง์ ํ๋ฉด ๊ณ์ฐ ์ด์ด ์ถ๊ฐ๋ฉ๋๋ค.
โ
ํฌ๋งท: "compact"(๊ธฐ๋ณธ๊ฐ, ๊ณ์ด๋ณ [์์ , ๊ฐ] ๋ฐฐ์ด), "csv", "json"(ECOS ์๋ณธ ํ)
โ
์ฃผ๊ธฐ(cycle) ๋ฐ ๋ ์ง ํฌ๋งท ๊ท์น:
- ์ฐ๊ฐ(A): YYYY (์: "2024")
- ๋ฐ๊ธฐ(S): YYYYS1, YYYYS2 (์: "2023S1")
- ๋ถ๊ธฐ(Q): YYYYQ1 ~ YYYYQ4 (์: "2024Q3")
- ์๊ฐ(M): YYYYMM (์: "202401")
- ๋ฐ์(SM): YYYYMMS1, YYYYMMS2 (์: "202401S1")
- ์ผ๊ฐ(D): YYYYMMDD (์: "20240315")
Args:
stat_code: ํต๊ณํ์ฝ๋ (ํ์). ์: "722Y001"(๊ธฐ์ค๊ธ๋ฆฌ), "901Y009"(์๋น์๋ฌผ๊ฐ)
cycle: ์ฃผ๊ธฐ (ํ์). A(์ฐ), S(๋ฐ๊ธฐ), Q(๋ถ๊ธฐ), M(์), SM(๋ฐ์), D(์ผ)
start_date: ๊ฒ์ ์์์ผ (์ ํ)
end_date: ๊ฒ์ ์ข
๋ฃ์ผ (์ ํ)
item_code1~4: ํต๊ณํญ๋ชฉ์ฝ๋ (์ ํ. ๋ฏธ์ง์ ์ ์ ์ฒด ์ธ๋ถํญ๋ชฉ ์กฐํ โ ๊ฒฐ๊ณผ๊ฐ ๋งค์ฐ ์ปค์ง ์ ์์)
output_format: "compact"(๊ธฐ๋ณธ๊ฐ), "csv", "json"
transform: "yoy", "pop", "none"(๊ธฐ๋ณธ๊ฐ)
changes_only: True๋ฉด ๊ฐ์ด ๋ฐ๋ ์์ ๋ง ๋ฐํ (๊ธ๋ฆฌ์ฒ๋ผ ๋๋ฌผ๊ฒ ๋ณํ๋ ์ผ๋ณ ์งํ์ ์ ์ฉ)
prefer_latest: ๊ฒฐ๊ณผ๊ฐ ์๋ฆด ๋ ์ต์ ๊ตฌ๊ฐ์ ์ฐ์ ๋ฐํ (๊ธฐ๋ณธ๊ฐ True)
start_count: ์กฐํ ์์ ์๋ฒ (๊ธฐ๋ณธ๊ฐ: 1)
end_count: ์กฐํ ๋ ์๋ฒ (๊ธฐ๋ณธ๊ฐ: 1000)
language: ์๋ต ์ธ์ด โ "kr" ๋๋ "en"
Returns:
์๊ณ์ด ๋ฐ์ดํฐ (์ง์ ๋ ํฌ๋งท)
| Name | Required | Description | Default |
|---|---|---|---|
| cycle | Yes | ||
| end_date | No | ||
| language | No | kr | |
| end_count | No | ||
| stat_code | Yes | ||
| transform | No | ||
| item_code1 | No | ||
| item_code2 | No | ||
| item_code3 | No | ||
| item_code4 | No | ||
| start_date | No | ||
| start_count | No | ||
| changes_only | No | ||
| output_format | No | compact | |
| prefer_latest | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint=false. The description adds substantial behavioral context beyond annotations: smart date auto-fill, truncated=true with guidance, transform calculations, format variations, changes_only behavior, prefer_latest default, and pagination via start_count/end_count. No contradiction with annotations.
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 long but well-structured with bullet points and sections. Key behaviors (smart dates, truncation, transform, formats) are front-loaded, then date format rules, then parameter details. Every sentence adds value; no fluff. Given 15 parameters, the length is appropriate and organized.
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 must explain return formats, and it does: 'compact' (array of [time, value] per series), 'csv', 'json'. It also covers pagination, truncation, transform options, date formats for all cycles, and the behavior of changes_only and prefer_latest. All necessary information for an agent to call the tool correctly is present.
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 0%, so the description carries the full burden of parameter explanation. It does so excellently: each parameter is documented in the Args section with types, defaults, and examples (e.g., stat_code examples, cycle options with format rules, output_format options, transform options, and the warning about item_code1-4 returning huge results). This fully compensates for the missing schema descriptions.
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 statistical time series data by conditions, with a specific verb and resource. It mentions stat_code and cycle as required, and the examples (๊ธฐ์ค๊ธ๋ฆฌ, ์๋น์๋ฌผ๊ฐ) distinguish it from sibling tools like get_statistic_meta or search_statistic_tables.
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 explains when to use the tool (time series queries) and provides extensive usage details like smart date defaults, truncation behavior, and format options. However, it does not explicitly mention alternative tools or exclusions, leaving some inference to the agent. It is clear enough that this is the time series query tool among the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_statistic_tablesํต๊ณํ ๊ฒ์ยทํ์ARead-onlyIdempotent
ํต๊ณํ ์ด๋ฆ์ผ๋ก ํต๊ณํ์ฝ๋(STAT_CODE)๋ฅผ ๊ฒ์ํ๊ฑฐ๋, ํต๊ณํ ๋ถ๋ฅ ํธ๋ฆฌ๋ฅผ ํ์ํฉ๋๋ค.
ECOS ํต๊ณํ ์ ์ฒด์ ๋ก์ปฌ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฏ๋ก API ํธ์ถ ์์ด ์ฆ์ ์๋ตํฉ๋๋ค.
- keyword ์ง์ : ์ด๋ฆ ๊ฒ์. ๋์ด์ฐ๊ธฐ๋ก ๋๋ ๋จ์ด๊ฐ ๋ชจ๋ ํฌํจ๋ ํต๊ณํ๋ฅผ ๊ด๋ จ๋ ์์ผ๋ก ๋ฐํ
("์๋น์ ๋ฌผ๊ฐ" โ "์๋น์๋ฌผ๊ฐ์ง์"). parent_code๋ฅผ ํจ๊ป ์ฃผ๋ฉด ๊ทธ ๋ถ๋ฅ ์๋์์๋ง ๊ฒ์ํฉ๋๋ค.
- keyword ์์ด parent_code ์ง์ : ํด๋น ๋ถ๋ฅ์ ์ง์ ํ์ ํญ๋ชฉ ๋ฐํ (๋ถ๋ฅ ๋
ธ๋ ํฌํจ)
- ๋ ๋ค ์์: ์ต์์ ๋ถ๋ฅ ๋ชฉ๋ก ๋ฐํ
Args:
keyword: ๊ฒ์ํ ํต๊ณ๋ช
๋๋ ํค์๋ (์: "๋ฌผ๊ฐ", "๊ธ๋ฆฌ", "ํ์จ", "๊ฒฝ์์์ง")
parent_code: ์์ ๋ถ๋ฅ STAT_CODE (์: "0000000001")
searchable_only: keyword ๊ฒ์ ์ ์ค์ ๋ฐ์ดํฐ ์กฐํ๊ฐ ๊ฐ๋ฅํ ํต๊ณํ(SRCH_YN='Y')๋ง ๋ฐํ (๊ธฐ๋ณธ๊ฐ: True)
limit: keyword ๊ฒ์ ์ ์ต๋ ๋ฐํ ๊ฐ์ (๊ธฐ๋ณธ๊ฐ: 20)
Returns:
ํต๊ณํ ๋ชฉ๋ก (STAT_CODE, STAT_NAME, CYCLE, SRCH_YN ๋ฑ)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| keyword | No | ||
| parent_code | No | ||
| searchable_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and idempotent; the description adds useful behavioral detail: it uses a local index, responds immediately without an API call, returns relevance-ordered results, and filters by SRCH_YN. This is consistent with the annotations and adds context beyond them, though it doesn't disclose edge cases such as invalid parent_code 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 structure is clear: purpose, behavioral note, three bullet modes, Args, Returns. It is longer than minimal but every section adds value; a small redundancy is repeating defaults that already exist in the schema.
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, it lists the returned fields (STAT_CODE, STAT_NAME, CYCLE, SRCH_YN) and explains the three call patterns, so an agent can invoke it correctly. It could be slightly more complete by explicitly routing to a sibling tool for other search needs, but that is more a usage-guideline gap than a completeness failure.
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 0%, but the Args section fully compensates by explaining all four parameters, giving example values (๋ฌผ๊ฐ, ๊ธ๋ฆฌ, 0000000001), and defining searchable_only and limit semantics with defaults. This gives an agent everything needed to fill the parameters correctly.
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 verb and resource: it searches statistic tables by name and traverses the statistic-table classification tree, returning STAT_CODE values. This is clear, though it does not explicitly distinguish itself from siblings like search_statistics or search_statistic_word, so it falls just short of full marks.
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 modes: keyword for name search, parent_code for direct children, neither for root categories, and combined for scoped search. It notes the local-index/no-api-call property as a context cue, but it never names an alternative tool or says when not to use this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_statistic_wordํต๊ณ ์ฉ์ด ์ฌ์ ARead-onlyIdempotent
๊ฒฝ์ /ํต๊ณ ์ฉ์ด์ ์ ์๋ฅผ ๊ฒ์ํฉ๋๋ค.
ํ๊ตญ์ํ ํต๊ณ์ฉ์ด์ฌ์ ์์ ์ฉ์ด์ ์์ธ ์ค๋ช
์ ์กฐํํฉ๋๋ค.
์: "๊ธฐ์ค๊ธ๋ฆฌ", "GDP", "์๋น์๋ฌผ๊ฐ์ง์", "ํตํ์น์" ๋ฑ
(ECOS ๋ฐฉํ๋ฒฝ ์ ์ฝ์ผ๋ก '/'๋ ๊ณต๋ฐฑ์ผ๋ก ๋ฐ๋์ด ๊ฒ์๋ฉ๋๋ค.)
Args:
word: ๊ฒ์ํ ํต๊ณ/๊ฒฝ์ ์ฉ์ด
start_count: ์กฐํ ์์ ์๋ฒ (๊ธฐ๋ณธ๊ฐ: 1)
end_count: ์กฐํ ๋ ์๋ฒ (๊ธฐ๋ณธ๊ฐ: 10)
language: ์๋ต ์ธ์ด โ "kr" ๋๋ "en"
Returns:
์ฉ์ด ์ ์ ๋ชฉ๋ก
| Name | Required | Description | Default |
|---|---|---|---|
| word | Yes | ||
| language | No | kr | |
| end_count | No | ||
| start_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only, idempotent, and non-destructive. The description adds useful behavioral context beyond that: it queries the Bank of Korea glossary and discloses the ECOS firewall quirk where '/' is replaced by a space. This helps an agent anticipate search behavior for terms containing slashes.
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 well-structured with an intro, examples, a behavioral note, Args, and Returns. It is reasonably compact, though the first two sentences are somewhat redundantโboth say the tool searches definitions from the glossary.
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, the description covers the source, examples, parameter meanings, a behavioral quirk, and the return type ('์ฉ์ด ์ ์ ๋ชฉ๋ก'). It does not detail response fields, but no output schema exists and the tool is straightforward enough that 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?
Schema description coverage is 0%, but the description compensates fully by explaining every parameter: 'word' is the term to search, 'start_count' and 'end_count' define the result range with defaults, and 'language' specifies 'kr' or 'en'. This adds real meaning beyond the bare 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 clearly states a specific verb and resource: searching definitions of economic/statistics terms from the Bank of Korea terminology dictionary. It also gives concrete examples like '๊ธฐ์ค๊ธ๋ฆฌ' and 'GDP', which makes the tool's purpose unambiguous and distinct from sibling tools that search statistics data or tables.
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 clearly establishes the context: this is a dictionary-lookup tool for term definitions, not a data/table search. It does not explicitly name alternative sibling tools or state when not to use it, but the scope is specific enough that an agent can infer appropriate usage.
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.
7 tool updates
v0.2.0- First observed
get_key_statistics - First observed
get_popular_statistic - First observed
get_statistic_meta - First observed
list_statistic_items - First observed
search_statistic_tables - First observed
search_statistic_word - First observed
search_statistics
TDQS
Scored across 7 tools
get_popular_statistic, get_key_statistics, and search_statistics all return economic indicator data, so an agent must infer which mode fits the query. The descriptions clarify code-free keyword lookup versus generic code-based queries versus a fixed 100-indicator list, but 'popular' and 'key' remain semantically close.
Names are grouped by action (get_, search_, list_) and remain readable, but the set mixes singular and plural forms ('statistic' vs 'statistics') and uses different object patterns like get_popular_statistic versus get_key_statistics. The naming is not chaotic, but it is not fully consistent.
Seven tools is a well-scoped size for an economic-statistics server. Each tool serves a distinct stage of the workflow: quick lookup, generic retrieval, table discovery, item discovery, metadata, and dictionary lookup.
The tool surface covers the main ECOS workflows end to end: find a statistical table, inspect its items, retrieve time series, fetch metadata, look up terms, and access popular or major indicators. There are no obvious dead ends or missing core operations for the stated domain.
Maintenance
Related MCP Connectors
ECOS โ Bank of Korea Economic Statistics System.
Korean national statistics (KOSIS) โ browse, search and pull time series from Statistics Korea'sโฆ
Korean fact-verification tools for AI agents: business registration, address, DART, apt prices, laws
Market analyst tools + AI agent: crypto, US equities, options, Korea, fundamentals, macro, backtests
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables natural language querying of Korean statistical data from KOSIS, including population, employment, GDP, housing prices, and more, with support for regional and trend analysis.88 npm16MIT
- AlicenseNot gradedqualityBmaintenanceEnables querying Korean official statistics from KOSIS via natural language in MCP clients like Claude Desktop, wrapping the KOSIS OpenAPI for search, data retrieval, and metadata exploration.MIT
- FlicenseNot gradedqualityCmaintenanceEnables querying Korean economic statistics via Bank of Korea's ECOS API, including time series data, statistical tables, items, key indicators, and terminology, with raw responses and error fidelity.-
- AlicenseNot gradedqualityBmaintenanceEnables querying Bank of Korea ECOS economic statistics via Open API, including searching tables, retrieving time series data, and accessing key indicators.MIT