Skip to main content
Glama

๐ŸŒ Read this in other languages: English | ํ•œ๊ตญ์–ด (Korean)

Kakao PlayMCP 10 3rd Prize MCP Python

LexLink is an MCP (Model Context Protocol) server that exposes the Korean National Law Information API (open.law.go.kr) to AI agents and LLM applications. It enables AI systems to search, retrieve, and analyze Korean legal information through standardized MCP tools.

Features

  • 54 MCP Tools + 2 MCP Resources for comprehensive Korean law information access

    • Search and retrieve Korean laws (effective date & announcement date)

    • Search and retrieve English-translated laws

    • Search and retrieve administrative rules (ํ–‰์ •๊ทœ์น™)

    • Query specific articles, paragraphs, and sub-items

    • Law-ordinance linkage (๋ฒ•๋ น-์ž์น˜๋ฒ•๊ทœ ์—ฐ๊ณ„)

    • Delegated law information (์œ„์ž„๋ฒ•๋ น)

    • Phase 3 - Case Law & Legal Research

      • Court precedents (ํŒ๋ก€)

      • Constitutional Court decisions (ํ—Œ์žฌ๊ฒฐ์ •๋ก€)

      • Legal interpretations (๋ฒ•๋ นํ•ด์„๋ก€)

      • Administrative appeal decisions (ํ–‰์ •์‹ฌํŒ๋ก€)

    • Phase 4 - Article Citation Extraction

      • Extract legal citations from any law article (100% accuracy)

    • NEW: Phase 5 - AI-Powered Search

      • Semantic search for natural language queries (aiSearch)

      • Related laws discovery (aiRltLs_search)

    • MCP Resources - Law ID Cache

      • Cached mapping of ~20 frequently-used law names to stable ๋ฒ•๋ นID codes

      • Template lookup by Korean name or abbreviation (lexlink://law/{name})

      • Dynamic caching: search results automatically populate the cache

  • Smart Features (inspired by korean-law-mcp):

    • Intelligent Caching - Per-tool TTL caching (search 1hr, articles 24hr, AI search 30min)

    • Law Name Resolution - Auto-resolves Korean abbreviations (์žํ†ต๋ฒ•โ†’์ž๋ณธ์‹œ์žฅ๊ณผ ๊ธˆ์œตํˆฌ์ž์—…์— ๊ด€ํ•œ ๋ฒ•๋ฅ ), 52 seed aliases + dynamic learning

    • Chain Tools - Multi-step research workflows in one call (Phase 9)

  • 100% Semantic Validation - All Phase 1-5 tools confirmed returning real law data

  • Error Handling - Actionable error messages with resolution hints

  • Korean Text Support - Proper UTF-8 encoding for Korean characters

  • Response Formats - JSON (default), HTML, or XML (multiple formats supported)

Related MCP server: Legal Search MCP

Project Status

๐ŸŽ‰ Production Ready - Phase 9 Complete!

Metric

Status

Tools Implemented

54/54 (100%) โœ…

Semantic Validation

26/26 (Phase 1-5 tools) โœ…

MCP Prompts

9/9 (100%) โœ…

MCP Resources

2 (1 static + 1 template) โœ…

API Coverage

~28% of 191+ endpoints

LLM Integration

โœ… Validated (Gemini)

Code Quality

Clean, documented, tested

Version

v2.1.0

Latest: v2.1.0 โ€” 54 tools (Phase 9 added), intelligent caching (cache.py), law name resolution (resolver.py), chain tools for multi-step research workflows.

Prerequisites

Quick Start

1. Install Dependencies

uv sync

2. Configure Your OC Identifier

Option A: Environment Variable (Recommended)

# Set OC in your environment
export OC=your_id_here

Option B: Pass in Tool Arguments

# Override OC in each tool call
eflaw_search(query="๋ฒ•๋ น๋ช…", oc="your_id")

3. Run the Server

# Stdio transport (for Claude Code, Cursor, etc.)
OC=your_oc uv run stdio

# HTTP transport (for Kakao PlayMCP)
OC=your_oc TRANSPORT=http uv run serve

Available Tools

Phase 1: Core Law APIs (6 tools)

1. eflaw_search - Search Laws by Effective Date

Search for laws organized by effective date (์‹œํ–‰์ผ ๊ธฐ์ค€).

eflaw_search(
    query="์ž๋™์ฐจ๊ด€๋ฆฌ๋ฒ•",      # Search keyword
    display=10,                # Results per page
    type="XML",                # Response format
    ef_yd="20240101~20241231"  # Optional date range
)

2. law_search - Search Laws by Announcement Date

Search for laws organized by announcement date (๊ณตํฌ์ผ ๊ธฐ์ค€).

law_search(
    query="๋ฏผ๋ฒ•",
    display=10,
    type="XML"
)

3. eflaw_service - Retrieve Law Content (Effective Date)

Get full law text and articles by effective date.

IMPORTANT: For specific article queries (e.g., "์ œ174์กฐ"), use the jo parameter. Some laws have 400+ articles and responses can exceed 1MB without jo.

# Get specific article (RECOMMENDED)
eflaw_service(
    mst="279823",              # Law MST
    jo="017400",               # Article 174 (์ œ174์กฐ)
    type="XML"
)

# Get full law (WARNING: large response)
eflaw_service(
    id="001823",
    type="XML"
)

4. law_service - Retrieve Law Content (Announcement Date)

Get full law text and articles by announcement date.

IMPORTANT: For specific article queries (e.g., "์ œ174์กฐ"), use the jo parameter. Some laws have 400+ articles and responses can exceed 1MB without jo.

# Get specific article (RECOMMENDED)
law_service(
    mst="279823",              # Law MST
    jo="017400",               # Article 174 (์ œ174์กฐ)
    type="XML"
)

5. eflaw_josub - Query Article/Paragraph (Effective Date)

Best tool for querying specific articles. Returns only the requested article/paragraph.

eflaw_josub(
    mst="279823",              # Law MST
    jo="017400",               # Article 174 (์ œ174์กฐ)
    type="XML"
)
# jo format: "XXXXXX" where first 4 digits = article (zero-padded), last 2 = branch (00=main)
# Examples: "017400" (์ œ174์กฐ), "000300" (์ œ3์กฐ), "001502" (์ œ15์กฐ์˜2)

6. law_josub - Query Article/Paragraph (Announcement Date)

Best tool for querying specific articles. Returns only the requested article/paragraph.

law_josub(
    mst="279823",              # Law MST
    jo="017200",               # Article 172 (์ œ172์กฐ)
    type="XML"
)

Phase 2: Extended APIs (9 tools)

7. elaw_search - Search English-Translated Laws

Search for Korean laws translated to English.

elaw_search(
    query="employment",
    display=10,
    type="XML"
)

8. elaw_service - Retrieve English Law Content

Get full English-translated law text.

elaw_service(
    id="009589",
    type="XML"
)

9. admrul_search - Search Administrative Rules

Search administrative rules (ํ›ˆ๋ น, ์˜ˆ๊ทœ, ๊ณ ์‹œ, ๊ณต๊ณ , ์ง€์นจ).

admrul_search(
    query="ํ•™๊ต",
    display=10,
    type="XML"
)

10. admrul_service - Retrieve Administrative Rule Content

Get full administrative rule text with annexes.

admrul_service(
    id="62505",
    type="XML"
)

11. lnkLs_search - Search Law-Ordinance Linkage

Find laws linked to local ordinances.

lnkLs_search(
    query="๊ฑด์ถ•",
    display=10,
    type="XML"
)

12. lnkLsOrdJo_search - Search Ordinance Articles by Law

Find ordinance articles linked to specific law articles.

lnkLsOrdJo_search(
    knd="002118",              # Law ID
    display=10,
    type="XML"
)

13. lnkDep_search - Search Law-Ordinance Links by Ministry

Find laws linked to ordinances by government ministry.

lnkDep_search(
    org="1400000",             # Ministry code
    display=10,
    type="XML"
)

14. drlaw_search - Retrieve Law-Ordinance Linkage Statistics

Get linkage statistics table (HTML format).

drlaw_search(
    lid="001823",              # Law ID
    type="HTML"
)

15. lsDelegated_service - Retrieve Delegated Law Information

Get information about delegated laws, rules, and ordinances.

lsDelegated_service(
    id="001823",
    type="XML"
)

Tip: All *_service tools in Phase 3 support a sections="summary" parameter to return only a brief summary instead of the full document text.

16. prec_search - Search Court Precedents

Search Korean court precedents from Supreme Court and lower courts.

prec_search(
    query="๋‹ด๋ณด๊ถŒ",
    display=10,
    type="XML",
    curt="๋Œ€๋ฒ•์›"             # Optional: Court name filter
)

17. prec_service - Retrieve Court Precedent Full Text

Get complete court precedent text with case details.

prec_service(
    id="228541",
    type="XML"
)

18. detc_search - Search Constitutional Court Decisions

Search Korean Constitutional Court decisions.

detc_search(
    query="๋ฒŒ๊ธˆ",
    display=10,
    type="XML"
)

19. detc_service - Retrieve Constitutional Court Decision Full Text

Get complete Constitutional Court decision text.

detc_service(
    id="58386",
    type="XML"
)

20. expc_search - Search Legal Interpretations

Search legal interpretation precedents issued by government agencies.

expc_search(
    query="์ž„์ฐจ",
    display=10,
    type="XML"
)

21. expc_service - Retrieve Legal Interpretation Full Text

Get complete legal interpretation text.

expc_service(
    id="334617",
    type="XML"
)

22. decc_search - Search Administrative Appeal Decisions

Search Korean administrative appeal decisions.

decc_search(
    query="*",                # Search all decisions
    display=10,
    type="XML"
)

23. decc_service - Retrieve Administrative Appeal Decision Full Text

Get complete administrative appeal decision text.

decc_service(
    id="243263",
    type="XML"
)

Phase 4: Article Citation Extraction (1 tool - NEW!)

24. article_citation - Extract Citations from Law Article

Extract all legal citations referenced by a specific law article.

# First, search for the law to get MST
eflaw_search(query="๊ฑด์ถ•๋ฒ•")  # Returns MST: 268611

# Then extract citations
article_citation(
    mst="268611",              # Law MST from search result
    law_name="๊ฑด์ถ•๋ฒ•",          # Law name
    article=3                  # Article number (์ œ3์กฐ)
)

Response:

{
    "success": true,
    "law_name": "๊ฑด์ถ•๋ฒ•",
    "article": "์ œ3์กฐ",
    "citation_count": 12,
    "internal_count": 4,
    "external_count": 8,
    "citations": [
        {
            "type": "external",
            "target_law_name": "ใ€Œ๊ตญํ† ์˜ ๊ณ„ํš ๋ฐ ์ด์šฉ์— ๊ด€ํ•œ ๋ฒ•๋ฅ ใ€",
            "target_article": 56,
            "target_paragraph": 1
        }
    ]
}

Key Features:

  • 100% accuracy via HTML parsing (not LLM-based)

  • Zero API cost (no external LLM calls)

  • ~350ms average extraction time

  • Distinguishes internal vs external citations

Phase 5: AI-Powered Search (2 tools - NEW!)

25. aiSearch - AI-Powered Semantic Law Search

โญ PREFERRED TOOL for vague or natural language queries. Use this FIRST when user's intent is unclear or conversational.

Uses intelligent/semantic search to find relevant law articles with full article text.

aiSearch(
    query="๋บ‘์†Œ๋‹ˆ ์ฒ˜๋ฒŒ",           # Natural language query
    search=0,                      # 0: law articles, 1: appendix, 2: admin rules, 3: admin appendix
    display=20,                    # Results per page
    page=1,                        # Page number
    type="JSON"                    # Response format (JSON default)
)

Best for: Natural language queries like "์Œ์ฃผ์šด์ „ ๋ฒŒ๊ธˆ", "์ดํ˜ผ ์žฌ์‚ฐ๋ถ„ํ• ", "์ƒ์† ๋ฌธ์ œ"

26. aiRltLs_search - AI-Powered Related Laws Search

โญ PREFERRED TOOL for discovering related laws from vague topics. Use this when user wants to explore laws around a general subject.

Finds laws semantically related to a given law name or keyword.

aiRltLs_search(
    query="๋ฏผ๋ฒ•",                  # Law name or keyword
    search=0,                      # 0: law articles, 1: admin rule articles
    type="JSON"                    # Response format (JSON default)
)

Best for: Finding related laws like "๋ฏผ๋ฒ•" โ†’ ์ƒ๋ฒ•, ์˜๋ฃŒ๋ฒ•, ์†Œ์†ก์ด‰์ง„๋ฒ•

Category

Tools

์ž์น˜๋ฒ•๊ทœ (Local Ordinances)

ordin_search, ordin_service, ordinLsCon_search

์กฐ์•ฝ (Treaties)

trty_search, trty_service

๋ฒ•๋ น์ •๋ณด ์ง€์‹๋ฒ ์ด์Šค (Knowledge Base)

lstrm_ai_search, dlytrm_search, lstrm_rlt_search, dlytrm_rlt_search, lstrm_rlt_jo_search, jo_rlt_lstrm_search, ls_rlt_search

์œ„์›ํšŒ ๊ฒฐ์ •๋ฌธ (Committee Decisions)

committee_search, committee_service

์ค‘์•™๋ถ€์ฒ˜ 1์ฐจ ํ•ด์„ (Ministry Interpretations)

cgm_expc_search, cgm_expc_service

ํŠน๋ณ„ํ–‰์ •์‹ฌํŒ (Special Appeals)

special_decc_search, special_decc_service

Phase 9: Chain Tools (5 tools)

Inspired by korean-law-mcp, these tools run multi-step research workflows in a single call โ€” eliminating the need for an LLM to orchestrate sequential tool calls manually.

Tool

Description

chain_full_research

Complete legal research: statutes + precedent analysis + interpretations

chain_amendment_track

Revision history + article-level diff across amendments

chain_dispute_prep

All case law sources across 4 databases (ํŒ๋ก€, ํ—Œ์žฌ๊ฒฐ์ •๋ก€, ๋ฒ•๋ นํ•ด์„๋ก€, ํ–‰์ •์‹ฌํŒ๋ก€)

chain_law_system

Full law hierarchy: delegation tree + admin rules + ordinances

cache_stats

Cache and resolver performance monitoring

Tool Selection Guide

When searching Korean law, select tools based on query clarity:

Query Type

Recommended Tools

Examples

๐Ÿ” Vague/Natural language

aiSearch, aiRltLs_search

"์Œ์ฃผ์šด์ „ ์ฒ˜๋ฒŒ", "์ดํ˜ผ ์žฌ์‚ฐ๋ถ„ํ• "

๐Ÿ“‹ Specific law/article

eflaw_search, law_search

"ํ˜•๋ฒ• ์ œ148์กฐ์˜2", "๋ฏผ๋ฒ• ์ƒ์†ํŽธ"

โš–๏ธ Case law

prec_search, detc_search

"๋Œ€๋ฒ•์› 2023๋‹ค12345"

๐Ÿ”— Related laws

aiRltLs_search

"๋ฏผ๋ฒ•๊ณผ ๊ด€๋ จ๋œ ๋ฒ•๋ฅ "

Configuration

Environment Variables

Variable

Default

Description

OC

(required)

law.go.kr API identifier (email local part)

LEXLINK_BASE_URL

http://www.law.go.kr

API base URL

LEXLINK_TIMEOUT

60

HTTP request timeout in seconds

SLIM_RESPONSE

(unset)

Set true to remove redundant raw XML when parsed data exists (for PlayMCP)

TRANSPORT

sse

Transport type: sse or http

OC Priority

When resolving the OC identifier:

  1. Tool argument (highest priority) - oc parameter in tool call

  2. Environment variable - OC env var (set via .env or HTTP header middleware)

Usage Examples

# Search for automobile management law
result = eflaw_search(
    query="์ž๋™์ฐจ๊ด€๋ฆฌ๋ฒ•",
    display=5,
    type="XML"
)

# Returns:
{
    "status": "ok",
    "request_id": "uuid",
    "upstream_type": "XML",
    "data": {
        # Law search results...
    }
}

Example 2: Search with Date Range

# Find laws effective in 2024
result = eflaw_search(
    query="๊ตํ†ต",
    ef_yd="20240101~20241231",
    type="XML"
)

Example 3: Error Handling

# Missing OC parameter
result = eflaw_search(query="test")

# Returns helpful error:
{
    "status": "error",
    "error_code": "MISSING_OC",
    "message": "OC parameter is required but not provided.",
    "hints": [
        "1. Tool argument: oc='your_value'",
        "2. Environment variable: OC=your_value"
    ]
}

Golden MCP Tool Trajectories

These examples demonstrate real-world conversation flows showing how LLMs interact with LexLink tools to answer legal research questions.

Trajectory 1: Basic Law Research

User Query: "What is Article 20 of the Civil Code?"

Tool Calls:

  1. law_search(query="๋ฏผ๋ฒ•", display=50, type="XML") โ†’ Find Civil Code ID

  2. law_service(id="000021", jo="002000", type="XML") โ†’ Retrieve Article 20 text

Result: LLM provides formatted explanation of Civil Code Article 20 with full legal text and context.


Trajectory 2: Court Precedent Analysis

User Query: "Find recent Supreme Court precedents about security interests"

Tool Calls:

  1. prec_search(query="๋‹ด๋ณด๊ถŒ", curt="๋Œ€๋ฒ•์›", display=50, type="XML") โ†’ Search Supreme Court precedents

  2. prec_service(id="228541", type="XML") โ†’ Retrieve top precedent details

Result: LLM summarizes key precedents with case numbers, dates, and holdings related to security interests.


User Query: "How does the Labor Standards Act handle overtime, and are there relevant court precedents?"

Tool Calls:

  1. eflaw_search(query="๊ทผ๋กœ๊ธฐ์ค€๋ฒ•", display=50, type="XML") โ†’ Find Labor Standards Act

  2. eflaw_service(id="001234", jo="005000", type="XML") โ†’ Retrieve Article 50 (overtime provisions)

  3. prec_search(query="๊ทผ๋กœ๊ธฐ์ค€๋ฒ• ์—ฐ์žฅ๊ทผ๋กœ", display=30, type="XML") โ†’ Search overtime precedents

  4. prec_service(id="234567", type="XML") โ†’ Retrieve leading precedent

Result: LLM provides comprehensive analysis combining statutory text with judicial interpretation, showing how courts apply the overtime provisions.


Trajectory 4: Constitutional Review

User Query: "Has the Constitutional Court reviewed laws about fines?"

Tool Calls:

  1. detc_search(query="๋ฒŒ๊ธˆ", display=50, type="XML") โ†’ Search Constitutional Court decisions

  2. detc_service(id="58386", type="XML") โ†’ Retrieve decision full text

  3. law_search(query=<law_name_from_decision>, type="XML") โ†’ Find related law for context

Result: LLM explains Constitutional Court holdings on fine-related provisions and their impact on specific laws.


Trajectory 5: Administrative Law Research

User Query: "What administrative rules exist for schools, and are there related legal interpretations?"

Tool Calls:

  1. admrul_search(query="ํ•™๊ต", display=50, type="XML") โ†’ Search school-related administrative rules

  2. admrul_service(id="62505", type="XML") โ†’ Retrieve rule content

  3. expc_search(query="ํ•™๊ต", display=30, type="XML") โ†’ Search legal interpretations

  4. expc_service(id="334617", type="XML") โ†’ Retrieve interpretation details

Result: LLM provides overview of administrative framework for schools with official agency interpretations.


User Query: "I'm researching rental housing disputes. Show me the relevant law, court precedents, and administrative appeal decisions."

Tool Calls:

  1. eflaw_search(query="์ฃผํƒ์ž„๋Œ€์ฐจ๋ณดํ˜ธ๋ฒ•", display=50, type="XML") โ†’ Find Housing Lease Protection Act

  2. eflaw_service(id="002876", type="XML") โ†’ Retrieve full law text

  3. prec_search(query="์ฃผํƒ์ž„๋Œ€์ฐจ", display=50, type="XML") โ†’ Search housing lease precedents

  4. prec_service(id="156789", type="XML") โ†’ Retrieve key precedent

  5. decc_search(query="์ฃผํƒ์ž„๋Œ€์ฐจ", display=30, type="XML") โ†’ Search administrative appeal decisions

  6. decc_service(id="243263", type="XML") โ†’ Retrieve appeal decision

Result: LLM provides comprehensive legal research report covering statutory framework, judicial interpretation, and administrative precedents for rental housing disputes.


Trajectory 7: Citation Network Analysis (Phase 4)

User Query: "What laws does Article 3 of the Building Act cite?"

Tool Calls:

  1. eflaw_search(query="๊ฑด์ถ•๋ฒ•", display=50, type="XML") โ†’ Find Building Act, get MST

  2. article_citation(mst="268611", law_name="๊ฑด์ถ•๋ฒ•", article=3) โ†’ Extract all citations

Result: LLM provides complete citation analysis showing 12 citations (8 external laws, 4 internal references) including specific article and paragraph references.


Trajectory 8: AI-Powered Natural Language Search (Phase 5)

User Query: "What's the penalty for hit-and-run accidents?"

Tool Calls:

  1. aiSearch(query="๋บ‘์†Œ๋‹ˆ ์ฒ˜๋ฒŒ", search=0, display=20, type="XML") โ†’ Semantic search for hit-and-run penalties

Result: LLM receives full article text from relevant laws (ํŠน์ •๋ฒ”์ฃ„ ๊ฐ€์ค‘์ฒ˜๋ฒŒ ๋“ฑ์— ๊ด€ํ•œ ๋ฒ•๋ฅ  ์ œ5์กฐ์˜3) with complete provisions about hit-and-run penalties, enabling comprehensive answer without needing to know specific law names.


User Query: "What laws are related to the Civil Code?"

Tool Calls:

  1. aiRltLs_search(query="๋ฏผ๋ฒ•", search=0, type="XML") โ†’ Find semantically related laws

Result: LLM discovers related laws like ์ƒ๋ฒ• (Commercial Act), ์˜๋ฃŒ๋ฒ• (Medical Service Act), ์†Œ์†ก์ด‰์ง„๋ฒ• (Act on Special Cases Concerning Expedition of Litigation), showing connections across legal domains.


Key Patterns

  1. AI Tools for Vague Queries: Use aiSearch or aiRltLs_search FIRST when user intent is unclear or conversational

  2. Search First, Then Retrieve: Always search to find IDs before calling service tools

  3. Use display=50-100 for Law Searches: Ensures exact matches are found due to relevance ranking

  4. Combine Phases: Mix Phase 1 (laws), Phase 2 (administrative rules), Phase 3 (precedents), and Phase 5 (AI search) for complete research

  5. Type Parameter: Default is type="JSON"; specify type="XML" if your pipeline requires XML

  6. Article Numbers: Use 6-digit format (e.g., "002000" for Article 20) when querying specific articles

Development

Project Structure

lexlink-ko-mcp/
โ”œโ”€โ”€ src/lexlink/
โ”‚   โ”œโ”€โ”€ server.py        # Main MCP server with 54 tools
โ”‚   โ”œโ”€โ”€ _helpers.py      # Shared helpers: run_search, run_service, TOOL_ANNOTATIONS
โ”‚   โ”œโ”€โ”€ cache.py         # Intelligent per-tool TTL caching (~183 lines)
โ”‚   โ”œโ”€โ”€ resolver.py      # Korean law name/abbreviation resolution (~225 lines)
โ”‚   โ”œโ”€โ”€ http_server.py   # HTTP/SSE server for Kakao PlayMCP
โ”‚   โ”œโ”€โ”€ stdio_server.py  # Stdio transport entry point
โ”‚   โ”œโ”€โ”€ params.py        # Parameter resolution & mapping
โ”‚   โ”œโ”€โ”€ validation.py    # Input validation
โ”‚   โ”œโ”€โ”€ parser.py        # XML parsing utilities
โ”‚   โ”œโ”€โ”€ ranking.py       # Relevance ranking
โ”‚   โ”œโ”€โ”€ citation.py      # Article citation extraction (Phase 4)
โ”‚   โ”œโ”€โ”€ client.py        # HTTP client for law.go.kr API
โ”‚   โ”œโ”€โ”€ errors.py        # Error codes & responses
โ”‚   โ”œโ”€โ”€ raw_logger.py    # PlayMCP traffic logging
โ”‚   โ””โ”€โ”€ log_processor.py # Log format converter
โ”œโ”€โ”€ logs/playmcp/         # PlayMCP traffic logs (daily JSONL)
โ”œโ”€โ”€ pyproject.toml        # Project configuration
โ””โ”€โ”€ README.md             # This file

Running Tests

# Install test dependencies
uv sync

# Run all tests
uv run pytest

# Run with coverage
uv run pytest --cov=src/lexlink --cov-report=html

# Run specific test category
uv run pytest -m unit
uv run pytest -m integration
uv run pytest -m e2e

Adding New Tools

Current Status: 54/54 tools implemented (Phase 1-9 complete). Phase 1-5 tools validated.

For implementing additional tools from the 124+ remaining APIs:

  1. Follow the pattern established in src/lexlink/server.py

  2. Use ctx: Context = None parameter for MCP logging/progress

  3. Use generic parser functions (extract_items_list, update_items_list)

  4. Add semantic validation tests

Tool Implementation Pattern:

  • Each tool is a decorated function with MCP schema

  • Uses ctx: Context = None parameter for MCP context

  • 2-tier OC resolution: tool arg > env var

  • Generic parser functions work with any XML tag

  • Comprehensive error handling with actionable hints

Deployment

Deploy to Kakao PlayMCP (HTTP Server)

LexLink can also be deployed as an HTTP server for platforms like Kakao PlayMCP.

Important: Kakao PlayMCP does not accept port numbers in URLs. You must use Nginx as a reverse proxy to serve on port 80.

Quick Start (Local Testing):

# Run the HTTP server
OC=your_oc uv run serve

# Server starts at: http://localhost:8000/sse

Production Setup:

Internet โ†’ Nginx (port 80) โ†’ LexLink (port 8000)

PlayMCP Registration:

Field

Value

MCP Endpoint

http://YOUR_SERVER_IP/sse (no port!)

Authentication

Key/Token (Header: OC)

For detailed deployment instructions (AWS EC2, Nginx, systemd, HTTPS), see docs/DEPLOYMENT_GUIDE.md.

PlayMCP Traffic Logging

LexLink includes built-in logging for PlayMCP traffic analysis. Logs are saved in dashboard-compatible JSONL format.

Log Location: logs/playmcp/YYYY-MM-DD.jsonl

Log Schema:

{
  "rpc_id": "3",
  "request_id": "d8ee45eb",
  "session_id": "9ff9dc23431848a4901b4cb6326ba5bd",
  "timestamp": "2025-12-25T05:40:23.957987",
  "duration_ms": 1.52,
  "method": "tools/call",
  "tool_name": "aiSearch",
  "params": { "arguments": {"query": "๋บ‘์†Œ๋‹ˆ ์ฒ˜๋ฒŒ"} },
  "client": "PlayMCP",
  "client_version": "2025.0.0",
  "protocol_version": "2025-06-18",
  "client_ip": "220.64.111.219",
  "oc": "user_id",
  "status": "success",
  "status_code": 200,
  "result": { ... }
}

Features:

  • Daily log rotation (one file per day)

  • Dashboard-compatible format for filtering and analysis

  • Captures request/response pairs with timing

  • SSE streaming response parsing

Converting Old Raw Logs:

uv run python -m lexlink.log_processor input.jsonl output.jsonl

Troubleshooting

"OC parameter is required" error

Solution: Set your OC identifier using one of the three methods above.

Korean characters not displaying correctly

Solution: Ensure your terminal supports UTF-8:

export PYTHONIOENCODING=utf-8

"Timeout" errors

Solution: Increase timeout via environment variable:

export LEXLINK_TIMEOUT=90  # Increase from default 60s

Server won't start after updating dependencies

Solution: Re-sync dependencies:

uv sync --reinstall

Contributing

Contributions are welcome! Please:

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/amazing-feature)

  3. Write tests for new functionality

  4. Ensure all tests pass (uv run pytest)

  5. Commit changes (git commit -m 'Add amazing feature')

  6. Push to branch (git push origin feature/amazing-feature)

  7. Open a Pull Request

License

This project is open source. See LICENSE file for details.

Acknowledgments

  • law.go.kr - Korean National Law Information API

  • MCP - Model Context Protocol by Anthropic

  • korean-law-mcp - Inspiration for caching, law name resolution, and chain tools (Phase 9)

Support


Changelog

v2.1.0 - 2026-03-30

New: Caching, Law Name Resolution, Chain Tools (Phase 9)

  • Added intelligent per-tool TTL caching (cache.py): search 1hr, articles 24hr, AI search 30min

  • Added law name/abbreviation resolution (resolver.py): 52 seed aliases + dynamic learning

  • Added 5 Phase 9 chain tools: chain_full_research, chain_amendment_track, chain_dispute_prep, chain_law_system, cache_stats

  • Inspired by korean-law-mcp

  • See CHANGELOG.md for full details

v2.0.0 - 2026-03-30

Major Release: Phase 7 Tools, JSON Default, sections Parameter

  • Added 18 new Phase 7 tools (์ž์น˜๋ฒ•๊ทœ, ์กฐ์•ฝ, ๋ฒ•๋ น์ •๋ณด ์ง€์‹๋ฒ ์ด์Šค, ์œ„์›ํšŒ ๊ฒฐ์ •๋ฌธ, ์ค‘์•™๋ถ€์ฒ˜ ํ•ด์„, ํŠน๋ณ„ํ–‰์ •์‹ฌํŒ)

  • JSON is now the default response format (was XML)

  • Added sections="summary" parameter for case law service tools

  • Refactored shared logic into _helpers.py

  • See CHANGELOG.md for full details

v1.5.0 - 2026-02-28

Refactor: Remove Smithery Dependency

  • Removed smithery package and 8 transitive dependencies

  • Simplified OC resolution to 2-tier (tool arg > env var)

  • Added stdio_server.py entry point for stdio transport

  • See CHANGELOG.md for full details

For the full changelog (v1.0.0 โ€“ v2.1.0), see CHANGELOG.md.


Powered by MCP

Available Tools

54 tools
admrul_serviceA
Read-onlyIdempotent

Retrieve administrative rule full text (ํ–‰์ •๊ทœ์น™ ๋ณธ๋ฌธ ์กฐํšŒ).

This tool retrieves the complete text of Korean administrative rules. Includes rule content, addenda, and annexes (forms/attachments).

Args: id: Rule sequence number (required if lid/lm not provided) lid: Rule ID (alternative to id) lm: Rule name (exact match search) oc: Optional OC override (defaults to env var) type: Response format - "JSON" (default), "XML", or "HTML" ctx: MCP context (injected automatically)

Returns: Full administrative rule text with content and annexes or error

Examples: Retrieve by ID: >>> admrul_service(id="62505", type="XML")

Retrieve by LID:
>>> admrul_service(lid="10000005747", type="XML")
ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
lmNo
ocNo
lidNo
typeNoJSON

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, and the description consistently describes a retrieval operation. It adds useful behavioral context by specifying that the response includes content, addenda, and annexes, and that errors may occur, which goes beyond the annotation-only information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a concise summary, an explicit Args list, Returns note, and examples. Every sentence adds value, and the bilingual heading is efficient. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only retrieval tool with no output schema, the description covers purpose, all parameter semantics, return content (full text with annexes), error behavior, and usage examples. This is complete enough for an agent to invoke the tool correctly without additional information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description fully compensates by explaining each parameter: id (required if lid/lm not provided), lid (alternative), lm (exact match), oc (override), and type (format with default). This gives the agent complete understanding of all five parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Retrieve administrative rule full text' with a specific verb and resource, and further specifies that it includes rule content, addenda, and annexes. This distinguishes it from sibling search tools like admrul_search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool (to retrieve full administrative rule text) and explains the alternative parameter selection via id, lid, or lm. It includes concrete examples but does not explicitly contrast with search tools or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

aiSearchA
Read-onlyIdempotent

โญ PREFERRED TOOL for vague or natural language queries. Use this FIRST when user's intent is unclear or conversational.

์ง€๋Šฅํ˜• ๋ฒ•๋ น๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ ๊ฒ€์ƒ‰ API (AI-powered semantic law search).

Uses intelligent/semantic search to find relevant law articles. Returns FULL ARTICLE TEXT (์กฐ๋ฌธ๋‚ด์šฉ) - more comprehensive than eflaw_search.

Best for: Natural language queries like "๋บ‘์†Œ๋‹ˆ ์ฒ˜๋ฒŒ", "์Œ์ฃผ์šด์ „ ๋ฒŒ๊ธˆ"

Args: query: Search query (natural language supported, e.g., "๋บ‘์†Œ๋‹ˆ ์ฒ˜๋ฒŒ") search: Search scope: - 0: ๋ฒ•๋ น์กฐ๋ฌธ (law articles, default) - 1: ๋ฒ•๋ น ๋ณ„ํ‘œยท์„œ์‹ (law appendix/forms) - 2: ํ–‰์ •๊ทœ์น™ ์กฐ๋ฌธ (administrative rule articles) - 3: ํ–‰์ •๊ทœ์น™ ๋ณ„ํ‘œยท์„œ์‹ (administrative rule appendix/forms) display: Results per page (default 20) page: Page number (default 1) oc: Optional OC override type: Response format - "JSON" (default), "XML", or "HTML"

Returns: AI search results with full article text (๋ฒ•๋ น์กฐ๋ฌธ items with ์กฐ๋ฌธ๋‚ด์šฉ)

Example: >>> aiSearch(query="๋บ‘์†Œ๋‹ˆ ์ฒ˜๋ฒŒ", search=0) # Returns: ํŠน์ •๋ฒ”์ฃ„ ๊ฐ€์ค‘์ฒ˜๋ฒŒ ๋“ฑ์— ๊ด€ํ•œ ๋ฒ•๋ฅ  ์ œ5์กฐ์˜3 (๋„์ฃผ์ฐจ๋Ÿ‰ ์šด์ „์ž์˜ ๊ฐ€์ค‘์ฒ˜๋ฒŒ)

ParametersJSON Schema
NameRequiredDescriptionDefault
ocNo
pageNo
typeNoJSON
queryYes
searchNo
displayNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that it uses semantic search and returns full article text, and explains the search scope options that change behavior. It includes an example return value. However, it contains an inconsistency regarding default display value (description says 20, schema says 7), which slightly undermines transparency. Annotations already declare it read-only and idempotent, so no conflict.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with sections for usage, arguments, returns, and an example. It is front-loaded with a strong recommendation and includes useful details without excessive fluff. The minor default value discrepancy is a small deduct.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter tool with no output schema, the description covers usage guidance, parameter meanings, return summary, and an annotated example. It lacks detailed response structure but provides sufficient context for a typical AI agent. The sibling comparison and scoping options add completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description provides essential meaning for all 6 parameters: query (natural language), search (four scope enums), display, page, oc, and type. It gives a concrete query example and explains search scope values, though the default for display is incorrect compared to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is an AI-powered semantic law search tool that returns full article text, and explicitly distinguishes itself from eflaw_search by being more comprehensive. It also positions itself as the preferred tool for vague queries, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs to use this tool first when intent is unclear or conversational, and provides example natural language queries like '๋บ‘์†Œ๋‹ˆ ์ฒ˜๋ฒŒ'. It also references eflaw_search as an alternative for comparison, though it lacks explicit 'when not to use' exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

article_amendment_diffA
Read-onlyIdempotent

Compare how a specific article changed between two law versions (์กฐ๋ฌธ ์‹ ๊ตฌ๋Œ€์กฐ).

Use MST values from law_amendment_summary to compare article text across revisions.

Args: mst_old: MST of the older version (๋ฒ•๋ น์ผ๋ จ๋ฒˆํ˜ธ, from law_amendment_summary) mst_new: MST of the newer version article: Article number (e.g., 52 for ์ œ52์กฐ) article_branch: Branch number (e.g., 2 for ์ œ52์กฐ์˜2, default 0) oc: Optional OC override type: Response format - "JSON" (default), "XML", or "HTML"

Returns: Side-by-side comparison with line-level diff

Examples: >>> article_amendment_diff(mst_old="269000", mst_new="273000", article=52)

