MCP server for 591 rental listings
Project description
mcp-591
An MCP server that lets AI assistants search property listings on 591.com.tw, Taiwan's largest real estate platform.
Disclaimer: This project scrapes data from an undocumented API. It is intended for personal research only. Do not use it for bulk or high-frequency requests.
Also available in: 繁體中文
Example
User: 幫我搜尋青埔周邊 10 年內的大樓,總價控制在 1200 萬左右
Claude calls search_sale with the inferred parameters:
{
"region": "桃園市",
"section": "中壢區",
"shape": "電梯大樓",
"age": "5_10",
"price_str": "1000_1400",
"keywords": "青埔"
}
Claude: 青埔周邊 1,000
1,400 萬、10 年內電梯大樓,共找到 5年內 135 筆、510年 146 筆,以下整理 CP 值較高的物件:...
Requirements
- Python 3.14+
- uv
Installation
git clone <repo>
cd mcp-591
uv sync
Usage
As an MCP Server (Claude Desktop / Claude Code)
The repo ships a .mcp.json that Claude Code picks up automatically:
{
"mcpServers": {
"591": {
"command": "uv",
"args": ["run", "mcp-591"],
"cwd": "${PWD}"
}
}
}
Four tools are exposed:
search_sale — Search for sale listings
| Parameter | Type | Description |
|---|---|---|
region |
str (required) | County/city name, e.g. 桃園市 |
section |
str | District, e.g. 中壢區. Omit to search the whole county. |
kind |
str | Property type, default 住宅. Options: 住宅 / 店面 / 辦公 / 廠房 / 車位 / 套房 / 土地 / 住辦 |
shape |
str | Building type: 公寓 / 電梯大樓 / 透天厝 / 別墅 |
pattern |
str | Room count: 1房 / 2房 / 3房 / 4房 / 5房以上 |
toilet |
str | Bathroom count: 1衛 / 2衛 / 3衛 / 4衛 / 5衛以上 |
area |
str | Floor area range (坪): 10_20 / 20_30 / 30_40 / 40_50 / 50_60 / 60_100 / 100_150 / 150_200 |
age |
str | Building age: _5 (under 5 yrs) / 5_10 / 10_20 / 20_30 / 30_40 / 40_ (40+ yrs) |
price_str |
str | Price range in 萬 NTD, e.g. 1000_1500 or 1000_1250,1250_1500 |
keywords |
str | Free-text search, e.g. 捷運 (MRT) |
page_size |
int | Results per page, max 30 (default 30) |
first_row |
int | Pagination offset (default 0) |
get_sale_detail — Fetch full listing details
| Parameter | Type | Description |
|---|---|---|
post_id |
str | Listing ID from a search_sale result |
Returns: floor area breakdown (main area / common-area ratio), floor, building age, nearby transit, parking, fitment, mortgage estimate, contact info, and description.
search_rent — Search for rental listings
| Parameter | Type | Description |
|---|---|---|
region |
str (required) | County/city name, e.g. 桃園市 |
section |
str | District, e.g. 中壢區. Omit to search the whole county. |
kind |
str | Room type: 整層住家 / 獨立套房 / 分租套房 / 雅房 / 車位 |
shape |
str | Building type: 公寓 / 電梯大樓 / 透天厝 / 別墅 |
pattern |
str | Room count: 1房 / 2房 / 3房 / 4房 / 5房以上 |
price_str |
str | Monthly rent range in NTD, e.g. 10000_20000 |
keywords |
str | Free-text search, e.g. 捷運 (MRT) |
first_row |
int | Pagination offset (default 0). Use next_first_row from the previous response. |
get_rent_detail — Fetch full rental listing details
| Parameter | Type | Description |
|---|---|---|
post_id |
str | Listing ID from a search_rent result |
Returns: price, deposit, floor area, floor, building type, layout, address with lat/lng, lease period, move-in date, pet/cooking/gender policies, facilities, contact info, and description.
Running the client directly (debugging)
# Search 桃園市中壢區
uv run python -m mcp_591.client 桃園市 中壢區
# With filters: shape pattern toilet area age
uv run python -m mcp_591.client 桃園市 中壢區 電梯大樓 3房 2衛 30_40 _5
Argument order: <county> [district] [shape,...] [pattern,...] [toilet,...] [area] [age]. Pass an empty string "" to skip an intermediate argument.
Development & Testing
# Install with dev dependencies
uv sync --dev
# Unit tests (no network, uses fixtures)
uv run pytest
# Integration tests (hits the real 591 API)
uv run pytest -m integration
Test layout
tests/
├── fixtures/
│ ├── search_sale.json # Captured sale search response
│ ├── sale_detail.json # Captured sale detail response
│ ├── search_rent.json # Captured rent search response
│ └── rent_detail.json # Captured rent detail response
├── test_server.py # Unit tests: filtering and tool logic
└── test_integration.py # Integration tests (skipped by default)
To refresh fixtures (requires network):
uv run python -c "
import json
from mcp_591.client import Client591
c = Client591()
json.dump(c.search_sale(region_id=6, section_ids=[67], kind=9, page_size=5),
open('tests/fixtures/search_sale.json', 'w'), ensure_ascii=False, indent=2)
json.dump(c.get_sale_detail(19708683),
open('tests/fixtures/sale_detail.json', 'w'), ensure_ascii=False, indent=2)
json.dump(c.search_rent(region_id=6, section_ids=[67], kind=1),
open('tests/fixtures/search_rent.json', 'w'), ensure_ascii=False, indent=2)
json.dump(c.get_rent_detail(21103645),
open('tests/fixtures/rent_detail.json', 'w'), ensure_ascii=False, indent=2)
"
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mcp_591-0.1.0.tar.gz.
File metadata
- Download URL: mcp_591-0.1.0.tar.gz
- Upload date:
- Size: 89.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
09d15d534b980fb92c275385214cd699d42acfbbddb24405491a6b7f4c593464
|
|
| MD5 |
3696b4b3facdd5acfc94a03bb104284e
|
|
| BLAKE2b-256 |
7e768e352eafd9730a6dfd7da348595c43ce9f0fe2022dfe6dd66bb86a6e13b3
|
Provenance
The following attestation bundles were made for mcp_591-0.1.0.tar.gz:
Publisher:
publish.yml on asgard-ai-platform/mcp-591
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_591-0.1.0.tar.gz -
Subject digest:
09d15d534b980fb92c275385214cd699d42acfbbddb24405491a6b7f4c593464 - Sigstore transparency entry: 1369788364
- Sigstore integration time:
-
Permalink:
asgard-ai-platform/mcp-591@0d55714f844205c510ceafaf268557b6be006576 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/asgard-ai-platform
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0d55714f844205c510ceafaf268557b6be006576 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mcp_591-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mcp_591-0.1.0-py3-none-any.whl
- Upload date:
- Size: 13.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be5e93e7ac78a89fdefddf431ba90fa9d53243412ab4811b9fe87c428415c347
|
|
| MD5 |
42a0f8cd43daf040eb667b531bba7be4
|
|
| BLAKE2b-256 |
c1a7fdd5661bdd832e82bf810c18f2fb442c8965981dd5762f5d9b021da296d6
|
Provenance
The following attestation bundles were made for mcp_591-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on asgard-ai-platform/mcp-591
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_591-0.1.0-py3-none-any.whl -
Subject digest:
be5e93e7ac78a89fdefddf431ba90fa9d53243412ab4811b9fe87c428415c347 - Sigstore transparency entry: 1369788427
- Sigstore integration time:
-
Permalink:
asgard-ai-platform/mcp-591@0d55714f844205c510ceafaf268557b6be006576 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/asgard-ai-platform
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0d55714f844205c510ceafaf268557b6be006576 -
Trigger Event:
push
-
Statement type: