kolmo-mcp-server
Server Details
WA permit rules (80+ cities, cited), parcel zoning, L&I license checks, Seattle cost estimates & ROI
- Status
- Healthy
- Uptime
- 99.9% over 38 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- Kolmo-Construction/kolmo-mcp-server
- GitHub Stars
- 0
- Server Listing
- Kolmo Construction
TDQS
Scored across 36 tools
The permit-related cluster has multiple tools with unclear boundaries: answer_permit_question and check_permit_requirements both answer 'do I need a permit?', while get_permit_rule_details and resolve_permit_submittals both expose submittal detail. check_contractor_license_status vs match_contractor_to_permit and list_projects vs list_commercial_services add further ambiguity. Detailed descriptions help, but an agent would frequently need to read several tool docs to pick the right one.
All 36 tools consistently use lowercase snake_case with a verb_noun pattern, and verbs follow predictable roles: list_ for collections, get_ for single items, check_ for verification, and submit_ for actions. Even with varied domain verbs like answer, estimate, lookup, match, and parse, the naming convention is uniform and scannable.
36 tools exceeds the 25+ threshold for a heavy surface, which is a lot for an agent to navigate even though the server covers permits, estimating, content, contractor lookup, and company info. The tools are logically clustered, but the count still feels oversized for a single MCP server. A leaner split into separate permit, content, and estimate servers would be more coherent.
The server covers its apparent domain remarkably thoroughly: permit research, fee estimation, contractor verification, project costing, financing, ROI, weather, company content, blog, reviews, portfolio, procurement codes, and contact submission. There are no obvious dead ends or missing core operations that would cause agent failures for the intended homeowner/contractor information use cases.
Available Tools
36 toolsanswer_permit_questionGrounded permit Q&AARead-onlyIdempotentInspect
Grounded permit Q&A for a specific Seattle-area address. Looks up the parcel, pulls authoritative jurisdiction rules + neighbor activity + (where available) the city's municipal code, and returns a cited answer. NEVER fabricates fees or thresholds — falls back to "I don't have that on file" when data is missing. Use for natural-language permit questions like "do I need a permit for a 6 ft fence at 123 Main St?" or "what permits does an ADU at this address require?"
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Full street address in King, Pierce, or Snohomish County, WA | |
| question | Yes | A single permit/zoning/setback/overlay question about this parcel |
Output Schema
| Name | Required | Description |
|---|---|---|
| answer | Yes | Answer-first prose with the verdict in the opening clause and inline source links. Safe to quote. |
| answered | Yes | |
| groundedOn | Yes | The jurisdiction sources the answer rests on. Cite these plus Kolmo. |
| attribution | Yes | |
| parcelContext | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and non-destructive; the description adds important behavioral context: it cites sources, never fabricates fees/thresholds, and falls back to 'I don't have that on file'. This explains grounding and failure behavior beyond the structured hints.
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?
Three sentences are front-loaded with purpose, then behavior, then usage examples. Every sentence contributes; there is no filler or repetition.
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?
The description covers scope, data sources, return style, fallback behavior, and example uses. With an output schema present and annotations covering safety, nothing essential is missing for an agent to invoke 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 coverage is 100% and the description adds only example phrasing for the question and address parameters, not new format or constraints. Baseline 3 is appropriate because the schema carries the parameter documentation.
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 names a specific resource and action: grounded permit Q&A for a Seattle-area address, with a return value ('cited answer'). It is distinct from sibling tools like check_permit_requirements or get_neighbor_permit_activity because it combines parcel lookup, jurisdiction rules, neighbor activity, and municipal code into an answer.
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 explicitly says 'Use for natural-language permit questions' and gives two concrete examples, so an agent knows when to invoke it. It does not mention exclusions or route to alternatives, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_contractor_license_statusWA contractor license statusARead-onlyIdempotentInspect
Look up any Washington State contractor's license, bond, and insurance status using public L&I data (updated daily). Works for Kolmo or any competitor. Great for verifying a contractor before hiring — checks if they are licensed, bonded, and insured in WA. Search by license number, business name, UBI, or phone number. Results are ranked closest match first; when identified is false, several businesses match and none should be reported as the contractor.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Contractor license number (e.g. "KOLMOL*753JS"), business name (e.g. "Kolmo LLC"), 9-digit UBI, or phone number |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| note | No | |
| found | Yes | false means L&I holds no matching record — a real answer, not a lookup failure. |
| query | Yes | |
| message | No | |
| results | No | |
| verifyUrl | No | |
| identified | No | true: the top results are one business. false: several businesses match, or only part of the name did — do not report any result as the contractor asked about. |
| searchedBy | No | license-number, ubi, phone, trade-name or business-name |
| attribution | No | |
| moreMatches | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, etc.), the description discloses that data is updated daily, results are ranked closest match first, and when `identified` is false, no match should be reported. This is critical behavioral guidance about how to handle ambiguous results, which adds significant value.
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 core purpose is front-loaded in the first sentence. The additional sentences provide useful context about use case, search inputs, and result ambiguity. There is minor redundancy ('checks if they are licensed, bonded, and insured' repeats the first sentence), but overall it is sufficiently concise.
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?
The description covers the essential operational aspects: scope (WA), data source and freshness, accepted query types, and the critical ambiguity handling rule. With an output schema present, an agent has all necessary context to invoke the tool and interpret results 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?
The input schema already fully describes the query parameter with examples and accepted formats (license number, business name, UBI, phone). The description essentially repeats this information without adding new meaning, so the baseline of 3 applies given 100% schema coverage.
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 uses a specific verb ('Look up') and a specific resource ('Washington State contractor's license, bond, and insurance status'). It also clarifies that it works for any competitor and explicitly names the checks (licensed, bonded, insured in WA), which differentiates it from siblings like get_business_info or match_contractor_to_permit.
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?
The description gives a clear use case ('Great for verifying a contractor before hiring') and lists the accepted search terms and result ranking. It does not explicitly name alternative tools or state when not to use this tool, so it stops short of a full when/when-not guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_permit_requirementsPermit requirements lookupARead-onlyIdempotentInspect
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, fee notes, inspection sequence, required submittals, and official source URL — preferring jurisdiction-verified rules. Use for "Do I need a permit to build a deck in Seattle?" or "What permits are required for a kitchen remodel in Bellevue?". Pass address to also receive the structured per-item SubmittalSet (submittals_v2) from the unified permit engine — Seattle is full SDCI fidelity, other 9 verified cities are wa-baseline-stub.
| Name | Required | Description | Default |
|---|---|---|---|
| facts | No | 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. | |
| limit | No | Max matching rules to return (default 25). Narrow with projectType/location before raising it. | |
| address | No | 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. | |
| location | No | City or jurisdiction slug, e.g. "Seattle", "Bellevue", "Tacoma", "king-county-unincorporated" | |
| projectType | No | Project type — canonical: kitchen, bathroom, basement, deck, fence, siding, windows, flooring, adu, roofing, hvac, electrical, plumbing, addition | |
| guardRunLengthFt | No | 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. | |
| deckOverStoryBelow | No | 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. | |
| deckOnAccessibleRoute | No | True if the deck is part of an accessible route to a building entrance — an independent permit trigger, separate from height. | |
| deckHeightAboveGradeIn | No | Deck walking surface above grade, inches — measured to the grade below at any point within 36 in of the outer edge. |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| total | No | |
| parcel | No | |
| message | No | |
| results | No | |
| coverage | No | Present on an unfiltered call: the jurisdictions and project types the catalog covers. |
| overlays | No | |
| returned | No | |
| important | No | |
| disclaimer | No | |
| trustLevel | No | "authoritative" or a LEGACY_LLM_SEED warning. Relay the warning if present. |
| attribution | No | |
| recommendation | No | |
| overlayDisclaimer | No | |
| authoritativeRulesCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already declare readOnlyHint=true and destructiveHint=false, the description adds substantial behavioral context. It explains how the verdict is computed (jurisdiction thresholds, parcel overlays, and facts), what happens when verdict is 'depends' (verdict.questions names facts to ask the homeowner), that requiresPermit is the rule's default posture rather than the answer, and that submittals_v2 fidelity differs by city (Seattle full SDCI, others wa-baseline-stub). This goes well beyond the annotations, giving the agent a realistic model of the tool's behavior and edge cases. No contradiction exists.
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 description is long, but every sentence earns its place. It front-loads the core purpose, then systematically explains the verdict semantics, return fields, usage examples, and the special address behavior. There is no filler or tautology. The structure flows logically from what the tool does, to how to interpret its output, to how to call it effectively. Given the complexity of 9 parameters and a rich output schema, this length is justified and remains concise in intent.
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 tool with 9 parameters, a nested `facts` object, an output schema, and multiple annotations, the description covers the essential workflow: what it does, how to invoke it (including the two natural-language examples), the meaning of key output fields (verdict, requiresPermit), and the special behavior of `address` (submittals_v2 with per-city fidelity). It doesn't repeat parameter-by-parameter details because the schema already provides those, and it doesn't need to describe return structure because the output schema exists. Nothing an agent needs to decide when to call this tool or how to form a correct request 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 100% and each parameter already has a detailed description, so baseline is 3. The description adds meaningful usage semantics: it clarifies that passing `address` also returns `submittals_v2` from the unified permit engine, and explains that parcel-related facts in `facts` should only be passed when no address is given ('Parcel facts ... are read from the parcel when `address` is given; pass them only without an address.'). It also orients the `facts` parameter by stating that verdict.questions name the facts to pass back. These enrichments justify a step above baseline.
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 opens with a precise statement: 'Check whether a residential construction project in King/Pierce/Snohomish counties requires a permit.' It names the specific verb, resource, and geographic scope, and immediately distinguishes itself from siblings like answer_permit_question (a Q&A tool) and resolve_permit_submittals (which likely focuses solely on submittals) by framing the core as a permit-requirement check while also returning submittals. This gives an agent a clear, unambiguous purpose.
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?
The description explicitly provides usage examples: "Use for 'Do I need a permit to build a deck in Seattle?' or 'What permits are required for a kitchen remodel in Bellevue?'" This is clear when-to-use guidance. However, it does not explicitly mention when not to use the tool or name alternatives (e.g., get_permit_rule_details for deep-diving a specific rule, or estimate_permit_fee for cost). The context is strong but lacks explicit exclusionary guidance, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_service_area_coverageService-area coverageARead-onlyIdempotentInspect
Check whether Kolmo takes work in a given city, neighborhood, ZIP or address. Kolmo works across Washington: Puget Sound (Bellingham to Olympia) is the core area and the rest of the state is case by case. coverage is primary (a featured city or Seattle neighborhood), nearby (in the core area), case_by_case (Washington, outside Puget Sound), unconfirmed (not a place this check recognizes: treat it as in area) or out_of_area (outside Washington, the ONLY value that means Kolmo does not take the work). Follow guidance. Also returns the count of completed projects in or near that location.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | City, neighborhood, ZIP or address to check, e.g. "Ballard", "Normandy Park", "98105", "Tacoma" |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | No | |
| verdict | No | |
| coverage | Yes | |
| takesWork | Yes | False only when the place is outside Washington. |
| contactUrl | Yes | |
| attribution | Yes | |
| matchedCity | No | |
| serviceCities | Yes | Featured cities with their own landing pages. NOT the service area boundary: a place missing from this list is not out of area. See serviceRegion. |
| serviceRegion | Yes | |
| nearbyProjectCount | Yes | |
| matchedNeighborhood | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent behavior, and the description adds valuable operational semantics: unconfirmed places should be treated as in-area, out_of_area is the only refusal signal, and a count of completed projects is also returned. This goes well beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, then follows with the decision-relevant coverage values and the extra count return. Every sentence carries necessary information with no filler.
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?
Given the output schema exists and annotations cover safety, the description sufficiently explains the valid response categories, the handling of unrecognized places, and the additional project count. It gives an agent everything needed to invoke the tool and act on the result.
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?
The schema already provides 100% coverage for the single `location` parameter, including examples. The description reinforces that the location can be a city, neighborhood, ZIP, or address, but does not add significant new meaning beyond the schema's own description.
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 opens with a specific action and resource: 'Check whether Kolmo takes work in a given city, neighborhood, ZIP or address.' It names the exact geographic scope (Washington, Puget Sound core) and the distinct return categories, making it clear how this tool differs from siblings like get_business_info or lookup_parcel_by_address.
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 provides strong context on how to interpret results: primary, nearby, case_by_case, unconfirmed, and out_of_area, including the critical note that out_of_area is the only negative value. It does not explicitly name alternative tools or give when-not-to-use conditions, so it falls just 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.
estimate_permit_feePermit fee estimateARead-onlyIdempotentInspect
Estimate the permit fee for a residential project based on jurisdiction, project type, and project valuation. Returns numeric breakdown when the authoritative rule has fee inputs, or qualitative feeNotes (with source URL) when the city publishes fees only as PDFs/spreadsheets. Never fabricates dollar amounts.
| Name | Required | Description | Default |
|---|---|---|---|
| projectType | Yes | Canonical project type | |
| valuationUsd | Yes | Project valuation in USD (materials + labor) | |
| jurisdictionSlug | Yes | Jurisdiction slug, e.g. "seattle", "bellevue", "tacoma" (use list_permit_jurisdictions to discover) |
Output Schema
| Name | Required | Description |
|---|---|---|
| breakdown | No | |
| sourceUrl | No | |
| disclaimer | No | |
| attribution | Yes | |
| permitClass | No | |
| projectType | Yes | |
| jurisdiction | Yes | |
| valuationUsd | No | |
| lastVerifiedAt | No | Verification date for the fee schedule. Relay it with the figure. |
| qualitativeFeeNotes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only/idempotent/non-destructive, and the description adds valuable behavioral context: numeric breakdown when an authoritative rule exists, qualitative feeNotes with a source URL for PDF-only sources, and a strict no-fabrication policy. This goes well beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler: purpose and inputs, return-mode behavior, and anti-fabrication guarantee. The most important information is front-loaded.
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 full schema documentation and an output schema present, the description covers the key additional context: when numeric vs qualitative output occurs and the policy not to invent amounts. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters at 100% coverage, so the description does not need to repeat them. It merely names jurisdiction, project type, and valuation without adding meaning beyond the schema.
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 sentence names a specific verb ('estimate'), a clear resource ('permit fee'), and the exact input basis ('jurisdiction, project type, and project valuation'). This distinguishes it from siblings like check_permit_requirements and answer_permit_question.
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?
The description clearly states this is for residential projects and requires jurisdiction, project type, and valuation. It also explains the fallback condition when cities publish fees as PDFs/spreadsheets, though it does not explicitly name alternatives or exclusions such as commercial projects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_author_bioAuthor profileARead-onlyIdempotentInspect
Get the biography, credentials, expertise areas, and recent articles for a Kolmo Construction blog author. Use this to answer "who wrote this?" or to add author context to blog content.
| Name | Required | Description | Default |
|---|---|---|---|
| author | Yes | Author name or slug, e.g. "Marcus Reid", "marcus-reid", "Emily Chen", "emily-chen" |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| note | No | |
| slug | No | |
| found | Yes | |
| query | No | |
| source | No | |
| expertise | No | |
| profileUrl | No | |
| attribution | No | |
| credentials | No | |
| totalArticles | No | |
| recentArticles | No | |
| availableAuthors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior, so no side-effect disclosure is needed. The description adds the data categories returned but does not address behavior for unknown authors or limits on recent articles; the output schema likely covers return shape.
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?
Two focused sentences; the first front-loads exactly what the tool returns and the second states common use cases. No filler or redundant repetition of schema or annotation details.
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 one fully documented required parameter, safety annotations, an output schema, and a precise use-case statement, nothing needed to invoke this tool 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 coverage is 100%; the author parameter already includes type, required status, and examples like 'Marcus Reid' and 'marcus-reid'. The description adds no extra parameter meaning, but none is needed given the schema's completeness.
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 action ('Get') on an explicit resource ('biography, credentials, expertise areas, and recent articles') for a Kolmo Construction blog author. This clearly differentiates it from sibling tools like get_blog_post and list_blog_posts, which concern post content rather than the author profile.
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 frames when to invoke: to answer 'who wrote this?' or add author context to blog content. It does not name exclusions or alternatives, but the use-case guidance is clear enough to route an agent appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_blog_postBlog post full textARead-onlyIdempotentInspect
Get the full markdown content of a blog post by its slug.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The URL slug of the blog post |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| slug | No | |
| tags | No | |
| title | No | |
| author | No | |
| content | No | Full article body. Quote and summarize freely; do not republish wholesale. |
| summary | No | |
| attribution | Yes | |
| publishedAt | No | |
| readingTimeMinutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds that the return is full markdown content, which is useful, but it does not disclose behavior for missing slugs or other edge cases. An output schema exists, reducing the burden on the description.
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 description is one short, front-loaded sentence with no redundant words. It states the action, the resource, the content type, and the required input efficiently.
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 single-parameter, read-only tool with a rich annotation set and an output schema, the description is complete. An agent can correctly invoke it with a slug and know what to expect without additional documentation.
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 100% and the slug parameter is already described as 'The URL slug of the blog post'. The description only restates 'by its slug' and adds no new semantic value beyond the schema, so the baseline score of 3 is appropriate.
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 uses a specific verb ('Get'), names the exact resource ('full markdown content of a blog post'), and states the lookup key ('by its slug'). This clearly distinguishes it from sibling tools like list_blog_posts and search_content.
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?
The description implies the tool should be used when the caller has a blog post slug and needs the full markdown content, but it never explicitly names alternatives or states when not to use it. Siblings like list_blog_posts and get_author_bio exist, but no routing guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_business_infoBusiness info & credentialsARead-onlyIdempotentInspect
Get Kolmo Construction company information: contact details, hours, service area, specializations, and tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| Yes | ||
| hours | No | |
| phone | Yes | |
| tools | Yes | |
| rating | Yes | |
| address | Yes | |
| founded | No | |
| license | Yes | |
| website | Yes | |
| attribution | Yes | |
| serviceArea | Yes | Featured cities with their own landing pages. NOT the service area boundary: a place missing from this list is not out of area. See serviceRegion. |
| notCertified | Yes | Set-asides Kolmo does NOT hold. Never infer one that appears here. |
| serviceRegion | Yes | Where Kolmo takes work. This decides coverage, not serviceArea. |
| certifications | Yes | |
| specializations | Yes | Trades Kolmo performs. Not all of these have a service page — check list_services before linking one. |
| federalRegistration | Yes | |
| personnelQualifications | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is established. The description adds the scope of the returned data but does not disclose additional behavioral details such as whether the data is cached, likely to change, or limited in coverage.
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 description is a single, front-loaded sentence with a clear subject and an efficient list of content categories. Every phrase earns its place, and there is no repetition of schema or annotation information.
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 parameterless information retrieval tool with an output schema, the description is largely complete: it names the company and the kinds of details returned. The only minor gap is that the title mentions 'credentials' but the description does not list them; however, the output schema is available to supply the full field list.
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?
The input schema has zero parameters, so there are no parameter semantics to explain. Per the baseline for parameterless tools, the description does not need to add parameter guidance, and it correctly focuses on what the tool returns.
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 uses a specific verb ('Get') and resource ('Kolmo Construction company information') and enumerates distinct content categories: contact details, hours, service area, specializations, and tools. This clearly differentiates it from sibling get_* tools like get_author_bio or get_service.
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?
The intended use is implied by the description: agents should call this when they need general company information about Kolmo Construction. However, there is no explicit guidance about when not to use it or which alternative to choose, but the zero-parameter, company-specific scope makes this a minor gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_estimateSeattle cost estimateARead-onlyIdempotentInspect
Seattle cost estimate: range, material/labor split, days, line items.
?=optional; (mat)=get_material_options ID (a unique close name also resolves; an ambiguous one lists candidates).
interior-painting: rooms([{id,name,length,width(ft),height(6-30),paintCeiling,paintTrim,doorCount,windowCount,surfaceCondition(new-drywall|good-condition|poor-condition),trimComplexity(baseboards-only|simple-trim|complex-trim),wallTexture(smooth|light-texture|heavy-texture),roomEmpty}]); paintQuality(mat); paintFinish(flat|eggshell|satin|semi-gloss|gloss); includesPrimer; majorColorChange?(+colorChange{currentColor,targetColor}) exterior-painting: wallArea,trimArea(sqft); doorCount; paintQuality(mat); surfacePrepLevel(minimal|moderate|extensive); includesPrimer; stories?(1-3); colorChange?(+colorChangeData{currentColor,targetColor}) flooring: rooms([{id,name,length,width(ft)}]); flooringMaterial(mat); includesUnderlayment,includesBaseboard,includesRemoval,includesSubfloorPrep; underlaymentType?,baseboardType?(mat); baseboardLinearFeet?(default perimeter); removalType?(carpet|tile|hardwood); transitionCount? deck: deckType(new|existing); dimensions({length,width≤200,height≤30 ft}); deckingMaterial(mat: composite-decking…); framingMaterial(mat); includesRailing,includesStairs; railingMaterial?,finishType?(mat); railingLinearFeet?; stairSteps?(1-30); landingRequired?; deckShape?(rectangle|l-shape|angled-corners|multi-level); skirtingType?(none|lattice|matching-board); existingDeckWorkItems?(existing: ≥1 of stainOrSeal,inspection,replaceFlooring(+_area),replacePosts(+_count),addOrReplaceRailing(+_linearFeet),repairFraming(+_area)) windows: windows([{id,windowType(double-hung|single-hung|casement|slider|awning|picture|bay|bow or row id),width,height(12-120 in),quantity}]); qualityLevel(standard|premium|luxury → vinyl|fiberglass|wood-clad); includesTrimWork,includesRemoval,energyEfficient; trimMaterial?(mat) siding: wallArea(sqft); sidingMaterial(mat); homeHeight(single-story|two-story|three-story); includesInsulation,includesRemoval,soffit; insulationType?(mat); existingSidingType?; trimLinearFeet; soffitLinearFeet?(with soffit) fence: linearFeet; fenceMaterial(mat); height(3-8 ft); gateCount; gateWidth?(ft); style?; terrain(flat|sloped|mixed); includesRemoval,concreteFootings landscaping: yardArea(sqft); includesIrrigation,includesSod,includesMulch,includesSitePrep; irrigationType?; irrigationZones?(with irrigation); sodSquareFeet?(with sod); mulchSquareFeet?(default yardArea); plants?([{id,plantType,quantity,size(small|medium|large)}]); hardscapeFeatures?([{id,featureType,squareFeet,material}]) kitchen: kitchenSize(40-600 sqft); scope(cosmetic|standard|full-gut); cabinets(keep|reface|prefab|semi-custom|custom); countertop(keep|laminate|butcher-block|quartz|granite|marble); appliances(keep|budget|mid-range|premium); flooring(keep|lvp|tile|hardwood); backsplash?,plumbingRelocation?,electricalUpgrade?,island?,lighting? bathroom: bathroomType(half-bath|full-bath|primary-bath|accessible); bathroomSize(20-300 sqft); scope(cosmetic|standard|full-gut); showerTub(keep|tub-to-shower|walk-in-shower|tub-replacement|freestanding-tub); vanity(keep|budget|mid-range|premium); tileWork(none|floor-only|floor-and-shower|full-tile); heatedFloors?,newLighting?,ventilation?,plumbingRelocation? basement: basementSize(150-3000 sqft); scope(open-rec-room|standard-finish|full-suite); ceilingHeight(under-7ft|7-to-8ft|over-8ft); moistureCondition(dry|minor-dampness|active-water); egress(has-egress|needs-egress|not-required); bathroom(none|half-bath|full-bath); kitchenette(none|wet-bar|full-kitchenette); bedroomCount?; flooring(lvp|carpet|polished-concrete|tile); insulation(existing|walls-only|walls-and-ceiling); hvac(extend-existing|mini-split|none-needed); electricalSubpanel?,homeAgePre1978? adu: type(dadu|aadu|basement-conversion|garage-conversion); sizeSqft(200-1200, dadu ≤1000); finishTier(builder|standard|premium); dadu only: foundation?(slab|crawl|stem-wall),sitework?(minimal|standard|heavy),utilityRunFeet?,preApprovedPlan?; treeRemovalCount?; homeAgePre1978?(not dadu) ada: projectScope(single-room|whole-home|bathroom-specific); modifications({grabBars,walkInShower,widerDoorways,ramp,nonSlipFlooring,leverHandles,raisedToilet,rollUnderSink,accessibleCounters,stairLift}, ≥1 true); currentCondition(minor|moderate|major); homeStories?(1-3); doorwayCount?; rampLengthFeet?; flooringSquareFeet? electrical: items[{id,quantity}] (ids: get_material_options) plumbing: items[{id,quantity}] (ids: get_material_options) garage-doors: items[{id,quantity}] (ids: get_material_options) doors: items[{id,quantity}] (ids: get_material_options) concrete: items[{id,quantity}] (ids: get_material_options) insulation: items[{id,quantity}] (ids: get_material_options) gutters: items[{id,quantity}] (ids: get_material_options)
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes | Project input fields — see tool description for required fields per projectType. | |
| projectType | Yes | The type of project |
Output Schema
| Name | Required | Description |
|---|---|---|
| excludes | Yes | Scope NOT priced here. Relay alongside any figure. |
| laborCost | Yes | |
| lineItems | No | |
| totalCost | Yes | Point figure. Relay estimateRange instead — a single number reads as a quote. |
| permitCost | No | Present on deck, kitchen, bathroom, basement, adu and ada. Already inside totalCost. |
| attribution | Yes | |
| projectType | Yes | |
| materialCost | Yes | |
| pricingBasis | No | |
| calculatorUrl | Yes | |
| estimateRange | No | Planning range for Seattle-area work. This is what to relay, with its qualifier attached. |
| contingencyCost | No | Present on basement and adu. When set, a contingency is ALREADY in totalCost — do not add another. |
| getAccurateQuote | Yes | |
| timeEstimateDays | No | |
| contingencyGuidance | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, and non-destructive behavior, so the bar is lower. The description adds useful behavioral context beyond that: it returns a range rather than a fixed quote, includes material/labor split, days, and line items, and explains that material inputs can be resolved by get_material_options ID or close name, with ambiguous names triggering candidate lists.
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 description is long, but the length is justified by the need to document 20 project types. It front-loads the output summary and then organizes each project type's parameter grammar compactly; the dense notation is somewhat hard to scan, but every segment earns 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?
Given the tool's complexity, the description is remarkably complete: it covers all project types, required vs. optional inputs, constraints, defaults, and material references. An output schema exists, so the description does not need to explain return values; nothing essential for invoking the tool correctly appears to be 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?
Although the schema's coverage metric is 100%, the schema merely points to 'see tool description for required fields per projectType.' The description compensates massively by specifying per-project required fields, optional markers, units, ranges, defaults, enum-like values, and material-resolution behavior for all 20 project types.
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 opens with 'Seattle cost estimate: range, material/labor split, days, line items,' which clearly identifies the tool as a cost estimator and previews its outputs. It is specific enough to distinguish from siblings like estimate_permit_fee or get_project_roi, though it lacks an explicit verb phrase like 'get a cost estimate for.'
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?
The description gives no explicit guidance on when to use this tool versus alternatives such as estimate_permit_fee or get_material_options. It implies the tool is for estimating Seattle project costs by listing 20 project types, but it never states conditions, exclusions, or when a sibling would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_financing_optionsHome-improvement financingARead-onlyIdempotentInspect
Get home improvement financing options for a Seattle remodeling project. Returns loan types, estimated monthly payments, typical terms, and eligibility notes. Helps homeowners understand how to pay for a remodel — HELOC, home improvement loans, cash-out refinance, and contractor payment plans.
| Name | Required | Description | Default |
|---|---|---|---|
| creditProfile | No | Approximate credit profile: excellent (750+), good (680-749), fair (620-679). Default: good | |
| projectBudget | Yes | Estimated project cost in USD |
Output Schema
| Name | Required | Description |
|---|---|---|
| options | No | |
| getQuote | Yes | |
| disclaimer | Yes | |
| attribution | Yes | |
| creditProfile | No | |
| projectBudget | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish read-only, idempotent, and non-destructive behavior. The description adds the informational nature of the response and the specific content returned (estimated payments, terms, eligibility notes), which is useful context beyond the structured annotations. There is no contradiction.
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 description is compact: the first sentence states scope, the second lists return contents, and the third adds audience and financing categories. Every sentence earns its place, with no redundancy or filler.
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 only two parameters, full schema descriptions, strong annotations, and an output schema present, the description gives enough context to invoke the tool correctly. It does not cover edge cases or explicit non-use scenarios, but those are minor given the simple input surface.
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 100%, so projectBudget and creditProfile are already documented. The description does not add specific parameter-level detail or explain how budget or credit profile affect the returned options, so it stays at the baseline for a fully covered schema.
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 clearly names the verb 'Get' and the resource 'financing options,' and it enumerates the outputs: loan types, estimated monthly payments, typical terms, and eligibility notes. It does not explicitly contrast with sibling tools, but the financing-specific scope is distinct from nearby tools like get_estimate or get_project_roi.
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?
The description provides clear context for when to use this tool: a Seattle remodeling project where a homeowner needs to understand how to pay for the remodel. It lists relevant financing vehicles (HELOC, home improvement loans, cash-out refinance, contractor payment plans), though it does not state exclusions or directly name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_material_catalogMaterial catalogARead-onlyIdempotentInspect
Browse the full material catalog with pricing — flooring types, paint grades, decking materials, siding, windows, fencing, and more. Use category to filter. Returns material IDs compatible with get_estimate.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 25) | |
| offset | No | Pagination offset (default 0) | |
| search | No | Filter by keyword in material name or description | |
| category | No | Filter by category: painting, flooring, decking, siding, windows, fencing, landscaping |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| limit | Yes | |
| total | Yes | |
| offset | Yes | |
| results | No | |
| attribution | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safe read-only behavior is covered. The description adds useful behavioral context beyond annotations: the catalog is 'full' and includes pricing, and the returned material IDs are explicitly compatible with get_estimate. It does not add every operational detail, but the annotations lower the burden and the description complements them well.
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 description is two sentences with no filler. The core purpose is front-loaded, followed by one filtering tip and one output-compatibility note, all of which earn their place. This is a model of concise, structured documentation.
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?
Given the low complexity (four optional, well-described parameters), rich annotations, and an output schema, the description is complete enough for an agent to select and invoke the tool correctly. It states the purpose, the filtering option, and the downstream use of the returned IDs. No critical invocation detail 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?
The schema provides descriptions for all four parameters (limit, offset, search, category), so schema coverage is 100% and the baseline is 3. The description only repeats the category-filter concept and adds no new parameter syntax, defaults, or formatting details beyond what the schema already provides. It meets the baseline but does not elevate it.
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 specific verb and resource: 'Browse the full material catalog with pricing' and lists concrete material types. It also adds a distinctive output detail ('Returns material IDs compatible with get_estimate'), which helps differentiate it from many siblings. However, it doesn't explicitly distinguish itself from the similarly named get_material_options, so it stops short of a 5.
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?
The description provides clear context: an agent can use this tool to browse materials and obtain IDs for get_estimate. The instruction 'Use category to filter' gives practical invocation guidance. It never explicitly names when not to use it or compares it to alternatives like get_material_options, so it lacks the explicit exclusion language needed for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_material_optionsMaterial options by project typeARead-onlyIdempotentInspect
Get available material choices for a project type — flooring types, paint grades, decking materials, kitchen/bath/basement/ADU scope tiers, ADA modifications, etc. Use the returned IDs in the project fields of get_estimate.
| Name | Required | Description | Default |
|---|---|---|---|
| projectType | Yes | The project type to list materials for |
Output Schema
| Name | Required | Description |
|---|---|---|
| options | No | Shape varies by project type — an array of {id,name,costPerUnit,unit} for the material-driven types, a keyed catalog for the scope-driven ones (kitchen, bathroom, basement, adu, ada). |
| attribution | Yes | |
| projectType | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well-covered. The description adds no additional behavioral detail beyond the fact that it returns IDs, but it does not contradict 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?
The description is two sentences with no filler. The first sentence states the core function with concrete examples, and the second sentence gives the practical downstream use, earning its place by connecting this tool to get_estimate.
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 single-parameter, read-only lookup tool with a rich enum and an output schema, the description is complete. It explains what is returned, gives representative coverage across project types, and tells the agent how the result should be used.
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 100%, with a clear description and enum for projectType, so the schema carries the parameter documentation burden. The description adds contextual examples of material categories but no additional parameter semantics beyond what the schema already provides.
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 uses a specific verb and resource combination ('Get available material choices for a project type') and elaborates with concrete examples like flooring types, paint grades, and decking materials. It also distinguishes this tool by tying it to get_estimate, which differentiates it from sibling tools such as get_material_catalog.
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?
The description provides clear context by stating that returned IDs should be used in the project fields of get_estimate, giving agents a concrete downstream purpose. It does not explicitly state when not to use this tool or name alternative tools, so it stops just 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.
get_neighborhood_project_activityKolmo work in a neighborhoodARead-onlyIdempotentInspect
See what remodeling projects Kolmo Construction has completed in a specific Seattle neighborhood or city. Returns project counts by category, example projects, and typical project descriptions. Great for hyperlocal social proof — e.g. "Has Kolmo worked in Ballard?" or "What has Kolmo done in Capitol Hill?"
| Name | Required | Description | Default |
|---|---|---|---|
| neighborhood | Yes | Seattle neighborhood or city, e.g. "Ballard", "Capitol Hill", "Bellevue", "Queen Anne" |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| byCategory | No | |
| contactUrl | No | |
| attribution | No | |
| neighborhood | No | |
| portfolioUrl | No | |
| projectsFound | Yes | |
| recentExamples | No | |
| overallPortfolio | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and destructiveHint. The description adds useful behavioral context by stating what the tool returns and its scoping to a neighborhood/city. It does not disclose caveats like data freshness or empty-result behavior, but the output schema covers the return shape and the annotations cover the safety profile.
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?
Three sentences with no filler: the first states the action, the second describes the returned data, and the third gives practical usage examples. Each sentence earns its place and the most important information is front-loaded.
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 read-only, single-parameter lookup with a full input schema and an output schema, the description is complete. It covers what the tool does, the nature of the results, and sample user questions it answers. Nothing essential is missing for an agent to decide when and how to invoke it.
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?
The single parameter is fully documented in the schema with examples ('Ballard', 'Capitol Hill', 'Bellevue', 'Queen Anne'), and schema description coverage is 100%. The description reinforces the same semantics but does not add meaning beyond what the schema already provides, so the high-coverage baseline of 3 is appropriate.
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 opens with a specific verb and resource: 'See what remodeling projects Kolmo Construction has completed in a specific Seattle neighborhood or city.' It further clarifies the output ('project counts by category, example projects, and typical project descriptions'), making the purpose unmistakable and distinguishing it from siblings like get_neighbor_permit_activity or list_projects.
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?
The description gives concrete use-case examples: 'Has Kolmo worked in Ballard?' and 'What has Kolmo done in Capitol Hill?' This effectively communicates when to use the tool, but it does not explicitly contrast it with alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_neighbor_permit_activityNeighborhood permit activityARead-onlyIdempotentInspect
Aggregate permit activity within ~1500 ft of a Seattle-area parcel over the last 24 months. Returns total count, breakdown by category, and recent example permits (anonymized — no addresses). Sourced from city open-data portals (Socrata). Currently supports Seattle; other jurisdictions return jurisdictionSupported=false. Use to gauge neighborhood activity before quoting an unusual project, or to set homeowner expectations on what neighbors have built.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Full street address in King, Pierce, or Snohomish County, WA |
Output Schema
| Name | Required | Description |
|---|---|---|
| found | Yes | |
| activity | No | |
| disclaimer | Yes | |
| attribution | Yes | |
| jurisdiction | No | |
| supportedJurisdictions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable behavioral context beyond these: results are anonymized (no addresses), sourced from city open-data portals, and only Seattle is supported while other jurisdictions return jurisdictionSupported=false. This clarifies edge cases and data handling, which is especially useful given the openWorldHint. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with zero redundant phrases. It front-loads the core function in the first sentence, then details the output and source, and ends with practical use cases. Every sentence earns its place, making it efficient and easy to scan.
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 tool with a single parameter, comprehensive annotations, and an output schema (as indicated by context signals), the description covers all necessary aspects: what it does, what it returns, data provenance, jurisdiction limitations, and use cases. No critical information is missing for an agent to invoke it 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 100%, so the schema already documents the 'address' parameter clearly (full street address in King, Pierce, or Snohomish County, WA). The description enhances this by specifying that the tool targets 'Seattle-area parcels' and noting that other jurisdictions return jurisdictionSupported=false, which tells the agent that addresses outside Seattle may not produce useful results. This nuance goes beyond the schema's generic county list, adding meaningful semantic guidance.
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 clearly states the verb 'aggregate' and resource 'permit activity' with precise scope (within ~1500 ft, last 24 months, Seattle-area parcel). It also lists the return payload (count, category breakdown, anonymized example permits) and data source (Socrata). This differentiates it from siblings like get_neighborhood_project_activity, which focuses on projects rather than permits.
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?
The description provides explicit use cases: 'gauge neighborhood activity before quoting an unusual project' and 'set homeowner expectations on what neighbors have built.' However, it does not explicitly name alternatives or state when not to use this tool, such as differentiating from get_neighborhood_project_activity. The context is clear but lacks explicit exclusions, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_permit_data_freshnessPermit source freshnessARead-onlyIdempotentInspect
Source-freshness telemetry for the permit catalog. Returns per-jurisdiction last-verified dates, a per-jurisdiction source-health rollup (which cities have a reachable / gone / blocked official source right now), and the latest results from the weekly source-of-truth snapshot pipeline (HTTP status, change-detection vs prior fetch). Failures are classified: missing means the page is gone, blocked means the host refused our fetch and is NOT evidence the source is gone. Use to answer "how current is this fee/timeline?" or to surface confidence in a permit answer. The /permits/data-quality page exposes the same signals.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max snapshots to return (default 5, newest first) | |
| jurisdictionSlug | No | Optional jurisdiction filter (e.g., "seattle", "bellevue"). When omitted, returns rollup across all jurisdictions. |
Output Schema
| Name | Required | Description |
|---|---|---|
| totals | No | |
| coverage | No | |
| pipeline | Yes | |
| publicView | Yes | |
| attribution | Yes | |
| sourceHealth | No | |
| jurisdictions | No | |
| changeDetection | No | |
| recentSnapshots | No | |
| howToReadFailures | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds valuable behavioral context by explaining failure classifications (missing vs blocked) and clarifying that 'blocked' does not imply the source is gone. This goes beyond the annotations without contradicting them.
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 description is moderately long but each sentence contributes value—explaining the response contents, failure semantics, and usage. It front-loads the key purpose and structures the information logically. Slightly verbose in the listing of pipeline details, but not wasteful.
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?
Given the output schema exists and the description thoroughly describes what data is returned (per-jurisdiction dates, health rollup, snapshot results, failure classifications), an agent has enough context to know when to call this tool and what to expect. The description also ties it to permit confidence, completing the reasoning chain.
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 100% with both parameters clearly described in the schema. The description does not add extra parameter semantics beyond the schema, but since the schema already fully covers them, the baseline of 3 is appropriate. No additional insight is provided in the description text.
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 clearly states the tool returns source-freshness telemetry for the permit catalog, including last-verified dates, health rollup, and snapshot pipeline results. It specifies the resource (permit catalog) and the action (retrieve freshness), and the mention of failure classification distinguishes it from generic data queries.
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 usage guidance is given: 'Use to answer
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_permit_rule_detailsPermit rule detailARead-onlyIdempotentInspect
Enumerate permit rules with full detail — timeline, fee model, inspection sequence, submittals, required contractor specialties. Filter by jurisdiction slug or keyword. Use for "what does a Seattle ADU permit require?" or to list all rules for a jurisdiction. Pass address to also receive submittals_v2 (structured per-item SubmittalSet from the unified resolver) per rule.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 10 — rules are ~1K tokens each) | |
| address | No | Full street address — when provided, each result row also includes `submittals_v2` from the unified resolver (per-item triggers, source citations, filler actor). | |
| keyword | No | Keyword in project type, trigger, thresholds, or notes (e.g. "deck", "adu", "egress") | |
| jurisdiction | No | Jurisdiction slug or display name (e.g. "seattle", "bellevue", "tacoma") | |
| onlyAuthoritative | No | Default true: return only 'authoritative' and 'wa-baseline' rules. Set false to also return every other tier, including 'web-fetched' rows — these are published but deliberately not shown on Kolmo's city pages, and their cited source is not verified to state the rule. Prefer the default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| parcel | No | |
| matched | Yes | |
| results | No | |
| returned | Yes | |
| disclaimer | Yes | |
| totalRules | Yes | |
| attribution | Yes | |
| authoritativeRules | Yes | |
| jurisdictionsWithAuthoritativeCoverage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds meaningful context on output scope, filtering, and the conditional submittals_v2 enhancement when address is provided. With the safety profile already covered by annotations, the added conditional behavior earns a 4.
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?
Three sentences with strong front-loading: purpose and detail come first, use cases second, and the optional address enhancement last. Every sentence earns its place with no repetition of schema content.
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 read-only enumeration tool with a rich output schema and fully described parameters, the description covers selection, use cases, filters, and the optional enhancement path. Nothing essential appears to be missing for an agent to invoke it 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 100%, so the baseline is 3. The main description restates filtering and the address-triggered submittals_v2 behavior but adds no new parameter meaning beyond what the schema already documents.
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 clear verb and resource ('Enumerate permit rules') and lists concrete detail dimensions, plus example queries like 'what does a Seattle ADU permit require?'. It does not explicitly differentiate from siblings such as resolve_permit_submittals or check_permit_requirements, so it falls just short of a 5.
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 scenarios ('Use for ... or to list all rules for a jurisdiction') and clarifies the optional address-triggered submittals_v2 behavior. It does not name alternative sibling tools or state when not to use it, so exclusions are missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectProject case studyARead-onlyIdempotentInspect
Get full details for a specific project by its slug, including before/after images and testimonial. If not found, returns a list of available slugs.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The URL slug of the project |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| slug | No | |
| title | No | |
| attribution | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds valuable behavioral context beyond annotations by specifying the not-found behavior: 'If not found, returns a list of available slugs.' This helps an agent handle an edge case without guessing.
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?
Two sentences with no filler. The core purpose and return content are front-loaded, and the fallback behavior is appended in a separate clause. Every word contributes to understanding.
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 one-parameter read-only tool with an output schema and full parameter coverage, the description is complete: it states the lookup key, the nature of the returned data, and the not-found fallback. No critical behavior is left unexplained.
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 100% and the single 'slug' parameter is already described as 'The URL slug of the project.' The description only repeats the concept of selecting by slug without adding new semantic detail, so it meets the baseline but does not elevate it.
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 names a specific verb ('Get'), a precise target ('full details for a specific project'), and the required identifier ('by its slug'). It also distinguishes itself from sibling tools like get_project_roi and get_project_testimonials by explicitly including before/after images and testimonial as part of the returned details.
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?
The description clearly implies when to use it: when you need full project details for a known slug. However, it does not explicitly contrast this with sibling tools like list_projects for discovering slugs or get_project_testimonials for only testimonial data, leaving the when-not-to-use guidance to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_roiRenovation ROIARead-onlyIdempotentInspect
Get the estimated return on investment (ROI) for a home remodeling project in the Seattle area. Based on Remodeling Magazine Cost vs. Value data for the Pacific Northwest. Helps homeowners decide which projects add the most resale value — e.g. "What ROI does a kitchen remodel get in Seattle?" or "Which remodel pays off the most?"
| Name | Required | Description | Default |
|---|---|---|---|
| projectType | No | Type of project, e.g. "kitchen", "bathroom", "deck", "windows", "siding", "ADU", "basement". Omit to see all projects ranked by ROI. | |
| estimatedCost | No | Your estimated project budget in USD. If provided, returns expected resale value added. |
Output Schema
| Name | Required | Description |
|---|---|---|
| market | Yes | |
| source | Yes | Third-party dataset. Cite it alongside Kolmo. |
| results | No | |
| disclaimer | Yes | |
| attribution | Yes | |
| neighborhood | No | |
| getAccurateQuote | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and idempotent, and the description adds the important geographic limitation (Seattle area / Pacific Northwest) and the fact that the value is an estimate based on Remodeling Magazine data. It does not contradict annotations, and the output schema covers the return shape.
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?
Two sentences plus two examples, front-loaded with the core action and scoped immediately. The examples earn their place by illustrating natural-language use, so the description is appropriately sized without 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 an output schema present, read-only annotations, 100% parameter documentation, and a clear statement of scope and data source, an agent has what it needs to select and invoke the tool. The only minor gap is an explicit caveat about data/update limitations, but that is not required for correct invocation.
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 100%, and both projectType and estimatedCost are already documented with examples and semantics. The description adds no new parameter-level detail, so baseline 3 is appropriate.
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, and geographic scope: 'Get the estimated return on investment (ROI) for a home remodeling project in the Seattle area.' It also names the data source and distinguishes itself from generic estimation tools by focusing on resale value for homeowners.
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 frames when to use it: to help homeowners decide which projects add the most resale value, with two natural-language examples. It does not explicitly state alternatives or when-not-to-use, 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.
get_project_testimonialsProject testimonialsARead-onlyIdempotentInspect
Get customer testimonials tied to a specific project (by slug or keyword) from the testimonials table. Returns star rating, customer name, project name, and quote text. Use to source social proof or case-study quotes for a particular job. For unfiltered reviews, use list_reviews.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 10) | |
| keyword | No | Keyword to fuzzy-match against testimonial project name or content (e.g. "kitchen", "deck") | |
| minRating | No | Minimum star rating (1-5, default 1) | |
| projectSlug | No | Project slug to match (e.g. "ballard-kitchen-remodel"). Falls back to title match. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| total | Yes | |
| results | Yes | |
| attribution | Yes | |
| averageRating | Yes | |
| filterApplied | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and non-destructive behavior, so the bar is lower. The description adds useful context beyond annotations by naming the source table, specifying returned fields, and implying fuzzy/keyword matching behavior, which aligns with the annotation profile.
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 description is compact and front-loaded with the core operation, followed by return fields, use case, and sibling alternative. Every sentence adds distinct value and none of the content is redundant with the schema.
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 read-only, idempotent lookup tool with no required parameters and a full output schema, the description covers the essential decision context: what it does, what it returns, when to use it, and when not to. The sibling alternative and use case complete the picture.
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 100%, so the schema already documents all four parameters including their meanings and defaults. The description adds only light semantic context ('by slug or keyword', 'for a particular job') without exceeding what the schema offers, matching the baseline for full coverage.
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 begins with a specific verb-resource pair, 'Get customer testimonials tied to a specific project', and clarifies the lookup method ('by slug or keyword') and the data source ('from the testimonials table'). It also lists the returned fields, which distinguishes it from broader review 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?
It states an explicit use case: 'Use to source social proof or case-study quotes for a particular job.' It also gives a direct alternative and condition: 'For unfiltered reviews, use list_reviews,' providing clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_serviceResidential service detailARead-onlyIdempotentInspect
Get full details for a specific residential service by its slug. If not found, returns a list of available slugs to help you pick the right one.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The URL slug, e.g. "kitchen-remodeling" |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| slug | No | |
| title | No | |
| attribution | Yes | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds a valuable behavioral detail beyond annotations: on not-found it returns a list of available slugs to help the caller choose the correct one. This enriches the agent's understanding of the tool's failure mode.
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?
Two sentences, no filler, and the main action is stated first. The fallback behavior is a natural second sentence, making the description efficient and well structured.
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 single-parameter read-only lookup with an output schema, annotations, and a clear fallback behavior, the description is complete. Nothing an agent needs to call the tool 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?
The schema has 100% description coverage for the single 'slug' parameter, including a concrete example. The description only reinforces 'by its slug' without adding new parameter-level semantics, so the baseline of 3 is appropriate.
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 uses a specific verb ('Get full details') and a specific resource ('residential service') keyed by slug, clearly distinguishing this from list_services and list_commercial_services. The phrase 'full details' also separates it from lighter summary 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?
The description clearly conveys when to use the tool: when you need details for a specific residential service identified by slug. The not-found fallback also provides practical guidance for a wrong/invalid slug. However, it does not explicitly name alternatives like list_services for browsing, though that is strongly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_weather_windowExterior-work weather windowARead-onlyIdempotentInspect
Check if upcoming weather in Seattle is suitable for an exterior construction project. Returns a day-by-day forecast with go/no-go recommendations based on project-specific requirements (temperature, rain, wind). Perfect for scheduling exterior painting, decking, roofing, landscaping, siding, or fencing.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of days to forecast (1-14, default 7) | |
| projectType | Yes | Type of project to check weather suitability for |
Output Schema
| Name | Required | Description |
|---|---|---|
| summary | No | |
| forecast | No | |
| location | Yes | |
| attribution | Yes | |
| projectType | No | |
| forecastDays | Yes | |
| requirements | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds valuable behavioral detail by specifying the day-by-day forecast format and the go/no-go criteria (temperature, rain, wind), going 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two focused sentences with no filler. The first sentence states the main purpose and output; the second supplies relevant use cases.
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?
A simple two-parameter tool with a fully documented schema and output schema. The description covers location, purpose, output shape, and the decision criteria, leaving no material gap for an agent to call it 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 100%, so the baseline is 3. The description mentions project-specific requirements and lists project types, but does not add syntax or format details beyond what the schema already provides.
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 ('Check if upcoming weather in Seattle is suitable for an exterior construction project') and a clear output ('go/no-go recommendations'). It is unambiguously the weather tool among the sibling set.
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?
Provides clear use context with concrete project types ('Perfect for scheduling exterior painting, decking, roofing, landscaping, siding, or fencing'). It does not explicitly list exclusions or alternative tools, but the intended usage is evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_blog_postsBlog indexARead-onlyIdempotentInspect
List published blog posts about home remodeling, renovation costs, and construction tips. Filter by tag or author name.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Filter posts by tag, e.g. "flooring", "deck", "painting" | |
| limit | No | Max posts to return (default 10) | |
| author | No | Filter posts by author name, e.g. "Marcus Reid" | |
| offset | No | Pagination offset (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| total | Yes | |
| hubUrl | Yes | |
| offset | Yes | |
| results | Yes | |
| attribution | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety: readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds the 'published' status constraint and the topic focus, which is useful context, but it does not disclose ordering, pagination behavior, or filter-combination semantics beyond what the schema already implies.
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?
Two compact sentences with no filler. The action and scope are front-loaded, and the filter capability is stated in the second sentence without unnecessary detail.
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?
Given the rich annotations, complete parameter schema, and presence of an output schema, the description is sufficient. It identifies the content domain, the published-only scope, and the available filters; nothing critical is missing for a caller to invoke this 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 100%, so the schema fully documents the four parameters. The description mirrors the tag and author filters but adds no extra meaning about parameter formats, defaults, or behavior beyond what the schema provides.
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 specific verb ('List'), a clear resource ('published blog posts'), and a topical scope ('home remodeling, renovation costs, and construction tips'). It also names the two filtering dimensions, which distinguishes it from siblings like get_blog_post or search_content.
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?
The action is clear, but there is no explicit guidance on when to choose this tool over alternatives such as get_blog_post for a single post or search_content for full-text search. The intended use is implied rather than stated with exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_blog_tags_and_categoriesBlog topic coverageARead-onlyIdempotentInspect
Enumerate every tag and category used across Kolmo's published blog posts, with post counts. Use this to discover what topics Kolmo publishes on before calling list_blog_posts, or to surface coverage gaps.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | Yes | |
| usage | Yes | |
| categories | Yes | |
| totalPosts | Yes | |
| attribution | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows it is a safe read operation. The description adds a scope guarantee ('every tag and category') and post counts, but does not disclose any further behavioral details such as pagination, ordering, or data freshness.
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?
Two sentences with no filler. The primary action is stated first, followed by the practical use case. Every sentence contributes meaningful information.
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?
Given that there are no parameters, an output schema exists, and the annotations already cover safety behavior, the description fully covers what the tool does and when to use it. Nothing essential 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?
The tool has zero parameters and the schema description coverage is 100%, so there is nothing missing for the description to clarify. With no parameters, the description is not burdened with parameter semantics, and the baseline of 4 applies.
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 specific verb ('enumerate'), a specific resource ('every tag and category'), and the scope ('Kolmo's published blog posts') while also noting it returns post counts. This clearly distinguishes it from sibling tools like list_blog_posts, which list posts rather than their metadata.
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 explicitly tells the agent when to use the tool: before calling list_blog_posts to discover topics, or to surface coverage gaps. This is actionable and provides clear context, even though it does not enumerate all possible alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_commercial_servicesCommercial & public-works servicesARead-onlyIdempotentInspect
List commercial construction services with slugs and citable page URLs. Optionally filter by category: office, retail, industrial, hospitality, public. The "public" category covers public works and government contracts — Kolmo is WA State SEDBE-certified (#D700031098), King County SCS-certified (#7259), prevailing wage compliant, and MRSC Small Works Roster eligible (projects under $350K).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 50) | |
| offset | No | Pagination offset (default 0) | |
| category | No | Filter: office, retail, industrial, hospitality, public |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| total | Yes | |
| hubUrl | Yes | |
| offset | Yes | |
| results | Yes | |
| attribution | Yes | |
| publicWorks | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already communicate read-only, idempotent, non-destructive behavior. The description adds context about output contents and the meaning of 'public', but does not disclose additional behavioral traits such as pagination defaults, rate limits, or authentication requirements. No contradiction exists.
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 main function and filter options are front-loaded in one clear sentence. The certification details add length, but they are relevant to the 'public' category and not filler.
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 an output schema present and annotations covering the safety profile, the description covers purpose, filter semantics, and output expectations well. Pagination and limit details are left to the schema, which is acceptable. The only slight gap is the lack of explicit guidance about when to prefer this over list_services.
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?
The schema covers all parameters with 100% coverage, so the baseline is 3. The description adds real semantic value by enumerating category values and especially by explaining that 'public' covers public works and government contracts, plus certification/eligibility details that make the filter meaningful.
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 clearly states the tool lists commercial construction services with specific output fields (slugs and citable page URLs). The 'commercial' + 'public-works' framing distinguishes it from the broader sibling list_services even though no sibling is named.
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?
The description explains the optional category filter and gives useful context about the 'public' category, but it never explicitly says when to use this tool over list_services or other sibling list tools. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_permit_jurisdictionsPermit jurisdiction coverageARead-onlyIdempotentInspect
List the jurisdictions in Kolmo's permit catalog (King, Pierce, Snohomish counties). Compact by default — results is keyed by county (King / Pierce / Snohomish), each a list of {slug, name, verified} — the whole catalogue in one call (~4K tokens), enough to pick a jurisdictionSlug for estimate_permit_fee, check_permit_requirements or get_permit_rule_details. Pass slug for one jurisdiction's full record (department, fee-schedule URL, phone, code cycles, notes), or detail: true for full records on every row.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | One jurisdiction by slug, e.g. "bellevue" or "mercer-island". Returns its full record. | |
| county | No | Filter by county | |
| detail | No | If true, every row carries the full record. Default false (compact rows). The full catalogue in detail is ~9x larger — prefer `slug` when you need one city. | |
| verifiedOnly | No | If true, only return rows where portal_url is populated (verified from official source). Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| detail | Yes | |
| results | No | |
| attribution | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with annotations already declaring readOnlyHint=true, idempotentHint=true, and destructiveHint=false, the description adds concrete behavioral details: compact-by-default output keyed by county with rows of {slug, name, verified}, approximate token size, and the existence of a detail mode. These shape and size tradeoffs go beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient and front-loaded, leading with the core purpose and then layering output shape, size, and parameter behavior. It is slightly dense, with long clauses and parentheticals, but every phrase contributes useful information and nothing is redundant with the schema.
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 a high-coverage schema and an output schema present, the description covers the essential selection and invocation concerns: what the tool returns, how large the response is, and which parameter mode to use for which need. Prose coverage of `county` and `verifiedOnly` is absent, but those are fully documented in the schema, so nothing critical 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?
The input schema already provides full parameter descriptions (100% coverage), so the baseline is 3. The description raises this by spelling out the fields in a full record ('department, fee-schedule URL, phone, code cycles, notes') and clarifying the compact output shape, which adds meaning beyond the schema's 'full record' phrasing. However, it doesn't add new semantic detail to `county` or `verifiedOnly`.
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 opens with a specific verb and object: 'List the jurisdictions in Kolmo's permit catalog (King, Pierce, Snohomish counties).' It clearly identifies the resource and scope, and goes further by naming downstream tools that consume its output (estimate_permit_fee, check_permit_requirements, get_permit_rule_details), which distinguishes its purpose from sibling 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?
It explicitly states when to use this tool: 'enough to pick a jurisdictionSlug for estimate_permit_fee, check_permit_requirements or get_permit_rule_details.' It also provides intra-tool guidance, explaining when to use `slug` for one full record versus `detail: true` for all rows and noting that the full catalogue is compact (~4K tokens) with a much larger detail mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_procurement_codesVendor procurement codesARead-onlyIdempotentInspect
List Kolmo's vendor procurement codes (NAICS, NIGP, UNSPSC) for government and agency portals such as SAM.gov, WA WEBS, OpenGov, MRSC, King County, and City of Seattle. Use this when vetting Kolmo for gov bids or setting up Kolmo as a vendor. Primary NAICS is 236118 (Residential Remodelers); secondary codes cover commercial building and specialty trades (poured concrete foundations/structures, painting, flooring, drywall, windows, roofing, siding, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| system | No | Code system to return (default: all) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ubi | Yes | |
| uei | Yes | |
| nigp | No | |
| note | Yes | |
| naics | No | |
| entity | Yes | |
| unspsc | No | |
| attribution | Yes | |
| certifications | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds useful behavioral context about the scope of the data, such as the targeted government portals and the primary NAICS code. It does not contradict the annotations, and the presence of an output schema reduces the need for return-format details.
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?
Three sentences, each earning its place: the first states the resource, the second gives usage timing, and the third provides useful content details. The description is front-loaded with the action and object.
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 simple read-only list operation with one optional parameter, an output schema, and robust annotations, the description covers purpose, usage context, and data content. No material information an agent would need to call 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?
The single optional parameter is fully documented by the schema with an enum and default description, so the schema does the heavy lifting. The description adds general context about the code systems but does not add new parameter-level semantics beyond the schema.
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 begins with a specific action and object: 'List Kolmo's vendor procurement codes,' and disambiguates the resource by naming the code systems (NAICS, NIGP, UNSPSC). It is clearly distinct from sibling list tools like list_commercial_services and list_projects.
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?
The description explicitly states when to use it: 'when vetting Kolmo for gov bids or setting up Kolmo as a vendor.' It does not explicitly name sibling alternatives or exclusions, 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.
list_projectsCompleted project portfolioARead-onlyIdempotentInspect
List Kolmo's completed projects — residential remodels AND commercial / public-works work — with photos and locations. Filter by category or keyword. Pass category "commercial" or "public-works" for the commercial portfolio (tenant improvements, retail and pharmacy fit-outs, municipal and government facility work, ADA remediation, warehouse and industrial renovation).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20) | |
| offset | No | Pagination offset (default 0) | |
| search | No | Filter by keyword in project title, description, or location | |
| category | No | Filter. Residential: kitchen, bathroom, full-home, outdoor, garage, basement. Commercial: commercial, public-works. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| total | Yes | |
| hubUrl | Yes | |
| offset | Yes | |
| results | Yes | |
| attribution | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior, so the safety profile is covered. The description adds useful domain context: what the commercial/public-works bucket actually contains (tenant improvements, fit-outs, ADA remediation), which shapes what the agent will get back. It does not mention pagination defaults despite them existing, which keeps it from a 5.
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 scope are front-loaded in the first sentence, and the category semantics follow in support. It's slightly dense in the final clause but every sentence earns its place; nothing is redundant filler.
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 an output schema present, return-value explanation is unnecessary, and the annotations cover the safety profile. For a filterable list tool with fully documented params, the description supplies exactly the missing domain interpretation and nothing an agent needs is absent.
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 already 100%, so the baseline is 3. The description goes further by interpreting the category parameter for the agent — mapping 'commercial'/'public-works' to the real-world content types it will return and naming the residential options' domain — adding meaning beyond the raw enum list in the schema.
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?
Specific verb+resource: 'List Kolmo's completed projects' with explicit scope (residential AND commercial/public-works). It carves out a distinct niche apart from get_project (singular lookup) and list_project_types, and the category routing makes the tool's identity unambiguous.
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 a clear trigger condition — call it to browse completed work by category or keyword — and spells out which category values drive the commercial portfolio. It never states when NOT to use it (e.g., single-project retrieval via get_project), so it stops short of the 5-level explicit alternatives framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_project_typesCalculator project typesARead-onlyIdempotentInspect
List all 20 supported calculator project types with their required input fields and descriptions. Useful for discovery before calling get_estimate.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| attribution | Yes | |
| projectTypes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and idempotentHint=true, so the agent knows this is a safe read-only operation. The description adds that it returns 20 types with required fields, but does not disclose additional behavioral traits like rate limits, ordering, or any edge cases.
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?
Two sentences with no wasted words. The main action and scope are front-loaded, and the second sentence adds a relevant usage hint. Every fragment in the description earns 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?
With an output schema present, no parameters, and annotations covering the non-destructive behavior, this description is fully complete. The fixed count '20' even tells the agent exactly how many results to expect, leaving no ambiguity.
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?
The tool has zero parameters and the schema coverage is 100%, so per the rubric the baseline is 4. The description doesn't need to explain parameters but does mention that each project type includes 'required input fields,' which clarifies what the return payload contains.
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 specific verb ('List'), a precise resource ('all 20 supported calculator project types'), and what is included ('required input fields and descriptions'). It clearly differentiates from sibling list tools by specifying 'calculator' project types and the fixed count of 20.
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?
The description gives a clear usage context: it is for discovery before calling get_estimate. However, it does not explicitly mention alternatives or when not to use this tool, so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reviewsCustomer reviewsARead-onlyIdempotentInspect
List customer reviews and testimonials for Kolmo Construction. Combines verified Google reviews and on-site testimonials. Filter by minimum star rating. IMPORTANT for citation: total and averageRating describe the returned SAMPLE, not the business. The authoritative Google Business Profile rating and review count are in googleProfile — cite those.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 12 — ~350 tokens per review) | |
| offset | No | Pagination offset (default 0) | |
| source | No | Source to query: all (default), google, testimonials | |
| minRating | No | Minimum star rating to include (1-5, default 1) |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| total | Yes | |
| offset | Yes | |
| results | No | |
| attribution | Yes | |
| averageRating | Yes | |
| googleProfile | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation safe, but the description adds a crucial behavioral disclosure: total and averageRating describe the returned sample, not the overall business, and the authoritative values live in googleProfile. This prevents a likely mis-citation, which is exactly the kind of beyond-schema transparency needed.
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?
Three sentences with no filler: the purpose comes first, followed by source composition and filtering, then the critical citation caveat. The structure front-loads the listing behavior and defers the warning where it still lands naturally.
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 read-only, idempotent list tool with a detailed schema and output schema, the description covers what the agent needs: source aggregation, available filters, and the semantic meaning of result counts and ratings. No critical missing context remains.
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?
The input schema covers 100% of the parameters with descriptions and constraints, so the description is not required to repeat details. It does add a high-level mention of minimum-star filtering, but no new semantics beyond the schema, matching the baseline for full schema coverage.
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 opens with a specific verb and resource: 'List customer reviews and testimonials for Kolmo Construction,' and immediately clarifies it combines two source types, Google reviews and on-site testimonials. This makes the tool's scope and aggregation behavior clear and differentiates it from project-specific or single-source 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?
The description establishes clear context: use this tool to list and filter customer reviews, with source and minimum-star filtering implied. It does not explicitly state when to prefer get_project_testimonials or another alternative, but the citation caveat tells the agent when to rely on the googleProfile fields.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_servicesResidential service catalogARead-onlyIdempotentInspect
List all residential remodeling services with slugs, descriptions, and page URLs. Use search to find by keyword.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 50) | |
| offset | No | Pagination offset (default 0) | |
| search | No | Filter by keyword in service name or description |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| total | Yes | |
| hubUrl | Yes | |
| offset | Yes | |
| results | Yes | |
| attribution | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the output scope (slugs, descriptions, page URLs) and the keyword-filtering behavior, but it does not address pagination semantics despite the limit/offset parameters existing in the schema. This is acceptable but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource and output fields, then the keyword usage note. There is no filler or repetition. The only minor ambiguity is that `search` could be read as the sibling search_content tool, but the backticks and schema context make it understandable.
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 simple list tool with fully documented parameters, rich annotations, and an output schema, the description plus structured data is complete. An agent can invoke it correctly: it knows the resource scope, what fields are returned, and how to filter by keyword.
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 100%, so the schema already documents limit, offset, and search. The description repeats only the search keyword filtering, adding no new parameter-level meaning or format details. Baseline 3 is appropriate when the schema carries the parameter documentation burden.
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 names a specific verb and resource: 'List all residential remodeling services with slugs, descriptions, and page URLs.' The qualifier 'residential' differentiates it from sibling list_commercial_services, and the mention of return fields makes the scope concrete.
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?
The description gives a direct usage instruction: 'Use `search` to find by keyword.' This tells the agent when to apply filtering rather than simply listing everything. It does not explicitly exclude alternatives like get_service or list_commercial_services, but the residential/list framing makes the context reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_parcel_by_addressParcel, zoning & overlay lookupARead-onlyIdempotentInspect
Address-first parcel lookup powering the /permits experience. Geocodes a Seattle-area address (King, Pierce, or Snohomish County, WA), resolves the parcel from the county GIS, and returns zoning, setbacks, overlays (shoreline / ECA / flood / historic), lot area, jurisdiction routing, and prior-permit history. Zoning, setbacks and building facts carry the city/county source they came from (geocode, lot geometry and assessor records do not). Use for "what can be built at 123 Main St Seattle?" or before calling check_permit_requirements / estimate_permit_fee for a specific parcel.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Full street address (e.g., "1234 NE 65th St, Seattle, WA 98115"). Must be in King, Pierce, or Snohomish County, WA. | |
| forceRefresh | No | Skip the 30-day cache and re-fetch from county GIS + overlay sources. Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | Set when the county records the address on this parcel as a second address (e.g. a new house on the lot) and the assessor lists the parcel under parcel.address. Not a snap: the parcel is correct. |
| found | Yes | |
| parcel | No | |
| warning | Yes | Set when the address snapped to a nearby parcel. Confirm with the user before relying on the result. |
| nextSteps | Yes | |
| disclaimer | Yes | |
| attribution | Yes | |
| addressResolution | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, idempotent, and non-destructive. The description adds meaningful behavioral context: it geocodes before resolving the parcel, includes a 30-day cache with a forceRefresh option, and notes which returned fields carry source attribution versus which do not. This goes well 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but each sentence earns its place: purpose, return contents, source-attribution nuance, and explicit use guidance. It is front-loaded with the primary purpose and keeps the alternative routing at the end.
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?
Given the rich output schema, comprehensive input schema, and safety annotations, the description covers all needed context: geographic scope, cache behavior, return categories, source provenance, and when to use it relative to sibling tools. Nothing essential 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 100%, so both parameters are fully documented in the input schema. The description reinforces the address geocoding scope and geographic counties but adds no new parameter meaning beyond what the schema already provides. Baseline 3 is appropriate.
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 specific verb and resource: 'lookup_parcel_by_address' geocodes an address, resolves the parcel, and returns zoning, setbacks, overlays, lot area, jurisdiction, and permit history. It distinguishes itself from siblings by explicitly positioning it as the address-first lookup that precedes check_permit_requirements and estimate_permit_fee.
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?
The description explicitly says when to use it: for 'what can be built at 123 Main St Seattle?' and 'before calling check_permit_requirements / estimate_permit_fee for a specific parcel.' It also scopes it geographically to King, Pierce, or Snohomish County, which helps an agent decide whether this tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_contractor_to_permitContractor-to-permit specialty matchARead-onlyIdempotentInspect
Cross-reference a WA contractor's L&I license specialty against a permit's required specialties. Returns whether the contractor is qualified to pull/work the permit, with explicit gap callouts (e.g. "missing electrical specialty 02"). Combines real-time L&I data with Kolmo's authoritative permit catalog.
| Name | Required | Description | Default |
|---|---|---|---|
| projectType | Yes | Canonical project type (kitchen, bathroom, basement, deck, fence, siding, windows, flooring, adu, roofing, hvac, electrical, plumbing, addition) | |
| contractorQuery | Yes | Contractor license number, business name, UBI or phone number | |
| jurisdictionSlug | Yes | Permit jurisdiction slug (e.g. "seattle", "tacoma") |
Output Schema
| Name | Required | Description |
|---|---|---|
| match | Yes | null: no single contractor could be identified from contractorQuery, so no comparison was made — not a finding either way. |
| checks | No | |
| permit | No | |
| reason | No | |
| missing | No | |
| sourceUrl | No | |
| verifyUrl | No | |
| candidates | No | |
| contractor | No | |
| attribution | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive, so the safety profile is covered. The description adds value by explaining data sources (real-time L&I and Kolmo's catalog) and the nature of the output (gap callouts). No contradictions with annotations are present.
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 description is three sentences, with the primary action first, followed by output specification and data source context. Every sentence contributes meaning without redundancy. The structure is front-loaded and efficient, leaving no unnecessary words.
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?
The description covers the purpose, output, and data sources. It does not explicitly address edge cases (e.g., missing license, permit with no required specialties) or error handling, but the presence of an output schema (stated) likely covers those. For a read-only, idempotent tool with clear parameters and output, this is adequately complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 parameters (contractorQuery, jurisdictionSlug, projectType) with clear examples. The description does not add additional parameter-level detail beyond the schema, but it reinforces the purpose of the parameters in the context of specialty matching. The baseline of 3 is appropriate because the schema does the heavy lifting.
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 action: cross-referencing a contractor's L&I specialty against a permit's required specialties. It clearly distinguishes itself from siblings like check_contractor_license_status (which checks license validity) and check_permit_requirements (which lists requirements) by focusing on the matching outcome. The output is explicit: qualification status with gap callouts.
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?
The description implies a clear use case: determining if a specific contractor is qualified for a specific permit. It does not explicitly name alternatives or exclusions, but the specificity of 'contractor to permit' matching makes it obvious when to use this tool over siblings. The mention of real-time L&I data and Kolmo's catalog provides context but no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_project_descriptionNatural-language project parserARead-onlyIdempotentInspect
Parse a homeowner's natural-language project description into structured permit-relevant fields: projectType (kitchen|bathroom|deck|adu|fence|...), areaSqft, heightClass, attached/detached, position, and materials. Returns confidence + a single clarifyingQuestion when the parse is ambiguous. Use this before calling check_permit_requirements / estimate_permit_fee when you only have free text from the homeowner. Backed by Gemini 2.5 Pro with a constrained JSON schema.
| Name | Required | Description | Default |
|---|---|---|---|
| cityName | No | City name (e.g., "Seattle", "Bellevue") | |
| zoningCode | No | Zoning code from lookup_parcel_by_address (e.g., "NR2", "LR1") | |
| description | Yes | Free-text project description (e.g., "I want to add a 200 sqft deck off my master bedroom on the second floor") | |
| jurisdictionSlug | No | Jurisdiction slug from lookup_parcel_by_address (helps disambiguate region-specific terminology) |
Output Schema
| Name | Required | Description |
|---|---|---|
| parsed | No | |
| nextSteps | No | |
| attribution | Yes | |
| validProjectTypes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey read-only, idempotent, and non-destructive behavior. The description adds valuable context beyond that: it returns confidence plus a single clarifyingQuestion when ambiguous, and it is backed by Gemini 2.5 Pro with a constrained JSON schema—helping the agent anticipate output shape and reliability.
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?
Three tight sentences: purpose with field list, return behavior, and usage guidance. Front-loaded and free of filler, every sentence earns 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?
With an output schema, complete schema descriptions, and annotations handling structured details, the description covers the remaining essentials: when to use, what it returns, and the underlying model. No critical context is missing for correct invocation.
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 100%, so all four parameters are already documented in the input schema. The description does not add parameter-level detail, so the baseline of 3 is appropriate.
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 ('Parse') and resource ('homeowner's natural-language project description'), enumerates the structured output fields, and distinguishes itself from downstream siblings like check_permit_requirements and estimate_permit_fee by positioning itself earlier in the pipeline.
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 instructs: 'Use this before calling check_permit_requirements / estimate_permit_fee when you only have free text from the homeowner.' This names the alternatives and the exact condition that selects this tool, leaving no ambiguity about when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_permit_submittalsPermit submittal checklistARead-onlyIdempotentInspect
Resolve the structured submittal-item set for a specific parcel + permit scope, via the unified permit-engine pipeline. Use this when you need the per-item checklist (with triggers, source citations, filler actor, gap-resolution path) — not just the rule-level summary that check_permit_requirements returns. Output fidelity per jurisdiction: Seattle is "full" (each item cites the SDCI Tip, code section or City page it rests on; some items describe what the source requires rather than quoting it); the other 9 verified cities are "wa-baseline-stub" until their detail backfill lands. Unverified jurisdictions return no-spec.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | Yes | Permit scope — the (project-type x work-class) identifier the provider catalogs by | |
| address | Yes | Full street address — geocoded to a parcel and matched to a jurisdiction provider | |
| envelopeChange | No | Project alters the building envelope (windows, doors, siding, roof). Default false. Drives WSEC triggers. | |
| structuralChange | No | Project involves a structural change (header, framing, lateral). Default false. Drives several triggers. | |
| totalFloorAreaSqft | No | Total floor area in sqft. Used by SEPA threshold (>=12000) and other size-based triggers. | |
| projectValuationUsd | No | Project valuation in USD |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| scope | Yes | |
| totals | No | |
| address | No | |
| parcelId | No | |
| applicable | No | |
| disclaimer | No | |
| permitType | No | |
| attribution | Yes | |
| skippedCount | Yes | |
| jurisdictionId | Yes | |
| jurisdictionFidelity | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, open-world, idempotent, and non-destructive, so the safety profile is covered. The description adds critical behavioral details: the output fidelity varies by jurisdiction (Seattle full with citations, other cities wa-baseline-stub until backfill, unverified jurisdictions return no-spec). This is valuable context beyond the annotations, though it does not describe pagination or error handling, which are minor given the output schema.
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 description is concise and front-loaded, with the primary use case stated first. It is a single paragraph that efficiently covers purpose, differentiation, and jurisdiction-specific behavior. It is slightly dense but each clause earns its place, justifying a 4 rather than a 5.
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?
Given the tool's moderate complexity (6 params, 2 required, output schema present), the description covers the key usage scenario, distinct from siblings, and jurisdiction-specific expectations. It doesn't delve into output schema details, but since an output schema exists, that is not required. It is complete enough for an agent to invoke correctly, though it could mention error cases (no-spec) more explicitly.
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 100%, so the schema already explains all parameters. The description adds context that scope is a project-type x work-class identifier and that envelopeChange/structuralChange drive triggers, but these are also partly in the schema. The baseline of 3 is appropriate because the schema does the heavy lifting; the description does not add significant new semantics beyond confirming the pipeline's use.
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 clearly states the tool resolves a structured submittal-item set for a given parcel and permit scope, explicitly differentiating it from check_permit_requirements (rule-level summary) and noting the per-item checklist includes triggers, citations, filler actor, and gap-resolution path. This is a specific verb + resource + scope, fully distinguishing it from 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?
It explicitly states when to use: when you need the per-item checklist, not just the rule-level summary that check_permit_requirements returns. It also outlines output fidelity differences by jurisdiction, which guides expectation-setting. While it doesn't enumerate all alternatives, it clearly specifies the primary alternative and the condition for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contentUnified content searchARead-onlyIdempotentInspect
Search across all Kolmo content — services, projects, and blog posts — with a single keyword query. Returns ranked results grouped by type. Use this instead of calling list_services + list_projects + list_blog_posts separately.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results per type (default 5) | |
| query | Yes | Search keyword or phrase, e.g. "deck Seattle", "kitchen cost", "permit" | |
| types | No | Content types to include (default: all three) |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| next | No | Present only on a zero-result search. |
| query | Yes | |
| terms | Yes | The query after tokenizing. Matching is per-term, not whole-string. |
| results | Yes | |
| totalFound | Yes | Alias of resultCount, kept for existing callers. |
| attribution | Yes | |
| resultCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context by noting results are 'ranked' and 'grouped by type,' which is not visible in the annotations or schema.
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?
Two sentences with no filler. The core scope and return format are front-loaded, and the usage guidance is compact but complete.
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?
The description, combined with a rich schema and a full set of safety annotations, gives an agent everything needed to select and call this tool correctly. Return value details are covered by the output schema, so no additional explanation is required.
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 100%, so the schema already documents all three parameters including examples and defaults. The description adds no parameter-specific detail beyond mentioning a 'single keyword query,' which is consistent with the schema but not supplementary.
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 ('search'), a clear resource ('all Kolmo content'), and enumerates the covered types ('services, projects, and blog posts'). It explicitly distinguishes itself from the list_* siblings by naming the alternative approach it replaces.
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 direct usage guidance: 'Use this instead of calling list_services + list_projects + list_blog_posts separately.' This makes the when-to-use decision explicit and routes the agent away from less efficient alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_contact_requestSubmit a quote requestAInspect
Submit a contact or quote request to Kolmo Construction on behalf of a user. Set dryRun: true to preview what would be sent without actually submitting.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Full name | |
| Yes | Email address | ||
| phone | No | Phone number (optional) | |
| dryRun | No | If true, validate and preview without submitting (default false) | |
| message | Yes | Project description or question | |
| service | No | Service needed, e.g. "kitchen remodel" |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| dryRun | No | True when this was a preview — nothing was submitted. |
| message | No | |
| preview | No | |
| success | No | |
| reference | No | Opaque lead reference. Give it to the user; it is how Kolmo locates the request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a write operation with side effects, so the description's job is lighter. It adds useful behavioral information beyond the annotations by explaining that dryRun previews the submission without actually sending it, and it clarifies the action is performed 'on behalf of a user.' It does not cover auth or duplicate risks, but the annotations and dryRun guidance cover the main behavioral concerns.
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 description is two sentences with the core action front-loaded and the dryRun preview behavior placed second. It contains no filler, repetition, or unnecessary detail.
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 a fully documented six-parameter schema and an output schema present, the description covers the remaining contextual essentials: what action is taken, who receives the request, and the special preview mode. Nothing critical appears missing for an agent to invoke this 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 100%, so the baseline of 3 applies; the schema already documents all six parameters clearly. The description only restates the dryRun behavior already described in the schema and adds no new parameter-level semantics or formatting guidance.
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 uses the specific verb 'Submit' and names the resource and destination: 'a contact or quote request to Kolmo Construction.' This clearly distinguishes the tool from the read-oriented get/list/check sibling tools. The phrase 'on behalf of a user' also adds contextual precision about who the request is for.
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?
The description makes the tool's core use clear and gives practical guidance for the dryRun flag, but it does not explicitly state when to choose this over sibling tools like answer_permit_question or get_estimate. There is no exclusion or alternative guidance, so usage context is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
lookup_parcel_by_address2 fields changed- added
Output schema / properties / noteAdded value: +{ + "description": "Set when the county records the address on this parcel as a second address (e.g. a new house on the lot) and the assessor lists the parcel under parcel.address. Not a snap: the parcel is correct.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / requiredPrevious value: -[ - "found", - "warning", - "nextSteps", - "disclaimer", - "attribution" -]New value: +[ + "found", + "warning", + "note", + "nextSteps", + "disclaimer", + "attribution" +]
2 tool updates
- Changed
check_contractor_license_status5 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"Contractor license number (e.g. \"KOLMOL*753JS\") or business name (e.g. \"Kolmo Construction\")"New value: +"Contractor license number (e.g. \"KOLMOL*753JS\"), business name (e.g. \"Kolmo LLC\"), 9-digit UBI, or phone number" - added
Output schema / properties / identifiedAdded value: +{ + "description": "true: the top results are one business. false: several businesses match, or only part of the name did — do not report any result as the contractor asked about.", + "type": "boolean" +} - added
Output schema / properties / moreMatchesAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / noteAdded value: +{ + "type": "string" +} - added
Output schema / properties / searchedByAdded value: +{ + "description": "license-number, ubi, phone, trade-name or business-name", + "type": "string" +}
- Changed
match_contractor_to_permit4 fields changed- changed
Input schema / properties / contractorQuery / descriptionPrevious value: -"Contractor license number or business name"New value: +"Contractor license number, business name, UBI or phone number" - added
Output schema / properties / candidatesAdded value: +{} - added
Output schema / properties / match / descriptionAdded value: +"null: no single contractor could be identified from contractorQuery, so no comparison was made — not a finding either way." - changed
Output schema / properties / match / typePrevious value: -"boolean"New value: +[ + "boolean", + "null" +]
2 tool updates
- Changed
check_service_area_coverage9 fields changed- changed
Input schema / properties / location / descriptionPrevious value: -"City, neighborhood, or ZIP to check, e.g. \"Ballard\", \"Bellevue\", \"98105\", \"Tacoma\""New value: +"City, neighborhood, ZIP or address to check, e.g. \"Ballard\", \"Normandy Park\", \"98105\", \"Tacoma\"" - added
Output schema / properties / coverage / enumAdded value: +[ + "primary", + "nearby", + "case_by_case", + "unconfirmed", + "out_of_area" +] - added
Output schema / properties / coverage / typeAdded value: +"string" - removed
Output schema / properties / primaryCountyRemoved value: -{} - removed
Output schema / properties / radiusKmRemoved value: -{ - "type": "number" -} - added
Output schema / properties / serviceCities / descriptionAdded value: +"Featured cities with their own landing pages. NOT the service area boundary: a place missing from this list is not out of area. See serviceRegion." - added
Output schema / properties / serviceRegionAdded value: +{ + "type": "string" +} - added
Output schema / properties / takesWorkAdded value: +{ + "description": "False only when the place is outside Washington.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "radiusKm", - "serviceCities", - "nearbyProjectCount", - "contactUrl", - "attribution" -]New value: +[ + "coverage", + "takesWork", + "serviceRegion", + "serviceCities", + "nearbyProjectCount", + "contactUrl", + "attribution" +]
- Changed
get_business_info3 fields changed- added
Output schema / properties / serviceArea / descriptionAdded value: +"Featured cities with their own landing pages. NOT the service area boundary: a place missing from this list is not out of area. See serviceRegion." - added
Output schema / properties / serviceRegionAdded value: +{ + "description": "Where Kolmo takes work. This decides coverage, not serviceArea.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "name", - "license", - "phone", - "email", - "website", - "address", - "rating", - "serviceArea", - "certifications", - "personnelQualifications", - "federalRegistration", - "notCertified", - "specializations", - "tools", - "attribution" -]New value: +[ + "name", + "license", + "phone", + "email", + "website", + "address", + "rating", + "serviceRegion", + "serviceArea", + "certifications", + "personnelQualifications", + "federalRegistration", + "notCertified", + "specializations", + "tools", + "attribution" +]
2 tool updates
- Changed
get_estimate1 field changed- changed
Input schema / properties / projectType / enumPrevious value: -[ - "interior-painting", - "exterior-painting", - "flooring", - "deck", - "windows", - "siding", - "fence", - "landscaping", - "kitchen", - "bathroom", - "basement", - "adu", - "ada", - "electrical", - "plumbing", - "garage-doors", - "concrete", - "insulation", - "gutters" -]New value: +[ + "interior-painting", + "exterior-painting", + "flooring", + "deck", + "windows", + "siding", + "fence", + "landscaping", + "kitchen", + "bathroom", + "basement", + "adu", + "ada", + "electrical", + "plumbing", + "garage-doors", + "doors", + "concrete", + "insulation", + "gutters" +]
- Changed
get_material_options1 field changed- changed
Input schema / properties / projectType / enumPrevious value: -[ - "interior-painting", - "exterior-painting", - "flooring", - "deck", - "windows", - "siding", - "fence", - "landscaping", - "kitchen", - "bathroom", - "basement", - "adu", - "ada", - "electrical", - "plumbing", - "garage-doors", - "concrete", - "insulation", - "gutters" -]New value: +[ + "interior-painting", + "exterior-painting", + "flooring", + "deck", + "windows", + "siding", + "fence", + "landscaping", + "kitchen", + "bathroom", + "basement", + "adu", + "ada", + "electrical", + "plumbing", + "garage-doors", + "doors", + "concrete", + "insulation", + "gutters" +]
2 tool updates
- Changed
get_estimate2 fields changed- changed
Input schema / properties / projectType / enumPrevious value: -[ - "interior-painting", - "exterior-painting", - "flooring", - "deck", - "windows", - "siding", - "fence", - "landscaping", - "kitchen", - "bathroom", - "basement", - "adu", - "ada" -]New value: +[ + "interior-painting", + "exterior-painting", + "flooring", + "deck", + "windows", + "siding", + "fence", + "landscaping", + "kitchen", + "bathroom", + "basement", + "adu", + "ada", + "electrical", + "plumbing", + "garage-doors", + "concrete", + "insulation", + "gutters" +] - changed
Output schema / properties / permitCost / descriptionPrevious value: -"Present on basement and adu, where permit cost is inside totalCost."New value: +"Present on deck, kitchen, bathroom, basement, adu and ada. Already inside totalCost."
- Changed
get_material_options1 field changed- changed
Input schema / properties / projectType / enumPrevious value: -[ - "interior-painting", - "exterior-painting", - "flooring", - "deck", - "windows", - "siding", - "fence", - "landscaping", - "kitchen", - "bathroom", - "basement", - "adu", - "ada" -]New value: +[ + "interior-painting", + "exterior-painting", + "flooring", + "deck", + "windows", + "siding", + "fence", + "landscaping", + "kitchen", + "bathroom", + "basement", + "adu", + "ada", + "electrical", + "plumbing", + "garage-doors", + "concrete", + "insulation", + "gutters" +]
1 tool update
- Changed
list_projects1 field changed- changed
Input schema / properties / category / descriptionPrevious value: -"Filter. Residential: kitchen, bathroom, full-home, outdoor, basement. Commercial: commercial, public-works."New value: +"Filter. Residential: kitchen, bathroom, full-home, outdoor, garage, basement. Commercial: commercial, public-works."
1 tool update
- Changed
check_permit_requirements1 field changed- added
Input schema / properties / factsAdded 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" +}
2 tool updates
- Changed
get_estimate3 fields changed- changed
Input schema / properties / projectType / enumPrevious value: -[ - "interior-painting", - "deck", - "exterior-painting", - "flooring", - "windows", - "siding", - "fence", - "landscaping", - "kitchen", - "bathroom", - "ada" -]New value: +[ + "interior-painting", + "exterior-painting", + "flooring", + "deck", + "windows", + "siding", + "fence", + "landscaping", + "kitchen", + "bathroom", + "basement", + "adu", + "ada" +] - added
Output schema / properties / contingencyCostAdded value: +{ + "description": "Present on basement and adu. When set, a contingency is ALREADY in totalCost — do not add another.", + "type": "number" +} - added
Output schema / properties / permitCostAdded value: +{ + "description": "Present on basement and adu, where permit cost is inside totalCost.", + "type": "number" +}
- Changed
get_material_options2 fields changed- changed
Input schema / properties / projectType / enumPrevious value: -[ - "interior-painting", - "deck", - "exterior-painting", - "flooring", - "windows", - "siding", - "fence", - "landscaping", - "kitchen", - "bathroom", - "ada" -]New value: +[ + "interior-painting", + "exterior-painting", + "flooring", + "deck", + "windows", + "siding", + "fence", + "landscaping", + "kitchen", + "bathroom", + "basement", + "adu", + "ada" +] - changed
Output schema / properties / options / descriptionPrevious value: -"Shape varies by project type — an array of {id,name,costPerUnit,unit} for most, a keyed catalog for kitchen/bathroom/ada."New value: +"Shape varies by project type — an array of {id,name,costPerUnit,unit} for the material-driven types, a keyed catalog for the scope-driven ones (kitchen, bathroom, basement, adu, ada)."
1 tool update
- Changed
list_projects1 field changed- changed
Input schema / properties / category / descriptionPrevious value: -"Filter: kitchen, bathroom, full-home, outdoor, basement"New value: +"Filter. Residential: kitchen, bathroom, full-home, outdoor, basement. Commercial: commercial, public-works."
35 tool updates
- Changed
answer_permit_question6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
check_contractor_license_status6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
check_permit_requirements9 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Max matching rules to return (default 25). Narrow with projectType/location before raising it.", + "maximum": 200, + "minimum": 1, + "type": "integer" +} - removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +] - added
Output schema / properties / coverageAdded value: +{ + "description": "Present on an unfiltered call: the jurisdictions and project types the catalog covers." +} - added
Output schema / properties / returnedAdded value: +{ + "type": "number" +}
- Changed
check_service_area_coverage6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
estimate_permit_fee6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_author_bio6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_blog_post6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_business_info6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_estimate6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_financing_options6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_material_catalog7 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (default 50)"New value: +"Max results (default 25)" - removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_material_options6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_neighbor_permit_activity6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_neighborhood_project_activity6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_permit_data_freshness7 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max snapshots to return (default 50, newest first)"New value: +"Max snapshots to return (default 5, newest first)" - removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_permit_rule_details7 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (default 50)"New value: +"Max results (default 10 — rules are ~1K tokens each)" - removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_project6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_project_roi6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_project_testimonials6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_service6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
get_weather_window6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
list_blog_posts7 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max posts to return (default 20)"New value: +"Max posts to return (default 10)" - removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
list_blog_tags_and_categories6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
list_commercial_services6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
list_permit_jurisdictions10 fields changed- added
Input schema / properties / detailAdded value: +{ + "description": "If true, every row carries the full record. Default false (compact rows). The full catalogue in detail is ~9x larger — prefer `slug` when you need one city.", + "type": "boolean" +} - added
Input schema / properties / slugAdded value: +{ + "description": "One jurisdiction by slug, e.g. \"bellevue\" or \"mercer-island\". Returns its full record.", + "type": "string" +} - removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +] - added
Output schema / properties / detailAdded value: +{ + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "total", - "attribution" -]New value: +[ + "total", + "detail", + "attribution" +]
- Changed
list_procurement_codes6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
list_project_types6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
list_projects6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
list_reviews8 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (default 20)"New value: +"Max results (default 12 — ~350 tokens per review)" - removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +] - added
Output schema / properties / googleProfileAdded value: +{}
- Changed
list_services6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
lookup_parcel_by_address6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
match_contractor_to_permit6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
parse_project_description6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
resolve_permit_submittals6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
- Changed
search_content6 fields changed- removed
Output schema / properties / attribution / properties / contractorLicenseRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / noteRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / organizationRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / retrievedFromRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / attribution / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / attribution / requiredPrevious value: -[ - "organization", - "contractorLicense", - "url", - "sourceUrl", - "citeAs", - "retrievedFrom", - "note" -]New value: +[ + "sourceUrl", + "citeAs" +]
36 tool updates
- Changed
answer_permit_question1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "answer": { + "description": "Answer-first prose with the verdict in the opening clause and inline source links. Safe to quote.", + "type": "string" + }, + "answered": { + "const": true, + "type": "boolean" + }, + "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" + }, + "groundedOn": { + "description": "The jurisdiction sources the answer rests on. Cite these plus Kolmo.", + "items": { + "type": "string" + }, + "type": "array" + }, + "parcelContext": {} + }, + "required": [ + "answered", + "answer", + "groundedOn", + "attribution" + ], + "type": "object" +}
- Changed
check_contractor_license_status1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "found": { + "description": "false means L&I holds no matching record — a real answer, not a lookup failure.", + "type": "boolean" + }, + "message": { + "type": "string" + }, + "next": { + "items": { + "type": "string" + }, + "type": "array" + }, + "query": { + "type": "string" + }, + "results": {}, + "verifyUrl": { + "type": "string" + } + }, + "required": [ + "found", + "query" + ], + "type": "object" +}
- Changed
check_permit_requirements1 field changed- changed
Output 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" +}
- Changed
check_service_area_coverage1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "contactUrl": { + "type": "string" + }, + "coverage": {}, + "matchedCity": {}, + "matchedNeighborhood": {}, + "nearbyProjectCount": { + "type": "number" + }, + "primaryCounty": {}, + "query": {}, + "radiusKm": { + "type": "number" + }, + "serviceCities": { + "items": { + "type": "string" + }, + "type": "array" + }, + "verdict": {} + }, + "required": [ + "radiusKm", + "serviceCities", + "nearbyProjectCount", + "contactUrl", + "attribution" + ], + "type": "object" +}
- Changed
estimate_permit_fee1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "breakdown": {}, + "disclaimer": {}, + "jurisdiction": { + "type": "string" + }, + "lastVerifiedAt": { + "description": "Verification date for the fee schedule. Relay it with the figure." + }, + "permitClass": {}, + "projectType": { + "type": "string" + }, + "qualitativeFeeNotes": {}, + "sourceUrl": {}, + "valuationUsd": {} + }, + "required": [ + "jurisdiction", + "projectType", + "attribution" + ], + "type": "object" +}
- Changed
get_author_bio1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "availableAuthors": {}, + "credentials": {}, + "expertise": {}, + "found": { + "type": "boolean" + }, + "name": {}, + "note": { + "type": "string" + }, + "profileUrl": { + "type": "string" + }, + "query": { + "type": "string" + }, + "recentArticles": {}, + "slug": {}, + "source": { + "type": "string" + }, + "totalArticles": { + "type": "number" + } + }, + "required": [ + "found" + ], + "type": "object" +}
- Changed
get_blog_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "content": { + "description": "Full article body. Quote and summarize freely; do not republish wholesale.", + "type": [ + "string", + "null" + ] + }, + "publishedAt": {}, + "readingTimeMinutes": {}, + "slug": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "tags": {}, + "title": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "attribution" + ], + "type": "object" +}
- Changed
get_business_info1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "address": { + "type": "string" + }, + "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" + }, + "certifications": { + "additionalProperties": {}, + "type": "object" + }, + "email": { + "type": "string" + }, + "federalRegistration": { + "additionalProperties": {}, + "type": "object" + }, + "founded": {}, + "hours": {}, + "license": { + "type": "string" + }, + "name": { + "type": "string" + }, + "notCertified": { + "description": "Set-asides Kolmo does NOT hold. Never infer one that appears here.", + "items": { + "type": "string" + }, + "type": "array" + }, + "personnelQualifications": { + "additionalProperties": {}, + "type": "object" + }, + "phone": { + "type": "string" + }, + "rating": { + "additionalProperties": true, + "properties": { + "reviewCount": {}, + "source": { + "type": "string" + }, + "value": {} + }, + "required": [ + "source" + ], + "type": "object" + }, + "serviceArea": { + "items": { + "type": "string" + }, + "type": "array" + }, + "specializations": { + "description": "Trades Kolmo performs. Not all of these have a service page — check list_services before linking one.", + "items": { + "type": "string" + }, + "type": "array" + }, + "tools": { + "additionalProperties": {}, + "type": "object" + }, + "website": { + "type": "string" + } + }, + "required": [ + "name", + "license", + "phone", + "email", + "website", + "address", + "rating", + "serviceArea", + "certifications", + "personnelQualifications", + "federalRegistration", + "notCertified", + "specializations", + "tools", + "attribution" + ], + "type": "object" +}
- Changed
get_estimate1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "calculatorUrl": { + "type": "string" + }, + "contingencyGuidance": { + "type": "string" + }, + "estimateRange": { + "description": "Planning range for Seattle-area work. This is what to relay, with its qualifier attached." + }, + "excludes": { + "description": "Scope NOT priced here. Relay alongside any figure.", + "items": { + "type": "string" + }, + "type": "array" + }, + "getAccurateQuote": { + "type": "string" + }, + "laborCost": { + "type": "number" + }, + "lineItems": {}, + "materialCost": { + "type": "number" + }, + "pricingBasis": {}, + "projectType": { + "type": "string" + }, + "timeEstimateDays": {}, + "totalCost": { + "description": "Point figure. Relay estimateRange instead — a single number reads as a quote.", + "type": "number" + } + }, + "required": [ + "projectType", + "totalCost", + "materialCost", + "laborCost", + "contingencyGuidance", + "excludes", + "calculatorUrl", + "getAccurateQuote", + "attribution" + ], + "type": "object" +}
- Changed
get_financing_options1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "creditProfile": {}, + "disclaimer": { + "type": "string" + }, + "getQuote": { + "type": "string" + }, + "options": {}, + "projectBudget": {} + }, + "required": [ + "disclaimer", + "getQuote", + "attribution" + ], + "type": "object" +}
- Changed
get_material_catalog1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "limit": { + "type": "number" + }, + "note": { + "type": "string" + }, + "offset": { + "type": "number" + }, + "results": {}, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "offset", + "limit", + "note", + "attribution" + ], + "type": "object" +}
- Changed
get_material_options1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "options": { + "description": "Shape varies by project type — an array of {id,name,costPerUnit,unit} for most, a keyed catalog for kitchen/bathroom/ada." + }, + "projectType": { + "type": "string" + } + }, + "required": [ + "projectType", + "attribution" + ], + "type": "object" +}
- Changed
get_neighbor_permit_activity1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "activity": {}, + "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" + }, + "disclaimer": { + "type": "string" + }, + "found": { + "const": true, + "type": "boolean" + }, + "jurisdiction": {}, + "supportedJurisdictions": {} + }, + "required": [ + "found", + "disclaimer", + "attribution" + ], + "type": "object" +}
- Changed
get_neighborhood_project_activity1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "byCategory": {}, + "contactUrl": { + "type": "string" + }, + "message": { + "type": "string" + }, + "neighborhood": {}, + "overallPortfolio": {}, + "portfolioUrl": { + "type": "string" + }, + "projectsFound": { + "type": "number" + }, + "recentExamples": {} + }, + "required": [ + "projectsFound", + "message" + ], + "type": "object" +}
- Changed
get_permit_data_freshness1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "changeDetection": {}, + "coverage": {}, + "howToReadFailures": {}, + "jurisdictions": {}, + "pipeline": { + "type": "string" + }, + "publicView": { + "type": "string" + }, + "recentSnapshots": {}, + "sourceHealth": {}, + "totals": {} + }, + "required": [ + "pipeline", + "publicView", + "attribution" + ], + "type": "object" +}
- Changed
get_permit_rule_details1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "authoritativeRules": { + "type": "number" + }, + "disclaimer": { + "type": "string" + }, + "jurisdictionsWithAuthoritativeCoverage": {}, + "matched": { + "type": "number" + }, + "parcel": {}, + "results": {}, + "returned": { + "type": "number" + }, + "totalRules": { + "type": "number" + } + }, + "required": [ + "totalRules", + "authoritativeRules", + "matched", + "returned", + "disclaimer", + "attribution" + ], + "type": "object" +}
- Changed
get_project1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "slug": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "attribution" + ], + "type": "object" +}
- Changed
get_project_roi1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "disclaimer": { + "type": "string" + }, + "getAccurateQuote": { + "type": "string" + }, + "market": { + "type": "string" + }, + "neighborhood": {}, + "results": {}, + "source": { + "description": "Third-party dataset. Cite it alongside Kolmo.", + "type": "string" + } + }, + "required": [ + "market", + "source", + "disclaimer", + "getAccurateQuote", + "attribution" + ], + "type": "object" +}
- Changed
get_project_testimonials1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "averageRating": { + "type": [ + "number", + "null" + ] + }, + "filterApplied": { + "additionalProperties": true, + "properties": { + "keyword": { + "type": "string" + }, + "minRating": { + "type": "number" + }, + "projectSlug": { + "type": "string" + } + }, + "required": [ + "minRating" + ], + "type": "object" + }, + "note": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": { + "content": { + "type": [ + "string", + "null" + ] + }, + "date": {}, + "name": { + "type": [ + "string", + "null" + ] + }, + "project": { + "type": [ + "string", + "null" + ] + }, + "rating": {} + }, + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "averageRating", + "filterApplied", + "results", + "note", + "attribution" + ], + "type": "object" +}
- Changed
get_service1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "slug": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "attribution" + ], + "type": "object" +}
- Changed
get_weather_window1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "forecast": {}, + "forecastDays": { + "type": "number" + }, + "location": { + "type": "string" + }, + "projectType": {}, + "requirements": {}, + "summary": {} + }, + "required": [ + "location", + "forecastDays", + "attribution" + ], + "type": "object" +}
- Changed
list_blog_posts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "hubUrl": { + "type": "string" + }, + "limit": { + "type": "number" + }, + "offset": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": { + "author": { + "type": [ + "string", + "null" + ] + }, + "publishedAt": {}, + "readingTimeMinutes": {}, + "slug": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "tags": {}, + "title": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "offset", + "limit", + "results", + "hubUrl", + "attribution" + ], + "type": "object" +}
- Changed
list_blog_tags_and_categories1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "categories": { + "items": { + "additionalProperties": true, + "properties": { + "count": { + "type": "number" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "count" + ], + "type": "object" + }, + "type": "array" + }, + "tags": { + "items": { + "additionalProperties": true, + "properties": { + "count": { + "type": "number" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "count" + ], + "type": "object" + }, + "type": "array" + }, + "totalPosts": { + "type": "number" + }, + "usage": { + "type": "string" + } + }, + "required": [ + "totalPosts", + "tags", + "categories", + "usage", + "attribution" + ], + "type": "object" +}
- Changed
list_commercial_services1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "hubUrl": { + "type": "string" + }, + "limit": { + "type": "number" + }, + "offset": { + "type": "number" + }, + "publicWorks": { + "additionalProperties": true, + "properties": { + "certifications": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mrscSmallWorksRoster": { + "type": "string" + }, + "note": { + "type": "string" + }, + "verifyUrl": { + "type": "string" + } + }, + "required": [ + "note", + "certifications", + "mrscSmallWorksRoster", + "verifyUrl" + ], + "type": "object" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": { + "category": { + "type": [ + "string", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "features": {}, + "fullDescription": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "slug": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "offset", + "limit", + "results", + "hubUrl", + "publicWorks", + "attribution" + ], + "type": "object" +}
- Changed
list_permit_jurisdictions1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "results": {}, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "attribution" + ], + "type": "object" +}
- Changed
list_procurement_codes1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "certifications": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "entity": { + "type": "string" + }, + "naics": {}, + "nigp": {}, + "note": { + "type": "string" + }, + "ubi": { + "type": [ + "string", + "null" + ] + }, + "uei": { + "type": [ + "string", + "null" + ] + }, + "unspsc": {} + }, + "required": [ + "entity", + "uei", + "ubi", + "note", + "certifications", + "attribution" + ], + "type": "object" +}
- Changed
list_project_types1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "projectTypes": { + "additionalProperties": { + "additionalProperties": true, + "properties": { + "description": { + "type": "string" + }, + "requiredFields": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "description", + "requiredFields" + ], + "type": "object" + }, + "type": "object" + } + }, + "required": [ + "projectTypes", + "attribution" + ], + "type": "object" +}
- Changed
list_projects1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "hubUrl": { + "type": "string" + }, + "limit": { + "type": "number" + }, + "offset": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": { + "category": { + "type": [ + "string", + "null" + ] + }, + "completedAt": {}, + "description": { + "type": [ + "string", + "null" + ] + }, + "imageAfter": { + "type": [ + "string", + "null" + ] + }, + "imageBefore": { + "type": [ + "string", + "null" + ] + }, + "location": { + "type": [ + "string", + "null" + ] + }, + "slug": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "offset", + "limit", + "results", + "hubUrl", + "attribution" + ], + "type": "object" +}
- Changed
list_reviews1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "averageRating": { + "type": [ + "number", + "null" + ] + }, + "limit": { + "type": "number" + }, + "offset": { + "type": "number" + }, + "results": {}, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "offset", + "limit", + "averageRating", + "attribution" + ], + "type": "object" +}
- Changed
list_services1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "hubUrl": { + "type": "string" + }, + "limit": { + "type": "number" + }, + "offset": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": { + "category": { + "type": [ + "string", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "slug": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "offset", + "limit", + "results", + "hubUrl", + "attribution" + ], + "type": "object" +}
- Changed
lookup_parcel_by_address1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "addressResolution": {}, + "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" + }, + "disclaimer": { + "type": "string" + }, + "found": { + "const": true, + "type": "boolean" + }, + "nextSteps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "parcel": {}, + "warning": { + "description": "Set when the address snapped to a nearby parcel. Confirm with the user before relying on the result.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "found", + "warning", + "nextSteps", + "disclaimer", + "attribution" + ], + "type": "object" +}
- Changed
match_contractor_to_permit1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "checks": {}, + "contractor": {}, + "match": { + "type": "boolean" + }, + "missing": {}, + "permit": {}, + "reason": { + "type": [ + "string", + "null" + ] + }, + "sourceUrl": {}, + "verifyUrl": { + "type": "string" + } + }, + "required": [ + "match" + ], + "type": "object" +}
- Changed
parse_project_description1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "nextSteps": {}, + "parsed": {}, + "validProjectTypes": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "validProjectTypes", + "attribution" + ], + "type": "object" +}
- Changed
resolve_permit_submittals1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "address": {}, + "applicable": {}, + "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" + }, + "disclaimer": {}, + "jurisdictionFidelity": {}, + "jurisdictionId": { + "type": "string" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "parcelId": {}, + "permitType": {}, + "scope": { + "type": "string" + }, + "skippedCount": { + "type": "number" + }, + "totals": {} + }, + "required": [ + "ok", + "jurisdictionId", + "scope", + "skippedCount", + "attribution" + ], + "type": "object" +}
- Changed
search_content1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "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" + }, + "hint": { + "type": "string" + }, + "next": { + "description": "Present only on a zero-result search.", + "items": { + "type": "string" + }, + "type": "array" + }, + "query": { + "type": "string" + }, + "resultCount": { + "type": "number" + }, + "results": { + "additionalProperties": true, + "properties": { + "blog": {}, + "projects": {}, + "services": {} + }, + "type": "object" + }, + "terms": { + "description": "The query after tokenizing. Matching is per-term, not whole-string.", + "items": { + "type": "string" + }, + "type": "array" + }, + "totalFound": { + "description": "Alias of resultCount, kept for existing callers.", + "type": "number" + } + }, + "required": [ + "query", + "terms", + "resultCount", + "totalFound", + "results", + "attribution" + ], + "type": "object" +}
- Changed
submit_contact_request1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "dryRun": { + "description": "True when this was a preview — nothing was submitted.", + "type": "boolean" + }, + "message": { + "type": "string" + }, + "note": { + "type": "string" + }, + "preview": {}, + "reference": { + "description": "Opaque lead reference. Give it to the user; it is how Kolmo locates the request.", + "type": "string" + }, + "success": { + "type": "boolean" + } + }, + "type": "object" +}
1 tool update
- Changed
get_permit_rule_details1 field changed- changed
Input schema / properties / onlyAuthoritative / descriptionPrevious value: -"If true, exclude legacy LLM-seeded rows. Default true."New value: +"Default true: return only 'authoritative' and 'wa-baseline' rules. Set false to also return every other tier, including 'web-fetched' rows — these are published but deliberately not shown on Kolmo's city pages, and their cited source is not verified to state the rule. Prefer the default."
1 tool update
- Changed
check_permit_requirements4 fields changed- added
Input schema / properties / deckHeightAboveGradeInAdded 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" +} - added
Input schema / properties / deckOnAccessibleRouteAdded 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" +} - added
Input schema / properties / deckOverStoryBelowAdded 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" +} - added
Input schema / properties / guardRunLengthFtAdded 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" +}
3 tool updates
- Changed
check_permit_requirements1 field changed- added
Input schema / properties / addressAdded 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" +}
- Changed
get_permit_rule_details1 field changed- added
Input schema / properties / addressAdded value: +{ + "description": "Full street address — when provided, each result row also includes `submittals_v2` from the unified resolver (per-item triggers, source citations, filler actor).", + "type": "string" +}
- Added
resolve_permit_submittals
Related MCP Connectors
Zoning, ADU eligibility, flood zone, setbacks, and buildability intelligence for U.S. parcels.
Washington property evidence and transaction math for software and AI assistants.
Permit-verified ADU rentals, pre-approved plans and cited ADU rules for LA, San Diego, SF and NYC.
Human-reviewed zoning answers with ordinance citations for covered US municipalities.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceLA County ADU buildability checks, zoning rules, permit trends, and cost estimates — free, no auth.-
- FlicenseNot gradedqualityBmaintenanceProvides source-dated Washington property evidence and transaction math, including REET, seller scenarios, and research packets, for software and AI assistants.-
- AlicenseAqualityDmaintenanceAI-powered property intelligence for instant zoning analysis, buildability assessments, ADU eligibility, flood risk, and development feasibility reports for any US address.51MIT
- FlicenseNot gradedqualityFmaintenanceEnables municipal permit preflight checks for construction and renovation projects, returning evidence-linked, rule-version-aware results without using an LLM.-
Glama MCP Gateway
Add one secure layer between your agents and this server.