ParametersJSON Schema
NameRequiredDescriptionDefault
ocNo
typeNoJSON
articleYes
mst_newYes
mst_oldYes
article_branchNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly, idempotent, and non-destructive behavior. The description adds valuable context by specifying what is compared (article text across revisions) and the output format (side-by-side line-level diff), which goes beyond annotation information. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a one-sentence purpose, a usage tip, a clear Args list, a Returns section, and an example. Every line adds value; there is no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter tool with no output schema, the description is complete: it documents all parameters, return format, provides a concrete example, and explains the prerequisite relationship with law_amendment_summary. This is sufficient for an agent to invoke the tool correctly without additional information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully document parameters. It explains all 6 parameters: mst_old (older version, from law_amendment_summary), mst_new (newer version), article (number with example), article_branch (branch number with example and default), oc (optional override), and type (format with default and options). The example call further clarifies usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action ('Compare how a specific article changed between two law versions') with a resource (specific article, two MST versions). It distinguishes from siblings by referencing MST values from law_amendment_summary, making its role in the workflow explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: 'Use MST values from law_amendment_summary to compare article text across revisions.' This implies a prerequisite workflow and tells users where to obtain the required MST parameters. It does not explicitly list alternative tools or when not to use, but the context is strong enough for correct usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

article_citationA
Read-onlyIdempotent

Extract citations from a law article (์กฐ๋ฌธ ์ธ์šฉ ์กฐํšŒ).

This tool extracts all legal citations referenced by a specific law article. It parses the official hyperlinked citations from law.go.kr HTML pages, providing 100% accurate citation data with zero API cost.

The tool identifies:

  • External citations (references to other laws)

  • Internal citations (references within the same law)

  • Article, paragraph, and item level references

Args: mst: Law MST code (๋ฒ•๋ น์ผ๋ จ๋ฒˆํ˜ธ) - get this from eflaw_search or law_search results law_name: Law name in Korean (e.g., "์ž๋ณธ์‹œ์žฅ๊ณผ ๊ธˆ์œตํˆฌ์ž์—…์— ๊ด€ํ•œ ๋ฒ•๋ฅ ") article: Article number (์กฐ๋ฒˆํ˜ธ, e.g., 3 for ์ œ3์กฐ) article_branch: Article branch number (์กฐ๊ฐ€์ง€๋ฒˆํ˜ธ, e.g., 2 for ์ œ37์กฐ์˜2, default 0) oc: Optional OC override (defaults to env var)

Returns: Citation extraction result with: - success: Whether extraction succeeded - law_id: MST code - law_name: Law name - article: Article display (e.g., "์ œ3์กฐ" or "์ œ37์กฐ์˜2") - citation_count: Total number of citations found - citations: List of citation objects with target law, article, paragraph, item - internal_count: Number of same-law citations - external_count: Number of other-law citations

Examples: Get citations from ์ž๋ณธ์‹œ์žฅ๋ฒ• ์ œ3์กฐ: >>> article_citation( ... mst="268611", ... law_name="์ž๋ณธ์‹œ์žฅ๊ณผ ๊ธˆ์œตํˆฌ์ž์—…์— ๊ด€ํ•œ ๋ฒ•๋ฅ ", ... article=3 ... )

Get citations from ๊ฑด์ถ•๋ฒ• ์ œ37์กฐ์˜2:
>>> article_citation(
...     mst="270986",
...     law_name="๊ฑด์ถ•๋ฒ•",
...     article=37,
...     article_branch=2
... )

Workflow: 1. First use eflaw_search(query="๋ฒ•๋ช…") to find the law and get MST 2. Then use article_citation(mst=..., law_name=..., article=...) to get citations 3. Optionally use eflaw_service to get the full article text

ParametersJSON Schema
NameRequiredDescriptionDefault
ocNo
mstYes
articleYes
law_nameYes
article_branchNo

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds that it parses HTML pages from law.go.kr, implying a web-scraping mechanism that could be fragile. It also claims '100% accurate citation data with zero API cost,' which is useful operational context. However, it does not disclose potential rate limits or failure modes of scraping, so it doesn't fully cover behavioral risks.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Args, Returns, Examples, Workflow) and is appropriately sized for the tool's complexity. It front-loads the purpose and uses concise bullet-like formatting. Each sentence adds value, including practical examples and workflow guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully explains return values including success, law_id, law_name, article, citation_count, citations, internal_count, and external_count. It also provides two complete usage examples and a workflow that integrates with sibling tools. For a tool of this complexity, the description is comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has no parameter descriptions (0% coverage), so the description must explain all parameters. It does so thoroughly: mst is defined as Law MST code with guidance to get from search results, law_name with a Korean example, article with example '3 for ์ œ3์กฐ', article_branch with default 0 and example '2 for ์ œ37์กฐ์˜2', and oc as an optional override defaulting to env var. This exceeds basic schema information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Extract citations from a law article' and specifies it extracts all legal citations referenced by a specific law article. It distinguishes from siblings by detailing the scraping of official hyperlinked citations from law.go.kr HTML pages and listing internal/external citation types, making it unique among the many search/service tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an explicit workflow: 'First use eflaw_search... Then use article_citation... Optionally use eflaw_service to get the full article text.' It also tells users where to get the mst parameter ('get this from eflaw_search or law_search results'), clearly situating this tool relative to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cache_statsA
Read-onlyIdempotent

Show cache and resolver statistics (์บ์‹œ ํ†ต๊ณ„).

Returns current cache hit rate, entry count, and law name resolver stats. Useful for monitoring server performance.

Returns: Cache statistics and resolver stats

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description adds value by enumerating the returned data: 'cache hit rate, entry count, and law name resolver stats.' No contradiction with annotations; it supplements them with behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded, but the final 'Returns:' block redundantly restates what was already mentioned in the first paragraph. Minor waste, but overall efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple, zero-parameter, read-only statistics tool. The description adequately explains what it returns and its purpose, and annotations cover the safety profile. Nothing significant is missing given the tool's low complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema coverage is trivially 100%. According to the rubric, 0 parameters earns a baseline of 4, and the description does not need to add parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Show cache and resolver statistics' with a specific verb and resource, and it uniquely distinguishes this tool from all sibling tools that are search/service related. The Korean translation adds clarity for localized users.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context with 'Useful for monitoring server performance,' indicating an appropriate use case. However, it does not explicitly state when not to use it or mention alternatives, though no siblings serve a similar purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cgm_expc_serviceA
Read-onlyIdempotent

Retrieve ministry interpretation full text (์ค‘์•™๋ถ€์ฒ˜ 1์ฐจ ํ•ด์„ ๋ณธ๋ฌธ ์กฐํšŒ).

Args: ministry: Ministry name (same values as cgm_expc_search) id: Interpretation serial number (ํ•ด์„๋ก€์ผ๋ จ๋ฒˆํ˜ธ) oc: Optional OC override type: Response format - "JSON" (default), "XML", or "HTML" ctx: MCP context (injected automatically)

Returns: Full interpretation text or error

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
ocNo
typeNoJSON
ministryYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds context about response formats (JSON/XML/HTML), the OC override, and the return value ('full interpretation text or error'), but does not explain behaviors like error conditions, rate limits, or the meaning of OC. This is modest value beyond annotations but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the main purpose and uses a clean Arg/Returns structure. It is compact with no redundant sentences; every line serves a purpose, including the helpful reference to cgm_expc_search for ministry values.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple fetch tool with 4 params and no output schema, the description covers the core contract: what it does, what the inputs mean, and what it returns. It does not explain OC or detailed error conditions, but those are minor gaps given the tool's simplicity and the presence of read-only annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description adds meaningful context for each parameter: ministry references sibling search values, id is the serial number, type specifies response format with default, and ctx is injected automatically. The oc parameter remains vague ('Optional OC override'), but overall the description compensates well for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves full text of ministry interpretations, using a specific verb and resource ('Retrieve ministry interpretation full text'). It distinguishes from sibling search tools (e.g., cgm_expc_search) by emphasizing 'full text' and requiring an id, making the fetch operation unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied through the parameters (ministry + id) and the phrase 'full text', suggesting this is used to fetch details after a search. However, there is no explicit guidance on when to use this versus alternatives, no exclusions, and no mention of typical workflow steps (e.g., 'first search with cgm_expc_search').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chain_amendment_trackA
Read-onlyIdempotent

Track law amendment history with optional article-level diff (๋ฒ•๋ น ๊ฐœ์ • ์ถ”์ ).

Chains: amendment summary โ†’ article diff between latest two versions. If article=0, returns only the revision list. If article is specified, also diffs that article between the two most recent revisions.

Args: law_name: Law name (e.g., "๊ทผ๋กœ๊ธฐ์ค€๋ฒ•") article: Article number to diff (0 = summary only, e.g., 52 for ์ œ52์กฐ) date_from: Start date YYYYMMDD (default "20200101") date_to: End date YYYYMMDD (default "20261231") oc: Optional OC override type: Response format

Returns: Revision history and optional article diff

Examples: >>> chain_amendment_track(law_name="๊ทผ๋กœ๊ธฐ์ค€๋ฒ•") >>> chain_amendment_track(law_name="๊ทผ๋กœ๊ธฐ์ค€๋ฒ•", article=52, date_from="20180101")

ParametersJSON Schema
NameRequiredDescriptionDefault
ocNo
typeNoJSON
articleNo
date_toNo20261231
law_nameYes
date_fromNo20200101

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool read-only, idempotent, and non-destructive. The description adds behavioral context by explaining the chaining behavior, the two distinct modes, and the date range defaults, which goes beyond what annotations alone provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear opening sentence, an Args section, a Returns section, and examples. Every line earns its place and the examples concretely demonstrate invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since no output schema exists, the Returns line plus mode descriptions provide necessary context. It could be clearer on how date range interacts with 'latest two versions' and what 'Response format' means, but overall it is complete enough for a 6-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description documents all six parameters with meanings and defaults. The law_name example and article explanation (0=summary, 52=์ œ52์กฐ) are especially helpful. oc and type remain terse, but they are at least identified as an override and response format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Track') and resource ('law amendment history') and adds optional article-level diff. It distinguishes itself from sibling tools by framing this as a chained operation that combines amendment summary and article diff.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear conditional usage: article=0 returns only the revision list, while a specified article triggers a diff between the two most recent revisions. However, it does not explicitly compare this tool to alternatives like law_amendment_summary or article_amendment_diff.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chain_dispute_prepA
Read-onlyIdempotent

Prepare for a legal dispute by gathering all case law (๋ถ„์Ÿ ์ค€๋น„ ์ž๋ฃŒ).

Chains: precedent search + admin appeals + constitutional decisions + special tribunal. Gathers all decision-type legal sources in one call.

Args: query: Dispute topic (e.g., "๋ถ€๋‹นํ•ด๊ณ ", "๊ฐœ์ธ์ •๋ณด ์œ ์ถœ", "์กฐ์„ธ ๋ถ€๊ณผ ์ทจ์†Œ") display: Results per category (default 5) oc: Optional OC override type: Response format

Returns: Precedents, admin appeals, constitutional decisions, and special tribunal decisions

Examples: >>> chain_dispute_prep(query="๋ถ€๋‹นํ•ด๊ณ ") >>> chain_dispute_prep(query="๊ฐœ์ธ์ •๋ณด ์œ ์ถœ ๊ณผ์ง•๊ธˆ")

ParametersJSON Schema
NameRequiredDescriptionDefault
ocNo
typeNoJSON
queryYes
displayNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only/idempotent behavior. The description adds valuable context by revealing that the tool chains multiple sub-searches and aggregates results per category, which goes beyond the annotations. It does not discuss rate limits or detailed response structure, but the added behavioral detail is meaningful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized and concise, including a purpose summary, chain breakdown, parameter list, return summary, and examples. Every section contributes value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a chained tool with no output schema, the description provides essential information: return categories and invocation examples. It does not specify the exact response structure (e.g., how results are grouped), but the mention of 'results per category' offers some hint. Overall, it is sufficient for selecting and invoking the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description compensates by explaining all four parameters: query with examples, display as per-category count, oc as an optional override, and type as response format. The explanations for oc and type are slightly vague, preventing a higher score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to prepare for a legal dispute by gathering all decision-type case law. It explicitly enumerates the chained sources (precedent search, admin appeals, constitutional decisions, special tribunal), which distinguishes it from single-source sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear context for use: when preparing for a legal dispute and needing all decision-type legal sources in one call. It does not explicitly name alternative tools for single-source needs, but the composite nature is evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chain_full_researchA
Read-onlyIdempotent

Complete legal research in one call (์ข…ํ•ฉ ๋ฒ•๋ฅ  ์กฐ์‚ฌ).

Chains: AI search โ†’ statutes โ†’ precedents with outcome analysis โ†’ interpretations โ†’ citations. This is the most comprehensive single-call research tool.

Args: query: Natural language query (e.g., "์Œ์ฃผ์šด์ „ ์ฒ˜๋ฒŒ ๊ธฐ์ค€", "์ž„๋Œ€์ฐจ ๋ณด์ฆ๊ธˆ ๋ฐ˜ํ™˜") display: Results per sub-query (default 5) oc: Optional OC override type: Response format

Returns: Combined legal analysis with statutes, precedent statistics, interpretations, and citations

Examples: >>> chain_full_research(query="๋ถ€๋‹นํ•ด๊ณ  ๊ตฌ์ œ") >>> chain_full_research(query="๊ฐœ์ธ์ •๋ณด ์œ ์ถœ ์‹ ๊ณ  ์˜๋ฌด")

ParametersJSON Schema
NameRequiredDescriptionDefault
ocNo
typeNoJSON
queryYes
displayNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint, so safety is covered. The description adds value by disclosing the internal chain pipeline and the combined return structure (statutes, precedent statistics, interpretations, citations), which is behavioral context beyond annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a one-line summary, then uses clear sections (Chains, Args, Returns, Examples). Every sentence adds useful information, and the structure is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (chaining multiple research steps) and lack of an output schema, the description adequately explains the input parameters, return value, and provides usage examples. It is sufficient for an agent to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description's Args section must compensate. It does: it explains query (with examples), display (results per sub-query), oc (optional override), and type (response format). While 'OC' is cryptic, overall it adds meaningful semantics beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Complete legal research in one call' and enumerates a specific chain (AI search โ†’ statutes โ†’ precedents with outcome analysis โ†’ interpretations โ†’ citations), clearly stating it is the most comprehensive single-call research tool. This distinguishes it from sibling search and chain tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'most comprehensive single-call research tool' provides clear context for when to use it (comprehensive research), and examples show intended queries. However, it does not explicitly name alternative tools for simpler needs, so it lacks explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chain_law_systemA
Read-onlyIdempotent

Map the full law system hierarchy (๋ฒ•๋ น ์ฒด๊ณ„ ์กฐํšŒ).

Chains: law search โ†’ delegation tree โ†’ related admin rules โ†’ linked ordinances. Shows how a law connects to its subordinate regulations.

Args: law_name: Law name (e.g., "๊ฑด์ถ•๋ฒ•", "๊ทผ๋กœ๊ธฐ์ค€๋ฒ•") oc: Optional OC override type: Response format

Returns: Law hierarchy: parent law, delegated decrees/rules, linked ordinances

Examples: >>> chain_law_system(law_name="๊ฑด์ถ•๋ฒ•") >>> chain_law_system(law_name="๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ๋ฒ•")

ParametersJSON Schema
NameRequiredDescriptionDefault
ocNo
typeNoJSON
law_nameYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description doesn't need to repeat that. The description adds valuable behavioral context beyond annotations by revealing that the tool performs a multi-step chain (law search โ†’ delegation tree โ†’ related admin rules โ†’ linked ordinances) and returns a structured hierarchy. This informs the agent about potential complexity and the nature of the result, which is beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is excellently structured: it opens with a one-line purpose, then a chain breakdown, followed by Args, Returns, and Examples. Every sentence earns its place, with no redundancy or filler. It is concise yet comprehensive, using bullet-like formatting that is easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has a moderate complexity (chaining multiple lookups) and no output schema. The description covers the purpose, the chain process, each parameter, the return structure, and provides multiple examples. This is nearly complete. However, it lacks details on edge cases (e.g., what if a law has no subordinate regulations) and does not clarify how this tool relates to sibling chain tools like chain_full_research, which would enhance completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does provide an Args block that explains each parameter: law_name with examples, oc as 'Optional OC override', and type as 'Response format'. This adds some meaning beyond the bare schema, but 'OC override' is cryptic and 'Response format' is vague without enumerating allowed values. The examples help for law_name, but the overall parameter semantics are only partially clarified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb 'Map' and a concrete resource: the full law system hierarchy. It further breaks down the chain steps (law search โ†’ delegation tree โ†’ related admin rules โ†’ linked ordinances), which distinguishes it from sibling chain tools like chain_amendment_track or chain_dispute_prep. This is a specific, non-tautological statement that tells the agent exactly what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a clear use case: 'Shows how a law connects to its subordinate regulations.' This provides clear context for when to use the tool. However, it does not explicitly exclude alternative tools or name them as alternatives, which would have pushed the score to 5. It is more than just implied usage because the chain description signals its unique role among related tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_precedent_oddsA
Read-onlyIdempotent

Find precedent statistics and key outcome factors for a legal question (ํŒ๋ก€ ์Šน๋ฅ  ๋ถ„์„).

Searches court precedents, analyzes outcomes (์ธ์šฉ/๊ธฐ๊ฐ/ํŒŒ๊ธฐ), and extracts key factors that influenced decisions. Useful for assessing legal odds.

Args: query: Legal question or keywords (e.g., "ํƒ๋ฐฐ ํŒŒ์† ๋ณด์ƒ", "์ž„๋Œ€์ฐจ ๋ณด์ฆ๊ธˆ ๋ฐ˜ํ™˜") display: Number of precedents to search (max 100, default 20) top_n: Number of top precedents to analyze in detail (default 5) oc: Optional OC override type: Response format - "JSON" (default), "XML", or "HTML"

Returns: Outcome statistics, key factors, and representative case summaries

Examples: >>> check_precedent_odds(query="ํƒ๋ฐฐ ํŒŒ์† ๋ณด์ƒ") >>> check_precedent_odds(query="๋ถ€๋‹นํ•ด๊ณ ", display=50, top_n=10)

ParametersJSON Schema
NameRequiredDescriptionDefault
ocNo
typeNoJSON
queryYes
top_nNo
displayNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds valuable context about the tool's behavior: it searches precedents, analyzes outcomes (์ธ์šฉ/๊ธฐ๊ฐ/ํŒŒ๊ธฐ), and extracts key factors. The Returns section also clarifies what the agent can expect. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections for purpose, arguments, returns, and examples. It is front-loaded with a concise overview and each sentence in the Args section adds necessary detail. No redundant content, and the format is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, parameter details, return summary, and examples. It lacks deeper details like error handling, jurisdiction, or analysis methodology, but given the tool's moderate complexity and strong annotations, this is sufficient for an agent to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description effectively compensates by explaining each parameter in the Args section: query, display, top_n, oc, and type. It provides meanings, defaults, and examples (e.g., display max 100, default 20; type options JSON/XML/HTML). This far exceeds what the schema offers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Find precedent statistics and key outcome factors for a legal question' and distinguishes it from sibling search tools by emphasizing outcome analysis and 'legal odds'. The verb 'Find' is specific, and the scope is well-defined, setting it apart from general precedent search tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: 'Useful for assessing legal odds' indicates when to use it. However, it does not explicitly mention alternatives or when not to use it, missing a bit of exclusions. This is still sufficient for an agent to identify the appropriate use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

committee_serviceA
Read-onlyIdempotent

Retrieve committee decision full text (์œ„์›ํšŒ ๊ฒฐ์ •๋ฌธ ๋ณธ๋ฌธ ์กฐํšŒ).

Args: committee: Committee name (same values as committee_search) id: Decision serial number (๊ฒฐ์ •๋ฌธ์ผ๋ จ๋ฒˆํ˜ธ) oc: Optional OC override type: Response format - "JSON" (default), "XML", or "HTML" ctx: MCP context (injected automatically)

Returns: Full decision text or error

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
ocNo
typeNoJSON
committeeYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to repeat safety traits. It adds minor context: 'ctx: MCP context (injected automatically)' and 'Returns: Full decision text or error'. This provides a bit of behavioral detail (auto-injection, error possibility) but does not go beyond what annotations already cover in terms of side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a purpose line, an args list, and a returns line. It is concise and easy to scan, with no unnecessary words. The inclusion of a Korean translation adds clarity for the target domain, and the list format aids quick parsing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (read-only retrieval with four simple parameters and no output schema), the description is largely complete: it specifies the return type and error possibility. It does not detail potential error scenarios or page limitations, but for a straightforward read action, this level of detail is sufficient. The lack of an output schema is partially mitigated by the explicit 'Returns' line.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by explaining all four parameters: committee (same as committee_search), id (decision serial number), oc (optional override), and type (JSON/XML/HTML). This goes beyond the schema's bare types. However, 'oc' remains vague ('OC override' without elaboration), which prevents a full score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Retrieve committee decision full text' with a Korean equivalent. It specifies the resource (committee decisions) and the action (retrieve full text), and distinguishes it from sibling tools like committee_search which likely handles searching. The phrase 'full text' clarifies the output granularity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context by noting 'committee: Committee name (same values as committee_search)', linking it to its search sibling. However, it does not explicitly state when to use this tool versus alternatives (e.g., 'use after committee_search to retrieve details') or any exclusions. The guidance is more inferred than directly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

decc_serviceA
Read-onlyIdempotent

Retrieve administrative appeal decision full text (ํ–‰์ •์‹ฌํŒ๋ก€ ๋ณธ๋ฌธ ์กฐํšŒ).

This tool retrieves the complete text of Korean administrative appeal decisions. Includes case details, disposition information, decision summary, and reasoning.

Args: id: Decision sequence number (required) lm: Decision name (optional) sections: "summary" to exclude ์ด์œ  (detailed reasoning), or "full"/None for everything. Returns ์‚ฌ๊ฑด๋ช…, ์ฒญ๊ตฌ์ทจ์ง€, ์žฌ๊ฒฐ์š”์ง€, ์ฃผ๋ฌธ in summary mode. oc: Optional OC override (defaults to env var) type: Response format - "JSON" (default), "XML", or "HTML" ctx: MCP context (injected automatically)

Returns: Full administrative appeal decision text with details or error

Examples: Retrieve by ID: >>> decc_service(id="243263", type="XML")

Retrieve with case name:
>>> decc_service(id="245011", lm="๊ณผ์ง•๊ธˆ ๋ถ€๊ณผ์ฒ˜๋ถ„ ์ทจ์†Œ์ฒญ๊ตฌ", type="XML")
ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
lmNo
ocNo
typeNoJSON
sectionsNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only and idempotent, and the description adds valuable behavioral context: the 'sections' parameter controls whether reasoning is excluded, the summary mode returns specific fields (์‚ฌ๊ฑด๋ช…, ์ฒญ๊ตฌ์ทจ์ง€, ์žฌ๊ฒฐ์š”์ง€, ์ฃผ๋ฌธ), and the 'type' parameter selects response format. It also mentions error returns. This goes beyond annotation basics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with an intro, args list, returns, and examples. It is moderately sized but every part adds value, including the Korean title and two usage examples that demonstrate both minimal and more complex calls.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of an output schema and five parameters, the description is quite complete: it explains what is returned, the effect of sections, response formats, and optional overrides. The only minor gap is not explaining how to obtain an ID if it is unknown, but for a service tool this is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully explains every parameter (id, lm, sections, oc, type, ctx) with values, defaults, and behavior. The sections parameter is especially well documented, listing both modes and the fields returned in summary mode.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves the full text of Korean administrative appeal decisions, with a specific verb ('Retrieve') and resource. It distinguishes from sibling search tools like decc_search by focusing on full-text service rather than searching.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through examples: retrieve by ID or with an optional case name. It hints at when to use this tool (when you have a decision sequence number) but doesn't explicitly contrast with alternatives like decc_search or admrul_service. Could be improved by stating 'use decc_search to find IDs first.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

detc_serviceA
Read-onlyIdempotent

Retrieve Constitutional Court decision full text (ํ—Œ์žฌ๊ฒฐ์ •๋ก€ ๋ณธ๋ฌธ ์กฐํšŒ).

