zameen-mcp
This server lets you research Zameen.com property listings through structured MCP tools, including searching, inspecting listings, managing local watchlists, and drafting agent messages.
search_properties: Search listings by city, purpose (sale/rent), property type, beds, price, area, keywords, and sort; apply badge filters such as verified-only, titanium agent, exclude promoted, and max price.
get_listing_details: Fetch full details for a single listing by URL or numeric ID.
list_supported_cities: List verified city slugs and property types usable in searches.
add_watch: Save a named local watchlist from search criteria, optionally seeding it with current results.
check_watch: Re-run a saved watch and report only new listings since the last check.
list_watches / remove_watch: List or delete locally saved watchlists.
draft_agent_message: Compose a polite inquiry message to a listing's agent (draft only; never sends anything).
account_status: Check whether an authenticated Zameen session is loaded.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@zameen-mcpSearch for verified 3-bed flats in DHA Lahore under 5 crore"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP server for researching property listings on Zameen.com
Verified / Titanium-agent filtering · local watchlists · listing details · agent-message drafting — through 9 structured tools in any MCP client.
Tool reference · Deployment guide · Contributing · Changelog
An MCP (Model Context Protocol) server for researching property listings on Zameen.com — Pakistan's largest real estate portal — through structured tools instead of fragile screen scraping.
Trademark notice: "Zameen" and the Zameen.com logo are trademarks of Zameen.com (EMPG). They are used here solely to identify the service this tool interfaces with. This project is unaffiliated with, and not endorsed by, Zameen.com.
Works with any MCP client: Claude Desktop, Hermes Agent, Cursor, and others.
Install
# run directly with no permanent install (recommended)
uvx zameen-mcp
# or install as an isolated CLI tool
pipx install zameen-mcpRegister in your MCP client
{
"mcpServers": {
"zameen": {
"command": "uvx",
"args": ["zameen-mcp"]
}
}
}That's it — 9 tools appear in your AI client.
Related MCP server: Zillow MCP Server
Tools
Tool | What it does |
| Structured search: city, purpose, type, beds, price, area, keywords, sort |
| Full detail page for one listing (URL or numeric id) |
| Verified city slugs + property types |
| Save search criteria locally; later re-checks report only NEW listings |
| Manage saved watches |
| Compose a polite inquiry for a listing — draft only, never sends |
| Whether an authenticated session is loaded |
Badge-level filtering Zameen's own UI can't do: verified_only,
agent_tier (e.g. "titanium"), exclude_promoted.
Full parameter reference + natural-language cheat sheet: docs/TOOLS.md
Optional: log in to your Zameen account
Anonymous searching works out of the box. To also ride your logged-in session (saved searches, personalized pages):
pipx inject zameen-mcp playwright && .venv/bin/playwright install chromium # pipx
uv tool install zameen-mcp --with playwright && playwright install chromium # uv
zameen-mcp-login # opens a Chromium window; YOU log in; cookies stay localYour password is never seen or stored by this software — only the resulting
session cookies, kept in ~/.zameen-mcp/ on your machine. Wipe anytime:
zameen-mcp-login --logout.
Data location
All state lives in ~/.zameen-mcp/ (watches.json, session_state.json,
chrome-profile/). Override with the ZAMEEN_MCP_HOME environment variable.
Treat session_state.json like a password: it grants access to your account
while valid.
Development
git clone <repo-url> && cd zameen.com
uv venv .venv && uv pip install -p .venv/Scripts/python.exe -e ".[dev]"
.venv/Scripts/python.exe -m pytest -q # offline suite against real captured pages
.venv/Scripts/python.exe smoke_test.py # live end-to-end checkCompliance & fair use
Zameen.com's
robots.txtdisallows crawling its major-city listing pages. This server is built for interactive, human-paced research — a person asking their assistant questions — not bulk harvesting or redistribution.Requests go out one at a time with browser-like headers. Don't remove the pacing or loop searches unattended.
Listing data belongs to Zameen.com and its advertisers; "Zameen" is a trademark of Zameen.com. This project is unaffiliated and not endorsed.
Prices are agent-entered, as-listed — not verified market valuations.
Limitations
Read-only by design: no posting, messaging, or account changes — contacting agents is deliberately a human action (
draft_agent_messageonly drafts).Badge filters operate on fetched result pages (up to 3 per call).
Parsing targets Zameen's current HTML; site redesigns may require parser updates (fixtures make regressions easy to catch).
MIT licensed — see LICENSE.
Available Tools
9 toolsaccount_statusA
Report whether an authenticated Zameen session is loaded.
Auth is optional: searches work anonymously; a session (created via 'python -m zameen_mcp.login') rides your cookies for personalized pages. No password is ever stored by this server.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full burden, and it delivers: it discloses read-only semantics, that auth is optional, how sessions are established, and the security-relevant fact that no password is stored. With zero parameters and an output schema present, this is strong behavioral disclosure for a status tool.
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 purpose statement is front-loaded, the second gives auth context, the third adds a security guarantee. Zero filler or redundancy; tightly packed and readable.
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 zero-parameter status check with an output schema and no annotations, the description is complete: it covers what the tool verifies, the anonymous-vs-authenticated distinction, session creation path, and privacy behavior. Nothing an agent needs to call and interpret it 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 takes zero parameters, so the baseline of 4 applies — there is nothing the description needs to disambiguate. It correctly spends no space on parameters, and the 100% schema coverage (empty schema) leaves nothing undocumented.
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 statement ('Report whether an authenticated Zameen session is loaded') that unambiguously identifies the tool. It is clearly distinguishable from all siblings, none of which deal with session or auth state, so no confusion is possible.
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?
No explicit when/when-not guidance against a specific sibling, but that is unnecessary since no sibling overlaps. It supplies useful context on when sessions matter (personalized pages) and how one is created, giving the agent a coherent usage frame. Lacks an explicit exclusion statement but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_watchA
Create a named local watchlist from search criteria (stored on disk).
Watches are re-checked later with check_watch; 'seed_with_current' runs the search once now so only NEW listings get reported in future checks. Nothing is saved to your Zameen account — this is a local file.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | ||
| name | Yes | ||
| purpose | No | sale | |
| keywords | No | ||
| min_beds | No | ||
| agent_tier | No | ||
| max_price_pkr | No | ||
| property_type | No | homes | |
| verified_only | No | ||
| min_area_marla | No | ||
| exclude_promoted | No | ||
| seed_with_current | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are present, the description carries the full behavioral burden. It discloses that the watchlist is stored on disk and is local, explicitly stating 'Nothing is saved to your Zameen account.' It also explains the seed_with_current parameter behavior. However, it does not mention potential side effects like name conflicts or file overwriting, a minor gap.
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—three sentences—and the core action is front-loaded in the first sentence. Each subsequent sentence adds relevant context (relationship to check_watch, seed behavior, local nature) without redundancy. It is appropriately terse, though it could be structured more to highlight parameter usage.
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 12 parameters, 0% schema coverage, and no annotations, the description is not complete enough. It explains the general concept and one parameter, but omits definitions for the remaining parameters and how the search criteria are composed. While an output schema is present, the tool's input semantics are underexplained, forcing an agent to guess during 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 0%, so the description must compensate but fails to. It only briefly explains 'seed_with_current' and does not define any of the other 11 parameters (purpose, agent_tier, min_area_marla, etc.). Agents are left to guess meanings of parameters like 'purpose' and 'exclude_promoted', making the description inadequate for a 12-parameter tool.
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 starts with a clear action: 'Create a named local watchlist from search criteria (stored on disk).' It specifies the resource (watchlist), the basis (search criteria), and immediately contrasts with account-level operations by noting 'Nothing is saved to your Zameen account — this is a local file.' This effectively distinguishes the tool from siblings like search_properties and account_status.
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 mentions the companion tool check_watch ('Watches are re-checked later with check_watch') which implies a monitoring workflow, but it does not explicitly state when to use add_watch instead of search_properties or when to avoid it. There is no explicit 'use this when' or 'use search_properties for one-time searches' guidance, leaving some decision-making to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_watchA
Re-run a saved watch's search and report NEW listings since last check.
Read-only against Zameen; the only state kept is the local id list.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and it delivers: 'Read-only against Zameen' explicitly disclaims mutation, and 'the only state kept is the local id list' preempts the natural worry about persistent side effects from re-running a watch. This is exactly the transparency an agent needs when annotations are absent. Minor gap: no disclosure of error behavior for a nonexistent watch name.
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, zero filler. The core action and differentiator are front-loaded in sentence one, and sentence two adds the single most valuable behavioral fact (read-only). Every word contributes.
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 two-parameter tool with an output schema covering return values, the description is largely adequate: purpose, read-only nature, and state semantics are all stated. The gap is that both parameters — especially the required 'name' — remain semantically unexplained, and error conditions for an unknown watch are unaddressed.
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 0%, so the description bears full responsibility for explaining parameters, yet it explains neither. 'name' (required) is only inferable as the watch identifier from the phrase 'saved watch', and 'limit' is never described as capping the number of reported NEW listings. The output schema covers return shape but not how these inputs steer 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?
States a precise verb-resource pairing: re-run a saved watch's search. The 'report NEW listings since last check' clause is the decisive differentiator, cleanly separating it from search_properties (ad-hoc search), add_watch/remove_watch/list_watches (watch lifecycle), and get_listing_details (per-listing detail).
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 'NEW listings since last check' phrasing clearly implies the incremental-monitoring use case, and 'Re-run a saved watch's search' situates it against a previously created watch. However, no sibling is named and there are no explicit exclusions (e.g., 'for a fresh ad-hoc search use search_properties') — usage is conveyed by implication, not instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_agent_messageA
Draft (NOT send) a polite inquiry message to a listing's agent.
Fetches the listing's details and composes a ready-to-send text for you to paste into WhatsApp/email or read out on a call. This tool NEVER sends anything to anyone — contacting the agent is deliberately a human action.
| Name | Required | Description | Default |
|---|---|---|---|
| tone | No | brief | |
| listing | Yes | ||
| questions | No | ||
| sender_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states it NEVER sends anything, fetches listing details, and produces text for manual use. This covers the most critical behavior (non-sending) and gives context about the fetch operation. It does not mention potential failure modes or permissions, but for a draft tool this is reasonably transparent.
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 zero waste. The main purpose is front-loaded, followed by a concise explanation and a crucial non-sending clarification. Every sentence adds value and there is no redundancy.
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 explains what the tool does and its non-sending nature, which is sufficient for understanding the high-level action. However, it gives no guidance on parameter usage (which is partially addressed in the parameter_semantics score) and does not mention any prerequisites (e.g., needing a valid listing ID). Given the tool has 4 parameters and an output schema, more details on how to structure the request would improve completeness.
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 0%, so the description must compensate, but it provides no explanation of any parameter (listing, tone, questions, sender_name). The tool name hints at some semantics, but without any detail an agent cannot know what values to supply, especially for 'tone' or 'questions'. This is a significant gap.
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 ('Draft'), a resource ('a polite inquiry message to a listing's agent'), and explicitly clarifies it does NOT send. This clearly distinguishes it from sibling tools like get_listing_details or account_status, so an agent can immediately understand its unique 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 implies when to use it (when you need a drafted message, not a sent one) and the emphasis on 'human action' suggests this is for manual follow-up, but it does not explicitly name alternatives or state 'use X instead when you want to send'. There's no explicit when-not guidance, leaving some inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_listing_detailsA
Fetch full details for ONE Zameen.com property listing.
Accepts a full Property URL or a bare numeric listing id such as "54646556". Read-only; never contacts the agent or modifies anything.
| Name | Required | Description | Default |
|---|---|---|---|
| listing | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states 'Read-only; never contacts the agent or modifies anything,' which covers safety and side-effect concerns. It does not detail error handling, authentication requirements, or rate limits, but for a simple read operation, these are less critical. The disclosure of read-only behavior is a strong positive.
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, front-loaded with the primary action. It wastes no words, delivering the key purpose and relevant constraints in a compact, scannable format. 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?
Given the tool's simplicity (one parameter) and the presence of an output schema, the description is largely complete. It covers input formats and behavior. It could mention error cases (e.g., invalid ID) or prerequisites like authentication, but these are not essential for a basic read-only lookup. The presence of an output schema removes the need to explain return values, so the description suffices for successful 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?
The input schema only shows a 'listing' string with no description. The description adds crucial meaning by clarifying the accepted formats: 'a full Property URL or a bare numeric listing id such as "54646556".' This goes beyond the schema and provides concrete examples, making the parameter self-explanatory.
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 a specific verb and resource: 'Fetch full details for ONE Zameen.com property listing.' It distinguishes itself from siblings by emphasizing 'ONE' (vs. search-based tools) and by noting it is read-only, separating it from messaging or mutation tools. This is a precise, 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 gives clear context on what inputs are valid (full URL or numeric listing ID) and explicitly states it is read-only and never contacts the agent. However, it does not explicitly name alternatives or provide explicit when-not-to-use guidance (e.g., 'for multiple listings use search_properties'). The context implies these boundaries but does not spell them out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_supported_citiesA
List verified city slugs and property types usable by search_properties.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden. The 'verified' qualifier adds a curation trait, but the description doesn't disclose whether the list is exhaustive, ordered, or paginated, nor potential size. For a zero-parameter read-only listing tool this is a modest but acceptable contribution.
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?
One sentence with zero filler; the verb and resource are front-loaded and the search_properties linkage is a single efficient clause. Every word contributes.
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 zero-param tool with an output schema, the return format needn't be spelled out, and the description states what is returned (city slugs and property types) and how it relates to a sibling. The only minor gap is not explicitly naming that slugs feed search_properties' city parameter, though 'usable by' conveys 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 schema has zero parameters and trivially 100% coverage, so the baseline applies. There are no inputs for the description to explain, and none are missing; the description correctly focuses on what the tool returns rather than nonexistent parameters.
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 ('List') paired with a distinct resource ('verified city slugs and property types') and anchors it to a sibling tool ('usable by search_properties'). It's immediately distinguishable from get_listing_details, watch-management, and account_status 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 phrase 'usable by search_properties' implies the agent should call this before search_properties to obtain valid filter values, which is a useful context clue. However, it never states an explicit when-to-use or when-not-to-use, nor does it reference alternatives, leaving invocation timing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_watchesA
List local watchlists with their criteria and last-check times.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It indicates the return payload (criteria and last-check times), but does not explicitly state that this is a read-only operation, whether it requires authentication, or any ordering/pagination behavior. The verb 'list' implies no side effects, but it is not explicit.
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, information-dense sentence with no fluff. It is front-loaded with the action and resource, and every word 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 that there are no parameters and an output schema exists (which likely documents the return structure), the description is adequate for a simple listing operation. The only minor gap is the lack of explicit read-only or authentication notes, but for a simple list tool this is acceptable.
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, so the description does not need to explain parameter meaning. The baseline for 0-parameter tools is 4, and there is nothing to compensate for.
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') and resource ('local watchlists'), and clarifies what is included ('criteria and last-check times'). This clearly distinguishes it from sibling tools like add_watch, check_watch, and remove_watch.
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 no guidance on when to use this tool versus alternatives. It does not mention prerequisites, exclusions, or when another watch-related tool would be more appropriate. The user must infer usage from the name and siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_watchB
Delete a local watchlist by name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It only says 'Delete' without mentioning whether deletion is permanent, what happens if the name is not found, whether any confirmation or side effects occur, or the scope of 'local'. The term 'local' is ambiguous and not elaborated.
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?
A single sentence with no filler, front-loaded with the action verb. It conveys the essential purpose without unnecessary words, making it efficient and easy to parse.
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?
While an output schema exists, the description lacks any mention of error handling, behavior on nonexistent watchlists, or confirmation requirements. Given the simplicity of the operation and the presence of an output schema, it is partially complete but leaves important behavioral questions unanswered.
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 0%, so the description must clarify the parameter's purpose. It states 'by name', which identifies the parameter as the watchlist identifier. However, it does not add detail about format, length, or case sensitivity, though for a single simple string parameter this is likely sufficient.
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?
Clearly states a specific verb 'Delete' and resource 'local watchlist by name', making it distinct from siblings like add_watch, check_watch, and list_watches. The description unambiguously identifies the action without ambiguity.
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 no guidance on when to use this tool versus alternatives, such as add_watch or check_watch. It implies deletion by name but does not specify any prerequisites, contexts, or exclusions. An agent must infer usage solely from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_propertiesA
Search Zameen.com property listings and return normalized JSON cards.
Use city names like "islamabad", "lahore", "karachi". purpose: sale|rent. property_type: homes|houses|flats|plots|commercial|rooms. Badge filters (verified_only, agent_tier e.g. "titanium", exclude_promoted, max_price_pkr) apply AFTER parsing over up to 3 result pages - these can express things Zameen's own UI cannot (e.g. verified listings only). min_beds/min_area_marla/keywords/sort are native site filters. limit is clamped to 1..50 and echoed back in filters_applied. Example: search_properties(city="lahore", purpose="sale", property_type="houses", min_beds=4, verified_only=True, agent_tier="titanium", max_price_pkr=200000000).
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | ||
| sort | No | ||
| limit | No | ||
| purpose | No | sale | |
| keywords | No | ||
| min_beds | No | ||
| agent_tier | No | ||
| max_price_pkr | No | ||
| property_type | No | homes | |
| verified_only | No | ||
| min_area_marla | No | ||
| exclude_promoted | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral disclosure burden. It goes beyond the schema by revealing that badge filters apply after parsing over up to 3 result pages, that limit is clamped to 1..50 and echoed back in filters_applied, and that the output is normalized JSON cards. This is strong, non-obvious behavioral context.
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 every sentence adds value: purpose, accepted values, filter behavior, clamping behavior, and a complete example. It is front-loaded with the core purpose and avoids 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?
For a 12-parameter tool with no schema-level descriptions and no annotations, the description provides enough guidance to call it correctly, including defaults, value examples, behavioral caveats, and a realistic invocation. The output schema exists, so return structure does not need to be spelled out in the description.
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 0%, so the description must compensate, and it does. It explains purpose and property_type values, differentiates post-parsing badge filters from native filters, clarifies limit clamping, and provides a full example covering the major parameters. Nearly every parameter receives meaningful semantic context.
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: 'Search Zameen.com property listings and return normalized JSON cards.' It clearly distinguishes this from sibling tools like get_listing_details or watch management, and the parameter guidance makes the search scope unmistakable.
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 usage guidance: which city names to use, what purpose/property_type values are expected, and which filters are applied post-parsing versus native site filters. It does not explicitly name alternative tools for when not to use this one, but the context and purpose make the search use case clear.
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.
9 tool updates
v0.2.0- First observed
account_status - First observed
add_watch - First observed
check_watch - First observed
draft_agent_message - First observed
get_listing_details - First observed
list_supported_cities - First observed
list_watches - First observed
remove_watch - First observed
search_properties
TDQS
Scored across 9 tools
Each tool has a clearly distinct purpose: search, detail retrieval, watchlist management, message drafting, and account status. There is no meaningful overlap between tools that would cause an agent to select the wrong one.
Most tools follow a consistent verb_noun pattern (list_watches, search_properties, add_watch, check_watch). account_status is a minor deviation since it is a noun phrase rather than get_account_status, but it is still clear and predictable.
Nine tools is well within the ideal range for a real estate search and watchlist server. Each tool earns its place and the set is neither bloated nor too thin.
The tool surface covers search, listing details, watchlist CRUD (minus an update operation), contact drafting, and account status. Missing update_watch is workable since users can remove and re-add, and sending messages is intentionally left to humans.
Maintenance
Related MCP Connectors
AI-native real estate discovery with structured property search and market intelligence.
Pull property listings, prices, and details from real-estate sites as structured JSON.
Search real-estate deals, rank top areas, run rental/BRRRR/flip analysis, pull sold comps.
Zillow MCP for AI agents: property data, Zestimates & listings — 300+ fields per home. Free tier.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceProvides real-time access to Zillow real estate data, enabling property search, details, Zestimates, market trends, and mortgage calculations via natural language.5 npm48MIT
- AlicenseNot gradedqualityDmaintenanceIntegrates Zillow real estate data with AI assistants, enabling property search, neighborhood insights, and affordability calculations through natural language.5 npm1MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to search for German property listings (rent/buy) on immowelt.de with structured JSON output, no API key required.-
- AlicenseAqualityBmaintenanceEnables AI agents to search Dutch housing listings on Kamernet.nl, retrieve full listing details, and optionally reply to landlords; designed for personal use in finding rooms, studios, and apartments.31MIT