Skip to main content
Glama
damosullivan

daft-mcp

by damosullivan

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 daftlistings dependency is installed from its master branch, 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 dependencies

Run

daft-mcp                     # entry point
# or: uv run daft-mcp        # run in the project venv
# or: python -m daft_mcp.server

The 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 below

Or 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

search_properties

Main search with full filtering (price, beds, type, BER, facilities, location, sort…)

suggest_locations

Fuzzy-match Daft location names from a partial query

get_search_types

List search types (residential sale, rent, commercial, sharing…)

get_property_types

List property types (houses, apartments, sites…)

get_facilities

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 Inspector

Limitations

  • daftlistings is 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 tools
get_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
search_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
search_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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².

ParametersJSON Schema
NameRequiredDescriptionDefault
search_typeYes
locationNo
property_typeNo
min_priceNo
max_priceNo
min_bedsNo
max_bedsNo
min_bathsNo
max_bathsNo
facilitiesNo
sort_typeNo
min_berNo
max_berNo
added_sinceNo
max_pagesNo
min_floor_sizeNo
max_floor_sizeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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").

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 5 tool updatesv0.1.0
    • First observedget_facilities
    • First observedget_property_types
    • First observedget_search_types
    • First observedsearch_properties
    • First observedsuggest_locations

TDQS

A4.2/5.0

Scored across 5 tools

Disambiguation5/5

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.

Naming Consistency5/5

All tools follow a consistent verb_noun snake_case pattern (get_, search_, suggest_), making the API predictable and easy to navigate.

Tool Count5/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers