smart-web-mcp 0.9.2 → 0.11.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.
- package/CHANGELOG.md +26 -0
- package/dist/browser-session.d.ts +4 -0
- package/dist/browser-session.js +121 -6
- package/dist/browser-session.js.map +1 -1
- package/dist/korea/coupang.d.ts +46 -0
- package/dist/korea/coupang.js +165 -0
- package/dist/korea/coupang.js.map +1 -0
- package/dist/korea/dart.d.ts +53 -0
- package/dist/korea/dart.js +105 -0
- package/dist/korea/dart.js.map +1 -0
- package/dist/korea/drug-safety.d.ts +33 -0
- package/dist/korea/drug-safety.js +60 -0
- package/dist/korea/drug-safety.js.map +1 -0
- package/dist/korea/fine-dust.d.ts +27 -0
- package/dist/korea/fine-dust.js +88 -0
- package/dist/korea/fine-dust.js.map +1 -0
- package/dist/korea/food-safety.d.ts +21 -0
- package/dist/korea/food-safety.js +50 -0
- package/dist/korea/food-safety.js.map +1 -0
- package/dist/korea/geeknews.d.ts +31 -0
- package/dist/korea/geeknews.js +144 -0
- package/dist/korea/geeknews.js.map +1 -0
- package/dist/korea/index.d.ts +16 -0
- package/dist/korea/index.js +17 -0
- package/dist/korea/index.js.map +1 -0
- package/dist/korea/law.d.ts +41 -0
- package/dist/korea/law.js +85 -0
- package/dist/korea/law.js.map +1 -0
- package/dist/korea/naver-news.d.ts +38 -0
- package/dist/korea/naver-news.js +67 -0
- package/dist/korea/naver-news.js.map +1 -0
- package/dist/korea/naver-shopping.d.ts +39 -0
- package/dist/korea/naver-shopping.js +51 -0
- package/dist/korea/naver-shopping.js.map +1 -0
- package/dist/korea/proxy-client.d.ts +20 -0
- package/dist/korea/proxy-client.js +88 -0
- package/dist/korea/proxy-client.js.map +1 -0
- package/dist/korea/public-restroom.d.ts +44 -0
- package/dist/korea/public-restroom.js +184 -0
- package/dist/korea/public-restroom.js.map +1 -0
- package/dist/korea/real-estate.d.ts +56 -0
- package/dist/korea/real-estate.js +95 -0
- package/dist/korea/real-estate.js.map +1 -0
- package/dist/korea/spellcheck.d.ts +32 -0
- package/dist/korea/spellcheck.js +142 -0
- package/dist/korea/spellcheck.js.map +1 -0
- package/dist/korea/stock.d.ts +59 -0
- package/dist/korea/stock.js +84 -0
- package/dist/korea/stock.js.map +1 -0
- package/dist/korea/subway.d.ts +29 -0
- package/dist/korea/subway.js +47 -0
- package/dist/korea/subway.js.map +1 -0
- package/dist/korea/weather.d.ts +35 -0
- package/dist/korea/weather.js +92 -0
- package/dist/korea/weather.js.map +1 -0
- package/dist/korea/zipcode.d.ts +25 -0
- package/dist/korea/zipcode.js +70 -0
- package/dist/korea/zipcode.js.map +1 -0
- package/dist/mcp-server.js +389 -1
- package/dist/mcp-server.js.map +1 -1
- package/dist/settings.d.ts +7 -0
- package/dist/settings.js +1 -0
- package/dist/settings.js.map +1 -1
- package/dist/smartfetch.d.ts +7 -0
- package/dist/smartfetch.js +16 -8
- package/dist/smartfetch.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 금감원 DART 전자공시 조회 — direct API, requires API_K_DART env var
|
|
3
|
+
* API base: https://opendart.fss.or.kr/api/
|
|
4
|
+
*/
|
|
5
|
+
import { httpGet } from "./proxy-client.js";
|
|
6
|
+
const DART_BASE = "https://opendart.fss.or.kr/api";
|
|
7
|
+
function dartKey() {
|
|
8
|
+
return process.env["API_K_DART"] ?? null;
|
|
9
|
+
}
|
|
10
|
+
async function dartGet(endpoint, params, timeoutMs = 20000) {
|
|
11
|
+
const key = dartKey();
|
|
12
|
+
if (!key) {
|
|
13
|
+
return { ok: false, message: "API_K_DART 환경변수가 없습니다. https://opendart.fss.or.kr 에서 발급하세요." };
|
|
14
|
+
}
|
|
15
|
+
const url = new URL(`${DART_BASE}/${endpoint}`);
|
|
16
|
+
url.searchParams.set("crtfc_key", key);
|
|
17
|
+
for (const [k, v] of Object.entries(params)) {
|
|
18
|
+
if (v)
|
|
19
|
+
url.searchParams.set(k, v);
|
|
20
|
+
}
|
|
21
|
+
const result = await httpGet(url.toString(), {}, timeoutMs);
|
|
22
|
+
if (!result.ok)
|
|
23
|
+
return { ok: false, message: result.message };
|
|
24
|
+
const d = result.data;
|
|
25
|
+
if (d["status"] && d["status"] !== "000") {
|
|
26
|
+
return { ok: false, message: `DART API 오류: [${d["status"]}] ${String(d["message"] ?? "")}` };
|
|
27
|
+
}
|
|
28
|
+
return { ok: true, data: result.data };
|
|
29
|
+
}
|
|
30
|
+
export async function runDart(options) {
|
|
31
|
+
const { action, corp_code, bgn_de, end_de, bsns_year, reprt_code = "11011", fs_div = "CFS", pblntf_ty, page_no = 1, page_count = 10, timeoutMs = 20000, } = options;
|
|
32
|
+
if (action === "company") {
|
|
33
|
+
if (!corp_code)
|
|
34
|
+
return { ok: false, message: "corp_code가 필요합니다." };
|
|
35
|
+
const result = await dartGet("company.json", { corp_code }, timeoutMs);
|
|
36
|
+
if (!result.ok)
|
|
37
|
+
return result;
|
|
38
|
+
return { source: "dart", status: "000", message: "정상", action, data: result.data };
|
|
39
|
+
}
|
|
40
|
+
if (action === "financials") {
|
|
41
|
+
if (!corp_code)
|
|
42
|
+
return { ok: false, message: "corp_code가 필요합니다." };
|
|
43
|
+
if (!bsns_year)
|
|
44
|
+
return { ok: false, message: "bsns_year(사업연도)가 필요합니다." };
|
|
45
|
+
const result = await dartGet("fnlttSinglAcntAll.json", { corp_code, bsns_year, reprt_code, fs_div }, timeoutMs);
|
|
46
|
+
if (!result.ok)
|
|
47
|
+
return result;
|
|
48
|
+
return { source: "dart", status: "000", message: "정상", action, data: result.data };
|
|
49
|
+
}
|
|
50
|
+
// disclosures (list.json)
|
|
51
|
+
const today = new Date().toISOString().slice(0, 10).replace(/-/g, "");
|
|
52
|
+
const threeMonthsAgo = new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10).replace(/-/g, "");
|
|
53
|
+
const params = {
|
|
54
|
+
bgn_de: bgn_de ?? threeMonthsAgo,
|
|
55
|
+
end_de: end_de ?? today,
|
|
56
|
+
page_no: String(page_no),
|
|
57
|
+
page_count: String(page_count),
|
|
58
|
+
sort: "date",
|
|
59
|
+
sort_mth: "desc",
|
|
60
|
+
};
|
|
61
|
+
if (corp_code)
|
|
62
|
+
params["corp_code"] = corp_code;
|
|
63
|
+
if (pblntf_ty)
|
|
64
|
+
params["pblntf_ty"] = pblntf_ty;
|
|
65
|
+
const result = await dartGet("list.json", params, timeoutMs);
|
|
66
|
+
if (!result.ok)
|
|
67
|
+
return result;
|
|
68
|
+
return { source: "dart", status: "000", message: "정상", action, data: result.data };
|
|
69
|
+
}
|
|
70
|
+
export function renderDart(result) {
|
|
71
|
+
if (result.action === "company") {
|
|
72
|
+
const d = result.data;
|
|
73
|
+
return [
|
|
74
|
+
`# DART 기업개황 — ${String(d["corp_name"] ?? "")}`,
|
|
75
|
+
d["corp_name_eng"] ? `영문명: ${String(d["corp_name_eng"])}` : "",
|
|
76
|
+
`종목코드: ${String(d["stock_code"] ?? "-")}`,
|
|
77
|
+
`대표자: ${String(d["ceo_nm"] ?? "-")}`,
|
|
78
|
+
`업종코드: ${String(d["induty_code"] ?? "-")}`,
|
|
79
|
+
`설립일: ${String(d["est_dt"] ?? "-")}`,
|
|
80
|
+
`결산월: ${String(d["acc_mt"] ?? "-")}월`,
|
|
81
|
+
d["adres"] ? `주소: ${String(d["adres"])}` : "",
|
|
82
|
+
d["hm_url"] ? `홈페이지: ${String(d["hm_url"])}` : "",
|
|
83
|
+
"",
|
|
84
|
+
"_금감원 DART 공시 데이터 기준 / 투자 조언 아님_",
|
|
85
|
+
].filter((l) => l !== "").join("\n");
|
|
86
|
+
}
|
|
87
|
+
if (result.action === "financials") {
|
|
88
|
+
const list = (result.data["list"] ?? []);
|
|
89
|
+
const lines = ["# DART 재무제표", ""];
|
|
90
|
+
for (const item of list.slice(0, 20)) {
|
|
91
|
+
lines.push(`- **${String(item["account_nm"] ?? "")}**: ${String(item["thstrm_amount"] ?? "")}`);
|
|
92
|
+
}
|
|
93
|
+
lines.push("\n_금감원 DART 공시 데이터 기준 / 투자 조언 아님_");
|
|
94
|
+
return lines.join("\n");
|
|
95
|
+
}
|
|
96
|
+
// disclosures
|
|
97
|
+
const list = (result.data["list"] ?? []);
|
|
98
|
+
const lines = ["# DART 공시 목록", `총 ${String(result.data["total_count"] ?? "?")}건`, ""];
|
|
99
|
+
for (const item of list) {
|
|
100
|
+
lines.push(`- **${item.report_nm}** — ${item.corp_name} (${item.rcept_dt})`);
|
|
101
|
+
}
|
|
102
|
+
lines.push("\n_금감원 DART 공시 데이터 기준 / 투자 조언 아님_");
|
|
103
|
+
return lines.join("\n");
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=dart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dart.js","sourceRoot":"","sources":["../../src/korea/dart.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drug safety info (식약처 의약품) via k-skill-proxy
|
|
3
|
+
* Endpoint: GET /v1/mfds/drug-safety/lookup?itemName=타이레놀
|
|
4
|
+
*
|
|
5
|
+
* Policy: always surface red flags first. This tool returns data only.
|
|
6
|
+
* Do NOT use for emergency diagnosis — always refer to 119/응급실 when needed.
|
|
7
|
+
*/
|
|
8
|
+
export type DrugItem = {
|
|
9
|
+
item_name?: string;
|
|
10
|
+
entp_name?: string;
|
|
11
|
+
efcy_qesitm?: string;
|
|
12
|
+
use_method_qesitm?: string;
|
|
13
|
+
atpn_qesitm?: string;
|
|
14
|
+
intrc_qesitm?: string;
|
|
15
|
+
se_qesitm?: string;
|
|
16
|
+
deposit_method_qesitm?: string;
|
|
17
|
+
item_image?: string;
|
|
18
|
+
source?: string;
|
|
19
|
+
};
|
|
20
|
+
export type DrugSafetyResult = {
|
|
21
|
+
source: "drug-safety";
|
|
22
|
+
query: string[];
|
|
23
|
+
total: number;
|
|
24
|
+
items: DrugItem[];
|
|
25
|
+
};
|
|
26
|
+
export declare function runDrugSafety(options: {
|
|
27
|
+
itemNames: string[];
|
|
28
|
+
timeoutMs?: number;
|
|
29
|
+
}): Promise<DrugSafetyResult | {
|
|
30
|
+
ok: false;
|
|
31
|
+
message: string;
|
|
32
|
+
}>;
|
|
33
|
+
export declare function renderDrugSafety(result: DrugSafetyResult): string;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drug safety info (식약처 의약품) via k-skill-proxy
|
|
3
|
+
* Endpoint: GET /v1/mfds/drug-safety/lookup?itemName=타이레놀
|
|
4
|
+
*
|
|
5
|
+
* Policy: always surface red flags first. This tool returns data only.
|
|
6
|
+
* Do NOT use for emergency diagnosis — always refer to 119/응급실 when needed.
|
|
7
|
+
*/
|
|
8
|
+
import { proxyGet } from "./proxy-client.js";
|
|
9
|
+
export async function runDrugSafety(options) {
|
|
10
|
+
const { itemNames, timeoutMs = 20000 } = options;
|
|
11
|
+
if (!itemNames.length)
|
|
12
|
+
return { ok: false, message: "itemName이 필요합니다." };
|
|
13
|
+
const allItems = [];
|
|
14
|
+
for (const itemName of itemNames) {
|
|
15
|
+
const result = await proxyGet("/v1/mfds/drug-safety/lookup", { itemName }, timeoutMs);
|
|
16
|
+
if (!result.ok) {
|
|
17
|
+
if (allItems.length === 0)
|
|
18
|
+
return { ok: false, message: `Drug safety lookup failed: ${result.message}` };
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const items = (result.data["items"] ?? result.data["list"] ?? [result.data]);
|
|
22
|
+
allItems.push(...items);
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
source: "drug-safety",
|
|
26
|
+
query: itemNames,
|
|
27
|
+
total: allItems.length,
|
|
28
|
+
items: allItems,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function renderDrugSafety(result) {
|
|
32
|
+
const lines = [
|
|
33
|
+
"⚠️ **이 정보는 참고용입니다. 최종 판단은 약사·의료진에게 확인하세요. 응급 증상(호흡곤란·의식저하·심한 발진)은 즉시 119.**",
|
|
34
|
+
"",
|
|
35
|
+
`# 의약품 안전 정보 — ${result.query.join(", ")}`,
|
|
36
|
+
`총 ${result.total}건`,
|
|
37
|
+
"",
|
|
38
|
+
];
|
|
39
|
+
for (const item of result.items) {
|
|
40
|
+
lines.push(`## ${item.item_name ?? "?"}`);
|
|
41
|
+
if (item.entp_name)
|
|
42
|
+
lines.push(`- 제조사: ${item.entp_name}`);
|
|
43
|
+
if (item.efcy_qesitm)
|
|
44
|
+
lines.push(`\n**효능·효과**: ${item.efcy_qesitm}`);
|
|
45
|
+
if (item.use_method_qesitm)
|
|
46
|
+
lines.push(`\n**용법·용량**: ${item.use_method_qesitm}`);
|
|
47
|
+
if (item.atpn_qesitm)
|
|
48
|
+
lines.push(`\n**주의사항**: ${item.atpn_qesitm}`);
|
|
49
|
+
if (item.intrc_qesitm)
|
|
50
|
+
lines.push(`\n**상호작용**: ${item.intrc_qesitm}`);
|
|
51
|
+
if (item.se_qesitm)
|
|
52
|
+
lines.push(`\n**이상반응**: ${item.se_qesitm}`);
|
|
53
|
+
if (item.deposit_method_qesitm)
|
|
54
|
+
lines.push(`\n**보관법**: ${item.deposit_method_qesitm}`);
|
|
55
|
+
lines.push("");
|
|
56
|
+
}
|
|
57
|
+
lines.push("_식약처 e약은요 공식 데이터 기준_");
|
|
58
|
+
return lines.join("\n");
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=drug-safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drug-safety.js","sourceRoot":"","sources":["../../src/korea/drug-safety.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAsB5C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAGnC;IACC,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,OAAO,CAAA;IAChD,IAAI,CAAC,SAAS,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAExE,MAAM,QAAQ,GAAe,EAAE,CAAA;IAC/B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAA0B,6BAA6B,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAA;QAC9G,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,8BAA8B,MAAM,CAAC,OAAO,EAAE,EAAE,CAAA;YACxG,SAAQ;QACV,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAe,CAAA;QAC1F,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAA;IACzB,CAAC;IAED,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,QAAQ,CAAC,MAAM;QACtB,KAAK,EAAE,QAAQ;KAChB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,MAAM,KAAK,GAAG;QACZ,6EAA6E;QAC7E,EAAE;QACF,iBAAiB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC1C,KAAK,MAAM,CAAC,KAAK,GAAG;QACpB,EAAE;KACH,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC,CAAA;QACzC,IAAI,IAAI,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;QAC1D,IAAI,IAAI,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QACpE,IAAI,IAAI,CAAC,iBAAiB;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAA;QAChF,IAAI,IAAI,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QACnE,IAAI,IAAI,CAAC,YAAY;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,YAAY,EAAE,CAAC,CAAA;QACrE,IAAI,IAAI,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;QAC/D,IAAI,IAAI,CAAC,qBAAqB;YAAE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAA;QACtF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fine dust / air quality (에어코리아) via k-skill-proxy
|
|
3
|
+
* Proxy endpoint: GET /v1/fine-dust/report?regionHint=서울 강남구
|
|
4
|
+
*/
|
|
5
|
+
export type FineDustResult = {
|
|
6
|
+
source: "fine-dust";
|
|
7
|
+
station: string;
|
|
8
|
+
region_hint: string;
|
|
9
|
+
queried_at: string;
|
|
10
|
+
pm10: string;
|
|
11
|
+
pm10_grade: string;
|
|
12
|
+
pm25: string;
|
|
13
|
+
pm25_grade: string;
|
|
14
|
+
overall_grade: string;
|
|
15
|
+
retrieval_method: string;
|
|
16
|
+
candidate_stations?: string[];
|
|
17
|
+
ambiguous?: boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare function runFineDust(options: {
|
|
20
|
+
regionHint?: string;
|
|
21
|
+
stationName?: string;
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
}): Promise<FineDustResult | {
|
|
24
|
+
ok: false;
|
|
25
|
+
message: string;
|
|
26
|
+
}>;
|
|
27
|
+
export declare function renderFineDust(result: FineDustResult): string;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fine dust / air quality (에어코리아) via k-skill-proxy
|
|
3
|
+
* Proxy endpoint: GET /v1/fine-dust/report?regionHint=서울 강남구
|
|
4
|
+
*/
|
|
5
|
+
import { proxyGet } from "./proxy-client.js";
|
|
6
|
+
const GRADE_MAP = {
|
|
7
|
+
"1": "좋음",
|
|
8
|
+
"2": "보통",
|
|
9
|
+
"3": "나쁨",
|
|
10
|
+
"4": "매우나쁨",
|
|
11
|
+
good: "좋음",
|
|
12
|
+
normal: "보통",
|
|
13
|
+
bad: "나쁨",
|
|
14
|
+
very_bad: "매우나쁨",
|
|
15
|
+
};
|
|
16
|
+
function gradeLabel(raw) {
|
|
17
|
+
const s = String(raw ?? "");
|
|
18
|
+
return GRADE_MAP[s] ?? s;
|
|
19
|
+
}
|
|
20
|
+
export async function runFineDust(options) {
|
|
21
|
+
const { regionHint, stationName, timeoutMs = 15000 } = options;
|
|
22
|
+
const params = {};
|
|
23
|
+
if (stationName) {
|
|
24
|
+
params["stationName"] = stationName;
|
|
25
|
+
}
|
|
26
|
+
else if (regionHint) {
|
|
27
|
+
params["regionHint"] = regionHint;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
return { ok: false, message: "regionHint 또는 stationName이 필요합니다." };
|
|
31
|
+
}
|
|
32
|
+
const result = await proxyGet("/v1/fine-dust/report", params, timeoutMs);
|
|
33
|
+
if (!result.ok) {
|
|
34
|
+
return { ok: false, message: `Fine dust lookup failed: ${result.message}` };
|
|
35
|
+
}
|
|
36
|
+
const d = result.data;
|
|
37
|
+
// Ambiguous location — multiple candidates returned
|
|
38
|
+
if (d["ambiguous_location"] === true || d["candidate_stations"]) {
|
|
39
|
+
const candidates = d["candidate_stations"] ?? [];
|
|
40
|
+
return {
|
|
41
|
+
source: "fine-dust",
|
|
42
|
+
station: "",
|
|
43
|
+
region_hint: regionHint ?? stationName ?? "",
|
|
44
|
+
queried_at: new Date().toISOString(),
|
|
45
|
+
pm10: "",
|
|
46
|
+
pm10_grade: "",
|
|
47
|
+
pm25: "",
|
|
48
|
+
pm25_grade: "",
|
|
49
|
+
overall_grade: "",
|
|
50
|
+
retrieval_method: String(d["retrieval_method"] ?? ""),
|
|
51
|
+
candidate_stations: candidates,
|
|
52
|
+
ambiguous: true,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
source: "fine-dust",
|
|
57
|
+
station: String(d["stationName"] ?? d["station"] ?? ""),
|
|
58
|
+
region_hint: regionHint ?? stationName ?? "",
|
|
59
|
+
queried_at: String(d["dataTime"] ?? d["queried_at"] ?? new Date().toISOString()),
|
|
60
|
+
pm10: String(d["pm10Value"] ?? d["pm10"] ?? ""),
|
|
61
|
+
pm10_grade: gradeLabel(d["pm10Grade"] ?? d["pm10_grade"]),
|
|
62
|
+
pm25: String(d["pm25Value"] ?? d["pm25"] ?? ""),
|
|
63
|
+
pm25_grade: gradeLabel(d["pm25Grade"] ?? d["pm25_grade"]),
|
|
64
|
+
overall_grade: gradeLabel(d["khaiGrade"] ?? d["overall_grade"] ?? d["grade"]),
|
|
65
|
+
retrieval_method: String(d["retrieval_method"] ?? d["fallback"] ?? "proxy"),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export function renderFineDust(result) {
|
|
69
|
+
if (result.ambiguous) {
|
|
70
|
+
const lines = [`# 미세먼지 — 위치 확인 필요`, `"${result.region_hint}"에 해당하는 측정소가 여러 개입니다.`, ""];
|
|
71
|
+
lines.push("측정소 후보:");
|
|
72
|
+
for (const s of result.candidate_stations ?? [])
|
|
73
|
+
lines.push(`- ${s}`);
|
|
74
|
+
lines.push("\n`stationName` 파라미터로 위 중 하나를 지정해서 재조회하세요.");
|
|
75
|
+
return lines.join("\n");
|
|
76
|
+
}
|
|
77
|
+
const lines = [
|
|
78
|
+
`# 미세먼지 — ${result.station || result.region_hint}`,
|
|
79
|
+
`조회 시점: ${result.queried_at}`,
|
|
80
|
+
"",
|
|
81
|
+
`- PM10: ${result.pm10} μg/m³ (${result.pm10_grade})`,
|
|
82
|
+
`- PM2.5: ${result.pm25} μg/m³ (${result.pm25_grade})`,
|
|
83
|
+
`- 통합대기: **${result.overall_grade}**`,
|
|
84
|
+
`- 조회방식: ${result.retrieval_method}`,
|
|
85
|
+
];
|
|
86
|
+
return lines.join("\n");
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=fine-dust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fine-dust.js","sourceRoot":"","sources":["../../src/korea/fine-dust.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Food safety info (식약처/식품안전나라) via k-skill-proxy
|
|
3
|
+
* Endpoints: /v1/mfds/food-safety/recall, /v1/mfds/food-safety/unfit, /v1/mfds/food-safety/functional-ingredient
|
|
4
|
+
*/
|
|
5
|
+
export type FoodSafetyResult = {
|
|
6
|
+
source: "food-safety";
|
|
7
|
+
action: string;
|
|
8
|
+
query: string;
|
|
9
|
+
total: number;
|
|
10
|
+
items: Record<string, unknown>[];
|
|
11
|
+
};
|
|
12
|
+
export declare function runFoodSafety(options: {
|
|
13
|
+
action: "recall" | "unfit" | "functional-ingredient";
|
|
14
|
+
query: string;
|
|
15
|
+
limit?: number;
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
}): Promise<FoodSafetyResult | {
|
|
18
|
+
ok: false;
|
|
19
|
+
message: string;
|
|
20
|
+
}>;
|
|
21
|
+
export declare function renderFoodSafety(result: FoodSafetyResult): string;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Food safety info (식약처/식품안전나라) via k-skill-proxy
|
|
3
|
+
* Endpoints: /v1/mfds/food-safety/recall, /v1/mfds/food-safety/unfit, /v1/mfds/food-safety/functional-ingredient
|
|
4
|
+
*/
|
|
5
|
+
import { proxyGet } from "./proxy-client.js";
|
|
6
|
+
export async function runFoodSafety(options) {
|
|
7
|
+
const { action, query, limit = 20, timeoutMs = 20000 } = options;
|
|
8
|
+
const pathMap = {
|
|
9
|
+
recall: "/v1/mfds/food-safety/recall",
|
|
10
|
+
unfit: "/v1/mfds/food-safety/unfit",
|
|
11
|
+
"functional-ingredient": "/v1/mfds/food-safety/functional-ingredient",
|
|
12
|
+
};
|
|
13
|
+
const path = pathMap[action];
|
|
14
|
+
if (!path)
|
|
15
|
+
return { ok: false, message: `Unknown action: ${action}` };
|
|
16
|
+
const result = await proxyGet(path, { q: query, limit: String(limit) }, timeoutMs);
|
|
17
|
+
if (!result.ok)
|
|
18
|
+
return { ok: false, message: `Food safety lookup failed: ${result.message}` };
|
|
19
|
+
const items = (result.data["items"] ?? result.data["list"] ?? []);
|
|
20
|
+
const total = typeof result.data["total"] === "number" ? result.data["total"] : items.length;
|
|
21
|
+
return { source: "food-safety", action, query, total, items };
|
|
22
|
+
}
|
|
23
|
+
export function renderFoodSafety(result) {
|
|
24
|
+
const actionLabel = {
|
|
25
|
+
recall: "회수·판매중지",
|
|
26
|
+
unfit: "검사부적합",
|
|
27
|
+
"functional-ingredient": "기능성 원료 인정현황",
|
|
28
|
+
};
|
|
29
|
+
const lines = [
|
|
30
|
+
"⚠️ **응급 증상(혈변·탈수·호흡곤란·의식저하)은 즉시 119.**",
|
|
31
|
+
"",
|
|
32
|
+
`# 식품 안전 정보 — ${actionLabel[result.action] ?? result.action}`,
|
|
33
|
+
`검색어: "${result.query}" | 총 ${result.total}건`,
|
|
34
|
+
"",
|
|
35
|
+
];
|
|
36
|
+
if (result.items.length === 0) {
|
|
37
|
+
lines.push("조회 결과가 없습니다.");
|
|
38
|
+
return lines.join("\n");
|
|
39
|
+
}
|
|
40
|
+
for (const item of result.items.slice(0, 20)) {
|
|
41
|
+
const name = String(item["prdlst_nm"] ?? item["item_name"] ?? item["name"] ?? item["PRDUCT_NM"] ?? "?");
|
|
42
|
+
const maker = String(item["bssh_nm"] ?? item["entp_name"] ?? item["ENTP_NM"] ?? "");
|
|
43
|
+
const reason = String(item["recalls_reason"] ?? item["unfit_reason"] ?? item["reason"] ?? item["RECALL_REASON"] ?? "");
|
|
44
|
+
const date = String(item["recalls_dt"] ?? item["dt"] ?? item["DATE"] ?? "");
|
|
45
|
+
lines.push(`- **${name}**${maker ? ` (${maker})` : ""}${reason ? ` — ${reason}` : ""}${date ? ` [${date}]` : ""}`);
|
|
46
|
+
}
|
|
47
|
+
lines.push("\n_식약처/식품안전나라 공식 데이터 기준_");
|
|
48
|
+
return lines.join("\n");
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=food-safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"food-safety.js","sourceRoot":"","sources":["../../src/korea/food-safety.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GeekNews (news.hada.io) — public RSS/Atom feed
|
|
3
|
+
* Feed: https://feeds.feedburner.com/geeknews-feed
|
|
4
|
+
*/
|
|
5
|
+
export type GeeknewsItem = {
|
|
6
|
+
id: string;
|
|
7
|
+
title: string;
|
|
8
|
+
link: string;
|
|
9
|
+
author: string;
|
|
10
|
+
published: string;
|
|
11
|
+
summary: string;
|
|
12
|
+
};
|
|
13
|
+
export type GeeknewsResult = {
|
|
14
|
+
source: "geeknews";
|
|
15
|
+
query: string | null;
|
|
16
|
+
limit: number;
|
|
17
|
+
total: number;
|
|
18
|
+
items: GeeknewsItem[];
|
|
19
|
+
feed_url: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function runGeeknews(options: {
|
|
22
|
+
action?: "list" | "search" | "detail";
|
|
23
|
+
query?: string;
|
|
24
|
+
id?: string;
|
|
25
|
+
limit?: number;
|
|
26
|
+
timeoutMs?: number;
|
|
27
|
+
}): Promise<GeeknewsResult | {
|
|
28
|
+
ok: false;
|
|
29
|
+
message: string;
|
|
30
|
+
}>;
|
|
31
|
+
export declare function renderGeeknews(result: GeeknewsResult): string;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GeekNews (news.hada.io) — public RSS/Atom feed
|
|
3
|
+
* Feed: https://feeds.feedburner.com/geeknews-feed
|
|
4
|
+
*/
|
|
5
|
+
import { httpGetText } from "./proxy-client.js";
|
|
6
|
+
const GEEKNEWS_FEED = "https://feeds.feedburner.com/geeknews-feed";
|
|
7
|
+
const GEEKNEWS_HOME = "https://news.hada.io";
|
|
8
|
+
function stripHtml(html) {
|
|
9
|
+
return html.replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
|
|
10
|
+
}
|
|
11
|
+
function decodeXmlEntities(text) {
|
|
12
|
+
return text
|
|
13
|
+
.replace(/&/g, "&")
|
|
14
|
+
.replace(/</g, "<")
|
|
15
|
+
.replace(/>/g, ">")
|
|
16
|
+
.replace(/"/g, '"')
|
|
17
|
+
.replace(/'/g, "'")
|
|
18
|
+
.replace(/'/g, "'")
|
|
19
|
+
.replace(/ /g, " ")
|
|
20
|
+
.replace(/&#(\d+);/g, (_m, n) => String.fromCharCode(parseInt(n, 10)));
|
|
21
|
+
}
|
|
22
|
+
function extractXml(text, tag) {
|
|
23
|
+
const match = text.match(new RegExp(`<${tag}(?:[^>]*)>([\\s\\S]*?)<\\/${tag}>`, "i"));
|
|
24
|
+
return match ? decodeXmlEntities(stripHtml(match[1] || "")).trim() : "";
|
|
25
|
+
}
|
|
26
|
+
function extractCdata(text, tag) {
|
|
27
|
+
const match = text.match(new RegExp(`<${tag}[^>]*>(?:<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>|([\\s\\S]*?))<\\/${tag}>`, "i"));
|
|
28
|
+
const raw = match?.[1] ?? match?.[2] ?? "";
|
|
29
|
+
return decodeXmlEntities(stripHtml(raw)).trim();
|
|
30
|
+
}
|
|
31
|
+
function extractLink(block) {
|
|
32
|
+
const atomLink = block.match(/<link[^>]+href=["']([^"']+)["']/i)?.[1];
|
|
33
|
+
if (atomLink)
|
|
34
|
+
return atomLink.trim();
|
|
35
|
+
const rssLink = extractXml(block, "link");
|
|
36
|
+
if (rssLink)
|
|
37
|
+
return rssLink.trim();
|
|
38
|
+
return "";
|
|
39
|
+
}
|
|
40
|
+
function extractId(block) {
|
|
41
|
+
const guid = extractXml(block, "guid");
|
|
42
|
+
if (guid)
|
|
43
|
+
return guid;
|
|
44
|
+
const id = extractXml(block, "id");
|
|
45
|
+
if (id)
|
|
46
|
+
return id;
|
|
47
|
+
return extractLink(block);
|
|
48
|
+
}
|
|
49
|
+
function parseItems(feedXml) {
|
|
50
|
+
const items = [];
|
|
51
|
+
const blockPattern = /<(?:item|entry)\b[^>]*>([\s\S]*?)<\/(?:item|entry)>/gi;
|
|
52
|
+
for (const blockMatch of feedXml.matchAll(blockPattern)) {
|
|
53
|
+
const block = blockMatch[1] || "";
|
|
54
|
+
const title = extractCdata(block, "title") || extractXml(block, "title");
|
|
55
|
+
const link = extractLink(block);
|
|
56
|
+
const author = extractCdata(block, "author") || extractXml(block, "author") || extractXml(block, "dc:creator") || "GeekNews";
|
|
57
|
+
const published = extractXml(block, "pubDate") || extractXml(block, "published") || extractXml(block, "updated") || "";
|
|
58
|
+
const summary = extractCdata(block, "description") || extractCdata(block, "summary") || extractXml(block, "description") || extractXml(block, "summary") || "";
|
|
59
|
+
const id = extractId(block);
|
|
60
|
+
if (title || link) {
|
|
61
|
+
items.push({
|
|
62
|
+
id: id || link,
|
|
63
|
+
title,
|
|
64
|
+
link: link || GEEKNEWS_HOME,
|
|
65
|
+
author,
|
|
66
|
+
published,
|
|
67
|
+
summary: summary.slice(0, 1000),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return items;
|
|
72
|
+
}
|
|
73
|
+
function matchesQuery(item, query) {
|
|
74
|
+
const q = query.toLowerCase();
|
|
75
|
+
return (item.title.toLowerCase().includes(q) ||
|
|
76
|
+
item.summary.toLowerCase().includes(q) ||
|
|
77
|
+
item.author.toLowerCase().includes(q) ||
|
|
78
|
+
item.link.toLowerCase().includes(q) ||
|
|
79
|
+
item.id.toLowerCase().includes(q));
|
|
80
|
+
}
|
|
81
|
+
export async function runGeeknews(options) {
|
|
82
|
+
const { action = "list", query, id, limit = 20, timeoutMs = 15000 } = options;
|
|
83
|
+
const feedResult = await httpGetText(GEEKNEWS_FEED, {
|
|
84
|
+
accept: "application/rss+xml, application/atom+xml, text/xml, */*",
|
|
85
|
+
}, timeoutMs);
|
|
86
|
+
if (!feedResult.ok) {
|
|
87
|
+
return { ok: false, message: `Failed to fetch GeekNews feed: ${feedResult.message}` };
|
|
88
|
+
}
|
|
89
|
+
const allItems = parseItems(feedResult.data);
|
|
90
|
+
if (action === "detail" && id) {
|
|
91
|
+
const found = allItems.find((item) => item.id === id ||
|
|
92
|
+
item.link === id ||
|
|
93
|
+
item.id.includes(id) ||
|
|
94
|
+
item.link.includes(id));
|
|
95
|
+
const matched = found ? [found] : [];
|
|
96
|
+
return {
|
|
97
|
+
source: "geeknews",
|
|
98
|
+
query: id,
|
|
99
|
+
limit: 1,
|
|
100
|
+
total: matched.length,
|
|
101
|
+
items: matched,
|
|
102
|
+
feed_url: GEEKNEWS_FEED,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (action === "search" && query) {
|
|
106
|
+
const filtered = allItems.filter((item) => matchesQuery(item, query)).slice(0, limit);
|
|
107
|
+
return {
|
|
108
|
+
source: "geeknews",
|
|
109
|
+
query,
|
|
110
|
+
limit,
|
|
111
|
+
total: filtered.length,
|
|
112
|
+
items: filtered,
|
|
113
|
+
feed_url: GEEKNEWS_FEED,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// list
|
|
117
|
+
return {
|
|
118
|
+
source: "geeknews",
|
|
119
|
+
query: null,
|
|
120
|
+
limit,
|
|
121
|
+
total: allItems.length,
|
|
122
|
+
items: allItems.slice(0, limit),
|
|
123
|
+
feed_url: GEEKNEWS_FEED,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export function renderGeeknews(result) {
|
|
127
|
+
const lines = [`# GeekNews (${result.total} items)`];
|
|
128
|
+
if (result.query)
|
|
129
|
+
lines.push(`Query: ${result.query}`);
|
|
130
|
+
lines.push("");
|
|
131
|
+
for (const item of result.items) {
|
|
132
|
+
lines.push(`## ${item.title}`);
|
|
133
|
+
lines.push(`- Link: ${item.link}`);
|
|
134
|
+
if (item.author && item.author !== "GeekNews")
|
|
135
|
+
lines.push(`- Author: ${item.author}`);
|
|
136
|
+
if (item.published)
|
|
137
|
+
lines.push(`- Published: ${item.published}`);
|
|
138
|
+
if (item.summary)
|
|
139
|
+
lines.push(`\n${item.summary}`);
|
|
140
|
+
lines.push("");
|
|
141
|
+
}
|
|
142
|
+
return lines.join("\n");
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=geeknews.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geeknews.js","sourceRoot":"","sources":["../../src/korea/geeknews.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { runGeeknews, renderGeeknews } from "./geeknews.js";
|
|
2
|
+
export { runSubway, renderSubway } from "./subway.js";
|
|
3
|
+
export { runWeather, renderWeather } from "./weather.js";
|
|
4
|
+
export { runFineDust, renderFineDust } from "./fine-dust.js";
|
|
5
|
+
export { runStock, renderStock } from "./stock.js";
|
|
6
|
+
export { runDart, renderDart } from "./dart.js";
|
|
7
|
+
export { runRealEstate, renderRealEstate } from "./real-estate.js";
|
|
8
|
+
export { runDrugSafety, renderDrugSafety } from "./drug-safety.js";
|
|
9
|
+
export { runFoodSafety, renderFoodSafety } from "./food-safety.js";
|
|
10
|
+
export { runNaverNews, renderNaverNews } from "./naver-news.js";
|
|
11
|
+
export { runNaverShopping, renderNaverShopping } from "./naver-shopping.js";
|
|
12
|
+
export { runCoupang, renderCoupang } from "./coupang.js";
|
|
13
|
+
export { runSpellCheck, renderSpellCheck } from "./spellcheck.js";
|
|
14
|
+
export { runZipcode, renderZipcode } from "./zipcode.js";
|
|
15
|
+
export { runLaw, renderLaw } from "./law.js";
|
|
16
|
+
export { runPublicRestroom, renderPublicRestroom } from "./public-restroom.js";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { runGeeknews, renderGeeknews } from "./geeknews.js";
|
|
2
|
+
export { runSubway, renderSubway } from "./subway.js";
|
|
3
|
+
export { runWeather, renderWeather } from "./weather.js";
|
|
4
|
+
export { runFineDust, renderFineDust } from "./fine-dust.js";
|
|
5
|
+
export { runStock, renderStock } from "./stock.js";
|
|
6
|
+
export { runDart, renderDart } from "./dart.js";
|
|
7
|
+
export { runRealEstate, renderRealEstate } from "./real-estate.js";
|
|
8
|
+
export { runDrugSafety, renderDrugSafety } from "./drug-safety.js";
|
|
9
|
+
export { runFoodSafety, renderFoodSafety } from "./food-safety.js";
|
|
10
|
+
export { runNaverNews, renderNaverNews } from "./naver-news.js";
|
|
11
|
+
export { runNaverShopping, renderNaverShopping } from "./naver-shopping.js";
|
|
12
|
+
export { runCoupang, renderCoupang } from "./coupang.js";
|
|
13
|
+
export { runSpellCheck, renderSpellCheck } from "./spellcheck.js";
|
|
14
|
+
export { runZipcode, renderZipcode } from "./zipcode.js";
|
|
15
|
+
export { runLaw, renderLaw } from "./law.js";
|
|
16
|
+
export { runPublicRestroom, renderPublicRestroom } from "./public-restroom.js";
|
|
17
|
+
//# sourceMappingURL=index.js.map
|