guesty-mcp-server 0.7.0 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +41 -0
- package/README.md +19 -2
- package/package.json +5 -6
- package/server.json +4 -4
- package/src/enterprise-tools.js +320 -0
- package/src/http-server.js +8 -0
- package/src/iot-db.js +27 -10
- package/src/iot-tools.js +108 -241
- package/src/license.js +5 -2
- package/src/server.js +9 -2
- package/src/webhook/iot-receiver-server.js +30 -0
- package/src/webhook/iot-receiver.js +110 -0
- package/.env.example +0 -2
- package/CONTRIBUTING.md +0 -66
- package/Dockerfile +0 -13
- package/HACKERNEWS-POST.md +0 -44
- package/PRODUCT-HUNT-LAUNCH.md +0 -28
- package/SECURITY.md +0 -25
- package/docs/multi-account-design.md +0 -32
- package/examples/docker-compose.yml +0 -13
- package/guesty-partnership-email.md +0 -48
- package/tests/test-iot.js +0 -108
- package/tripadvisor-partnership-email.md +0 -27
package/HACKERNEWS-POST.md
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# Hacker News Show HN Post — Launch Tomorrow 8:30 AM EST
|
|
2
|
-
|
|
3
|
-
## Title (80 chars max)
|
|
4
|
-
Show HN: First MCP server for Guesty property management – 39 tools, open source
|
|
5
|
-
|
|
6
|
-
## URL
|
|
7
|
-
https://github.com/DLJRealty/guesty-mcp-server
|
|
8
|
-
|
|
9
|
-
## First Comment (post within 5 minutes of submission)
|
|
10
|
-
|
|
11
|
-
Hey HN – we built guesty-mcp-server because we manage 8 short-term rental properties on Guesty and wanted our AI agents to actually *do* things, not just chat.
|
|
12
|
-
|
|
13
|
-
**What it does:** Connects any MCP-compatible AI client (Claude, ChatGPT, Copilot, Cline) to the Guesty property management API. 39 tools covering reservations, guest messaging, pricing, financials, calendars, reviews, tasks, and webhooks.
|
|
14
|
-
|
|
15
|
-
**Install:** `npx guesty-mcp-server`
|
|
16
|
-
|
|
17
|
-
**Tech:** Node.js, MCP SDK, Express for the hosted transport layer. MIT licensed. TypeScript would be nice – PRs welcome.
|
|
18
|
-
|
|
19
|
-
**Why MCP:** Guesty has 100K+ listings worldwide but no MCP integration existed. Every major PMS will need one – we built the first.
|
|
20
|
-
|
|
21
|
-
**What we learned:**
|
|
22
|
-
- Guesty's /reservations API only returns future data. Had to use the calendar endpoint as a workaround for historical queries.
|
|
23
|
-
- The MCP Dev Summit is happening this week in NYC (April 2-3). Timing was lucky.
|
|
24
|
-
- 497 npm downloads in the first week, mostly from the Smithery registry listing.
|
|
25
|
-
|
|
26
|
-
**Limitations:**
|
|
27
|
-
- Tool execution requires your own Guesty API credentials (not a hosted SaaS... yet)
|
|
28
|
-
- Some Guesty API endpoints have aggressive rate limiting (5 token refreshes/day)
|
|
29
|
-
- The SSE transport doesn't work on Vercel serverless (expected)
|
|
30
|
-
|
|
31
|
-
Hosted version: https://guesty-mcp-server.vercel.app
|
|
32
|
-
npm: https://www.npmjs.com/package/guesty-mcp-server
|
|
33
|
-
|
|
34
|
-
Happy to answer questions about building MCP servers for vertical SaaS APIs.
|
|
35
|
-
|
|
36
|
-
## Timing
|
|
37
|
-
- Post at 8:30 AM EST / 5:30 AM PT on Wednesday April 3
|
|
38
|
-
- HN peak traffic: Tuesday-Thursday, 8-10 AM PT
|
|
39
|
-
- MCP Dev Summit Day 2 happening same day = topical relevance
|
|
40
|
-
- Engage with EVERY comment within first 2 hours
|
|
41
|
-
|
|
42
|
-
## Backup titles (if first doesn't get traction)
|
|
43
|
-
- "Show HN: We built an MCP server that manages our Airbnb properties"
|
|
44
|
-
- "Show HN: Open-source MCP server for Guesty – manage rentals with AI agents"
|
package/PRODUCT-HUNT-LAUNCH.md
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# Product Hunt Launch — guesty-mcp-server
|
|
2
|
-
|
|
3
|
-
## Tagline (60 chars)
|
|
4
|
-
Connect AI agents to Guesty in 60 seconds — 39 tools, one command
|
|
5
|
-
|
|
6
|
-
## Description (under 800 chars)
|
|
7
|
-
guesty-mcp-server is the first MCP server for Guesty, the leading property management platform with 100K+ listings worldwide.
|
|
8
|
-
|
|
9
|
-
39 tools covering reservations, guests, messaging, pricing, financials, calendars, reviews, tasks, and webhooks. Everything a property manager needs to connect AI to their Guesty account.
|
|
10
|
-
|
|
11
|
-
One command to install: npx guesty-mcp-server
|
|
12
|
-
|
|
13
|
-
Compatible with Claude, ChatGPT, GitHub Copilot, Cline, and any MCP-compatible AI client. Free and open source.
|
|
14
|
-
|
|
15
|
-
Already listed on Smithery, the official MCP servers directory, and 5 other MCP marketplaces.
|
|
16
|
-
|
|
17
|
-
## Maker's Comment
|
|
18
|
-
Hey PH! We built guesty-mcp-server because property managers deserve the same AI integration that enterprise software has. Guesty is the leading PMS — now any AI agent can manage reservations, respond to guests, update pricing, and pull financial reports through MCP. 39 tools, zero config, works with any MCP client. What would you automate first in your rental business?
|
|
19
|
-
|
|
20
|
-
## Topics
|
|
21
|
-
AI, Developer Tools, Property Management, Open Source, MCP
|
|
22
|
-
|
|
23
|
-
## Screenshots Needed
|
|
24
|
-
1. Terminal: npx guesty-mcp-server running
|
|
25
|
-
2. /health endpoint JSON response
|
|
26
|
-
3. /tools endpoint showing 39 tools
|
|
27
|
-
4. README hero section with badges
|
|
28
|
-
5. Architecture diagram showing MCP client -> server -> Guesty API
|
package/SECURITY.md
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# Security
|
|
2
|
-
|
|
3
|
-
## API Credentials
|
|
4
|
-
|
|
5
|
-
**Never commit API credentials to version control.**
|
|
6
|
-
|
|
7
|
-
- Store `GUESTY_CLIENT_ID` and `GUESTY_CLIENT_SECRET` as environment variables
|
|
8
|
-
- Use `.env` files locally (already in `.gitignore`)
|
|
9
|
-
- Use secrets management in production (Docker secrets, AWS SSM, etc.)
|
|
10
|
-
|
|
11
|
-
## Token Handling
|
|
12
|
-
|
|
13
|
-
- OAuth2 tokens are cached in memory with automatic refresh
|
|
14
|
-
- Tokens expire after 24 hours
|
|
15
|
-
- Token cache file (`.token-cache.json`) is gitignored
|
|
16
|
-
|
|
17
|
-
## API Access
|
|
18
|
-
|
|
19
|
-
- The server uses OAuth2 client credentials flow
|
|
20
|
-
- All API calls go through HTTPS
|
|
21
|
-
- Rate limiting is handled with automatic retry
|
|
22
|
-
|
|
23
|
-
## Reporting Vulnerabilities
|
|
24
|
-
|
|
25
|
-
If you discover a security vulnerability, please email dljrealty@yahoo.com rather than opening a public issue.
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# Multi-Account Support Design (v3)
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
Support managing multiple Guesty accounts from a single MCP server instance.
|
|
5
|
-
|
|
6
|
-
## Configuration
|
|
7
|
-
```json
|
|
8
|
-
{
|
|
9
|
-
"accounts": {
|
|
10
|
-
"default": { "clientId": "xxx", "clientSecret": "xxx", "label": "DLJ Properties" },
|
|
11
|
-
"client-abc": { "clientId": "yyy", "clientSecret": "yyy", "label": "ABC Vacation Rentals" }
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Usage
|
|
17
|
-
Every tool accepts optional `accountId`:
|
|
18
|
-
```
|
|
19
|
-
get_reservations({ accountId: "client-abc", limit: 10 })
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Key Features
|
|
23
|
-
- Separate token cache per account
|
|
24
|
-
- Independent rate limit tracking
|
|
25
|
-
- Per-account health checks
|
|
26
|
-
- No cross-account data leakage
|
|
27
|
-
- Audit log per account
|
|
28
|
-
|
|
29
|
-
## Enterprise Use Cases
|
|
30
|
-
- Property management companies with regional accounts
|
|
31
|
-
- White-label SaaS serving multiple clients
|
|
32
|
-
- Multi-brand hospitality groups
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
version: '3.8'
|
|
2
|
-
services:
|
|
3
|
-
guesty-mcp:
|
|
4
|
-
build: .
|
|
5
|
-
environment:
|
|
6
|
-
- GUESTY_CLIENT_ID=${GUESTY_CLIENT_ID}
|
|
7
|
-
- GUESTY_CLIENT_SECRET=${GUESTY_CLIENT_SECRET}
|
|
8
|
-
- WEBHOOK_PORT=3001
|
|
9
|
-
- MCP_HTTP_PORT=3002
|
|
10
|
-
ports:
|
|
11
|
-
- "3001:3001"
|
|
12
|
-
- "3002:3002"
|
|
13
|
-
restart: unless-stopped
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
**To:** partnerships@guesty.com
|
|
2
|
-
**Subject:** First MCP Server for Guesty — Marketplace Partnership Request
|
|
3
|
-
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
Hi Guesty Partnerships Team,
|
|
7
|
-
|
|
8
|
-
We built the first Model Context Protocol (MCP) server for Guesty and would like to discuss listing it in the Guesty Marketplace.
|
|
9
|
-
|
|
10
|
-
**What we built:**
|
|
11
|
-
guesty-mcp-server — an open-source MCP server that enables AI agents (Claude, ChatGPT, Copilot, Cline, and others) to interact with Guesty's Open API through the industry-standard MCP protocol. One install command: `npx guesty-mcp-server`.
|
|
12
|
-
|
|
13
|
-
**39 tools covering the full Guesty workflow:**
|
|
14
|
-
- Reservations: list, get, create, update
|
|
15
|
-
- Guests: get, list, search
|
|
16
|
-
- Messaging: list conversations, get posts, send messages
|
|
17
|
-
- Listings: list, get, update, calendar, availability, photos
|
|
18
|
-
- Pricing: get pricing, update base price, calendar pricing
|
|
19
|
-
- Financials: summary, owner payouts, payout details, revenue report
|
|
20
|
-
- Operations: tasks, cleaning tasks, check-in/check-out, occupancy report
|
|
21
|
-
- Reviews: list, get, reply
|
|
22
|
-
- Webhooks: create, list, delete
|
|
23
|
-
- Analytics: channel distribution
|
|
24
|
-
|
|
25
|
-
**Why this matters for Guesty:**
|
|
26
|
-
- MCP is the fastest-growing AI integration standard — 97M monthly SDK downloads, adopted by Anthropic, OpenAI, Google, Microsoft, and AWS
|
|
27
|
-
- The MCP Dev Summit (April 2-3, NYC) is happening this week under the Linux Foundation
|
|
28
|
-
- Every major property management platform will have MCP integration within 12 months — Guesty can lead by being first
|
|
29
|
-
- This server lets any Guesty customer connect AI agents to their account in under 60 seconds
|
|
30
|
-
|
|
31
|
-
**Traction:**
|
|
32
|
-
- Live and hosted: https://guesty-mcp-server.vercel.app
|
|
33
|
-
- Published on npm: https://www.npmjs.com/package/guesty-mcp-server
|
|
34
|
-
- Listed on Smithery (accepted), Cline MCP Marketplace, official MCP servers directory, and 4 additional MCP directories
|
|
35
|
-
- Battle-tested in production at DLJ Properties (7 units across Colorado and Miami)
|
|
36
|
-
- Open source: https://github.com/DLJRealty/guesty-mcp-server
|
|
37
|
-
|
|
38
|
-
**What we're asking:**
|
|
39
|
-
We'd like to be listed as a Community Partner or Integrated Partner in the Guesty Marketplace. We're happy to work with your team on any requirements — documentation, security review, or deeper API integration.
|
|
40
|
-
|
|
41
|
-
We're also open to co-marketing the launch. Our case study shows measurable results: 500+ automated guest replies, reduced response times, and streamlined operations across 7 properties using Guesty + MCP.
|
|
42
|
-
|
|
43
|
-
Happy to jump on a call anytime. Looking forward to partnering.
|
|
44
|
-
|
|
45
|
-
Best,
|
|
46
|
-
Danny Perez
|
|
47
|
-
DLJ Properties
|
|
48
|
-
https://guestycopilot.com
|
package/tests/test-iot.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Integration tests for IoT/Property Health Enterprise tier
|
|
4
|
-
* Tests: iot-db.js, iot-webhook.js, iot-tools.js
|
|
5
|
-
*/
|
|
6
|
-
import { initDB, upsertDevice, saveReading, getLatestReadings, saveAlert, getAlerts, resolveAlert, saveBaseline, getBaseline, savePhotos } from '../src/iot-db.js';
|
|
7
|
-
import { registerIoTTools } from '../src/iot-tools.js';
|
|
8
|
-
import fs from 'fs';
|
|
9
|
-
import path from 'path';
|
|
10
|
-
import os from 'os';
|
|
11
|
-
|
|
12
|
-
// Use temp DB for tests
|
|
13
|
-
const TEST_DB = path.join(os.tmpdir(), 'iot-test-' + Date.now() + '.json');
|
|
14
|
-
process.env.IOT_DB_PATH = TEST_DB;
|
|
15
|
-
|
|
16
|
-
let passed = 0;
|
|
17
|
-
let failed = 0;
|
|
18
|
-
|
|
19
|
-
function assert(condition, msg) {
|
|
20
|
-
if (condition) {
|
|
21
|
-
passed++;
|
|
22
|
-
console.log(` ✓ ${msg}`);
|
|
23
|
-
} else {
|
|
24
|
-
failed++;
|
|
25
|
-
console.log(` ✗ FAIL: ${msg}`);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async function run() {
|
|
30
|
-
console.log("=== IoT Integration Tests ===\n");
|
|
31
|
-
|
|
32
|
-
// Test 1: Database initialization
|
|
33
|
-
console.log("1. Database Init");
|
|
34
|
-
initDB();
|
|
35
|
-
assert(fs.existsSync(TEST_DB), "DB file created");
|
|
36
|
-
|
|
37
|
-
// Test 2: Device management
|
|
38
|
-
console.log("\n2. Device Management");
|
|
39
|
-
upsertDevice({ device_id: "sensor-001", device_type: "temp_sensor", property_id: "listing-abc", location: "living_room" });
|
|
40
|
-
upsertDevice({ device_id: "lock-001", device_type: "smart_lock", property_id: "listing-abc", location: "front_door" });
|
|
41
|
-
upsertDevice({ device_id: "leak-001", device_type: "leak_sensor", property_id: "listing-abc", location: "bathroom" });
|
|
42
|
-
const readings1 = getLatestReadings("listing-abc");
|
|
43
|
-
// getLatestReadings returns an array of readings, not { devices: [...] }
|
|
44
|
-
// With no readings yet, returns empty. Check devices were created by querying again after readings.
|
|
45
|
-
assert(Array.isArray(readings1), `getLatestReadings returns array (got ${typeof readings1})`);
|
|
46
|
-
|
|
47
|
-
// Test 3: Save readings
|
|
48
|
-
console.log("\n3. Readings");
|
|
49
|
-
saveReading({ device_id: "sensor-001", reading_type: "temperature", value: "72.5", raw_payload: { source: "test" } });
|
|
50
|
-
saveReading({ device_id: "sensor-001", reading_type: "temperature", value: "73.0", raw_payload: { source: "test" } });
|
|
51
|
-
saveReading({ device_id: "lock-001", reading_type: "lock_status", value: "locked", raw_payload: { source: "test" } });
|
|
52
|
-
saveReading({ device_id: "leak-001", reading_type: "leak_detected", value: "false", raw_payload: { source: "test" } });
|
|
53
|
-
const readings2 = getLatestReadings("listing-abc");
|
|
54
|
-
assert(readings2.length >= 3, `At least 3 readings for listing-abc (got ${readings2.length})`);
|
|
55
|
-
const tempReading = readings2.find(r => r.device_id === "sensor-001" && r.reading_type === "temperature");
|
|
56
|
-
assert(tempReading !== undefined, "Temp reading found");
|
|
57
|
-
assert(tempReading.value === "73.0", `Latest temp is 73.0 (got ${tempReading?.value})`);
|
|
58
|
-
|
|
59
|
-
// Test 4: Alerts
|
|
60
|
-
console.log("\n4. Alerts");
|
|
61
|
-
const alertId = saveAlert({ device_id: "leak-001", property_id: "listing-abc", alert_type: "leak", severity: "critical", message: "Water detected in bathroom!" });
|
|
62
|
-
assert(typeof alertId === 'number' || typeof alertId === 'string', `Alert created with ID: ${alertId}`);
|
|
63
|
-
const alerts = getAlerts("listing-abc");
|
|
64
|
-
assert(alerts.length >= 1, `At least 1 alert (got ${alerts.length})`);
|
|
65
|
-
assert(alerts[0].severity === "critical", "Alert severity is critical");
|
|
66
|
-
|
|
67
|
-
// Test 5: Resolve alert
|
|
68
|
-
console.log("\n5. Alert Resolution");
|
|
69
|
-
resolveAlert(alertId, "CTO");
|
|
70
|
-
const alertsAfter = getAlerts("listing-abc");
|
|
71
|
-
const resolvedAlert = getAlerts("listing-abc", { includeResolved: true }).find(a =>
|
|
72
|
-
a.message === "Water detected in bathroom!"
|
|
73
|
-
);
|
|
74
|
-
assert(resolvedAlert?.resolved_by === "CTO" || alertsAfter.length === 0, "Alert resolved by CTO");
|
|
75
|
-
|
|
76
|
-
// Test 6: Baselines
|
|
77
|
-
console.log("\n6. Baselines");
|
|
78
|
-
saveBaseline({ property_id: "listing-abc", photo_urls: ["https://example.com/clean1.jpg", "https://example.com/clean2.jpg"], notes: "Post deep-clean baseline" });
|
|
79
|
-
const baseline = getBaseline("listing-abc");
|
|
80
|
-
assert(baseline !== null, "Baseline saved");
|
|
81
|
-
assert(baseline.photo_urls?.length === 2, `2 baseline photos (got ${baseline?.photo_urls?.length})`);
|
|
82
|
-
|
|
83
|
-
// Test 7: Readiness Score components
|
|
84
|
-
console.log("\n7. Readiness Score Data");
|
|
85
|
-
// Add a fresh alert to test readiness impact
|
|
86
|
-
saveAlert({ device_id: "sensor-001", property_id: "listing-abc", alert_type: "temp_out_of_range", severity: "warning", message: "Temperature is 58F" });
|
|
87
|
-
const latestAll = getLatestReadings("listing-abc");
|
|
88
|
-
const activeAlerts = getAlerts("listing-abc");
|
|
89
|
-
assert(latestAll.length >= 3, `Multiple readings available (got ${latestAll.length})`);
|
|
90
|
-
assert(activeAlerts.length >= 1, "Active alerts present for readiness check");
|
|
91
|
-
|
|
92
|
-
// Test 8: Multi-property isolation
|
|
93
|
-
console.log("\n8. Multi-Property Isolation");
|
|
94
|
-
upsertDevice({ device_id: "sensor-002", device_type: "temp_sensor", property_id: "listing-xyz", location: "bedroom" });
|
|
95
|
-
saveReading({ device_id: "sensor-002", reading_type: "temperature", value: "70.0", raw_payload: { source: "test" } });
|
|
96
|
-
const readingsXYZ = getLatestReadings("listing-xyz");
|
|
97
|
-
const readingsABC = getLatestReadings("listing-abc");
|
|
98
|
-
assert(readingsXYZ.length >= 1, `listing-xyz has readings (got ${readingsXYZ.length})`);
|
|
99
|
-
assert(readingsABC.length >= 3, `listing-abc still has readings (got ${readingsABC.length})`);
|
|
100
|
-
|
|
101
|
-
// Cleanup
|
|
102
|
-
try { fs.unlinkSync(TEST_DB); } catch(e) {}
|
|
103
|
-
|
|
104
|
-
console.log(`\n=== Results: ${passed} passed, ${failed} failed ===`);
|
|
105
|
-
process.exit(failed > 0 ? 1 : 0);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
run().catch(e => { console.error("Test error:", e); process.exit(1); });
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
**To:** pmsupport@tripadvisor.com
|
|
2
|
-
**From:** DLJrealty@yahoo.com
|
|
3
|
-
**Subject:** API Access Request — Vacation Rental Property Manager (7 Properties)
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
Hi TripAdvisor Rentals Team,
|
|
8
|
-
|
|
9
|
-
I manage 7 short-term rental properties across Colorado and Miami through DLJ Properties. I'd like to request API access to programmatically manage our TripAdvisor Rentals listings.
|
|
10
|
-
|
|
11
|
-
Our portfolio:
|
|
12
|
-
- 4 boutique tiny homes in Woodland Park, Colorado (Pikes Peak area)
|
|
13
|
-
- 3 apartments in Miami, Florida
|
|
14
|
-
- 628+ five-star reviews across platforms
|
|
15
|
-
- Airbnb Superhost, every quarter
|
|
16
|
-
|
|
17
|
-
We use Guesty as our PMS and would like to integrate with TripAdvisor's Content Connect API to manage listings, calendars, rates, and photos.
|
|
18
|
-
|
|
19
|
-
Our website: https://tinyhomeboutiques.com
|
|
20
|
-
Our properties: https://tinyhomeboutiques.com/unit-y-boutique-tinyhome.html
|
|
21
|
-
|
|
22
|
-
Could you provide API access and documentation? Happy to discuss our setup and integration needs.
|
|
23
|
-
|
|
24
|
-
Best,
|
|
25
|
-
Danny Perez
|
|
26
|
-
DLJ Properties
|
|
27
|
-
DLJrealty@yahoo.com
|