daft-mcp
This server lets AI assistants search and explore Irish property listings on Daft.ie with rich filtering and discovery tools.
Search Properties (
search_properties): Perform detailed property searches with filters including location, price range, number of bedrooms/bathrooms, property type, BER rating, floor size, facilities, sort order, listing age, and supports multiple pages of results.Suggest Locations (
suggest_locations): Fuzzy-match partial location names (e.g. "Dublin 4", "Blackrock") against Daft.ie's location database to find valid location names for use in searches.Get Search Types (
get_search_types): Retrieve all available search types (e.g. residential sale, rent, commercial, sharing).Get Property Types (
get_property_types): List available property types (e.g. houses, apartments, sites), optionally filtered by a specific search type.Get Facilities (
get_facilities): List available facility filters (e.g. parking, alarm, garden), optionally filtered by a specific search type.
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., "@daft-mcpsearch for 3-bed apartments for rent in Dublin under €2000"
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.
daft-mcp
MCP server that lets AI assistants search Irish property listings on Daft.ie via the daftlistings Python library.
Requirements
Python 3.10+
uv (recommended) or a standard venv + pip
git (the
daftlistingsdependency is installed from itsmasterbranch, which includes a fix not yet on PyPI)
Related MCP server: Airbnb Search & Listings
Install
git clone https://github.com/damosullivan/daft-mcp.git daft-mcp && cd daft-mcp
uv sync # creates .venv and installs dependenciesRun
daft-mcp # entry point
# or: uv run daft-mcp # run in the project venv
# or: python -m daft_mcp.serverThe server speaks MCP over stdio and waits for a client to connect.
Configure your MCP client
The examples below assume you run the client from this repo's directory. For a
global config, swap . for an absolute path (e.g. /home/me/src/daft-mcp).
OpenCode
opencode mcp add # interactive: pick local, name it "daft", use the uv command belowOr add it directly to your opencode.jsonc:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"daft": {
"type": "local",
"command": ["uv", "--directory", ".", "run", "daft-mcp"],
"enabled": true
}
}
}Verify with opencode mcp list, then restart OpenCode.
Claude Desktop / Claude Code
Add to claude_desktop_config.json:
{
"mcpServers": {
"daft": {
"command": "uv",
"args": ["--directory", ".", "run", "daft-mcp"]
}
}
}Codex
Add to ~/.codex/config.toml:
[mcp_servers.daft]
command = "uv"
args = ["--directory", ".", "run", "daft-mcp"]No uv? Point the client at the venv python instead:
python -m daft_mcp.server(e.g..venv/bin/python).
Available tools
Tool | What it does |
| Main search with full filtering (price, beds, type, BER, facilities, location, sort…) |
| Fuzzy-match Daft location names from a partial query |
| List search types (residential sale, rent, commercial, sharing…) |
| List property types (houses, apartments, sites…) |
| List facility filters valid for a given search type (parking, alarm, garden…) |
Example
"Find 3-bed houses for sale in Dublin City between €400k and €500k"
The assistant uses suggest_locations (if needed) and search_properties to
return live Daft.ie results.
Development
uv sync # install dev deps if added
mypy src/ # type checks
npx @modelcontextprotocol/inspector uv run daft-mcp # MCP InspectorLimitations
daftlistingsis unofficial and may break if Daft.ie changes their API.Results are bounded by what Daft.ie's search API returns.
No auth required; Daft.ie may rate-limit aggressive use.
License
MIT — see LICENSE.
Available Tools
5 toolsget_facilitiesA
List available Daft.ie facility filters, optionally filtered by search type.
Args: search_type: Search type to filter facilities against. If omitted, lists all facilities. Use get_search_types() for valid values.
| Name | Required | Description | Default |
|---|---|---|---|
| search_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description carries full burden. It transparently states the tool lists facilities with optional filtering. No side effects or complex behavior to disclose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus an Args section, front-loaded with main purpose. Every sentence adds value, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool is simple with one optional parameter. Output schema exists so no need to describe return values. Description covers parameter semantics and usage adequately for the complexity.
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?
With 0% schema description coverage, the description fully compensates by explaining search_type's purpose, default behavior (null returns all), and where to find valid values (get_search_types()).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists Daft.ie facility filters, optionally filtered by search type. This distinguishes it from sibling tools like get_search_types or search_properties.
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 guidance on the optional filtering and references get_search_types() for valid values, implying when to use that other tool. Lacks explicit when-not-to-use but adequate for a simple listing tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_property_typesA
List available Daft.ie property types, optionally filtered by search type.
Args: search_type: Optional search type to filter. If omitted, lists all.
| Name | Required | Description | Default |
|---|---|---|---|
| search_type | 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, the description should disclose side effects, auth needs, or rate limits; it only states the basic function without 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?
Two sentences front-loaded with purpose; no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple list tool; output schema exists so return values need not be described, but missing details on error cases or valid search_type values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter search_type is well explained: 'Optional search type to filter. If omitted, lists all.' Adds meaning beyond the schema's type definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists property types with optional filtering by search type, distinguishing it from sibling tools like get_facilities and get_search_types.
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 guidance on when to use this tool versus alternatives; the optional filtering is mentioned but not contextualized against sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_search_typesA
List all available Daft.ie search types.
| 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?
Without annotations, the description carries the burden. It correctly implies a read-only listing but adds no further behavioral details (e.g., auth needs, rate limits). Adequate for a simple tool but could be more 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?
A single concise sentence that is front-loaded with the verb and resource. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, no parameters, and presence of an output schema, the description is complete. It adequately conveys the tool's function.
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?
No parameters exist, so schema coverage is 100%. The description correctly indicates no inputs needed, meeting the baseline of 4 for zero-parameter tools.
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 it lists all available Daft.ie search types, using a specific verb and resource. It distinguishes from siblings like get_property_types which list property types.
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 guidance on when to use this tool versus alternatives like get_facilities or suggest_locations. The description lacks context for decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_propertiesA
Search for properties on Daft.ie with full filtering support.
Args: search_type: Search type. Use get_search_types() for valid values. location: Area to search (e.g. "Dublin City", "Cork"). Fuzzy-matched against Daft's location database. Use suggest_locations() to discover valid names. Omit for nationwide search. property_type:Property type. Use get_property_types() for valid values. min_price: Minimum price in euro (sale price or monthly rent). max_price: Maximum price in euro (sale price or monthly rent). min_beds: Minimum number of bedrooms. max_beds: Maximum number of bedrooms. min_baths: Minimum number of bathrooms. max_baths: Maximum number of bathrooms. facilities: List of facility identifiers (e.g. ["parking","alarm"]). Use get_facilities() for valid values per search type. sort_type: Sort order: publishDateDesc | priceAsc | priceDesc min_ber: Minimum BER rating (e.g. "A1", "B2", "C3"). max_ber: Maximum BER rating. added_since: Only show recently-added listings. Valid: now-3d/d | now-7d/d | now-14d/d | now-30d/d max_pages: Pages of results (50 per page). Default 1. min_floor_size: Minimum floor area in m². max_floor_size: Maximum floor area in m².
| Name | Required | Description | Default |
|---|---|---|---|
| search_type | Yes | ||
| location | No | ||
| property_type | No | ||
| min_price | No | ||
| max_price | No | ||
| min_beds | No | ||
| max_beds | No | ||
| min_baths | No | ||
| max_baths | No | ||
| facilities | No | ||
| sort_type | No | ||
| min_ber | No | ||
| max_ber | No | ||
| added_since | No | ||
| max_pages | No | ||
| min_floor_size | No | ||
| max_floor_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral disclosure. It adds some context (e.g., location is fuzzy-matched, added_since formats, pagination via max_pages), but lacks details on rate limits, error handling, or result structure beyond parameter descriptions.
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 well-structured with a clear main sentence and an Args section. While lengthy due to 17 parameters, each line adds value because the schema lacks descriptions. The format is consistent and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 17 parameters and no annotations, the description covers all parameters comprehensively, including validation hints. Output schema exists, so return format is not required. Lacks discussion of error cases or limit details, but is largely complete given complexity.
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 fully documents each parameter. It provides detailed explanations, valid value sources (e.g., get_facilities), format constraints (e.g., added_since), and defaults (e.g., max_pages=1), adding significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search for properties on Daft.ie with full filtering support', providing a specific verb (Search) and resource (properties). It distinguishes from sibling tools like get_facilities, which are helper functions for valid values.
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 implicitly guides usage by referencing sibling tools within parameter explanations (e.g., use get_search_types() for valid search_type, use suggest_locations() for location). However, it does not explicitly state when not to use this tool or provide direct alternatives for similar tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_locationsA
Fuzzy-search Daft.ie location names from a partial query.
Args: query: Partial location name (e.g. "Dublin 4", "Blackrock", "Galway").
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions fuzzy search and partial queries but doesn't specify behavior like case sensitivity, result limits, or error handling. With no annotations, more detail would be beneficial, but the basic behavior is conveyed.
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 extremely concise with two sentences: one for purpose and one for parameter details. No filler words, effectively front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only one parameter and an output schema exists, the description is mostly complete. It could mention that results are suggestions or that it's for autocomplete, but it's sufficient for a simple search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema description coverage is 0%, the description adds meaning beyond the schema by explaining that the query is a partial location name and providing examples, compensating for the lack of schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool does fuzzy-search of Daft.ie location names from a partial query. It is distinct from sibling tools (get_facilities, get_property_types, etc.) which serve different purposes.
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 examples of valid queries and implies this tool is for location autocomplete. While it doesn't explicitly state when not to use it, the context with siblings makes it 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.
5 tool updates
v0.1.0- First observed
get_facilities - First observed
get_property_types - First observed
get_search_types - First observed
search_properties - First observed
suggest_locations
TDQS
Scored across 5 tools
Each tool has a clearly distinct purpose: get_facilities, get_property_types, get_search_types, search_properties, and suggest_locations cover reference data, search, and location suggestion without overlap.
All tools follow a consistent verb_noun snake_case pattern (get_, search_, suggest_), making the API predictable and easy to navigate.
With 5 tools, the server is well-scoped for its purpose. Each tool provides necessary functionality for searching properties on Daft.ie, neither too few nor too many.
The tool surface covers reference data, search, and location suggestion comprehensively. A minor gap is the lack of a dedicated tool for retrieving individual listing details, but the search tool likely returns sufficient information for most use cases.
Maintenance
Related MCP Connectors
Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Capability registry for the agentic economy. Semantic search over verified MCP server listings.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables interaction with the Daft.ie API for searching rental properties and retrieving detailed information about specific rental listings.10ISC
- AlicenseBqualityDmaintenanceEnables users to search Airbnb listings with advanced filtering options and retrieve detailed property information through an MCP server interface.21,727 npmMIT
- AlicenseNot gradedqualityBmaintenanceUK property data MCP server for AI hosts (Claude, ChatGPT). Wraps Land Registry, Rightmove, EPC, rental yields, stamp duty, and Companies House into 13 tools.2MIT

Rentalot MCP Serverofficial
AlicenseNot gradedqualityCmaintenanceMCP server for the Rentalot API. Manage rental properties, contacts, showings, conversations, and more from any AI assistant.8 npm1MIT