contract-compass
Server Details
Korean public procurement law: rule-engine rulings, statutes search, live court precedents
- Status
- Healthy
- Uptime
- 99.8% over 84 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- sallim-app/contract-compass
- GitHub Stars
- 0
- Server Listing
- Contract Compass
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 11 tools
Each tool targets a distinct operation: two decision engines (contract method, price adjustment), one penalty calculator with its companion exemption guide, and a search/retrieve pair for law and cases. The only real overlap risk is search_law vs search_references (law articles only vs admin rules/guidelines/integrated), but the descriptions explicitly draw that boundary and cross-reference each other. get_law_article vs get_law_article_asof is cleanly split by current vs historical, though an agent must notice the distinction.
Nearly all names follow a consistent snake_case verb_noun pattern (get_*, search_*, estimate_*, decide_*, check_*, report_*). The single deviation is delay_exemption_guide, a noun phrase rather than an action, which slightly breaks the pattern but remains unambiguous. No mixed casing or style chaos.
11 tools is well within a healthy range and every tool earns its place: two domain calculators, one judgment rule engine, one exemption look-up, a search/retrieve pair for law and for cases, and a feedback channel. Nothing appears redundant or padded.
Core contract-execution workflows are covered end to end: contract method selection, price escalation adjustment, delay penalty and its exclusions, plus law/case/reference research with current vs historical article lookup. Gaps remain around other execution stages (적격심사 scoring, contract guarantee, inspection/기성), which agents must handle through the generic search tools rather than a dedicated calculator. That is workable but not full lifecycle coverage.
Available Tools
11 toolscheck_price_adjustment물가변동 조정 판정ARead-onlyIdempotentInspect
물가변동 계약금액 조정(에스컬레이션) 요건 판정 + 산식 적용 — 이행단계 Phase 3.
"자재값이 올랐는데 계약금액을 올려받을 수 있나", "90일 지났나", "단품 조정 되나"에 쓰라.
**이 도구는 조정률을 산정하지 못한다.** 품목조정률·지수조정률은 산출내역서와 지수·단가
원천(한국은행 생산자물가지수 등)으로 계산하는 값인데 이 서버는 그 데이터를 갖고 있지
않다 — 그러니 `adjustment_rate_pct`는 **사용자·발주기관이 산정한 값**을 받아 쓰고,
안 주면 요건 ②를 `met: null`로 두고 판정을 보류한다. 없는 값을 지어내지 마라.
판정하는 것(결정론): ①기간 요건(계약체결일 또는 직전 조정기준일부터 90일 이상)
②등락률 3% 문턱 ③**단품 조정 문턱 — 국가·공기업 15%, 지방 10%(2025-07-08 개정 지방계약법 시행령으로 갈렸다)**
④조정 방식 결정 규칙(계약서에 지수조정률 명시가 없으면 품목조정률)
⑤조정금액 = 물가변동적용대가 × 조정률, 선금 공제 = 위 값 × 선금급률.
⑥**verdict가 single_item_only면 computed는 단품 산식이다**(computed.track="single_item"):
조정금액 = **해당 자재의** 물가변동적용대가 × 그 자재 등락률(영 제64조⑥ + 집행기준
제70조의3① 품목조정률 준용). `single_item_base_amount`가 없으면 adjustment_amount는
**null**이고 why_null이 사유다 — 계약 전체에 조정률을 곱한 값은 내지 않는다(받을 수
있는 금액이 아니다). 등락폭 특칙·일반관리비·이윤은 반영하지 않았다(computed.not_applied).
응답의 verdict: requirements_met / **single_item_only**(총액 조정은 미충족이나 단품
조정은 충족 — **그 자재에 한하여** 조정된다. 계약금액 전체가 아니다) /
requirements_not_met / exception_path(천재지변·원자재 급등 예외 검토 대상 — 인정
주체는 발주기관) / undetermined(조정률 미제공).
**두 트랙은 독립이다**(2026-08-29 수리). 단품 조정은 영 제64조⑥ "제1항 각 호에도
불구하고"라 3% 문턱과 무관하게 성립하므로, 등락률이 3% 미만이어도 verdict가
single_item_only일 수 있다 — 그때 "조정 불가"라고 답하면 오답이다. 반대로 제5항
예외가 푸는 것은 **조정제한기간(90일)뿐**이고 3% 문턱은 그대로다 — 국가 기준(계약예규
「정부 입찰·계약 집행기준」 제70조의4①)은 원자재 급등 예외에 조정률 5%(물품구매 10%)
이상, 또는 3%(물품구매 6%) 이상+이행 곤란의 객관적 사유를 요구한다.
Args:
org_type: "national"|"local"|"public_corp" — **추측 금지**(단품 문턱이 다르다)
contract_date: 계약체결일 "YYYY-MM-DD". 장기계속계약은 **제1차계약 체결일**
check_date: 조정 검토·청구 시점 "YYYY-MM-DD"
last_adjustment_date: 직전 조정기준일(있으면 기간 기산점이 이쪽으로 바뀐다).
contract_date 이상·check_date 이하여야 한다 — 직전 조정이 없으면 생략
adjustment_rate_pct: 산정된 품목·지수 조정률(%). 감액도 그대로(음수) 넣어라
method_specified_in_contract: 계약서에 지수조정률이 명시됐으면 "index", 품목이면
"item". 모르면 생략 — 기본값(품목조정률)으로 안내하되 그 사실을 응답에 밝힌다
urgent_exception: 천재지변·원자재 급등으로 90일 이내 조정을 검토하는가
single_item_rate_pct: 단품 조정 검토 시 해당 자재 가격증감률(%)
single_item_share_over_5permille: 그 자재가 재료비·노무비·경비 합계액의 1천분의 5를
초과하는가(산출내역서로 확인 — 우리가 계산하지 못한다)
is_construction: 공사계약인가(단품 조정은 공사 전용 제도)
adjustment_base_amount: 물가변동적용대가(원) — 조정기준일 **이후** 이행분의 대가
advance_payment_ratio: 선금급률(비율, 30%면 0.3). 0·생략은 선금 없음으로 본다. 음수나
1 초과(퍼센트 착오 등)는 기준금액 유무와 무관하게 invalid_advance_ratio로 거절한다. 금액 입력의 짝(adjustment_base_amount·
adjustment_rate_pct)이 없어 계산을 못 하면 `computed_skipped`에 받은 값과 빠진 입력을
적는다 — 그때 선금 공제는 반영되지 않았다
single_item_base_amount: 단품 조정 대상 **그 자재의** 물가변동적용대가(원) — 조정기준일
이후 이행분의 그 자재 계약단가 × 잔여수량(산출내역서). 계약 전체 대가가 아니다
| Name | Required | Description | Default |
|---|---|---|---|
| org_type | Yes | ||
| check_date | Yes | ||
| contract_date | Yes | ||
| is_construction | No | ||
| urgent_exception | No | ||
| include_footnotes | No | true면 계산값 근거 전문(산식·모집단·기간·원천)을 footnotes에 싣는다. 기본은 행마다 한 줄 요지 | |
| adjustment_rate_pct | No | ||
| last_adjustment_date | No | ||
| single_item_rate_pct | No | ||
| advance_payment_ratio | No | ||
| adjustment_base_amount | No | ||
| single_item_base_amount | No | ||
| method_specified_in_contract | No | ||
| single_item_share_over_5permille | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/idempotent/non-destructive, and the description goes far beyond them: it enumerates the deterministic checks (90-day period, 3% threshold, 15%/10% single-item thresholds, method selection, advance-payment deduction), lists all five verdict values, and explains that the two tracks are independent so a sub-3% rate can still yield single_item_only. It also discloses what is deliberately null and which items are excluded (not_applied), which is exactly the behavioral context annotations cannot supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose and the critical non-capability before the detail, and it uses bolding to route the eye. It is nonetheless long and repeats threshold/exclusion caveats in multiple places, so a small amount of text does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter tool with no output schema, the definition still describes the response surface (verdict enum, computed.track, why_null, computed_skipped, footnotes) and warns about the two-track independence and unfilled exceptions. Nothing an agent needs to call this correctly or interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 7%, so the description must carry the load, and it does: the Args block documents every parameter's meaning, format ('YYYY-MM-DD'), edge rules (last_adjustment_date must fall between contract_date and check_date; negative rates allowed for reductions; advance_payment_ratio rejects <0 or >1 as invalid_advance_ratio), and the semantic distinction between adjustment_base_amount and single_item_base_amount. This is meaning well beyond the bare schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('물가변동 계약금액 조정 요건 판정 + 산식 적용') and immediately bounds the scope by declaring what it cannot do ('이 도구는 조정률을 산정하지 못한다'). The example user questions ('90일 지났나', '단품 조정 되나') make it unmistakable versus the law-search and delay-penalty siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrasings for when to call it and a strong negative rule ('없는 값을 지어내지 마라', pass the user-computed rate instead). It does not name sibling alternatives (e.g. get_law_article for the underlying statute text), so routing to alternatives is left implicit rather than resolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decide_contract_method계약방법 판정ARead-onlyIdempotentInspect
계약방법 결정론 판정 — 룰엔진이 적용 가능한 계약방법 후보와 법령 근거를 반환.
상대방 지위(소기업·여성기업 등)를 안 넣었는데 그 지위로만 열리는 수의 후보가 있으면
`vendor_conditional_candidates`로 따로 온다 — 지위를 추정하지 말고 사용자에게 확인하라.
`law_currency`는 이 판정이 기대는 법령(공기업이면 계약사무규칙 포함 — `laws_checked`)의
현행 여부다(2026-10-15). `status`가 "verified"가 아니면 `note_currency`와
`laws_not_verified`가 온다 — 그 규범을 현행으로 단정해 인용하지 말고 그 사실을 밝혀라.
Args:
contract_type: "construction"(공사) | "service"(용역) | "product"(물품)
estimated_price: 추정가격(원)
org_type: "national"(국가기관) | "local"(지자체) | "public_corp"(공기업·준정부, 기본)
service_type: 용역일 때 "technical"|"academic"|"facility"|"it_service"|"other"
construction_specialty: 공사일 때 "general"(종합)|"electrical"|"ict"|"fire_safety" 등.
이 둘을 다른 계약유형에 넣으면 판정에 넣지 않고 `ignored_inputs`에 그 사실이 온다.
상대방 지위 플래그(is_youth_startup 등)를 세웠는데 추정가격이 그 지위로 열리는 수의 구간 밖이면
`ignored_inputs`에 kind="price_out_of_band"와 그 구간(`applicable_bands`)이 온다 — 반영 안 된 것이다.
is_sme_competition_product: 중소기업자간 경쟁제품 여부
negotiation_reason: 수의 사유 "urgent"|"rebid_failure"|"technical_difficulty"|
"patent_new_tech"|"specific_person"|"small_repeat"|"other_justified".
"rebid_failure"는 **재공고입찰까지 했는데도 유찰**(입찰 불성립·낙찰자 없음·1인 응찰)된
경우다 — 이 값만으로 재공고 수의 후보가 나온다(국가 시행령 제27조 / 지자체는 지방
시행령 제26조). 지자체(org_type="local")의 사유 판정은 지방계약법 시행령 제25조①
각 호·제26조를 근거로 나간다. "small_repeat"(소액)는 금액 사유라 사유 룰이 따로
없고 추정가격 기준 금액 룰이 판정한다(상한 초과면 수의 후보가 나오지 않는다).
is_women_enterprise: 여성기업 여부 — 지자체 물품·용역 2천만원 초과 1억원 이하
수의계약(시행령 제25조제1항제5호바목) 판정에 필요. 사용자가 "여성기업",
"장애인기업", "사회적기업"이라고 말하면 **반드시 해당 플래그를 세워라** —
빠뜨리면 수의계약 후보가 통째로 빠지고 경쟁입찰만 제시된다.
is_disabled_enterprise: 장애인기업 여부 (위와 같은 목)
is_social_enterprise: 사회적기업·사회적협동조합·자활기업·마을기업 여부 (위와 같은 목).
이 유형은 행정안전부 고시 취약계층 고용비율 충족이 추가 요건이다.
is_youth_startup: 청년창업기업 여부 — 물품·용역 2천만원 초과 5천만원 이하
수의계약(지방 제5호 다목 / 국가 시행령 제26조①5호가목7, 중소기업창업
지원법 제2조제11호)
is_small_enterprise: 상대방이 소기업·소상공인인지 여부 — 2천만원 초과 1억원
이하 수의계약(국가 시행령 제26조①5호가목3 / 지방 시행령 제25조①5호라목)
판정에 필요. **주의: 국가·공기업 2천만원 초과~1억원 이하는 무조건
소액수의가 아니다** — 소기업·소상공인/특수 지식·기술(academic)/여성·
장애인·사회적기업/청년창업(5천만 이하) 요건 충족 시에만 수의 가능하므로,
해당하면 플래그를 세워라. 미충족이면 경쟁입찰이 원칙이다.
is_special_expertise: 학술연구·원가계산·건설기술 등 **특수한 지식·기술·자격을 요구하는
계약**인지 — 물품·용역 2천만원 초과 1억원 이하 수의(국가 시행령 제26조①5호가목4 /
지방 시행령 제25조①5호마목) 판정에 필요. **물품에도 적용된다**(예: 항공사진 정사영상
구매). 용역은 학술용역(service_type="academic")이 아니어도(기술·일반 용역) 이 요건이면 세운다.
product_contract_kind: 물품이 "manufacture"(제조계약)인지 "purchase"(구매계약)인지. 물품 실적제한
(국가 시행령 제21조①3호·지방 제20조①3호)은 물품제조계약에만 쓴다 — purchase면 실적제한 답을
적용하지 않고 공시한다. 모르면 비워라(요건을 공시한다).
follow_up_answers: **후속질문 답변** — 이 도구를 한 번 부르면 `follow_up_questions`가
함께 온다(제한경쟁·공동도급 등 판정을 바꾸는 조건). 사용자에게 물어 답을 얻었으면
같은 인자에 이것만 더해 **다시 부르면 `final_recommendation`(최종 계약방법)이
온다.** 형식은 `{질문id: true/false 또는 값}` (예: `{"regional_restriction": true,
"joint_contract": true}`). 세션 id를 들고 다닐 필요가 없다 — 서버가 같은 호출
안에서 1단계·2단계를 이어 판정한다. 답을 모르면 넣지 마라(추측 금지).
**상대방 지위**(소기업·소상공인 등)를 답할 때는 도구 인자명(`is_small_enterprise` 등)을
키로 써라 — `small_enterprise_restriction`은 "입찰을 소기업·소상공인으로 제한할지" 질문의 답이다.
selected_rule_id: 후보 중 사용자가 고른 룰 id(예: "SVC_004"). 후보에 없으면 무시되고
그 사실이 `final_recommendation.selection_ignored_reason`에 적힌다.
selected_alternative_kind: `practice_alternatives`에서 사용자가 고른 실무 옵션의 kind.
bid_notice_date: 입찰공고(예정)일 "YYYY-MM-DD". 공고일 기준으로 갈리는 규정의 기준일이다
(예: 지자체 중소기업자 우선조달 상한 — 판로지원법 제4조② 단서는 2026-12-30 시행 후
최초 입찰공고분부터). 모르면 넣지 마라 — 서버는 오늘 날짜로 한 기간을 고르지 않고
두 기간을 다 공시한다.
| Name | Required | Description | Default |
|---|---|---|---|
| org_type | No | public_corp | |
| project_name | No | MCP 조회 | |
| service_type | No | ||
| contract_type | Yes | ||
| bid_notice_date | No | ||
| estimated_price | Yes | ||
| is_youth_startup | No | ||
| selected_rule_id | No | ||
| follow_up_answers | No | ||
| include_footnotes | No | true면 계산값 근거 전문(산식·모집단·기간·원천)을 footnotes에 싣는다. 기본은 행마다 한 줄 요지 | |
| negotiation_reason | No | ||
| is_small_enterprise | No | ||
| is_women_enterprise | No | ||
| is_social_enterprise | No | ||
| is_special_expertise | No | ||
| product_contract_kind | No | ||
| construction_specialty | No | ||
| is_disabled_enterprise | No | ||
| selected_alternative_kind | No | ||
| is_sme_competition_product | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it discloses the conditional-output mechanism (`vendor_conditional_candidates` when counterparty status is missing), the law-currency signal (`law_currency`, `status` not 'verified' → `note_currency`/`laws_not_verified`), silent-drop reporting via `ignored_inputs` with `kind="price_out_of_band"` and `applicable_bands`, and the ignored-selection path (`selection_ignored_reason`). This is exactly the non-obvious behavior an agent needs in order to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Structure is good — purpose first, then output-behavior caveats, then an Args block — and each paragraph carries real information. It is nonetheless a long, dense wall of prose with some repetition (the '플래그를 세워라' warning restated for each enterprise type) that could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, a 20-parameter surface, and a two-stage call protocol, the description supplies what is otherwise missing: the names and meaning of returned fields (`follow_up_questions`, `final_recommendation`, `practice_alternatives`, `ignored_inputs`), the stateless two-step flow, and the legal-document versioning caveat. An agent can make a correct first call and a correct follow-up call from this text alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 5% across 20 parameters, so the description must carry the load — and it does, defining near every argument: contract_type values, the service_type/construction_specialty cross-type rule, each status flag with its threshold and legal basis, `product_contract_kind` (manufacture vs purchase affecting 실적제한), `negotiation_reason` including the precise meaning of 'rebid_failure' vs 'small_repeat', and the `{question_id: value}` shape of `follow_up_answers` plus the naming caveat for `small_enterprise_restriction`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+mechanism: '계약방법 결정론 판정 — 룰엔진이 적용 가능한 계약방법 후보와 법령 근거를 반환.' It states both the action and the deliverable (candidate contract methods plus statutory citations), which clearly separates it from the sibling law-lookup and penalty-calculation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use rules: set `is_women_enterprise`/`is_disabled_enterprise`/`is_social_enterprise` when the user names those statuses, do not infer counterparty status but ask the user, and call again with `follow_up_answers` to obtain `final_recommendation`. It also tells the agent what NOT to do (don't put service_type on non-service contracts, don't guess bid_notice_date). Sibling alternatives are never named, so it stops 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.
delay_exemption_guide지체일수 불산입 사유ARead-onlyIdempotentInspect
지체일수에서 빼는(불산입) 사유 지도 — estimate_delay_penalty가 정하지 않는 부분.
"이 지연은 우리 책임이 아닌데 지체상금을 물어야 하나", "동절기 공사중지 기간도
지체일수인가", "관급자재가 늦게 와서 늦어졌다" 같은 질문에 쓰라.
**이 도구는 해당 여부를 판정하지 않는다.** 일반조건 문언 자체가 "계약담당공무원이
인정할 때"를 요건으로 두므로 판단은 발주기관 몫이다. 도구가 주는 것은 셋이다 —
①예규에 있는 사유 목록과 원문 인용 ②각 사유가 인정되려면 **확정돼야 할 사실**
(must_establish — 사용자와 하나씩 확인하라) ③기재부·행안부 회신 선례.
쓰는 순서: 이 도구로 사유를 좁힌다 → must_establish를 사용자와 확인한다 →
불산입 일수가 정해지면 estimate_delay_penalty의 excluded_days에 넣어 다시 계산한다.
(sw_requirement_change는 해당 일수의 **1/2**만 넣는다 — 예규가 절반만 빼준다.)
**ground 목록은 계약유형과 무관한 전체 열거다** — 어떤 사유는 일반조건 계열(공사/물품/
용역)뿐 아니라 계약유형까지 좁혀야 한다(예: sw_requirement_change는 같은 조건 제49조의
소프트웨어사업 전용이라 용역 계열이어도 운송·보관 계약에는 해당할 수 없다). 해당하지
않는 조합은 `ground_not_applicable`로 거부하고 가능한 사유를 알려준다. 목록 조회에서
이렇게 빠진 사유는 `grounds_excluded_by_contract_kind`에 사유와 함께 실린다 —
조용히 사라지지 않는다.
**`day_count_rules`도 계약 계열로 걸러 나간다**(2026-09-10). 공사 전용 준공신고·준공검사
규칙과 물품 전용 분할납품 규칙은 해당 계열에만 실린다 — 빠진 것은
`day_count_rules_excluded`에 이유와 적용 계열이 함께 남으므로 "그런 규칙이 없다"로
읽지 마라. 우리가 이 지도에 안 담았다는 뜻이지 규칙이 없다는 뜻이 아니다.
**`verification`은 이 인용을 되짚는 길과 우리가 못 가진 것을 함께 말한다**(2026-09-10).
`general_conditions_article_ref`를 get_law_article에 그대로 넣으면 조문 원문이 나온다
(`general_conditions_in_corpus: false`면 원문을 우리가 못 본다 — 그 계열 인용은 2차 정리를
옮긴 것이니 원문 인용처럼 옮기지 말고 그 사실을 밝혀라. 공사·물품·용역 일반조건은 지금
세 계열 모두 원문을 보유한다 — 공사계약일반조건 제25조는 2026-10-20 반입).
`admin_rule_version_in_corpus: true`면 `admin_rule_version`(발령번호 `issue_no`·`issued`·`effective`)이
**우리가 반입한 예규 판**의 버전이다 — 계약체결일 당시 시행본이라는 뜻이 아니니, 적용 시점이 쟁점이면
그때 시행본을 law.go.kr에서 확인하라. `false`면 발령번호·시행일을 우리가 모른다는 뜻이다 — 최신이라는
뜻이 아니니 답변에 '버전 미확인'을 밝혀라.
행정회신은 원문 URL이 우리에게 없다(문서번호+일자가 인용 키다) — **링크를 지어내지 마라.**
주의: `quote_truncated: true`인 항목은 우리가 회수한 조문 인용이 중간에서 끊긴 것이다
— 그대로 인용하지 말고 search_references로 전문을 확인하라. 끊긴 문장을 이어서
지어내면 그것이 이 서버가 막으려는 오답이다.
Args:
contract_kind: estimate_delay_penalty와 같은 값. 일반조건 계열(공사/물품/용역)로
매핑되며, 실제로 계약서에 편입된 일반조건이 진실원임을 응답이 경고한다
ground: 특정 사유 하나만 상세히 볼 때. 생략하면 그 계약유형의 전체 목록
| Name | Required | Description | Default |
|---|---|---|---|
| ground | No | ||
| contract_kind | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond them: it discloses that inapplicable contract-kind combinations are rejected with ground_not_applicable rather than silently dropped, that filtered items surface in grounds_excluded_by_contract_kind and day_count_rules_excluded, and that it deliberately does not adjudicate eligibility. It also warns about quote_truncated citations, missing corpus originals (general_conditions_in_corpus, admin_rule_version_in_corpus), and forbids fabricating administrative-reply URLs — exactly the failure modes an agent would otherwise fall into.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, then usage order, then the caveat block, so the structure is sound and each bolded paragraph carries a distinct warning. It is long and dense with dated parentheticals and corpus-versioning detail that could be trimmed, but little of it is genuinely redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 has to explain return shape — and it does, naming verification, general_conditions_article_ref, admin_rule_version/issue_no/issued/effective, grounds_excluded_by_contract_kind, day_count_rules_excluded and quote_truncated. For a read-only lookup with two params, nothing an agent needs in order to call it and interpret the response is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry parameter meaning, and it largely does: contract_kind is tied to the same value as estimate_delay_penalty, mapped to a general-conditions family, with a warning that the actually-incorporated conditions are the source of truth; ground is described as selecting one ground for detail and defaulting to the full list for that contract kind. It further notes that the ground list is a cross-type enumeration that must sometimes be narrowed by contract type. It stops short of explaining the individual enum values beyond sw_requirement_change.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb+resource in the first line — a map of grounds for excluding days from the delay count — and immediately scopes it against the sibling ('estimate_delay_penalty가 정하지 않는 부분'). It also names the three things it returns (ground list with source quotes, must_establish facts, ministry precedents), so an agent can distinguish it from estimate_delay_penalty without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering questions ('동절기 공사중지 기간도 지체일수인가', '관급자재가 늦게 와서'), an explicit when-NOT ('이 도구는 해당 여부를 판정하지 않는다'), and an ordered workflow: narrow grounds here → confirm must_establish with the user → feed excluded_days into estimate_delay_penalty, including the halving rule for sw_requirement_change. This is the when/when-not/alternative triad done explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_delay_penalty지체상금 산정ARead-onlyIdempotentInspect
지체상금(국가·공기업)·지연배상금(지방) 산정 — 법정 요율·기준금액·30% 한도를 결정론 적용.
**국가와 지방은 요율이 다르다**(물품 0.75/1000 ↔ 0.8/1000, 용역 1.25/1000 ↔ 1.3/1000)
— org_type을 반드시 사용자에게 확인해서 넣어라. 법정 용어도 다르다(국가=지체상금,
지방=지연배상금).
**이 도구는 지체일수를 정하지 않는다.** 준공검사 소요기간·검사 불합격 재검사 기간·
발주기관 귀책 일수 같은 것은 사실 판단이다 — delay_days/excluded_days는 사용자가
선언한 값으로 계산에 그대로 쓰이고, 응답의 counted_days.disclaimer가 이 사실을 밝힌다.
면책 사유 해당 여부가 쟁점이면 search_references로 예규·감사원 실무가이드를 찾아라.
응답 필드:
term/counterpart_term 기관유형에 따른 법정 용어(+반대편 용어)
rate 적용 요율·근거 조문(호까지). inferred=true면 법문이 아니라 우리 해석
base_amount 계약금액 − 인수분 산출 내역
counted_days 선언 지체일수 − 선언 면책일수
amount_raw / cap / amount 한도 적용 전 금액 / 30% 한도 / 최종(한도 적용 후)
warnings 미선언 항목·한도 적용·용어 비대칭 등 실토
legal_basis 근거 조문 — get_law_article로 원문 확인 가능
Args:
contract_kind: 요율 호와 1:1. "construction"(공사) | "product_manufacture"(물품
제조·구매) | "product_repair"(물품 수리·가공·대여) | "service"(용역·기타) |
"military_food"(군용 음·식료품) | "transport_storage"(운송·보관·양곡가공)
org_type: "national"(국가기관) | "local"(지자체) | "public_corp"(공기업·준정부).
**추측 금지** — 요율이 달라 틀린 금액이 된다
contract_amount: 계약금액(원). **장기계속계약이면 총액이 아니라 연차별 계약금액**
delay_days: 지체일수(총 지체일수 — 면책일수를 포함해서 넣고, 면책분은 아래에 따로)
excluded_days: 계약상대자 책임 없는 사유 일수. 모르면 **빼라**(0으로 계산하고 '미선언'
경고가 붙는다 — 그 경고를 전달하라). 없다고 확인됐으면 0을 명시하라(경고 없음).
정수 또는 **0.5일 단위** — 소프트웨어사업 요구사항 변경처럼 '그 일수의 1/2만' 빼는 사유는
홀수 일수면 .5가 된다(예: 3일 → 1.5). 그 밖의 소수는 거절한다(반올림·절사하지 않는다)
accepted_portion_amount: 검사를 거쳐 인수한 기성·기납 부분 금액(원). 생략=미선언, 0=인수분 없음
design_build_approved: 설계·제조 일괄 + 발주기관 승인이 필요한 물품인지(요율 예외)
contract_end_date: 계약기간 만료일(이행기한) "YYYY-MM-DD"(선택). 30% 한도는 국가 2018-12-04·지방
2019-06-25 시행 **이후 만료**분부터라, 그 전 만료면 한도를 빼고 계산한다. 생략하면 현행 기준으로
계산하고 time_basis에 그 사실을 적는다(요율은 현행 값 — 옛 계약은 계약서 요율 확인)
| Name | Required | Description | Default |
|---|---|---|---|
| org_type | Yes | ||
| delay_days | Yes | ||
| contract_kind | Yes | ||
| excluded_days | No | ||
| contract_amount | Yes | ||
| contract_end_date | No | ||
| include_footnotes | No | true면 계산값 근거 전문(산식·모집단·기간·원천)을 footnotes에 싣는다. 기본은 행마다 한 줄 요지 | |
| design_build_approved | No | ||
| accepted_portion_amount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far beyond the annotations: it reveals deterministic application, that undeclared excluded_days produces a '미선언' warning (vs. explicit 0 producing none), that counted_days carries a disclaimer, that the 30% cap is date-gated by contract_end_date, and that inferred rates are flagged. With readOnlyHint/idempotent already covered, this is substantial added context, though the openWorldHint implications are not discussed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded headline, then bolded pitfalls, then a response-field list, then Args — a sensible reading order with no filler. It is long, and the response-field block is dense, but with no output schema each line carries real information rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Nine parameters, an 11%-covered schema, and no output schema — the description fills all three gaps by documenting arguments, enumerating return fields (term, rate, base_amount, cap, amount, warnings, legal_basis), and flagging the disclaimer behavior. An agent can call this correctly without further lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 11%, but the Args section compensates for nearly every parameter: conduct_kind maps 1:1 to rate rows, org_type forbids guessing because rates differ, contract_amount must be per-year for long-term contracts, excluded_days accepts halves only in 0.5 increments with an explicit 3일→1.5 example and rejects other decimals, and contract_end_date explains the cap's effective dates. This is exactly what a low-coverage schema needs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb (산정/calculate) plus the exact resource (지체상금/지연배상금), and immediately states the governing rule set — statutory rate, base amount, 30% cap. It even distinguishes the national vs. local terminology split, which no sibling could be confused with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit exclusions are given: the tool does not fix delay days, and disputed exemption grounds are routed to search_references. It also mandates confirming org_type with the user before calling. It stops short of naming the closest sibling (delay_exemption_guide), which would have made the routing unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_case판례·해석례 본문ARead-onlyIdempotentInspect
판례/해석례 본문 조회 — 판시사항·판결요지·참조조문(판례) 또는 질의요지·회답·이유(해석례).
응답의 `source_url`은 국가법령정보센터 원문 주소다 — 판례·해석례를 인용할 때는
**이 링크를 함께 제시하라**(감사·보고서에서 근거를 되짚을 수 있어야 한다).
**`error:"case_body_unavailable"`이면 `source_url`은 null이고 `existence_verified`는
false다**(2026-09-04). 이건 "본문만 없다"가 아니다 — 우리는 ①본문 미제공(하급심·
국세청 등 타기관 제공)과 ②그런 일련번호가 없음을 **구분하지 못한다**(본문 API 응답이
같다). 그러니 **링크를 만들어 채우지 마라**: law.go.kr 뷰어는 없는 번호에도 200과 빈
페이지를 주므로 열린다는 것이 존재의 증거가 아니다. 이 case_id가 search_cases 결과에서
온 것이면 그 결과의 사건명·사건번호·source_url만 인용하고, 아니면 아무것도 인용하지
말고 search_cases로 다시 찾아라.
**`headnote_available:false`이면** law.go.kr이 판시사항·판결요지 중 하나 이상을 비워서 준 판결
(하급심 등 — 대법원 판결도 판결요지만 빈 경우가 있다. 그때 `headnote_partial:true`이고 온 쪽은
원천 그대로다)이다 — 어느 필드가 원천에서 비었는지는 `headnote_note`가 말한다(참조조문은
따로 올 수 있으니 `referenced_laws`가 있으면 그대로 써라). 쟁점은
`body_excerpt`(판결 전문 앞부분)에서 직접 읽고, 요지를 지어내지 마라.
`error:"case_id_invalid"`는 case_id가 숫자 일련번호가 아니라는 뜻이다(사건번호를
넣었으면 search_cases의 질의로 넣어라).
Args:
kind: "prec" | "expc" (search_cases 결과의 kind)
case_id: search_cases 결과의 case_id(숫자 일련번호)
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| case_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description adds substantial behavior beyond that: exact error codes and their meaning, that source_url/existence_verified are null/false on failure, that missing bodies cannot be distinguished from nonexistent IDs, and an explicit instruction not to fabricate citation links.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and nearly every sentence carries operational weight, but the heavy inline bolding and long parenthetical error discussion make it denser and less scannable than ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description steps in to name the key return fields (source_url, existence_verified, headnote_available, headnote_partial, headnote_note, body_excerpt, referenced_laws) and explains their semantics, so an agent has what it needs to interpret results and handle failures.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 burden, and it does: it defines kind as the enum drawn from search_cases results and case_id as the numeric serial number from search_cases, explicitly warning that a 사건번호 is not valid here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource ('판례/해석례 본문 조회') and enumerates what it returns (판시사항·판결요지·참조조문 for prec; 질의요지·회답·이유 for expc). It also implicitly distinguishes itself from search_cases by requiring case_id from that sibling's results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states the precondition that case_id must come from a search_cases result and routes the agent back to search_cases if it does not. Error-specific guidance (case_body_unavailable, case_id_invalid) further directs behavior, though there is no general 'when not to use this tool' statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_law_article법령 조문 원문ARead-onlyIdempotentInspect
법령 조문 원문 조회 — 6,000자를 넘으면 잘라서 주고 truncated로 공시한다.
**긴 조문은 잘린다(2026-10-15).** 원문이 6,000자를 넘으면 `truncated: true`와
`content_total_chars`(원문 총 글자수)·`content_shown_chars`·`paragraphs_shown`·
`paragraphs_omitted`·`paragraph_cut`·`truncation_note`가 온다. 그때 content는 조문
전체가 아니다 — 생략된 항을 "없다"고 말하지 말고, ref에 항을 붙여(예: "소득세법 시행령
제155조제20항") 다시 부르면 그 항부터 창을 열어 준다(`requested_paragraph`).
ref에 호를 붙이면(예: "…제26조제1항제5호") `requested_item_found`가 그 호의 실재를 말한다 —
false면 그 호는 본문에 없다(조문 전체를 줬을 뿐이다), null이면 판정 못 함(`requested_item_note`).
목까지 붙이면(예: "…제25조제1항제5호바목") `requested_mok_found`가 그 목의 실재를 같은 뜻으로 말한다.
**코퍼스가 둘이다(2026-08-29)** — 공공계약(국가·지방계약법 계열)과 세법(소득세법·
법인세법·부가가치세법·조세특례제한법·지방세법 등). 축은 법령명으로 자동으로 정해지니
부르는 쪽은 신경 쓸 것이 없다("소득세법 제55조"도 "국가계약법 시행령 제26조"와 똑같이
넣으면 된다). 다만 **답할 때는 어느 법의 조문인지 밝혀라** — 세법 조문을 공공계약
근거로 인용하는 것은 우리가 막을 수 없다.
응답의 `notes`가 비어 있지 않으면 **법률 자체의 미정비 상호인용**이 탐지된
것이다(예: 제5항이 '제2항 각 호'를 인용하나 제2항에 각 호가 없음). 원문은
law.go.kr 현행 그대로이며 우리가 고치지 않는다 — 그 조문을 근거로 답할 때는
notes의 내용을 사용자에게 함께 알리고 단정을 피하라. notes에 `type: "deleted_stub"`이
있으면 **삭제된 조문·별표**다 — 현행 법령에 규정이 없으니 판단 근거로 인용하지 마라.
응답에 `assumption`이 있으면 **법령명을 우리가 추정해 채운 것**이다(예: "시행령
제26조" → 국가계약법 시행령). 지방계약 질문이었다면 틀린 법을 보고 있는 것이니
assumption.hint대로 법령명을 붙여 다시 부르고, 어느 법령 기준인지 사용자에게 밝혀라.
실무 약칭도 같은 자리에 공시된다 — 국계법·지계법, 법령명 뒤의 '영'(=시행령)·'규칙'(=시행규칙)·
'법'(=법률): "국계법 영 50조"는 국가계약법 시행령 제50조로 읽는다(get_law_article_asof·search_law 공통).
**`implementing_note`(및 `implementing_articles`)가 있으면 이 조문의 위임을 받은
하위 조문이 이 서버 안에 있다.** 조문 본문에 사유·요건·수치가 안 보이면 없어서가
아니라 아래로 넘겼기 때문이다 — 거기 적힌 ref를 그대로 get_law_article에 넣어 읽고
답하라(추가 검색 불필요). 본문이 값을 직접 정하고 있으면 본문이 근거다. 하위 조문의
`cites`는 그 조문이 이 조문의 어느 자리를 받았는지 스스로 밝힌 인용이다.
**`delegation_note`가 있으면 이 조문의 일부 값이 하위 규범에 넘겨졌다**(넘긴 자리는
`delegations[].where`). 그 자리의 배점·요율·금액 같은 수치가 조문에 안 보이는 것은
없어서가 아니라 하위 규범(시행령·시행규칙·예규·고시)에 넘겨졌기 때문이다(본문에
직접 적힌 값은 본문이 근거다). 그 자리가 쟁점이면 `delegations[]`의 `how`가 시키는
대로 그 규범을 먼저 읽고 답하라. `in_corpus`가 false면 이 서버 범위 밖이니 **"규정이 없다"고 말하지 말고**
law.go.kr로 안내하라. 조문만 읽고 수치를 단정하는 것이 이 필드가 막으려는 실패다.
**별표(표)도 같은 도구로 읽는다**(2026-08-23). search_law가 별표 히트로 준 law_ref
("건설기술 진흥법 시행령 [별표 8]")를 그대로 넣으면 표 전문이 온다 — 이때 응답의
`kind`가 "table"이고, `related_article`이 있으면 그 표의 근거 조문이다(표만 인용하고
근거 조문을 빼면 읽는 쪽이 법적 근거를 되짚을 수 없다).
**계약예규·세부기준의 조문도 같은 도구로 읽는다**(2026-09-04). search_references가
준 `source`+`section`을 이어 붙여 넣으면 된다("(계약예규) 용역계약일반조건 제18조").
이때 응답의 `kind`는 "admin_rule"이다 — **법률·시행령이 아니라 행정규칙(예규)**이니
인용할 때 그 신분을 밝혀라. 법령명·정식명 어느 쪽으로 불러도 같은 조문이 온다
("국가를 당사자로 하는 계약에 관한 법률 시행령 제26조" = "국가계약법 시행령 제26조").
조 번호가 없는 행정규칙 단위도 연다(1.74.0): 세부기준 별표("조달청 시설공사 적격심사세부기준
[별표 10]")와 장·절("지방자치단체 입찰시 낙찰자 결정기준 제4장 제6절", 조각은 끝에 "(2/24)").
이때 `notes`가 표 경계·조각 나눔을 밝히니 함께 읽어라.
404(`article_not_found`)에서 `law_in_corpus`가 true면 **그 규범은 우리가 갖고 있고
그 조문번호만 없다**는 뜻이다 — 규범 자체가 없다고 말하지 마라. false면 범위 밖이며,
`corpus_laws`(법령)와 `corpus_admin_rules`(예규·세부기준)가 우리 범위 전부다.
**`law_currency`는 이 규범의 현행 여부를 언제 마지막으로 확인했는지다(2026-09-23).**
`status`가 "verified"가 아니면 `note_currency`가 함께 온다 — "unverified"(대조 실패·
오래됨: 모른다 / 현행판과 개정 이력이 갈림: `current_version_effective_date` 시행 개정분이
우리 판에 빠졌을 수 있음을 안다 — `unmerged_amendment`)·"stale"(현행보다 낡은 구판임을
안다 — `law_status`가 "EXPIRED"면 유효기간이 끝난 실효 고시다)·"unmonitored"(감시 대상 밖).
그때 이 조문을 현행으로 단정해 인용하지 말고 그 사실과 `last_verified_at`을 밝혀라.
Args:
ref: 정확한 조문 참조 (예: "국가계약법 시행령 제26조") 또는 별표 참조
(예: "국가계약법 시행규칙 [별표 2]") 또는 예규 조문 참조
(예: "(계약예규) 용역계약일반조건 제18조")
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/idempotent/openWorld; the description adds far more: the 6,000-character truncation threshold with the exact disclosure fields, the two-corpus split, `notes` semantics including the `deleted_stub` type, `assumption` guessing behavior, `law_currency` staleness states, and 404 `law_in_corpus` meaning. Each of these is a behavioral trait the agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior and then segmented by bold headers keyed to failure modes, which keeps a very long description navigable. It is longer than ideal — the truncation field list and some response-field detail are restated at length — but almost every sentence maps to a distinct agent mistake, so little is truly wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a single opaque parameter, the description must carry both invocation and interpretation, and it does: return shape (`kind`, `notes`, `truncated`, `delegations`, `law_currency`), error shape (`article_not_found` + `corpus_laws`), and citation caveats are all covered. Nothing an agent needs to call and correctly report this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema gives `ref` no description at all, so the description carries the full burden — and it does: it gives three concrete ref formats (article, 별표, 예규), explains abbreviation expansion ('국계법 영 50조'), and documents the paragraph/item/mok suffix behavior that drives `requested_paragraph`/`requested_item_found`/`requested_mok_found`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line names a specific verb and resource ('법령 조문 원문 조회') and the body makes clear it also serves 별표 tables and 행정규칙 articles via the same single `ref` argument. It names sibling tools (search_law, get_law_article_asof, search_references) at the points where confusion is likely, so an agent can tell which tool to call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Extensive when-to-use guidance: re-call with a paragraph suffix when `truncated` is true, follow `implementing_note` refs directly instead of searching again, read `delegations[].how` before answering on delegated values, and route to law.go.kr when `in_corpus` is false. It also states explicit prohibitions (don't cite deleted_stub articles, don't claim 'no rule exists' on out-of-corpus), which is exactly the alternative-routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_law_article_asof특정 시점 시행 조문ARead-onlyIdempotentInspect
특정 시점에 시행 중이던 조문 원문 조회 (law.go.kr 연혁 라이브).
get_law_article은 항상 현행이다. 과거 사건에 현행 조문을 적용하면 조용히 틀린
답이 된다 — 계약 체결·입찰공고·처분 시점이 과거이면 **반드시 이 도구를 쓰라**:
- "2023년에 체결한 계약인데 지체상금률이 맞나"
- "재작년 부정당업자 제재가 당시 기준으로 적법했나"
- 감사·분쟁·소송 대응(적용법령은 행위시법이 원칙)
응답 필드:
effective_date 그 시점에 시행 중이던 판의 시행일자
is_current 그 판이 지금도 현행인가 (False면 이후 개정됨)
prev/next_effective_date 직전·직후 개정 시행일 — 경계 판단용
notes 미정비 상호인용 경고 (get_law_article과 동일)
assumption 법령명을 **우리가 추정해 채웠다**(예: "시행령"→국가계약법 시행령, 약칭 해석) — get_law_article과 같다.
다른 법령을 물었다면 hint대로 법령명을 붙여 다시 부르고, 어느 법령 기준인지 사용자에게 밝혀라
as_of_in_future 기준일이 미래여서 그 시점을 확정할 수 없음 (True면 아래 note를 읽어라)
as_of_note 그 경우 무엇을 대신 돌려줬는지 — 미래 시점 적용법령을 단정하지 마라
covered 우리 연혁 목록이 그 시점을 실제로 덮었는가 (False면 coverage_note를 읽어라)
coverage_start/coverage_end 우리가 본 연혁의 시행일 범위
versions_complete 연혁 목록을 끝까지 읽었는가 (False면 그 아래에 못 본 판이 있다)
delegations_asof_note 옛 판(is_current=False)일 때만 — 위임 목록이 **현행 판** 기준 지도이며
이 판 본문에서 문구를 확인/못 찾은 건수. delegation_note는 확인된 위임만으로 낸다
delegations[].line_found_in_version 옛 판에서만 — 그 위임 문구를 이 판 본문에서 찾았는가
(false는 부재 증명이 아니라 '못 찾음'이다 — 그 시점의 근거로 인용하지 말고 본문을 읽어라)
null은 지도 문구가 잘려 있어 대조하지 못한 것 — 역시 확인이 아니다
**덮지 못하는 기준일에는 근사판을 주지 않는다.** 기준일이 그 법령의 최초 시행일보다
앞서면 `error: "asof_not_covered"` + `covered: false` + coverage_start/end가 온다 —
그때의 적용법령을 지어내지 말고, 우리 연혁이 어디서부터인지를 사용자에게 그대로 전하라.
**그 판에 조문이 없으면 장애가 아니라 확인된 부재다.** `error: "article_not_in_version"`
+ effective_date(읽은 판의 시행일)가 온다 — 같은 인자로 재시도하지 말고, 조문번호
오기·신설 전·삭제 가능성을 사용자에게 그대로 전하라(as_of_in_future=true면 '그때도 없다'고
단정하지 마라). 원문을 못 읽었으면 `law_body_unreadable`이다 — 그건 부재가 아니다.
**미래 날짜는 답할 수 없는 질문이다.** 아직 공포되지 않은 개정은 이 연혁에 없으므로
그 시점에 무엇이 시행 중일지 우리는 모른다. date가 미래면 오늘 기준 판을 주면서
`as_of_in_future=true`로 그 사실을 밝힌다 — 그 응답을 그 시점의 적용법령으로 쓰지 마라.
**별표도 같은 판에서 읽는다** — ref에 "[별표 N]"을 주면 그 시점 판의 별표 원문이 온다
(코퍼스 밖 법령도 된다). 그때 `table_pdf_url`(law.go.kr 원문 PDF)과 `table_note`(근거 조문·
삭제 상태·본문 빈약 여부)가 붙는다 — 표 값이 쟁점이면 PDF와 대조하라고 안내하라.
ref에 조문번호도 별표도 없으면 `error: "ref_missing_article"`이다(장애 아님 — 형식을 고쳐라).
Args:
ref: 조문 참조 (예: "국가계약법 제27조", "국가계약법 시행령 제26조",
"주택법 시행령 [별표 4]")
date: 기준일 "YYYY-MM-DD" 또는 "YYYYMMDD" (예: 계약 체결일)
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | ||
| date | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover read-only/idempotent safety, but the description discloses far more: full response field semantics (effective_date, is_current, covered, versions_complete), four distinct error modes (asof_not_covered, article_not_in_version, law_body_unreadable, ref_missing_article), and the explicit rule that no nearest approximation is returned. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then bolded sub-sections for errors and edge cases; every block earns its place given the many failure modes. It is dense and long, but the length is justified by the tool's complexity rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 documents the return fields and every error path, plus the future-date and uncovered-date caveats. An agent has everything needed to call it and interpret the result without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (no parameter descriptions), so the description must carry the burden, and it does: ref is defined as an article or annex reference with three concrete formats ('국가계약법 제27조', '주택법 시행령 제26조', '주택법 시행령 [별표 4]'), and date is specified as 'YYYY-MM-DD' or 'YYYYMMDD' with a usage example (계약 체결일).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('특정 시점에 시행 중이던 조문 원문 조회') and explicitly contrasts itself with the sibling get_law_article ('get_law_article은 항상 현행이다'), so an agent can tell them apart immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition ('계약 체결·입찰공고·처분 시점이 과거이면 반드시 이 도구를 쓰라') with three concrete examples (지체상금률, 부정당업자 제재, 감사·분쟁 대응) and names the alternative. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_issue오류·개선 제보AInspect
사용자가 오류 제보·개선 요청·문의를 운영자에게 전해 달라고 했을 때만 쓴다.
쓰는 때: 사용자가 "이 조문 인용이 틀렸으니 신고해 줘", "운영자에게 알려 줘", "이런 질문도
답하게 해 달라고 전해 줘"처럼 제보·요청을 부탁했을 때. 보내기 전에 무엇이 전달되는지
사용자에게 알린다. 사용자가 오류·불만·개선 희망·기관 도입 같은 이용 문의·후원 의사를
말했지만 전달을 부탁하지는 않았다면, 부르지 말고 "운영자에게 전해 드릴까요?"를 한 줄로
물어 동의할 때만 부른다(거절·무반응이면 다시 묻지 않는다). 응답의 접수번호(ref)와
회신 방법(reply_path)을 사용자에게 알린다.
쓰지 않는 때: 사용자가 요청하지 않았는데 질문을 남기려고 부르지 않는다. 답하기 전에
먼저 부르지도 않는다 — 이 도구는 답변·정정을 대신하지 않는다.
전달 내용(인자)과 같은 사용자의 직전 도구 호출 요약(서버 기록)이 운영자 검토용으로
저장된다(개인정보처리방침 https://contract.sallim.app/privacy). 개인 식별 정보(기관명·
사건번호·금액 조합 등)는 일반형으로 바꿔 적는다. 연락처(contact)는 사용자가 회신을 원해
직접 준 경우에만 담고, 그 건의 회신에만 쓴다.
Args:
category: "wrong_citation"(오인용) | "outdated_law"(개정 미반영) |
"wrong_ruling"(룰엔진 오판정) | "tool_error"(도구 오류) |
"feature_request"(기능 요청) | "question_log"(사용자가 전해 달라고 한, 답하지
못한 질문) | "other" | "usage_inquiry"(이용문의 — 기관 도입·대량 이용 등 이용
방식을 운영자와 상의하고 싶다며 전해 달라고 한 경우) | "sponsor_inquiry"(후원문의 —
후원 의사를 전해 달라고 한 경우)
message: 사용자가 전해 달라고 한 내용 — 무엇이 어떻게 잘못됐는지, 어떤 질문에
답하지 못했는지, 또는 문의 내용
related_tool: 문제가 난 도구명 (예: "search_references")
related_query: 문제를 재현하는 질의·입력
expected: 올바르다고 생각하는 값·조문 (알고 있다면)
contact: 회신받을 연락처(이메일 등, 200자 이내) — **사용자가 회신을 원한다며 직접
알려 준 값만** 넣는다. 넣기 전에 '운영자가 회신에만 쓰고 개인정보처리방침에 따라
보관한다'고 알리고 동의를 받는다. 대화에서 짐작하거나 다른 데서 가져와 채우지 않는다
| Name | Required | Description | Default |
|---|---|---|---|
| contact | No | ||
| message | Yes | ||
| category | Yes | ||
| expected | No | ||
| related_tool | No | ||
| related_query | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and non-destructive; the description adds substantial context beyond that: both the arguments and the user's prior tool-call summary are persisted server-side for operator review, a privacy policy URL is given, PII must be generalized, and the user must be told what will be sent. It also discloses the response shape (ref number and reply_path) and the contact-handling rule.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is long but well-organized: front-loaded purpose, then '쓰는 때' / '쓰지 않는 때' sections, then an args block. A few sentences restate the same prohibition (don't call unprompted / don't call before answering), which is mild redundancy for a tool this consequential.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter write-ish tool with no output schema, the description covers invocation conditions, consent flow, data-persistence notice, PII handling, and return fields (ref, reply_path). Nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 — and it does: every one of the six parameters is explained, all nine category enum values are glossed in Korean, contact has a 200-character limit plus a consent prerequisite, and related_tool/related_query/expected are tied to reproduction of the problem.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific verb+resource+scope: relay bug reports/improvement requests/inquiries to operators, and only when the user explicitly asks. This clearly separates it from the sibling tools (search_law, get_case, estimate_delay_penalty, etc.), which are legal-research/calculation tools rather than feedback channels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit 'when to use' triggers with quoted user utterances ("신고해 줘", "운영자에게 알려 줘") and explicit 'when not to use' rules (don't call just to leave a question; don't call before answering). It also specifies the consent fallback — ask "운영자에게 전해 드릴까요?" once and don't re-ask on refusal — which is exactly the routing logic an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_cases판례·해석례 검색ARead-onlyIdempotentInspect
판례·법령해석례 검색 — law.go.kr 실시간 조회(항상 현행). LLM 미사용.
분쟁·처분취소·해석 다툼("~해도 되나", "~취소될 수 있나")에 조문만으로 부족할 때
쓰라. 본문은 get_case(kind, case_id)로 이어서 조회.
**응답은 무엇으로 몇 건을 봤는지까지 말한다**(2026-08-29). `search_scope`가
"title"이면 사건명·안건명만, "body"면 본문까지 본 것이다. `searched`에 시도한
질의·범위·law.go.kr 총계(`total_cnt`)가 시도 순서대로 실리고, 넓혀서 다시 찾았으면
`retried`가 true다. **0건은 "그런 판례가 없다"가 아니라 "이 범위에서 못 찾았다"이다**
— 사용자에게 옮길 때 `searched`가 밝힌 범위를 함께 말하고 "판례가 없다"고 단정하지 마라.
**`body_scope_caveat`가 있으면** 본문검색으로 넓힌 히트다 — law.go.kr 본문검색은 형태소
OR이고 **최신순**이라 질의와 무관한 사건이 섞인다(`relevance_verified:false`). 사건명을
보고 관련 없으면 인용하지 말고, 인용 전에 get_case로 확인하라.
**`landmark_cases`가 있으면** 질의가 대표 판례를 큐레이션해 둔 쟁점에 걸린 것이다(1.74.0) —
사건명 검색(hits)이 닿지 못하는 대표 판례를 사건번호로 law.go.kr에서 방금 확인해 따로 싣는다.
`issue`는 판결요지 발췌이니 인용 전 get_case로 원문을 확인하고, 판결끼리 갈리면 함께 밝혀라.
**질의가 사건번호 하나뿐이면**(예: "2005다22688", "대법원 2005다22688 판결") 사건명 검색이
아니라 law.go.kr 사건번호 조회로 찾는다(1.78.6) — `case_no_lookup.found`가 true면 hits가 그
번호의 판결이고 `search_scope`는 "case_no"다. false면 사건번호 조회로는 못 찾았다는 뜻이고
(없다는 뜻이 아니다) 아래 hits는 사건명 검색 결과라 그 판결이 아닐 수 있다.
**응답에 `axis`가 있으면 축·원장의 경계가 걸린 것이다**(2026-09-02). 세법 축
질의인데 사건명·안건명 그대로는 못 찾아 **넓혀 찾은** 종류가 있을 때만 실리고,
`axis.gated_kinds`가 그 종류를 말한다. `axis.out_of_axis`는 넓히다 **다른 축의
사건이 섞여 우리가 뺀 것**이다 — 세법 근거로 인용하지 마라(판례는 판정 근거인
`case_type`·`data_source`가 항목마다 붙는다).
**두 종류의 경계가 서로 반대라는 것을 혼동하지 마라.**
· `axis.yegyu_in_corpus: false` — 세무 실무가 말하는 '예규'(국세청 서면질의 회신,
txsi)를 이 서버가 **아예 담지 않는다**(법제처 expc와 원장이 다르다). "예규가
없다"고 옮기지 말고 국세법령정보시스템으로 안내하라.
· `axis.prec_in_corpus: true` — **판례는 담고 있다**. 여기서 뺀 것은 원장이 비어서가
아니라 사다리가 넓히다 민사·형사 사건을 끌어온 것뿐이니, "세법 판례가 없다"로
옮기면 틀린 말이다. 남은 판례가 0건이면 '이 사다리로는 못 찾았다'로 전하라.
**응답에 `off_topic_warning`이 있으면 낱말만 같고 쟁점이 다를 수 있다**(2026-09-10).
**세법 질의로 판정되지 않았는데**(`axis_verdict.axis`: `contract`=공공계약 축이 더 가깝다 ·
`not_tax`=세법 축 문턱 밖일 뿐 공공계약과 견주지는 않았다) 받은 회수분이 **전부 세법 원장
소산**(국세·지방세법령정보시스템, 사건종류 '세무')일 때 붙는다 — 예: '유찰'은 공공계약에서
입찰 불성립이지만 세법에서는 공매 절차다. **빼지 않고 남긴 것**이니(빼면 0건이 되어
'판례가 없다'는 거짓이 된다) 공공계약 근거로 인용하기 전에 get_case로 본문·참조조문을
읽어 쟁점이 같은지 확인하고, 다르면 사용자에게 "공공계약 판례는 이 범위에서 못 찾았다"고
밝혀라. `evidence`가 판정 근거다.
**본 것만큼만 말한다**(2026-09-11): '전부 세법'은 받은 `judged_on`건의 판정이다 —
`unseen_cnt`>0(`truncated: true`)이면 law.go.kr 총 `ledger_total`건 중 나머지는 안 봤으니
"원장에 그것뿐"이나 "이 질의의 판례는 전부 세법"이라 옮기지 마라(`unseen_cnt: 0`일 때만
이 범위에서 본 것이 전부다, null이면 총계를 모른다). **축을 못 쟀으면**(임베딩 장애 등)
경고 대신 `axis_unjudged`가 같은 모양으로 붙는다 — 주제이탈도 세법 정답도 단정하지 않은
것이니, 사용자 질문의 쟁점이 어느 쪽인지 네가 판단해 인용 여부를 정하라.
**넓혀 찾은 종류가 있는데 축을 못 쟀으면**(2026-11-04) `axis_unjudged.kind`가
`axis_gate_unmeasured`다 — 아무것도 빼지 않았고, 세법 축 신호가 없는 넓힌 히트가
`unverified`에 있으며 그 히트에 `relevance_flags: axis_unjudged_broadened`가 붙는다.
세법 질문이면 그 사건을 세법 근거로 인용하지 마라. 임베딩 장애로 못 잰 것이면 응답에
`retrieval_degraded: "dense_unavailable"`가 붙는다(잠시 뒤 다시 부르면 판정될 수 있다).
세법 개념어가 든 질의는 장애 중에도 정상 때와 같이 판정한다(`axis.axis_measured: false`).
**응답에 `relevance_floor`가 있으면 관련성이 확인되지 않은 히트가 있다**(2026-10-20).
1차·넓힌 히트 모두 판정한다. `unmatched` = 사건명에 질의어가 하나도 없는 히트,
`off_axis` = 세법 축 질의가 아닌데 섞여 온 세법 원장 소산(국세·지방세법령정보시스템) 히트다.
`weak_match` = 질의에 세 글자 이상 핵심어가 있는데 사건명에 맞은 것은 두 글자 낱말뿐인 히트다
('물가변동 조정'의 '조정대상지역지정처분' — 낱말이 다른 합성어 안에 우연히 들었다).
해당 히트에는 `relevance_flags`(`no_query_term_in_title`·`only_short_term_in_title`·
`tax_ledger_on_non_tax_query`)가
붙는다 — 그 사건을 근거로 바로 인용하지 말고 get_case로 쟁점을 확인하라.
`verdict: "no_query_term_in_titles"`면 히트 **전부**가 질의어를 하나도 안 담은 것이다 —
"관련 판례 N건"으로 옮기지 말고 '이 범위에서 못 찾았다'로 전하라(없다고 단정하지 말 것).
Args:
query: 핵심 명사 위주 검색어 (예: "부정당업자 제한", "유찰 수의계약").
**2자 이상 100자 이하**(공백 제외 2자 미만이면 `query_too_short` 오류 —
한 글자 질의는 받지 않는다. 넘치면 `query_too_long`). 자연어 한 문장도
받는다 — 사건명으로 0건이면 핵심어·본문 범위로 자동 재시도한다(최대 2회).
top_k: 종류당 반환 건수 (기본 5, **허용 1~10**). 범위 밖 값은 오류가 아니라
**가장 가까운 허용값으로 보정**된다(0·음수→1, 10 초과→10). 보정했으면
응답의 `top_k_applied`에 요청값·적용값·이유를 실어 공시하므로, 건수가
요청과 다르면 그 필드를 읽어라.
kind: "prec"(법원 판례) | "expc"(법제처 법령해석례) | "all"(둘 다, 기본)
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | all | |
| query | Yes | ||
| top_k | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered; the description goes much further by disclosing response fields (searched, retried, body_scope_caveat, axis, off_topic_warning, relevance_floor, unseen_cnt) and the exact conditions that produce them. That is substantive behavior beyond the annotations. However the volume of conditional caveats is large enough that an agent must parse many paragraphs to extract the operating rules, and several are restated rather than distilled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening two lines are well front-loaded, but the body is very long and dense with bold markup, release version tags (2026-08-29, 1.74.0, 1.78.6, 2026-11-04) and repeated restatements of the 'do not say there are no precedents' rule. Each paragraph carries a distinct caveat, so little is pure waste, but the version stamps and duplicated warnings dilute scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and the tool has many conditional response shapes, so the description must explain return semantics — and it does, covering search_scope, case_no_lookup, axis boundaries, off_topic_warning, axis_unjudged, relevance_floor flags and truncation. Given the tool's complexity, an agent has enough to interpret results and to avoid overclaiming.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does: query length bounds with named error codes (query_too_short/query_too_long), acceptance of natural-language sentences with up to 2 automatic retries, top_k allowed range 1–10 with clamping semantics and the top_k_applied disclosure field, and kind's three values with prec/expc meanings and the default. This is meaning the bare enum and integer schema do not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource (판례·법령해석례 검색) plus the data source and freshness guarantee (law.go.kr 실시간 조회, 항상 현행). It explicitly routes the follow-up to the sibling tool get_case(kind, case_id), so an agent can separate search from fetch without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the triggering situation concretely — disputes, 처분취소, interpretation arguments where 조문 alone is insufficient — and gives the alternative path (get_case for the full text) and an out-of-scope route (국세법령정보시스템 for 예규). It also names what NOT to conclude from 0 results, which is guidance about interpretation rather than just invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_law법령 조문 검색ARead-onlyIdempotentInspect
법령 조문 검색 — 키워드 또는 조문번호로 조문 스니펫 반환(상위 top_k건).
**법령(법률·시행령·시행규칙·별표)만 본다 — 계약예규는 여기 없다.** 공사계약일반조건·정부 입찰·계약
집행기준·예정가격작성기준·용역계약일반조건 같은 예규는 search_references에 있다. 설계변경·물가변동·
기성·준공·지체·계약보증처럼 **계약 집행 실무 질문은 정답의 과반이 예규다**(실측 2026-11-01: 조달청
실무자 질의 306건 중 52%가 예규만 인용) — 그런 질문은 search_references를 먼저(또는 함께) 불러라.
**코퍼스가 둘이고 한 응답은 한 쪽에서만 온다(2026-08-29).** 공공계약(국가·지방계약법
계열 38개 법령)과 **세법**(소득세법·법인세법·부가가치세법·조세특례제한법·지방세법 등
64개 법령)이다. 축은 자동으로 정해진다 — 질의가 세법 법령을 이름으로 부르면 세법
코퍼스로 간다. 법령명이 없어도 세법 고유 개념이면 세법 축에서 찾고, 공공계약
고유 업무를 명시하면 계약 축을 유지한다. 그 밖에는 공공계약 결과가 없거나 의미검색·
주제 밖 낱말 매치뿐일 때 두 축 거리를 비교한다. 이름으로 부른 시행령/시행규칙은
그 하위법령으로 검색을 제한한다(모법 이름만 부르면 기존 검색 유지). `corpus="tax"`/`"contract"`로 강제할 수도 있다.
응답의 `corpus`가 **어느 코퍼스를 봤는지**다 — 세법 결과를 공공계약 근거로,
공공계약 결과를 세법 근거로 인용하지 마라. `note_corpus`가 있으면 왜 그 축이었는지다.
전문이 필요하면 get_law_article(ref)로 이어서 조회.
hit에 note가 있으면 삭제·폐지된 조문이다 — 판단 근거로 인용하지 마라.
**hit의 `implementing_articles`가 있으면 다음 호출이 이미 정해진 것이다.** 그 조문은
"대통령령으로 정하는 바에 따라"라고만 하고 구체적 사유·요건·수치는 거기 적힌 하위
조문에 있다(예: 국가계약법 제7조 → 시행령 제26조 수의계약에 의할 수 있는 경우).
**다른 도구로 다시 검색하지 말고** 그 참조를 그대로 get_law_article에 넣어라.
hit의 `delegated`가 true인데 `implementing_articles`가 없으면 하위 조문이 조문 단위로
특정되지 않은 것이다 — get_law_article로 전문을 열어 `delegations`를 보고 가라.
hit의 `article`이 "[별표 N]"이면 **표**다(2026-08-20 색인). 표 전문은 그 히트의
`law_ref`를 그대로 get_law_article에 넣어 읽는다(조문과 같은 경로다). `related_article`이
있으면 그 표의 근거 조문이니 함께 밝혀라 — 제재 기간·요율 같은 값의 실제 출처가
여기다(근거 조문이 둘 이상이면 `related_articles`에 전부 온다). 별표 제목에
"(제N조 관련)" 표기가 없는 표는 이 필드가 **없다** — 그때는 표 자체를 근거로 인용하라.
질의에 별표 번호를 쓰면('국가계약법 시행규칙 별표2'·'별표 2'·'[별표 2]' 모두 같다) 그 별표가 정확 매치로
맨 앞에 온다. 질의가 별표를 불렀는데 `table_hits: 0`·`table_note`가 오면 이 응답에 별표 히트가 없다는
뜻이다 — hits의 일반 조문을 별표로 인용하지 말고, 우리 색인에 없을 뿐 법령에 없다는 뜻이 아님을 밝혀라.
error가 "no_corpus_match"면 질의한 법령이 이 코퍼스 밖이다 — **그런 규정이 없다는
뜻이 아니므로** 그렇게 답하지 말고 corpus_laws로 범위를 밝힌 뒤 law.go.kr을 안내하라.
error가 "named_law_in_other_axis"면 지정한 corpus가 틀렸다 — 부른 법령은 `law_corpus`
축에 있다. 그 축으로(또는 corpus 생략으로) 다시 불러라.
**범위 공시를 먼저 읽어라(2026-08-29).** `total_found`는 코퍼스에서 맞은 **총수**이고
`count`는 네가 지금 받은 건수다. 둘이 다르면 `note`/`note_coverage`가 왜 잘렸는지
말해 준다 — 그때 "관련 조문은 N건뿐"이라고 답하면 거짓이다. `truncated:true`면 백엔드
반환 상한(`backend_cap`)에 걸린 것이다. `complete:false`는 맞은 조문을 이 응답에 **전부
싣지 못했다**는 뜻일 뿐이다(top_k·백엔드 상한·스캔 상한 중 무엇이든) — 그것만으로
total_found가 하한이 되지는 않는다. **total_found가 하한인지는 오직
`total_found_is_lower_bound`가 말한다**: 그 필드가 없으면 total_found는 정확한 총수다.
`total_found_is_lower_bound:true`면 `total_found`는 **"최소 N건 이상"**이라는 뜻이다 —
우리가 스캔 상한(`scan_limit`)에서 세기를 멈췄으므로 그 숫자를 정확한 총수로 인용하지
마라. 더 필요하면 top_k를 올리거나(최대 20) 법령명·조문번호로 질의를 좁혀 다시 불러라.
`search_scope`/`searched`는 어느 가지로 찾았는지다(article·keyword·token·semantic·
amount=질의의 금액과 같은 값이 본문에 있는 조문 · heading=질의의 용어사전 용어가
조문 제목에 있는 조문, 2026-10-20).
`degraded:"semantic_unavailable"`이면 의미(임베딩) 검색이 장애로 못 돌아 **키워드
매치만**으로 답한 것이다 — 이때의 0건은 부재의 근거가 아니다. 사용자에게 그 사실을
밝히고 핵심어를 바꿔 재검색하라. 같은 때 `retrieval_degraded:"dense_unavailable"`이
함께 온다(search_references와 같은 이름의 도구 공통 판독값).
**`note_currency`가 있으면 조문의 현행 여부를 우리가 지금 확인하지 못한 상태다
(2026-09-23).** 코퍼스는 오프라인 스냅샷이고 law.go.kr 현행과의 대조가 실패하고
있거나 오래됐다 — `law_currency.last_verified_at`·`days_unverified`가 마지막 성공
대조와 경과일이다. 낡았다는 뜻이 아니라 **모른다**는 뜻이니, 조문을 인용할 때 그
사실을 밝히고 law.go.kr 현행 확인을 권하라. 단 note가 "현행판과 개정 이력이 갈림"이면
모르는 게 아니라 현행판의 후행 시행 개정분이 우리 판에 **빠졌을 수 있음을 아는** 것이다.
Args:
query: "수의계약", "시행령 제26조", "제21조", "소득세법 제55조" 등
top_k: 반환 건수 (기본 8, **허용 1~20**). 범위 밖 값은 오류가 아니라 가장
가까운 허용값으로 **보정**되며(0·음수→1, 20 초과→20) 보정 사실은 응답의
`top_k_applied`에 요청값·적용값·이유로 공시된다
corpus: 코퍼스 강제 지정 — "contract"(공공계약) | "tax"(세법). 생략하면 자동.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| top_k | No | ||
| corpus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/idempotent/open-world; the description adds far more: two separate corpora, automatic axis selection, top_k clamping, deleted-article notes, degraded semantic search, unverified currency warnings, and specific error codes (no_corpus_match, named_law_in_other_axis) with how to respond to each. Nothing contradicts 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the sibling exclusion are front-loaded and bolded, but the body is a very long wall of text mixing response-field semantics, error handling, and internal changelog dates like '(2026-08-29)'. The total_found / complete / truncated / total_found_is_lower_bound distinction is restated across several sentences and could be compressed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so return fields must be explained and they are: corpus, note_corpus, implementing_articles, delegated, related_articles, table_hits, search_scope, degraded, note_currency, and the truncation flags. Combined with error-code handling, an agent has what it needs to call and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry every parameter and it does: query examples ('수의계약', '시행령 제26조', '소득세법 제55조'), top_k default 8 with allowed 1–20 and out-of-range correction surfaced via top_k_applied, and corpus values "contract"/"tax" including what happens when omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: returns article snippets by keyword or article number, top_k results. It immediately distinguishes itself from search_references by declaring that only statutes (법률·시행령·시행규칙·별표) are searched and 계약예규 are excluded, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when NOT to rely on it: contract-execution practice questions (설계변경·물가변동·기성·준공·지체·계약보증) are majority 예규 and should go to search_references first or together, with a measured statistic. It also routes follow-up work to get_law_article and even says not to re-search when implementing_articles is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_references예규·세부기준 통합 검색ARead-onlyIdempotentInspect
공공계약 코퍼스 통합 검색 — 법령+계약예규+조달청·행안부 세부기준+실무가이드. LLM 미사용.
search_law가 법령 조문 전용인 것과 달리 예규·적격심사 세부기준·실무가이드까지
검색한다. 낙찰하한율·적격심사 배점·실무 절차 등 법령 본문 밖 질문에 사용하라.
AI 생성 없이 검색 근거 원문만 반환한다(백엔드 LLM 예산 미차감).
국가·지방 자료를 함께 찾는다. 질의에 지방·지자체 표시가 없을 때 지방 자료(지방계약법령·지자체 예규)를
빼도록 설정된 배포에서는 뺀 수를 `local_excluded`·`local_excluded_note`로 싣는다 — 그때 사용자가
지자체 계약을 묻는 것이면 질의에 '지자체'를 넣어 다시 불러라. 국가·지방 조문이 함께 나오면 사용자의
기관(국가기관·공기업 vs 지자체)에 맞는 쪽을 골라 인용하라.
상위 6칸의 감사원 실무가이드 조각은 1건까지, 3위 아래에 온다 — 넘는 것은 7위 뒤로 밀리고 그 수를
`guide_demoted`로 싣는다. 가이드의 해설이 필요하면 질의에 '감사원'·'가이드'를 넣거나 top_k를 늘려라.
배포에 따라 **부처 질의회신 회답**(조달청·행정안전부 1차 해석, 2020 지방계약 질의회신 사례집)이 히트로
섞인다(`source_type: "interpretation"`). 실무자 질문과 같은 질문에 부처가 답한 글이라 쟁점을 짚는 데
쓰되, 회답 스스로 법적 효력이 없다고 밝히는 해석이고 회답일(`interpretation.answered_on`) 뒤 법령이
바뀌었을 수 있다 — 결론은 `interpretation.cited_refs`의 조문을 get_law_article로 현행 원문 확인한 뒤
말하고, 회답을 인용할 땐 '조달청 회신(연월)'처럼 출처와 시점을 밝혀라. 응답 최상위 `interpretation_hits`가
그 수다.
**세법은 이 도구가 못 본다(2026-08-29 정직 공시).** 세법 조문은 별도 코퍼스
(`tax_articles` 64개 법령)에 있고 여기 붙어 있는 채널(BM25·doc2query·rerank)은
공공계약 코퍼스 것이다. 소득세법·법인세법·부가가치세법류 질문은 **search_law**
(자동으로 세법 축으로 간다) 또는 get_law_article로 가라 — 여기서 0건이 나온 것을
"세법에 그런 규정이 없다"로 옮기지 마라.
히트의 `matched_section`이 있으면 그 자리를 만든 것은 **그 항**이고 실려온 본문은
조 전체다 — 근거를 인용할 때 그 항을 밝혀라. 최상위 히트의 `query_expanded`가 있으면
사용자가 타이핑한 말에 용어집 별칭을 덧붙인 질의로 검색·재정렬한 것이다(실무 어휘를
법령 어휘로 잇는 다리 — 원문은 보존).
최상위 히트에 `matched_reference`가 있으면 질의가 호명한 조문(법령명+조번호)을 문자열
동일성으로 1위에 고정한 것이다 — 의미 유사도 순위가 아니다(시행령/시행규칙 혼동 방지).
히트의 `matched_document`는 질의가 예규·세부기준 이름(예: 공사계약일반조건)을 통째로 불러 그
문서의 최상위 히트를 앞으로 올렸다는 뜻이고(`matched_title`은 같은 일을 별지·별표 **제목**을 통째로
불렀을 때 한 것이다), `contract_kind_axis`는 질의가 계약유형 하나(공사·
용역·물품)만 말해 일반조건 히트끼리 그 유형의 일반조건을 앞에 두었다는 뜻이다(둘 다 순서만 바꿈).
히트에 `table_window: true`가 있으면 별표 문서를 고정 길이로 자른 조각이라 별표 표제가 없다 —
`table_boundaries`·`table_window_note`가 발췌 안의 표 경계와 앞 조각의 소속(직전 별표)을 말하니,
경계 앞 산식·배점을 뒤 별표의 것으로 인용하지 마라.
**히트마다 `as_of`(그 문서가 언제 기준인가)가 붙는다.** 법령·예규는 우리가 들고 있는
스냅샷의 시행일자, 실무가이드는 발간 시점이다. 모르는 문서는 `as_of_unknown: true`로
오고 그것은 "현행"이라는 뜻이 아니다. 정적 발간물이 자기보다 **나중에 개정된 법령**을
인용하고 있으면 `superseded_risk`(어느 법령이 언제 개정됐는지)와 `vintage_warning`이
함께 오고, 응답 최상위 `vintage`가 그 요약이다 — 그때는 발췌의 금액·기준 수치를
현행으로 옮기지 말고 get_law_article로 현행 조문을 대조하라(계약방법 판정은
decide_contract_method가 현행 룰로 낸다).
**응답에 `retrieval_degraded: "dense_unavailable"`이 있으면** 의미(임베딩) 검색이
장애로 못 돌아 키워드(BM25) 채널 후보만으로 답한 것이다(`note_retrieval_degraded`) —
평소보다 좁으니 결과에 없는 규정을 "없다"로 옮기지 마라. 그때 키워드 채널도 0건이면
빈 결과가 아니라 `error:"search_unavailable"`(사유 `reason`)로 온다.
**응답에 `off_topic: true`가 있으면 이 질의는 우리 코퍼스 주제 밖으로 측정됐다**
(2026-09-03). 히트가 남아 있어도 그것은 낱말이 겹쳐 회수된 것일 뿐 근거가 아닐 수
있다 — `off_topic_distance`가 최근접 주제 거리이고 `note_off_topic`이 대역을 말한다.
**이때 "관련 규정이 없다"고 옮기지 마라**(우리가 안 담고 있을 뿐이다). excerpt를
직접 읽어 실제로 질문에 답하는지 확인하고, 범위 밖이면 사용자에게 그 사실을 밝혀라.
**지연은 처음 묻는 질의에 5~20초다**(2026-10-20 실측 7.8~12.1초) — 재정렬 때문이다.
`ranking`(예: `rerank:local+rrf`)이 순서를 만든 리랭커를 말한다. 어느 리랭커가 주 경로인지는
배포 설정이 정하며, `local`이 주 경로인 배포에서는 `rerank:local+rrf`가 곧 정상 경로다.
**주 경로가 후보 전량을 재정렬했으면 `rerank`는 싣지 않는다** — 없으면 정상 경로라는 뜻이다.
주 경로가 아닌 리랭커로 답했거나 후보 일부만 재정렬했으면 응답 최상위에 `rerank`(provider·
fallbacks 사유·보낸 후보 범위 `scope`)가 실리고, 폴백 사유가 있으면 `rerank_degraded: true`도
함께 실린다 — 순서가 주 경로 리랭커의 것이 아니라는 공시다. 같은 질의를 곧바로 반복하지 마라.
히트에 `navigation_excluded`가 있으면 목차·차례 청크(와 본문 없이 장·절 제목만 있는 청크 —
`heading_only_excluded`)를 근거가 아니라서 뺀 수다. 히트의 `section_is_heading_label: true`는
section이 '제 4 절' 같은 장·절 번호뿐이라는 뜻이다 — 쪽 경계에서 잘린 본문 조각이니
절 전체를 대표하는 근거로 인용하지 말고 발췌 문장만 인용하라(`section_note`).
Args:
query: 자연어 검색어 (예: "적격심사 낙찰하한율 50억 미만")
top_k: 반환 건수 (기본 6, **허용 1~12**). 범위 밖 값은 오류가 아니라 가장
가까운 허용값으로 **보정**되며(0·음수→1, 12 초과→12) 보정 사실은 응답의
`top_k_applied`에 요청값·적용값·이유로 공시된다
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| top_k | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses far beyond the readOnly/idempotent annotations: 5~20s cold-query latency and its reranking cause, degradation signals (retrieval_degraded, off_topic, rerank_degraded, search_unavailable error), result-shaping behaviors (guide_demoted, local_excluded, navigation_excluded), and freshness metadata (as_of, as_of_unknown, superseded_risk, vintage_warning). Nothing here contradicts the annotations, and the caveats about what must not be inferred ("없다"로 옮기지 마라) are exactly the behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and sibling differentiation are front-loaded, and the dense caveat paragraphs use bold labels so they are scannable. It is long, but with no output schema most of the response-field guidance has nowhere else to live; a few passages (e.g. the rerank/local+rrf explanation) run longer than needed for the operational takeaway.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with only two params, no output schema, and heavy result-shaping behavior, the description covers what an agent must know: scope boundaries, degraded-mode interpretation, freshness/versioning risk, ranking overrides, and which sibling to fall back to. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and does: query gets a natural-language example ("적격심사 낙찰하한율 50억 미만") and implicit hinting that keywords like '지자체'/'감사원' change retrieval, while top_k gets default, hard range 1~12, and out-of-range clamping semantics with the top_k_applied disclosure. This is meaning the bare integer/string schema cannot convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope ("공공계약 코퍼스 통합 검색 — 법령+계약예규+조달청·행안부 세부기준+실무가이드") and immediately distinguishes itself from the sibling search_law ("search_law가 법령 조문 전용인 것과 달리"). It also states the negative scope (세법은 이 도구가 못 본다), so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ("낙찰하한율·적격심사 배점·실무 절차 등 법령 본문 밖 질문"), explicit when-not and alternative (세법 질문은 search_law 또는 get_law_article), plus recovery instructions (지자체 질의 재호출, top_k 늘리기, 같은 질의 반복 금지). Alternatives are named by sibling name and paired with the condition that selects them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Related MCP Connectors
Korean public procurement law: rule-engine rulings, statutes search, live court precedents
Korean statutes, precedents, local business-district stats and public procurement for AI agents.
Access Korea’s G2B procurement and Nara Market data for bid notices, awards, contracts, statistics…
나라장터 입찰공고·사전규격·낙찰정보 검색. Korean public procurement bids via KONEPS open API.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables searching live South Korean government procurement data — open bid notices, KONEPS-contracted suppliers with their contract items and certifications, the public item taxonomy, and multi-year award results — aggregated from KONEPS (나라장터), Defense e-Procurement, LH, K-water and Nuri-jangteo feeds. Supports filtering by keyword, category, type, region, and certification, with Korean-term mapping for English queries and BYOK access for award lookups.302 npmMIT
- AlicenseAqualityDmaintenanceIntegrates 6 Korean public procurement APIs to search, analyze, and manage procurement data using natural language.83MIT
- AlicenseAqualityBmaintenanceEnables AI assistants and terminal users to query Korean laws, precedents, administrative rules, local ordinances, treaties, and interpretations, and to verify citations in AI answers.1011,451 npmMIT
- AlicenseCqualityCmaintenanceSearch, compare, and analyze Korean national laws and public institution internal regulations via MCP.10033 npm2MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.