PropertyList: Spanish Property MLS

First-party Spanish and Portuguese property listings with notary-verified prices.

我该使用它吗

质量与安全性

A
描述质量
99%
模式完整度
92%
命名质量
92%
投毒风险
100%
权限匹配度
100%
协议合规性
100%

基于对工具定义和协议合规性的自动分析。

上下文开销

~6,437token 数(工具定义)
~2.7 KB典型响应大小
对注意力有显著影响(占 128k 上下文窗口的 5.03%)

这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。

安装

一键安装

将以下内容添加到你的 `claude_desktop_config.json` 文件中:

{
  "mcpServers": {
    "propertylist": {
      "url": "https://mcp.propertylist.es/mcp"
    }
  }
}

远程端点

https://mcp.propertylist.es/mcpstreamable-http

它能做什么

工具清单

工具(15)

🟢 只读🟡 写入🔴 删除⚪ 未知
🟢search_properties(search_type, location, property_types, bedrooms_min, bedrooms_max, ...)

Search PropertyList's full Spanish property MLS by structured filters. Use for queries that translate cleanly to fields: bedrooms, bathrooms, price ceiling, property type, area name. For free-form briefs use find_properties_by_description instead. Returns a paginated list with summary text plus structured JSON. Every property carries `oracle_verified` and `oracle_attestation_url` — true when PropertyList Oracle holds a verified attestation for the listing's municipality and segment. A `location` we do not hold returns zero results with error: location_not_found and location_match.matched: false. It never substitutes listings from other areas. `location.city` is whatever tier the listing was filed under and may be a municipality OR a locality inside one. To place a listing administratively use `location.municipality` (with its INE municipality_code); it is null, never guessed, when we cannot resolve it. `location.latitude` / `location.longitude` are present only when we hold a real, publishable coordinate; the fields are absent otherwise, and are never 0,0. `location.coordinates_precision` says what the point is: exact or street is the property itself, locality or administrative_area is an area centroid (accurate to the town, not the building), unknown is a pin we hold no precision record for.

输入模式

{
  "type": "object",
  "properties": {
    "search_type": {
      "type": "string",
      "enum": [
        "for-sale",
        "for-rent",
        "holiday-rentals"
      ],
      "description": "Listing market. Defaults to 'for-sale'."
    },
    "location": {
      "type": "string",
      "description": "Free-text place name (city, suburb, or urbanisation). e.g. 'Marbella', 'Nueva Andalucia', 'Sotogrande'. Pre-resolved with autocomplete_location if you need to confirm match."
    },
    "property_types": {
      "type": "string",
      "description": "Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, commercial."
    },
    "bedrooms_min": {
      "type": "integer",
      "minimum": 0,
      "maximum": 20
    },
    "bedrooms_max": {
      "type": "integer",
      "minimum": 0,
      "maximum": 20
    },
    "bathrooms_min": {
      "type": "integer",
      "minimum": 0,
      "maximum": 20
    },
    "price_min": {
      "type": "integer",
      "minimum": 0,
      "description": "Minimum price in euros (sale) or monthly euros (rent)."
    },
    "price_max": {
      "type": "integer",
      "minimum": 0,
      "description": "Maximum price in euros (sale) or monthly euros (rent)."
    },
    "page": {
      "type": "integer",
      "minimum": 1,
      "default": 1
    },
    "page_size": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "default": 12
    },
    "language": {
      "type": "string",
      "enum": [
        "en",
        "es",
        "de",
        "fr",
        "it",
        "nl",
        "pt",
        "bg",
        "el",
        "da",
        "sv",
        "no",
        "fi",
        "pl",
        "ru"
      ],
      "default": "en",
      "description": "Preferred language for property titles and description excerpts."
    }
  }
}

输出模式

