Skip to main content
Glama

SPACEXPLORATION

Update listing

update_listing
DestructiveIdempotent

Update a listing's parcel, pricing, or marketing data, or a lease's suites. Pass at least one group (parcel, pricing, marketing, spaces); send each group whole, not just the changed field. A live listing must stay publishable: an update that leaves it without what publishing required is refused whole, so switch a live listing between sale and lease in one call that carries the new side's price (sale_price, or spaces). Returns the full updated listing exactly as stored.

Input Schema

NameRequiredDescriptionDefault
hashidYesHashid of the listing to update.
parcelNoParcel/address fields to update: street_address, city, county, state, postal_code, latitude, longitude, and optionally unit, lot_size (INTEGER SQUARE FEET — convert acres × 43,560), lot_size_unit (the unit the size was stated in: sqft | acres | sqm | hectares; display-only), year_built, property_type, place_id (from geocode_address — when the address moves, it matches the listing to a building already on file).
spacesNoA lease's suites, as the whole list: a suite left out is removed, and an empty list removes them all. A whole building leased as one is a single suite. To change suites, start from the spaces get_listing returns to you as the owner: a suite sent with its id is updated, and any field it leaves out keeps its stored value; a suite without an id is added. Publishing a lease needs at least one available suite with available_sqft and a lease_rate or price_on_request=true.
pricingNoPricing fields to update: listing_type (sale|lease). For a sale set sale_price (dollars), or omit it and set price_on_request=true for "price upon request". A lease is priced per suite (see spaces); lease_rate_period (per_sqft_year|per_sqft_month|per_month|per_year, default per_sqft_year) is the basis every suite's rate is quoted in. A lease with at most one suite, such as a whole building leased as one, can instead be priced here: lease_rate and available_sqft (INTEGER SQUARE FEET), or price_on_request=true, set that one suite, creating it when there is none. Optionally expires_at (ISO date).
marketingNoMarketing copy to update: headline, summary, title_override, highlights (string[]).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / pricing / description
      Previous value: -"Pricing fields to update: listing_type (sale|lease); for a sale set sale_price (dollars), for a lease set lease_rate (per the lease_rate_period basis, default per_sqft_year) and optionally lease_rate_period (per_sqft_year|per_sqft_month|per_month|per_year). Omit the price and set price_on_request=true for \"price upon request\". Optionally expires_at (ISO date)."New value: +"Pricing fields to update: listing_type (sale|lease). For a sale set sale_price (dollars), or omit it and set price_on_request=true for \"price upon request\". A lease is priced per suite (see spaces); lease_rate_period (per_sqft_year|per_sqft_month|per_month|per_year, default per_sqft_year) is the basis every suite's rate is quoted in. A lease with at most one suite, such as a whole building leased as one, can instead be priced here: lease_rate and available_sqft (INTEGER SQUARE FEET), or price_on_request=true, set that one suite, creating it when there is none. Optionally expires_at (ISO date)."
    • addedInput schema / properties / spaces
      Added value: +{
      +  "description": "A lease's suites, as the whole list: a suite left out is removed, and an empty list removes them all. A whole building leased as one is a single suite. To change suites, start from the spaces get_listing returns to you as the owner: a suite sent with its id is updated, and any field it leaves out keeps its stored value; a suite without an id is added. Publishing a lease needs at least one available suite with available_sqft and a lease_rate or price_on_request=true.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "available_date": {
      +        "description": "ISO date the suite is available from.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "available_sqft": {
      +        "description": "Available space in INTEGER SQUARE FEET.",
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "id": {
      +        "description": "The suite's id, as get_listing returns it to you as the owner. Omit to add a suite.",
      +        "type": "integer"
      +      },
      +      "lease_rate": {
      +        "description": "Asking rate in the listing's lease_rate_period basis, e.g. 24.5 for $24.50/SF/yr. Null when quoted on request.",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "lease_type": {
      +        "description": "How operating expenses are split: nnn, fsg (full service gross), mg (modified gross), or gross.",
      +        "enum": [
      +          "nnn",
      +          "fsg",
      +          "mg",
      +          "gross",
      +          null
      +        ],
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "max_term_months": {
      +        "description": "Longest lease term offered, in months.",
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "min_term_months": {
      +        "description": "Shortest lease term offered, in months.",
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "name": {
      +        "description": "Suite label, e.g. \"Suite 200\" or \"Floor 3\".",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "price_on_request": {
      +        "description": "true when the rate is quoted on request.",
      +        "type": "boolean"
      +      },
      +      "space_type": {
      +        "description": "Use of the space: a value from the space_type attribute get_registry returns.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "status": {
      +        "description": "available (a new suite's default), pending, or leased. Only available suites are shown and priced.",
      +        "enum": [
      +          "available",
      +          "pending",
      +          "leased"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
  2. Changed1 schema field changed
    • changedInput schema / properties / parcel / description
      Previous value: -"Parcel/address fields to update: street_address, city, county, state, postal_code, latitude, longitude, and optionally unit, lot_size (INTEGER SQUARE FEET — convert acres × 43,560), lot_size_unit (the unit the size was stated in: sqft | acres | sqm | hectares; display-only), year_built, property_type."New value: +"Parcel/address fields to update: street_address, city, county, state, postal_code, latitude, longitude, and optionally unit, lot_size (INTEGER SQUARE FEET — convert acres × 43,560), lot_size_unit (the unit the size was stated in: sqft | acres | sqm | hectares; display-only), year_built, property_type, place_id (from geocode_address — when the address moves, it matches the listing to a building already on file)."
  3. Changed1 schema field changed
    • changedInput schema / properties / parcel / description
      Previous value: -"Parcel/address fields to update: street_address, city, county, state, postal_code, latitude, longitude, and optionally unit, lot_acres, year_built, property_type."New value: +"Parcel/address fields to update: street_address, city, county, state, postal_code, latitude, longitude, and optionally unit, lot_size (INTEGER SQUARE FEET — convert acres × 43,560), lot_size_unit (the unit the size was stated in: sqft | acres | sqm | hectares; display-only), year_built, property_type."
  4. Added

TDQS

A4.6/5.0
Behavior5/5

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

Adds substantial context beyond the annotations: omitted suites are deleted, an empty list clears them all, and any update that would leave a live listing unpublishable is 'refused whole' rather than partially applied. It also states the return value ('the full updated listing exactly as stored'), which the annotations do not cover.

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?

Four sentences, front-loaded with the action and the group requirement, then constraints, then return value. Dense but every sentence carries operational information; minor density cost given the tool's complexity.

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

Completeness5/5

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

No output schema, so the description supplies the return contract, plus the destructive and atomic-refusal semantics that matter most for a destructiveHint=true mutation. An agent has enough to call it correctly and predict failure modes.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description contributes cross-parameter rules the schema cannot express: groups must be sent whole, and the sale/lease switch requires the destination side's price field. It also clarifies the sale_price-vs-price_on_request and per-suite-vs-listing-level pricing relationship.

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?

Opens with a specific verb+resource and enumerates exactly which data groups it touches (parcel, pricing, marketing, suites), which lets an agent separate it from create_listing, set_listing_attributes, and publish_listing without opening schemas. The scope statement is unambiguous.

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

Usage Guidelines4/5

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

Gives strong conditional guidance: pass at least one group, send groups whole, and switch sale/lease in a single call carrying the new side's price. It stops short of naming sibling alternatives (e.g., set_listing_attributes for attributes, publish_listing for go-live), so it is clear context without explicit routing.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources