Skip to main content
Glama
kgy0617

ECOS MCP Server

by kgy0617

๐Ÿฆ ECOS MCP Server

ํ•œ๊ตญ์€ํ–‰ ๊ฒฝ์ œํ†ต๊ณ„์‹œ์Šคํ…œ(ECOS) Open API๋ฅผ ์œ„ํ•œ ์ตœ์‹  MCP(Model Context Protocol) ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

AI ์—์ด์ „ํŠธ(Claude Desktop, Cursor ๋“ฑ)๊ฐ€ ํ•œ๊ตญ ๊ฑฐ์‹œ๊ฒฝ์ œ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์—ฐ์–ด๋กœ ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๊ณ ํšจ์œจ ์‹œ๊ณ„์—ด ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.


โœจ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

๐Ÿ› ๏ธ MCP Tools (7๊ฐœ)

๋ชจ๋“  ๋„๊ตฌ๋Š” ์ฝ๊ธฐ ์ „์šฉ(readOnlyHint)์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๊ณ , ์‹คํŒจ ์‹œ MCP ํ‘œ์ค€ ์—๋Ÿฌ(isError: true)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Tool

์„ค๋ช…

์ฃผ์š” ํŠน์ง•

get_popular_statistic

1-Shot ์ธ๊ธฐ ์ง€ํ‘œ ์ฆ‰์‹œ ์กฐํšŒ

๊ธฐ์ค€๊ธˆ๋ฆฌ, ์„ฑ์žฅ๋ฅ , ๋ฌผ๊ฐ€์ƒ์Šน๋ฅ , ํ™˜์œจ ๋“ฑ์„ ์ฝ”๋“œ ๊ฒ€์ƒ‰ ์—†์ด ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ๋กœ ์กฐํšŒ

search_statistics

ํ†ต๊ณ„ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ์กฐํšŒ (ํ•ต์‹ฌ)

์Šค๋งˆํŠธ ๋‚ ์งœ, ์ตœ์‹  ๊ตฌ๊ฐ„ ์šฐ์„ , ์ฆ๊ฐ๋ฅ  ๊ณ„์‚ฐ(transform), ์ปดํŒฉํŠธ/CSV ํฌ๋งท

search_statistic_tables

ํ†ต๊ณ„ํ‘œ ๊ฒ€์ƒ‰ยท๊ณ„์ธต ํƒ์ƒ‰

๋กœ์ปฌ ์ธ๋ฑ์Šค๋กœ ์ฆ‰์‹œ ์‘๋‹ต. ๋„์–ด์“ฐ๊ธฐ ๋ฌด์‹œยท๋‹ค์ค‘ ๋‹จ์–ดยท๊ด€๋ จ๋„ ์ˆœ ์ •๋ ฌ, parent_code๋กœ ๋ถ„๋ฅ˜ ํŠธ๋ฆฌ ํƒ์ƒ‰

get_key_statistics

100๋Œ€ ์ฃผ์š” ๊ฒฝ์ œ์ง€ํ‘œ ์กฐํšŒ

GDP, ๊ธฐ์ค€๊ธˆ๋ฆฌ, ํ™˜์œจ, ํ†ตํ™”๋Ÿ‰ ๋“ฑ ์‹ค์‹œ๊ฐ„ ํ•ต์‹ฌ ์ง€ํ‘œ

search_statistic_word

ํ†ต๊ณ„ ์šฉ์–ด ์‚ฌ์ „ ๊ฒ€์ƒ‰

ํ•œ๊ตญ์€ํ–‰ ๊ณต์‹ ์šฉ์–ด ํ•ด์„ค

list_statistic_items

ํ†ต๊ณ„ํ‘œ ์„ธ๋ถ€ํ•ญ๋ชฉ ๋ชฉ๋ก ์กฐํšŒ

ํ•ญ๋ชฉ์ฝ”๋“œ, ์ง€์› ์ฃผ๊ธฐ, ์ˆ˜๋ก ๊ธฐ๊ฐ„, ๋‹จ์œ„ ํ™•์ธ (๊ฒฐ๊ณผ ์บ์‹œ)

get_statistic_meta

ํ†ต๊ณ„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์กฐํšŒ

ํ†ต๊ณ„ ์ž‘์„ฑ ๋ฐฐ๊ฒฝ, ์ž‘์„ฑ ์ฃผ๊ธฐ, ํŽธ์ œ ๊ธฐ์ค€ ๋“ฑ (๊ฒฐ๊ณผ ์บ์‹œ)

โšก ํ† ํฐ ์ตœ์ ํ™” ํฌ๋งท (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)๋ณ„ ๋‚ ์งœ ํฌ๋งท ๊ทœ์น™