Args: id: Constitutional Court decision sequence number (ํ—Œ์žฌ๊ฒฐ์ •๋ก€์ผ๋ จ๋ฒˆํ˜ธ) lm: Decision name (optional) sections: "summary" to exclude ์ „๋ฌธ (full text), or "full"/None for everything. Recommended: "summary" for PlayMCP to stay under 20KB. oc: Optional OC override type: Response format - "JSON" (default), "XML", or "HTML"

Returns: Full Constitutional Court decision text or error

Examples: >>> detc_service(id="58386") >>> detc_service(id="58386", sections="summary")

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
lmNo
ocNo
typeNoJSON
sectionsNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly and idempotent behavior. The description adds meaningful context beyond that, such as how the 'sections' parameter alters the payload ('summary' excludes ์ „๋ฌธ), the effect of 'type' on response format, and the 20KB constraint for PlayMCP.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with Args, Returns, and Examples. It is reasonably concise, though the examples and some parameter details could be trimmed without losing essential meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description compensates by stating that the tool returns full decision text or an error. It also gives concrete examples and behavior around response size. It could still mention prerequisites or limitations, but it is complete enough for a read-only retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden. It explains id as a Constitutional Court sequence number, lm as an optional decision name, sections as summary/full mode, and type as JSON/XML/HTML. Only 'oc' remains vague as 'Optional OC override'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Retrieve Constitutional Court decision full text' (ํ—Œ์žฌ๊ฒฐ์ •๋ก€ ๋ณธ๋ฌธ ์กฐํšŒ). This clearly distinguishes detc_service from sibling search tools such as detc_search, and the service pattern is apparent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is implied rather than explicit. It recommends sections='summary' for PlayMCP to stay under 20KB, but it does not explicitly say when to choose this tool over detc_search or other sibling retrieval tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eflaw_josubA
Read-onlyIdempotent

Query specific article/paragraph by effective date (์‹œํ–‰์ผ ๊ธฐ์ค€ ์กฐยทํ•ญยทํ˜ธยท๋ชฉ ์กฐํšŒ).

BEST TOOL for querying specific articles like "์ œ174์กฐ", "์ œ3์กฐ" etc. This returns only the requested article/paragraph, avoiding large full-law responses.

Args: id: Law ID (either id or mst is required) mst: Law serial number (MST) ef_yd: Effective date (YYYYMMDD) - required when using mst jo: Article number in XXXXXX format. Format: first 4 digits = article number (zero-padded), last 2 digits = branch suffix (00=main). Examples: "017400" (์ œ174์กฐ), "017200" (์ œ172์กฐ), "000300" (์ œ3์กฐ), "001502" (์ œ15์กฐ์˜2) hang: Paragraph number (6 digits, e.g., "000100" for ์ œ1ํ•ญ) ho: Item number (6 digits, e.g., "000200" for ์ œ2ํ˜ธ) mok: Subitem (UTF-8 encoded, e.g., "๋‹ค" for ๋‹ค๋ชฉ) oc: Optional OC override (defaults to env var) type: Response format - "JSON" (default), "XML", or "HTML"

Returns: Specific law section content

Examples: Query ์ž๋ณธ์‹œ์žฅ๋ฒ• ์ œ174์กฐ: >>> eflaw_josub(mst="279823", jo="017400", type="XML")

Query ๊ฑด์ถ•๋ฒ• ์ œ3์กฐ ์ œ1ํ•ญ:
>>> eflaw_josub(mst="276925", jo="000300", hang="000100", type="XML")
ParametersJSON Schema
NameRequiredDescriptionDefault
hoNo
idNo
joNo
ocNo
mokNo
mstNo
hangNo
typeNoJSON
ef_ydNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly and idempotent safety. The description adds behavioral context beyond annotations: it states that only the requested article/paragraph is returned, the jo format constraints, and that ef_yd is required when using mst. This gives useful operational expectations without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose, then a clear 'BEST TOOL' statement, parameter explanations, and illustrative examples. Every sentence provides necessary operational detail; there is no fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 9 parameters, no output schema, and no schema descriptions, the description is remarkably complete for selection and invocation. It covers parameter formats, practical examples, and response types. It lacks error-condition details or explicit return-value structure, but these are not essential for basic tool selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries full responsibility for parameter semantics. It explains each parameter (id/mst, ef_yd, jo format with zero-padding and branch suffix, hang, ho, mok encoding, oc override, type) and provides concrete examples for each, making parameter usage clear and unambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'Queries specific article/paragraph by effective date' and identifies itself as the 'BEST TOOL for querying specific articles', which distinguishes it from full-law search siblings. It provides concrete article examples and emphasizes that it returns only the requested section, avoiding large full-law responses.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use this tool (for querying specific articles/paragraphs) and why it is preferable ('avoiding large full-law responses'). However, it does not name specific alternative tools or provide explicit when-not-to-use scenarios, so it falls short of the highest bar for usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eflaw_serviceA
Read-onlyIdempotent

Retrieve full law content by effective date (์‹œํ–‰์ผ ๊ธฐ์ค€ ๋ฒ•๋ น ๋ณธ๋ฌธ ์กฐํšŒ).

Retrieves the complete text of a law organized by effective date.

IMPORTANT: For specific article queries (e.g., "์ œ174์กฐ"), ALWAYS use the jo parameter. Some laws (e.g., ์ž๋ณธ์‹œ์žฅ๋ฒ•) have 400+ articles and the full response can exceed 1MB. Using jo returns only the requested article, which is much faster and cleaner.

Args: id: Law ID (either id or mst is required) mst: Law serial number (MST/lsi_seq) ef_yd: Effective date (YYYYMMDD) - required when using mst jo: REQUIRED for specific articles. Article number in XXXXXX format. Format: first 4 digits = article number (zero-padded), last 2 digits = branch suffix (00=main). Examples: "017400" (์ œ174์กฐ), "017200" (์ œ172์กฐ), "000300" (์ œ3์กฐ), "001502" (์ œ15์กฐ์˜2) chr_cls_cd: Language code - "010202" (Korean, default) or "010201" (Original) oc: Optional OC override (defaults to env var) type: Response format - "JSON" (default), "XML", or "HTML"

Returns: Full law content or specific article content

Examples: Retrieve specific article (RECOMMENDED): >>> eflaw_service(mst="279823", jo="017400", type="XML") # ์ž๋ณธ์‹œ์žฅ๋ฒ• ์ œ174์กฐ

Retrieve full law (WARNING: large response for some laws):
>>> eflaw_service(id="1747", type="XML")
ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
joNo
ocNo
mstNo
typeNoJSON
ef_ydNo
chr_cls_cdNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly and idempotent, but the description adds valuable behavioral context: it warns that some laws produce responses over 1MB, explains that `jo` returns only the requested article for speed and cleanliness, and describes the return types (full law content or specific article content). This goes well beyond annotation data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with an opening summary, an 'IMPORTANT' callout, numbered Args, Returns, and Examples. Each sentence serves a purposeโ€”no fluff. The strong warning is front-loaded to prevent misuse, and the examples make the usage instantly understandable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description covers invocation requirements (id or mst required, ef_yd with mst), the crucial `jo` encoding, response formats (JSON/XML/HTML), and includes examples that demonstrate both recommended and cautionary usage. It is complete enough for an agent to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description compensates thoroughly. It documents every parameter (id, mst, ef_yd, jo, chr_cls_cd, oc, type) with clear meaning, provides the exact `jo` format (zero-padded article number plus branch suffix), and gives concrete examples like '017400' for ์ œ174์กฐ. This is far more informative than the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Retrieve full law content by effective date' and further explains it returns the complete text of a law. It distinguishes itself from search-oriented siblings by focusing on retrieval, and the mention of specific article retrieval via the `jo` parameter adds specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: 'For specific article queries, ALWAYS use the `jo` parameter' and warns about large responses. It also clarifies the id/mst requirement and gives examples of recommended vs. warning-prone usage, effectively telling when to use full retrieval vs. article-specific retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

elaw_serviceA
Read-onlyIdempotent

Retrieve English law full text (์˜๋ฌธ๋ฒ•๋ น ๋ณธ๋ฌธ ์กฐํšŒ).

This tool retrieves the complete text of Korean laws translated to English. Useful for international legal research and cross-border understanding.

Args: id: Law ID (required if mst not provided) mst: Law master number (required if id not provided) lm: Law name (alternative search method) ld: Announcement date (YYYYMMDD) ln: Announcement number oc: Optional OC override (defaults to env var) type: Response format - "JSON" (default), "XML", or "HTML" ctx: MCP context (injected automatically)

Returns: Full English law text with articles or error

Examples: Retrieve by ID: >>> elaw_service(id="000744", type="XML")

Retrieve by MST:
>>> elaw_service(mst="127280", type="XML")
ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
ldNo
lmNo
lnNo
ocNo
mstNo
typeNoJSON

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds useful behavioral details beyond that, such as the 'oc' parameter defaulting to an environment variable, the 'type' response format options (JSON/XML/HTML), and the dependency rules for id/mst. It also describes the return value as 'Full English law text with articles or error.' These additions provide meaningful context without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with an intro, argument list, return statement, and examples. It is moderately long but every section adds value, including the concrete examples. The organization makes it easy to scan, though it could be slightly more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and zero parameter descriptions, the description must be self-contained. It covers all parameters, return behavior, parameter dependencies, and provides two realistic examples. This gives an agent sufficient context to invoke the tool correctly without additional documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero description coverage (0%), so the description carries the full burden. It thoroughly explains each parameter (id, mst, lm, ld, ln, oc, type) with meaningful descriptions and constraints, such as 'required if mst not provided' and 'alternative search method.' Examples further clarify usage. This fully compensates for the schema's lack of property descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Retrieve English law full text' and specifies it retrieves 'the complete text of Korean laws translated to English.' This provides a specific verb and resource. However, it does not explicitly differentiate from sibling tools like eflaw_service or law_service, so it does not achieve a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: 'Useful for international legal research and cross-border understanding.' It also explains input dependencies (id required if mst not provided, etc.) but does not explicitly state when not to use this tool or mention alternative tools, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

expc_serviceA
Read-onlyIdempotent

Retrieve legal interpretation full text (๋ฒ•๋ นํ•ด์„๋ก€ ๋ณธ๋ฌธ ์กฐํšŒ).

This tool retrieves the complete text of a legal interpretation precedent, including the question summary, answer, and reasoning.

Args: id: Legal interpretation sequence number (required) lm: Legal interpretation name (optional) sections: "summary" to exclude ์ด์œ  (detailed reasoning), or "full"/None for everything. Returns ์•ˆ๊ฑด๋ช…, ์งˆ์˜์š”์ง€, ํšŒ๋‹ต in summary mode (~2KB vs ~5KB full). oc: Optional OC override (defaults to env var) type: Response format - "JSON" (default), "XML", or "HTML" ctx: MCP context (injected automatically)

Returns: Full legal interpretation text with question, answer, and reasoning or error

Examples: Retrieve by ID: >>> expc_service(id="334617", type="XML")

Retrieve with name:
>>> expc_service(id="315191", lm="์—ฌ์„ฑ๊ฐ€์กฑ๋ถ€ - ๊ฑด๊ฐ•๊ฐ€์ •๊ธฐ๋ณธ๋ฒ• ์ œ35์กฐ ์ œ2ํ•ญ ๊ด€๋ จ", type="XML")
ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
lmNo
ocNo
typeNoJSON
sectionsNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this a read-only, idempotent operation. The description adds meaningful behavioral context beyond this: the 'sections' parameter controls whether detailed reasoning is included, with approximate payload sizes (2KB vs 5KB), and the 'type' parameter controls response format. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear one-line summary, a bulleted Args section, Returns, and Examples. It is somewhat long, but every section contributes value. The front-loading is good, with the core purpose stated immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only retrieval tool with 5 parameters and no output schema, the description covers the return content ('question, answer, and reasoning'), parameter semantics, and provides examples. It does not address error conditions or explicitly place the tool in a workflow with search siblings, but it is sufficiently complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully documents every parameter: id (required sequence number), lm (optional name), sections (summary/full behavior), oc (override), and type (JSON/XML/HTML). It also explains the behavior of sections with return size implications, which adds significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: retrieving the full text of a legal interpretation precedent (๋ฒ•๋ นํ•ด์„๋ก€ ๋ณธ๋ฌธ ์กฐํšŒ). It uses a specific verb ('Retrieve') and identifies the resource, but does not explicitly distinguish from sibling tools like expc_search or cgm_expc_service, so it misses the top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is implied rather than explicit. The required 'id' parameter indicates the tool should be used when you already have a legal interpretation sequence number, and the examples show how to call it. However, there is no explicit instruction about when to use this tool versus alternatives (e.g., using expc_search to find IDs first).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

law_amendment_summaryA
Read-onlyIdempotent

List all revisions of a law within a date range (๋ฒ•๋ น ๊ฐœ์ • ์ด๋ ฅ ์กฐํšŒ).

Shows when and how a law was amended over time. Use the MST values from the results with article_amendment_diff to see specific article changes.

Args: law_name: Law name (e.g., "๊ทผ๋กœ๊ธฐ์ค€๋ฒ•") date_from: Start date YYYYMMDD (default "20100101") date_to: End date YYYYMMDD (default "20261231") oc: Optional OC override type: Response format - "JSON" (default), "XML", or "HTML"

Returns: List of revisions with dates, types, and MST identifiers

Examples: >>> law_amendment_summary(law_name="๊ทผ๋กœ๊ธฐ์ค€๋ฒ•", date_from="20200101") >>> law_amendment_summary(law_name="๋ฏผ๋ฒ•", date_from="20150101", date_to="20251231")

ParametersJSON Schema
NameRequiredDescriptionDefault
ocNo
typeNoJSON
date_toNo20261231
law_nameYes
date_fromNo20100101

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: the tool lists revisions across a date range, reveals the default date window (20100101 to 20261231), and indicates that results include MST identifiers for use with article_amendment_diff. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a concise one-sentence summary, an Args section, a Returns section, and two usage examples. Every sentence earns its place; no fluff or redundant repetition of the schema. It is front-loaded with the main purpose, making it easy for an agent to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 parameters, no output schema, and moderate complexity, the description is highly complete. It explains the return value (list of revisions with dates, types, MST identifiers), provides default date ranges, and links to a sibling tool for deeper analysis. The examples illustrate typical usage. This is on par with the 'get_calls' calibration example and arguably richer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry the full burden. It provides clear formats and defaults for law_name, date_from, date_to, and type, with examples for law_name. The 'oc' parameter is only labeled 'Optional OC override,' which is vague, but the description still offers more than the schema (which has no descriptions). Given the near-complete compensation, a score of 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource+scope: 'List all revisions of a law within a date range.' It further clarifies what the tool shows ('when and how a law was amended over time') and distinguishes it from sibling tools like article_amendment_diff by referencing MST values for follow-up. This makes the purpose unmistakable and distinct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: use this tool to query amendment history within a date range. It explicitly points to article_amendment_diff as the next step for seeing specific article changes, which is an alternative/follow-up tool. However, it does not explicitly state exclusions or when not to use it, so it falls just short of a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

law_josubA
Read-onlyIdempotent

Query specific article/paragraph by announcement date (๊ณตํฌ์ผ ๊ธฐ์ค€ ์กฐยทํ•ญยทํ˜ธยท๋ชฉ ์กฐํšŒ).

BEST TOOL for querying specific articles like "์ œ174์กฐ", "์ œ3์กฐ" etc. This returns only the requested article/paragraph, avoiding large full-law responses.

Args: id: Law ID (either id or mst is required) mst: Law serial number (MST) jo: Article number in XXXXXX format. Format: first 4 digits = article number (zero-padded), last 2 digits = branch suffix (00=main). Examples: "017400" (์ œ174์กฐ), "017200" (์ œ172์กฐ), "000300" (์ œ3์กฐ), "001502" (์ œ15์กฐ์˜2) hang: Paragraph number (6 digits, e.g., "000100" for ์ œ1ํ•ญ) ho: Item number (6 digits, e.g., "000200" for ์ œ2ํ˜ธ) mok: Subitem (UTF-8 encoded, e.g., "๋‹ค" for ๋‹ค๋ชฉ) oc: Optional OC override (defaults to env var) type: Response format - "JSON" (default), "XML", or "HTML"

Returns: Specific law section content

Examples: Query ์ž๋ณธ์‹œ์žฅ๋ฒ• ์ œ174์กฐ: >>> law_josub(mst="279823", jo="017400", type="XML")

Query ๊ฑด์ถ•๋ฒ• ์ œ3์กฐ ์ œ1ํ•ญ:
>>> law_josub(mst="276925", jo="000300", hang="000100", type="XML")
ParametersJSON Schema
NameRequiredDescriptionDefault
hoNo
idNo
joNo
ocNo
mokNo
mstNo
hangNo
typeNoJSON

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, idempotent, and non-destructive. The description adds useful behavioral context: it performs targeted lookup by announcement date and returns only the requested section to avoid large responses. It also documents the OC override behavior, though it does not cover error cases or response formatting details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with a one-line summary, a bold usage cue, an Args block, a Returns line, and two concrete examples. Every section contributes necessary information without filler, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This tool has 8 parameters, no required fields, no output schema, and a complex Korean legal citation format. The description fully compensates by defining every parameter, explaining the targeted vs. full-law behavior, listing response format options, and providing multiple worked examples. It is complete enough for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% property descriptions, so the description carries the full burden for explaining parameters. It does this excellently: id/mst requirements, the jo XXXXXX format with examples, hang/ho/mok formats, oc defaulting to an env var, and type defaulting to JSON are all documented clearly. This is well beyond the baseline for schema-covered tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Query specific article/paragraph by announcement date' and clearly targets individual law provisions. It explicitly positions itself as 'BEST TOOL for querying specific articles' and notes that it returns only the requested article/paragraph, distinguishing it from full-law retrieval siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states when to use this tool: for querying specific articles like '์ œ174์กฐ' or '์ œ3์กฐ' and for avoiding large full-law responses. However, it does not explicitly name sibling alternatives or provide when-not-to-use guidance, so it falls just short of a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

law_serviceA
Read-onlyIdempotent

Retrieve full law content by announcement date (๊ณตํฌ์ผ ๊ธฐ์ค€ ๋ฒ•๋ น ๋ณธ๋ฌธ ์กฐํšŒ).

Retrieves the complete text of a law organized by announcement (publication) date.

IMPORTANT: For specific article queries (e.g., "์ œ174์กฐ"), ALWAYS use the jo parameter. Some laws (e.g., ์ž๋ณธ์‹œ์žฅ๋ฒ•) have 400+ articles and the full response can exceed 1MB. Using jo returns only the requested article, which is much faster and cleaner.

Args: id: Law ID (either id or mst is required) mst: Law serial number (MST) lm: Law modification parameter ld: Law date parameter (YYYYMMDD) ln: Law number parameter jo: REQUIRED for specific articles. Article number in XXXXXX format. Format: first 4 digits = article number (zero-padded), last 2 digits = branch suffix (00=main). Examples: "017400" (์ œ174์กฐ), "017200" (์ œ172์กฐ), "000300" (์ œ3์กฐ), "001502" (์ œ15์กฐ์˜2) lang: Language - "KO" (Korean) or "ORI" (Original) oc: Optional OC override (defaults to env var) type: Response format - "JSON" (default), "XML", or "HTML"

Returns: Full law content or specific article content

Examples: Retrieve specific article (RECOMMENDED): >>> law_service(mst="279823", jo="017400", type="XML") # ์ž๋ณธ์‹œ์žฅ๋ฒ• ์ œ174์กฐ

Retrieve full law (WARNING: large response for some laws):
>>> law_service(id="009682", type="XML")
ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
joNo
ldNo
lmNo
lnNo
ocNo
mstNo
langNo
typeNoJSON

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the description adds value by revealing that full-law responses can exceed 1MB and that jo is faster/cleaner for article-level queries. This is meaningful behavioral context beyond the annotations, though it doesn't address auth/rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The structure is clear with opening statement, IMPORTANT warning, args list, returns, and examples. It is slightly redundant because the first two sentences restate the same purpose, but otherwise each section earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter tool with no output schema and no schema descriptions, this description is fairly complete: it covers all parameters, gives usage warnings, and provides recommended examples. It doesn't fully explain the exact semantics/relationships of lm/ld/ln, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description compensates by defining all 9 parameters, including a highly detailed format explanation for jo with examples and the KO/ORI values for lang. However, several parameters (lm, ld, ln, oc) remain cryptically described, preventing a higher score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states it retrieves full law content by announcement date and 'complete text of a law.' This is a specific verb+resource and, given sibling names like law_search and eflaw_search, clearly positions law_service as the retrieval service rather than a search tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit usage guidance for specific article queries ('ALWAYS use the jo parameter') and warns about large responses when retrieving full laws. It does not compare against alternative sibling tools (e.g., when to use law_search instead), so it falls short of a 5, but the in-tool guidance is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lsDelegated_serviceA
Read-onlyIdempotent

Retrieve delegated laws/rules/ordinances (์œ„์ž„ ๋ฒ•๋ น ์กฐํšŒ).

This tool retrieves information about laws, administrative rules, and local ordinances that are delegated by a parent law. Shows the delegation hierarchy and which specific articles delegate authority.

โš ๏ธ Note: This API does NOT support HTML format (only XML/JSON).

Args: id: Law ID (required if mst not provided) mst: Law master number (required if id not provided) oc: Optional OC override (defaults to env var) type: Response format - "JSON" (default) or "XML" (HTML not available for this endpoint) ctx: MCP context (injected automatically)

Returns: Delegation hierarchy with delegated laws/rules/ordinances or error

Examples: Retrieve delegations for ์ดˆยท์ค‘๋“ฑ๊ต์œก๋ฒ•: >>> lsDelegated_service(id="000900", type="XML")

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
ocNo
mstNo
typeNoJSON

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds valuable behavioral details beyond the readOnly/idempotent annotations: it warns about the lack of HTML support, explains the id/mst dependency, and clarifies the response type default. This helps the agent anticipate API constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear one-line summary, then args, returns, and an example. Every sentence carries informative weight and there is no redundant text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even without an output schema, the description covers the return type, mutual exclusivity of id/mst, and format limitations. This is sufficient for an agent to invoke the tool correctly in context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero schema descriptions, the description fully compensates by explaining every parameter, including optionality, defaults, and the required id/mst interplay. The example demonstrates concrete usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves delegated laws/rules/ordinances and shows the delegation hierarchy, distinguishing it from sibling search/service tools. The verb 'retrieve' plus the specific resource makes the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: to inspect delegation relationships from a parent law. However, it does not explicitly name alternatives or state when not to use it, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ordin_serviceA
Read-onlyIdempotent

Retrieve local ordinance full text (์ž์น˜๋ฒ•๊ทœ ๋ณธ๋ฌธ ์กฐํšŒ).

This tool retrieves the complete text of a Korean local ordinance.

Args: id: Ordinance ID (either id or mst is required) mst: Ordinance master number (either id or mst is required) oc: Optional OC override (defaults to env var) type: Response format - "JSON" (default), "XML", or "HTML" ctx: MCP context (injected automatically)

Returns: Full ordinance text or error

Examples: Retrieve by ID: >>> ordin_service(id="000001", type="XML")

Retrieve by MST:
>>> ordin_service(mst="123456", type="XML")
ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
ocNo
mstNo
typeNoJSON

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds useful behavioral context, such as the ability to choose response format (JSON/XML/HTML) and an 'oc' override that defaults to an environment variable. It doesn't elaborate on error cases or rate limits, but it adds value beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose statement, argument explanations, return note, and examples. It is slightly verbose due to the inclusion of 'ctx' in the args list (which is auto-injected and not actually in the schema), but it remains efficient and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only retrieval tool with no output schema, the description covers required inputs, response formats, and usage examples. It doesn't detail error responses or explain the 'oc' parameter in depth, but it provides enough information for basic invocation and is consistent with the annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by explaining each parameter: id, mst, oc, and type, including default and possible values. Examples clarify usage. The 'oc' description is cryptic, but overall the description adds meaning beyond the bare schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Retrieve local ordinance full text' with the Korean equivalent, using a specific verb (retrieve) and resource (local ordinance full text). It distinguishes itself from sibling search tools like ordin_search, which focus on finding ordinances rather than retrieving the full text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description specifies that either id or mst is required, implying the user already has an identifier and needs the full text. Examples show retrieval by ID or MST. While it doesn't explicitly name alternatives or exclusion scenarios, the context is clear enough for an agent to decide when to invoke.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

