UNPKG

k-mfds-fooddb-mcp-server

Version:

식품의약품안전처 식품영양성분DB를 MCP 도구로 제공합니다.

621 lines (601 loc) 34.7 kB
#!/usr/bin/env node // src/index.ts import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; // src/tools/foodSearch.ts import { z } from "zod"; // src/external/mfds/util.ts function extractBodyFromResponse(res) { const data = res.data; if (!data.header || !data.header.resultCode || data.header.resultCode != "00") { throw Error(`gov api error: ${data.body}`); } return data.body; } function extractItemArrayOrDefualtEmptyArrayFromBody(body) { let result = []; if (body && body.items) { if (!Array.isArray(body.items)) { result = [body.items]; } else { result = body.items; } } return result; } function extractPagingInfoOrDefaultEmptyObjectFromBody(body, appendObject = {}) { let paging = { numOfRows: Number(body.numOfRows), pageNo: body.pageNo, totalCount: body.totalCount }; Object.keys(appendObject).forEach((key) => { paging[key] = appendObject[key]; }); return paging; } // src/external/mfds/api.ts import axios from "axios"; // src/config/index.ts import dotenv from "dotenv"; dotenv.config(); function validateConfig() { const govApiKey = process.env.GOV_API_KEY; if (!govApiKey) { throw new Error("GOV_API_KEY \uD658\uACBD\uBCC0\uC218\uAC00 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."); } return { govApi: { key: govApiKey }, log: { level: process.env.LOG_LEVEL || "info" } }; } var config = validateConfig(); // src/external/mfds/api.ts var DataType = { XML: "xml", JSON: "json" }; var API_URL = "http://apis.data.go.kr/1471000/FoodNtrCpntDbInfo02"; var axiosInstance = axios.create({ baseURL: API_URL, params: { serviceKey: config.govApi.key, type: DataType.JSON } }); async function getFoodNutritionComponentDatabaseInquery(foodNameKr = "", researchYearMonthDate = "", makerName = "", pageNo = 1, numOfRows = 10, type = "json", foodCategory1Name = "", itemReportNo = "", updateDate = "", dbClassName = "") { const res = await axiosInstance.get("/getFoodNtrCpntDbInq02", { params: { FOOD_NM_KR: foodNameKr, RESEARCH_YMD: researchYearMonthDate, MAKER_NM: makerName, pageNo, numOfRows, type, FOOD_CAT1_NM: foodCategory1Name, ITEM_REPORT_NO: itemReportNo, UPDATE_DATE: updateDate, DB_CLASS_NM: dbClassName } }); return extractBodyFromResponse(res); } // src/external/mfds/dtos/AmtCodeTypeResponse.ts var AmtCodeTypeItem = class { constructor({ code, label, name, unit }) { this.code = code; this.label = label; this.name = name; this.unit = unit; } }; var AmtCodeTypeResponse = class { constructor(amtCodeTypes) { /** AmtCodeTypeItem 리스트 */ this._items = []; this.items = amtCodeTypes; } static { this.AmtCodeTypeItem = AmtCodeTypeItem; } get items() { return this._items; } set items(values) { if (!Array.isArray(values) || !values.every((each) => each instanceof AmtCodeTypeItem)) { throw new Error("items \uD615\uC2DD\uC5D0 \uB9DE\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."); } this._items = values; } }; // src/external/mfds/dtos/FoodNutrition.ts var FoodNutrition = class { constructor(params) { this.num = params.num; this.foodCode = params.foodCode; this.foodNameKr = params.foodNameKr; this.dbGroupCode = params.dbGroupCode; this.dbGroupName = params.dbGroupName; this.foodOriginCode = params.foodOriginCode; this.foodOriginName = params.foodOriginName; this.foodCategory1Code = params.foodCategory1Code; this.foodCategory1Name = params.foodCategory1Name; this.foodRepresentCode = params.foodRepresentCode; this.foodRepresentName = params.foodRepresentName; this.foodCategory2Code = params.foodCategory2Code; this.foodCategory2Name = params.foodCategory2Name; this.foodCategory3Code = params.foodCategory3Code; this.foodCategory3Name = params.foodCategory3Name; this.foodCategory4Code = params.foodCategory4Code; this.foodCategory4Name = params.foodCategory4Name; this.servingSize = params.servingSize; this.subReferenceCode = params.subReferenceCode; this.subReferenceName = params.subReferenceName; this.nutritionalAmountPerServing = params.nutritionalAmountPerServing; this.foodWeight = params.foodWeight; this.itemReportNum = params.itemReportNum; this.makerName = params.makerName; this.importManufacturerName = params.importManufacturerName; this.sellerManufacturerName = params.sellerManufacturerName; this.importYesOrNo = params.importYesOrNo; this.nationCode = params.nationCode; this.nationName = params.nationName; this.creationMethodCode = params.creationMethodCode; this.creationMethodName = params.creationMethodName; this.researchDate = params.researchDate; this.updateDate = params.updateDate; this.nutritionComponents = params.nutritionComponents; } }; // src/external/mfds/dtos/NutritionComponent.ts var NutritionComponent = class { constructor({ name, label, value, unit }) { this.name = name; this.label = label; this.value = value; this.unit = unit; } }; // src/external/mfds/types/AmtNumDataType.ts var AmtNumDataType = Object.freeze({ AMT_NUM1: { label: "\uC5D0\uB108\uC9C0(kcal)", unit: "kcal", name: "\uC5D0\uB108\uC9C0" }, AMT_NUM2: { label: "\uC218\uBD84(g)", unit: "g", name: "\uC218\uBD84" }, AMT_NUM3: { label: "\uB2E8\uBC31\uC9C8(g)", unit: "g", name: "\uB2E8\uBC31\uC9C8" }, AMT_NUM4: { label: "\uC9C0\uBC29(g)", unit: "g", name: "\uC9C0\uBC29" }, AMT_NUM5: { label: "\uD68C\uBD84(g)", unit: "g", name: "\uD68C\uBD84" }, AMT_NUM6: { label: "\uD0C4\uC218\uD654\uBB3C(g)", unit: "g", name: "\uD0C4\uC218\uD654\uBB3C" }, AMT_NUM7: { label: "\uB2F9\uB958(g)", unit: "g", name: "\uB2F9\uB958" }, AMT_NUM8: { label: "\uC2DD\uC774\uC12C\uC720(g)", unit: "g", name: "\uC2DD\uC774\uC12C\uC720" }, AMT_NUM9: { label: "\uCE7C\uC298(mg)", unit: "mg", name: "\uCE7C\uC298" }, AMT_NUM10: { label: "\uCCA0(mg)", unit: "mg", name: "\uCCA0" }, AMT_NUM11: { label: "\uC778(mg)", unit: "mg", name: "\uC778" }, AMT_NUM12: { label: "\uCE7C\uB968(mg)", unit: "mg", name: "\uCE7C\uB968" }, AMT_NUM13: { label: "\uB098\uD2B8\uB968(mg)", unit: "mg", name: "\uB098\uD2B8\uB968" }, AMT_NUM14: { label: "\uBE44\uD0C0\uBBFC A(\u03BCg RAE)", unit: "\u03BCg RAE", name: "\uBE44\uD0C0\uBBFC A" }, AMT_NUM15: { label: "\uB808\uD2F0\uB180(\u03BCg)", unit: "\u03BCg", name: "\uB808\uD2F0\uB180" }, AMT_NUM16: { label: "\uBCA0\uD0C0\uCE74\uB85C\uD2F4(\u03BCg)", unit: "\u03BCg", name: "\uBCA0\uD0C0\uCE74\uB85C\uD2F4" }, AMT_NUM17: { label: "\uD2F0\uC544\uBBFC(mg)", unit: "mg", name: "\uD2F0\uC544\uBBFC" }, AMT_NUM18: { label: "\uB9AC\uBCF4\uD50C\uB77C\uBE48(mg)", unit: "mg", name: "\uB9AC\uBCF4\uD50C\uB77C\uBE48" }, AMT_NUM19: { label: "\uB2C8\uC544\uC2E0(mg)", unit: "mg", name: "\uB2C8\uC544\uC2E0" }, AMT_NUM20: { label: "\uBE44\uD0C0\uBBFC C(mg)", unit: "mg", name: "\uBE44\uD0C0\uBBFC C" }, AMT_NUM21: { label: "\uBE44\uD0C0\uBBFC D(\u03BCg)", unit: "\u03BCg", name: "\uBE44\uD0C0\uBBFC D" }, AMT_NUM22: { label: "\uCF5C\uB808\uC2A4\uD14C\uB864(mg)", unit: "mg", name: "\uCF5C\uB808\uC2A4\uD14C\uB864" }, AMT_NUM23: { label: "\uD3EC\uD654\uC9C0\uBC29\uC0B0(g)", unit: "g", name: "\uD3EC\uD654\uC9C0\uBC29\uC0B0" }, AMT_NUM24: { label: "\uD2B8\uB79C\uC2A4\uC9C0\uBC29\uC0B0(g)", unit: "g", name: "\uD2B8\uB79C\uC2A4\uC9C0\uBC29\uC0B0" }, AMT_NUM25: { label: "\uB2C8\uCF54\uD2F4\uC0B0(mg)", unit: "mg", name: "\uB2C8\uCF54\uD2F4\uC0B0" }, AMT_NUM26: { label: "\uB2C8\uCF54\uD2F4\uC544\uB9C8\uC774\uB4DC(mg)", unit: "mg", name: "\uB2C8\uCF54\uD2F4\uC544\uB9C8\uC774\uB4DC" }, AMT_NUM27: { label: "\uBE44\uC624\uD2F4 / \uBC14\uC774\uC624\uD2F4(\u03BCg)", unit: "\u03BCg", name: "\uBE44\uC624\uD2F4" }, AMT_NUM28: { label: "\uBE44\uD0C0\uBBFC B6(mg)", unit: "mg", name: "\uBE44\uD0C0\uBBFC B6" }, AMT_NUM29: { label: "\uBE44\uD0C0\uBBFC B12(\u03BCg)", unit: "\u03BCg", name: "\uBE44\uD0C0\uBBFC B12" }, AMT_NUM30: { label: "\uC5FD\uC0B0(DFE)(\u03BCg)", unit: "\u03BCg", name: "\uC5FD\uC0B0" }, AMT_NUM31: { label: "\uCF5C\uB9B0(mg)", unit: "mg", name: "\uCF5C\uB9B0" }, AMT_NUM32: { label: "\uD310\uD1A0\uD150\uC0B0(mg)", unit: "mg", name: "\uD310\uD1A0\uD150\uC0B0" }, AMT_NUM33: { label: "\uBE44\uD0C0\uBBFC D2(\u03BCg)", unit: "\u03BCg", name: "\uBE44\uD0C0\uBBFC D2" }, AMT_NUM34: { label: "\uBE44\uD0C0\uBBFC D3(\u03BCg)", unit: "\u03BCg", name: "\uBE44\uD0C0\uBBFC D3" }, AMT_NUM35: { label: "\uBE44\uD0C0\uBBFC E(mg \u03B1-TE)", unit: "mg \u03B1-TE", name: "\uBE44\uD0C0\uBBFC E" }, AMT_NUM36: { label: "\uD1A0\uCF54\uD398\uB864(mg)", unit: "mg", name: "\uD1A0\uCF54\uD398\uB864" }, AMT_NUM37: { label: "\uC54C\uD30C \uD1A0\uCF54\uD398\uB864(mg)", unit: "mg", name: "\uC54C\uD30C \uD1A0\uCF54\uD398\uB864" }, AMT_NUM38: { label: "\uBCA0\uD0C0 \uD1A0\uCF54\uD398\uB864(mg)", unit: "mg", name: "\uBCA0\uD0C0 \uD1A0\uCF54\uD398\uB864" }, AMT_NUM39: { label: "\uAC10\uB9C8 \uD1A0\uCF54\uD398\uB864(mg)", unit: "mg", name: "\uAC10\uB9C8 \uD1A0\uCF54\uD398\uB864" }, AMT_NUM40: { label: "\uB378\uD0C0 \uD1A0\uCF54\uD398\uB864(mg)", unit: "mg", name: "\uB378\uD0C0 \uD1A0\uCF54\uD398\uB864" }, AMT_NUM41: { label: "\uD1A0\uCF54\uD2B8\uB9AC\uC5D0\uB180(mg)", unit: "mg", name: "\uD1A0\uCF54\uD2B8\uB9AC\uC5D0\uB180" }, AMT_NUM42: { label: "\uC54C\uD30C \uD1A0\uCF54\uD2B8\uB9AC\uC5D0\uB180(mg)", unit: "mg", name: "\uC54C\uD30C \uD1A0\uCF54\uD2B8\uB9AC\uC5D0\uB180" }, AMT_NUM43: { label: "\uBCA0\uD0C0 \uD1A0\uCF54\uD2B8\uB9AC\uC5D0\uB180(mg)", unit: "mg", name: "\uBCA0\uD0C0 \uD1A0\uCF54\uD2B8\uB9AC\uC5D0\uB180" }, AMT_NUM44: { label: "\uAC10\uB9C8 \uD1A0\uCF54\uD2B8\uB9AC\uC5D0\uB180(mg)", unit: "mg", name: "\uAC10\uB9C8 \uD1A0\uCF54\uD2B8\uB9AC\uC5D0\uB180" }, AMT_NUM45: { label: "\uB378\uD0C0 \uD1A0\uCF54\uD2B8\uB9AC\uC5D0\uB180(mg)", unit: "mg", name: "\uB378\uD0C0 \uD1A0\uCF54\uD2B8\uB9AC\uC5D0\uB180" }, AMT_NUM46: { label: "\uBE44\uD0C0\uBBFC K(\u03BCg)", unit: "\u03BCg", name: "\uBE44\uD0C0\uBBFC K" }, AMT_NUM47: { label: "\uBE44\uD0C0\uBBFC K1(\u03BCg)", unit: "\u03BCg", name: "\uBE44\uD0C0\uBBFC K1" }, AMT_NUM48: { label: "\uBE44\uD0C0\uBBFC K2(\u03BCg)", unit: "\u03BCg", name: "\uBE44\uD0C0\uBBFC K2" }, AMT_NUM49: { label: "\uAC08\uB77D\uD1A0\uC624\uC2A4(g)", unit: "g", name: "\uAC08\uB77D\uD1A0\uC624\uC2A4" }, AMT_NUM50: { label: "\uACFC\uB2F9(g)", unit: "g", name: "\uACFC\uB2F9" }, AMT_NUM51: { label: "\uB2F9\uC54C\uCF5C(g)", unit: "g", name: "\uB2F9\uC54C\uCF5C" }, AMT_NUM52: { label: "\uB9E5\uC544\uB2F9(g)", unit: "g", name: "\uB9E5\uC544\uB2F9" }, AMT_NUM53: { label: "\uC54C\uB8F0\uB85C\uC624\uC2A4(g)", unit: "g", name: "\uC54C\uB8F0\uB85C\uC624\uC2A4" }, AMT_NUM54: { label: "\uC5D0\uB9AC\uC2A4\uB9AC\uD1A8(g)", unit: "g", name: "\uC5D0\uB9AC\uC2A4\uB9AC\uD1A8" }, AMT_NUM55: { label: "\uC720\uB2F9(g)", unit: "g", name: "\uC720\uB2F9" }, AMT_NUM56: { label: "\uC790\uB2F9(g)", unit: "g", name: "\uC790\uB2F9" }, AMT_NUM57: { label: "\uD0C0\uAC00\uD1A0\uC2A4(g)", unit: "g", name: "\uD0C0\uAC00\uD1A0\uC2A4" }, AMT_NUM58: { label: "\uD3EC\uB3C4\uB2F9(g)", unit: "g", name: "\uD3EC\uB3C4\uB2F9" }, AMT_NUM59: { label: "\uBD88\uD3EC\uD654\uC9C0\uBC29(g)", unit: "g", name: "\uBD88\uD3EC\uD654\uC9C0\uBC29" }, AMT_NUM60: { label: "EPA + DHA(mg)", unit: "mg", name: "EPA + DHA" }, AMT_NUM61: { label: "\uAC00\uB3CC\uB808\uC0B0(20:1 n-11) / \uC5D0\uC774\uCF54\uC13C\uC0B0(20:1 n-9)(mg)", unit: "mg", name: "\uAC00\uB3CC\uB808\uC0B0/\uC5D0\uC774\uCF54\uC13C\uC0B0" }, AMT_NUM62: { label: "\uAC00\uB3CC\uB808\uC0B0(20:1)(g)", unit: "g", name: "\uAC00\uB3CC\uB808\uC0B0" }, AMT_NUM63: { label: "\uAC10\uB9C8 \uB9AC\uB180\uB80C\uC0B0(18:3 n-6)(mg)", unit: "mg", name: "\uAC10\uB9C8 \uB9AC\uB180\uB80C\uC0B0" }, AMT_NUM64: { label: "\uAC10\uB9C8 \uB9AC\uB180\uB80C\uC0B0(18:3(n-6))(g)", unit: "g", name: "\uAC10\uB9C8 \uB9AC\uB180\uB80C\uC0B0" }, AMT_NUM65: { label: "\uB124\uB974\uBCF8\uC0B0(24:1)(mg)", unit: "mg", name: "\uB124\uB974\uBCF8\uC0B0" }, AMT_NUM66: { label: "\uB3C4\uCF54\uC0AC\uB514\uC5D0\uB178\uC0B0(22:2)(mg)", unit: "mg", name: "\uB3C4\uCF54\uC0AC\uB514\uC5D0\uB178\uC0B0" }, AMT_NUM67: { label: "\uB3C4\uCF54\uC0AC\uD39C\uD0C0\uC5D0\uB178\uC0B0(22:5(n-3))(g)", unit: "g", name: "\uB3C4\uCF54\uC0AC\uD39C\uD0C0\uC5D0\uB178\uC0B0" }, AMT_NUM68: { label: "\uB3C4\uCF54\uC0AC\uD39C\uD0C0\uC5D0\uB178\uC0B0(DPA, 22:5 n-3)(mg)", unit: "mg", name: "\uB3C4\uCF54\uC0AC\uD39C\uD0C0\uC5D0\uB178\uC0B0(DPA)" }, AMT_NUM69: { label: "\uB3C4\uCF54\uC0AC\uD5E5\uC0AC\uC5D0\uB178\uC0B0(22:6(n-3))(g)", unit: "g", name: "\uB3C4\uCF54\uC0AC\uD5E5\uC0AC\uC5D0\uB178\uC0B0" }, AMT_NUM70: { label: "\uB3C4\uCF54\uC0AC\uD5E5\uC0AC\uC5D0\uB178\uC0B0(DHA, 22:6 n-3)(mg)", unit: "mg", name: "\uB3C4\uCF54\uC0AC\uD5E5\uC0AC\uC5D0\uB178\uC0B0(DHA)" }, AMT_NUM71: { label: "\uB514\uD638\uBAA8\uB9AC\uB180\uB80C\uC0B0(20:3 n-3)(mg)", unit: "mg", name: "\uB514\uD638\uBAA8\uB9AC\uB180\uB80C\uC0B0" }, AMT_NUM72: { label: "\uB77C\uC6B0\uB974\uC0B0(12:0)(g)", unit: "g", name: "\uB77C\uC6B0\uB974\uC0B0" }, AMT_NUM73: { label: "\uB77C\uC6B0\uB974\uC0B0(12:0)(mg)", unit: "mg", name: "\uB77C\uC6B0\uB974\uC0B0" }, AMT_NUM74: { label: "\uB9AC\uADF8\uB178\uC138\uB974\uC0B0(24:0)(mg)", unit: "mg", name: "\uB9AC\uADF8\uB178\uC138\uB974\uC0B0" }, AMT_NUM75: { label: "\uB9AC\uB180\uB808\uC0B0(18:2 n-6)(g)", unit: "g", name: "\uB9AC\uB180\uB808\uC0B0" }, AMT_NUM76: { label: "\uBBF8\uB9AC\uC2A4\uD1A8\uB808\uC0B0(14:1)(g)", unit: "g", name: "\uBBF8\uB9AC\uC2A4\uD1A8\uB808\uC0B0" }, AMT_NUM77: { label: "\uBBF8\uB9AC\uC2A4\uD1A8\uB808\uC0B0(14:1)(mg)", unit: "mg", name: "\uBBF8\uB9AC\uC2A4\uD1A8\uB808\uC0B0" }, AMT_NUM78: { label: "\uBBF8\uB9AC\uC2A4\uD2B8\uC0B0(14:0)(g)", unit: "g", name: "\uBBF8\uB9AC\uC2A4\uD2B8\uC0B0" }, AMT_NUM79: { label: "\uBBF8\uB9AC\uC2A4\uD2B8\uC0B0(14:0)(mg)", unit: "mg", name: "\uBBF8\uB9AC\uC2A4\uD2B8\uC0B0" }, AMT_NUM80: { label: "\uBC15\uC13C\uC0B0(18:1 n-7)(mg)", unit: "mg", name: "\uBC15\uC13C\uC0B0" }, AMT_NUM81: { label: "\uBC15\uC13C\uC0B0(18:1(n-7))(g)", unit: "g", name: "\uBC15\uC13C\uC0B0" }, AMT_NUM82: { label: "\uBCA0\uD5E8\uC0B0(22:0)(mg)", unit: "mg", name: "\uBCA0\uD5E8\uC0B0" }, AMT_NUM83: { label: "\uBD80\uD2F0\uB974\uC0B0(4:0)(g)", unit: "g", name: "\uBD80\uD2F0\uB974\uC0B0" }, AMT_NUM84: { label: "\uBD80\uD2F0\uB974\uC0B0(4:0)(mg)", unit: "mg", name: "\uBD80\uD2F0\uB974\uC0B0" }, AMT_NUM85: { label: "\uC2A4\uD14C\uC544\uB974\uC0B0(18:0)(g)", unit: "g", name: "\uC2A4\uD14C\uC544\uB974\uC0B0" }, AMT_NUM86: { label: "\uC2A4\uD14C\uC544\uB974\uC0B0(18:0)(mg)", unit: "mg", name: "\uC2A4\uD14C\uC544\uB974\uC0B0" }, AMT_NUM87: { label: "\uC2A4\uD14C\uC544\uB9AC\uB3C8\uC0B0(18:4 n-3)(mg)", unit: "mg", name: "\uC2A4\uD14C\uC544\uB9AC\uB3C8\uC0B0" }, AMT_NUM88: { label: "\uC544\uB77C\uD0A4\uB3C8\uC0B0(20:4 n-6)(mg)", unit: "mg", name: "\uC544\uB77C\uD0A4\uB3C8\uC0B0" }, AMT_NUM89: { label: "\uC544\uB77C\uD0A4\uB3C8\uC0B0(20:4(n-6))(g)", unit: "g", name: "\uC544\uB77C\uD0A4\uB3C8\uC0B0" }, AMT_NUM90: { label: "\uC544\uB77C\uD0A4\uB4DC\uC0B0(20:0)(g)", unit: "g", name: "\uC544\uB77C\uD0A4\uB4DC\uC0B0" }, AMT_NUM91: { label: "\uC544\uB77C\uD0A4\uB4DC\uC0B0(20:0)(mg)", unit: "mg", name: "\uC544\uB77C\uD0A4\uB4DC\uC0B0" }, AMT_NUM92: { label: "\uC54C\uD30C \uB9AC\uB180\uB80C\uC0B0(18:3(n-3))(g)", unit: "g", name: "\uC54C\uD30C \uB9AC\uB180\uB80C\uC0B0" }, AMT_NUM93: { label: "\uC5D0\uB8E8\uD06C\uC0B0(22:1)(mg)", unit: "mg", name: "\uC5D0\uB8E8\uD06C\uC0B0" }, AMT_NUM94: { label: "\uC5D0\uC774\uCF54\uC0AC\uB514\uC5D0\uB178\uC0B0(20:2 n-6)(mg)", unit: "mg", name: "\uC5D0\uC774\uCF54\uC0AC\uB514\uC5D0\uB178\uC0B0" }, AMT_NUM95: { label: "\uC5D0\uC774\uCF54\uC0AC\uB514\uC5D0\uB178\uC0B0(20:2(n-6))(g)", unit: "g", name: "\uC5D0\uC774\uCF54\uC0AC\uB514\uC5D0\uB178\uC0B0" }, AMT_NUM96: { label: "\uC5D0\uC774\uCF54\uC0AC\uD2B8\uB9AC\uC5D0\uB178\uC0B0(20:3 n-6)(mg)", unit: "mg", name: "\uC5D0\uC774\uCF54\uC0AC\uD2B8\uB9AC\uC5D0\uB178\uC0B0" }, AMT_NUM97: { label: "\uC5D0\uC774\uCF54\uC0AC\uD2B8\uB9AC\uC5D0\uB178\uC0B0(20:3(n-6))(g)", unit: "g", name: "\uC5D0\uC774\uCF54\uC0AC\uD2B8\uB9AC\uC5D0\uB178\uC0B0" }, AMT_NUM98: { label: "\uC5D0\uC774\uCF54\uC0AC\uD39C\uD0C0\uC5D0\uB178\uC0B0(20:5(n-3))(g)", unit: "g", name: "\uC5D0\uC774\uCF54\uC0AC\uD39C\uD0C0\uC5D0\uB178\uC0B0" }, AMT_NUM99: { label: "\uC5D0\uC774\uCF54\uC0AC\uD39C\uD0C0\uC5D0\uB178\uC0B0(EPA, 20:5 n-3)(mg)", unit: "mg", name: "EPA" }, AMT_NUM100: { label: "\uC624\uBA54\uAC003 \uC9C0\uBC29\uC0B0(g)", unit: "g", name: "\uC624\uBA54\uAC003 \uC9C0\uBC29\uC0B0" }, AMT_NUM101: { label: "\uC624\uBA54\uAC006 \uC9C0\uBC29\uC0B0(g)", unit: "g", name: "\uC624\uBA54\uAC006 \uC9C0\uBC29\uC0B0" }, AMT_NUM102: { label: "\uC62C\uB808\uC0B0(18:1 n-9)(mg)", unit: "mg", name: "\uC62C\uB808\uC0B0" }, AMT_NUM103: { label: "\uC62C\uB808\uC0B0(18:1(n-9))(g)", unit: "g", name: "\uC62C\uB808\uC0B0" }, AMT_NUM104: { label: "\uCE74\uD504\uB85C\uC0B0(6:0)(g)", unit: "g", name: "\uCE74\uD504\uB85C\uC0B0" }, AMT_NUM105: { label: "\uCE74\uD504\uB85C\uC0B0(6:0)(mg)", unit: "mg", name: "\uCE74\uD504\uB85C\uC0B0" }, AMT_NUM106: { label: "\uCE74\uD504\uB974\uC0B0(10:0)(g)", unit: "g", name: "\uCE74\uD504\uB974\uC0B0" }, AMT_NUM107: { label: "\uCE74\uD504\uB974\uC0B0(10:0)(mg)", unit: "mg", name: "\uCE74\uD504\uB974\uC0B0" }, AMT_NUM108: { label: "\uCE74\uD504\uB9B4\uC0B0(8:0)(g)", unit: "g", name: "\uCE74\uD504\uB9B4\uC0B0" }, AMT_NUM109: { label: "\uCE74\uD504\uB9B4\uC0B0(8:0)(mg)", unit: "mg", name: "\uCE74\uD504\uB9B4\uC0B0" }, AMT_NUM110: { label: "\uD2B8\uB77C\uC774\uB370\uCE78\uC0B0(13:0)(mg)", unit: "mg", name: "\uD2B8\uB77C\uC774\uB370\uCE78\uC0B0" }, AMT_NUM111: { label: "\uD2B8\uB79C\uC2A4 \uB9AC\uB180\uB808\uC0B0(18:2t)(g)", unit: "g", name: "\uD2B8\uB79C\uC2A4 \uB9AC\uB180\uB808\uC0B0" }, AMT_NUM112: { label: "\uD2B8\uB79C\uC2A4 \uB9AC\uB180\uB808\uC0B0(18:2t)(mg)", unit: "mg", name: "\uD2B8\uB79C\uC2A4 \uB9AC\uB180\uB808\uC0B0" }, AMT_NUM113: { label: "\uD2B8\uB79C\uC2A4 \uB9AC\uB180\uB80C\uC0B0(18:3t)(g)", unit: "g", name: "\uD2B8\uB79C\uC2A4 \uB9AC\uB180\uB80C\uC0B0" }, AMT_NUM114: { label: "\uD2B8\uB79C\uC2A4 \uB9AC\uB180\uB80C\uC0B0(18:3t)(mg)", unit: "mg", name: "\uD2B8\uB79C\uC2A4 \uB9AC\uB180\uB80C\uC0B0" }, AMT_NUM115: { label: "\uCE74\uD398\uC778(mg)", unit: "mg", name: "\uCE74\uD398\uC778" }, AMT_NUM116: { label: "\uD2B8\uB79C\uC2A4 \uC62C\uB808\uC0B0(18:1 trans n-9)(mg)", unit: "mg", name: "\uD2B8\uB79C\uC2A4 \uC62C\uB808\uC0B0" }, AMT_NUM117: { label: "\uD2B8\uB79C\uC2A4 \uC62C\uB808\uC0B0(18:1(n-9)t)(g)", unit: "g", name: "\uD2B8\uB79C\uC2A4 \uC62C\uB808\uC0B0" }, AMT_NUM118: { label: "\uD2B8\uB9AC\uCF54\uC0B0\uC0B0(23:0)(mg)", unit: "mg", name: "\uD2B8\uB9AC\uCF54\uC0B0\uC0B0" }, AMT_NUM119: { label: "\uD314\uBBF8\uD1A8\uB808\uC0B0(16:1)(g)", unit: "g", name: "\uD314\uBBF8\uD1A8\uB808\uC0B0" }, AMT_NUM120: { label: "\uD314\uBBF8\uD1A8\uB808\uC0B0(16:1)(mg)", unit: "mg", name: "\uD314\uBBF8\uD1A8\uB808\uC0B0" }, AMT_NUM121: { label: "\uD314\uBBF8\uD2B8\uC0B0(16:0)(g)", unit: "g", name: "\uD314\uBBF8\uD2B8\uC0B0" }, AMT_NUM122: { label: "\uD314\uBBF8\uD2B8\uC0B0(16:0)(mg)", unit: "mg", name: "\uD314\uBBF8\uD2B8\uC0B0" }, AMT_NUM123: { label: "\uD39C\uD0C0\uB370\uCE78\uC0B0(15:0)(mg)", unit: "mg", name: "\uD39C\uD0C0\uB370\uCE78\uC0B0" }, AMT_NUM124: { label: "\uD5E8\uC5D0\uC774\uCF54\uC0B0\uC0B0(21:0)(mg)", unit: "mg", name: "\uD5E8\uC5D0\uC774\uCF54\uC0B0\uC0B0" }, AMT_NUM125: { label: "\uD5F5\uD0C0\uB370\uC13C\uC0B0(17:1)(mg)", unit: "mg", name: "\uD5F5\uD0C0\uB370\uC13C\uC0B0" }, AMT_NUM126: { label: "\uD5F5\uD0C0\uB370\uCE78\uC0B0(17:0)(mg)", unit: "mg", name: "\uD5F5\uD0C0\uB370\uCE78\uC0B0" }, AMT_NUM127: { label: "\uAD6C\uB9AC(mg)", unit: "mg", name: "\uAD6C\uB9AC" }, AMT_NUM128: { label: "\uAD6C\uB9AC(\u03BCg)", unit: "\u03BCg", name: "\uAD6C\uB9AC" }, AMT_NUM129: { label: "\uB9C8\uADF8\uB124\uC298(mg)", unit: "mg", name: "\uB9C8\uADF8\uB124\uC298" }, AMT_NUM130: { label: "\uB9DD\uAC04(mg)", unit: "mg", name: "\uB9DD\uAC04" }, AMT_NUM131: { label: "\uBAB0\uB9AC\uBE0C\uB374(\u03BCg)", unit: "\u03BCg", name: "\uBAB0\uB9AC\uBE0C\uB374" }, AMT_NUM132: { label: "\uBD88\uC18C(mg)", unit: "mg", name: "\uBD88\uC18C" }, AMT_NUM133: { label: "\uC140\uB808\uB284(\u03BCg)", unit: "\u03BCg", name: "\uC140\uB808\uB284" }, AMT_NUM134: { label: "\uC544\uC5F0(mg)", unit: "mg", name: "\uC544\uC5F0" }, AMT_NUM135: { label: "\uC5FC\uC18C(mg)", unit: "mg", name: "\uC5FC\uC18C" }, AMT_NUM136: { label: "\uC694\uC624\uB4DC(\u03BCg)", unit: "\u03BCg", name: "\uC694\uC624\uB4DC" }, AMT_NUM137: { label: "\uD06C\uB86C(\u03BCg)", unit: "\u03BCg", name: "\uD06C\uB86C" }, AMT_NUM138: { label: "\uC544\uBBF8\uB178\uC0B0(mg)", unit: "mg", name: "\uC544\uBBF8\uB178\uC0B0" }, AMT_NUM139: { label: "\uD544\uC218\uC544\uBBF8\uB178\uC0B0(mg)", unit: "mg", name: "\uD544\uC218\uC544\uBBF8\uB178\uC0B0" }, AMT_NUM140: { label: "\uBE44\uD544\uC218\uC544\uBBF8\uB178\uC0B0(mg)", unit: "mg", name: "\uBE44\uD544\uC218\uC544\uBBF8\uB178\uC0B0" }, AMT_NUM141: { label: "\uAE00\uB8E8\uD0D0\uC0B0(mg)", unit: "mg", name: "\uAE00\uB8E8\uD0D0\uC0B0" }, AMT_NUM142: { label: "\uAE00\uB9AC\uC2E0(mg)", unit: "mg", name: "\uAE00\uB9AC\uC2E0" }, AMT_NUM143: { label: "\uB77C\uC774\uC2E0(mg)", unit: "mg", name: "\uB77C\uC774\uC2E0" }, AMT_NUM144: { label: "\uB958\uC2E0 / \uB8E8\uC2E0(mg)", unit: "mg", name: "\uB958\uC2E0/\uB8E8\uC2E0" }, AMT_NUM145: { label: "\uBA54\uD2F0\uC624\uB2CC(mg)", unit: "mg", name: "\uBA54\uD2F0\uC624\uB2CC" }, AMT_NUM146: { label: "\uBC1C\uB9B0(mg)", unit: "mg", name: "\uBC1C\uB9B0" }, AMT_NUM147: { label: "\uC138\uB9B0(mg)", unit: "mg", name: "\uC138\uB9B0" }, AMT_NUM148: { label: "\uC2DC\uC2A4\uD14C\uC778(mg)", unit: "mg", name: "\uC2DC\uC2A4\uD14C\uC778" }, AMT_NUM149: { label: "\uC544\uB974\uAE30\uB2CC(mg)", unit: "mg", name: "\uC544\uB974\uAE30\uB2CC" }, AMT_NUM150: { label: "\uC544\uC2A4\uD30C\uB974\uD2B8\uC0B0(mg)", unit: "mg", name: "\uC544\uC2A4\uD30C\uB974\uD2B8\uC0B0" }, AMT_NUM151: { label: "\uC54C\uB77C\uB2CC(mg)", unit: "mg", name: "\uC54C\uB77C\uB2CC" }, AMT_NUM152: { label: "\uC774\uC18C\uB958\uC2E0 / \uC774\uC18C\uB8E8\uC2E0(mg)", unit: "mg", name: "\uC774\uC18C\uB958\uC2E0/\uC774\uC18C\uB8E8\uC2E0" }, AMT_NUM153: { label: "\uD0C0\uC6B0\uB9B0(mg)", unit: "mg", name: "\uD0C0\uC6B0\uB9B0" }, AMT_NUM154: { label: "\uD2B8\uB808\uC624\uB2CC(mg)", unit: "mg", name: "\uD2B8\uB808\uC624\uB2CC" }, AMT_NUM155: { label: "\uD2B8\uB9BD\uD1A0\uD310(mg)", unit: "mg", name: "\uD2B8\uB9BD\uD1A0\uD310" }, AMT_NUM156: { label: "\uD2F0\uB85C\uC2E0(mg)", unit: "mg", name: "\uD2F0\uB85C\uC2E0" }, AMT_NUM157: { label: "\uD398\uB2D0\uC54C\uB77C\uB2CC(mg)", unit: "mg", name: "\uD398\uB2D0\uC54C\uB77C\uB2CC" }, AMT_NUM158: { label: "\uD504\uB864\uB9B0(mg)", unit: "mg", name: "\uD504\uB864\uB9B0" }, AMT_NUM159: { label: "\uD788\uC2A4\uD2F0\uB518(mg)", unit: "mg", name: "\uD788\uC2A4\uD2F0\uB518" } }); // src/external/mfds/mapper.ts var KEY_NAME_PREFIX_NUTRITION_COMPONENT = "AMT_NUM"; var toNutritionComponent = (apiResponseBodyArrayItem) => { const amtNumDataList = []; Object.keys(apiResponseBodyArrayItem).filter((each) => each.indexOf(KEY_NAME_PREFIX_NUTRITION_COMPONENT) === 0).forEach((key) => { if (apiResponseBodyArrayItem[key] !== "") { amtNumDataList.push({ key: key.trim(), value: parseFloat(apiResponseBodyArrayItem[key]) }); } }); return amtNumDataList.map( (elem) => new NutritionComponent({ name: AmtNumDataType[elem.key].name, label: AmtNumDataType[elem.key].label, value: elem.value, unit: AmtNumDataType[elem.key].unit }) ); }; function toFoodNutrition(apiResponseBodyArrayItem) { return new FoodNutrition({ num: apiResponseBodyArrayItem.NUM, foodCode: apiResponseBodyArrayItem.FOOD_CD, foodNameKr: apiResponseBodyArrayItem.FOOD_NM_KR, dbGroupCode: apiResponseBodyArrayItem.DB_GRP_CM, dbGroupName: apiResponseBodyArrayItem.DB_GRP_NM, foodOriginCode: apiResponseBodyArrayItem.FOOD_OR_CD, foodOriginName: apiResponseBodyArrayItem.FOOD_OR_NM, foodCategory1Code: apiResponseBodyArrayItem.FOOD_CAT1_CD, foodCategory1Name: apiResponseBodyArrayItem.FOOD_CAT1_NM, foodRepresentCode: apiResponseBodyArrayItem.FOOD_REF_CD, foodRepresentName: apiResponseBodyArrayItem.FOOD_REF_NM, foodCategory2Code: apiResponseBodyArrayItem.FOOD_CAT2_CD, foodCategory2Name: apiResponseBodyArrayItem.FOOD_CAT2_NM, foodCategory3Code: apiResponseBodyArrayItem.FOOD_CAT3_CD, foodCategory3Name: apiResponseBodyArrayItem.FOOD_CAT3_NM, foodCategory4Code: apiResponseBodyArrayItem.FOOD_CAT4_CD, foodCategory4Name: apiResponseBodyArrayItem.FOOD_CAT4_NM, servingSize: apiResponseBodyArrayItem.SERVING_SIZE, subReferenceCode: apiResponseBodyArrayItem.SUB_REF_CM, subReferenceName: apiResponseBodyArrayItem.SUB_REF_NAME, nutritionalAmountPerServing: apiResponseBodyArrayItem.NUTRI_AMOUNT_SERVING, foodWeight: apiResponseBodyArrayItem.Z10500, itemReportNum: apiResponseBodyArrayItem.ITEM_REPORT_NO, makerName: apiResponseBodyArrayItem.MAKER_NM, importManufacturerName: apiResponseBodyArrayItem.IMP_MANUFAC_NM, sellerManufacturerName: apiResponseBodyArrayItem.SELLER_MANUFAC_NM, importYesOrNo: apiResponseBodyArrayItem.IMP_YN, nationCode: apiResponseBodyArrayItem.NATION_CM, nationName: apiResponseBodyArrayItem.NATION_NM, creationMethodCode: apiResponseBodyArrayItem.CRT_MTH_CD, creationMethodName: apiResponseBodyArrayItem.CRT_MTH_NM, researchDate: apiResponseBodyArrayItem.RESEARCH_YMD, updateDate: apiResponseBodyArrayItem.UPDATE_DATE, nutritionComponents: toNutritionComponent(apiResponseBodyArrayItem) }); } function toAmtCodeTypeResponse(amtNumDataType) { const amtCodeTypeItems = Object.keys(amtNumDataType).map((code) => { return new AmtCodeTypeItem({ code, label: amtNumDataType[code].label, name: amtNumDataType[code].name, unit: amtNumDataType[code].unit }); }); return new AmtCodeTypeResponse(amtCodeTypeItems); } // src/external/mfds/dtos/SearchFoodNutritionRequest.ts var SearchFoodNutritionRequest = class { constructor({ foodNameKr = "", researchYearMonthDate = "", makerName = "", pageNo = 1, numOfRows = 10, type = "json", foodCategory1Name = "", itemReportNo = "", updateDate = "", dbClassName = "" }) { this.foodNameKr = foodNameKr; this.researchYearMonthDate = researchYearMonthDate; this.makerName = makerName; this.pageNo = pageNo; this.numOfRows = numOfRows; this.type = type; this.foodCategory1Name = foodCategory1Name; this.itemReportNo = itemReportNo; this.updateDate = updateDate; this.dbClassName = dbClassName; } validate() { return !!(this.foodNameKr || this.makerName || this.foodCategory1Name || this.itemReportNo); } }; // src/external/mfds/dtos/SeachFoodNutritionResponse.ts var SeachFoodNutritionResponse = class { constructor({ data, paging }) { this.data = data; this.paging = paging; } }; // src/external/mfds/service.ts async function searchFoodNutritionInfo(searchFoodNutritionRequest) { if (!(searchFoodNutritionRequest instanceof SearchFoodNutritionRequest)) { throw new Error("\uC694\uCCAD\uC778\uC790 \uD615\uC2DD\uC5D0 \uB9DE\uC9C0 \uC54A\uC74C"); } const body = await getFoodNutritionComponentDatabaseInquery( searchFoodNutritionRequest.foodNameKr, searchFoodNutritionRequest.researchYearMonthDate, searchFoodNutritionRequest.makerName, searchFoodNutritionRequest.pageNo, searchFoodNutritionRequest.numOfRows, searchFoodNutritionRequest.type, searchFoodNutritionRequest.foodCategory1Name, searchFoodNutritionRequest.itemReportNo, searchFoodNutritionRequest.updateDate, searchFoodNutritionRequest.dbClassName ); const foodNutritions = extractItemArrayOrDefualtEmptyArrayFromBody(body).map((each) => toFoodNutrition(each)); const paging = extractPagingInfoOrDefaultEmptyObjectFromBody(body); return new SeachFoodNutritionResponse({ data: foodNutritions, paging }); } function getNutritionComponentTypes() { return toAmtCodeTypeResponse(AmtNumDataType); } // src/tools/foodSearch.ts var foodSearchTool = { name: "searchFoodNutrition", description: "\uC2DD\uD488\uC758\uC57D\uD488\uC548\uC804\uCC98 \uC2DD\uD488\uC601\uC591\uC131\uBD84DB\uC5D0\uC11C \uC2DD\uD488 \uC815\uBCF4\uB97C \uAC80\uC0C9\uD569\uB2C8\uB2E4. \uC2DD\uD488\uBA85, \uC81C\uC870\uC0AC, \uCE74\uD14C\uACE0\uB9AC \uB4F1\uC744 \uAE30\uC900\uC73C\uB85C \uAC80\uC0C9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.", inputSchema: { foodNameKr: z.string().optional().describe('\uAC80\uC0C9\uD560 \uC2DD\uD488\uBA85 (\uC608: "\uC0AC\uACFC", "\uAE40\uCE58")'), makerName: z.string().optional().describe('\uC81C\uC870\uC0AC\uBA85 (\uC608: "\uB18D\uC2EC", "\uB86F\uB370")'), foodCategory1Name: z.string().optional().describe('\uC2DD\uD488 \uB300\uBD84\uB958\uBA85 (\uC608: "\uACE1\uB958", "\uCC44\uC18C\uB958", "\uC721\uB958")'), itemReportNo: z.string().optional().describe("\uD488\uBAA9\uC81C\uC870\uBCF4\uACE0\uBC88\uD638"), researchYearMonthDate: z.string().optional().describe("\uB370\uC774\uD130 \uC0DD\uC131\uC77C\uC790 (YYYYMMDD \uD615\uC2DD)"), pageNo: z.number().optional().describe("\uD398\uC774\uC9C0 \uBC88\uD638 (\uAE30\uBCF8\uAC12: 1)"), numOfRows: z.number().optional().describe("\uD55C \uD398\uC774\uC9C0 \uACB0\uACFC\uC218 (\uAE30\uBCF8\uAC12: 10, \uCD5C\uB300: 100)"), updateDate: z.string().optional().describe("\uB370\uC774\uD130 \uC218\uC815\uC77C\uC790 (YYYYMMDD \uD615\uC2DD)"), dbClassName: z.string().optional().describe("\uD488\uBAA9\uB300\uD45C/\uC0C1\uC6A9\uC81C\uD488 \uAD6C\uBD84") }, handler: async (params) => { try { console.error("[foodSearchTool.handler()] called with params:", params); const hasSearchCriteria = params.foodNameKr || params.makerName || params.foodCategory1Name || params.itemReportNo; if (!hasSearchCriteria) { return { content: [{ type: "text", text: "\uAC80\uC0C9 \uC870\uAC74\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. \uC2DD\uD488\uBA85(foodNameKr), \uC81C\uC870\uC0AC\uBA85(makerName), \uC2DD\uD488\uB300\uBD84\uB958\uBA85(foodCategory1Name), \uB610\uB294 \uD488\uBAA9\uC81C\uC870\uBCF4\uACE0\uBC88\uD638(itemReportNo) \uC911 \uD558\uB098 \uC774\uC0C1\uC744 \uC785\uB825\uD574\uC8FC\uC138\uC694." }] }; } const request = new SearchFoodNutritionRequest({ foodNameKr: params.foodNameKr || "", makerName: params.makerName || "", foodCategory1Name: params.foodCategory1Name || "", itemReportNo: params.itemReportNo || "", researchYearMonthDate: params.researchYearMonthDate || "", pageNo: params.pageNo || 1, numOfRows: params.numOfRows || 10, type: params.type || "json", updateDate: params.updateDate || "", dbClassName: params.dbClassName || "" }); const response = await searchFoodNutritionInfo(request); if (response.data.length === 0) { return { content: [{ type: "text", text: "\uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uAC80\uC0C9 \uC870\uAC74\uC744 \uBCC0\uACBD\uD574\uBCF4\uC138\uC694." }] }; } const resultText = response.data.map((food, index) => { const nutritionInfo = food.nutritionComponents.map( (comp) => `${comp.name}: ${comp.value}${comp.unit}` ).join(", "); return `${index + 1}. ${food.foodNameKr} - \uC81C\uC870\uC0AC: ${food.makerName} - \uCE74\uD14C\uACE0\uB9AC: ${food.foodCategory1Name} > ${food.foodCategory2Name} > ${food.foodCategory3Name} - 1\uD68C \uC12D\uCDE8\uB7C9: ${food.servingSize} - \uC601\uC591\uC131\uBD84: ${nutritionInfo} - \uD488\uBAA9\uC81C\uC870\uBCF4\uACE0\uBC88\uD638: ${food.itemReportNum} - \uB370\uC774\uD130\uC0DD\uC131\uC77C: ${food.researchDate}`; }).join("\n\n"); const pagingInfo = response.paging; const summary = ` \uCD1D ${pagingInfo.totalCount}\uAC1C \uC911 ${response.data.length}\uAC1C \uACB0\uACFC (\uD398\uC774\uC9C0 ${pagingInfo.pageNo}/${Math.ceil(parseInt(pagingInfo.totalCount) / pagingInfo.numOfRows)})`; return { content: [{ type: "text", text: resultText + summary }] }; } catch (error) { return { content: [{ type: "text", text: `\uAC80\uC0C9 \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4: ${error instanceof Error ? error.message : "\uC54C \uC218 \uC5C6\uB294 \uC624\uB958"}` }] }; } } }; // src/tools/nutritionInfo.ts var nutritionInfoTool = { name: "getNutritionComponentTypes", description: "\uC2DD\uD488\uC601\uC591\uC131\uBD84DB\uC5D0\uC11C \uC81C\uACF5\uD558\uB294 \uC601\uC591\uC131\uBD84 \uC720\uD615 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4.", inputSchema: {}, handler: async () => { try { const nutritionTypes = getNutritionComponentTypes(); const resultText = nutritionTypes.items.map( (type, index) => `${index + 1}. ${type.name} (${type.code})` ).join("\n"); return { content: [{ type: "text", text: `\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uC601\uC591\uC131\uBD84 \uC720\uD615: ${resultText}` }] }; } catch (error) { return { content: [{ type: "text", text: `\uC601\uC591\uC131\uBD84 \uC720\uD615 \uC870\uD68C \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4: ${error instanceof Error ? error.message : "\uC54C \uC218 \uC5C6\uB294 \uC624\uB958"}` }] }; } } }; // src/tools/index.ts var tools = { foodSearch: foodSearchTool, nutritionInfo: nutritionInfoTool }; // src/index.ts var server = new McpServer({ name: "k-mfds-fooddb-mcp-server", version: "1.0.0", title: "K-MFDS FoodDB MCP Server" }); Object.values(tools).forEach((tool) => { server.registerTool( tool.name, { title: tool.name, description: tool.description, inputSchema: tool.inputSchema }, tool.handler ); }); var transport = new StdioServerTransport(); await server.connect(transport);