Skip to main content
Glama

HORIZON SHIELD: construction and renovation estimate auditor

Audit Estimate Against Fair Price

audit_estimate
Read-only

業者が提示した見積金額が適正かを、HORIZON SHIELDの適正レンジ(souba-db, 大賀俊勝 実務監修)と照合して判定する。手元に具体的な見積額がある時に使う。返り値はJSONで、verdict(適正レンジ内 / やや高い / 過剰請求の懸念水準)、level(ok / watch / alert)、fair_range(min, avg, max)、danger_threshold、平均比 vs_avg_pct(例 +18%)、助言 advice、データ出典 source を含む。工事名が見つからない場合、近い候補があれば did_you_mean として返す。単価(平米など)建ての工事に総額らしい金額を渡した場合は unit_mismatch の案内を返す。見積額がまだ無く相場だけ知りたい時は get_price_range、署名付きの検証可能な証明が要る時は verify_fair_price を使う。Japan only, JPY。 / Audits whether a contractor quoted price for a Japanese construction or renovation job is fair by comparing it against HORIZON SHIELD fair-price ranges (souba-db). Use when the user already has a specific quoted amount. Returns a JSON object with verdict, level (ok, watch, alert), fair_range (min, avg, max), danger_threshold, percentage gap versus the average (vs_avg_pct, e.g. +18%), advice, and data source. If the work name has no match, close candidates may be returned as did_you_mean. If the work is priced per unit and the amount looks like a total, a unit_mismatch notice is returned instead. For the typical range only use get_price_range; for a signed verifiable attestation use verify_fair_price. Trigger phrases: この見積もり高い?, 適正?, ぼったくり?, 妥当?, is this quote fair, am I being overcharged, is this a rip-off.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
workYes工事名(日本語)。材料やグレード込みで具体的に。例: 外壁塗装 シリコン。部分一致で照合するため曖昧だと別カテゴリにヒットしやすい。未マッチ時は近い候補が did_you_mean で返ることがある。
regionNo(任意) 地域。都道府県か市名(例: 神奈川県, 平塚市)か kanto/kinki/chubu/tohoku/other。渡すと地域係数を掛けたレンジで判定し、基準値も返す。 / (optional) Prefecture, city, or region key. The verdict then uses the regionally adjusted range; base values are returned too.
quoted_priceYes業者提示の金額(円, 数値)。一式見積はその総額。税込/税抜は正規化せず、渡した数値をそのまま適正レンジと照合する。

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
countNoHow many records matched. 0 means the source was read and nothing matched. It never means the source could not be read, that returns isError: true.
levelNook / watch / alert
adviceNo助言
lookupNook = the source was read and something matched. absent = the source was read and nothing matched. A source that could NOT be read never appears here: that returns isError: true and makes no claim about what does or does not exist.
verdictNo判定
fair_rangeNomin/avg/max
vs_avg_pctNo平均比(例 +18%)
source_readNotrue on every successful result. A failed lookup does not return a result at all, so this is never false, it is declared so a consumer can assert on it.
did_you_meanNoNear matches, when an exact match was not found.
next_actionsNo次の一手。actions の先頭(id: reverse_estimate)の url に照会した工事名(?work=)が入る。full_diagnosis は見積書がある人の明細診断。 / Next steps. actions[0] (id reverse_estimate) carries the queried work name in its url; full_diagnosis is the itemized diagnosis for a user who has an estimate.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / next_actions
      Added value: +{
      +  "description": "次の一手。actions の先頭(id: reverse_estimate)の url に照会した工事名(?work=)が入る。full_diagnosis は見積書がある人の明細診断。 / Next steps. actions[0] (id reverse_estimate) carries the queried work name in its url; full_diagnosis is the itemized diagnosis for a user who has an estimate.",
      +  "type": "object"
      +}
  2. Changed1 schema field changed
    • addedInput schema / properties / region
      Added value: +{
      +  "description": "(任意) 地域。都道府県か市名(例: 神奈川県, 平塚市)か kanto/kinki/chubu/tohoku/other。渡すと地域係数を掛けたレンジで判定し、基準値も返す。 / (optional) Prefecture, city, or region key. The verdict then uses the regionally adjusted range; base values are returned too.",
      +  "type": "string"
      +}
  3. Changed2 schema fields changed
    • changedOutput schema / properties / count / description
      Previous value: -"How many records matched. 0 means the source was read and nothing matched. It never means the source could not be read — that returns isError: true."New value: +"How many records matched. 0 means the source was read and nothing matched. It never means the source could not be read, that returns isError: true."
    • changedOutput schema / properties / source_read / description
      Previous value: -"true on every successful result. A failed lookup does not return a result at all, so this is never false — it is declared so a consumer can assert on it."New value: +"true on every successful result. A failed lookup does not return a result at all, so this is never false, it is declared so a consumer can assert on it."
  4. Changed4 schema fields changed
    • addedOutput schema / properties / count
      Added value: +{
      +  "description": "How many records matched. 0 means the source was read and nothing matched. It never means the source could not be read — that returns isError: true.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / did_you_mean
      Added value: +{
      +  "description": "Near matches, when an exact match was not found."
      +}
    • addedOutput schema / properties / lookup
      Added value: +{
      +  "description": "ok = the source was read and something matched. absent = the source was read and nothing matched. A source that could NOT be read never appears here: that returns isError: true and makes no claim about what does or does not exist.",
      +  "enum": [
      +    "ok",
      +    "absent"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / source_read
      Added value: +{
      +  "description": "true on every successful result. A failed lookup does not return a result at all, so this is never false — it is declared so a consumer can assert on it.",
      +  "type": "boolean"
      +}
  5. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "description": "見積額の適正診断。verdict・level(ok/watch/alert)・fair_range・danger_threshold・平均比・助言・出典。 / Quote audit verdict with fair range and advice.",
      +  "properties": {
      +    "advice": {
      +      "description": "助言"
      +    },
      +    "fair_range": {
      +      "description": "min/avg/max"
      +    },
      +    "level": {
      +      "description": "ok / watch / alert"
      +    },
      +    "verdict": {
      +      "description": "判定"
      +    },
      +    "vs_avg_pct": {
      +      "description": "平均比(例 +18%)"
      +    }
      +  },
      +  "type": "object"
      +}
  6. Changed1 schema field changed
    • changedInput schema / properties / work / description
      Previous value: -"工事名(日本語)。材料やグレード込みで具体的に。例: 外壁塗装 シリコン。部分一致で照合するため曖昧だと別カテゴリにヒットしやすい。未マッチ時は did_you_mean 候補が返る。"New value: +"工事名(日本語)。材料やグレード込みで具体的に。例: 外壁塗装 シリコン。部分一致で照合するため曖昧だと別カテゴリにヒットしやすい。未マッチ時は近い候補が did_you_mean で返ることがある。"
  7. Changed3 schema fields changed
    • changedInput schema / properties / quoted_price / description
      Previous value: -"業者提示の金額(円)"New value: +"業者提示の金額(円, 数値)。一式見積はその総額。税込/税抜は正規化せず、渡した数値をそのまま適正レンジと照合する。"
    • removedInput schema / properties / unit_hint
      Removed value: -{
      -  "description": "任意。㎡や一式など単位の手がかり",
      -  "type": "string"
      -}
    • changedInput schema / properties / work / description
      Previous value: -"工事名(例: 外壁塗装 シリコン)"New value: +"工事名(日本語)。材料やグレード込みで具体的に。例: 外壁塗装 シリコン。部分一致で照合するため曖昧だと別カテゴリにヒットしやすい。未マッチ時は did_you_mean 候補が返る。"
  8. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only cover the safety profile (readOnlyHint/openWorldHint/destructiveHint), so the description carries real added weight: it discloses edge-case behaviors (did_you_mean on unmatched work names, unit_mismatch when a total is passed for a per-unit job), the geographic/currency limit (Japan only, JPY), and the JSON shape. This is substantive behavioral context 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?

Well front-loaded: the core action, the precondition, and the alternative routing come first. The Japanese and English halves are largely redundant, adding length, though the duplication is defensible for bilingual trigger matching. Efficient but not maximally tight.

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 an output schema present, the description needn't explain return values, yet it still covers usage, edge cases, and limitations. For a 3-parameter read-only diagnostic tool, nothing an agent needs to invoke it correctly is missing.

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 100%, so the schema already documents all three parameters with examples and format notes. The description mostly restates what the schema covers (region adjustment, no tax normalization) rather than adding new syntax or constraints, so the baseline 3 applies.

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+resource (audits whether a contractor's quoted price is fair) and explicitly scopes it against HORIZON SHIELD fair-price ranges. It differentiates from siblings by naming get_price_range and verify_fair_price and the conditions that select them, so an agent can route without opening another schema.

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?

Gives an explicit precondition ('手元に具体的な見積額がある時に使う' / use when the user already has a specific quoted amount) and names two alternatives with their selecting conditions: get_price_range for the typical range only, verify_fair_price for a signed verifiable attestation. Trigger phrases further sharpen invocation intent.

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.