Skip to main content
Glama
damosullivan

daft-mcp

by damosullivan
README.md
# daft-mcp

MCP server that lets AI assistants search Irish property listings on [Daft.ie](https://daft.ie)
via the [daftlistings](https://github.com/AnthonyBloomer/daftlistings) Python library.

## Requirements

- Python 3.10+
- [uv](https://docs.astral.sh/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)

## Install

```bash
git clone https://github.com/damosullivan/daft-mcp.git daft-mcp && cd daft-mcp
uv sync          # creates .venv and installs dependencies
```

## Run

```bash
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

```bash
opencode mcp add        # interactive: pick local, name it "daft", use the uv command below
```

Or add it directly to your `opencode.jsonc`:

```json
{
  "$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`:

```json
{
  "mcpServers": {
    "daft": {
      "command": "uv",
      "args": ["--directory", ".", "run", "daft-mcp"]
    }
  }
}
```

### Codex

Add to `~/.codex/config.toml`:

```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

```bash
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](LICENSE).

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