์ฃผ๊ธฐ ์ฝ”๋“œ

์ฃผ๊ธฐ๋ช…

์‹œ์ž‘/์ข…๋ฃŒ์ผ ํฌ๋งท ๊ทœ๊ฒฉ

์˜ˆ์‹œ

A

์—ฐ๊ฐ„

YYYY

"2020", "2024"

S

๋ฐ˜๊ธฐ

YYYYS1 / YYYYS2

"2023S1", "2023S2"

Q

๋ถ„๊ธฐ

YYYYQ1 ~ YYYYQ4

"2023Q1", "2024Q3"

M

์›”๊ฐ„

YYYYMM

"202401", "202412"

SM

๋ฐ˜์›”

YYYYMMS1 / YYYYMMS2

"202401S1", "202401S2"

D

์ผ๊ฐ„

YYYYMMDD

"20240101", "20240315"


๐Ÿ“Œ ์ฃผ์š” ์ธ๊ธฐ ํ†ต๊ณ„ํ‘œ ํ”„๋ฆฌ์…‹

์ง€ํ‘œ๋ช…

ํ‚ค์›Œ๋“œ(๋ณ„์นญ)

ํ†ต๊ณ„ํ‘œ์ฝ”๋“œ

์ฃผ๊ธฐ

ํ•ญ๋ชฉ์ฝ”๋“œ

๊ธฐ๋ณธ ์ฒ˜๋ฆฌ

ํ•œ๊ตญ์€ํ–‰ ๊ธฐ์ค€๊ธˆ๋ฆฌ

๊ธฐ์ค€๊ธˆ๋ฆฌ, ๊ธˆ๋ฆฌ, base_rate

722Y001

D

0101000

๋ณ€๊ฒฝ ์‹œ์ ๋งŒ

๊ฒฝ์ œ์„ฑ์žฅ๋ฅ (์‹ค์งˆ, ์ „๊ธฐ๋น„ %)

์„ฑ์žฅ๋ฅ , ๊ฒฝ์ œ์„ฑ์žฅ๋ฅ , GDP์„ฑ์žฅ๋ฅ 

200Y102

Q

10111

์‹ค์งˆ GDP(๋ถ„๊ธฐ, ์‹ญ์–ต์›)

GDP, ์‹ค์งˆGDP, ๊ตญ๋‚ด์ด์ƒ์‚ฐ

200Y108

Q

10601

์†Œ๋น„์ž๋ฌผ๊ฐ€์ƒ์Šน๋ฅ (%)

๋ฌผ๊ฐ€์ƒ์Šน๋ฅ , ์ธํ”Œ๋ ˆ์ด์…˜

901Y009

M

0

yoy

์†Œ๋น„์ž๋ฌผ๊ฐ€์ง€์ˆ˜(CPI)

CPI, ์†Œ๋น„์ž๋ฌผ๊ฐ€, ๋ฌผ๊ฐ€

901Y009

M

0

์›/๋‹ฌ๋Ÿฌ ํ™˜์œจ(์ผ๋ณ„)

ํ™˜์œจ, ์›๋‹ฌ๋Ÿฌ, ๋‹ฌ๋Ÿฌ, USD

731Y001

D

0000001

์›/๋‹ฌ๋Ÿฌ ํ™˜์œจ(์›”ํ‰๊ท )

์›”ํ‰๊ท ํ™˜์œจ, usd_krw_monthly

731Y004

M

0000001/0000100

๋ณธ์›ํ†ตํ™”(ํ‰์ž”)

๋ณธ์›ํ†ตํ™”, reserve_money

102Y004

M

ABA1

M2 ๊ด‘์˜ํ†ตํ™”

M2, ํ†ตํ™”๋Ÿ‰, ๊ด‘์˜ํ†ตํ™”

161Y006

M

BBHA00

๊ตญ๊ณ ์ฑ„(3๋…„) ์ˆ˜์ต๋ฅ (์ผ๋ณ„)

๊ตญ๊ณ ์ฑ„, ๊ตญ๊ณ ์ฑ„3๋…„, ์ฑ„๊ถŒ๊ธˆ๋ฆฌ

817Y002

D

010200000

๊ตญ๊ณ ์ฑ„(3๋…„) ์ˆ˜์ต๋ฅ (์›”ํ‰๊ท )

๊ตญ๊ณ ์ฑ„์›”ํ‰๊ท , treasury_3y_monthly

721Y001

M

5020000

์ƒ์‚ฐ์ž๋ฌผ๊ฐ€์ง€์ˆ˜(PPI)

