k-mfds-fooddb-mcp-server
Version:
식품의약품안전처 식품영양성분DB를 MCP 도구로 제공합니다.
621 lines (601 loc) • 34.7 kB
JavaScript
#!/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);