{
  "type": "object",
  "properties": {
    "total": {
      "type": "integer"
    },
    "page": {
      "type": "integer"
    },
    "page_size": {
      "type": "integer"
    },
    "location_match": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "requested": {
          "type": "string"
        },
        "matched": {
          "type": "boolean"
        },
        "exact": {
          "type": "boolean"
        },
        "matched_location": {
          "type": [
            "string",
            "null"
          ]
        },
        "matched_areas": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "error": {
      "type": [
        "string",
        "null"
      ]
    },
    "limits": {
      "type": [
        "object",
        "null"
      ]
    },
    "properties": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "reference": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "price": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Headline price for the listing's transaction type; read with price_period."
          },
          "price_period": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "total",
              "per_month",
              "per_week",
              null
            ],
            "description": "total = sale price, per_month = long-term rent, per_week = holiday rent."
          },
          "price_note": {
            "type": [
              "string",
              "null"
            ]
          },
          "sale_price": {
            "type": [
              "integer",
              "null"
            ]
          },
          "monthly_price": {
            "type": [
              "integer",
              "null"
            ]
          },
          "weekly_price_from": {
            "type": [
              "integer",
              "null"
            ]
          },
          "search_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "bedrooms": {
            "type": [
              "integer",
              "null"
            ]
          },
          "bathrooms": {
            "type": [
              "integer",
              "null"
            ]
          },
          "build_sqm": {
            "type": [
              "integer",
              "null"
            ]
          },
          "plot_sqm": {
            "type": [
              "integer",
              "null"
            ]
          },
          "energy_rating": {
            "type": [
              "string",
              "null"
            ]
          },
          "location": {
            "type": "object"
          },
          "oracle_verified": {
            "type": "boolean"
          },
          "oracle_attestation_url": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          },
          "agency_id": {
            "type": [
              "integer",
              "null"
            ]
          }
        }
      }
    }
  },
  "required": [
    "total",
    "page",
    "page_size",
    "properties"
  ]
}
🟢find_properties_by_description(brief, language)

Match Spanish properties from a free-form description of what the user wants. Best for vague, conditional, or lifestyle-heavy briefs ("3-bed near a good international school, flexible on budget if there's a sea view"). The matcher translates the brief into one to three parallel structured searches across PropertyList's full MLS, then merges and ranks the results. Returns up to 9 listings with match scores and an explanation of how the brief was interpreted (and what couldn't be resolved).

输入模式

{
  "type": "object",
  "properties": {
    "brief": {
      "type": "string",
      "description": "Plain-English (or Spanish) description of what the user is looking for. 10-500 chars."
    },
    "language": {
      "type": "string",
      "enum": [
        "en",
        "es",
        "de",
        "fr",
        "it",
        "nl",
        "pt",
        "bg",
        "el",
        "da",
        "sv",
        "no",
        "fi",
        "pl",
        "ru"
      ],
      "default": "en"
    }
  },
  "required": [
    "brief"
  ]
}

输出模式

{
  "type": "object",
  "properties": {
    "interpretation": {
      "type": [
        "object",
        "null"
      ]
    },
    "summary": {
      "type": [
        "string",
        "null"
      ]
    },
    "unresolved": {
      "type": "array"
    },
    "error": {
      "type": [
        "string",
        "null"
      ]
    },
    "billed": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "properties": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "reference": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "price": {
            "type": [
              "integer",
              "null"
            ]
          },
          "bedrooms": {
            "type": [
              "integer",
              "null"
            ]
          },
          "bathrooms": {
            "type": [
              "integer",
              "null"
            ]
          },
          "location": {
            "type": "object"
          },
          "match_reason": {
            "type": [
              "string",
              "null"
            ]
          },
          "oracle_verified": {
            "type": "boolean"
          },
          "oracle_attestation_url": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      }
    }
  },
  "required": [
    "properties"
  ]
}
🟢autocomplete_location(query, provinces)

Look up Spanish property areas (city, suburb, urbanisation) by free-text name. Returns up to 10 matches with id, name, and the parent province/city. Use this to resolve place names before calling search_properties, especially for common spellings like 'Nueva Andalucia' (vs 'Nueva Andalucía') or 'Marbella old town'.

输入模式

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Free-text place name. 2+ characters."
    },
    "provinces": {
      "type": "string",
      "description": "Optional comma-separated province ids to scope the search."
    }
  },
  "required": [
    "query"
  ]
}
🟢get_property(reference, language)