PPI, ์ƒ์‚ฐ์ž๋ฌผ๊ฐ€

404Y014

M

*AA

"ํ†ตํ™”", "์ง€์ˆ˜"์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ์ง€ํ‘œ์— ๊ฑธ์น˜๋Š” ํ‚ค์›Œ๋“œ๋Š” ํ›„๋ณด ๋ชฉ๋ก์„ ๋‹ด์€ ์—๋Ÿฌ๋ฅผ ๋Œ๋ ค์ฃผ๋ฏ€๋กœ, ๋” ๊ตฌ์ฒด์ ์ธ ํ‚ค์›Œ๋“œ๋‚˜ id๋ฅผ ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘

1. ์„ค์น˜ (๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ)

git clone https://github.com/kgy0617/ecos_mcp.git
cd ecos_mcp
uv sync

2. 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-mcp

Cursor

Settings > Features > MCP Servers > Add New MCP Server:

  • ๋ฐฉ๋ฒ• A (GitHub ์ง์ ‘ ์‹คํ–‰):

    • Name: ecos

    • Type: command

    • Command: uvx --from git+https://github.com/kgy0617/ecos_mcp ecos-mcp

  • ๋ฐฉ๋ฒ• B (๋กœ์ปฌ ํด๋ก ):

    • Name: ecos

    • Type: command

    • Command: 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 tools
get_key_statistics100๋Œ€ ์ฃผ์š” ๊ฒฝ์ œ์ง€ํ‘œA
Read-onlyIdempotent

100๋Œ€ ์ฃผ์š” ๊ฒฝ์ œ์ง€ํ‘œ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

GDP ์„ฑ์žฅ๋ฅ , ๊ธฐ์ค€๊ธˆ๋ฆฌ, ์†Œ๋น„์ž๋ฌผ๊ฐ€ ์ƒ์Šน๋ฅ , ์‹ค์—…๋ฅ , M1/M2 ํ†ตํ™”๋Ÿ‰ ๋“ฑ
ํ•œ๊ตญ ๊ฒฝ์ œ์˜ ํ•ต์‹ฌ ์ง€ํ‘œ๋ฅผ ํ•œ ๋ฒˆ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Args:
    start_count: ์กฐํšŒ ์‹œ์ž‘ ์ˆœ๋ฒˆ (๊ธฐ๋ณธ๊ฐ’: 1)
    end_count: ์กฐํšŒ ๋ ์ˆœ๋ฒˆ (๊ธฐ๋ณธ๊ฐ’: 100, sample ํ‚ค๋Š” ์ตœ๋Œ€ 10๊ฑด์œผ๋กœ ์ž๋™ ์ œํ•œ)
    language: ์‘๋‹ต ์–ธ์–ด โ€” "kr"(ํ•œ๊ตญ์–ด) ๋˜๋Š” "en"(์˜์–ด)

Returns:
    ์ฃผ์š” ๊ฒฝ์ œ์ง€ํ‘œ ๋ชฉ๋ก
ParametersJSON Schema
NameRequiredDescriptionDefault
languageNokr
end_countNo
start_countNo

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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_statistic_metaํ†ต๊ณ„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐA
Read-onlyIdempotent

ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ์…‹์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(๊ตฌ์กฐ, ์ž‘์„ฑ๋ฐฉ๋ฒ•, ์„ค๋ช…)๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

Args:
    data_name: ๋ฐ์ดํ„ฐ์…‹ ์ด๋ฆ„ (ํ•„์ˆ˜). ์˜ˆ: "๊ฒฝ์ œ์‹ฌ๋ฆฌ์ง€์ˆ˜", "์†Œ๋น„์ž๋ฌผ๊ฐ€์ง€์ˆ˜"
    start_count: ์กฐํšŒ ์‹œ์ž‘ ์ˆœ๋ฒˆ (๊ธฐ๋ณธ๊ฐ’: 1)
    end_count: ์กฐํšŒ ๋ ์ˆœ๋ฒˆ (๊ธฐ๋ณธ๊ฐ’: 100)
    language: ์‘๋‹ต ์–ธ์–ด โ€” "kr" ๋˜๋Š” "en"

Returns:
    ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
ParametersJSON Schema
NameRequiredDescriptionDefault
languageNokr
data_nameYes
end_countNo
start_countNo

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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ํ†ต๊ณ„ํ‘œ ์„ธ๋ถ€ํ•ญ๋ชฉA
Read-onlyIdempotent

