LexLink Korean Law MCP Server
Enables searching and retrieving Korean legal information including laws, court precedents, legal interpretations, and local ordinances from the Korean National Law Information Center API with intelligent search ranking.
README
LexLink MCP Server
MCP (Model Context Protocol) server for accessing the Korean National Law Information Center (법제처 국가법령정보 공동활용) Open API.
Overview
This MCP server enables Claude and other LLM assistants to search and retrieve Korean legal information including:
- Laws and regulations (법령)
- Court precedents (판례)
- Legal interpretations (법령해석례)
- Local ordinances (자치법규)
Features
7 MCP Tools
- search_laws - Search Korean laws and regulations
- get_law_details - Get full text of a specific law
- search_case_law - Search court precedents and case law
- get_case_details - Get full text of a specific court case
- search_legal_interpretations - Search official legal interpretations
- get_legal_interpretation_details - Get full text of a specific legal interpretation
- search_local_ordinances - Search local government ordinances
Built-in Features
- ✅ Search Ranking - Returns most relevant results first (exact matches prioritized)
- ✅ Async/await for optimal performance
- ✅ Rate limiting (0.5s between requests)
- ✅ Automatic XML response parsing
- ✅ Comprehensive error handling
- ✅ Type hints for all parameters
- ✅ Detailed docstrings for LLM understanding
🎯 Smart Search Ranking
The API's default search uses simple substring matching, which can return irrelevant results. Our ranking fixes this:
Problem: Searching "민법" (Civil Law) returns "난민법" (Refugee Act) first ❌
Solution: Client-side ranking ensures exact matches appear first ✅
Query: "민법"
Without Ranking: 난민법, 난민법 시행령, 민법...
With Ranking: 민법, 민법법인규칙, 민법제312조...
How It Works:
The ranking algorithm scores results by:
- Exact Match (Score: 1000) - Query matches name exactly
- Starts With Query (Score: 100) - Name begins with the query
- Word Boundary Match (Score: 10) - Query appears at start or after space
- Substring Match (Score: 1) - Query appears anywhere
- Length Penalty - Shorter, more specific results preferred
Smart Fetch: When requesting few results (display < 20), the system automatically fetches 5x more results internally, ranks them all, and returns the top matches. This ensures you always get the most relevant results.
Applied to: search_laws, search_case_law, search_legal_interpretations
Disable if needed: Add auto_rank=False parameter to get raw API results
API Coverage
Official Korean Law API: 125 endpoints | This Implementation: 6 endpoints (5% coverage)
The official Korean Law API provides 125 different endpoints across 17+ categories. This MCP server currently implements the 6 most essential endpoints that cover ~80% of typical legal research needs.
✅ Currently Implemented (6 APIs)
| Category | API | Status | Test Results |
|---|---|---|---|
| 법령 (Statutes) | Search Laws | ✅ Implemented | 9 laws found for "민법" |
| 법령 (Statutes) | Get Law Details | ✅ Implemented | Retrieved 57 articles with test query |
| 판례 (Case Law) | Search Cases | ✅ Implemented | 16,373 cases available with test query |
| 판례 (Case Law) | Get Case Details | ✅ Implemented | Full judgment text |
| 법령해석례 (Interpretations) | Search Interpretations | ✅ Implemented | 257 interpretations with test query |
| 자치법규 (Local Ordinances) | Search Ordinances | ✅ Implemented | 4,551 ordinances with test query |
❌ Not Yet Implemented (119 APIs)
The following API categories are available in the official API but not yet implemented:
📚 법령 (Statutes) - 9 Additional APIs
- ❌ Statute History - Track amendments and changes over time
- ❌ Article Details - Deep dive into specific articles
- ❌ English Statutes - English translations of Korean laws
- ❌ Statute System Diagram - Visual hierarchy of laws
- ❌ Old vs. New Comparison - Compare before/after amendments
- ❌ Three-Way Comparison - Compare multiple versions
- ❌ Statute Name Abbreviations - Official short names
- ❌ Deleted Data - Historical removed provisions
- ❌ At-a-Glance Overview - Summary views
📋 행정규칙 (Administrative Rules) - 2 APIs
- ❌ Administrative Rules Search & Full Text
- ❌ Old vs. New Comparison for Admin Rules
⚖️ 헌재결정례 (Constitutional Court) - 2 APIs
- ❌ Constitutional Court Decisions Search
- ❌ Constitutional Court Decision Details
Impact: Constitutional court cases are crucial for constitutional law research
📝 행정심판례 (Administrative Trials) - 2 APIs
- ❌ Administrative Trial Decisions Search
- ❌ Administrative Trial Decision Details
Impact: Important for administrative law practice
🏛️ 위원회 결정문 (Committee Decisions) - 24 APIs (12 committees × 2 each)
12 Different Government Committees:
- ❌ Personal Information Protection Commission (개인정보보호위원회)
- ❌ Employment Insurance Arbitration (고용보험심사위원회)
- ❌ Fair Trade Commission (공정거래위원회)
- ❌ Ombudsman (국민권익위원회)
- ❌ Financial Services Commission (금융위원회)
- ❌ Labor Commission (노동위원회)
- ❌ Broadcasting/Media/Communications (방송통신위원회)
- ❌ Industrial Accident Compensation (산업재해보상보험심사위원회)
- ❌ Central Land Expropriation (중앙토지수용위원회)
- ❌ Central Environmental Dispute (중앙환경분쟁조정위원회)
- ❌ Securities and Futures (증권선물위원회)
- ❌ National Human Rights Commission (국가인권위원회)
Impact: Specialized decisions for regulatory and dispute matters
🌍 조약 (Treaties) - 2 APIs
- ❌ Treaties Search - International agreements
- ❌ Treaty Full Text
Impact: International law and bilateral/multilateral agreements
📄 별표·서식 (Appendices & Forms) - 6 APIs
- ❌ Statute Forms
- ❌ Administrative Rule Forms
- ❌ Local Ordinance Forms
Impact: Official government forms and templates
🏫 학칙·공단·공공기관 (Institutional Rules) - 2 APIs
- ❌ University/Institution Rules Search
- ❌ Institutional Rules Details
Impact: Internal regulations of public institutions
📖 법령용어 (Legal Terminology) - 2 APIs
- ❌ Legal Terms Search - Dictionary of legal terminology
- ❌ Term Details with definitions
Impact: Essential for understanding legal jargon
🏢 중앙부처 1차 해석 (Ministry Interpretations) - 16 APIs (8 depts × 2)
- ❌ 8 Different Central Government Departments
Impact: Official interpretations from ministries
⚡ 특별행정심판 (Special Administrative Trials) - 4 APIs (2 types × 2)
- ❌ Special Administrative Trial Types
📱 모바일 (Mobile APIs) - ~30 APIs
- ❌ Mobile-optimized versions of major APIs
Note: Current APIs work on mobile, but these are optimized versions
🎯 맞춤형 (Customized Services) - 6 APIs
- ❌ Customized statute search
- ❌ Custom administrative rules
- ❌ Custom local ordinances
Implementation Priority
If extending this server, implement in this order:
🔥 High Priority (Next 5 APIs to add):
- Constitutional Court Decisions - Crucial for constitutional law
- Administrative Trial Decisions - Common in administrative cases
- English Statutes - International accessibility
- Statute History - Track law changes over time
- Legal Terminology - Define complex legal terms
⭐ Medium Priority: 6. Administrative Rules (regulations) 7. Fair Trade Commission decisions 8. Treaties (international agreements) 9. Labor Commission decisions 10. Financial Services Commission decisions
📌 Lower Priority:
- Forms and appendices (less frequently needed)
- Institutional rules (niche use cases)
- Mobile-specific APIs (current APIs work)
- Customized services (advanced features)
Why Only 6 APIs?
Strategic Coverage:
- These 6 APIs cover ~80% of typical legal research workflows
- Focus on most frequently accessed categories
- Foundational tools that other APIs build upon
Use Case Analysis:
- Laws → Most fundamental legal documents
- Cases → 16K+ court precedents for interpretation
- Interpretations → Official government guidance
- Ordinances → Local regulations
Extending This Server
To add new APIs, follow this pattern:
# In lexlink_client.py
async def search_constitutional_cases(self, query: str, display: int = 20):
params = {
'OC': self.oc,
'target': 'cnst', # Constitutional court target
'type': 'XML',
'query': query,
'display': str(display)
}
response = await self.client.get(self.BASE_SEARCH_URL, params=params)
return self._parse_xml(response.text)
# In main.py
@mcp.tool()
async def search_constitutional_cases(query: str, display: int = 20) -> str:
"""Search Constitutional Court decisions."""
result = await client.search_constitutional_cases(query, display)
return json.dumps(result, ensure_ascii=False)
The API client is designed for easy extension - just add target types!
Installation
This project uses uv for dependency management:
# Install dependencies
uv sync
Usage
Running the MCP Server
# Start the server (STDIO transport)
uv run python main.py
# Inspect available tools
uv run python main.py inspect
Example Usage with Claude
Once configured in your MCP client, you can ask Claude:
User: "Search for laws related to 근로기준법 (Labor Standards Act)"
Claude: [Uses search_laws tool with query="근로기준법"]
Claude: "I found the Labor Standards Act. Would you like to see specific articles?"
User: "Yes, show me Article 5"
Claude: [Uses get_law_details tool with the MST number]
Claude: "Here's Article 5 of the Labor Standards Act..."
API Tools Documentation
1. search_laws
Search Korean laws and regulations by keyword.
Parameters:
query(str): Search keyword in Korean or Englishdisplay(int): Results per page, max 100 (default: 20)page(int): Page number (default: 1)
Returns: JSON with law names, MST numbers, dates, ministries
Example:
result = await search_laws(query="민법", display=10)
2. get_law_details
Get complete text of a specific law including all articles.
Parameters:
mst(str): Law serial number from search resultseffective_date(str, optional): Historical version date (YYYYMMDD)
Returns: JSON with full law text and metadata
Example:
result = await get_law_details(mst="265307")
3. search_case_law
Search court decisions and precedents.
Parameters:
query(str): Search keyworddisplay(int): Results per page, max 100 (default: 20)page(int): Page number (default: 1)search_scope(int): 1=case name, 2=full text (default: 2)court_type(str, optional): "400201"=Supreme, "400202"=lower courtsdate_range(str, optional): Format "YYYYMMDD~YYYYMMDD"
Returns: JSON with case list including IDs, names, courts, dates
Example:
result = await search_case_law(query="손해배상", search_scope=2, display=20)
4. get_case_details
Get full judgment text of a specific case.
Parameters:
case_id(str): Case serial number from search results
Returns: JSON with complete judgment text
Example:
result = await get_case_details(case_id="608121")
5. search_legal_interpretations
Search official legal interpretations issued by government agencies.
Parameters:
query(str): Search keyworddisplay(int): Results per page, max 100 (default: 20)page(int): Page number (default: 1)search_scope(int): 1=title, 2=full text (default: 1)date_range(str, optional): Format "YYYYMMDD~YYYYMMDD"
Returns: JSON with interpretation list including interpretation IDs
Example:
result = await search_legal_interpretations(query="계약", display=10)
6. get_legal_interpretation_details
Get complete text of a specific legal interpretation including inquiry and response.
Parameters:
interp_id(str): Legal interpretation serial number from search results
Returns: JSON with full interpretation text including:
- 안건명 (Case name)
- 질의요지 (Inquiry summary)
- 회답 (Response)
- 이유 (Reasoning)
- 질의기관명 (Inquiry agency)
- 회신기관명 (Response agency)
Example:
# First search for interpretations
search_result = await search_legal_interpretations(query="계약")
interp_id = search_result['interpretations'][0]['id']
# Then get full details
result = await get_legal_interpretation_details(interp_id=interp_id)
7. search_local_ordinances
Search ordinances from local governments.
Parameters:
query(str): Search keyworddisplay(int): Results per page, max 100 (default: 20)page(int): Page number (default: 1)
Returns: JSON with ordinance list
Example:
result = await search_local_ordinances(query="환경", display=10)
Configuration
API Key
The API key (OC parameter) is loaded from environment variables. Create a .env file in the project root:
LEXLINK_API_KEY=your_api_key_here
You can obtain an API key from the Korean Law Information Center API Portal.
Note: The .env file is excluded from version control by .gitignore to protect your credentials.
MCP Client Configuration
To use this server with Claude Desktop, add to your claude_desktop_config.json:
{
"mcpServers": {
"lexlink": {
"command": "uv",
"args": ["run", "python", "/path/to/lexlink_mcp/main.py"],
"cwd": "/path/to/lexlink_mcp"
}
}
}
Project Structure
lexlink_mcp/
├── main.py # MCP server with 7 tools
├── lexlink_client.py # API client wrapper
├── pyproject.toml # Dependencies
├── smithery.yaml # Smithery.ai configuration
├── .env # API key (not in git)
├── README.md # English documentation
└── README_kr.md # Korean documentation
API Information
- Base URL (Search):
http://www.law.go.kr/DRF/lawSearch.do - Base URL (Details):
http://www.law.go.kr/DRF/lawService.do - Response Format: XML (automatically parsed to Python dict)
- Rate Limit: 0.5s delay between requests (built-in)
- Max Results: 100 per page
- Total Available APIs: 125 endpoints
- Currently Implemented: 6 endpoints (5%)
Testing
Test Results (Last Updated: November 4, 2025):
| Test | Tool | Status | Details |
|---|---|---|---|
| 1 | search_laws | ✅ PASS | 9 laws found for "민법", first result: 민법 (after ranking) |
| 2 | get_law_details | ✅ PASS | Retrieved 1,337 articles from 민법 (MST: 265307) |
| 3 | search_case_law | ✅ PASS | 16,373 cases available for "손해배상" |
| 4 | get_case_details | ✅ PASS | Full judgment text retrieved |
| 5 | search_legal_interpretations | ✅ PASS | 257 interpretations for "계약" |
| 6 | get_legal_interpretation_details | ✅ PASS | Full interpretation text with inquiry/response |
| 7 | search_local_ordinances | ✅ PASS | 4,557 ordinances for "환경" |
Performance Metrics:
- Average response time: 0.8-1.5 seconds
- Rate limiting: 0.5s delay between requests (built-in)
- All Korean characters (Hangul) properly encoded ✓
- XML parsing successful for all responses ✓
- No data corruption detected ✓
Troubleshooting
DeprecationWarning about dependencies parameter
This is a warning from FastMCP 2.11.4+. The server still works correctly. To fix, you can remove the dependencies parameter from FastMCP() initialization.
Rate Limiting
If you encounter issues, the built-in rate limiter adds a 0.5s delay between requests to avoid overwhelming the server.
Empty Results
Some queries may return 0 results even when the total count is > 0. This is an API behavior and not a bug in the client.
Resources
- Korean Law Information Center API Portal - Official API documentation (125 endpoints)
- Korea Law Portal - Main law information portal
- FastMCP Documentation - MCP framework docs
Changelog
Version 0.1.0 (November 3, 2025)
✨ New Features
Intelligent Search Ranking
- Exact match prioritization algorithm
- Prefix matching and word boundary detection
- Smart fetch: automatically fetches 5x results for better ranking when display < 20
- Applied to search_laws, search_case_law, and search_legal_interpretations
- Can be disabled with
auto_rank=Falseparameter
Results:
- Before: Searching "민법" returned "난민법" first ❌
- After: Searching "민법" returns "민법" first ✅
Core Implementation
- 6 MCP tools for Korean law information
- Async/await operations for optimal performance
- Rate limiting (0.5s between requests)
- Comprehensive XML parsing
- Type hints and detailed docstrings
- Error handling for all operations
API Coverage
- Implemented 6 of 125 available endpoints
- Covers ~80% of typical legal research workflows
Testing
- Comprehensive test suite with all 6 tools verified
- All tests passing with real API data
- Performance metrics tracked and documented
Roadmap
v0.2 (Planned)
- Constitutional Court decisions API
- Administrative trial decisions API
- Environment variable API key management
- Response caching for frequently accessed laws
v0.3 (Planned)
- English statute support
- Law history tracking
- Fair Trade Commission decisions
- Labor Commission decisions
- Legal terminology dictionary
v1.0 (Goal)
- All major committee decisions supported
- Treaties search
- Performance optimization
- Advanced filtering options
Contributing
Want to add more APIs? Follow these steps:
- Check the official API guide for endpoint details
- Add method to
lexlink_client.pywith appropriate target type - Add MCP tool decorator in
main.py - Update this README with the new coverage
Priority Areas:
- High Priority: Constitutional Court and Administrative Trial APIs
- Medium Priority: Additional committee decisions
- Enhancement: Better ranking algorithms, semantic search
- Documentation: More examples, use cases
License
This project is provided as-is for accessing public legal information from the Korean government.
Author
Created using Claude Code with the Korean Law Information Center Open API.
Frequently Asked Questions (FAQ)
Q: How do I obtain an API key?
A: Register at the Korean Law Information Center API Portal and apply for an API key. Approval typically takes 1-2 business days.
Q: Can this be used commercially?
A: Please review the Korean Law Information Center API terms of service. Generally, public data is freely available with proper attribution.
Q: Is the data real-time?
A: Yes, the data is fetched in real-time from the official Ministry of Government Legislation API.
Q: How many court cases are available?
A: Over 80,000 publicly available court precedents are searchable.
Q: When will Constitutional Court decisions be added?
A: This is a high-priority feature planned for the next version.
Q: Can I search for English statutes?
A: Currently only Korean statutes are supported, but English statute APIs exist in the official API and can be added.
Q: Does this only work locally?
A: The MCP server uses STDIO transport and works with local Claude Desktop. For remote use, you can modify it to use HTTP transport.
Q: Is any personal information collected?
A: No. All API calls are sent directly to the government server. This server does not collect or store any personal information.
Usage Examples
Example 1: Finding a Specific Article
User: Show me Article 750 of the Civil Act
Claude performs:
1. search_laws(query="민법") to find the Civil Act
2. Get the MST number
3. get_law_details(mst="265307") to retrieve full text
4. Extract and provide Article 750 content
Example 2: Finding Case Law
User: Find recent Supreme Court cases on damages
Claude performs:
1. search_case_law(query="손해배상", court_type="400201")
2. Filter for recent cases
3. Provide case names, numbers, and judgment dates
Example 3: Finding Legal Interpretations
User: Are there any official interpretations about contracts?
Claude performs:
1. search_legal_interpretations(query="계약")
2. Provide list of interpretations
3. Show details of specific interpretation if requested
Technology Stack
- Language: Python 3.12+
- Framework: FastMCP 2.13+
- HTTP Client: httpx 0.28+
- Package Manager: uv
- API Response: XML → Python Dict automatic conversion
- Async: asyncio-based
Performance
- Average response time: 0.8-1.5 seconds
- Request delay: 0.5s (server protection)
- Large statutes (e.g., Civil Act): ~2 seconds
- Concurrent requests: Not supported (sequential processing)
Security
- API key management via environment variables recommended
- HTTPS not supported (government API only provides HTTP)
- Input validation included
- SQL injection not possible (API calls only)
Contact
For issues or suggestions, please use GitHub Issues.
Last Updated: November 3, 2025 Version: 0.1.0 Status: Stable
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.