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.
@@ -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"
@@ -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