ํŠน์ • ํ†ต๊ณ„ํ‘œ์˜ ์„ธ๋ถ€ ํ•ญ๋ชฉ(ํ•ญ๋ชฉ์ฝ”๋“œ, ์ง€์› ์ฃผ๊ธฐ, ์ˆ˜๋ก ๊ธฐ๊ฐ„, ๋‹จ์œ„)์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

Args:
    stat_code: ํ†ต๊ณ„ํ‘œ์ฝ”๋“œ (ํ•„์ˆ˜). search_statistic_tables์—์„œ ์ฐพ์€ ์ฝ”๋“œ ์ž…๋ ฅ.
    start_count: ์กฐํšŒ ์‹œ์ž‘ ์ˆœ๋ฒˆ (๊ธฐ๋ณธ๊ฐ’: 1)
    end_count: ์กฐํšŒ ๋ ์ˆœ๋ฒˆ (๊ธฐ๋ณธ๊ฐ’: 500)
    language: ์‘๋‹ต ์–ธ์–ด โ€” "kr" ๋˜๋Š” "en"

Returns:
    ์„ธ๋ถ€ํ•ญ๋ชฉ ๋ชฉ๋ก (has_more=true๋ฉด start_count๋ฅผ ๋Š˜๋ ค ๋‹ค์Œ ํŽ˜์ด์ง€ ์กฐํšŒ)
ParametersJSON Schema
NameRequiredDescriptionDefault
languageNokr
end_countNo
stat_codeYes
start_countNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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ํ†ต๊ณ„ ์‹œ๊ณ„์—ด ์กฐํšŒA
Read-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:
    ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ (์ง€์ •๋œ ํฌ๋งท)
ParametersJSON Schema
NameRequiredDescriptionDefault
cycleYes
end_dateNo
languageNokr
end_countNo
stat_codeYes
transformNo
item_code1No
item_code2No
item_code3No
item_code4No
start_dateNo
start_countNo
changes_onlyNo
output_formatNocompact
prefer_latestNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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ํ†ต๊ณ„ํ‘œ ๊ฒ€์ƒ‰ยทํƒ์ƒ‰A
Read-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 ๋“ฑ)
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
keywordNo
parent_codeNo
searchable_onlyNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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ํ†ต๊ณ„ ์šฉ์–ด ์‚ฌ์ „A
Read-onlyIdempotent

๊ฒฝ์ œ/ํ†ต๊ณ„ ์šฉ์–ด์˜ ์ •์˜๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ตญ์€ํ–‰ ํ†ต๊ณ„์šฉ์–ด์‚ฌ์ „์—์„œ ์šฉ์–ด์˜ ์ƒ์„ธ ์„ค๋ช…์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ: "๊ธฐ์ค€๊ธˆ๋ฆฌ", "GDP", "์†Œ๋น„์ž๋ฌผ๊ฐ€์ง€์ˆ˜", "ํ†ตํ™”์Šน์ˆ˜" ๋“ฑ
(ECOS ๋ฐฉํ™”๋ฒฝ ์ œ์•ฝ์œผ๋กœ '/'๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๋ฐ”๋€Œ์–ด ๊ฒ€์ƒ‰๋ฉ๋‹ˆ๋‹ค.)

Args:
    word: ๊ฒ€์ƒ‰ํ•  ํ†ต๊ณ„/๊ฒฝ์ œ ์šฉ์–ด
    start_count: ์กฐํšŒ ์‹œ์ž‘ ์ˆœ๋ฒˆ (๊ธฐ๋ณธ๊ฐ’: 1)
    end_count: ์กฐํšŒ ๋ ์ˆœ๋ฒˆ (๊ธฐ๋ณธ๊ฐ’: 10)
    language: ์‘๋‹ต ์–ธ์–ด โ€” "kr" ๋˜๋Š” "en"

Returns:
    ์šฉ์–ด ์ •์˜ ๋ชฉ๋ก
ParametersJSON Schema
NameRequiredDescriptionDefault
wordYes
languageNokr
end_countNo
start_countNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 7 tool updatesv0.2.0
    • First observedget_key_statistics
    • First observedget_popular_statistic
    • First observedget_statistic_meta
    • First observedlist_statistic_items
    • First observedsearch_statistic_tables
    • First observedsearch_statistic_word
    • First observedsearch_statistics

TDQS

A4.1/5.0

Scored across 7 tools

Disambiguation3/5

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.

Naming Consistency3/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables natural language querying of Korean statistical data from KOSIS, including population, employment, GDP, housing prices, and more, with support for regional and trend analysis.
    8
    8 npm
    16
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables 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.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables querying Bank of Korea ECOS economic statistics via Open API, including searching tables, retrieving time series data, and accessing key indicators.
    MIT