prec_serviceA
Read-onlyIdempotent

Retrieve court precedent full text (ํŒ๋ก€ ๋ณธ๋ฌธ ์กฐํšŒ).

Args: id: Precedent sequence number (ํŒ๋ก€์ผ๋ จ๋ฒˆํ˜ธ) lm: Precedent name (optional) sections: Response detail level: - "summary": Returns ํŒ์‹œ์‚ฌํ•ญ, ํŒ๊ฒฐ์š”์ง€, ์ฐธ์กฐ์กฐ๋ฌธ, ์ฐธ์กฐํŒ๋ก€ only (~5KB). Excludes ํŒ๋ก€๋‚ด์šฉ (full judgment text, often 15-25KB). Recommended for PlayMCP to stay under 20KB limit. - "full" or None: Returns everything including ํŒ๋ก€๋‚ด์šฉ (default). oc: Optional OC override type: Response format - "JSON" (default), "XML", or "HTML"

Returns: Full precedent text with details or error

Examples: >>> prec_service(id="228541") >>> prec_service(id="228541", sections="summary") # PlayMCP-safe

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
lmNo
ocNo
typeNoJSON
sectionsNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, which are reinforced by the description. The description adds valuable behavioral details: the 'sections' parameter controls response size, with 'summary' excluding the large 'ํŒ๋ก€๋‚ด์šฉ' field (~15-25KB), and the default returns everything. It also mentions response types (JSON, XML, HTML). This goes beyond the annotations by explaining size implications and defaults.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with Args, Returns, and Examples sections. It is concise, with no redundant sentences. The examples demonstrate both default and recommended usage. The essential information (parameter meanings, size limits, format options) is packed efficiently into a compact block.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (retrieve full text by ID), the description is nearly complete. It covers parameters, defaults, and even provides a practical size guideline. The return value is only described as 'Full precedent text with details or error,' but the 'sections' parameter partially outlines the response structure. Without an output schema, a bit more detail on the response format could be helpful, but the tool's context is well-served as-is.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden. It explains 'id' as a sequence number, 'sections' with specific values and size implications, 'type' formats, and 'oc' as an optional override. The description adds meaning for most parameters, though 'oc' is minimally explained ('Optional OC override') and 'lm' is self-explanatory. Overall, it compensates well for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Retrieve court precedent full text (ํŒ๋ก€ ๋ณธ๋ฌธ ์กฐํšŒ).' This is a specific verb+resource pairing that distinguishes it from sibling search tools like prec_search, which likely handles queries rather than direct retrieval. The name 'prec_service' aligns with this purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives practical usage context, such as recommending the 'summary' sections for PlayMCP to stay under 20KB limits, and indicates that 'full' is the default. It also provides examples of usage. However, it does not explicitly state when to use this tool versus alternative service tools (e.g., law_service), or when not to use it, which would elevate it to a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplify_articleA
Read-onlyIdempotent

Get a law article with legal terms replaced by everyday Korean (์‰ฌ์šด ๋ฒ•๋ฅ  ์ฝ๊ธฐ).

Fetches a law article and annotates legal jargon with plain Korean equivalents using the official ๋ฒ•์ œ์ฒ˜ legal terminology database.

Args: law_name: Law name (e.g., "๋ฏผ๋ฒ•", "๊ทผ๋กœ๊ธฐ์ค€๋ฒ•") article: Article number (e.g., 750 for ์ œ750์กฐ) article_branch: Branch number (e.g., 2 for ์ œ37์กฐ์˜2, default 0) oc: Optional OC override type: Response format - "JSON" (default), "XML", or "HTML"

Returns: Original text, simplified text with inline annotations, and term glossary

Examples: >>> simplify_article(law_name="๋ฏผ๋ฒ•", article=750) >>> simplify_article(law_name="๊ฑด์ถ•๋ฒ•", article=37, article_branch=2)

ParametersJSON Schema
NameRequiredDescriptionDefault
ocNo
typeNoJSON
articleYes
law_nameYes
article_branchNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds beneficial behavioral context by mentioning the use of the official ๋ฒ•์ œ์ฒ˜ terminology database and describing the return structure (original text, simplified text, glossary), which is not redundant with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description opens with a one-line purpose, then provides a concise technical explanation, followed by structured Args, Returns, and Examples. Every section is purposeful, and the examples illustrate usage effectively without excess verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 5 parameters and no output schema, the description covers the essential information: it explains the return format, gives realistic usage examples, and defines optional parameters. This makes the tool's behavior understandable and actionable for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite schema_description_coverage being 0%, the description compensates with an explicit Args section explaining each parameter, including examples (e.g., article=750, article_branch=2) and defaults for type and article_branch. This provides meaning beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Get a law article with legal terms replaced by everyday Korean' and further explains it fetches and annotates legal jargon. This distinguishes it from sibling search tools by emphasizing simplification rather than raw retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The purpose is clear, but the description does not explicitly state when to use this tool versus alternatives, nor does it mention any exclusions or alternatives. Usage guidance is implied from the tool's function but not spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

special_decc_serviceA
Read-onlyIdempotent

Retrieve special administrative appeal decision full text (ํŠน๋ณ„ํ–‰์ •์‹ฌํŒ ๋ณธ๋ฌธ ์กฐํšŒ).

Args: tribunal: Tribunal name (same values as special_decc_search) id: Decision serial number (์žฌ๊ฒฐ๋ก€์ผ๋ จ๋ฒˆํ˜ธ) oc: Optional OC override type: Response format - "JSON" (default), "XML", or "HTML" ctx: MCP context (injected automatically)

Returns: Full decision text or error

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
ocNo
typeNoJSON
tribunalYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so safety is covered. The description adds behavioral context by noting the 'ctx' parameter is 'injected automatically' and explaining the 'type' response format options (JSON/XML/HTML). The 'Returns: Full decision text or error' is somewhat vague but acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the main purpose, followed by clearly labeled Args and Returns sections. Every sentence adds value, and the structure is clean and easy to parse, with no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple retrieval tool with 4 parameters and no output schema, the description provides sufficient context: parameter meanings, response format options, and the return type. It also cross-references the sibling search tool for parameter values, making it complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description fully compensates by explaining each parameter: tribunal (name), id (serial number), oc (override), and type (format). It even notes that ctx is auto-injected, which is beyond the schema and helps agents understand which parameters are user-supplied.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb and resource: 'Retrieve special administrative appeal decision full text.' This distinguishes it from sibling tools like special_decc_search (search) and decc_service (regular decisions), making it unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context by specifying 'tribunal: same values as special_decc_search' and including response format options. It doesn't explicitly tell when to use this vs. alternatives, nor does it state requirements like having an ID from a search first, but the context is clear enough for a retrieval tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trty_serviceA
Read-onlyIdempotent

Retrieve treaty full text (์กฐ์•ฝ ๋ณธ๋ฌธ ์กฐํšŒ).

This tool retrieves the complete text of a Korean international treaty.

Args: id: Treaty sequence number (์กฐ์•ฝ์ผ๋ จ๋ฒˆํ˜ธ, required) oc: Optional OC override (defaults to env var) type: Response format - "JSON" (default), "XML", or "HTML" ctx: MCP context (injected automatically)

Returns: Full treaty text with details or error

Examples: Retrieve a treaty by ID: >>> trty_service(id="123")

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
ocNo
typeNoJSON

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent hints, and the description aligns with them. It additionally discloses the oc env-var fallback, the type response formats (JSON/XML/HTML), and the return of 'error', adding behavioral context beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-organized: a title line, a summary sentence, labeled Args/Returns sections, and a concrete example. No unnecessary prose; every sentence contributes to understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple retrieval-by-id tool, the description covers purpose, all parameters, and the return type. It lacks an explicit pointer to trty_search for obtaining the id, but the schema and annotations provide enough for a minimally viable tool. The omission is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates well by explaining id as 'Treaty sequence number', oc as 'Optional OC override (defaults to env var)', and type with enumerated examples. The abbreviation 'OC' is left undefined, but overall the parameter explanations add meaning beyond raw schema fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Retrieve treaty full text' and rephrases as 'This tool retrieves the complete text of a Korean international treaty.' This is a specific verb+resource that clearly distinguishes the tool from sibling search tools like trty_search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than explicit: the tool is for retrieving full treaty text, and the example shows how to invoke it. However, it does not mention that one should first use trty_search to obtain an id, nor does it contrast with other service tools. This is implied guidance, not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 54 tool updatesv2.1.0
    • First observedadmrul_search
    • First observedadmrul_service
    • First observedaiRltLs_search
    • First observedaiSearch
    • First observedarticle_amendment_diff
    • First observedarticle_citation
    • First observedcache_stats
    • First observedcgm_expc_search
    • First observedcgm_expc_service
    • First observedchain_amendment_track
    • First observedchain_dispute_prep
    • First observedchain_full_research
    • First observedchain_law_system
    • First observedcheck_precedent_odds
    • First observedcommittee_search
    • First observedcommittee_service
    • First observeddecc_search
    • First observeddecc_service
    • First observeddetc_search
    • First observeddetc_service
    • First observeddlytrm_rlt_search
    • First observeddlytrm_search
    • First observeddrlaw_search
    • First observedeflaw_josub
    • First observedeflaw_search
    • First observedeflaw_service
    • First observedelaw_search
    • First observedelaw_service
    • First observedexpc_search
    • First observedexpc_service
    • First observedjo_rlt_lstrm_search
    • First observedlaw_amendment_summary
    • First observedlaw_josub
    • First observedlaw_search
    • First observedlaw_service
    • First observedlegal_resolver
    • First observedlnkDep_search
    • First observedlnkLs_search
    • First observedlnkLsOrdJo_search
    • First observedls_rlt_search
    • First observedlsDelegated_service
    • First observedlstrm_ai_search
    • First observedlstrm_rlt_jo_search
    • First observedlstrm_rlt_search
    • First observedordin_search
    • First observedordin_service
    • First observedordinLsCon_search
    • First observedprec_search
    • First observedprec_service
    • First observedsimplify_article
    • First observedspecial_decc_search
    • First observedspecial_decc_service
    • First observedtrty_search
    • First observedtrty_service

TDQS

A3.6/5.0

Scored across 54 tools

Disambiguation2/5

Multiple tools have overlapping purposes, such as eflaw_search/law_search (differing only by effective vs announcement date), and numerous linkage/term tools (lstrm_rlt_search, lstrm_rlt_jo_search, dlytrm_rlt_search, jo_rlt_lstrm_search, ls_rlt_search) that are easily confused. The composite tools (chain_full_research, legal_resolver, check_precedent_odds) also overlap significantly in aggregating legal sources.

Naming Consistency2/5

Naming conventions are mixed: snake_case (eflaw_search, law_service), camelCase (aiSearch, aiRltLs_search), and bare noun phrases (article_citation, legal_resolver). The suffix pattern is inconsistentโ€”some use _search, some _service, and some use neither (check_precedent_odds, simplify_article).

Tool Count2/5

At 53 tools (per the list, though the server claims 54), this is far above the typical well-scoped range. The large number reflects the broad legal domain, but it makes the server unwieldy and increases the risk of misselection.

Completeness4/5

The tool set covers an extensive range of Korean legal resources: statutes, administrative rules, ordinances, treaties, precedents, constitutional decisions, interpretations, administrative appeals, committee decisions, and legal terminology, plus composite research workflows. There are minor gaps (e.g., no update/create operations, but these are read-only by design) and some redundant coverage, but overall the domain is well covered.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    B
    maintenance
    Enables searching, comparing, and analyzing Korean laws and public institution regulations through natural language, integrating 110 MCP tools covering statutes, precedents, and internal rules.
    100
    69
    20
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    This MCP server integrates South Korea's national law information, building registers from MOLIT, and KOSIS statistics for housing development research. It enables searching laws, retrieving building details, and accessing statistical data through natural language.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables searching and retrieving Korean statutes, precedents, and constitutional court decisions via MCP, using the National Law Information Center API.
    4,664
    1
    MIT