@nomadamas/k-skill 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/bin/k-skill.js +60 -0
  2. package/package.json +37 -0
  3. package/skills/assembly-bill-vote-search/instruction.md +111 -0
  4. package/skills/assembly-bill-vote-search/skill.json +10 -0
  5. package/skills/biz-health-check/instruction.md +69 -0
  6. package/skills/biz-health-check/scripts/biz_health_check.py +163 -0
  7. package/skills/biz-health-check/skill.json +10 -0
  8. package/skills/bok-ecos-stats/instruction.md +95 -0
  9. package/skills/bok-ecos-stats/scripts/bok_ecos.py +302 -0
  10. package/skills/bok-ecos-stats/skill.json +10 -0
  11. package/skills/building-register-search/instruction.md +69 -0
  12. package/skills/building-register-search/scripts/building_register.py +309 -0
  13. package/skills/building-register-search/scripts/building_register_xml.py +32 -0
  14. package/skills/building-register-search/skill.json +9 -0
  15. package/skills/bunjang-search/instruction.md +154 -0
  16. package/skills/bunjang-search/skill.json +10 -0
  17. package/skills/catchtable-sniper/instruction.md +270 -0
  18. package/skills/catchtable-sniper/skill.json +9 -0
  19. package/skills/cheap-gas-nearby/instruction.md +107 -0
  20. package/skills/cheap-gas-nearby/skill.json +10 -0
  21. package/skills/corporate-registration-consulting/instruction.md +117 -0
  22. package/skills/corporate-registration-consulting/scripts/fill_official_hwp.py +106 -0
  23. package/skills/corporate-registration-consulting/skill.json +8 -0
  24. package/skills/coupang-product-search/instruction.md +219 -0
  25. package/skills/coupang-product-search/scripts/coupang_partners_mcp.py +146 -0
  26. package/skills/coupang-product-search/skill.json +10 -0
  27. package/skills/court-auction-notice-search/instruction.md +201 -0
  28. package/skills/court-auction-notice-search/skill.json +9 -0
  29. package/skills/court-payment-order-assistant/instruction.md +120 -0
  30. package/skills/court-payment-order-assistant/skill.json +10 -0
  31. package/skills/d2b-notice-search/instruction.md +117 -0
  32. package/skills/d2b-notice-search/skill.json +10 -0
  33. package/skills/daangn-cars-search/instruction.md +91 -0
  34. package/skills/daangn-cars-search/scripts/daangn_cars.py +72 -0
  35. package/skills/daangn-cars-search/skill.json +9 -0
  36. package/skills/daangn-jobs-search/instruction.md +90 -0
  37. package/skills/daangn-jobs-search/scripts/daangn_jobs.py +98 -0
  38. package/skills/daangn-jobs-search/skill.json +9 -0
  39. package/skills/daangn-realty-search/instruction.md +114 -0
  40. package/skills/daangn-realty-search/scripts/daangn_detail_ld.py +76 -0
  41. package/skills/daangn-realty-search/scripts/daangn_realty.py +216 -0
  42. package/skills/daangn-realty-search/scripts/daangn_relay_store.py +174 -0
  43. package/skills/daangn-realty-search/skill.json +8 -0
  44. package/skills/daangn-used-goods-search/instruction.md +90 -0
  45. package/skills/daangn-used-goods-search/scripts/daangn_used_goods.py +80 -0
  46. package/skills/daangn-used-goods-search/skill.json +9 -0
  47. package/skills/daishin-report-search/instruction.md +138 -0
  48. package/skills/daishin-report-search/skill.json +10 -0
  49. package/skills/daiso-product-search/instruction.md +172 -0
  50. package/skills/daiso-product-search/skill.json +8 -0
  51. package/skills/danawa-price-search/instruction.md +183 -0
  52. package/skills/danawa-price-search/scripts/danawa_search.py +354 -0
  53. package/skills/danawa-price-search/skill.json +8 -0
  54. package/skills/delivery-tracking/instruction.md +358 -0
  55. package/skills/delivery-tracking/skill.json +8 -0
  56. package/skills/donation-place-search/instruction.md +129 -0
  57. package/skills/donation-place-search/skill.json +9 -0
  58. package/skills/emergency-room-beds/instruction.md +82 -0
  59. package/skills/emergency-room-beds/skill.json +8 -0
  60. package/skills/ev-charger-nearby/instruction.md +80 -0
  61. package/skills/ev-charger-nearby/scripts/ev_charger.py +222 -0
  62. package/skills/ev-charger-nearby/skill.json +10 -0
  63. package/skills/ev-subsidy-status/instruction.md +165 -0
  64. package/skills/ev-subsidy-status/skill.json +10 -0
  65. package/skills/express-bus-booking/instruction.md +207 -0
  66. package/skills/express-bus-booking/references/kobus-http-flow.md +159 -0
  67. package/skills/express-bus-booking/scripts/kobus_express_booking.py +243 -0
  68. package/skills/express-bus-booking/skill.json +8 -0
  69. package/skills/fine-dust-location/instruction.md +89 -0
  70. package/skills/fine-dust-location/skill.json +9 -0
  71. package/skills/flight-ticket-search/instruction.md +237 -0
  72. package/skills/flight-ticket-search/scripts/flight_ticket_search.py +501 -0
  73. package/skills/flight-ticket-search/skill.json +9 -0
  74. package/skills/foresttrip-vacancy/instruction.md +167 -0
  75. package/skills/foresttrip-vacancy/scripts/run_foresttrip_vacancy.py +549 -0
  76. package/skills/foresttrip-vacancy/skill.json +10 -0
  77. package/skills/fsc-corporate-info/instruction.md +57 -0
  78. package/skills/fsc-corporate-info/scripts/fsc_corporate_info.py +113 -0
  79. package/skills/fsc-corporate-info/skill.json +10 -0
  80. package/skills/g2b-order-plan-search/instruction.md +131 -0
  81. package/skills/g2b-order-plan-search/scripts/g2b_order_plan.py +158 -0
  82. package/skills/g2b-order-plan-search/skill.json +10 -0
  83. package/skills/g2b-sanctioned-supplier/instruction.md +61 -0
  84. package/skills/g2b-sanctioned-supplier/scripts/g2b_sanctioned_supplier.py +114 -0
  85. package/skills/g2b-sanctioned-supplier/skill.json +10 -0
  86. package/skills/gangnamunni-clinic-search/instruction.md +113 -0
  87. package/skills/gangnamunni-clinic-search/skill.json +9 -0
  88. package/skills/geeknews-search/instruction.md +69 -0
  89. package/skills/geeknews-search/scripts/geeknews_search.py +296 -0
  90. package/skills/geeknews-search/skill.json +8 -0
  91. package/skills/gongsijiga-search/instruction.md +128 -0
  92. package/skills/gongsijiga-search/skill.json +9 -0
  93. package/skills/gov-overseas-trip-report/instruction.md +488 -0
  94. package/skills/gov-overseas-trip-report/scripts/gov_overseas_trip_report.py +1206 -0
  95. package/skills/gov-overseas-trip-report/skill.json +9 -0
  96. package/skills/han-river-water-level/instruction.md +83 -0
  97. package/skills/han-river-water-level/skill.json +10 -0
  98. package/skills/highway-traffic-status/instruction.md +88 -0
  99. package/skills/highway-traffic-status/scripts/highway_traffic.py +315 -0
  100. package/skills/highway-traffic-status/skill.json +11 -0
  101. package/skills/hipass-receipt/instruction.md +97 -0
  102. package/skills/hipass-receipt/skill.json +10 -0
  103. package/skills/hola-poke-yeoksam/instruction.md +247 -0
  104. package/skills/hola-poke-yeoksam/skill.json +8 -0
  105. package/skills/household-waste-info/instruction.md +117 -0
  106. package/skills/household-waste-info/skill.json +10 -0
  107. package/skills/housing-official-price/instruction.md +177 -0
  108. package/skills/housing-official-price/skill.json +10 -0
  109. package/skills/hwp/instruction.md +206 -0
  110. package/skills/hwp/skill.json +8 -0
  111. package/skills/intercity-bus-booking/instruction.md +189 -0
  112. package/skills/intercity-bus-booking/references/tmoney-intercity-http-flow.md +126 -0
  113. package/skills/intercity-bus-booking/scripts/intercity_bus_search.py +381 -0
  114. package/skills/intercity-bus-booking/skill.json +8 -0
  115. package/skills/iros-registry-automation/instruction.md +229 -0
  116. package/skills/iros-registry-automation/scripts/iros_pdf_summary.py +249 -0
  117. package/skills/iros-registry-automation/scripts/upstream.pin +1 -0
  118. package/skills/iros-registry-automation/skill.json +9 -0
  119. package/skills/job-posting-match/instruction.md +130 -0
  120. package/skills/job-posting-match/scripts/job_posting_match.py +396 -0
  121. package/skills/job-posting-match/scripts/test_job_posting_match.py +54 -0
  122. package/skills/job-posting-match/skill.json +8 -0
  123. package/skills/jobkorea-talent-search/instruction.md +118 -0
  124. package/skills/jobkorea-talent-search/scripts/jobkorea_talent_models.py +27 -0
  125. package/skills/jobkorea-talent-search/scripts/jobkorea_talent_parse.py +186 -0
  126. package/skills/jobkorea-talent-search/scripts/jobkorea_talent_search.py +94 -0
  127. package/skills/jobkorea-talent-search/scripts/jobkorea_talent_search_condition.py +136 -0
  128. package/skills/jobkorea-talent-search/scripts/test_jobkorea_talent_search.py +76 -0
  129. package/skills/jobkorea-talent-search/skill.json +9 -0
  130. package/skills/joseon-sillok-search/instruction.md +76 -0
  131. package/skills/joseon-sillok-search/scripts/sillok_search.py +552 -0
  132. package/skills/joseon-sillok-search/skill.json +8 -0
  133. package/skills/k-dart/instruction.md +406 -0
  134. package/skills/k-dart/skill.json +8 -0
  135. package/skills/k-schoollunch-menu/instruction.md +109 -0
  136. package/skills/k-schoollunch-menu/skill.json +9 -0
  137. package/skills/k-skill-cleaner/instruction.md +80 -0
  138. package/skills/k-skill-cleaner/scripts/k_skill_cleaner.py +410 -0
  139. package/skills/k-skill-cleaner/skill.json +8 -0
  140. package/skills/k-skill-setup/instruction.md +253 -0
  141. package/skills/k-skill-setup/skill.json +11 -0
  142. package/skills/kakao-bar-nearby/instruction.md +76 -0
  143. package/skills/kakao-bar-nearby/skill.json +8 -0
  144. package/skills/kakao-map/instruction.md +176 -0
  145. package/skills/kakao-map/skill.json +10 -0
  146. package/skills/kakaotalk-mac/instruction.md +189 -0
  147. package/skills/kakaotalk-mac/skill.json +8 -0
  148. package/skills/kbl-results/instruction.md +89 -0
  149. package/skills/kbl-results/skill.json +9 -0
  150. package/skills/kbo-results/instruction.md +82 -0
  151. package/skills/kbo-results/skill.json +8 -0
  152. package/skills/keris-academic-search/instruction.md +81 -0
  153. package/skills/keris-academic-search/scripts/keris_academic.py +210 -0
  154. package/skills/keris-academic-search/skill.json +10 -0
  155. package/skills/kleague-results/instruction.md +92 -0
  156. package/skills/kleague-results/skill.json +8 -0
  157. package/skills/kopis-performance-search/instruction.md +109 -0
  158. package/skills/kopis-performance-search/skill.json +10 -0
  159. package/skills/korea-weather/instruction.md +93 -0
  160. package/skills/korea-weather/skill.json +10 -0
  161. package/skills/korean-character-count/instruction.md +87 -0
  162. package/skills/korean-character-count/scripts/korean_character_count.js +268 -0
  163. package/skills/korean-character-count/skill.json +8 -0
  164. package/skills/korean-cinema-search/instruction.md +177 -0
  165. package/skills/korean-cinema-search/skill.json +8 -0
  166. package/skills/korean-heritage-search/instruction.md +106 -0
  167. package/skills/korean-heritage-search/scripts/korean_heritage_search.py +321 -0
  168. package/skills/korean-heritage-search/skill.json +8 -0
  169. package/skills/korean-holiday-calendar/instruction.md +97 -0
  170. package/skills/korean-holiday-calendar/skill.json +9 -0
  171. package/skills/korean-humanizer/instruction.md +389 -0
  172. package/skills/korean-humanizer/references/ai-tell-taxonomy.md +147 -0
  173. package/skills/korean-humanizer/skill.json +8 -0
  174. package/skills/korean-jangbu-for/instruction.md +133 -0
  175. package/skills/korean-jangbu-for/scripts/install.sh +237 -0
  176. package/skills/korean-jangbu-for/scripts/upstream.pin +1 -0
  177. package/skills/korean-jangbu-for/skill.json +8 -0
  178. package/skills/korean-law-search/instruction.md +126 -0
  179. package/skills/korean-law-search/skill.json +10 -0
  180. package/skills/korean-marathon-schedule/instruction.md +111 -0
  181. package/skills/korean-marathon-schedule/skill.json +9 -0
  182. package/skills/korean-middle-korean/instruction.md +79 -0
  183. package/skills/korean-middle-korean/scripts/korean_middle_korean.js +214 -0
  184. package/skills/korean-middle-korean/skill.json +8 -0
  185. package/skills/korean-patent-search/instruction.md +79 -0
  186. package/skills/korean-patent-search/scripts/patent_search.py +409 -0
  187. package/skills/korean-patent-search/skill.json +9 -0
  188. package/skills/korean-privacy-terms/instruction.md +128 -0
  189. package/skills/korean-privacy-terms/scripts/install.sh +108 -0
  190. package/skills/korean-privacy-terms/scripts/upstream.pin +1 -0
  191. package/skills/korean-privacy-terms/skill.json +8 -0
  192. package/skills/korean-scholarship-search/instruction.md +317 -0
  193. package/skills/korean-scholarship-search/references/report-format.md +40 -0
  194. package/skills/korean-scholarship-search/references/school-discovery.md +61 -0
  195. package/skills/korean-scholarship-search/references/search-clues.md +58 -0
  196. package/skills/korean-scholarship-search/references/source-patterns.md +67 -0
  197. package/skills/korean-scholarship-search/scripts/scholarship_filter.py +811 -0
  198. package/skills/korean-scholarship-search/scripts/test_scholarship_filter.py +224 -0
  199. package/skills/korean-scholarship-search/scripts/university_search_plan.py +148 -0
  200. package/skills/korean-scholarship-search/skill.json +8 -0
  201. package/skills/korean-slang-writing/instruction.md +181 -0
  202. package/skills/korean-slang-writing/scripts/_slang_http.py +91 -0
  203. package/skills/korean-slang-writing/scripts/slang_lookup.py +291 -0
  204. package/skills/korean-slang-writing/scripts/slang_search.py +284 -0
  205. package/skills/korean-slang-writing/skill.json +8 -0
  206. package/skills/korean-spell-check/instruction.md +105 -0
  207. package/skills/korean-spell-check/scripts/korean_spell_check.py +523 -0
  208. package/skills/korean-spell-check/skill.json +9 -0
  209. package/skills/korean-stock-search/instruction.md +194 -0
  210. package/skills/korean-stock-search/skill.json +10 -0
  211. package/skills/korean-transit-route/instruction.md +113 -0
  212. package/skills/korean-transit-route/skill.json +10 -0
  213. package/skills/kosis-stats/instruction.md +232 -0
  214. package/skills/kosis-stats/references/kosis-openapi-guide.md +171 -0
  215. package/skills/kosis-stats/scripts/run_kosis_stats.py +896 -0
  216. package/skills/kosis-stats/skill.json +9 -0
  217. package/skills/kr-whois-lookup/instruction.md +107 -0
  218. package/skills/kr-whois-lookup/skill.json +10 -0
  219. package/skills/kstartup-search/instruction.md +186 -0
  220. package/skills/kstartup-search/scripts/run_kstartup.py +424 -0
  221. package/skills/kstartup-search/skill.json +11 -0
  222. package/skills/ktx-booking/instruction.md +244 -0
  223. package/skills/ktx-booking/skill.json +10 -0
  224. package/skills/lck-analytics/instruction.md +192 -0
  225. package/skills/lck-analytics/scripts/_lib.js +103 -0
  226. package/skills/lck-analytics/scripts/analyze-live-game.js +52 -0
  227. package/skills/lck-analytics/scripts/build-match-report.js +44 -0
  228. package/skills/lck-analytics/scripts/sync-oracle.js +50 -0
  229. package/skills/lck-analytics/skill.json +9 -0
  230. package/skills/lh-notice-search/instruction.md +206 -0
  231. package/skills/lh-notice-search/skill.json +10 -0
  232. package/skills/library-book-search/instruction.md +139 -0
  233. package/skills/library-book-search/skill.json +9 -0
  234. package/skills/local-election-candidate-search/instruction.md +77 -0
  235. package/skills/local-election-candidate-search/skill.json +8 -0
  236. package/skills/localdata-business-status/instruction.md +64 -0
  237. package/skills/localdata-business-status/scripts/localdata_business_status.py +206 -0
  238. package/skills/localdata-business-status/skill.json +8 -0
  239. package/skills/lotto-results/instruction.md +80 -0
  240. package/skills/lotto-results/skill.json +8 -0
  241. package/skills/lovebug-report/instruction.md +185 -0
  242. package/skills/lovebug-report/skill.json +9 -0
  243. package/skills/market-kurly-search/instruction.md +125 -0
  244. package/skills/market-kurly-search/skill.json +8 -0
  245. package/skills/mfds-drug-safety/instruction.md +86 -0
  246. package/skills/mfds-drug-safety/scripts/mfds_drug_safety.py +184 -0
  247. package/skills/mfds-drug-safety/skill.json +10 -0
  248. package/skills/mfds-food-safety/instruction.md +126 -0
  249. package/skills/mfds-food-safety/scripts/mfds_food_safety.py +281 -0
  250. package/skills/mfds-food-safety/skill.json +10 -0
  251. package/skills/myrealtrip-search/instruction.md +239 -0
  252. package/skills/myrealtrip-search/scripts/myrealtrip_mcp.py +194 -0
  253. package/skills/myrealtrip-search/scripts/test_myrealtrip_mcp.py +99 -0
  254. package/skills/myrealtrip-search/skill.json +9 -0
  255. package/skills/naming-house/instruction.md +146 -0
  256. package/skills/naming-house/skill.json +8 -0
  257. package/skills/national-pension-workplace/instruction.md +64 -0
  258. package/skills/national-pension-workplace/scripts/national_pension_workplace.py +113 -0
  259. package/skills/national-pension-workplace/skill.json +10 -0
  260. package/skills/naver-ad-performance/instruction.md +108 -0
  261. package/skills/naver-ad-performance/scripts/naver_ad_performance.py +240 -0
  262. package/skills/naver-ad-performance/skill.json +9 -0
  263. package/skills/naver-blog-research/instruction.md +128 -0
  264. package/skills/naver-blog-research/scripts/_naver_http.py +58 -0
  265. package/skills/naver-blog-research/scripts/naver_download_images.py +233 -0
  266. package/skills/naver-blog-research/scripts/naver_read.py +256 -0
  267. package/skills/naver-blog-research/scripts/naver_search.py +192 -0
  268. package/skills/naver-blog-research/skill.json +8 -0
  269. package/skills/naver-news-search/instruction.md +103 -0
  270. package/skills/naver-news-search/skill.json +10 -0
  271. package/skills/naver-shopping-search/instruction.md +94 -0
  272. package/skills/naver-shopping-search/skill.json +11 -0
  273. package/skills/nhis-care-checkup-search/instruction.md +116 -0
  274. package/skills/nhis-care-checkup-search/skill.json +10 -0
  275. package/skills/nts-business-registration/instruction.md +115 -0
  276. package/skills/nts-business-registration/scripts/nts_business_registration.py +215 -0
  277. package/skills/nts-business-registration/skill.json +10 -0
  278. package/skills/nts-tax-delinquency/instruction.md +54 -0
  279. package/skills/nts-tax-delinquency/scripts/nts_tax_delinquency.py +150 -0
  280. package/skills/nts-tax-delinquency/skill.json +8 -0
  281. package/skills/ohou-today-deal/instruction.md +182 -0
  282. package/skills/ohou-today-deal/scripts/ohou_today_deal.py +369 -0
  283. package/skills/ohou-today-deal/skill.json +9 -0
  284. package/skills/olive-young-search/instruction.md +154 -0
  285. package/skills/olive-young-search/skill.json +8 -0
  286. package/skills/parking-lot-search/instruction.md +96 -0
  287. package/skills/parking-lot-search/skill.json +9 -0
  288. package/skills/popbill/instruction.md +146 -0
  289. package/skills/popbill/scripts/popbill_cli.py +284 -0
  290. package/skills/popbill/scripts/popbill_registry.py +54 -0
  291. package/skills/popbill/scripts/popbill_safety.py +37 -0
  292. package/skills/popbill/scripts/popbill_templates.py +71 -0
  293. package/skills/popbill/skill.json +9 -0
  294. package/skills/public-restroom-nearby/instruction.md +89 -0
  295. package/skills/public-restroom-nearby/skill.json +9 -0
  296. package/skills/real-estate-search/instruction.md +172 -0
  297. package/skills/real-estate-search/skill.json +10 -0
  298. package/skills/rhwp-advanced/instruction.md +145 -0
  299. package/skills/rhwp-advanced/skill.json +8 -0
  300. package/skills/rhwp-edit/instruction.md +153 -0
  301. package/skills/rhwp-edit/skill.json +8 -0
  302. package/skills/s2b-notice-search/instruction.md +66 -0
  303. package/skills/s2b-notice-search/skill.json +9 -0
  304. package/skills/saju-fortune/instruction.md +177 -0
  305. package/skills/saju-fortune/skill.json +8 -0
  306. package/skills/saramin-talent-search/instruction.md +119 -0
  307. package/skills/saramin-talent-search/skill.json +9 -0
  308. package/skills/seoul-bike/instruction.md +83 -0
  309. package/skills/seoul-bike/scripts/seoul_bike.py +247 -0
  310. package/skills/seoul-bike/skill.json +10 -0
  311. package/skills/seoul-density/instruction.md +109 -0
  312. package/skills/seoul-density/scripts/seoul_density.py +271 -0
  313. package/skills/seoul-density/skill.json +10 -0
  314. package/skills/seoul-subway-arrival/instruction.md +85 -0
  315. package/skills/seoul-subway-arrival/skill.json +9 -0
  316. package/skills/sh-notice-search/instruction.md +150 -0
  317. package/skills/sh-notice-search/skill.json +9 -0
  318. package/skills/srt-booking/instruction.md +181 -0
  319. package/skills/srt-booking/scripts/srt_booking.py +272 -0
  320. package/skills/srt-booking/scripts/srt_seats.py +156 -0
  321. package/skills/srt-booking/skill.json +20 -0
  322. package/skills/subway-lost-property/instruction.md +93 -0
  323. package/skills/subway-lost-property/scripts/subway_lost_property.py +244 -0
  324. package/skills/subway-lost-property/skill.json +8 -0
  325. package/skills/ticket-availability/instruction.md +175 -0
  326. package/skills/ticket-availability/scripts/ticket_availability.py +430 -0
  327. package/skills/ticket-availability/skill.json +9 -0
  328. package/skills/toss-securities/instruction.md +116 -0
  329. package/skills/toss-securities/skill.json +9 -0
  330. package/skills/used-car-price-search/instruction.md +109 -0
  331. package/skills/used-car-price-search/skill.json +8 -0
  332. package/skills/yebigun-training/instruction.md +177 -0
  333. package/skills/yebigun-training/skill.json +9 -0
  334. package/skills/zipcode-search/instruction.md +159 -0
  335. package/skills/zipcode-search/scripts/zipcode_search.py +150 -0
  336. package/skills/zipcode-search/skill.json +8 -0
  337. package/src/assemble.js +134 -0
  338. package/src/detect.js +18 -0
  339. package/templates/action-account.md +4 -0
  340. package/templates/action-booking.md +5 -0
  341. package/templates/action-commerce.md +5 -0
  342. package/templates/action-communication.md +5 -0
  343. package/templates/action-submission.md +5 -0
  344. package/templates/browser.md +4 -0
  345. package/templates/core.md +5 -0
  346. package/templates/hard-boundary.md +3 -0
  347. package/templates/local.md +2 -0
  348. package/templates/lookup.md +2 -0
  349. package/templates/proxy.md +2 -0
  350. package/templates/vault.md +4 -0
@@ -0,0 +1,194 @@
1
+ # Korean Stock Search
2
+
3
+ ## What this skill does
4
+
5
+ 기본적으로 `https://k-skill-proxy.nomadamas.org/v1/korean-stock/...` 로 요청해서 KRX 상장 종목 검색, 종목 기본정보, 일별 시세를 조회한다.
6
+
7
+ upstream 설계 참고는 [`jjlabsio/korea-stock-mcp`](https://github.com/jjlabsio/korea-stock-mcp) 이지만, 사용자는 `KRX_API_KEY` 를 발급받거나 로컬 MCP 서버를 설치할 필요가 없다. `KRX_API_KEY` 는 proxy 서버에서만 관리한다.
8
+
9
+ ## When to use
10
+
11
+ - "삼성전자 종목코드랑 시장구분 찾아줘"
12
+ - "005930 기본정보 보여줘"
13
+ - "SK하이닉스 20260408 종가/거래량 알려줘"
14
+ - "KOSDAQ 에서 알테오젠 시세 확인해줘"
15
+
16
+ ## When not to use
17
+
18
+ - 미국/일본/가상자산 같은 비한국 주식 조회
19
+ - 실시간 체결/호가/분봉 조회
20
+ - 재무제표/공시 원문 분석 (이 스킬 범위 밖)
21
+ - 투자 자문/매수 추천
22
+
23
+ ## Inputs
24
+
25
+ - `q`: 종목명 또는 종목코드 검색어 (`search` endpoint)
26
+ - `market`: `KOSPI` | `KOSDAQ` | `KONEX`
27
+ - `code`: 종목코드 (보통 6자리 단축코드, 예: `005930`)
28
+ - `bas_dd`: 기준일 `YYYYMMDD` (없으면 KST 오늘 날짜 기본값, 휴장일이면 최근 영업일로 다시 시도)
29
+ - `limit`: 검색 결과 수 (기본 10, 최대 20)
30
+
31
+ ## Prerequisites
32
+
33
+ 없음. 사용자는 `KRX_API_KEY` 를 준비할 필요가 없다. upstream key는 proxy 서버에서만 주입한다.
34
+
35
+ ## Default path
36
+
37
+ 추가 client API 레이어는 불필요하다. 그냥 프록시 서버에 HTTP 요청만 넣으면 된다.
38
+
39
+ `KSKILL_PROXY_BASE_URL` 환경변수가 있으면 그 값을 사용하고, 없으면 기본 경로 `https://k-skill-proxy.nomadamas.org` 를 사용한다.
40
+
41
+ ## Supported endpoints
42
+
43
+ ### 종목 검색
44
+
45
+ ```http
46
+ GET /v1/korean-stock/search?q={검색어}&bas_dd={YYYYMMDD}
47
+ ```
48
+
49
+ ### 종목 기본정보
50
+
51
+ ```http
52
+ GET /v1/korean-stock/base-info?market={KOSPI|KOSDAQ|KONEX}&code={종목코드}&bas_dd={YYYYMMDD}
53
+ ```
54
+
55
+ ### 종목 일별 시세
56
+
57
+ ```http
58
+ GET /v1/korean-stock/trade-info?market={KOSPI|KOSDAQ|KONEX}&code={종목코드}&bas_dd={YYYYMMDD}
59
+ ```
60
+
61
+ ## Example requests
62
+
63
+ 종목 검색:
64
+
65
+ ```bash
66
+ curl -fsS --get 'https://k-skill-proxy.nomadamas.org/v1/korean-stock/search' \
67
+ --data-urlencode 'q=삼성전자' \
68
+ --data-urlencode 'bas_dd=20260408'
69
+ ```
70
+
71
+ 종목 기본정보:
72
+
73
+ ```bash
74
+ curl -fsS --get 'https://k-skill-proxy.nomadamas.org/v1/korean-stock/base-info' \
75
+ --data-urlencode 'market=KOSPI' \
76
+ --data-urlencode 'code=005930' \
77
+ --data-urlencode 'bas_dd=20260408'
78
+ ```
79
+
80
+ 종목 일별 시세:
81
+
82
+ ```bash
83
+ curl -fsS --get 'https://k-skill-proxy.nomadamas.org/v1/korean-stock/trade-info' \
84
+ --data-urlencode 'market=KOSPI' \
85
+ --data-urlencode 'code=005930' \
86
+ --data-urlencode 'bas_dd=20260408'
87
+ ```
88
+
89
+ ## Response shape
90
+
91
+ ### 검색 응답
92
+
93
+ ```json
94
+ {
95
+ "items": [
96
+ {
97
+ "market": "KOSPI",
98
+ "code": "005930",
99
+ "standard_code": "KR7005930003",
100
+ "name": "삼성전자",
101
+ "short_name": "삼성전자",
102
+ "english_name": "Samsung Electronics",
103
+ "listed_at": "1975-06-11"
104
+ }
105
+ ],
106
+ "query": { "q": "삼성전자", "bas_dd": "20260408", "limit": 10 },
107
+ "proxy": { "name": "k-skill-proxy", "cache": { "hit": false, "ttl_ms": 300000 } }
108
+ }
109
+ ```
110
+
111
+ ### 기본정보 응답
112
+
113
+ ```json
114
+ {
115
+ "item": {
116
+ "market": "KOSPI",
117
+ "code": "005930",
118
+ "standard_code": "KR7005930003",
119
+ "name": "삼성전자",
120
+ "short_name": "삼성전자",
121
+ "english_name": "Samsung Electronics",
122
+ "security_group": "주권",
123
+ "section_type": "대형주",
124
+ "stock_certificate_type": "보통주",
125
+ "par_value": 100,
126
+ "listed_shares": 5969782550
127
+ },
128
+ "query": { "market": "KOSPI", "code": "005930", "bas_dd": "20260408" },
129
+ "proxy": { "name": "k-skill-proxy", "cache": { "hit": false, "ttl_ms": 300000 } }
130
+ }
131
+ ```
132
+
133
+ ### 일별 시세 응답
134
+
135
+ ```json
136
+ {
137
+ "item": {
138
+ "market": "KOSPI",
139
+ "code": "005930",
140
+ "standard_code": "KR7005930003",
141
+ "base_date": "20260408",
142
+ "name": "삼성전자",
143
+ "close_price": 84000,
144
+ "change_price": 1000,
145
+ "fluctuation_rate": 1.2,
146
+ "open_price": 83000,
147
+ "high_price": 84500,
148
+ "low_price": 82800,
149
+ "trading_volume": 12345678,
150
+ "trading_value": 1030000000000,
151
+ "market_cap": 500000000000000
152
+ },
153
+ "query": { "market": "KOSPI", "code": "005930", "bas_dd": "20260408" },
154
+ "proxy": { "name": "k-skill-proxy", "cache": { "hit": false, "ttl_ms": 300000 } }
155
+ }
156
+ ```
157
+
158
+ ## Response policy
159
+
160
+ - 종목명이 모호하면 먼저 `search` 로 시장/종목코드를 좁힌 뒤 `base-info` 또는 `trade-info` 로 들어간다.
161
+ - 일부 시장 upstream 이 실패하면 `upstream.degraded=true` 와 `failed_markets` 를 보고 부분 장애 여부를 함께 설명한다.
162
+ - `trade-info` 결과는 일별 snapshot 이다. 실시간 호가/체결처럼 말하지 않는다.
163
+ - 휴장일/장마감 이전이면 해당 `bas_dd` 에 데이터가 없을 수 있으니 최근 영업일로 재시도한다. 이 경우 `trade-info` 는 502 대신 `not_found` 로 끝날 수 있다.
164
+ - 숫자는 사람이 읽기 쉬운 단위(원, 주, 억/조)로 짧게 풀어주되 원본 숫자도 유지한다.
165
+ - 답변 말미에 "KRX 공식 데이터 기준 / 투자 조언 아님" 을 짧게 남긴다.
166
+
167
+ ## Keep the answer compact
168
+
169
+ - 종목명 / 시장 / 종목코드
170
+ - 기준일
171
+ - 종가 / 등락률 / 거래량 / 시가총액
172
+ - 필요할 때만 상장일 / 상장주식수 / 액면가
173
+ - 여러 후보가 나오면 상위 3~5개만 보여주고 사용자가 고르게 한다
174
+
175
+ ## Failure modes
176
+
177
+ - `q`, `market`, `code`, `bas_dd` 형식이 잘못되면 400 응답
178
+ - 프록시 서버에 `KRX_API_KEY` 가 없으면 503 응답
179
+ - 검색 중 일부 시장 upstream 이 실패하면 200 응답이지만 `upstream.degraded=true` 와 `failed_markets` 를 함께 반환할 수 있다.
180
+ - 모든 요청 시장에서 upstream KRX 조회가 실패하면 502 응답
181
+ - 해당 기준일/시장에 종목이 없으면 404 `not_found`
182
+
183
+ ## Done when
184
+
185
+ - 검색어가 모호하면 `search` 로 후보를 먼저 좁혔다.
186
+ - 필요한 경우 `base-info` 와 `trade-info` 를 호출해 핵심 수치를 정리했다.
187
+ - 사용자가 `KRX_API_KEY` 없이도 조회 가능하다는 점을 유지했다.
188
+ - KRX 공식 데이터 기준임을 짧게 남겼다.
189
+
190
+ ## Notes
191
+
192
+ - 원본 참고: `https://github.com/jjlabsio/korea-stock-mcp`
193
+ - 공식 데이터 출처: KRX Open API (`https://openapi.krx.co.kr/contents/OPP/MAIN/main/index.cmd`)
194
+ - 이 스킬은 read-only 조회 전용이다.
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "korean-stock-search",
3
+ "description": "Use k-skill-proxy to search Korean listed stocks, inspect KRX base information, and fetch daily trade snapshots without asking the user to issue a KRX API key.",
4
+ "profiles": [
5
+ "proxy",
6
+ "vault",
7
+ "lookup"
8
+ ],
9
+ "frontmatter": "name: korean-stock-search\ndescription: Use k-skill-proxy to search Korean listed stocks, inspect KRX base information, and fetch daily trade snapshots without asking the user to issue a KRX API key.\nlicense: MIT\nmetadata:\n category: finance\n locale: ko-KR\n phase: v1"
10
+ }
@@ -0,0 +1,113 @@
1
+ # korean-transit-route
2
+
3
+ ## When to use
4
+
5
+ - "강남에서 잠실 지하철로 어떻게 가?"
6
+ - "서울역 → 인천공항 대중교통 경로"
7
+ - "환승 가장 적은 경로", "최소 시간 경로"
8
+
9
+ ## Credentials
10
+
11
+ - 환경변수 `ODSAY_API_KEY` 가 있으면 사용. 없으면 `~/.config/k-skill/secrets.env` 에서 로드.
12
+ - ODsay Server 키는 호출 IP 화이트리스트 등록 필수. 발급은 https://lab.odsay.com
13
+ - Kakao Local geocoding은 기본 hosted `k-skill-proxy` 경유로 호출하므로 사용자 쪽 `KAKAO_REST_API_KEY` 는 불필요하다. self-host proxy 운영자만 `KAKAO_REST_API_KEY` 를 서버에 설정한다.
14
+
15
+ ## Inputs
16
+
17
+ 자연어 입력에서 출발/도착을 추출. 좌표가 없으면 **반드시 geocoding 먼저** (ODsay는 좌표만 받음).
18
+
19
+ ### Geocoding (필수 선행 단계)
20
+
21
+ 기본 hosted proxy를 사용한다. Proxy가 Kakao Local REST API 키를 서버에서만 주입하고, caller `apiKey` 는 무시한다.
22
+
23
+ 1. `https://k-skill-proxy.nomadamas.org/v1/kakao-local/geocode?q=<주소/장소명>`
24
+ 2. proxy 내부 fallback: Kakao Local `address.json` → 결과 없으면 `keyword.json`
25
+
26
+ 응답 `documents[0].x`(경도), `.y`(위도) 사용.
27
+
28
+ ```python
29
+ import os, urllib.parse, urllib.request, json
30
+ PROXY=os.environ.get('KSKILL_PROXY_BASE_URL','https://k-skill-proxy.nomadamas.org').rstrip('/')
31
+ def geocode(q):
32
+ url=PROXY+'/v1/kakao-local/geocode?q='+urllib.parse.quote(q)
33
+ with urllib.request.urlopen(url,timeout=10) as resp:
34
+ d=json.loads(resp.read())
35
+ if d.get('documents'):
36
+ doc=d['documents'][0]
37
+ return float(doc['x']), float(doc['y']), doc.get('place_name') or doc.get('address_name')
38
+ return None
39
+ ```
40
+
41
+ 지하철역명만 정확히 알 때는 ODsay `searchStation` 도 OK 하지만, 도어투도어 결과를 원하면 **실제 출발지/도착지 좌표**를 써야 첫/끝 도보 구간이 계산됨.
42
+
43
+ ## Core call
44
+
45
+ ```bash
46
+ set -a; . ~/.config/k-skill/secrets.env; set +a
47
+ KEY=$(python3 -c "import os,urllib.parse;print(urllib.parse.quote(os.environ['ODSAY_API_KEY'],safe=''))")
48
+ curl -s "https://api.odsay.com/v1/api/searchPubTransPathT?apiKey=${KEY}&SX=${SX}&SY=${SY}&EX=${EX}&EY=${EY}&OPT=0&SearchPathType=${TYPE}"
49
+ ```
50
+
51
+ Parameters:
52
+ - `SX,SY` 출발 경도/위도, `EX,EY` 도착 경도/위도 (WGS84)
53
+ - `OPT`: `0` 추천순(기본), `4` 최소시간, `5` 최소환승
54
+ - `SearchPathType`: `0` 지하철+버스, `1` 지하철만, `2` 버스만
55
+
56
+ ## Response shape
57
+
58
+ `result.path[]` 배열, 각 path:
59
+ - `pathType`: 1=지하철, 2=버스, 3=지하철+버스
60
+ - `info.totalTime`(분), `info.payment`(원), `info.subwayTransitCount`, `info.busTransitCount`, `info.totalWalk`(m), `info.firstStartStation`, `info.lastEndStation`
61
+ - `subPath[]`: 구간별. `trafficType` 1=지하철 2=버스 3=도보. 지하철이면 `lane[0].name`, `startName`, `endName`, `passStopList.stations[]`(경유역)
62
+
63
+ ## Recommended output (door-to-door)
64
+
65
+ `subPath` 의 각 구간을 `trafficType` 별로 표시. 첫/끝 도보 구간은 출발지·도착지에서 역까지 실제 도보를 의미하므로 **반드시 포함**.
66
+
67
+ ```
68
+ 🚇 범안로95번길 32 → SKT타워
69
+ 경로 1: 54분 · 1,950원 · 환승 2회 · 도보 688m
70
+ 🚶 도보 1분
71
+ 🚌 19번 부천범박힐스테이트 → 역곡역 (9분)
72
+ 🚶 도보 2분
73
+ 🚇 1호선 역곡 → 종각 (15정거장, 35분)
74
+ 🚶 도보 7분
75
+ ```
76
+
77
+ 3개 이내 경로 비교 권장. `OPT=4`(최소시간) / `OPT=5`(최소환승) 옵션을 사용자가 선호 표시하면 그쪽으로 호출.
78
+
79
+ ## Done when
80
+
81
+ - 출발지와 도착지가 geocoding 되었거나, 좌표/역명이 명확히 확인되었다.
82
+ - ODsay 응답에서 1개 이상 경로가 정리되었다.
83
+ - 각 경로의 총 소요시간, 요금, 환승 횟수, 총 도보 거리가 포함되었다.
84
+ - 첫/끝 도보 구간이 포함된 door-to-door 요약을 보여줬다.
85
+ - upstream API 키가 응답에 노출되지 않았다.
86
+
87
+ ## Helpers
88
+
89
+ 좌표 모르고 역명만 아는 경우 — `searchStation` 으로 변환:
90
+
91
+ ```bash
92
+ curl -s "https://api.odsay.com/v1/api/searchStation?apiKey=${KEY}&stationName=강남&CID=1000"
93
+ ```
94
+
95
+ `CID=1000` = 수도권. 결과 `result.station[].x,y` 가 좌표.
96
+
97
+ ## Limits
98
+
99
+ - 현재 ODsay 공식 Basic 상품 기준 무료 체험은 일 1,000건(6개월)이다. `searchPubTransPathT` + `searchStation` 호출이 합산되니 한 질문당 호출 최소화.
100
+ - 응답에 `error` 키 있으면 즉시 사용자에게 표시(ApiKey/IP 문제 진단에 유용).
101
+ - 한국 외 좌표는 지원 안 함.
102
+
103
+ ## Failure modes
104
+
105
+ - ODsay `error` 응답: `msg` 필드를 그대로 사용자에게 표시하고, ApiKey 미등록 또는 IP 화이트리스트 누락 가능성을 안내한다.
106
+ - Kakao geocoding 결과 없음: 주소/장소명을 다시 확인하거나 더 구체적인 표현을 요청한다.
107
+ - 좌표는 있으나 ODsay 경로 없음: 대중교통 미개통 지역, 도보 가능 거리, 또는 해상/공항 구간일 수 있다. 사용자에게 확인한다.
108
+ - quota 초과: 일일 한도 도달 시 추가 호출을 중단하고 사용자에게 알린다.
109
+
110
+ ## Don'ts
111
+
112
+ - 카카오맵/네이버지도 directions API로 대중교통 라우팅 시도하지 말 것 (둘 다 운전·도보만 공개).
113
+ - 키를 절대 응답에 노출하지 말 것.
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "korean-transit-route",
3
+ "description": "Korean door-to-door public transit routing (subway + bus + walking) via ODsay LIVE API with Kakao geocoding for address-to-address queries. Use when the user asks for 지하철/버스/대중교통 길찾기, 환승 경로, 소요시간, or transit directions between two places in Korea.",
4
+ "profiles": [
5
+ "proxy",
6
+ "vault",
7
+ "lookup"
8
+ ],
9
+ "frontmatter": "name: korean-transit-route\ndescription: Korean door-to-door public transit routing (subway + bus + walking) via ODsay LIVE API with Kakao geocoding for address-to-address queries. Use when the user asks for 지하철/버스/대중교통 길찾기, 환승 경로, 소요시간, or transit directions between two places in Korea.\nlicense: MIT\nmetadata:\n category: transit\n locale: ko-KR\n phase: v1"
10
+ }
@@ -0,0 +1,232 @@
1
+ # KOSIS Stats
2
+
3
+ ## What this skill does
4
+
5
+ 국가데이터처(구 통계청)가 운영하는 KOSIS(국가통계포털) Open API `https://kosis.kr/openapi/` 로 한국 공식 통계 자료를 조회 자동화한다.
6
+
7
+ 이 스킬은 **조회 전용**이다. 통계 작성, 데이터 변경, 대시보드 등록, 사용자별 통계 자료 등록은 범위에 포함하지 않는다.
8
+
9
+ 지원 endpoint:
10
+
11
+ - `statisticsSearch.do` — 키워드로 통계표 검색
12
+ - `statisticsData.do?method=getMeta` — 통계표 메타데이터 (분류·항목·단위)
13
+ - `statisticsParameterData.do` — 통계표 데이터 셀 조회 (기간/분류 필터)
14
+ - `statisticsBigData.do` — 대용량 자료 (사전 등록한 `userStatsId` 필요)
15
+ - `statisticsList.do` — 통계목록 카테고리 트리 탐색 (주제별/기관별/국제통계/북한통계 등)
16
+ - `statisticsExplData.do` — 통계설명 (조사목적·주기·대상·법적근거·공표방법 등 27개 항목)
17
+ - `pkNumberService.do` — 통계주요지표 (1,473개 핵심 지표의 개념·산정방법·출처)
18
+
19
+ ## When to use
20
+
21
+ - "1인 가구 비율 통계 찾아줘"
22
+ - "KOSIS에서 고령인구 비율 시도별 데이터 가져와"
23
+ - "DT_1IN0001 표 메타데이터 보여줘"
24
+ - "최근 5년치 소비자물가지수 KOSIS에서 뽑아줘"
25
+ - "국내통계 주제별로 어떤 카테고리가 있어?" (`list`)
26
+ - "인구총조사 조사목적·조사주기 알려줘" (`explain`)
27
+ - "인구밀도 지표 산정방법 보여줘" (`indicator`)
28
+
29
+ ## When not to use
30
+
31
+ - 실시간 시세나 거래소 데이터를 원하는 경우 (KOSIS는 공식 통계용)
32
+ - 데이터 시각화·분석·보고서 작성이 주 목적인 경우 (이 스킬은 raw 데이터 조회만)
33
+ - 통계 작성·등록·수정이 필요한 경우
34
+ - 대용량 자료를 받기 위해 사용자별 자료(`userStatsId`)를 새로 등록해야 하는 경우 (KOSIS 웹에서 직접 등록)
35
+
36
+ ## Prerequisites
37
+
38
+ - Python 3.9+ (stdlib only, 외부 패키지 없음)
39
+ - 일반 `search`/`meta`/`data`/`list`/`explain`/`indicator`: `k-skill-proxy`의 KOSIS route가 있는 hosted/self-host 프록시에 접근 가능할 것
40
+ - `bigdata` 또는 `--direct`: KOSIS Open API 인증키 (무료, https://kosis.kr/openapi/ 에서 회원가입 후 활용신청)
41
+
42
+ ```bash
43
+ python3 kosis-stats/scripts/run_kosis_stats.py --help
44
+ ```
45
+
46
+ ### Supporting files (단일 SKILL.md 설치 복구)
47
+
48
+ 이 스킬은 `SKILL.md` 외에 helper(`scripts/run_kosis_stats.py`)와 레퍼런스 문서(`references/kosis-openapi-guide.md`)에 의존하는 **디렉터리 패키지형 스킬**이다. raw `SKILL.md` URL만 받는 설치 도구(Hermes 등)로 설치하면 `scripts/`·`references/`가 누락되어 helper 실행이 실패한다.
49
+
50
+ helper 실행 전에 파일 존재를 확인하고, 없으면 아래로 복구한다. `<skill-dir>`은 이 `SKILL.md`가 설치된 디렉터리다.
51
+
52
+ ```bash
53
+ skill_dir="<skill-dir>" # 예: ~/.hermes/skills/kosis-stats, ~/.claude/skills/kosis-stats
54
+ if [ ! -f "$skill_dir/scripts/run_kosis_stats.py" ]; then
55
+ mkdir -p "$skill_dir/scripts" "$skill_dir/references"
56
+ curl -fsSL https://raw.githubusercontent.com/NomaDamas/k-skill/main/kosis-stats/scripts/run_kosis_stats.py \
57
+ -o "$skill_dir/scripts/run_kosis_stats.py"
58
+ curl -fsSL https://raw.githubusercontent.com/NomaDamas/k-skill/main/kosis-stats/references/kosis-openapi-guide.md \
59
+ -o "$skill_dir/references/kosis-openapi-guide.md"
60
+ fi
61
+ python3 "$skill_dir/scripts/run_kosis_stats.py" --help
62
+ ```
63
+
64
+ 근본적으로는 디렉터리 단위로 설치하는 방식(`npx --yes skills add NomaDamas/k-skill --skill kosis-stats -g` 또는 repo clone)을 권장한다.
65
+
66
+ ## Required environment variables
67
+
68
+ - 일반 `search`/`meta`/`data`/`list`/`explain`/`indicator`: 없음. 기본 hosted `https://k-skill-proxy.nomadamas.org` 를 사용한다.
69
+ - `KSKILL_PROXY_BASE_URL` — self-host·별도 프록시를 쓸 때만 설정. 비우면 기본 hosted proxy를 사용한다.
70
+ - `KSKILL_KOSIS_API_KEY` — `bigdata` 또는 `--direct`로 KOSIS를 직접 호출할 때만 필요하다.
71
+
72
+ 발급 절차와 호출 한도, 에러 코드 등 자세한 내용은 [`references/kosis-openapi-guide.md`](references/kosis-openapi-guide.md) 참고.
73
+
74
+ ### Credential resolution order (`bigdata` 또는 `--direct` 전용)
75
+
76
+ 1. 돌쇠 credential mode에서는 provisioned `vault-run` capability를 사용하고, 없으면 `request_vault_credential`로 KOSIS API key 입력 UI를 호출한다.
77
+ 2. 그 밖의 환경에서는 이미 주입된 환경변수 → host vault → `~/.config/k-skill/secrets.env` (`0600`) 순서로 사용한다.
78
+ 3. generic fallback에서 값이 없으면 호스트의 가장 안전한 입력 표면으로 받아 vault 또는 dotenv에 저장한다.
79
+
80
+ 일반 조회 helper는 proxy URL만 읽고, KOSIS 인증키는 proxy 서버에서만 주입한다. `bigdata`/`--direct` 호출만 `KSKILL_KOSIS_API_KEY` 환경변수와 위 secrets 파일을 읽는다.
81
+ `list`/`explain`/`indicator`는 `search`/`meta`/`data`와 마찬가지로 proxy 경유로 동작한다.
82
+
83
+ ## Inputs
84
+
85
+ 서브커맨드: `search`, `meta`, `data`, `bigdata`, `list`, `explain`, `indicator`.
86
+
87
+ 공통 옵션:
88
+
89
+ - `--text`: 사람용 요약
90
+ - `--json`: 구조화 결과 (기본값)
91
+ - `--dry-run`: 인증키 없이 요청 URL/파라미터만 출력
92
+ - `--timeout N`: HTTP 타임아웃 초 단위 (기본 30)
93
+ - `--proxy-base-url URL`: 기본 hosted proxy 대신 self-host/alternate proxy 사용
94
+ - `--direct`: proxy를 우회하고 `KSKILL_KOSIS_API_KEY` 로 KOSIS 직접 호출
95
+
96
+ 서브커맨드별 입력:
97
+
98
+ - `search`
99
+ - `--query "키워드"`
100
+ - `--result-count N` (1-5000, 기본 20)
101
+ - `--start-count N` (페이징 시작, 기본 1)
102
+ - `meta`
103
+ - `--org-id 101` (기본 101=통계청)
104
+ - `--table-id DT_1IN0001`
105
+ - `--meta-type TBL|ITM|OBJ` (기본 TBL)
106
+ - `data`
107
+ - `--org-id 101`
108
+ - `--table-id DT_1IN0001`
109
+ - `--prd-se M|Q|S|Y|F|IR` (수록 주기)
110
+ - `--start YYYY[MM|QQ|HH]`, `--end YYYY[MM|QQ|HH]`
111
+ - `--itm-id ALL` (항목 ID, 기본 ALL)
112
+ - `--obj-l 1=ALL --obj-l 2=00` (분류 필터, 반복 가능)
113
+ - `bigdata`
114
+ - `--user-stats-id <KOSIS 등록 ID>`
115
+ - `--format json|sdmx|csv` (xls는 바이너리라 helper 미지원 — 필요 시 KOSIS 웹에서 직접 다운로드)
116
+ - `--prd-se`, `--new-est-prd-cnt` (선택)
117
+ - `list`
118
+ - `--vw-cd MT_ZTITLE|MT_OTITLE|MT_GTITLE01|MT_GTITLE02|MT_CHOSUN_TITLE|MT_HANKUK_TITLE|MT_STOP_TITLE|MT_RTITLE|MT_BUKHAN|MT_TM1_TITLE|MT_TM2_TITLE|MT_ETITLE` (필수)
119
+ - `--parent-id <LIST_ID>` (하위 카테고리 탐색, 기본 빈 문자열=최상위)
120
+ - `explain`
121
+ - `--stat-id <통계조사ID>` (단독) 또는 `--org-id 101 --table-id DT_1IN0001` (조합, 둘 중 하나 필수)
122
+ - `--meta-itm All|statsNm|statsKind|...` (기본 All, 한 번에 단일 필드 또는 All)
123
+ - `indicator`
124
+ - `--jipyo-id 160` (필수, 지표ID)
125
+ - `--service 1|2|3` (기본 1: 1=개념, 2=산정방법·출처, 3=전체설명)
126
+ - `--page-no N`, `--num-of-rows N` (페이징)
127
+
128
+ ## Workflow
129
+
130
+ ### 1. Ensure proxy access is available
131
+
132
+ 일반 `search`/`meta`/`data` 는 기본 hosted `k-skill-proxy`를 사용하므로 사용자 KOSIS 키가 필요 없다. self-host를 쓰면 `KSKILL_PROXY_BASE_URL`을 설정한다.
133
+
134
+ `bigdata` 또는 `--direct`가 필요할 때만 `KSKILL_KOSIS_API_KEY` 를 credential resolution order에 따라 확보한다. 시크릿이 없다는 이유로 다른 통계 사이트나 비공식 경로를 찾지 않는다.
135
+
136
+ ### 2. Search for candidate tables
137
+
138
+ 질문을 먼저 한국어 키워드로 좁히고 `search` 로 후보 통계표를 본다.
139
+
140
+ ```bash
141
+ python3 kosis-stats/scripts/run_kosis_stats.py search --query "1인 가구" --text
142
+ ```
143
+
144
+ 출력에서 `[ORG_ID/TBL_ID]`를 골라 다음 단계에 사용한다.
145
+
146
+ ### 3. Inspect the table meta before fetching data
147
+
148
+ 데이터를 받기 전에 분류/단위/주기를 확인한다.
149
+
150
+ ```bash
151
+ python3 kosis-stats/scripts/run_kosis_stats.py meta --table-id DT_1JC1501 --text
152
+ ```
153
+
154
+ ### 4. Fetch a small bounded slice first
155
+
156
+ `--prd-se`, `--start`, `--end`, `--obj-l` 으로 범위를 좁혀 작은 슬라이스를 먼저 조회한다.
157
+
158
+ ```bash
159
+ python3 kosis-stats/scripts/run_kosis_stats.py data \
160
+ --table-id DT_1JC1501 --prd-se Y --start 2020 --end 2022 \
161
+ --obj-l 1=ALL --json
162
+ ```
163
+
164
+ 표마다 필수 분류 차원 수가 다르다. **default `--obj-l 1=ALL` 만으로는 부족한 표가 많다.** KOSIS가 코드 `20` (필수요청변수값 누락 objL)을 돌려주면, `meta --table-id <ID> --meta-type ITM --json` 으로 ITM 안에 들어 있는 `OBJ_ID`(분류 차원)와 코드를 확인한 뒤 `--obj-l 1=<코드> --obj-l 2=<코드>` 형태로 필요한 차원을 모두 지정한다. (많은 표가 OBJ 메타는 비어 있고 분류가 ITM 안에 들어 있음.)
165
+
166
+ 40,000셀을 초과하면 KOSIS는 에러 코드 `31` 또는 `41` 을 반환한다. 기간을 좁히거나(예: 5년→1년) 분류 필터의 ALL 을 특정 코드로 바꿔(예: `--obj-l 1=11` 서울만) 호출을 분할한다. 그래도 부족하면 사용자별 통계자료(`userStatsId`)를 등록해 `bigdata` 서브커맨드를 사용한다.
167
+
168
+ 행정구역 코드 관례: `C1` 코드는 보통 시도가 2자리(`11` 서울, `26` 부산 등), 시군구가 5자리다. `data --json` 응답의 `C1` 필드를 확인해 원하는 단위만 후속 처리에서 필터한다.
169
+
170
+ ### 5. (Optional) Use bigdata for large datasets
171
+
172
+ `bigdata` 는 KOSIS 웹에서 미리 등록한 `userStatsId` 가 필요하다. 미등록 상태면 사용자에게 등록 안내만 하고 멈춘다.
173
+
174
+ ```bash
175
+ python3 kosis-stats/scripts/run_kosis_stats.py bigdata \
176
+ --user-stats-id "openapisample/101/DT_1IN1502/2/1/20191106094026_1" \
177
+ --format json --new-est-prd-cnt 5
178
+ ```
179
+
180
+ ### 6. Cite the source
181
+
182
+ 응답을 요약할 때는 `org_id`, `tbl_id`, 기간, 단위(`UNIT_NM`), 그리고 endpoint URL을 함께 적는다.
183
+
184
+ ## Done when
185
+
186
+ - 사용자 질문에 대응하는 통계표 ID(`org_id`/`tbl_id`)가 명확하다.
187
+ - 메타데이터를 1회 이상 조회해 분류·단위·주기를 확인했다.
188
+ - 작은 슬라이스부터 단계적으로 데이터를 받았다.
189
+ - 결과에 출처(table id, 기간, 단위, endpoint)를 명시했다.
190
+ - 한도 초과 시 분할 또는 `bigdata` 안내로 처리했다.
191
+
192
+ ## Failure modes
193
+
194
+ - `KSKILL_KOSIS_API_KEY` 누락: `bigdata` 또는 `--direct` 호출에서만 발급 안내 메시지와 함께 종료(exit 1)
195
+ - KOSIS 에러 코드 `10`/`11`: 인증키 누락/만료 → 키 점검. `bigdata` 에서 `11` 이 나오면 `userStatsId` 가 본인 KOSIS 계정에 등록된 것이 아닐 가능성이 크다.
196
+ - 코드 `20`: 필수 분류 누락 → `meta --meta-type OBJ` (또는 비어 있으면 `ITM`) 으로 필요한 차원 수와 코드를 확인하고 `--obj-l 1=... --obj-l 2=...` 모두 지정 후 재시도
197
+ - 코드 `21`: 잘못된 요청 변수 → `org_id`/`tbl_id`/기간 형식 재확인. tblId 의심 시 `search` 로 정확한 ID 다시 찾기
198
+ - 코드 `30`: 결과 없음 → 키워드를 더 짧게 또는 다른 표현으로 바꾸거나 기간/분류 완화. **meta 호출에서 30 이 나오면** 표가 해당 메타 타입을 지원하지 않는 경우이므로 다른 `--meta-type` 시도
199
+ - 코드 `31`/`41`: 한도 초과 → 기간 좁히기, 분류 ALL 을 특정 코드로 바꾸기, 또는 `bigdata` 사용
200
+ - 코드 `40`: 분당 1,000건 호출 한도 → 잠시 대기
201
+ - 코드 `50`: KOSIS 서버 오류 → 1~2초 후 재시도
202
+ - 비표준 JSON: KOSIS는 따옴표 없는 키를 가끔 반환한다. helper는 자동 보정한다.
203
+ - 응답에 `UNIT_NM` 누락: 일부 표는 KOSIS 응답에 단위가 비어 있다. helper text 출력의 `[summary]` 라인에 `unit=(KOSIS 응답에 UNIT_NM 미포함)` 으로 명시되며, 단위는 `meta` 응답이나 KOSIS 웹 화면에서 별도 확인한다.
204
+ - HTTPS 전용 (2026-03-05 이후): URL은 항상 `https://`. HTTP 요청은 차단된다.
205
+
206
+ ### 회복 시나리오 예시
207
+
208
+ - 코드 20 회복: `data --table-id DT_1J22001 --prd-se M --start 202401 --end 202401` → 코드 20 → `meta --table-id DT_1J22001 --meta-type ITM --json` 으로 차원 확인 → `data ... --obj-l 1=T10 --obj-l 2=0` 재호출 → 성공
209
+ - 코드 31 회복: `data --table-id DT_1B26001 --prd-se Y --start 2020 --end 2024 --obj-l 1=ALL --obj-l 2=ALL --obj-l 3=ALL` → 코드 31 → `... --start 2024 --end 2024 --obj-l 1=11 --obj-l 2=ALL --obj-l 3=ALL` (서울만) 재호출 → 성공
210
+
211
+ ## Maintainer review notes
212
+
213
+ 메인테이너가 이 스킬을 검토하기 위해 KOSIS 인증키를 새로 발급받을 필요는 없다.
214
+ 일반 조회는 `k-skill-proxy`가 KOSIS 인증키를 서버 쪽에서 주입한다. `bigdata` 와 `--direct`만 개인 KOSIS 키가 필요하다.
215
+
216
+ 키 없이 가능한 검증:
217
+
218
+ - `./scripts/validate-skills.sh`
219
+ - `python3 -m py_compile kosis-stats/scripts/run_kosis_stats.py kosis-stats/tests/test_run_kosis_stats.py`
220
+ - `python3 kosis-stats/scripts/run_kosis_stats.py --help`
221
+ - `python3 kosis-stats/scripts/run_kosis_stats.py search --query 인구 --dry-run` (URL/파라미터 출력만)
222
+ - `PYTHONPATH=kosis-stats/scripts python3 -m unittest discover -s kosis-stats/tests -p 'test_*.py' -v`
223
+ - `npm run ci`
224
+
225
+ 실제 direct live smoke는 기여자 또는 이미 KOSIS 키가 있는 사용자가 선택적으로 수행한다. Proxy live smoke는 배포 proxy에 `KOSIS_API_KEY`가 설정된 뒤 수행한다. PR에는 호출 endpoint, 파라미터, 응답 행 수 같은 비민감 요약만 남기고 인증키와 개인 조회 세부 내역은 공유하지 않는다.
226
+
227
+ ## Safety notes
228
+
229
+ - 조회 전용 스킬이다.
230
+ - 사용자별 통계자료(`userStatsId`) 등록, 데이터 수정, KOSIS 웹 자동화는 하지 않는다.
231
+ - 일반 조회 인증키는 proxy 서버에서만 다룬다. direct/bigdata 인증키는 환경변수 또는 `~/.config/k-skill/secrets.env` 로만 다룬다.
232
+ - 응답 JSON에 인증키가 echo 되지 않도록 helper는 `--dry-run` 시에도 키를 `<DRY-RUN>` 으로 대체한다.