Fetch the full record for one PropertyList listing by its reference code (the human-readable id like 'PLE-12345'). Use this once the user has settled on a listing from search_properties or find_properties_by_description and wants details or photos. To contact the listing agency, use submit_enquiry - direct phone or email details are not part of the payload. Works without an API key up to a daily per-IP allowance of distinct listings; an API key raises that allowance. `location.city` is whatever tier the listing was filed under and may be a municipality OR a locality inside one. To place a listing administratively use `location.municipality` (with its INE municipality_code); it is null, never guessed, when we cannot resolve it. `location.latitude` / `location.longitude` are present only when we hold a real, publishable coordinate; the fields are absent otherwise, and are never 0,0. `location.coordinates_precision` says what the point is: exact or street is the property itself, locality or administrative_area is an area centroid (accurate to the town, not the building), unknown is a pin we hold no precision record for.

输入模式

{
  "type": "object",
  "properties": {
    "reference": {
      "type": "string",
      "description": "PropertyList reference, e.g. 'PLE-12345'."
    },
    "language": {
      "type": "string",
      "enum": [
        "en",
        "es",
        "de",
        "fr",
        "it",
        "nl",
        "pt",
        "bg",
        "el",
        "da",
        "sv",
        "no",
        "fi",
        "pl",
        "ru"
      ],
      "default": "en"
    }
  },
  "required": [
    "reference"
  ]
}

输出模式

{
  "type": "object",
  "properties": {
    "property": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer"
        },
        "reference": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "price": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Headline price for the listing's transaction type; read with price_period."
        },
        "price_period": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "total",
            "per_month",
            "per_week",
            null
          ],
          "description": "total = sale price, per_month = long-term rent, per_week = holiday rent."
        },
        "price_note": {
          "type": [
            "string",
            "null"
          ]
        },
        "sale_price": {
          "type": [
            "integer",
            "null"
          ]
        },
        "monthly_price": {
          "type": [
            "integer",
            "null"
          ]
        },
        "weekly_price_from": {
          "type": [
            "integer",
            "null"
          ]
        },
        "bedrooms": {
          "type": [
            "integer",
            "null"
          ]
        },
        "bathrooms": {
          "type": [
            "integer",
            "null"
          ]
        },
        "build_sqm": {
          "type": [
            "integer",
            "null"
          ]
        },
        "plot_sqm": {
          "type": [
            "integer",
            "null"
          ]
        },
        "energy_rating": {
          "type": [
            "string",
            "null"
          ]
        },
        "energy_kwh_m2": {
          "type": [
            "number",
            "null"
          ],
          "description": "EPC energy consumption in kWh/m² per year."
        },
        "energy_status": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "certified",
            "in_progress",
            "exempt",
            null
          ],
          "description": "EPC certificate status."
        },
        "location": {
          "type": "object"
        },
        "description": {
          "type": [
            "string",
            "null"
          ]
        },
        "features": {
          "type": "array"
        },
        "features_language": {
          "type": "string"
        },
        "photos": {
          "type": "array"
        },
        "agency": {
          "type": [
            "object",
            "null"
          ]
        },
        "oracle_verified": {
          "type": "boolean"
        },
        "oracle_attestation_url": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    }
  },
  "required": [
    "property"
  ]
}
🟢area_market_summary(location, search_type, property_types)

