propstack-mcp-server 1.1.0 → 1.2.0

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 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/tools/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,MAAc;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,4EAA4E;QAC5E,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrE,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,uBAAuB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACzE,CAAC;QACD,IAAI,MAAM,CAAC,KAAK;YAAE,OAAO,qBAAqB,MAAM,CAAC,KAAK,EAAE,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IACD,OAAO,qBAAqB,MAAM,EAAE,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,GAAG;gBACN,OAAO,mGAAmG,CAAC;YAC7G,KAAK,GAAG;gBACN,OAAO,yEAAyE,CAAC;YACnF,KAAK,GAAG;gBACN,OAAO,EAAE;oBACP,CAAC,CAAC,mCAAmC,EAAE,oBAAoB,GAAG,CAAC,IAAI,IAAI;oBACvE,CAAC,CAAC,cAAc,GAAG,CAAC,IAAI,IAAI,CAAC;YACjC,KAAK,GAAG;gBACN,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC9B,KAAK,GAAG;gBACN,OAAO,8DAA8D,CAAC;YACxE;gBACE,OAAO,uBAAuB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACxD,OAAO,2FAA2F,CAAC;IACrG,CAAC;IACD,IAAI,GAAG,YAAY,SAAS,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QAC7I,OAAO,kFAAkF,GAAG,CAAC,OAAO,GAAG,CAAC;IAC1G,CAAC;IACD,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,GAAY;IACtD,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO,UAAU,CAAC,mGAAmG,CAAC,CAAC;QACzH,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO,UAAU,CAAC,yEAAyE,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO,EAAE;gBACP,CAAC,CAAC,UAAU,CAAC,GAAG,MAAM,kBAAkB,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,UAAU,CAAC;gBACrF,CAAC,CAAC,UAAU,CAAC,GAAG,MAAM,aAAa,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO,UAAU,CAAC,8DAA8D,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,UAAU,CAAC,uBAAuB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,CAAC;AACjG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,GAA8B,CAAC;QACzC,IAAI,cAAc,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,IAAI,IAAI,IAAI,CAAC,CAAC,YAAY,KAAK,EAAE,EAAE,CAAC;YAC3E,OAAO,oBAAoB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,OAAO,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QACD,uDAAuD;QACvD,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAChD,OAAO,CAAC,CAAC,KAAK,CAAC;QACjB,CAAC;QACD,uEAAuE;QACvE,IAAI,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,CAAC,CAAC,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,KAAc,EAAE,QAAQ,GAAG,MAAM;IACnD,MAAM,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC/D,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC3C,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,CAAC,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAC9B,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAc,EAAE,IAAI,GAAG,IAAI;IACjD,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAC9B,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAY,EAAE,GAAW,EAAE,QAAQ,GAAG,MAAM;IACpE,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACrD,MAAM,GAAG,GAAI,GAA+B,CAAC,GAAG,CAAC,CAAC;IAClD,OAAO,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAoC,GAAM;IACtE,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,MAAoB,CAAC;AAC9B,CAAC;AAED,yEAAyE;AACzE,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,8DAA8D;AAC9D,wEAAwE;AACxE,+DAA+D;AAE/D,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO;IACvE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU;IACvE,aAAa,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe;IAClE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,qBAAqB;IACnE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,QAAQ;IACzE,kBAAkB,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe;IACxE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB;IAC9D,aAAa,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe;IAC1D,iBAAiB,EAAE,2BAA2B,EAAE,YAAY,EAAE,YAAY;IAC1E,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB;IACxE,YAAY;CACJ,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa;IACvE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM;IACtE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc;IAC3E,WAAW,EAAE,sBAAsB,EAAE,iBAAiB;IACtD,qBAAqB,EAAE,sBAAsB,EAAE,OAAO,EAAE,mBAAmB;IAC3E,kBAAkB,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY;IACpE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS;IAC3E,QAAQ,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,QAAQ;IACzE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU;CAClE,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe;IAC5E,kBAAkB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY;IAC9D,uBAAuB,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU;IACpE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY;CACjD,CAAC;AAEX;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,SAA4B,EAC5B,KAAwB,EACxB,WAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzD,OAAO,CACL,WAAW,WAAW,IAAI,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAC3D,SAAS,WAAW,gBAAgB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACxD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACxD,OAAO,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE;gBACtE,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA+B,EAC/B,MAAyB,EACzB,MAAc;IAEd,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAID;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAmB,EACnB,aAAoE;IAEpE,IAAI,CAAC,aAAa;QAAE,OAAO,MAAM,CAAC;IAClC,MAAM,GAAG,GAAgB,EAAE,GAAG,MAAM,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC;QACxD,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/tools/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { PropstackClient } from "../propstack-client.js";
3
+ export declare function registerImageTools(server: McpServer, client: PropstackClient): void;
4
+ //# sourceMappingURL=images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/tools/images.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAkB9D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAgJnF"}
@@ -0,0 +1,131 @@
1
+ import { z } from "zod";
2
+ import { textResult, errorResult, fmt, stripUndefined } from "./helpers.js";
3
+ // ── Response formatting ──────────────────────────────────────────────
4
+ function formatImage(img) {
5
+ const flags = [];
6
+ if (img.is_floorplan)
7
+ flags.push("floorplan");
8
+ if (img.is_private)
9
+ flags.push("private (not on portals)");
10
+ const pos = img.position !== null && img.position !== undefined ? `#${img.position} ` : "";
11
+ return `- ${pos}**${fmt(img.title, "Untitled")}** (ID: ${img.id})` +
12
+ (flags.length ? ` — ${flags.join(", ")}` : "") +
13
+ (img.url ? `\n ${img.url}` : "");
14
+ }
15
+ // ── Tool registration ────────────────────────────────────────────────
16
+ export function registerImageTools(server, client) {
17
+ // ── list_property_images ────────────────────────────────────────
18
+ server.tool("list_property_images", `List all images and floor plans of a property, in portal order.
19
+
20
+ Returns each image's ID, title, position, floorplan/private flags and URL.
21
+ Use the IDs with update_image. Image URLs are signed and may expire after
22
+ a while; fetch them again rather than storing them.`, {
23
+ property_id: z.number()
24
+ .describe("Property ID"),
25
+ }, async (args) => {
26
+ try {
27
+ const property = await client.get(`/units/${args.property_id}`, { params: { new: 1 } });
28
+ const images = [...(property.images ?? [])];
29
+ const floorplans = [...(property.floorplans ?? [])];
30
+ const byPosition = (a, b) => (a.position ?? Number.MAX_SAFE_INTEGER) - (b.position ?? Number.MAX_SAFE_INTEGER);
31
+ images.sort(byPosition);
32
+ floorplans.sort(byPosition);
33
+ if (images.length === 0 && floorplans.length === 0) {
34
+ return textResult(`Property ${args.property_id} has no images or floor plans.`);
35
+ }
36
+ const sections = [
37
+ `# Images for ${fmt(property.title, "Untitled")} (ID: ${property.id})`,
38
+ ];
39
+ if (images.length) {
40
+ sections.push(`## Images (${images.length})\n${images.map(formatImage).join("\n")}`);
41
+ }
42
+ if (floorplans.length) {
43
+ sections.push(`## Floor plans (${floorplans.length})\n${floorplans.map(formatImage).join("\n")}`);
44
+ }
45
+ return textResult(sections.join("\n\n"));
46
+ }
47
+ catch (err) {
48
+ return errorResult("Property", err);
49
+ }
50
+ });
51
+ // ── upload_image ────────────────────────────────────────────────
52
+ server.tool("upload_image", `Upload an image to a property or project in Propstack.
53
+
54
+ The photo must be a base64 data URI, e.g. "data:image/jpeg;base64,/9j/4AAQ...".
55
+ Attach to exactly one of property_id or project_id.
56
+
57
+ is_private: false (default) = the image is published to portals;
58
+ true = kept internal. The title is shown as caption and used in the file name.
59
+
60
+ For AI-staged or edited images (virtual staging), say so in the title,
61
+ e.g. "Wohnzimmer (virtuell möbliert)"; German law requires the label.`, {
62
+ photo: z.string()
63
+ .describe("Image as base64 data URI (e.g. 'data:image/jpeg;base64,...')"),
64
+ property_id: z.number().optional()
65
+ .describe("Attach to this property"),
66
+ project_id: z.number().optional()
67
+ .describe("Attach to this project"),
68
+ title: z.string().optional()
69
+ .describe("Caption / title of the image"),
70
+ is_private: z.boolean().optional()
71
+ .describe("true = hide from portals (default false)"),
72
+ }, async (args) => {
73
+ try {
74
+ const targets = [args.property_id, args.project_id].filter((v) => v !== undefined);
75
+ if (targets.length !== 1) {
76
+ return { ...textResult("Provide exactly one of property_id or project_id."), isError: true };
77
+ }
78
+ if (!/^data:image\/[a-z0-9.+-]+;base64,/i.test(args.photo)) {
79
+ return {
80
+ ...textResult("photo must be a base64 data URI starting with 'data:image/<type>;base64,'."),
81
+ isError: true,
82
+ };
83
+ }
84
+ const image = stripUndefined({
85
+ imageable_id: args.property_id ?? args.project_id,
86
+ imageable_type: args.property_id !== undefined ? "Property" : "Project",
87
+ photo: args.photo,
88
+ title: args.title,
89
+ is_private: args.is_private,
90
+ });
91
+ const res = await client.post("/images", { body: { image } });
92
+ const owner = args.property_id !== undefined
93
+ ? `property ${args.property_id}`
94
+ : `project ${args.project_id}`;
95
+ return textResult(`Image uploaded to ${owner} (image ID: ${fmt(res.id)}).`);
96
+ }
97
+ catch (err) {
98
+ return errorResult("Image", err);
99
+ }
100
+ });
101
+ // ── update_image ────────────────────────────────────────────────
102
+ server.tool("update_image", `Update an image's title or portal visibility.
103
+
104
+ Use list_property_images to find image IDs. Titles can be set per language
105
+ with title_de / title_en. Only provide the fields you want to change.`, {
106
+ id: z.number()
107
+ .describe("Image ID"),
108
+ title: z.string().optional()
109
+ .describe("New title (default language)"),
110
+ title_de: z.string().optional()
111
+ .describe("German title"),
112
+ title_en: z.string().optional()
113
+ .describe("English title"),
114
+ is_private: z.boolean().optional()
115
+ .describe("true = hide from portals, false = publish to portals"),
116
+ }, async (args) => {
117
+ try {
118
+ const { id, ...fields } = args;
119
+ const image = stripUndefined(fields);
120
+ if (Object.keys(image).length === 0) {
121
+ return { ...textResult("Nothing to update: provide at least one field."), isError: true };
122
+ }
123
+ await client.put(`/images/${id}`, { body: { image } });
124
+ return textResult(`Image ${id} updated (${Object.keys(image).join(", ")}).`);
125
+ }
126
+ catch (err) {
127
+ return errorResult("Image", err);
128
+ }
129
+ });
130
+ }
131
+ //# sourceMappingURL=images.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/tools/images.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../src/tools/properties.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AA2E9D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CA8ZtF"}
1
+ {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../src/tools/properties.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAgO9D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAwatF"}
@@ -1,6 +1,29 @@
1
1
  import { z } from "zod";
2
- import { textResult, errorResult, fmt, fmtPrice, fmtArea, stripUndefined, validateFields, renderProjectedRecord, applyCustomFilters, PROPERTY_FIELDS } from "./helpers.js";
2
+ import { textResult, errorResult, fmt, fmtPrice, fmtArea, stripUndefined, unwrapPropstackValue, validateFields, renderProjectedRecord, applyCustomFilters, PROPERTY_FIELDS } from "./helpers.js";
3
3
  // ── Response formatting ──────────────────────────────────────────────
4
+ function fmtList(value) {
5
+ const v = unwrapPropstackValue(value);
6
+ if (Array.isArray(v)) {
7
+ const items = v.map((item) => fmt(item, "")).filter(Boolean);
8
+ return items.length > 0 ? items.join(", ") : "none";
9
+ }
10
+ return fmt(v);
11
+ }
12
+ function fmtYesNo(value) {
13
+ const v = unwrapPropstackValue(value);
14
+ if (typeof v === "boolean")
15
+ return v ? "yes" : "no";
16
+ return fmt(v);
17
+ }
18
+ function formatSection(title, rows) {
19
+ const lines = rows
20
+ .map(([label, value, formatter = fmt]) => {
21
+ const formatted = formatter(value);
22
+ return formatted === "none" ? null : ` - ${label}: ${formatted}`;
23
+ })
24
+ .filter((line) => line !== null);
25
+ return lines.length > 0 ? `${title}:\n${lines.join("\n")}` : null;
26
+ }
4
27
  function formatProperty(p) {
5
28
  const title = fmt(p.title, "Untitled");
6
29
  const marketingType = fmt(p.marketing_type);
@@ -28,7 +51,58 @@ function formatProperty(p) {
28
51
  p.project ? `Project: ${fmt(p.project.name)}` : null,
29
52
  p.exposee_id ? `Exposé ID: ${p.exposee_id}` : null,
30
53
  ];
31
- return lines.filter(Boolean).join("\n");
54
+ const details = [
55
+ formatSection("Energy certificate", [
56
+ ["Availability", p.energy_certificate_availability],
57
+ ["Rating type", p.building_energy_rating_type],
58
+ ["Efficiency class", p.energy_efficiency_class],
59
+ ["Thermal characteristic", p.thermal_characteristic],
60
+ ["Electricity portion", p.thermal_characteristic_electricity],
61
+ ["Heating portion", p.thermal_characteristic_heating],
62
+ ["Warm water included", p.energy_consumption_contains_warm_water, fmtYesNo],
63
+ ["Certificate start", p.energy_certificate_start_date],
64
+ ["Certificate end", p.energy_certificate_end_date],
65
+ ["Heating type", p.heating_type],
66
+ ["Firing types", p.firing_types, fmtList],
67
+ ]),
68
+ formatSection("Equipment", [
69
+ ["Lift", p.lift, fmtYesNo],
70
+ ["Cellar", p.cellar, fmtYesNo],
71
+ ["Barrier free", p.barrier_free, fmtYesNo],
72
+ ["Guest toilet", p.guest_toilet, fmtYesNo],
73
+ ["Built-in kitchen", p.built_in_kitchen, fmtYesNo],
74
+ ["Balcony", p.balcony, fmtYesNo],
75
+ ["Garden", p.garden, fmtYesNo],
76
+ ["Terrace", p.terrace, fmtYesNo],
77
+ ["Monument", p.monument, fmtYesNo],
78
+ ]),
79
+ formatSection("Layout and condition", [
80
+ ["Floors", p.number_of_floors],
81
+ ["Balconies", p.number_of_balconies],
82
+ ["Terraces", p.number_of_terraces],
83
+ ["Parking spaces", p.number_of_parking_spaces],
84
+ ["Floor label", p.floor_label],
85
+ ["Parking space type", p.parking_space_type],
86
+ ["Last refurbishment", p.last_refurbishment],
87
+ ["Condition", p.condition],
88
+ ["Interior quality", p.interior_quality],
89
+ ["Technical modernization year", p.equipment_technology_construction_year],
90
+ ]),
91
+ formatSection("Marketing and costs", [
92
+ ["Service charge", p.service_charge, fmtPrice],
93
+ ["Heating costs", p.heating_costs, fmtPrice],
94
+ ["Parking space price", p.parking_space_price, fmtPrice],
95
+ ["Deposit", p.deposit],
96
+ ["Sold price", p.sold_price, fmtPrice],
97
+ ["Sold date", p.sold_date],
98
+ ["Usable floor space", p.usable_floor_space, fmtArea],
99
+ ["Total floor space", p.total_floor_space, fmtArea],
100
+ ["Balcony space", p.balcony_space, fmtArea],
101
+ ["Free from", p.free_from],
102
+ ["Rented", p.rented, fmtYesNo],
103
+ ]),
104
+ ].filter(Boolean);
105
+ return [...lines.filter(Boolean), ...details].join("\n");
32
106
  }
33
107
  function formatPropertyRow(p) {
34
108
  const addr = [fmt(p.street, ""), fmt(p.house_number, "")].filter(Boolean).join(" ");
@@ -59,41 +133,104 @@ const SEARCH_SORT_FIELDS = [
59
133
  "street_number.raw", "sold_date", "total_rent", "number_of_rooms",
60
134
  "updated_at",
61
135
  ];
136
+ const GERMAN_RESIDENTIAL_PROPERTY_FIELDS = {
137
+ // Energy certificate
138
+ energy_certificate_availability: z.string().optional()
139
+ .describe("Energy certificate availability/exemption status"),
140
+ building_energy_rating_type: z.string().optional()
141
+ .describe("Energy rating type, e.g. Bedarfsausweis or Verbrauchsausweis"),
142
+ energy_efficiency_class: z.string().optional()
143
+ .describe("Energy efficiency class, e.g. A+, A, B, C, D, E, F, G, H"),
144
+ thermal_characteristic: z.number().optional()
145
+ .describe("Final energy demand/consumption in kWh/(m²·a)"),
146
+ thermal_characteristic_electricity: z.number().optional()
147
+ .describe("Electricity portion of the energy characteristic"),
148
+ thermal_characteristic_heating: z.number().optional()
149
+ .describe("Heating portion of the energy characteristic"),
150
+ energy_consumption_contains_warm_water: z.boolean().optional()
151
+ .describe("Whether energy consumption includes domestic hot water"),
152
+ energy_certificate_start_date: z.string().optional()
153
+ .describe("Energy certificate issue/start date"),
154
+ energy_certificate_end_date: z.string().optional()
155
+ .describe("Energy certificate expiry/end date"),
156
+ heating_type: z.string().optional()
157
+ .describe("Heating system type"),
158
+ firing_types: z.union([z.string(), z.array(z.string())]).optional()
159
+ .describe("Energy carrier/firing type or types"),
160
+ // Standard residential equipment
161
+ lift: z.boolean().optional().describe("Elevator available"),
162
+ cellar: z.boolean().optional().describe("Basement/cellar available"),
163
+ barrier_free: z.boolean().optional().describe("Barrier-free / accessible"),
164
+ guest_toilet: z.boolean().optional().describe("Guest toilet available"),
165
+ built_in_kitchen: z.boolean().optional().describe("Built-in kitchen available"),
166
+ balcony: z.boolean().optional().describe("Balcony available"),
167
+ garden: z.boolean().optional().describe("Garden available"),
168
+ terrace: z.boolean().optional().describe("Terrace available"),
169
+ monument: z.boolean().optional().describe("Listed-building / monument status"),
170
+ // Layout and condition
171
+ number_of_floors: z.number().optional().describe("Total number of floors in the building"),
172
+ number_of_balconies: z.number().optional().describe("Number of balconies"),
173
+ number_of_terraces: z.number().optional().describe("Number of terraces"),
174
+ number_of_parking_spaces: z.number().optional().describe("Number of parking spaces"),
175
+ floor_label: z.string().optional().describe("Floor label, e.g. '5. OG'"),
176
+ parking_space_type: z.string().optional().describe("Parking space type, e.g. garage, carport, outdoor"),
177
+ last_refurbishment: z.number().optional().describe("Year of last refurbishment"),
178
+ condition: z.string().optional().describe("Property condition"),
179
+ interior_quality: z.string().optional().describe("Interior quality"),
180
+ equipment_technology_construction_year: z.number().optional()
181
+ .describe("Year of last technical modernization"),
182
+ // Costs, areas, availability, and long-form marketing text
183
+ service_charge: z.number().optional().describe("Monthly service charge / Hausgeld"),
184
+ heating_costs: z.number().optional().describe("Heating cost component"),
185
+ parking_space_price: z.number().optional().describe("Parking space price"),
186
+ deposit: z.union([z.string(), z.number()]).optional().describe("Security deposit"),
187
+ sold_price: z.number().optional().describe("Realized sale price"),
188
+ sold_date: z.string().optional().describe("Sale date"),
189
+ usable_floor_space: z.number().optional().describe("Usable floor space (m²)"),
190
+ total_floor_space: z.number().optional().describe("Total floor space (m²)"),
191
+ balcony_space: z.number().optional().describe("Balcony area (m²)"),
192
+ free_from: z.string().optional().describe("Availability date or free-from text"),
193
+ rented: z.boolean().optional().describe("Whether the property is currently rented"),
194
+ long_description_note: z.string().optional().describe("Long portal-specific description"),
195
+ long_location_note: z.string().optional().describe("Long portal-specific location text"),
196
+ long_furnishing_note: z.string().optional().describe("Long portal-specific furnishing text"),
197
+ long_other_note: z.string().optional().describe("Long portal-specific miscellaneous text"),
198
+ };
62
199
  // ── Tool registration ────────────────────────────────────────────────
63
200
  export function registerPropertyTools(server, client) {
64
201
  // ── search_properties ────────────────────────────────────────────
65
- server.tool("search_properties", `Search and filter properties (Objekte) in Propstack CRM.
66
-
67
- Use this tool to:
68
- - Find properties by address, ID, or exposé ID (use 'q' for fulltext)
69
- - Filter by status, type, marketing type, or project
70
- - Find properties in a price/rent range
71
- - List properties by size, rooms, or construction year
72
- - Filter by custom fields via the 'custom_filters' object (see below)
73
-
74
- The 'q' parameter searches: unit_id, street, zip code, city, district, exposé ID.
75
-
76
- Range filter pattern: 11 numeric fields each have _from and _to variants.
77
- For example, price_from=200000 & price_to=400000 finds properties priced 200–400k.
78
- Available range fields: price, base_rent, total_rent, property_space_value,
79
- living_space, plot_area, number_of_rooms, number_of_bed_rooms,
80
- number_of_bath_rooms, floor, construction_year.
81
-
82
- Common queries:
83
- - "Apartments 300–400k in Berlin": q="Berlin", marketing_type=BUY, rs_type=APARTMENT, price_from=300000, price_to=400000
84
- - "All available rentals": marketing_type=RENT, status=<available_id from get_property_statuses>
85
- - "Properties on market 90+ days": sort_by=created_at, order=asc
86
- - "What's in Project X?": project_id=<id>
87
-
88
- Custom fields: pass 'custom_filters' as an object of custom-field-name →
89
- value (use list_custom_fields to discover field names). Each entry becomes
90
- a cf_<name> query parameter, e.g. { energy_class: "A" }.
91
-
92
- Always returns total count. Use expand=true for custom fields.
93
-
94
- Data minimization (Art. 25 DSGVO): pass 'fields' with an array of property
95
- field names to return only those fields per property (e.g. ["id", "title",
96
- "price", "city"]). Omit 'fields' to return the default set unchanged.
202
+ server.tool("search_properties", `Search and filter properties (Objekte) in Propstack CRM.
203
+
204
+ Use this tool to:
205
+ - Find properties by address, ID, or exposé ID (use 'q' for fulltext)
206
+ - Filter by status, type, marketing type, or project
207
+ - Find properties in a price/rent range
208
+ - List properties by size, rooms, or construction year
209
+ - Filter by custom fields via the 'custom_filters' object (see below)
210
+
211
+ The 'q' parameter searches: unit_id, street, zip code, city, district, exposé ID.
212
+
213
+ Range filter pattern: 11 numeric fields each have _from and _to variants.
214
+ For example, price_from=200000 & price_to=400000 finds properties priced 200–400k.
215
+ Available range fields: price, base_rent, total_rent, property_space_value,
216
+ living_space, plot_area, number_of_rooms, number_of_bed_rooms,
217
+ number_of_bath_rooms, floor, construction_year.
218
+
219
+ Common queries:
220
+ - "Apartments 300–400k in Berlin": q="Berlin", marketing_type=BUY, rs_type=APARTMENT, price_from=300000, price_to=400000
221
+ - "All available rentals": marketing_type=RENT, status=<available_id from get_property_statuses>
222
+ - "Properties on market 90+ days": sort_by=created_at, order=asc
223
+ - "What's in Project X?": project_id=<id>
224
+
225
+ Custom fields: pass 'custom_filters' as an object of custom-field-name →
226
+ value (use list_custom_fields to discover field names). Each entry becomes
227
+ a cf_<name> query parameter, e.g. { energy_class: "A" }.
228
+
229
+ Always returns total count. Use expand=true for custom fields.
230
+
231
+ Data minimization (Art. 25 DSGVO): pass 'fields' with an array of property
232
+ field names to return only those fields per property (e.g. ["id", "title",
233
+ "price", "city"]). Omit 'fields' to return the default set unchanged.
97
234
  Unknown field names produce an error listing the valid options.`, {
98
235
  q: z.string().optional()
99
236
  .describe("Fulltext search across unit_id, street, zip, city, district, exposé ID"),
@@ -189,14 +326,14 @@ Unknown field names produce an error listing the valid options.`, {
189
326
  }
190
327
  });
191
328
  // ── get_property ─────────────────────────────────────────────────
192
- server.tool("get_property", `Get full details of a single property by ID.
193
-
194
- Use this tool to:
195
- - View complete property information for an exposé
196
- - Check images, floorplans, documents, and links
197
- - See custom fields, broker assignment, and project
198
- - Get multilingual texts (use locale parameter)
199
-
329
+ server.tool("get_property", `Get full details of a single property by ID.
330
+
331
+ Use this tool to:
332
+ - View complete property information for an exposé
333
+ - Check images, floorplans, documents, and links
334
+ - See custom fields, broker assignment, and project
335
+ - Get multilingual texts (use locale parameter)
336
+
200
337
  Always fetches with new=1 (extra fields) and expand=1 (custom fields).`, {
201
338
  id: z.number()
202
339
  .describe("Property ID"),
@@ -227,6 +364,18 @@ Always fetches with new=1 (extra fields) and expand=1 (custom fields).`, {
227
364
  const other = fmt(property.other_note, "");
228
365
  if (other)
229
366
  descriptions.push(`**Other:** ${other}`);
367
+ const longDesc = fmt(property.long_description_note, "");
368
+ if (longDesc)
369
+ descriptions.push(`**Long description:** ${longDesc}`);
370
+ const longLoc = fmt(property.long_location_note, "");
371
+ if (longLoc)
372
+ descriptions.push(`**Long location:** ${longLoc}`);
373
+ const longFurn = fmt(property.long_furnishing_note, "");
374
+ if (longFurn)
375
+ descriptions.push(`**Long furnishing:** ${longFurn}`);
376
+ const longOther = fmt(property.long_other_note, "");
377
+ if (longOther)
378
+ descriptions.push(`**Long other:** ${longOther}`);
230
379
  if (descriptions.length > 0) {
231
380
  result += "\n\n" + descriptions.join("\n\n");
232
381
  }
@@ -260,19 +409,19 @@ Always fetches with new=1 (extra fields) and expand=1 (custom fields).`, {
260
409
  }
261
410
  });
262
411
  // ── create_property ──────────────────────────────────────────────
263
- server.tool("create_property", `Create a new property (Objekt) in Propstack CRM.
264
-
265
- Use this tool to:
266
- - List a new property from an acquisition call
267
- - Create a listing from an owner inquiry
268
- - Add a property to a project
269
-
270
- Use get_property_statuses to look up valid status IDs.
271
- Use the relationships_attributes array to link an owner contact on creation.
272
-
273
- rs_type values: APARTMENT, HOUSE, TRADE_SITE, GARAGE, SHORT_TERM_ACCOMODATION,
274
- OFFICE, GASTRONOMY, INDUSTRY, STORE, SPECIAL_PURPOSE, INVESTMENT.
275
-
412
+ server.tool("create_property", `Create a new property (Objekt) in Propstack CRM.
413
+
414
+ Use this tool to:
415
+ - List a new property from an acquisition call
416
+ - Create a listing from an owner inquiry
417
+ - Add a property to a project
418
+
419
+ Use get_property_statuses to look up valid status IDs.
420
+ Use the relationships_attributes array to link an owner contact on creation.
421
+
422
+ rs_type values: APARTMENT, HOUSE, TRADE_SITE, GARAGE, SHORT_TERM_ACCOMODATION,
423
+ OFFICE, GASTRONOMY, INDUSTRY, STORE, SPECIAL_PURPOSE, INVESTMENT.
424
+
276
425
  rs_category provides sub-types (e.g. PENTHOUSE, VILLA, MAISONETTE for APARTMENT/HOUSE).`, {
277
426
  title: z.string().optional()
278
427
  .describe("Property title / headline"),
@@ -312,6 +461,7 @@ rs_category provides sub-types (e.g. PENTHOUSE, VILLA, MAISONETTE for APARTMENT/
312
461
  // Commission
313
462
  courtage: z.string().optional().describe("Commission amount or percentage"),
314
463
  courtage_note: z.string().optional().describe("Commission details/notes"),
464
+ ...GERMAN_RESIDENTIAL_PROPERTY_FIELDS,
315
465
  // Assignment
316
466
  broker_id: z.number().optional().describe("Assigned broker ID"),
317
467
  project_id: z.number().optional().describe("Project ID this property belongs to"),
@@ -334,16 +484,16 @@ rs_category provides sub-types (e.g. PENTHOUSE, VILLA, MAISONETTE for APARTMENT/
334
484
  }
335
485
  });
336
486
  // ── update_property ──────────────────────────────────────────────
337
- server.tool("update_property", `Update an existing property in Propstack CRM.
338
-
339
- Use this tool to:
340
- - Update the price or rent
341
- - Change property status (e.g. mark as reserved or sold)
342
- - Edit description texts
343
- - Assign to a different broker or project
344
- - Update custom fields
345
-
346
- Only provide the fields you want to change.
487
+ server.tool("update_property", `Update an existing property in Propstack CRM.
488
+
489
+ Use this tool to:
490
+ - Update the price or rent
491
+ - Change property status (e.g. mark as reserved or sold)
492
+ - Edit description texts
493
+ - Assign to a different broker or project
494
+ - Update custom fields
495
+
496
+ Only provide the fields you want to change.
347
497
  Use get_property_statuses to look up valid status IDs.`, {
348
498
  id: z.number()
349
499
  .describe("Property ID to update"),
@@ -375,6 +525,7 @@ Use get_property_statuses to look up valid status IDs.`, {
375
525
  other_note: z.string().optional().describe("Additional notes text"),
376
526
  courtage: z.string().optional().describe("Commission amount or percentage"),
377
527
  courtage_note: z.string().optional().describe("Commission details"),
528
+ ...GERMAN_RESIDENTIAL_PROPERTY_FIELDS,
378
529
  broker_id: z.number().optional().describe("Assigned broker ID"),
379
530
  project_id: z.number().optional().describe("Project ID"),
380
531
  status: z.number().optional().describe("Property status ID (use get_property_statuses)"),
@@ -391,13 +542,13 @@ Use get_property_statuses to look up valid status IDs.`, {
391
542
  }
392
543
  });
393
544
  // ── get_property_statuses ────────────────────────────────────────
394
- server.tool("get_property_statuses", `List all available property statuses in Propstack.
395
-
396
- Returns statuses like "Verfügbar", "Reserviert", "Verkauft" with their IDs,
397
- colors, and sort positions.
398
-
399
- Use this tool to look up valid status IDs before:
400
- - Filtering properties by status in search_properties
545
+ server.tool("get_property_statuses", `List all available property statuses in Propstack.
546
+
547
+ Returns statuses like "Verfügbar", "Reserviert", "Verkauft" with their IDs,
548
+ colors, and sort positions.
549
+
550
+ Use this tool to look up valid status IDs before:
551
+ - Filtering properties by status in search_properties
401
552
  - Setting a property's status in create_property or update_property`, {}, async () => {
402
553
  try {
403
554
  const res = await client.get("/property_statuses");