Skip to main content
Glama

Kolmo Construction

Permit requirements lookup

check_permit_requirements
Read-onlyIdempotent

Check whether a residential construction project in King/Pierce/Snohomish counties requires a permit. Each result carries verdict — required / exempt / depends / unknown — computed from the jurisdiction's own thresholds, the parcel's overlays (when address is given) and the facts you pass; when it is depends, verdict.questions names the facts to ask the homeowner and pass back. requiresPermit is the rule's default posture, not the answer. Also returns timeline, fees, inspections, submittals and the official source URL. Use for "Do I need a permit to build a deck in Seattle?". Pass address to also get the per-item submittal set (submittals_v2). Kinds of work that are not project types (a shed, a retaining wall, a pool, an antenna, grading) are answered from the jurisdiction's own rule for that work when location or address names one; verdict.separatePermits lists any other permit the same work needs (shoreline, floodplain, grading).

Input Schema

NameRequiredDescriptionDefault
factsNoWhat the homeowner has said about the scope, keyed by fact. Each result carries `verdict.questions` naming the facts still open, with their keys; pass the answers back here. Parcel facts (inCriticalArea, inFloodZone, inShoreline, historicOrLandmark, and those a city maps itself, such as inSingleFamilyResidentialZone in Issaquah) are read from the parcel when `address` is given; pass them only without an address.
limitNoMax matching rules to return (default 25). Narrow with projectType/location before raising it.
addressNoFull street address — when provided, the response includes `submittals_v2` from the unified resolver (per-item triggers, source citations, filler actor). Overrides `location` for jurisdiction routing.
locationNoCity or jurisdiction slug, e.g. "Seattle", "Bellevue", "Tacoma", "king-county-unincorporated"
projectTypeNoProject type — canonical: kitchen, bathroom, basement, deck, fence, siding, windows, flooring, adu, roofing, hvac, electrical, plumbing, addition. Also a kind of work, answered with a location or address: accessory-structure (shed), retaining-wall, paving (driveway, patio), swimming-pool, interior-alteration, garage-conversion, awning, play-structure, antenna, water-tank, underground-tank, grading, street-tree
guardRunLengthFtNoTotal guard/railing run in the scope of work, feet. A guard is separately permittable from the surface it stands on; a deck exemption does not carry it.
deckOverStoryBelowNoTrue if any part of the deck is over a basement or a story below. A deck under 30 in is still NOT exempt in Kirkland if it sits over a story.
deckOnAccessibleRouteNoTrue if the deck is part of an accessible route to a building entrance — an independent permit trigger, separate from height.
deckHeightAboveGradeInNoDeck walking surface above grade, inches — measured to the grade below at any point within 36 in of the outer edge.

Output Schema

NameRequiredDescriptionDefault
nextNo
totalNo
parcelNo
messageNo
resultsNo
routingNo
coverageNoPresent on an unfiltered call: the jurisdictions and project types the catalog covers.
overlaysNo
returnedNo
importantNo
disclaimerNo
trustLevelNo"authoritative" when every returned rule is the city's own rule; "mixed" when some are the Washington state floor or not verified for the city (each rule carries its own `source` and `verdict`); or a LEGACY_LLM_SEED warning. Relay the warning or the mixed note if present.
attributionNo
recommendationNo
overlayDisclaimerNo
authoritativeRulesCountNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / facts / description
      Previous value: -"What the homeowner has said about the scope, keyed by fact. Each result carries `verdict.questions` naming the facts still open, with their keys; pass the answers back here. Parcel facts (inCriticalArea, inFloodZone, inShoreline, historicOrLandmark) are read from the parcel when `address` is given; pass them only without an address."New value: +"What the homeowner has said about the scope, keyed by fact. Each result carries `verdict.questions` naming the facts still open, with their keys; pass the answers back here. Parcel facts (inCriticalArea, inFloodZone, inShoreline, historicOrLandmark, and those a city maps itself, such as inSingleFamilyResidentialZone in Issaquah) are read from the parcel when `address` is given; pass them only without an address."
  2. Changed1 schema field changed
    • changedInput schema / properties / projectType / description
      Previous value: -"Project type — canonical: kitchen, bathroom, basement, deck, fence, siding, windows, flooring, adu, roofing, hvac, electrical, plumbing, addition"New value: +"Project type — canonical: kitchen, bathroom, basement, deck, fence, siding, windows, flooring, adu, roofing, hvac, electrical, plumbing, addition. Also a kind of work, answered with a location or address: accessory-structure (shed), retaining-wall, paving (driveway, patio), swimming-pool, interior-alteration, garage-conversion, awning, play-structure, antenna, water-tank, underground-tank, grading, street-tree"
  3. Changed3 schema fields changed
    • changedOutput schema / properties / attribution / properties / citeAs / description
      Previous value: -"Ready-made citation line. Use verbatim."New value: +"Citation line; use verbatim."
    • changedOutput schema / properties / attribution / properties / primarySource / description
      Previous value: -"Present when Kolmo verified but does not author the fact — cite both."New value: +"Kolmo verified, did not author: cite both."
    • changedOutput schema / properties / attribution / properties / sourceUrl / description
      Previous value: -"The specific page these facts render on. Link this, not the site root."New value: +"The page to link, not the site root."
  4. Changed5 schema fields changed
    • removedInput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
    • changedInput schema / properties / facts / description
      Previous value: -"What the homeowner has said about the scope, keyed by fact. Each result carries `verdict.questions` naming the facts still open; pass them back here. Keys: deckHeightAboveGradeIn, deckAreaSqft, deckAttached, deckOverStoryBelow, deckOnAccessibleRoute, deckServesRequiredExit, roofDeck, deckCovered, deckingBoardsOnly, fenceHeightFt, masonryWallHeightFt, fenceInFrontYard, cosmeticOnly, plumbingMovedOrAdded, newCircuits, gasOrMechanicalWork, structuralOrWallChange, tubOrShowerReplaced, surfacesOpened, windowNewOrEnlargedOpening, windowStructuralChange, windowEgressAffected, windowEnergyDowngrade, sidingStructuralChange, sidingInsulationOrWrbChange, sidingStuccoOrVeneer, roofSheathingReplaced, roofMaterialTypeChange, roofLayersAfter, roofUnitWeightPsf, roofMaterialWeightIncreasePsf, roofFramingChange, roofSkylightsOrMechanical, buildingUnreinforcedMasonry, subfloorOrJoistChange, radiantHeat, plumbingLeakRepairOnly, plumbingLikeForLikeSameLocation, plumbingFixtureInstalledOrReplaced, plumbingFixtureAddedOrMoved, waterHeaterReplaced, plumbingNewOrRelocatedPiping, plumbingConcealedPipeReplaced, electricalLikeInKindMinor, newCircuitsOrPanel, hardwiredFixtureOrAppliance, portableAppliance, hvacMinorPartReplacement, treeDbhIn, treeAlderOrCottonwood, treesRemovedThisYear. Parcel facts (inCriticalArea, inFloodZone, inShoreline, historicOrLandmark) are read from the parcel when `address` is given; pass them only without an address."New value: +"What the homeowner has said about the scope, keyed by fact. Each result carries `verdict.questions` naming the facts still open, with their keys; pass the answers back here. Parcel facts (inCriticalArea, inFloodZone, inShoreline, historicOrLandmark) are read from the parcel when `address` is given; pass them only without an address."
    • removedOutput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
    • removedOutput schema / additionalProperties
      Removed value: -true
    • removedOutput schema / properties / attribution / additionalProperties
      Removed value: -true
  5. Changed1 schema field changed
    • changedOutput schema / properties / trustLevel / description
      Previous value: -"\"authoritative\" or a LEGACY_LLM_SEED warning. Relay the warning if present."New value: +"\"authoritative\" when every returned rule is the city's own rule; \"mixed\" when some are the Washington state floor or not verified for the city (each rule carries its own `source` and `verdict`); or a LEGACY_LLM_SEED warning. Relay the warning or the mixed note if present."
  6. Changed1 schema field changed
    • addedOutput schema / properties / routing
      Added value: +{}
  7. Changed1 schema field changed
    • addedInput schema / properties / facts
      Added value: +{
      +  "additionalProperties": {
      +    "type": [
      +      "number",
      +      "boolean"
      +    ]
      +  },
      +  "description": "What the homeowner has said about the scope, keyed by fact. Each result carries `verdict.questions` naming the facts still open; pass them back here. Keys: deckHeightAboveGradeIn, deckAreaSqft, deckAttached, deckOverStoryBelow, deckOnAccessibleRoute, deckServesRequiredExit, roofDeck, deckCovered, deckingBoardsOnly, fenceHeightFt, masonryWallHeightFt, fenceInFrontYard, cosmeticOnly, plumbingMovedOrAdded, newCircuits, gasOrMechanicalWork, structuralOrWallChange, tubOrShowerReplaced, surfacesOpened, windowNewOrEnlargedOpening, windowStructuralChange, windowEgressAffected, windowEnergyDowngrade, sidingStructuralChange, sidingInsulationOrWrbChange, sidingStuccoOrVeneer, roofSheathingReplaced, roofMaterialTypeChange, roofLayersAfter, roofUnitWeightPsf, roofMaterialWeightIncreasePsf, roofFramingChange, roofSkylightsOrMechanical, buildingUnreinforcedMasonry, subfloorOrJoistChange, radiantHeat, plumbingLeakRepairOnly, plumbingLikeForLikeSameLocation, plumbingFixtureInstalledOrReplaced, plumbingFixtureAddedOrMoved, waterHeaterReplaced, plumbingNewOrRelocatedPiping, plumbingConcealedPipeReplaced, electricalLikeInKindMinor, newCircuitsOrPanel, hardwiredFixtureOrAppliance, portableAppliance, hvacMinorPartReplacement, treeDbhIn, treeAlderOrCottonwood, treesRemovedThisYear. Parcel facts (inCriticalArea, inFloodZone, inShoreline, historicOrLandmark) are read from the parcel when `address` is given; pass them only without an address.",
      +  "type": "object"
      +}
  8. Changed9 schema fields changed
    • addedInput schema / properties / limit
      Added value: +{
      +  "description": "Max matching rules to return (default 25). Narrow with projectType/location before raising it.",
      +  "maximum": 200,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • removedOutput schema / properties / attribution / properties / contractorLicense
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / attribution / properties / note
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / attribution / properties / organization
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / attribution / properties / retrievedFrom
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / attribution / properties / url
      Removed value: -{
      -  "type": "string"
      -}
    • changedOutput schema / properties / attribution / required
      Previous value: -[
      -  "organization",
      -  "contractorLicense",
      -  "url",
      -  "sourceUrl",
      -  "citeAs",
      -  "retrievedFrom",
      -  "note"
      -]New value: +[
      +  "sourceUrl",
      +  "citeAs"
      +]
    • addedOutput schema / properties / coverage
      Added value: +{
      +  "description": "Present on an unfiltered call: the jurisdictions and project types the catalog covers."
      +}
    • addedOutput schema / properties / returned
      Added value: +{
      +  "type": "number"
      +}
  9. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": true,
      +  "description": "Either a rule set, or a documented coverage gap carrying `important` + `next`. A gap is never evidence that no permit is required.",
      +  "properties": {
      +    "attribution": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "citeAs": {
      +          "description": "Ready-made citation line. Use verbatim.",
      +          "type": "string"
      +        },
      +        "contractorLicense": {
      +          "type": "string"
      +        },
      +        "note": {
      +          "type": "string"
      +        },
      +        "organization": {
      +          "type": "string"
      +        },
      +        "primarySource": {
      +          "description": "Present when Kolmo verified but does not author the fact — cite both.",
      +          "type": "string"
      +        },
      +        "retrievedFrom": {
      +          "type": "string"
      +        },
      +        "sourceUrl": {
      +          "description": "The specific page these facts render on. Link this, not the site root.",
      +          "type": "string"
      +        },
      +        "url": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "organization",
      +        "contractorLicense",
      +        "url",
      +        "sourceUrl",
      +        "citeAs",
      +        "retrievedFrom",
      +        "note"
      +      ],
      +      "type": "object"
      +    },
      +    "authoritativeRulesCount": {
      +      "type": "number"
      +    },
      +    "disclaimer": {
      +      "type": "string"
      +    },
      +    "important": {
      +      "type": "string"
      +    },
      +    "message": {
      +      "type": "string"
      +    },
      +    "next": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "overlayDisclaimer": {
      +      "type": "string"
      +    },
      +    "overlays": {},
      +    "parcel": {},
      +    "recommendation": {
      +      "type": "string"
      +    },
      +    "results": {},
      +    "total": {
      +      "type": "number"
      +    },
      +    "trustLevel": {
      +      "description": "\"authoritative\" or a LEGACY_LLM_SEED warning. Relay the warning if present.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  10. Changed4 schema fields changed
    • addedInput schema / properties / deckHeightAboveGradeIn
      Added value: +{
      +  "description": "Deck walking surface above grade, inches — measured to the grade below at any point within 36 in of the outer edge.",
      +  "type": "number"
      +}
    • addedInput schema / properties / deckOnAccessibleRoute
      Added value: +{
      +  "description": "True if the deck is part of an accessible route to a building entrance — an independent permit trigger, separate from height.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / deckOverStoryBelow
      Added value: +{
      +  "description": "True if any part of the deck is over a basement or a story below. A deck under 30 in is still NOT exempt in Kirkland if it sits over a story.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / guardRunLengthFt
      Added value: +{
      +  "description": "Total guard/railing run in the scope of work, feet. A guard is separately permittable from the surface it stands on; a deck exemption does not carry it.",
      +  "type": "number"
      +}
  11. Changed1 schema field changed
    • addedInput schema / properties / address
      Added value: +{
      +  "description": "Full street address — when provided, the response includes `submittals_v2` from the unified resolver (per-item triggers, source citations, filler actor). Overrides `location` for jurisdiction routing.",
      +  "type": "string"
      +}
  12. Changed2 schema fields changed
    • changedInput schema / properties / location / description
      Previous value: -"City or area, e.g. \"Seattle\", \"Bellevue\", \"Kirkland\""New value: +"City or jurisdiction slug, e.g. \"Seattle\", \"Bellevue\", \"Tacoma\", \"king-county-unincorporated\""
    • changedInput schema / properties / projectType / description
      Previous value: -"Type of project, e.g. \"deck\", \"kitchen\", \"addition\", \"fence\", \"ADU\""New value: +"Project type — canonical: kitchen, bathroom, basement, deck, fence, siding, windows, flooring, adu, roofing, hvac, electrical, plumbing, addition"
  13. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent annotations: it explains that `verdict` is one of four enumerated values computed from jurisdiction thresholds and parcel overlays, that `depends` returns `verdict.questions` to feed back via `facts`, that `requiresPermit` is a default posture rather than the answer, and that `verdict.separatePermits` lists other required permits. It also discloses the full return surface (timeline, fees, inspections, submittals, source URL).

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 purpose and verdict semantics before the edge-case discussion of non-project-type work. It is dense but nearly every clause carries operational meaning; the only waste is the `submittals_v2` mention appearing twice (once up front, once restated later).

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

Completeness4/5

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

For a 9-parameter, nested-object tool with an output schema and full annotation coverage, the description covers the non-obvious semantics (verdict states, depends-question loop, separate permits, parcel-fact sourcing). What it omits is sibling routing — no guidance on when to use `answer_permit_question` or `get_permit_rule_details` instead.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description still adds cross-parameter meaning the schema does not spell out as clearly — parcel facts are read from the parcel when `address` is given and should only be passed without one, and `address` overrides `location` for routing. This is incremental value on top of an already thorough schema rather than new information.

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

Purpose5/5

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

States a specific verb and resource scoped to three named counties: 'Check whether a residential construction project ... requires a permit.' This is clearly distinct from siblings like estimate_permit_fee, get_permit_timeline, and get_permit_rule_details, which handle fees, timelines, and raw rules respectively.

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?

Provides a concrete trigger example ('Do I need a permit to build a deck in Seattle?') and explains when to pass `address` (to get `submittals_v2`) and how `address` overrides `location`. It does not explicitly say when to prefer `answer_permit_question` or `get_permit_rule_details` instead, leaving that routing to the agent.

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.

Resources