daft-mcp
# 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
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.