Skip to main content
Glama

계약방법 판정

decide_contract_method
Read-onlyIdempotent

계약방법 결정론 판정 — 룰엔진이 적용 가능한 계약방법 후보와 법령 근거를 반환.

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" 등
    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"과 같은 뜻이다.
    follow_up_answers: **후속질문 답변** — 이 도구를 한 번 부르면 `follow_up_questions`가
        함께 온다(제한경쟁·공동도급 등 판정을 바꾸는 조건). 사용자에게 물어 답을 얻었으면
        같은 인자에 이것만 더해 **다시 부르면 `final_recommendation`(최종 계약방법)이
        온다.** 형식은 `{질문id: true/false 또는 값}` (예: `{"regional_restriction": true,
        "joint_contract": true}`). 세션 id를 들고 다닐 필요가 없다 — 서버가 같은 호출
        안에서 1단계·2단계를 이어 판정한다. 답을 모르면 넣지 마라(추측 금지).
    selected_rule_id: 후보 중 사용자가 고른 룰 id(예: "SVC_004"). 후보에 없으면 무시되고
        그 사실이 `final_recommendation.selection_ignored_reason`에 적힌다.
    selected_alternative_kind: `practice_alternatives`에서 사용자가 고른 실무 옵션의 kind.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
org_typeNopublic_corp
project_nameNoMCP 조회
service_typeNo
contract_typeYes
estimated_priceYes
is_youth_startupNo
selected_rule_idNo
follow_up_answersNo
negotiation_reasonNo
is_small_enterpriseNo
is_women_enterpriseNo
is_social_enterpriseNo
is_special_expertiseNo
construction_specialtyNo
is_disabled_enterpriseNo
selected_alternative_kindNo
is_sme_competition_productNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / is_special_expertise
      Added value: +{
      +  "default": false,
      +  "title": "Is Special Expertise",
      +  "type": "boolean"
      +}
  2. Changed3 schema fields changed
    • addedInput schema / properties / follow_up_answers
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Follow Up Answers"
      +}
    • addedInput schema / properties / selected_alternative_kind
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Selected Alternative Kind"
      +}
    • addedInput schema / properties / selected_rule_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Selected Rule Id"
      +}
  3. Changed1 schema field changed
    • addedInput schema / properties / is_small_enterprise
      Added value: +{
      +  "default": false,
      +  "title": "Is Small Enterprise",
      +  "type": "boolean"
      +}
  4. Changed4 schema fields changed
    • addedInput schema / properties / is_disabled_enterprise
      Added value: +{
      +  "default": false,
      +  "title": "Is Disabled Enterprise",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / is_social_enterprise
      Added value: +{
      +  "default": false,
      +  "title": "Is Social Enterprise",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / is_women_enterprise
      Added value: +{
      +  "default": false,
      +  "title": "Is Women Enterprise",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / is_youth_startup
      Added value: +{
      +  "default": false,
      +  "title": "Is Youth Startup",
      +  "type": "boolean"
      +}
  5. Changed3 schema fields changed
    • addedInput schema / properties / contract_type / enum
      Added value: +[
      +  "construction",
      +  "service",
      +  "product"
      +]
    • addedInput schema / properties / org_type / enum
      Added value: +[
      +  "national",
      +  "local",
      +  "public_corp"
      +]
    • changedInput schema / properties / service_type / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "technical",
      +      "academic",
      +      "facility",
      +      "it_service",
      +      "other"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  6. First observed

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld). The description adds genuinely non-structured behavior: the deterministic rule engine, the two-stage protocol where one call returns follow_up_questions and a re-call with answers yields final_recommendation, the stateless design ('세션 id를 들고 다닐 필요가 없다'), and the selection_ignored_reason side effect. It does not describe rate limits or failure modes, keeping it below 5.

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?

Front-loaded with the one-line purpose before the Args block, and the length is largely justified by 17 parameters with legal nuance. There is some redundancy, notably the repeated '해당 플래그를 세워라' warnings and restated legal citations across flags, which costs a point.

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, no-output-schema tool with 17 parameters, the description supplies the interaction protocol, return fields (follow_up_questions, final_recommendation, selection_ignored_reason), and per-parameter decision logic, so an agent can drive the full workflow. A few inputs (project_name) are untouched and the exact response shape is described only in passing, so it is not fully exhaustive.

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 coverage is 0%, so the description carries the full burden and does so thoroughly: it enumerates valid values for contract_type, org_type, service_type, construction_specialty, negotiation_reason, and explains the legal basis and thresholds behind each boolean flag (women/disabled/social/youth/small enterprise, special expertise, SME competition product). It also documents the missing-from-schema semantics such as follow_up_answers' shape and selected_rule_id's ignore behavior, far exceeding the bare enum names in 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?

States a specific verb and resource ('계약방법 결정론 판정 — 룰엔진이 적용 가능한 계약방법 후보와 법령 근거를 반환'), naming the algorithm (deterministic rule engine) and the exact output (candidates + legal basis). It is immediately distinguishable from siblings like search_law, get_law_article, and check_price_adjustment, which retrieve law or compute other figures rather than adjudicating a contract method.

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?

Gives concrete when-to-use conditions ('사용자가 여성기업/장애인기업/사회적기업이라고 말하면 반드시 해당 플래그를 세워라'), explicit when-not rules ('답을 모르면 넣지 마라(추측 금지)'), and a clear two-call workflow using follow_up_answers. It stops short of naming sibling tools as alternatives, so it is clear context rather than full alternative routing.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.