Return aggregate market context for a Spanish area: number of active listings, median price, mean price, median €/m², and the count broken down by bedroom band. Filterable by property type and search type (for-sale / for-rent / holiday-rentals). Use this before recommending a price or commenting on whether a listing is good value. If the place name is not one we hold, the response says so (error: location_not_found, location_match.matched: false) and returns no figures. Figures are NEVER nationwide fallbacks. Price figures follow the search type and are labelled with price_unit: sale prices are totals, for-rent is per MONTH and holiday-rentals is per WEEK. median_price_per_sqm is reported for sales only. The `oracle` block carries the attested transaction price for the area. Check `oracle.verified` before citing it as verified: it is true only for Spanish figures from the notarial register (Consejo General del Notariado) with at least 10 recorded transactions behind them. Outside Spain the figure comes from a national house-price index, carries no transaction count, and must never be described as notary-backed - `oracle.source` names the real source and `oracle.note` says why it is not verified. Transactions are recorded per municipality, so a sub-area (Sotogrande, Puerto Banus, Nueva Andalucia, Orihuela Costa) is answered with the figure for the municipality containing it, with `oracle.rolled_up_from_sub_area` true and `oracle.municipality` / `oracle.municipality_code` naming it. Quote it as the municipality's figure, never as the sub-area's own.

输入模式

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string",
      "description": "Place name (city, suburb, or urbanisation). e.g. 'Marbella'."
    },
    "search_type": {
      "type": "string",
      "enum": [
        "for-sale",
        "for-rent",
        "holiday-rentals"
      ],
      "default": "for-sale"
    },
    "property_types": {
      "type": "string",
      "description": "Optional comma-separated slugs: apartments, villas, penthouses, plots, townhouses."
    }
  },
  "required": [
    "location"
  ]
}

输出模式

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string"
    },
    "location_match": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "requested": {
          "type": "string"
        },
        "matched": {
          "type": "boolean"
        },
        "exact": {
          "type": "boolean"
        },
        "matched_location": {
          "type": [
            "string",
            "null"
          ]
        },
        "matched_areas": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "error": {
      "type": [
        "string",
        "null"
      ]
    },
    "search_type": {
      "type": "string"
    },
    "price_unit": {
      "type": "string",
      "enum": [
        "total",
        "per_month",
        "per_week"
      ]
    },
    "price_basis": {
      "type": "string"
    },
    "note": {
      "type": [
        "string",
        "null"
      ]
    },
    "property_types": {
      "type": [
        "string",
        "null"
      ]
    },
    "total_listings": {
      "type": "integer"
    },
    "median_price": {
      "type": [
        "integer",
        "null"
      ]
    },
    "mean_price": {
      "type": [
        "integer",
        "null"
      ]
    },
    "min_price": {
      "type": [
        "integer",
        "null"
      ]
    },
    "max_price": {
      "type": [
        "integer",
        "null"
      ]
    },
    "median_price_per_sqm": {
      "type": [
        "integer",
        "null"
      ]
    },
    "by_bedroom_band": {
      "type": "object"
    },
    "oracle": {
      "type": "object",
      "properties": {
        "verified": {
          "type": "boolean"
        },
        "transaction_backed": {
          "type": "boolean"
        },
        "verified_price_per_sqm": {
          "type": [
            "integer",
            "null"
          ]
        },
        "sample_size": {
          "type": [
            "integer",
            "null"
          ]
        },
        "minimum_verified_sample": {
          "type": [
            "integer",
            "null"
          ]
        },
        "municipality": {
          "type": [
            "string",
            "null"
          ]
        },
        "municipality_code": {
          "type": [
            "string",
            "null"
          ]
        },
        "rolled_up_from_sub_area": {
          "type": "boolean"
        },
        "requested_area": {
          "type": [
            "string",
            "null"
          ]
        },
        "source": {
          "type": [
            "string",
            "null"
          ]
        },
        "source_label": {
          "type": [
            "string",
            "null"
          ]
        },
        "note": {
          "type": [
            "string",
            "null"
          ]
        },
        "attestation_url": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    }
  },
  "required": [
    "location",
    "total_listings",
    "oracle"
  ]
}
🟢list_agencies(location, limit)

Find PropertyList agencies (estate agents) in a given Spanish area, ranked by how many active listings they carry there. Returns up to 10 agencies with name, location, listing count, and a public URL the user can visit. Use this after a buyer has narrowed in on an area and wants to know which agencies dominate it.

输入模式

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string",
      "description": "Place name (city, suburb, or urbanisation). e.g. 'Estepona'."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 25,
      "default": 10
    }
  },
  "required": [
    "location"
  ]
}
🟢verified_valuation(location, property_type, build_sqm, build_size, build, ...)

