@burdenoff/mcp-libs 2026.626.1 → 2026.627.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.
Files changed (61) hide show
  1. package/dist/modules/assethandler/index.cjs +1601 -0
  2. package/dist/modules/assethandler/index.cjs.map +1 -0
  3. package/dist/modules/assethandler/index.d.cts +8 -0
  4. package/dist/modules/assethandler/index.d.ts +8 -0
  5. package/dist/modules/assethandler/index.js +1540 -0
  6. package/dist/modules/assethandler/index.js.map +1 -0
  7. package/dist/modules/crewfoundry/index.cjs +1598 -0
  8. package/dist/modules/crewfoundry/index.cjs.map +1 -0
  9. package/dist/modules/crewfoundry/index.d.cts +8 -0
  10. package/dist/modules/crewfoundry/index.d.ts +8 -0
  11. package/dist/modules/crewfoundry/index.js +1537 -0
  12. package/dist/modules/crewfoundry/index.js.map +1 -0
  13. package/dist/modules/eventfullymanaged/index.cjs +3364 -0
  14. package/dist/modules/eventfullymanaged/index.cjs.map +1 -0
  15. package/dist/modules/eventfullymanaged/index.d.cts +8 -0
  16. package/dist/modules/eventfullymanaged/index.d.ts +8 -0
  17. package/dist/modules/eventfullymanaged/index.js +3303 -0
  18. package/dist/modules/eventfullymanaged/index.js.map +1 -0
  19. package/dist/modules/ggnomad/index.cjs +1068 -0
  20. package/dist/modules/ggnomad/index.cjs.map +1 -0
  21. package/dist/modules/ggnomad/index.d.cts +8 -0
  22. package/dist/modules/ggnomad/index.d.ts +8 -0
  23. package/dist/modules/ggnomad/index.js +1007 -0
  24. package/dist/modules/ggnomad/index.js.map +1 -0
  25. package/dist/modules/headshotmarketing/index.cjs +5031 -0
  26. package/dist/modules/headshotmarketing/index.cjs.map +1 -0
  27. package/dist/modules/headshotmarketing/index.d.cts +8 -0
  28. package/dist/modules/headshotmarketing/index.d.ts +8 -0
  29. package/dist/modules/headshotmarketing/index.js +4970 -0
  30. package/dist/modules/headshotmarketing/index.js.map +1 -0
  31. package/dist/modules/housingvista/index.cjs +1092 -0
  32. package/dist/modules/housingvista/index.cjs.map +1 -0
  33. package/dist/modules/housingvista/index.d.cts +8 -0
  34. package/dist/modules/housingvista/index.d.ts +8 -0
  35. package/dist/modules/housingvista/index.js +1031 -0
  36. package/dist/modules/housingvista/index.js.map +1 -0
  37. package/dist/modules/movethewheels/index.cjs +3915 -0
  38. package/dist/modules/movethewheels/index.cjs.map +1 -0
  39. package/dist/modules/movethewheels/index.d.cts +8 -0
  40. package/dist/modules/movethewheels/index.d.ts +8 -0
  41. package/dist/modules/movethewheels/index.js +3854 -0
  42. package/dist/modules/movethewheels/index.js.map +1 -0
  43. package/dist/modules/planmagnet/index.cjs +6171 -0
  44. package/dist/modules/planmagnet/index.cjs.map +1 -0
  45. package/dist/modules/planmagnet/index.d.cts +8 -0
  46. package/dist/modules/planmagnet/index.d.ts +8 -0
  47. package/dist/modules/planmagnet/index.js +6110 -0
  48. package/dist/modules/planmagnet/index.js.map +1 -0
  49. package/dist/modules/proserviceworld/index.cjs +1404 -0
  50. package/dist/modules/proserviceworld/index.cjs.map +1 -0
  51. package/dist/modules/proserviceworld/index.d.cts +8 -0
  52. package/dist/modules/proserviceworld/index.d.ts +8 -0
  53. package/dist/modules/proserviceworld/index.js +1343 -0
  54. package/dist/modules/proserviceworld/index.js.map +1 -0
  55. package/dist/modules/timecampus/index.cjs +6482 -0
  56. package/dist/modules/timecampus/index.cjs.map +1 -0
  57. package/dist/modules/timecampus/index.d.cts +8 -0
  58. package/dist/modules/timecampus/index.d.ts +8 -0
  59. package/dist/modules/timecampus/index.js +6421 -0
  60. package/dist/modules/timecampus/index.js.map +1 -0
  61. package/package.json +1 -1
@@ -0,0 +1,1092 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+ require('graphql-request');
5
+ require('cross-fetch');
6
+ require('@modelcontextprotocol/sdk/server/mcp.js');
7
+ require('@modelcontextprotocol/sdk/types.js');
8
+
9
+ // src/modules/housingvista/tools/properties.ts
10
+
11
+ // src/core/errors.ts
12
+ var McpInternalError = class extends Error {
13
+ cause;
14
+ constructor(message, cause) {
15
+ super(message);
16
+ this.name = "McpInternalError";
17
+ this.cause = cause;
18
+ }
19
+ };
20
+
21
+ // src/core/result.ts
22
+ function jsonResult(data, structured) {
23
+ const result = {
24
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }]
25
+ };
26
+ return result;
27
+ }
28
+ function errorResult(message, hint) {
29
+ const text = hint ? `${message}
30
+
31
+ Hint: ${hint}` : message;
32
+ return { content: [{ type: "text", text }], isError: true };
33
+ }
34
+
35
+ // src/core/tool-name.ts
36
+ var MAX_TOOL_NAME_LENGTH = 63;
37
+ function assertSafeName(name, kind) {
38
+ if (name.length > MAX_TOOL_NAME_LENGTH) {
39
+ throw new McpInternalError(
40
+ `Tool name '${name}' exceeds ${MAX_TOOL_NAME_LENGTH} characters (some MCP clients truncate at 64).`
41
+ );
42
+ }
43
+ return name;
44
+ }
45
+ function mcpToolName(productName, ...parts) {
46
+ if (!productName) {
47
+ throw new McpInternalError("mcpToolName: productName is required");
48
+ }
49
+ const name = [productName, ...parts].filter(Boolean).join("_");
50
+ return assertSafeName(name);
51
+ }
52
+ function mcpResourceUri(productName, ...parts) {
53
+ if (!productName) {
54
+ throw new McpInternalError("mcpResourceUri: productName is required");
55
+ }
56
+ return `${productName}://${parts.filter(Boolean).join("/")}`;
57
+ }
58
+ function mcpPromptName(productName, ...parts) {
59
+ if (!productName) {
60
+ throw new McpInternalError("mcpPromptName: productName is required");
61
+ }
62
+ return [productName, ...parts].filter(Boolean).join("-");
63
+ }
64
+
65
+ // src/modules/housingvista/operations.ts
66
+ var PROPERTY_FIELDS = `
67
+ id title description category type status price totalArea bedrooms bathrooms
68
+ city state imageUrl context workspaceId createdAt updatedAt
69
+ `;
70
+ var PROPERTY_REF_FIELDS = `id title city state price status type`;
71
+ var INVESTMENT_FIELDS = `
72
+ id title investmentType totalValue riskLevel status investors returns
73
+ propertyId workspaceId createdAt updatedAt
74
+ property { ${PROPERTY_REF_FIELDS} }
75
+ `;
76
+ var TRANSACTION_FIELDS = `
77
+ id title type status amount currency parties milestones escrow documents
78
+ propertyId workspaceId createdAt updatedAt
79
+ property { ${PROPERTY_REF_FIELDS} }
80
+ `;
81
+ var RENTAL_UNIT_FIELDS = `
82
+ id unitNumber propertyId propertyTitle tenantName tenantEmail tenantPhone
83
+ monthlyRent securityDeposit leaseStart leaseEnd status paymentStatus lastPaymentAt
84
+ `;
85
+ var AMC_CONTRACT_FIELDS = `
86
+ id packageName providerName propertyTitle status monthlyCost startDate endDate
87
+ nextServiceDate servicesIncluded
88
+ `;
89
+ var ASSET_FIELDS = `
90
+ id title type category status location currentValue purchasePrice
91
+ appreciationPercent rentalYield imageUrl
92
+ `;
93
+ var MARKETPLACE_SERVICE_FIELDS = `
94
+ id name category description providerName rating reviewCount priceRange
95
+ responseTime availableAreas featured verified imageUrl
96
+ `;
97
+ var LEGAL_SERVICE_FIELDS = `
98
+ id title category description providerName providerRating status consultationFee
99
+ priceRange estimatedDuration documentsRequired features
100
+ `;
101
+ var AREA_INSIGHT_FIELDS = `
102
+ id areaName city avgPropertyPrice avgRentalYield appreciationRate population
103
+ safetyScore connectivityScore amenitiesScore greenCoverPercent schoolsNearby
104
+ hospitalsNearby upcomingProjects
105
+ `;
106
+ var MARKET_TREND_FIELDS = `
107
+ id monthLabel avgPrice avgRent priceChangePercent demandIndex supplyIndex
108
+ `;
109
+ var HOME_LOAN_OFFER_FIELDS = `
110
+ id bankName interestRate maxAmount maxTenure processingFee prepaymentCharges
111
+ emiPerLakh rating specialOffer features
112
+ `;
113
+ var VERIFICATION_ITEM_FIELDS = `
114
+ id entityType entityLabel status priority notes submittedAt
115
+ `;
116
+ var DASHBOARD_STATS_FIELDS = `
117
+ totalProperties totalValue totalPortfolioValue totalInvestments investmentReturns
118
+ monthlyRevenue occupancyRate totalTenants activeTransactions pendingVerifications
119
+ maintenanceRequests upcomingViewings unreadMessages
120
+ `;
121
+ var GET_PROPERTY = `
122
+ query HousingVistaProperty($id: ID!) {
123
+ housingvistaProperty(id: $id) {
124
+ ${PROPERTY_FIELDS}
125
+ }
126
+ }
127
+ `;
128
+ var LIST_PROPERTIES = `
129
+ query HousingVistaProperties(
130
+ $filter: HousingVistaPropertyFilterInput
131
+ $pagination: HousingVistaPaginationInput
132
+ ) {
133
+ housingvistaProperties(filter: $filter, pagination: $pagination) {
134
+ ${PROPERTY_FIELDS}
135
+ }
136
+ }
137
+ `;
138
+ var CREATE_PROPERTY = `
139
+ mutation HousingVistaCreateProperty($input: CreatePropertyInput!) {
140
+ createHousingvistaProperty(input: $input) {
141
+ ${PROPERTY_FIELDS}
142
+ }
143
+ }
144
+ `;
145
+ var UPDATE_PROPERTY = `
146
+ mutation HousingVistaUpdateProperty($id: ID!, $input: UpdatePropertyInput!) {
147
+ updateHousingvistaProperty(id: $id, input: $input) {
148
+ ${PROPERTY_FIELDS}
149
+ }
150
+ }
151
+ `;
152
+ var DELETE_PROPERTY = `
153
+ mutation HousingVistaDeleteProperty($id: ID!) {
154
+ deleteHousingvistaProperty(id: $id)
155
+ }
156
+ `;
157
+ var GET_INVESTMENT = `
158
+ query HousingVistaInvestment($id: ID!) {
159
+ housingvistaInvestment(id: $id) {
160
+ ${INVESTMENT_FIELDS}
161
+ }
162
+ }
163
+ `;
164
+ var LIST_INVESTMENTS = `
165
+ query HousingVistaInvestments($pagination: HousingVistaPaginationInput) {
166
+ housingvistaInvestments(pagination: $pagination) {
167
+ ${INVESTMENT_FIELDS}
168
+ }
169
+ }
170
+ `;
171
+ var GET_TRANSACTION = `
172
+ query HousingVistaTransaction($id: ID!) {
173
+ housingvistaTransaction(id: $id) {
174
+ ${TRANSACTION_FIELDS}
175
+ }
176
+ }
177
+ `;
178
+ var LIST_TRANSACTIONS = `
179
+ query HousingVistaTransactions($pagination: HousingVistaPaginationInput) {
180
+ housingvistaTransactions(pagination: $pagination) {
181
+ ${TRANSACTION_FIELDS}
182
+ }
183
+ }
184
+ `;
185
+ var LIST_RENTAL_UNITS = `
186
+ query HousingVistaRentalUnits($pagination: HousingVistaPaginationInput) {
187
+ housingvistaRentalUnits(pagination: $pagination) {
188
+ ${RENTAL_UNIT_FIELDS}
189
+ }
190
+ }
191
+ `;
192
+ var LIST_AMC_CONTRACTS = `
193
+ query HousingVistaAmcContracts($pagination: HousingVistaPaginationInput) {
194
+ housingvistaAmcContracts(pagination: $pagination) {
195
+ ${AMC_CONTRACT_FIELDS}
196
+ }
197
+ }
198
+ `;
199
+ var LIST_ASSETS = `
200
+ query HousingVistaAssets($pagination: HousingVistaPaginationInput) {
201
+ housingvistaAssets(pagination: $pagination) {
202
+ ${ASSET_FIELDS}
203
+ }
204
+ }
205
+ `;
206
+ var LIST_MARKETPLACE_SERVICES = `
207
+ query HousingVistaMarketplaceServices($pagination: HousingVistaPaginationInput) {
208
+ housingvistaMarketplaceServices(pagination: $pagination) {
209
+ ${MARKETPLACE_SERVICE_FIELDS}
210
+ }
211
+ }
212
+ `;
213
+ var LIST_LEGAL_SERVICES = `
214
+ query HousingVistaLegalServices($pagination: HousingVistaPaginationInput) {
215
+ housingvistaLegalServices(pagination: $pagination) {
216
+ ${LEGAL_SERVICE_FIELDS}
217
+ }
218
+ }
219
+ `;
220
+ var LIST_AREA_INSIGHTS = `
221
+ query HousingVistaAreaInsights($pagination: HousingVistaPaginationInput) {
222
+ housingvistaAreaInsights(pagination: $pagination) {
223
+ ${AREA_INSIGHT_FIELDS}
224
+ }
225
+ }
226
+ `;
227
+ var LIST_MARKET_TRENDS = `
228
+ query HousingVistaMarketTrends($pagination: HousingVistaPaginationInput) {
229
+ housingvistaMarketTrends(pagination: $pagination) {
230
+ ${MARKET_TREND_FIELDS}
231
+ }
232
+ }
233
+ `;
234
+ var LIST_HOME_LOAN_OFFERS = `
235
+ query HousingVistaHomeLoanOffers($pagination: HousingVistaPaginationInput) {
236
+ housingvistaHomeLoanOffers(pagination: $pagination) {
237
+ ${HOME_LOAN_OFFER_FIELDS}
238
+ }
239
+ }
240
+ `;
241
+ var LIST_VERIFICATION_ITEMS = `
242
+ query HousingVistaVerificationItems($pagination: HousingVistaPaginationInput) {
243
+ housingvistaVerificationItems(pagination: $pagination) {
244
+ ${VERIFICATION_ITEM_FIELDS}
245
+ }
246
+ }
247
+ `;
248
+ var DASHBOARD_STATS = `
249
+ query HousingVistaDashboardStats {
250
+ housingvistaDashboardStats {
251
+ ${DASHBOARD_STATS_FIELDS}
252
+ }
253
+ }
254
+ `;
255
+ var PropertyStatusEnum = zod.z.enum(["for_rent", "for_sale", "off_market", "rented", "sold", "under_contract"]).describe("Listing/market status of a property");
256
+ var PropertyTypeEnum = zod.z.enum(["agricultural", "commercial", "industrial", "mixed_use", "residential"]).describe("Physical use-class of a property");
257
+ var JsonObject = zod.z.record(zod.z.string(), zod.z.unknown());
258
+
259
+ // src/modules/housingvista/tools/properties.ts
260
+ function registerPropertyTools(server, ctx, track) {
261
+ server.registerTool(
262
+ track(mcpToolName(ctx.productName, "properties_get")),
263
+ {
264
+ title: "Get Property",
265
+ description: "Fetch a single HousingVista property listing by ID.",
266
+ inputSchema: { id: zod.z.string().describe("Property ID") }
267
+ },
268
+ async ({ id }) => {
269
+ try {
270
+ const data = await ctx.gql.workspace.request(GET_PROPERTY, { id });
271
+ if (!data.housingvistaProperty) return errorResult(`Property ${id} not found`);
272
+ return jsonResult(data.housingvistaProperty);
273
+ } catch (error) {
274
+ ctx.logger.error("housingvista properties_get failed", { error: String(error) });
275
+ return errorResult(
276
+ `Failed to get property: ${error instanceof Error ? error.message : String(error)}`
277
+ );
278
+ }
279
+ }
280
+ );
281
+ server.registerTool(
282
+ track(mcpToolName(ctx.productName, "properties_list")),
283
+ {
284
+ title: "List Properties",
285
+ description: "List property listings in the bound workspace with optional city/status/type/text filters and pagination.",
286
+ inputSchema: {
287
+ city: zod.z.string().optional().describe("Filter by city"),
288
+ status: PropertyStatusEnum.optional().describe("Filter by listing status"),
289
+ type: PropertyTypeEnum.optional().describe("Filter by property use-class"),
290
+ search: zod.z.string().optional().describe("Free-text search across title/description"),
291
+ limit: zod.z.number().int().optional().describe("Page size (default 50)"),
292
+ offset: zod.z.number().int().optional().describe("Pagination offset (default 0)")
293
+ }
294
+ },
295
+ async ({ city, status, type, search, limit, offset }) => {
296
+ try {
297
+ const filter = {};
298
+ if (city !== void 0) filter.city = city;
299
+ if (status !== void 0) filter.status = status;
300
+ if (type !== void 0) filter.type = type;
301
+ if (search !== void 0) filter.search = search;
302
+ const data = await ctx.gql.workspace.request(LIST_PROPERTIES, {
303
+ filter: Object.keys(filter).length > 0 ? filter : void 0,
304
+ pagination: { limit: limit ?? 50, offset: offset ?? 0 }
305
+ });
306
+ return jsonResult(data.housingvistaProperties);
307
+ } catch (error) {
308
+ ctx.logger.error("housingvista properties_list failed", { error: String(error) });
309
+ return errorResult(
310
+ `Failed to list properties: ${error instanceof Error ? error.message : String(error)}`
311
+ );
312
+ }
313
+ }
314
+ );
315
+ server.registerTool(
316
+ track(mcpToolName(ctx.productName, "properties_create")),
317
+ {
318
+ title: "Create Property",
319
+ description: 'Create a new property listing. `type` and `status` are required enums; `category` is a free-form label (e.g. "Apartment", "Villa", "Plot").',
320
+ inputSchema: {
321
+ title: zod.z.string().min(1).describe("Listing title"),
322
+ category: zod.z.string().min(1).describe('Free-form category label, e.g. "Apartment", "Villa"'),
323
+ type: PropertyTypeEnum.describe("Property use-class"),
324
+ status: PropertyStatusEnum.describe("Initial listing status"),
325
+ price: zod.z.number().describe("Asking / listed price"),
326
+ totalArea: zod.z.number().describe("Total area (e.g. sq ft)"),
327
+ bedrooms: zod.z.number().int().describe("Number of bedrooms"),
328
+ bathrooms: zod.z.number().int().describe("Number of bathrooms"),
329
+ city: zod.z.string().min(1).describe("City"),
330
+ state: zod.z.string().min(1).describe("State"),
331
+ description: zod.z.string().optional().describe("Listing description"),
332
+ imageUrl: zod.z.string().optional().describe("Primary image URL"),
333
+ context: JsonObject.optional().describe(
334
+ "Arbitrary context JSON (amenities, metadata, etc.)"
335
+ )
336
+ }
337
+ },
338
+ async ({
339
+ title,
340
+ category,
341
+ type,
342
+ status,
343
+ price,
344
+ totalArea,
345
+ bedrooms,
346
+ bathrooms,
347
+ city,
348
+ state,
349
+ description,
350
+ imageUrl,
351
+ context
352
+ }) => {
353
+ try {
354
+ const input = {
355
+ title,
356
+ category,
357
+ type,
358
+ status,
359
+ price,
360
+ totalArea,
361
+ bedrooms,
362
+ bathrooms,
363
+ city,
364
+ state
365
+ };
366
+ if (description !== void 0) input.description = description;
367
+ if (imageUrl !== void 0) input.imageUrl = imageUrl;
368
+ if (context !== void 0) input.context = context;
369
+ const data = await ctx.gql.workspace.request(CREATE_PROPERTY, { input });
370
+ return jsonResult(data.createHousingvistaProperty);
371
+ } catch (error) {
372
+ ctx.logger.error("housingvista properties_create failed", { error: String(error) });
373
+ return errorResult(
374
+ `Failed to create property: ${error instanceof Error ? error.message : String(error)}`
375
+ );
376
+ }
377
+ }
378
+ );
379
+ server.registerTool(
380
+ track(mcpToolName(ctx.productName, "properties_update")),
381
+ {
382
+ title: "Update Property",
383
+ description: "Update a property listing. At least one mutable field must be provided. Use `status` to move a listing through its market lifecycle.",
384
+ inputSchema: {
385
+ id: zod.z.string().describe("Property ID"),
386
+ title: zod.z.string().optional().describe("Updated title"),
387
+ category: zod.z.string().optional().describe("Updated category label"),
388
+ type: PropertyTypeEnum.optional().describe("Updated use-class"),
389
+ status: PropertyStatusEnum.optional().describe("Updated listing status"),
390
+ price: zod.z.number().optional().describe("Updated price"),
391
+ totalArea: zod.z.number().optional().describe("Updated total area"),
392
+ bedrooms: zod.z.number().int().optional().describe("Updated bedroom count"),
393
+ bathrooms: zod.z.number().int().optional().describe("Updated bathroom count"),
394
+ city: zod.z.string().optional().describe("Updated city"),
395
+ state: zod.z.string().optional().describe("Updated state"),
396
+ description: zod.z.string().optional().describe("Updated description"),
397
+ imageUrl: zod.z.string().optional().describe("Updated primary image URL"),
398
+ context: JsonObject.optional().describe("Updated context JSON")
399
+ }
400
+ },
401
+ async ({
402
+ id,
403
+ title,
404
+ category,
405
+ type,
406
+ status,
407
+ price,
408
+ totalArea,
409
+ bedrooms,
410
+ bathrooms,
411
+ city,
412
+ state,
413
+ description,
414
+ imageUrl,
415
+ context
416
+ }) => {
417
+ try {
418
+ const input = {};
419
+ if (title !== void 0) input.title = title;
420
+ if (category !== void 0) input.category = category;
421
+ if (type !== void 0) input.type = type;
422
+ if (status !== void 0) input.status = status;
423
+ if (price !== void 0) input.price = price;
424
+ if (totalArea !== void 0) input.totalArea = totalArea;
425
+ if (bedrooms !== void 0) input.bedrooms = bedrooms;
426
+ if (bathrooms !== void 0) input.bathrooms = bathrooms;
427
+ if (city !== void 0) input.city = city;
428
+ if (state !== void 0) input.state = state;
429
+ if (description !== void 0) input.description = description;
430
+ if (imageUrl !== void 0) input.imageUrl = imageUrl;
431
+ if (context !== void 0) input.context = context;
432
+ if (Object.keys(input).length === 0) {
433
+ return errorResult(
434
+ "No updates specified \u2014 provide at least one mutable property field (title/category/type/status/price/totalArea/bedrooms/bathrooms/city/state/description/imageUrl/context)"
435
+ );
436
+ }
437
+ const data = await ctx.gql.workspace.request(UPDATE_PROPERTY, { id, input });
438
+ return jsonResult(data.updateHousingvistaProperty);
439
+ } catch (error) {
440
+ ctx.logger.error("housingvista properties_update failed", { error: String(error) });
441
+ return errorResult(
442
+ `Failed to update property: ${error instanceof Error ? error.message : String(error)}`
443
+ );
444
+ }
445
+ }
446
+ );
447
+ server.registerTool(
448
+ track(mcpToolName(ctx.productName, "properties_delete")),
449
+ {
450
+ title: "Delete Property",
451
+ description: "Delete a property listing by ID. Returns true on success.",
452
+ inputSchema: { id: zod.z.string().describe("Property ID") }
453
+ },
454
+ async ({ id }) => {
455
+ try {
456
+ const data = await ctx.gql.workspace.request(DELETE_PROPERTY, { id });
457
+ return jsonResult({ deleted: data.deleteHousingvistaProperty, id });
458
+ } catch (error) {
459
+ ctx.logger.error("housingvista properties_delete failed", { error: String(error) });
460
+ return errorResult(
461
+ `Failed to delete property: ${error instanceof Error ? error.message : String(error)}`
462
+ );
463
+ }
464
+ }
465
+ );
466
+ }
467
+ function registerInvestmentTools(server, ctx, track) {
468
+ server.registerTool(
469
+ track(mcpToolName(ctx.productName, "investments_get")),
470
+ {
471
+ title: "Get Investment",
472
+ description: "Fetch a single HousingVista property investment by ID, including its property, investors, and returns.",
473
+ inputSchema: { id: zod.z.string().describe("Investment ID") }
474
+ },
475
+ async ({ id }) => {
476
+ try {
477
+ const data = await ctx.gql.workspace.request(GET_INVESTMENT, { id });
478
+ if (!data.housingvistaInvestment) return errorResult(`Investment ${id} not found`);
479
+ return jsonResult(data.housingvistaInvestment);
480
+ } catch (error) {
481
+ ctx.logger.error("housingvista investments_get failed", { error: String(error) });
482
+ return errorResult(
483
+ `Failed to get investment: ${error instanceof Error ? error.message : String(error)}`
484
+ );
485
+ }
486
+ }
487
+ );
488
+ server.registerTool(
489
+ track(mcpToolName(ctx.productName, "investments_list")),
490
+ {
491
+ title: "List Investments",
492
+ description: "List property-investment vehicles in the bound workspace with pagination.",
493
+ inputSchema: {
494
+ limit: zod.z.number().int().optional().describe("Page size (default 50)"),
495
+ offset: zod.z.number().int().optional().describe("Pagination offset (default 0)")
496
+ }
497
+ },
498
+ async ({ limit, offset }) => {
499
+ try {
500
+ const data = await ctx.gql.workspace.request(LIST_INVESTMENTS, {
501
+ pagination: { limit: limit ?? 50, offset: offset ?? 0 }
502
+ });
503
+ return jsonResult(data.housingvistaInvestments);
504
+ } catch (error) {
505
+ ctx.logger.error("housingvista investments_list failed", { error: String(error) });
506
+ return errorResult(
507
+ `Failed to list investments: ${error instanceof Error ? error.message : String(error)}`
508
+ );
509
+ }
510
+ }
511
+ );
512
+ }
513
+ function registerTransactionTools(server, ctx, track) {
514
+ server.registerTool(
515
+ track(mcpToolName(ctx.productName, "transactions_get")),
516
+ {
517
+ title: "Get Transaction",
518
+ description: "Fetch a single HousingVista property transaction by ID, including its property, parties, milestones, escrow, and documents.",
519
+ inputSchema: { id: zod.z.string().describe("Transaction ID") }
520
+ },
521
+ async ({ id }) => {
522
+ try {
523
+ const data = await ctx.gql.workspace.request(GET_TRANSACTION, { id });
524
+ if (!data.housingvistaTransaction) return errorResult(`Transaction ${id} not found`);
525
+ return jsonResult(data.housingvistaTransaction);
526
+ } catch (error) {
527
+ ctx.logger.error("housingvista transactions_get failed", { error: String(error) });
528
+ return errorResult(
529
+ `Failed to get transaction: ${error instanceof Error ? error.message : String(error)}`
530
+ );
531
+ }
532
+ }
533
+ );
534
+ server.registerTool(
535
+ track(mcpToolName(ctx.productName, "transactions_list")),
536
+ {
537
+ title: "List Transactions",
538
+ description: "List property transactions (deal pipeline) in the bound workspace with pagination.",
539
+ inputSchema: {
540
+ limit: zod.z.number().int().optional().describe("Page size (default 50)"),
541
+ offset: zod.z.number().int().optional().describe("Pagination offset (default 0)")
542
+ }
543
+ },
544
+ async ({ limit, offset }) => {
545
+ try {
546
+ const data = await ctx.gql.workspace.request(LIST_TRANSACTIONS, {
547
+ pagination: { limit: limit ?? 50, offset: offset ?? 0 }
548
+ });
549
+ return jsonResult(data.housingvistaTransactions);
550
+ } catch (error) {
551
+ ctx.logger.error("housingvista transactions_list failed", { error: String(error) });
552
+ return errorResult(
553
+ `Failed to list transactions: ${error instanceof Error ? error.message : String(error)}`
554
+ );
555
+ }
556
+ }
557
+ );
558
+ }
559
+ function registerLeasingTools(server, ctx, track) {
560
+ server.registerTool(
561
+ track(mcpToolName(ctx.productName, "rentals_list")),
562
+ {
563
+ title: "List Rental Units",
564
+ description: "List rental units (tenancies) in the bound workspace \u2014 tenant, lease window, monthly rent, and payment status \u2014 with pagination.",
565
+ inputSchema: {
566
+ limit: zod.z.number().int().optional().describe("Page size (default 50)"),
567
+ offset: zod.z.number().int().optional().describe("Pagination offset (default 0)")
568
+ }
569
+ },
570
+ async ({ limit, offset }) => {
571
+ try {
572
+ const data = await ctx.gql.workspace.request(LIST_RENTAL_UNITS, {
573
+ pagination: { limit: limit ?? 50, offset: offset ?? 0 }
574
+ });
575
+ return jsonResult(data.housingvistaRentalUnits);
576
+ } catch (error) {
577
+ ctx.logger.error("housingvista rentals_list failed", { error: String(error) });
578
+ return errorResult(
579
+ `Failed to list rental units: ${error instanceof Error ? error.message : String(error)}`
580
+ );
581
+ }
582
+ }
583
+ );
584
+ server.registerTool(
585
+ track(mcpToolName(ctx.productName, "amc_list")),
586
+ {
587
+ title: "List AMC Contracts",
588
+ description: "List annual maintenance contracts (AMC) in the bound workspace \u2014 package, provider, cost, and next service date \u2014 with pagination.",
589
+ inputSchema: {
590
+ limit: zod.z.number().int().optional().describe("Page size (default 50)"),
591
+ offset: zod.z.number().int().optional().describe("Pagination offset (default 0)")
592
+ }
593
+ },
594
+ async ({ limit, offset }) => {
595
+ try {
596
+ const data = await ctx.gql.workspace.request(LIST_AMC_CONTRACTS, {
597
+ pagination: { limit: limit ?? 50, offset: offset ?? 0 }
598
+ });
599
+ return jsonResult(data.housingvistaAmcContracts);
600
+ } catch (error) {
601
+ ctx.logger.error("housingvista amc_list failed", { error: String(error) });
602
+ return errorResult(
603
+ `Failed to list AMC contracts: ${error instanceof Error ? error.message : String(error)}`
604
+ );
605
+ }
606
+ }
607
+ );
608
+ }
609
+ function registerAssetTools(server, ctx, track) {
610
+ server.registerTool(
611
+ track(mcpToolName(ctx.productName, "assets_list")),
612
+ {
613
+ title: "List Assets",
614
+ description: "List owned real-estate assets in the bound workspace \u2014 current value, purchase price, appreciation, and rental yield \u2014 with pagination.",
615
+ inputSchema: {
616
+ limit: zod.z.number().int().optional().describe("Page size (default 50)"),
617
+ offset: zod.z.number().int().optional().describe("Pagination offset (default 0)")
618
+ }
619
+ },
620
+ async ({ limit, offset }) => {
621
+ try {
622
+ const data = await ctx.gql.workspace.request(LIST_ASSETS, {
623
+ pagination: { limit: limit ?? 50, offset: offset ?? 0 }
624
+ });
625
+ return jsonResult(data.housingvistaAssets);
626
+ } catch (error) {
627
+ ctx.logger.error("housingvista assets_list failed", { error: String(error) });
628
+ return errorResult(
629
+ `Failed to list assets: ${error instanceof Error ? error.message : String(error)}`
630
+ );
631
+ }
632
+ }
633
+ );
634
+ }
635
+ function registerMarketplaceTools(server, ctx, track) {
636
+ server.registerTool(
637
+ track(mcpToolName(ctx.productName, "marketplace_services_list")),
638
+ {
639
+ title: "List Marketplace Services",
640
+ description: "List vendor marketplace services in the bound workspace \u2014 provider, rating, price range, coverage areas, and verification flag \u2014 with pagination.",
641
+ inputSchema: {
642
+ limit: zod.z.number().int().optional().describe("Page size (default 50)"),
643
+ offset: zod.z.number().int().optional().describe("Pagination offset (default 0)")
644
+ }
645
+ },
646
+ async ({ limit, offset }) => {
647
+ try {
648
+ const data = await ctx.gql.workspace.request(LIST_MARKETPLACE_SERVICES, {
649
+ pagination: { limit: limit ?? 50, offset: offset ?? 0 }
650
+ });
651
+ return jsonResult(data.housingvistaMarketplaceServices);
652
+ } catch (error) {
653
+ ctx.logger.error("housingvista marketplace_services_list failed", { error: String(error) });
654
+ return errorResult(
655
+ `Failed to list marketplace services: ${error instanceof Error ? error.message : String(error)}`
656
+ );
657
+ }
658
+ }
659
+ );
660
+ server.registerTool(
661
+ track(mcpToolName(ctx.productName, "legal_services_list")),
662
+ {
663
+ title: "List Legal Services",
664
+ description: "List legal/conveyancing services in the bound workspace \u2014 provider, rating, consultation fee, required documents, and estimated duration \u2014 with pagination.",
665
+ inputSchema: {
666
+ limit: zod.z.number().int().optional().describe("Page size (default 50)"),
667
+ offset: zod.z.number().int().optional().describe("Pagination offset (default 0)")
668
+ }
669
+ },
670
+ async ({ limit, offset }) => {
671
+ try {
672
+ const data = await ctx.gql.workspace.request(LIST_LEGAL_SERVICES, {
673
+ pagination: { limit: limit ?? 50, offset: offset ?? 0 }
674
+ });
675
+ return jsonResult(data.housingvistaLegalServices);
676
+ } catch (error) {
677
+ ctx.logger.error("housingvista legal_services_list failed", { error: String(error) });
678
+ return errorResult(
679
+ `Failed to list legal services: ${error instanceof Error ? error.message : String(error)}`
680
+ );
681
+ }
682
+ }
683
+ );
684
+ }
685
+ function registerMarketTools(server, ctx, track) {
686
+ server.registerTool(
687
+ track(mcpToolName(ctx.productName, "market_area_insights")),
688
+ {
689
+ title: "List Area Insights",
690
+ description: "List per-area market insights in the bound workspace \u2014 average price, rental yield, appreciation rate, and liveability scores \u2014 with pagination.",
691
+ inputSchema: {
692
+ limit: zod.z.number().int().optional().describe("Page size (default 50)"),
693
+ offset: zod.z.number().int().optional().describe("Pagination offset (default 0)")
694
+ }
695
+ },
696
+ async ({ limit, offset }) => {
697
+ try {
698
+ const data = await ctx.gql.workspace.request(LIST_AREA_INSIGHTS, {
699
+ pagination: { limit: limit ?? 50, offset: offset ?? 0 }
700
+ });
701
+ return jsonResult(data.housingvistaAreaInsights);
702
+ } catch (error) {
703
+ ctx.logger.error("housingvista market_area_insights failed", { error: String(error) });
704
+ return errorResult(
705
+ `Failed to list area insights: ${error instanceof Error ? error.message : String(error)}`
706
+ );
707
+ }
708
+ }
709
+ );
710
+ server.registerTool(
711
+ track(mcpToolName(ctx.productName, "market_trends")),
712
+ {
713
+ title: "List Market Trends",
714
+ description: "List time-series market trends in the bound workspace \u2014 average price/rent, price change percent, and demand/supply indices by month \u2014 with pagination.",
715
+ inputSchema: {
716
+ limit: zod.z.number().int().optional().describe("Page size (default 50)"),
717
+ offset: zod.z.number().int().optional().describe("Pagination offset (default 0)")
718
+ }
719
+ },
720
+ async ({ limit, offset }) => {
721
+ try {
722
+ const data = await ctx.gql.workspace.request(LIST_MARKET_TRENDS, {
723
+ pagination: { limit: limit ?? 50, offset: offset ?? 0 }
724
+ });
725
+ return jsonResult(data.housingvistaMarketTrends);
726
+ } catch (error) {
727
+ ctx.logger.error("housingvista market_trends failed", { error: String(error) });
728
+ return errorResult(
729
+ `Failed to list market trends: ${error instanceof Error ? error.message : String(error)}`
730
+ );
731
+ }
732
+ }
733
+ );
734
+ server.registerTool(
735
+ track(mcpToolName(ctx.productName, "market_home_loans")),
736
+ {
737
+ title: "List Home Loan Offers",
738
+ description: "List home-loan offers in the bound workspace \u2014 bank, interest rate, max amount/tenure, processing fee, and EMI per lakh \u2014 with pagination.",
739
+ inputSchema: {
740
+ limit: zod.z.number().int().optional().describe("Page size (default 50)"),
741
+ offset: zod.z.number().int().optional().describe("Pagination offset (default 0)")
742
+ }
743
+ },
744
+ async ({ limit, offset }) => {
745
+ try {
746
+ const data = await ctx.gql.workspace.request(LIST_HOME_LOAN_OFFERS, {
747
+ pagination: { limit: limit ?? 50, offset: offset ?? 0 }
748
+ });
749
+ return jsonResult(data.housingvistaHomeLoanOffers);
750
+ } catch (error) {
751
+ ctx.logger.error("housingvista market_home_loans failed", { error: String(error) });
752
+ return errorResult(
753
+ `Failed to list home loan offers: ${error instanceof Error ? error.message : String(error)}`
754
+ );
755
+ }
756
+ }
757
+ );
758
+ }
759
+ function registerVerificationTools(server, ctx, track) {
760
+ server.registerTool(
761
+ track(mcpToolName(ctx.productName, "verification_list")),
762
+ {
763
+ title: "List Verification Items",
764
+ description: "List items in the verification/moderation queue for the bound workspace \u2014 entity type/label, status, and priority \u2014 with pagination.",
765
+ inputSchema: {
766
+ limit: zod.z.number().int().optional().describe("Page size (default 50)"),
767
+ offset: zod.z.number().int().optional().describe("Pagination offset (default 0)")
768
+ }
769
+ },
770
+ async ({ limit, offset }) => {
771
+ try {
772
+ const data = await ctx.gql.workspace.request(LIST_VERIFICATION_ITEMS, {
773
+ pagination: { limit: limit ?? 50, offset: offset ?? 0 }
774
+ });
775
+ return jsonResult(data.housingvistaVerificationItems);
776
+ } catch (error) {
777
+ ctx.logger.error("housingvista verification_list failed", { error: String(error) });
778
+ return errorResult(
779
+ `Failed to list verification items: ${error instanceof Error ? error.message : String(error)}`
780
+ );
781
+ }
782
+ }
783
+ );
784
+ }
785
+
786
+ // src/modules/housingvista/tools/analytics.ts
787
+ function registerAnalyticsTools(server, ctx, track) {
788
+ server.registerTool(
789
+ track(mcpToolName(ctx.productName, "analytics_dashboard")),
790
+ {
791
+ title: "HousingVista Dashboard Stats",
792
+ description: "Headline portfolio KPIs: total properties/value/portfolio-value, investments + returns, monthly revenue, occupancy rate, tenants, active transactions, pending verifications, maintenance requests, upcoming viewings, and unread messages.",
793
+ inputSchema: {}
794
+ },
795
+ async () => {
796
+ try {
797
+ const data = await ctx.gql.workspace.request(DASHBOARD_STATS, {});
798
+ return jsonResult(data.housingvistaDashboardStats);
799
+ } catch (error) {
800
+ ctx.logger.error("housingvista analytics_dashboard failed", { error: String(error) });
801
+ return errorResult(
802
+ `Failed to get dashboard stats: ${error instanceof Error ? error.message : String(error)}`
803
+ );
804
+ }
805
+ }
806
+ );
807
+ }
808
+
809
+ // src/modules/housingvista/resources.ts
810
+ function registerHousingVistaResources(server, ctx, track) {
811
+ const schemaUri = track(mcpResourceUri(ctx.productName, "schema"));
812
+ const dashboardUri = track(mcpResourceUri(ctx.productName, "dashboard"));
813
+ const propertiesUri = track(mcpResourceUri(ctx.productName, "properties"));
814
+ const marketUri = track(mcpResourceUri(ctx.productName, "market"));
815
+ server.registerResource(
816
+ "housingvista-schema",
817
+ schemaUri,
818
+ {
819
+ title: "HousingVista Domain Schema",
820
+ description: "Overview of the HousingVista real-estate domain \u2014 entities, enums, and the per-entity tool surface.",
821
+ mimeType: "text/plain"
822
+ },
823
+ async () => {
824
+ ctx.logger.debug(`Resource ${schemaUri} requested`);
825
+ const schema = `# HousingVista Domain (Overview)
826
+
827
+ End-to-end real-estate platform: listings, transactions, investments, rentals,
828
+ maintenance contracts, a services marketplace, market intelligence, and a
829
+ verification queue.
830
+
831
+ ## Entities
832
+ - Property \u2014 a property listing (the core entity; full CRUD)
833
+ - Investment \u2014 a property-investment vehicle (embeds property, investors, returns)
834
+ - HousingVistaTransaction \u2014 a property deal (parties, milestones, escrow, documents)
835
+ - RentalUnit \u2014 a rental tenancy (tenant, lease window, rent, payment status)
836
+ - AmcContract \u2014 an annual maintenance contract (package, provider, service date)
837
+ - HousingVistaAsset \u2014 an owned real-estate asset (value, appreciation, yield)
838
+ - MarketplaceService \u2014 a vendor marketplace service
839
+ - LegalService \u2014 a legal/conveyancing service
840
+ - AreaInsight \u2014 per-area market intelligence (price, yield, liveability scores)
841
+ - MarketTrend \u2014 time-series market trends (price/rent, demand/supply indices)
842
+ - HomeLoanOffer \u2014 a bank home-loan offer
843
+ - VerificationItem \u2014 an item in the verification/moderation queue
844
+
845
+ ## Enums
846
+ - PropertyStatus: for_rent, for_sale, off_market, rented, sold, under_contract
847
+ - PropertyType: agricultural, commercial, industrial, mixed_use, residential
848
+
849
+ ## Tool groups
850
+ properties (CRUD), investments, transactions, leasing (rentals + amc), assets,
851
+ marketplace (marketplace + legal services), market (area insights + trends +
852
+ home loans), verification, analytics. All run against the WORKSPACE gateway
853
+ (workspace-scoped).
854
+ `;
855
+ return {
856
+ contents: [{ uri: schemaUri, text: schema, mimeType: "text/plain" }]
857
+ };
858
+ }
859
+ );
860
+ server.registerResource(
861
+ "housingvista-dashboard",
862
+ dashboardUri,
863
+ {
864
+ title: "HousingVista Dashboard Stats",
865
+ description: "Live headline portfolio KPIs (properties, value, investments, occupancy, tenants, transactions).",
866
+ mimeType: "application/json"
867
+ },
868
+ async () => {
869
+ ctx.logger.debug(`Resource ${dashboardUri} requested`);
870
+ try {
871
+ const data = await ctx.gql.workspace.request(
872
+ DASHBOARD_STATS,
873
+ {}
874
+ );
875
+ return {
876
+ contents: [
877
+ {
878
+ uri: dashboardUri,
879
+ text: JSON.stringify(data.housingvistaDashboardStats, null, 2),
880
+ mimeType: "application/json"
881
+ }
882
+ ]
883
+ };
884
+ } catch (error) {
885
+ return {
886
+ contents: [
887
+ {
888
+ uri: dashboardUri,
889
+ text: JSON.stringify({
890
+ error: error instanceof Error ? error.message : String(error)
891
+ }),
892
+ mimeType: "application/json"
893
+ }
894
+ ]
895
+ };
896
+ }
897
+ }
898
+ );
899
+ server.registerResource(
900
+ "housingvista-properties",
901
+ propertiesUri,
902
+ {
903
+ title: "HousingVista Property Listings",
904
+ description: "The first 50 property listings in the bound workspace.",
905
+ mimeType: "application/json"
906
+ },
907
+ async () => {
908
+ ctx.logger.debug(`Resource ${propertiesUri} requested`);
909
+ try {
910
+ const data = await ctx.gql.workspace.request(
911
+ LIST_PROPERTIES,
912
+ { pagination: { limit: 50, offset: 0 } }
913
+ );
914
+ return {
915
+ contents: [
916
+ {
917
+ uri: propertiesUri,
918
+ text: JSON.stringify(data.housingvistaProperties, null, 2),
919
+ mimeType: "application/json"
920
+ }
921
+ ]
922
+ };
923
+ } catch (error) {
924
+ return {
925
+ contents: [
926
+ {
927
+ uri: propertiesUri,
928
+ text: JSON.stringify({
929
+ error: error instanceof Error ? error.message : String(error)
930
+ }),
931
+ mimeType: "application/json"
932
+ }
933
+ ]
934
+ };
935
+ }
936
+ }
937
+ );
938
+ server.registerResource(
939
+ "housingvista-market",
940
+ marketUri,
941
+ {
942
+ title: "HousingVista Market Trends",
943
+ description: "Time-series market trends (price/rent, demand/supply indices) for the workspace.",
944
+ mimeType: "application/json"
945
+ },
946
+ async () => {
947
+ ctx.logger.debug(`Resource ${marketUri} requested`);
948
+ try {
949
+ const data = await ctx.gql.workspace.request(
950
+ LIST_MARKET_TRENDS,
951
+ { pagination: { limit: 50, offset: 0 } }
952
+ );
953
+ return {
954
+ contents: [
955
+ {
956
+ uri: marketUri,
957
+ text: JSON.stringify(data.housingvistaMarketTrends, null, 2),
958
+ mimeType: "application/json"
959
+ }
960
+ ]
961
+ };
962
+ } catch (error) {
963
+ return {
964
+ contents: [
965
+ {
966
+ uri: marketUri,
967
+ text: JSON.stringify({
968
+ error: error instanceof Error ? error.message : String(error)
969
+ }),
970
+ mimeType: "application/json"
971
+ }
972
+ ]
973
+ };
974
+ }
975
+ }
976
+ );
977
+ }
978
+ function registerHousingVistaPrompts(server, ctx, track) {
979
+ const p = ctx.productName;
980
+ const listingName = track(mcpPromptName(p, "property-listing"));
981
+ const portfolioName = track(mcpPromptName(p, "portfolio-review"));
982
+ server.registerPrompt(
983
+ listingName,
984
+ {
985
+ title: "Property Listing",
986
+ description: "Guide for listing a new HousingVista property end to end: create the listing, enrich it, cross-check the local market, and move it to market.",
987
+ argsSchema: {
988
+ city: zod.z.string().optional().describe("Target city"),
989
+ type: zod.z.string().optional().describe("Property type (use-class)")
990
+ }
991
+ },
992
+ ({ city, type }) => {
993
+ ctx.logger.debug(`Prompt ${listingName} called`, { city, type });
994
+ const cityNote = city ? `Target city is "${city}".` : "Ask the user for the city.";
995
+ const typeNote = type ? `Use property type ${type}.` : "Help the user pick a PropertyType (residential/commercial/industrial/agricultural/mixed_use).";
996
+ return {
997
+ messages: [
998
+ {
999
+ role: "user",
1000
+ content: {
1001
+ type: "text",
1002
+ text: `Help me list a new HousingVista property.
1003
+
1004
+ 1. **Market Check**: Use ${p}_market_area_insights and ${p}_market_trends to ground pricing for the area. ${cityNote}
1005
+ 2. **Create Listing**: Use ${p}_properties_create. ${typeNote} Provide title, category, price, totalArea, bedrooms, bathrooms, city, and state. Set status=for_sale or for_rent.
1006
+ 3. **Review**: Use ${p}_properties_get to confirm the created listing, then ${p}_properties_update to refine description/imageUrl/context if needed.
1007
+ 4. **Finance Options**: Use ${p}_market_home_loans to surface relevant home-loan offers for prospective buyers.
1008
+ 5. **Verify Catalog**: Use ${p}_properties_list filtered by city/type/status to confirm the listing appears.
1009
+
1010
+ Show results at each step and confirm before publishing.`
1011
+ }
1012
+ }
1013
+ ]
1014
+ };
1015
+ }
1016
+ );
1017
+ server.registerPrompt(
1018
+ portfolioName,
1019
+ {
1020
+ title: "Portfolio Review",
1021
+ description: "Review workflow for a real-estate portfolio: headline KPIs, owned assets, active transactions, investments, rental income, maintenance contracts, and the verification queue.",
1022
+ argsSchema: {}
1023
+ },
1024
+ () => {
1025
+ ctx.logger.debug(`Prompt ${portfolioName} called`);
1026
+ return {
1027
+ messages: [
1028
+ {
1029
+ role: "user",
1030
+ content: {
1031
+ type: "text",
1032
+ text: `Run a HousingVista portfolio review.
1033
+
1034
+ 1. **KPIs**: Use ${p}_analytics_dashboard for headline portfolio numbers (value, occupancy, returns).
1035
+ 2. **Assets**: Use ${p}_assets_list to review owned assets \u2014 current value, appreciation, and rental yield.
1036
+ 3. **Deal Pipeline**: Use ${p}_transactions_list to check active transactions and their milestones/escrow status.
1037
+ 4. **Investments**: Use ${p}_investments_list to review investment vehicles and their returns.
1038
+ 5. **Rental Income**: Use ${p}_rentals_list to check tenancies and payment status; flag overdue rents.
1039
+ 6. **Maintenance**: Use ${p}_amc_list to review AMC contracts and upcoming service dates.
1040
+ 7. **Verification**: Use ${p}_verification_list to clear the moderation/verification queue, prioritising high-priority items.
1041
+
1042
+ Summarize what needs attention after each step.`
1043
+ }
1044
+ }
1045
+ ]
1046
+ };
1047
+ }
1048
+ );
1049
+ }
1050
+
1051
+ // src/modules/housingvista/index.ts
1052
+ var housingvistaModule = {
1053
+ id: "housingvista",
1054
+ version: "0.0.1",
1055
+ displayName: "HousingVista",
1056
+ dependsOn: ["auth"],
1057
+ capabilities: { tools: {}, resources: {}, prompts: {} },
1058
+ register(server, ctx) {
1059
+ const tools = [];
1060
+ const resources = [];
1061
+ const prompts = [];
1062
+ const trackTool = (n) => {
1063
+ tools.push(n);
1064
+ return n;
1065
+ };
1066
+ const trackResource = (uri) => {
1067
+ resources.push(uri);
1068
+ return uri;
1069
+ };
1070
+ const trackPrompt = (n) => {
1071
+ prompts.push(n);
1072
+ return n;
1073
+ };
1074
+ registerPropertyTools(server, ctx, trackTool);
1075
+ registerInvestmentTools(server, ctx, trackTool);
1076
+ registerTransactionTools(server, ctx, trackTool);
1077
+ registerLeasingTools(server, ctx, trackTool);
1078
+ registerAssetTools(server, ctx, trackTool);
1079
+ registerMarketplaceTools(server, ctx, trackTool);
1080
+ registerMarketTools(server, ctx, trackTool);
1081
+ registerVerificationTools(server, ctx, trackTool);
1082
+ registerAnalyticsTools(server, ctx, trackTool);
1083
+ registerHousingVistaResources(server, ctx, trackResource);
1084
+ registerHousingVistaPrompts(server, ctx, trackPrompt);
1085
+ return { tools, resources, prompts };
1086
+ }
1087
+ };
1088
+ var housingvista_default = housingvistaModule;
1089
+
1090
+ module.exports = housingvista_default;
1091
+ //# sourceMappingURL=index.cjs.map
1092
+ //# sourceMappingURL=index.cjs.map