<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Legal Tech on ICE-ICE-BEAR-BLOG</title><link>https://ice-ice-bear.github.io/tags/legal-tech/</link><description>Recent content in Legal Tech on ICE-ICE-BEAR-BLOG</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 12 May 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://ice-ice-bear.github.io/tags/legal-tech/index.xml" rel="self" type="application/rss+xml"/><item><title>Inside korean-law-mcp — folding 41 government APIs into 17 MCP tools</title><link>https://ice-ice-bear.github.io/posts/2026-05-12-korean-law-mcp/</link><pubDate>Tue, 12 May 2026 00:00:00 +0900</pubDate><guid>https://ice-ice-bear.github.io/posts/2026-05-12-korean-law-mcp/</guid><description>&lt;img src="https://ice-ice-bear.github.io/" alt="Featured image of post Inside korean-law-mcp — folding 41 government APIs into 17 MCP tools" /&gt;&lt;h2 id="overview"&gt;Overview
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/chrisryugj/korean-law-mcp" target="_blank" rel="noopener"
 &gt;korean-law-mcp&lt;/a&gt; is a &lt;a class="link" href="https://www.typescriptlang.org/" target="_blank" rel="noopener"
 &gt;TypeScript&lt;/a&gt; server that compresses 41 &lt;a class="link" href="https://open.law.go.kr/LSO/openApi/guideList.do" target="_blank" rel="noopener"
 &gt;Open APIs&lt;/a&gt; from Korea&amp;rsquo;s &lt;a class="link" href="https://www.law.go.kr" target="_blank" rel="noopener"
 &gt;Ministry of Government Legislation&lt;/a&gt; into 17 &lt;a class="link" href="https://modelcontextprotocol.io" target="_blank" rel="noopener"
 &gt;MCP&lt;/a&gt; tools. It is not a thin API wrapper — it ships citation verification that catches statute numbers an LLM invented, an impact-graph analysis that traces the ripple effect of a single article, and an automatic diff between two points in legislative time. Built by a civil servant who got tired of &amp;ldquo;searching the legislation portal manually for the hundredth time,&amp;rdquo; the project is an instructive case study of one MCP design principle: &lt;strong&gt;tool count is not feature count&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 User["AI assistant / CLI &amp;lt;br/&amp;gt; (Claude Desktop, Cursor, claude.ai)"]
 User --&gt; MCP["korean-law-mcp &amp;lt;br/&amp;gt; 17 MCP tools"]
 MCP --&gt; Chains["8 chain tools &amp;lt;br/&amp;gt; (+7 scenarios)"]
 MCP --&gt; Core["3 statute tools &amp;lt;br/&amp;gt; search/text/annexes"]
 MCP --&gt; Unified["2 unified search tools &amp;lt;br/&amp;gt; 17 ruling domains"]
 MCP --&gt; Killer["killer features &amp;lt;br/&amp;gt; verify/impact/time_travel/action"]
 Chains --&gt; API["41 government Open APIs"]
 Core --&gt; API
 Unified --&gt; API
 Killer --&gt; API
 API --&gt; Law["statutes, case law, admin rules &amp;lt;br/&amp;gt; local ordinances, treaties, interpretations"]&lt;/pre&gt;&lt;h2 id="why-the-project-had-to-exist"&gt;Why the project had to exist