Get a valuation for a property or area from recorded market data, not asking prices. Returns the €/m² for the municipality and segment, an indicative valuation when you give a size (build_sqm) or a listing reference, and a content-hashed attestation URL the figure can be cited from. Check `verified` before citing. It is true ONLY for Spanish figures drawn from the notarial register (Consejo General del Notariado) with at least 10 recorded transactions behind them. Elsewhere - Portugal and Cyprus especially - the figure comes from a national house-price index and is an estimate: `transaction_backed` is false, `source_label` names the real source, and it must not be described as notary-verified. `indicative_band_pct` widens as the evidence thins. Transactions are recorded per municipality, so a query for a sub-area (Sotogrande, Puerto Banus, Nueva Andalucia, Orihuela Costa) is answered with the containing municipality's attestation: `rolled_up_from_sub_area` is true, `location` and `municipality_code` name the municipality, `requested_area` is what you asked for and `rollup_note` is the sentence to repeat. Never quote a rolled-up figure as the sub-area's own price. Only two segment attestations exist per municipality, so a request for penthouse or townhouse resolves to the nearest attested segment. `property_type` is the segment actually used and `requested_property_type` is what you asked for; when they differ the text says so. Also returns our proprietary network achieved-sale figure where available. If no attestation covers the area yet, it says so plainly (use area_market_summary for asking-price stats instead).

输入模式

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string",
      "description": "Municipality / city name, e.g. \"Marbella\". Ignored if a reference is given."
    },
    "property_type": {
      "type": "string",
      "description": "Optional segment slug: apartment, villa, penthouse, townhouse, plot. Defaults to the municipality-wide figure."
    },
    "build_sqm": {
      "type": "integer",
      "minimum": 1,
      "description": "Built size in m² to value. Optional."
    },
    "build_size": {
      "type": "integer",
      "minimum": 1,
      "description": "Alias of build_sqm."
    },
    "build": {
      "type": "integer",
      "minimum": 1,
      "description": "Alias of build_sqm."
    },
    "reference": {
      "type": "string",
      "description": "Value a specific PropertyList listing by reference (uses its municipality, type and size). Optional."
    }
  }
}

输出模式

{
  "type": "object",
  "properties": {
    "verified": {
      "type": "boolean"
    },
    "transaction_backed": {
      "type": "boolean"
    },
    "location": {
      "type": [
        "string",
        "null"
      ]
    },
    "municipality_code": {
      "type": [
        "string",
        "null"
      ]
    },
    "rolled_up_from_sub_area": {
      "type": "boolean"
    },
    "requested_area": {
      "type": [
        "string",
        "null"
      ]
    },
    "rollup_note": {
      "type": [
        "string",
        "null"
      ]
    },
    "property_type": {
      "type": [
        "string",
        "null"
      ]
    },
    "requested_property_type": {
      "type": [
        "string",
        "null"
      ]
    },
    "indicative_band_pct": {
      "type": [
        "integer",
        "null"
      ]
    },
    "source_label": {
      "type": [
        "string",
        "null"
      ]
    },
    "verified_price_per_sqm": {
      "type": [
        "integer",
        "null"
      ]
    },
    "build_sqm": {
      "type": [
        "integer",
        "null"
      ]
    },
    "valuation_estimate": {
      "type": [
        "integer",
        "null"
      ]
    },
    "indicative_range": {
      "type": "object"
    },
    "sample_size": {
      "type": [
        "integer",
        "null"
      ]
    },
    "period_end": {
      "type": [
        "string",
        "null"
      ]
    },
    "source": {
      "type": [
        "string",
        "null"
      ]
    },
    "content_hash": {
      "type": [
        "string",
        "null"
      ]
    },
    "attestation_url": {
      "type": [
        "string",
        "null"
      ]
    },
    "on_chain": {
      "type": "boolean"
    },
    "network": {
      "type": [
        "object",
        "null"
      ]
    }
  },
  "required": [
    "verified",
    "location"
  ]
}
🔴submit_enquiry(reference, name, email, phone, message, ...)

Submit an enquiry (lead) about a specific listing on behalf of a prospective buyer or tenant. Use this once the user has chosen a property and wants the agency to contact them. The listing agency receives the enquiry in their CRM and follows up directly. This is the supported way to contact a listing agency - direct phone or email details are not exposed by other tools. Works without an API key up to a small daily per-IP allowance; an API key removes that allowance. Provide the property `reference` (from search results) plus the enquirer's contact details. Only submit with the person's clear intent and consent - this sends their details to a real estate agency.

输入模式

{
  "type": "object",
  "properties": {
    "reference": {
      "type": "string",
      "description": "PropertyList listing reference the enquiry is about, e.g. 'PLE-12345'."
    },
    "name": {
      "type": "string",
      "description": "Enquirer's full name."
    },
    "email": {
      "type": "string",
      "description": "Enquirer's email address."
    },
    "phone": {
      "type": "string",
      "description": "Enquirer's phone number (with country code where possible)."
    },
    "message": {
      "type": "string",
      "description": "Optional message / what they want to know or arrange (e.g. a viewing)."
    },
    "language": {
      "type": "string",
      "enum": [
        "en",
        "es",
        "de",
        "fr",
        "it",
        "nl",
        "pt",
        "bg",
        "el",
        "da",
        "sv",
        "no",
        "fi",
        "pl",
        "ru"
      ],
      "default": "en",
      "description": "Preferred language for the agency to reply in."
    }
  },
  "required": [
    "reference",
    "name",
    "email",
    "phone"
  ]
}
🟢my_leads(limit, since, property_reference)

List recent enquiries (leads) for YOUR agency's CRM - newest first. Use when the agent asks what has just come in (e.g. "what came in today?"). This is the enquiry inbox: an enquiry that arrived from the portal, a website or a microsite. Once an agent starts working a person they live on a pipeline board instead - for those, use my_pipeline. An agency that works everything off the boards can have a busy CRM and an empty inbox here, which is not the same as having no leads. Requires an agency API key; only ever returns the calling agency's own leads.

输入模式

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "default": 20
    },
    "since": {
      "type": "string",
      "description": "ISO date/time - only leads created on or after this. Optional."
    },
    "property_reference": {
      "type": "string",
      "description": "Only leads about this listing reference. Optional."
    }
  }
}
🟢my_pipeline(pipeline, stage, limit)

List the cards on YOUR agency's CRM pipeline boards (Kanban), with each board's own stage names and card counts. Boards: lead, buyer, seller, tenant, nurture (each card is a contact) and property (each card is a listing). Stage names are whatever the agency renamed them to, so read them from the reply rather than assuming. Call with no pipeline for a summary of every board - use this to answer "what's in my pipeline?" or "how many buyers do I have?". Call with a pipeline for that board's cards, newest activity first. This is the board view. For enquiries that have just arrived and have not been worked yet, use my_leads instead. Returns the WHOLE agency's boards, not one agent's cards - an API key belongs to the agency, not to a person. Requires an agency API key; only ever returns the calling agency's own data.

输入模式

{
  "type": "object",
  "properties": {
    "pipeline": {
      "type": "string",
      "enum": [
        "lead",
        "buyer",
        "seller",
        "tenant",
        "nurture",
        "property"
      ],
      "description": "Which board. Omit for a summary of all of them."
    },
    "stage": {
      "type": "string",
      "description": "Only cards in this stage. Match on the stage name as it reads on the board (case-insensitive); closed stages such as Won or Lost can be asked for by name. Optional."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "default": 10,
      "description": "Cards per stage. Counts are always the full stage total, whatever this is set to."
    }
  }
}
🟢find_contacts(query, limit)

Search YOUR agency's CRM contacts by name, company, email or phone. Use to look a person up before logging a note or to check if they're already in the CRM. Requires an agency API key; only ever searches the calling agency's own contacts.

输入模式

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Name, company, email or phone fragment to search for."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "default": 20
    }
  },
  "required": [
    "query"
  ]
}
🟢my_listings(status, reference, limit)

