An unofficial MCP server for HomeExchange
Search homes · Read messages · Manage favourites · All from your AI client
Unofficial project. Not affiliated with or endorsed by HomeExchange SAS. Personal use only — see disclaimer.
Once connected, ask your AI client things like:
- "Find homes in Lisbon for 2 guests in July, GuestPoints only"
- "Show me my unanswered messages"
- "Send a message to conversation 12345 asking about parking"
- "What homes have I favourited?"
- "Show the availability calendar for home 1950607"
14 tools across two categories:
| Category | Tools |
|---|---|
| 🔍 Search & discovery | search_homes · get_home · get_home_calendar · get_recommendations · list_my_homes · list_favorites · add_favorite · remove_favorite · list_saved_searches · get_user_profile |
| 💬 Messaging | list_conversations · get_conversation · send_message · start_conversation |
npm run login
│
Browser opens → you log in once
│
session.json (token + cookies, stays local)
│
npm run mcp
│
MCP Server (local, stdio)
│
┌────┴──────────────────────┐
│ │
search & discovery messaging
(10 tools) (4 tools)
│ │
└─────────┬────────────┘
│
api.homeexchange.com
bff.homeexchange.com
Auth is captured once via your real browser session — no credentials stored in code. The MCP server runs locally and makes direct API calls on your behalf. Works with any MCP-compatible client.
npm install
npx playwright install chromiumnpm run loginA browser opens. Log in to HomeExchange, then press Ctrl+C. Your session is saved locally to session.json (git-ignored).
Tokens expire after a few days. Re-run
npm run loginwhen tools start returning 401s.
npm run mcpWorks with any MCP client that supports stdio transport.
~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"homeexchange": {
"command": "npx",
"args": ["ts-node", "src/mcp.ts"],
"cwd": "/path/to/homeexchange-mcp"
}
}
}claude mcp add homeexchange -- npx ts-node src/mcp.ts~/.cursor/mcp.json:
{
"mcpServers": {
"homeexchange": {
"command": "npx",
"args": ["ts-node", "src/mcp.ts"],
"cwd": "/path/to/homeexchange-mcp"
}
}
}.zed/settings.json:
{
"context_servers": {
"homeexchange": {
"command": { "path": "npx", "args": ["ts-node", "src/mcp.ts"] }
}
}
}Search listings by location, dates, guests, and exchange type.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
location |
string | No | — | City, region, or country |
checkin |
string | No | — | YYYY-MM-DD |
checkout |
string | No | — | YYYY-MM-DD |
guests |
number | No | — | Number of guests |
exchange_type |
string | No | — | GuestPoints · simultaneous · non_simultaneous |
home_type |
string | No | — | house · apartment · other |
limit |
number | No | 20 |
Results per page (max 36) |
offset |
number | No | 0 |
Pagination offset |
Full details for a listing.
| Parameter | Type | Required | Description |
|---|---|---|---|
home_id |
string | Yes | Numeric home ID |
Availability calendar — blocked and open dates for a home.
| Parameter | Type | Required | Description |
|---|---|---|---|
home_id |
string | Yes | Numeric home ID |
Personalised picks based on your profile and history.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
limit |
number | No | 8 |
Number of results |
Your own listings. No parameters.
Your saved homes.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
limit |
number | No | 20 |
Number of results |
Save a home to your favourites.
| Parameter | Type | Required | Description |
|---|---|---|---|
home_id |
string | Yes | Home ID |
Remove a home from your favourites.
| Parameter | Type | Required | Description |
|---|---|---|---|
home_id |
string | Yes | Home ID |
Your saved search filters.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
limit |
number | No | 100 |
Number of results |
A member's public profile.
| Parameter | Type | Required | Description |
|---|---|---|---|
user_id |
string | Yes | Numeric user ID |
Your conversation inbox.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
filter |
string | No | ALL |
ALL · UNANSWERED · ARCHIVED |
limit |
number | No | 20 |
Threads to return |
after |
string | No | — | Pagination cursor from previous response |
All messages in a thread.
| Parameter | Type | Required | Description |
|---|---|---|---|
conversation_id |
string | Yes | Conversation ID |
Reply in an existing conversation.
| Parameter | Type | Required | Description |
|---|---|---|---|
conversation_id |
string | Yes | Conversation ID |
text |
string | Yes | Message text |
Open a new conversation about a home.
| Parameter | Type | Required | Description |
|---|---|---|---|
home_id |
string | Yes | The home you're enquiring about |
text |
string | Yes | Opening message |
| Script | Description |
|---|---|
npm run login |
Capture auth session via browser ← start here |
npm run mcp |
Start the local MCP server |
npm run record |
Full network recorder with HAR capture (API exploration) |
npm run analyze |
Analyze a .har file → api-map.json |
npm run build |
Compile TypeScript |
npm run check |
Typecheck + lint |
src/
login.ts browser auth capture
record.ts full network recorder with HAR output
analyze.ts HAR → api-map.json analysis
api.ts authenticated HTTP client
mcp.ts MCP stdio server
tools/
search.ts 10 search & discovery tools
messaging.ts 4 messaging tools
Tracked as GitHub Issues — upvote or comment to influence priority:
- #9 Calendar integration — query and update availability, surface conflicts across requests
- #10 Remote MCP — hosted endpoint, no local setup required
- #11 Token expiry detection — auto-prompt on 401 (good first issue)
- #12 Saved search alerts — notify when new homes match your saved searches
Ideas, bug reports, and pull requests are welcome.
Got a feature idea or found a bug? Open an issue — describe what you were trying to do and what happened (or didn't).
Want to contribute code?
- Fork the repo and create a branch from
main - Make your changes — keep commits conventional (
fix:,feat:,chore:etc.) - Open a pull request — CI must pass before merge
Good first issues are tagged good first issue — start there if you're new to the codebase.
Note: This project reverse-engineers a private API. New tools may break if HomeExchange changes their endpoints. Please check existing issues before reporting an API breakage.
This is an unofficial, community project with no affiliation with HomeExchange SAS.
- Uses your own HomeExchange account credentials, exactly as your browser does
- Personal, non-commercial use only — not for scraping, reselling, or commercial exploitation of HomeExchange data
- Subject to HomeExchange's Terms of Service
- The HomeExchange API is private and undocumented — endpoints may change without notice
The intent is to build a genuinely useful tool for the HomeExchange community, and ideally to partner with HomeExchange to do this officially. If you work at HomeExchange and are interested in collaborating on a proper integration, please open an issue or get in touch.
MIT — personal and non-commercial use.
HomeExchange® is a registered trademark of HomeExchange SAS. This project is independent and not endorsed by HomeExchange SAS.