&lt;/h2&gt;&lt;p&gt;South Korea has over 1,600 statutes in force, more than 10,000 &lt;a class="link" href="https://en.wikipedia.org/wiki/Administrative_law" target="_blank" rel="noopener"
 &gt;administrative rules&lt;/a&gt;, and a sprawling body of rulings spanning the &lt;a class="link" href="https://eng.scourt.go.kr/" target="_blank" rel="noopener"
 &gt;Supreme Court&lt;/a&gt;, the &lt;a class="link" href="https://english.ccourt.go.kr/" target="_blank" rel="noopener"
 &gt;Constitutional Court&lt;/a&gt;, the &lt;a class="link" href="https://www.tt.go.kr/" target="_blank" rel="noopener"
 &gt;Tax Tribunal&lt;/a&gt;, and the &lt;a class="link" href="https://www.customs.go.kr/" target="_blank" rel="noopener"
 &gt;Korea Customs Service&lt;/a&gt;. All of it lives on one portal, but for a developer trying to reach the data programmatically the experience is rough. The legislation portal&amp;rsquo;s &lt;a class="link" href="https://open.law.go.kr/LSO/openApi/guideList.do" target="_blank" rel="noopener"
 &gt;Open API&lt;/a&gt; exposes 41 endpoints behind a single free auth key (OC), but handling 41 endpoints is one problem and turning them into tools an LLM can use is a completely different one.&lt;/p&gt;
&lt;p&gt;The &lt;a class="link" href="https://modelcontextprotocol.io" target="_blank" rel="noopener"
 &gt;Model Context Protocol&lt;/a&gt; is an open standard &lt;a class="link" href="https://www.anthropic.com/news/model-context-protocol" target="_blank" rel="noopener"
 &gt;Anthropic&lt;/a&gt; released in November 2024 — a &amp;ldquo;USB-C port&amp;rdquo; that connects AI applications to external data and tools. &lt;a class="link" href="https://claude.com/download" target="_blank" rel="noopener"
 &gt;Claude Desktop&lt;/a&gt;, &lt;a class="link" href="https://cursor.com/docs/context/mcp" target="_blank" rel="noopener"
 &gt;Cursor&lt;/a&gt;, &lt;a class="link" href="https://code.visualstudio.com/docs/copilot/chat/mcp-servers" target="_blank" rel="noopener"
 &gt;Visual Studio Code&lt;/a&gt;, &lt;a class="link" href="https://zed.dev/" target="_blank" rel="noopener"
 &gt;Zed&lt;/a&gt;, and &lt;a class="link" href="https://modelcontextprotocol.io/clients" target="_blank" rel="noopener"
 &gt;many other clients&lt;/a&gt; can call MCP servers. korean-law-mcp layers an MCP server on top of the legislation APIs, turning a one-line natural-language question into a chain of calls across those 41 endpoints.&lt;/p&gt;
&lt;h2 id="from-89-tools-down-to-17--the-compression-idea"&gt;From 89 tools down to 17 — the compression idea
&lt;/h2&gt;&lt;p&gt;The project&amp;rsquo;s central design decision happened in the move from v2 to v3. v2 took the intuitive route — &lt;strong&gt;one tool per API&lt;/strong&gt; — so 41 APIs fanned out into 89 tools. The problem is the LLM&amp;rsquo;s point of view. An MCP client loads every tool&amp;rsquo;s &lt;a class="link" href="https://json-schema.org/" target="_blank" rel="noopener"
 &gt;JSON Schema&lt;/a&gt; into context at session start, and 89 schemas weighed in around 110 KB, &lt;strong&gt;burning half the context window on the tool list alone&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;v3&amp;rsquo;s reframe is a &lt;strong&gt;dispatch table plus domain enum&lt;/strong&gt; pattern: collapse tools that share a shape behind a single &lt;code&gt;domain&lt;/code&gt; parameter. Seventeen ruling domains — case law, the Constitutional Court, the Tax Tribunal, the Fair Trade Commission, labor commissions, and more — merged into just two tools, &lt;code&gt;search_decisions(domain)&lt;/code&gt; and &lt;code&gt;get_decision_text(domain)&lt;/code&gt;. The count dropped from 89 to 15 (now 17), and context cost fell from roughly 110 KB to 20 KB, an 82% cut. The notable part: &lt;strong&gt;not a single existing handler function was modified&lt;/strong&gt; — only a new dispatch layer went on top.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Government APIs&lt;/th&gt;
 &lt;th style="text-align: center"&gt;v2&lt;/th&gt;
 &lt;th style="text-align: center"&gt;v3&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;API / tool count&lt;/td&gt;
 &lt;td style="text-align: center"&gt;41&lt;/td&gt;
 &lt;td style="text-align: center"&gt;89&lt;/td&gt;
 &lt;td style="text-align: center"&gt;17&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;AI context cost&lt;/td&gt;
 &lt;td style="text-align: center"&gt;-&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~110 KB&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~20 KB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Feature coverage&lt;/td&gt;
 &lt;td style="text-align: center"&gt;-&lt;/td&gt;
 &lt;td style="text-align: center"&gt;100%&lt;/td&gt;
 &lt;td style="text-align: center"&gt;100%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The remaining specialist tools (legal terminology, annexes and forms, amendment histories) did not disappear. A &lt;code&gt;discover_tools&lt;/code&gt; → &lt;code&gt;execute_tool&lt;/code&gt; proxy pattern lets the LLM search and call them only when needed. That is the &lt;a class="link" href="https://modelcontextprotocol.io/docs/learn/architecture" target="_blank" rel="noopener"
 &gt;MCP tool-discovery&lt;/a&gt; pattern applied to the legal domain — keep the exposed surface small while holding feature coverage at 100%.&lt;/p&gt;
&lt;h2 id="anti-hallucination--verify_citations"&gt;Anti-hallucination — verify_citations
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;verify_citations&lt;/code&gt;, added in v3.5, is the most domain-native feature in the project. Legal answers generated by &lt;a class="link" href="https://chatgpt.com/" target="_blank" rel="noopener"
 &gt;ChatGPT&lt;/a&gt; or &lt;a class="link" href="https://claude.ai" target="_blank" rel="noopener"
 &gt;Claude&lt;/a&gt; easily mix in plausible-but-nonexistent statute numbers — the familiar &lt;a class="link" href="https://en.wikipedia.org/wiki/Hallucination_%28artificial_intelligence%29" target="_blank" rel="noopener"
 &gt;hallucination&lt;/a&gt; problem. &lt;code&gt;verify_citations&lt;/code&gt; extracts article citations from user text with a regex, looks back 30 characters to recover the statute name, then cross-checks against the official government database in parallel. Results sort into three buckets: ✓ (exists), ✗ (does not exist, with the valid range shown), and ⚠ (statute name ambiguous).&lt;/p&gt;
&lt;p&gt;What is interesting is the bugs that surfaced while empirically validating the feature. The v3.5.3 release notes describe testing five citations against the live government API and finding three false negatives. A substring mismatch where &amp;ldquo;Civil Act&amp;rdquo; matched &amp;ldquo;Refugee Act&amp;rdquo;; a parsing failure where the API returns paragraph numbers as &lt;a class="link" href="https://en.wikipedia.org/wiki/Enclosed_Alphanumerics" target="_blank" rel="noopener"
 &gt;enclosed Unicode numerals&lt;/a&gt; like &lt;code&gt;&amp;quot;① &amp;quot;&lt;/code&gt; and &lt;code&gt;parseInt&lt;/code&gt; stripped them into &lt;code&gt;NaN&lt;/code&gt;; a short statute name (&amp;ldquo;Commercial Act&amp;rdquo;) buried at result 34 and dropped. The tool built to catch hallucinations nearly hallucinated itself — and the README keeps the full debugging trail that pushed it back to 5-out-of-5 accuracy.&lt;/p&gt;
&lt;p&gt;v3.5.4 went further, introducing &lt;strong&gt;machine-parseable markers&lt;/strong&gt; like &lt;code&gt;[NOT_FOUND]&lt;/code&gt; and &lt;code&gt;[HALLUCINATION_DETECTED]&lt;/code&gt; on every failure response. The trigger was real-world feedback: &amp;ldquo;in practice the AI keeps not finding things and then just answers however it wants.&amp;rdquo; The root cause was that some tools did not set the &lt;code&gt;isError&lt;/code&gt; flag on a failed lookup, so the LLM never detected the failure and generated an answer anyway. It is a sharp reminder that getting an MCP tool to clearly signal &lt;em&gt;failure&lt;/em&gt; to an LLM is harder than it sounds.&lt;/p&gt;
&lt;h2 id="v40s-three-killer-features"&gt;v4.0&amp;rsquo;s three killer features
&lt;/h2&gt;&lt;p&gt;v4.0, the most recent major version, added three analysis tools at once.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;impact_map&lt;/code&gt; draws the ripple effect of a single article as a graph. Ask for &amp;ldquo;cases citing Article 103 of the Civil Act&amp;rdquo; and it does a &lt;strong&gt;reverse traversal&lt;/strong&gt; across Supreme Court rulings, Constitutional Court decisions, legal interpretations, administrative appeals, and local ordinances, then a &lt;strong&gt;forward traversal&lt;/strong&gt; over the other statutes that article cites — and auto-generates &lt;a class="link" href="https://mermaid.js.org/" target="_blank" rel="noopener"
 &gt;mermaid&lt;/a&gt; graph code that renders directly in &lt;a class="link" href="https://claude.ai" target="_blank" rel="noopener"
 &gt;claude.ai&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;time_travel&lt;/code&gt; diffs a statute across two points in time. Give it &amp;ldquo;Personal Information Protection Act 2020-01-01 vs 2025-11-01&amp;rdquo; and it pulls the text in force at each date, classifies additions (+), deletions (-), and changes (△) per article, and shows the before/after text plus character-count deltas. It is especially useful for frequently amended laws.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;action_plan&lt;/code&gt; turns a citizen&amp;rsquo;s plain-language situation into a five-step guide. Type &amp;ldquo;I can&amp;rsquo;t get my rental deposit back&amp;rdquo; and it unfolds into STEP 1 situation diagnosis (auto-identifying the &lt;a class="link" href="https://en.wikipedia.org/wiki/Korean_Housing_Lease_Protection_Act" target="_blank" rel="noopener"
 &gt;Housing Lease Protection Act&lt;/a&gt;) → STEP 2 rights and remedies (case law) → STEP 3 filing bodies and deadlines → STEP 4 required documents and forms → STEP 5 pitfalls and cautions, including a pointer to the &lt;a class="link" href="https://www.klac.or.kr/" target="_blank" rel="noopener"
 &gt;Korea Legal Aid Corporation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="operational-details"&gt;Operational details
