get_legal_to_daily
Map Korean legal terms to everyday expressions for accessible understanding of laws.
Instructions
[지식베이스] 법령용어→일상용어 매핑.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| legalTerm | Yes | 법령용어 (예: '임대차' → '월세', '전세') | |
| apiKey | No | 법제처 Open API 인증키(OC). 사용자가 제공한 경우 전달 |
Implementation Reference
- src/tools/knowledge-base.ts:241-277 (handler)Main handler function for get_legal_to_daily. Calls lawSearch.do API with target 'lstrmRel' and relType 'LD' to map legal terms to everyday terms, with fallback to term search if no results or API fails.
export async function getLegalToDaily( apiClient: LawApiClient, args: GetLegalToDailyInput ): Promise<{ content: Array<{ type: string; text: string }>; isError?: boolean }> { try { let xmlText: string; try { xmlText = await apiClient.fetchApi({ endpoint: "lawSearch.do", target: "lstrmRel", extraParams: { query: args.legalTerm, relType: "LD" }, apiKey: args.apiKey, }); } catch { return await fallbackTermSearch(apiClient, args.legalTerm, "법령용어"); } const result = parseKBXML(xmlText, "LsTrmRelSearch"); const items = result.data || []; if (items.length === 0) { return await fallbackTermSearch(apiClient, args.legalTerm, "법령용어"); } let output = `🔗 법령용어 → 일상용어 연계\n\n`; output += `📝 입력: ${args.legalTerm}\n\n`; output += `🗣️ 관련 일상용어:\n`; for (const item of items) { output += ` • ${item.일상용어명 || item.연계용어명}\n`; } return { content: [{ type: "text", text: output }] }; } catch (error) { return formatToolError(error, "get_legal_to_daily"); } } - src/tools/knowledge-base.ts:234-237 (schema)Zod schema for get_legal_to_daily input validation. Accepts legalTerm (string) and optional apiKey.
export const getLegalToDailySchema = z.object({ legalTerm: z.string().describe("법령용어 (예: '임대차' → '월세', '전세')"), apiKey: z.string().optional().describe("법제처 Open API 인증키(OC). 사용자가 제공한 경우 전달"), }); - src/tool-registry.ts:558-563 (registration)Tool registration entry mapping the name 'get_legal_to_daily' to its schema and handler function.
{ name: "get_legal_to_daily", description: "[지식베이스] 법령용어→일상용어 매핑.", schema: getLegalToDailySchema, handler: getLegalToDaily }, - src/tools/kb-utils.ts:34-77 (helper)XML parser used by getLegalToDaily to parse the API response. Extracts items like 일상용어명 from KB XML.
export function parseKBXML(xml: string, _rootTag: string): KBParseResult { const result: KBParseResult = { totalCnt: "0", data: [] } // totalCnt 추출 const totalCntMatch = xml.match(/<totalCnt>(\d+)<\/totalCnt>/i) || xml.match(/<검색결과개수>(\d+)<\/검색결과개수>/i) result.totalCnt = totalCntMatch ? totalCntMatch[1] : "0" // 아이템 추출 (다양한 태그명 지원) const itemTags = ["lstrm", "lstrmAI", "law", "jo", "rel", "item"] for (const itemTag of itemTags) { const itemRegex = new RegExp(`<${itemTag}[^>]*>([\\s\\S]*?)<\\/${itemTag}>`, "gi") const matches = xml.matchAll(itemRegex) for (const match of matches) { const itemContent = match[1] const item: KBItem = {} // 공통 필드 추출 item.법령용어명 = extractTag(itemContent, "법령용어명") || extractTag(itemContent, "용어명") item.법령용어ID = extractTag(itemContent, "법령용어ID") || extractTag(itemContent, "용어ID") item.동음이의어 = extractTag(itemContent, "동음이의어존재여부") === "Y" item.용어간관계링크 = extractTag(itemContent, "용어간관계링크") || extractTag(itemContent, "용어관계") item.조문간관계링크 = extractTag(itemContent, "조문간관계링크") || extractTag(itemContent, "조문관계") item.법령명 = extractTag(itemContent, "법령명") item.법령ID = extractTag(itemContent, "법령ID") || extractTag(itemContent, "법령일련번호") item.조문번호 = extractTag(itemContent, "조문번호") || extractTag(itemContent, "조번호") item.조문제목 = extractTag(itemContent, "조문제목") item.관계유형 = extractTag(itemContent, "관계유형") || extractTag(itemContent, "연계유형") item.법령종류 = extractTag(itemContent, "법령종류") || extractTag(itemContent, "법종류") item.연계용어명 = extractTag(itemContent, "연계용어명") || extractTag(itemContent, "관련용어") item.일상용어명 = extractTag(itemContent, "일상용어명") || extractTag(itemContent, "일상용어") // 빈 객체가 아닌 경우만 추가 if (item.법령용어명 || item.법령명 || item.연계용어명) { result.data.push(item) } } if (result.data.length > 0) break } return result } - src/tools/kb-utils.ts:82-121 (helper)Fallback search function used when the primary legal-to-daily API call fails or returns empty results.
export async function fallbackTermSearch( apiClient: Pick<import("../lib/api-client.js").LawApiClient, "fetchApi">, term: string, termType: string ): Promise<{ content: Array<{ type: string; text: string }>; isError?: boolean }> { try { const xmlText = await apiClient.fetchApi({ endpoint: "lawSearch.do", target: "lstrm", extraParams: { query: term, display: "10" }, }) const result = parseKBXML(xmlText, "LsTrmSearch") const items = result.data || [] if (items.length === 0) { return { content: [{ type: "text", text: `'${term}' ${termType} 연계 정보를 찾을 수 없습니다.`, }], isError: true, } } let output = `📚 '${term}' 관련 용어 (폴백 검색):\n\n` for (const item of items) { if (item.법령용어명) { output += ` • ${item.법령용어명}\n` } } return { content: [{ type: "text", text: output }] } } catch { return { content: [{ type: "text", text: `'${term}' ${termType} 연계 정보를 찾을 수 없습니다.\n\n💡 search_legal_terms(query="${term}")로 기본 검색을 시도해보세요.`, }], isError: true,