List YOUR agency's own property listings (newest first), optionally filtered by status or a specific reference. Use for "show my listings" / "is reference X still online?". Requires an agency API key; only ever returns the calling agency's own properties.

输入模式

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "online",
        "offline",
        "sold",
        "draft",
        "all"
      ],
      "default": "online",
      "description": "Listing status. Defaults to 'online'. 'draft' covers listings not yet published (new + in review); 'all' returns every status."
    },
    "reference": {
      "type": "string",
      "description": "A specific listing reference. Optional."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "default": 20
    }
  }
}
🟡create_contact(name, surname, email, phone, company_name)

Add a new contact to YOUR agency's CRM. Use when the agent wants to save a person (buyer, owner, enquirer). If a contact with the same email already exists it is returned rather than duplicated. The contact is created unassigned and flagged as needing attention so it surfaces in the CRM. Requires an agency API key.

输入模式

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Contact's first name (or full name)."
    },
    "surname": {
      "type": "string",
      "description": "Contact's surname. Optional."
    },
    "email": {
      "type": "string",
      "description": "Email address. Optional but recommended (used for de-duplication)."
    },
    "phone": {
      "type": "string",
      "description": "Phone number. Optional."
    },
    "company_name": {
      "type": "string",
      "description": "Company name (for a business contact). Optional."
    }
  },
  "required": [
    "name"
  ]
}
🟡create_listing(description, location, property_type, search_type, price, ...)

Start a new property listing in YOUR agency's CRM from a description. Use when the agent is describing a property they have taken on and wants it in the system. Creates a DRAFT. It is never published and never appears on the portal from here: the agent adds photographs and the energy rating in the CRM and publishes it themselves. The response includes a direct link to the draft. Location is resolved against the real area tree, so a town, suburb or urbanisation name is enough. Requires an agency API key.

输入模式

{
  "type": "object",
  "properties": {
    "description": {
      "type": "string",
      "description": "The property description, in the language the agent wrote it."
    },
    "location": {
      "type": "string",
      "description": "Town, suburb or urbanisation, e.g. \"Nueva Andalucia\" or \"Menara Beach\"."
    },
    "property_type": {
      "type": "string",
      "description": "apartment, villa, penthouse, townhouse, plot or commercial."
    },
    "search_type": {
      "type": "string",
      "enum": [
        "for-sale",
        "for-rent"
      ],
      "description": "Whether it is for sale or for long-term rent. Defaults to for-sale."
    },
    "price": {
      "type": "integer",
      "description": "Asking price in euros, or monthly rent for a rental."
    },
    "bedrooms": {
      "type": "integer"
    },
    "bathrooms": {
      "type": "integer"
    },
    "build_sqm": {
      "type": "integer",
      "description": "Built area in square metres."
    },
    "plot_sqm": {
      "type": "integer",
      "description": "Plot size in square metres."
    },
    "headline": {
      "type": "string",
      "description": "Short headline for the listing. Optional."
    },
    "language": {
      "type": "string",
      "description": "Language the description is written in. Defaults to the agency language."
    }
  },
  "required": [
    "description"
  ]
}
🟢log_note(note, contact_id, property_reference)

Log a note against a contact or a listing in YOUR agency's CRM (e.g. record a call outcome or a viewing). Provide the note text plus a contact_id (from find_contacts) and/or a property reference. The note appears on the contact/property timeline. Requires an agency API key.

输入模式

{
  "type": "object",
  "properties": {
    "note": {
      "type": "string",
      "description": "The note text to record."
    },
    "contact_id": {
      "type": "integer",
      "description": "Contact to attach the note to (from find_contacts). Optional if a property reference is given."
    },
    "property_reference": {
      "type": "string",
      "description": "Listing reference to attach the note to. Optional if a contact_id is given."
    }
  },
  "required": [
    "note"
  ]
}

社区

评价此服务器

证据

最近观测

已验证未记录版本15 个工具
已验证未记录版本15 个工具
已验证未记录版本15 个工具