&lt;/h2&gt;&lt;p&gt;The README&amp;rsquo;s release notes are refreshingly candid about the pains of running a remote server. In v3.3.0, the remote server hosted on &lt;a class="link" href="https://fly.io/" target="_blank" rel="noopener"
 &gt;fly.dev&lt;/a&gt; was periodically &lt;a class="link" href="https://en.wikipedia.org/wiki/Out_of_memory" target="_blank" rel="noopener"
 &gt;OOM&lt;/a&gt;-killed and restarted, invalidating session IDs — fixed by switching to MCP&amp;rsquo;s official &lt;a class="link" href="https://modelcontextprotocol.io/docs/develop/build-server" target="_blank" rel="noopener"
 &gt;stateless pattern&lt;/a&gt;, which builds a fresh &lt;code&gt;Server + Transport&lt;/code&gt; per request and releases it immediately on completion. API keys are isolated per request with &lt;a class="link" href="https://nodejs.org/api/async_context.html" target="_blank" rel="noopener"
 &gt;AsyncLocalStorage&lt;/a&gt; to prevent &lt;a class="link" href="https://en.wikipedia.org/wiki/Race_condition" target="_blank" rel="noopener"
 &gt;race conditions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The v3.5.5 hotfix is just as telling. The government Open API began classifying &lt;a class="link" href="https://nodejs.org" target="_blank" rel="noopener"
 &gt;Node.js&lt;/a&gt;&amp;rsquo;s default User-Agent (&lt;code&gt;undici/...&lt;/code&gt;) as a bot and rejecting it, killing the tools across all cloud hosting. The error message — &amp;ldquo;please register the correct server IP address&amp;rdquo; — made it look like IP-whitelist blocking, but the real cause was UA inspection. A one-line patch injecting a normal browser UA into the default headers restored everything. Annex and form parsing is handled by &lt;a class="link" href="https://github.com/chrisryugj/kordoc" target="_blank" rel="noopener"
 &gt;kordoc&lt;/a&gt;, an engine by the same author that auto-converts HWPX, HWP, PDF, XLSX, and DOCX into &lt;a class="link" href="https://en.wikipedia.org/wiki/Markdown" target="_blank" rel="noopener"
 &gt;Markdown&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Installation paths are plentiful: a one-line &lt;a class="link" href="https://claude.com/claude-code" target="_blank" rel="noopener"
 &gt;Claude Code plugin&lt;/a&gt; install, a &lt;a class="link" href="https://claude.ai" target="_blank" rel="noopener"
 &gt;claude.ai&lt;/a&gt; custom connector (&lt;code&gt;https://korean-law-mcp.fly.dev/mcp?oc=...&lt;/code&gt;), a desktop-app config file, an &lt;a class="link" href="https://www.npmjs.com/package/korean-law-mcp" target="_blank" rel="noopener"
 &gt;npm&lt;/a&gt; global install, and direct CLI use — five in all. It is &lt;a class="link" href="https://opensource.org/license/mit" target="_blank" rel="noopener"
 &gt;MIT-licensed&lt;/a&gt; and has over 1,700 stars on GitHub.&lt;/p&gt;
&lt;h2 id="insights"&gt;Insights
&lt;/h2&gt;&lt;p&gt;korean-law-mcp is interesting not because it is a legal search tool but because it is a record of empirically probing &lt;strong&gt;the right abstraction level for MCP tool design&lt;/strong&gt;. v2&amp;rsquo;s &amp;ldquo;one API equals one tool&amp;rdquo; was intuitive but wasted the scarce resource of LLM context; v3 folded 89 tools into 17 with a domain enum and dispatch table while holding feature coverage at 100%. That runs exactly opposite to the &lt;a class="link" href="https://en.wikipedia.org/wiki/REST" target="_blank" rel="noopener"
 &gt;REST API&lt;/a&gt; habit of slicing endpoints ever finer — and shows that when the consumer is an LLM rather than a human, the cost function of abstraction changes.&lt;/p&gt;
&lt;p&gt;The second lesson is that anti-hallucination is not a single feature but a &lt;strong&gt;system-wide signaling problem&lt;/strong&gt;. &lt;code&gt;verify_citations&lt;/code&gt; exists to catch fake statutes, yet the tool itself produced false negatives, and more fundamentally other tools were &lt;em&gt;causing&lt;/em&gt; hallucinations by not clearly signaling failure to the LLM. The &lt;code&gt;[NOT_FOUND]&lt;/code&gt; machine markers, the bulk fix of &lt;code&gt;isError&lt;/code&gt; flags, the removal of silent-drop patterns in the chain tools — all of it serves one goal: making a tool say &amp;ldquo;I don&amp;rsquo;t know&amp;rdquo; when it doesn&amp;rsquo;t. Anyone building an MCP server for a domain where accuracy is everything will hit this.&lt;/p&gt;
&lt;p&gt;Third, the project shows the value of repackaging public data to be LLM-friendly. The legislation API was already free and open, but it only becomes usable from a one-line natural-language question once domain knowledge is layered on: automatic abbreviation resolution, article-number conversion between human and API forms, unified search across 17 ruling domains. The gap between a government agency &lt;em&gt;opening&lt;/em&gt; an API and that API actually &lt;em&gt;getting used&lt;/em&gt; was closed here, in open source, by a single civil servant. The same pattern — public API plus MCP wrapper plus domain knowledge — transfers cleanly to other public-data areas like tax, patents, and statistics.&lt;/p&gt;
&lt;h2 id="references"&gt;References
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Project&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/chrisryugj/korean-law-mcp" target="_blank" rel="noopener"
 &gt;korean-law-mcp (GitHub)&lt;/a&gt; — the MCP server discussed here, MIT-licensed&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.npmjs.com/package/korean-law-mcp" target="_blank" rel="noopener"
 &gt;korean-law-mcp (npm)&lt;/a&gt; — &lt;code&gt;npm install -g korean-law-mcp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/chrisryugj/kordoc" target="_blank" rel="noopener"
 &gt;kordoc (GitHub)&lt;/a&gt; — same author&amp;rsquo;s HWPX/HWP/PDF/XLSX/DOCX to Markdown conversion engine&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Model Context Protocol&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://modelcontextprotocol.io" target="_blank" rel="noopener"
 &gt;Model Context Protocol official site&lt;/a&gt; — protocol documentation&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.anthropic.com/news/model-context-protocol" target="_blank" rel="noopener"
 &gt;MCP announcement (Anthropic)&lt;/a&gt; — released November 2024&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://modelcontextprotocol.io/docs/learn/architecture" target="_blank" rel="noopener"
 &gt;MCP architecture&lt;/a&gt; — server, client, and tool concepts&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://modelcontextprotocol.io/docs/develop/build-server" target="_blank" rel="noopener"
 &gt;Building MCP servers&lt;/a&gt; — including the stateless pattern&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://modelcontextprotocol.io/clients" target="_blank" rel="noopener"
 &gt;MCP client list&lt;/a&gt; — Claude Desktop, Cursor, VS Code, Zed, and more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Legal data sources&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.law.go.kr" target="_blank" rel="noopener"
 &gt;Ministry of Government Legislation&lt;/a&gt; — Korea&amp;rsquo;s national legal information center&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://open.law.go.kr/LSO/openApi/guideList.do" target="_blank" rel="noopener"
 &gt;Legislation Open API registration&lt;/a&gt; — free auth key (OC) issuance&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://eng.scourt.go.kr/" target="_blank" rel="noopener"
 &gt;Supreme Court&lt;/a&gt; · &lt;a class="link" href="https://english.ccourt.go.kr/" target="_blank" rel="noopener"
 &gt;Constitutional Court&lt;/a&gt; · &lt;a class="link" href="https://www.tt.go.kr/" target="_blank" rel="noopener"
 &gt;Tax Tribunal&lt;/a&gt; · &lt;a class="link" href="https://www.customs.go.kr/" target="_blank" rel="noopener"
 &gt;Korea Customs Service&lt;/a&gt; — sources of case law and rulings&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.klac.or.kr/" target="_blank" rel="noopener"
 &gt;Korea Legal Aid Corporation&lt;/a&gt; — the body action_plan points citizens to&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Background concepts&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://en.wikipedia.org/wiki/Hallucination_%28artificial_intelligence%29" target="_blank" rel="noopener"
 &gt;LLM hallucination&lt;/a&gt; — the problem verify_citations addresses&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://json-schema.org/" target="_blank" rel="noopener"
 &gt;JSON Schema&lt;/a&gt; — the MCP tool schema format&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.typescriptlang.org/" target="_blank" rel="noopener"
 &gt;TypeScript&lt;/a&gt; · &lt;a class="link" href="https://nodejs.org" target="_blank" rel="noopener"
 &gt;Node.js&lt;/a&gt; — the implementation stack&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://mermaid.js.org/" target="_blank" rel="noopener"
 &gt;mermaid&lt;/a&gt; — the graph format impact_map generates&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>