Skip to main content
Glama

Build watch spec

build_watch_spec
Read-onlyIdempotent

Turn a finished search into a watch: portal searches per postcode district, filters, a state file path for de-duplication and a ready prompt for a scheduled task in the user's Claude that reports only new listings. Stateless: nothing is stored on Close Knit.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "name": "<name>",
      "area_ids": "<area_ids>",
      "max_price": "<max_price>"
    },
    "name": "build_watch_spec"
  }
}

Input Schema

NameRequiredDescriptionDefault
nameYes[input value] Short name, e.g. 'Ealing 2-bed'.
marketNo[option] Homes for sale (buy) or to let (rent).buy
area_idsYes[id] LSOA ids to watch.
frequencyNo[option] How often the scheduled check runs.daily
max_priceYes[input value] £ (buy) or £ per month (rent).
must_havesNo[input value] Free-text requirements the agent checks per listing (a list is joined with '; ').
min_bedroomsNo[input value] Fewest bedrooms (0 = studio or any).
property_typeNo[option] Home type for the portal filters (house, flat, bungalow or any).any

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • removedInput schema / $defs
      Removed value: -{
      -  "RatePrevious": {
      -    "properties": {
      -      "bad": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "[input value] What was wrong, missing or confusing.",
      -        "title": "Bad"
      -      },
      -      "call_id": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "[id] The callId of the answer you are rating; leave it out when answers carry none.",
      -        "title": "Call Id"
      -      },
      -      "fix": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "[input value] The change to the tool or its answer you would want.",
      -        "title": "Fix"
      -      },
      -      "good": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "[input value] What was useful in the answer.",
      -        "title": "Good"
      -      },
      -      "rating": {
      -        "description": "[input value] 1 = useless or wrong, 3 = usable with gaps, 5 = exactly what was needed.",
      -        "title": "Rating",
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "rating"
      -    ],
      -    "title": "RatePrevious",
      -    "type": "object"
      -  }
      -}
    • removedInput schema / properties / intent
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "description": "[input value] Optional, one to three sentences you write: what the user is looking for with this call and the criteria that matter, e.g. '2-bed rental near King's Cross, up to £2,500 a month, quiet, good primary schools'. Close Knit reads these to improve its answers. Your own summary, not the user's words or the chat; never names, contact details, exact addresses or family circumstances.",
      -  "title": "Intent"
      -}
    • removedInput schema / properties / rate_previous
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "$ref": "#/$defs/RatePrevious"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "description": "[input value] Optional: your rating of an earlier Close Knit answer, by the callId it carried (none: the last answer). Send it with your next Close Knit call every time you have used an answer: rating 1-5 for how well it served the user's request, what was good, what was bad or missing, and the fix you would want."
      -}
  2. Changed15 schema fields changed
    • changedInput schema / $defs / RatePrevious / properties / bad / description
      Previous value: -"What was wrong, missing or confusing."New value: +"[input value] What was wrong, missing or confusing."
    • changedInput schema / $defs / RatePrevious / properties / call_id / description
      Previous value: -"The callId of the answer you are rating; leave it out when answers carry none."New value: +"[id] The callId of the answer you are rating; leave it out when answers carry none."
    • changedInput schema / $defs / RatePrevious / properties / fix / description
      Previous value: -"The change to the tool or its answer you would want."New value: +"[input value] The change to the tool or its answer you would want."
    • changedInput schema / $defs / RatePrevious / properties / good / description
      Previous value: -"What was useful in the answer."New value: +"[input value] What was useful in the answer."
    • changedInput schema / $defs / RatePrevious / properties / rating / description
      Previous value: -"1 = useless or wrong, 3 = usable with gaps, 5 = exactly what was needed."New value: +"[input value] 1 = useless or wrong, 3 = usable with gaps, 5 = exactly what was needed."
    • changedInput schema / properties / area_ids / description
      Previous value: -"LSOA ids to watch."New value: +"[id] LSOA ids to watch."
    • changedInput schema / properties / frequency / description
      Previous value: -"How often the scheduled check runs."New value: +"[option] How often the scheduled check runs."
    • changedInput schema / properties / intent / description
      Previous value: -"Optional, one to three sentences you write: what the user is looking for with this call and the criteria that matter, e.g. '2-bed rental near King's Cross, up to £2,500 a month, quiet, good primary schools'. Close Knit reads these to improve its answers. Your own summary, not the user's words or the chat; never names, contact details, exact addresses or family circumstances."New value: +"[input value] Optional, one to three sentences you write: what the user is looking for with this call and the criteria that matter, e.g. '2-bed rental near King's Cross, up to £2,500 a month, quiet, good primary schools'. Close Knit reads these to improve its answers. Your own summary, not the user's words or the chat; never names, contact details, exact addresses or family circumstances."
    • changedInput schema / properties / market / description
      Previous value: -"Homes for sale (buy) or to let (rent)."New value: +"[option] Homes for sale (buy) or to let (rent)."
    • changedInput schema / properties / max_price / description
      Previous value: -"£ (buy) or £ per month (rent)."New value: +"[input value] £ (buy) or £ per month (rent)."
    • changedInput schema / properties / min_bedrooms / description
      Previous value: -"Fewest bedrooms (0 = studio or any)."New value: +"[input value] Fewest bedrooms (0 = studio or any)."
    • changedInput schema / properties / must_haves / description
      Previous value: -"Free-text requirements the agent checks per listing (a list is joined with '; ')."New value: +"[input value] Free-text requirements the agent checks per listing (a list is joined with '; ')."
    • changedInput schema / properties / name / description
      Previous value: -"Short name, e.g. 'Ealing 2-bed'."New value: +"[input value] Short name, e.g. 'Ealing 2-bed'."
    • changedInput schema / properties / property_type / description
      Previous value: -"Home type for the portal filters (house, flat, bungalow or any)."New value: +"[option] Home type for the portal filters (house, flat, bungalow or any)."
    • changedInput schema / properties / rate_previous / description
      Previous value: -"Optional: your rating of an earlier Close Knit answer, by the callId it carried (none: the last answer). Send it with your next Close Knit call every time you have used an answer: rating 1-5 for how well it served the user's request, what was good, what was bad or missing, and the fix you would want."New value: +"[input value] Optional: your rating of an earlier Close Knit answer, by the callId it carried (none: the last answer). Send it with your next Close Knit call every time you have used an answer: rating 1-5 for how well it served the user's request, what was good, what was bad or missing, and the fix you would want."
  3. Changed1 schema field changed
    • changedInput schema / properties / must_haves / description
      Previous value: -"Free-text requirements the agent checks per listing."New value: +"Free-text requirements the agent checks per listing (a list is joined with '; ')."
  4. Changed6 schema fields changed
    • addedInput schema / $defs / RatePrevious / properties / call_id / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / $defs / RatePrevious / properties / call_id / default
      Added value: +null
    • changedInput schema / $defs / RatePrevious / properties / call_id / description
      Previous value: -"The callId of the answer you are rating."New value: +"The callId of the answer you are rating; leave it out when answers carry none."
    • removedInput schema / $defs / RatePrevious / properties / call_id / type
      Removed value: -"string"
    • changedInput schema / $defs / RatePrevious / required
      Previous value: -[
      -  "call_id",
      -  "rating"
      -]New value: +[
      +  "rating"
      +]
    • changedInput schema / properties / rate_previous / description
      Previous value: -"Optional: your rating of an earlier Close Knit answer, by the callId it carried. Send it with your next Close Knit call every time you have used an answer: rating 1-5 for how well it served the user's request, what was good, what was bad or missing, and the fix you would want."New value: +"Optional: your rating of an earlier Close Knit answer, by the callId it carried (none: the last answer). Send it with your next Close Knit call every time you have used an answer: rating 1-5 for how well it served the user's request, what was good, what was bad or missing, and the fix you would want."
  5. Changed1 schema field changed
    • addedInput schema / properties / property_type
      Added value: +{
      +  "default": "any",
      +  "description": "Home type for the portal filters (house, flat, bungalow or any).",
      +  "enum": [
      +    "house",
      +    "flat",
      +    "bungalow",
      +    "any"
      +  ],
      +  "title": "Property Type",
      +  "type": "string"
      +}
  6. Changed3 schema fields changed
    • addedInput schema / $defs
      Added value: +{
      +  "RatePrevious": {
      +    "properties": {
      +      "bad": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "What was wrong, missing or confusing.",
      +        "title": "Bad"
      +      },
      +      "call_id": {
      +        "description": "The callId of the answer you are rating.",
      +        "title": "Call Id",
      +        "type": "string"
      +      },
      +      "fix": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "The change to the tool or its answer you would want.",
      +        "title": "Fix"
      +      },
      +      "good": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "What was useful in the answer.",
      +        "title": "Good"
      +      },
      +      "rating": {
      +        "description": "1 = useless or wrong, 3 = usable with gaps, 5 = exactly what was needed.",
      +        "title": "Rating",
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "call_id",
      +      "rating"
      +    ],
      +    "title": "RatePrevious",
      +    "type": "object"
      +  }
      +}
    • addedInput schema / properties / intent
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Optional, one to three sentences you write: what the user is looking for with this call and the criteria that matter, e.g. '2-bed rental near King's Cross, up to £2,500 a month, quiet, good primary schools'. Close Knit reads these to improve its answers. Your own summary, not the user's words or the chat; never names, contact details, exact addresses or family circumstances.",
      +  "title": "Intent"
      +}
    • addedInput schema / properties / rate_previous
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/RatePrevious"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Optional: your rating of an earlier Close Knit answer, by the callId it carried. Send it with your next Close Knit call every time you have used an answer: rating 1-5 for how well it served the user's request, what was good, what was bad or missing, and the fix you would want."
      +}
  7. Changed3 schema fields changed
    • addedInput schema / properties / frequency / description
      Added value: +"How often the scheduled check runs."
    • addedInput schema / properties / market / description
      Added value: +"Homes for sale (buy) or to let (rent)."
    • addedInput schema / properties / min_bedrooms / description
      Added value: +"Fewest bedrooms (0 = studio or any)."
  8. First observed

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, and the description reinforces this with 'Stateless: nothing is stored on Close Knit', which clarifies that no server-side state is created and the returned spec is the only artifact. It also describes the downstream behavior (the scheduled prompt reports only new listings via the state file), which annotations cannot convey. No side-effect or auth caveats remain unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action, and the second sentence carries a genuinely useful constraint. The first sentence is a dense list but every element (searches, filters, state file, prompt) names a real output component, so little is wasted.

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

Completeness4/5

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

With an output schema and full schema coverage, the description only needs to say what the tool produces and its statelessness, both of which it does. The remaining gap is preconditions — how area_ids should be obtained and what 'finished search' concretely means — for a tool whose usefulness depends on correct inputs.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented, making 3 the baseline. The description adds little per-parameter meaning beyond noting the filters are embedded in the generated portal searches, and its phrase 'per postcode district' is not fully reconciled with the schema's `area_ids` being LSOA ids, which could cause confusion.

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

Purpose5/5

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

The definition uses a concrete verb+resource phrase ('Turn a finished search into a watch') and then enumerates exactly what the artifact contains: portal searches per postcode district, filters, a state file path, and a ready prompt for a scheduled task. No sibling tool produces a watch spec, so an agent can route to it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Turn a finished search into a watch' implies the prerequisite (a completed search) but never states when to prefer this over simply re-running a search, nor any when-not conditions. Nothing indicates whether the agent must first gather area ids via find_areas/search_areas, which is the practical selection question.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.