@rubytech/create-realagent-code 0.1.26 → 0.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +28 -11
- package/package.json +1 -1
- package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -90
- package/payload/platform/plugins/brochures/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/brochures/PLUGIN.md +36 -0
- package/payload/platform/plugins/brochures/commands/make-brochure.md +11 -0
- package/payload/platform/plugins/brochures/skills/a4-print-documents/SKILL.md +478 -0
- package/payload/platform/plugins/brochures/skills/brand-design/SKILL.md +192 -0
- package/payload/platform/plugins/brochures/skills/make-brochure/SKILL.md +354 -0
- package/payload/platform/plugins/brochures/skills/make-brochure/references/seller-brief-template.md +115 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/SKILL.md +119 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/build.md +270 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/copy.md +211 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/images.md +166 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/index-landing.md +376 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/index.html +1288 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/placeholders.md +250 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/registers.md +47 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/seller-brief.md +56 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/structure.md +249 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/template.html +2370 -0
- package/payload/platform/plugins/brochures/skills/property-extract/SKILL.md +372 -0
- package/payload/platform/plugins/buyers/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/buyers/PLUGIN.md +35 -0
- package/payload/platform/plugins/buyers/skills/buyer-feedback/SKILL.md +109 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/SKILL.md +42 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-qualification-questions.md +16 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-qualification.md +59 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-scripts.md +63 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-working-scripts.md +54 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/feedback-collection.md +42 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/offer-capture.md +38 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/viewing-booking.md +32 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/viewing-management.md +52 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/SKILL.md +407 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/care-fees-guide.md +68 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/divorce-sales-guide.md +61 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/downsizing-guide.md +45 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/first-time-buyers.md +92 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/first-time-sellers.md +78 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/probate-guide.md +53 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/upsizing-guide.md +41 -0
- package/payload/platform/plugins/buyers/skills/property-enquiry/SKILL.md +126 -0
- package/payload/platform/plugins/buyers/skills/viewing-management/SKILL.md +111 -0
- package/payload/platform/plugins/estate-business/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/estate-business/PLUGIN.md +65 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/SKILL.md +133 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/buy-back-your-time.md +37 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/firewave-gost-scorecards.md +14 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/keller-org-model.md +17 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/lencioni-team-models.md +22 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/listing-management-system.md +11 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/net-figure-form.md +11 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/serhant-bizinbox-notes.md +13 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/team-roles-commission.md +14 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/va-2026-ops.md +43 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/wingman-structure.md +13 -0
- package/payload/platform/plugins/estate-business/skills/business-operations/SKILL.md +32 -0
- package/payload/platform/plugins/estate-business/skills/business-operations/references/crm-systems.md +57 -0
- package/payload/platform/plugins/estate-business/skills/business-operations/references/hiring-guide.md +59 -0
- package/payload/platform/plugins/estate-business/skills/business-operations/references/impact-framework.md +47 -0
- package/payload/platform/plugins/estate-business/skills/business-operations/references/minutes-equal-money.md +55 -0
- package/payload/platform/plugins/estate-business/skills/business-operations/references/team-management.md +48 -0
- package/payload/platform/plugins/estate-business/skills/commission-calculator/SKILL.md +40 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/SKILL.md +52 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/12-reasons.md +39 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/95-5-system.md +66 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/agent-attraction-scripts.md +90 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/business-partnership.md +92 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/exp-model-overview.md +66 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/model-comparison.md +66 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/revenue-share-explained.md +57 -0
- package/payload/platform/plugins/estate-business/skills/month-end-close/SKILL.md +69 -0
- package/payload/platform/plugins/estate-business/skills/payment-batch-stager/SKILL.md +42 -0
- package/payload/platform/plugins/estate-business/skills/period-reconciler/SKILL.md +42 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/SKILL.md +117 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/attraction-agent-notes.md +31 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/attraction-agent.md +58 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/authenticity-boundaries.md +28 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/become-a-brand-leader-notes.md +19 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/blast-formula.md +42 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/brand-leader.md +48 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/brand-strategy-system.md +59 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/content-engine.md +49 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/firewave-blast-and-blogging.md +23 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/gary-v-content.md +52 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/gary-v-principles.md +20 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/oversubscribed-positioning.md +18 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/platforms.md +41 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/priestley-oversubscribed.md +54 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/storeys-style-examples.md +25 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/visual-identity.md +27 -0
- package/payload/platform/plugins/estate-coaching/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/estate-coaching/PLUGIN.md +55 -0
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/SKILL.md +371 -0
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/atomic-habits.md +52 -0
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/daily-routine-scorecard.md +104 -0
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/hp6-model.md +63 -0
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/twelve-week-year.md +71 -0
- package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/SKILL.md +36 -0
- package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/coaching-boundaries.md +56 -0
- package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/feedback-framework.md +61 -0
- package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/performance-framework.md +109 -0
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/SKILL.md +421 -0
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/coaching-exercises.md +86 -0
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/goal-setting.md +78 -0
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/one-to-one-framework.md +92 -0
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/soi-workbook.md +103 -0
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/SKILL.md +410 -0
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/agent-training-guide.md +70 -0
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/business-in-a-box.md +72 -0
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/buyers-guide.md +53 -0
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/codo-method.md +72 -0
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/website-planning-guide.md +79 -0
- package/payload/platform/plugins/estate-onboarding/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/estate-onboarding/PLUGIN.md +31 -0
- package/payload/platform/plugins/estate-onboarding/skills/bootstrap/SKILL.md +26 -0
- package/payload/platform/plugins/estate-onboarding/skills/bootstrap/references/onboarding-flow.md +63 -0
- package/payload/platform/plugins/estate-sales/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/estate-sales/PLUGIN.md +53 -0
- package/payload/platform/plugins/estate-sales/skills/chase-progression/SKILL.md +107 -0
- package/payload/platform/plugins/estate-sales/skills/negotiation/SKILL.md +35 -0
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/deal-saving.md +47 -0
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-deep-guide.md +64 -0
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-prep-principles.md +29 -0
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-techniques.md +42 -0
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/offer-presentation.md +43 -0
- package/payload/platform/plugins/estate-sales/skills/risk-scorer/SKILL.md +42 -0
- package/payload/platform/plugins/estate-sales/skills/sales-closer/SKILL.md +24 -0
- package/payload/platform/plugins/estate-sales/skills/sales-closer/references/serhant-emotion-stages.md +36 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/SKILL.md +30 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/chris-voss-discovery.md +88 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/firewave-gost-journey.md +68 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/phil-jones-openers.md +78 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/pre-listing-checklist.md +77 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/serhant-improv.md +22 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/tom-ferry-discovery.md +103 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/vendor-motivation-competitor.md +52 -0
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/SKILL.md +29 -0
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/chris-voss-negotiation.md +70 -0
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/phil-jones-price-words.md +40 -0
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/serhant-negotiation-plus.md +55 -0
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/tom-panos-commission-pricing.md +57 -0
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/tony-morris-questioning.md +54 -0
- package/payload/platform/plugins/estate-sales/skills/sales-progression/SKILL.md +27 -0
- package/payload/platform/plugins/estate-sales/skills/sales-progression/references/conveyancing-guide.md +54 -0
- package/payload/platform/plugins/estate-sales/skills/sales-progression/references/transaction-tracking.md +66 -0
- package/payload/platform/plugins/estate-teaching/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/estate-teaching/PLUGIN.md +31 -0
- package/payload/platform/plugins/estate-teaching/skills/content-directory/SKILL.md +39 -0
- package/payload/platform/plugins/estate-teaching/skills/content-directory/references/module-delivery.md +65 -0
- package/payload/platform/plugins/estate-teaching/skills/content-directory/references/progress-tracking.md +47 -0
- package/payload/platform/plugins/leads/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/leads/PLUGIN.md +62 -0
- package/payload/platform/plugins/leads/skills/chain-progression-tracker/SKILL.md +51 -0
- package/payload/platform/plugins/leads/skills/diary-builder/SKILL.md +38 -0
- package/payload/platform/plugins/leads/skills/enquiry-triage/SKILL.md +36 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/SKILL.md +137 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/buyer-search-letter.md +28 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/buyer-search-letters.md +37 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/database-reactivation.md +30 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/email-nurture-sequences.md +45 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/facebook-referrals.md +30 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/firewave-email-nurture-sequences.md +41 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/keller-33-touch.md +34 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/neighbour-letters.md +31 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/neighbour-notification-letter.md +20 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/ofi-follow-up-dialogue.md +22 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/ofi-follow-up.md +26 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/serhant-three-fs-plus.md +21 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/sharran-10x10x10.md +18 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/sms-templates.md +40 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/sphere-of-influence-notes.md +34 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/sphere-of-influence.md +60 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/tom-panos-sms-templates.md +59 -0
- package/payload/platform/plugins/leads/skills/morning-round/SKILL.md +72 -0
- package/payload/platform/plugins/leads/skills/prospecting/SKILL.md +33 -0
- package/payload/platform/plugins/leads/skills/prospecting/references/database-matching.md +30 -0
- package/payload/platform/plugins/leads/skills/prospecting/references/database-value.md +53 -0
- package/payload/platform/plugins/leads/skills/prospecting/references/prospecting-dialogues.md +24 -0
- package/payload/platform/plugins/leads/skills/prospecting/references/reactivation.md +34 -0
- package/payload/platform/plugins/listings/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/listings/PLUGIN.md +103 -0
- package/payload/platform/plugins/listings/skills/comparable-finder/SKILL.md +52 -0
- package/payload/platform/plugins/listings/skills/epc-checker/SKILL.md +38 -0
- package/payload/platform/plugins/listings/skills/home-preparation/SKILL.md +28 -0
- package/payload/platform/plugins/listings/skills/home-preparation/references/kerb-appeal.md +38 -0
- package/payload/platform/plugins/listings/skills/home-preparation/references/photo-day.md +59 -0
- package/payload/platform/plugins/listings/skills/home-preparation/references/situational-tips.md +50 -0
- package/payload/platform/plugins/listings/skills/home-preparation/references/staging-guide.md +52 -0
- package/payload/platform/plugins/listings/skills/listing-copy-writer/SKILL.md +55 -0
- package/payload/platform/plugins/listings/skills/listing-presentation/SKILL.md +286 -0
- package/payload/platform/plugins/listings/skills/listing-presentation/references/booking-script.md +51 -0
- package/payload/platform/plugins/listings/skills/listing-presentation/references/objection-scripts.md +193 -0
- package/payload/platform/plugins/listings/skills/listing-presentation/references/penhaul-presentation.md +123 -0
- package/payload/platform/plugins/listings/skills/listing-presentation/references/pre-listing-kit.md +139 -0
- package/payload/platform/plugins/listings/skills/listing-presentation/references/set-to-sell.md +55 -0
- package/payload/platform/plugins/listings/skills/listing-presentation/references/sharran-frameworks.md +107 -0
- package/payload/platform/plugins/listings/skills/local-market-stats/SKILL.md +33 -0
- package/payload/platform/plugins/listings/skills/new-instruction/SKILL.md +78 -0
- package/payload/platform/plugins/listings/skills/particulars-builder/SKILL.md +48 -0
- package/payload/platform/plugins/listings/skills/portal-launch-scheduler/SKILL.md +49 -0
- package/payload/platform/plugins/listings/skills/pricing-scenario-builder/SKILL.md +35 -0
- package/payload/platform/plugins/listings/skills/property-marketing/SKILL.md +337 -0
- package/payload/platform/plugins/listings/skills/property-marketing/references/auction-report-template.md +41 -0
- package/payload/platform/plugins/listings/skills/property-marketing/references/coming-soon-campaign.md +43 -0
- package/payload/platform/plugins/listings/skills/property-marketing/references/direct-mail-templates.md +121 -0
- package/payload/platform/plugins/listings/skills/property-marketing/references/eoi-form-template.md +62 -0
- package/payload/platform/plugins/listings/skills/property-marketing/references/monthly-scorecard.md +63 -0
- package/payload/platform/plugins/listings/skills/supplier-booker/SKILL.md +39 -0
- package/payload/platform/plugins/listings/skills/talk-track-composer/SKILL.md +36 -0
- package/payload/platform/plugins/listings/skills/terms-of-business-drafter/SKILL.md +54 -0
- package/payload/platform/plugins/listings/skills/valuation-prep/SKILL.md +69 -0
- package/payload/platform/plugins/loop/.claude-plugin/plugin.json +17 -0
- package/payload/platform/plugins/loop/PLUGIN.md +108 -0
- package/payload/platform/plugins/loop/mcp/dist/index.d.ts +2 -0
- package/payload/platform/plugins/loop/mcp/dist/index.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/index.js +293 -0
- package/payload/platform/plugins/loop/mcp/dist/index.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/crypto.d.ts +10 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/crypto.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/crypto.js +88 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/crypto.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.d.ts +82 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.js +427 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.d.ts +5 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.js +40 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.d.ts +10 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.js +24 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/feedback.d.ts +16 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/feedback.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/feedback.js +35 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/feedback.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.d.ts +5 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.js +19 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-list.d.ts +4 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-list.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-list.js +14 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-list.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.d.ts +9 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.js +60 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts +13 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.js +41 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts +9 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.js +16 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts +15 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.js +11 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.d.ts +10 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.js +39 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.d.ts +9 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.js +125 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-search.d.ts +18 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-search.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-search.js +87 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-search.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.d.ts +10 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.js +82 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.d.ts +12 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.js +32 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-request.d.ts +15 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-request.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-request.js +11 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-request.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-search.d.ts +16 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-search.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-search.js +41 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-search.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/supplier.d.ts +13 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/supplier.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/supplier.js +49 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/supplier.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.d.ts +7 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.js +19 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-info.d.ts +5 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-info.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-info.js +32 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-info.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.d.ts +14 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.js +11 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.d.ts +9 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.js +85 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.d.ts +13 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.js +44 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.d.ts +14 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.js +18 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/package-lock.json +2549 -0
- package/payload/platform/plugins/loop/mcp/package.json +21 -0
- package/payload/platform/plugins/loop/mcp/src/__tests__/loop-swagger.snapshot.json +26467 -0
- package/payload/platform/plugins/loop/mcp/src/__tests__/swagger-write-coverage.test.ts +153 -0
- package/payload/platform/plugins/loop/mcp/src/index.ts +444 -0
- package/payload/platform/plugins/loop/mcp/src/lib/crypto.ts +105 -0
- package/payload/platform/plugins/loop/mcp/src/lib/loop-api.ts +604 -0
- package/payload/platform/plugins/loop/mcp/src/lib/neo4j.ts +51 -0
- package/payload/platform/plugins/loop/mcp/src/tools/customer-preferences.ts +66 -0
- package/payload/platform/plugins/loop/mcp/src/tools/feedback.ts +86 -0
- package/payload/platform/plugins/loop/mcp/src/tools/key-deregister.ts +27 -0
- package/payload/platform/plugins/loop/mcp/src/tools/key-list.ts +19 -0
- package/payload/platform/plugins/loop/mcp/src/tools/key-register.ts +95 -0
- package/payload/platform/plugins/loop/mcp/src/tools/marketing-enquiry.ts +113 -0
- package/payload/platform/plugins/loop/mcp/src/tools/marketing-match-batch.ts +53 -0
- package/payload/platform/plugins/loop/mcp/src/tools/marketing-match-request.ts +42 -0
- package/payload/platform/plugins/loop/mcp/src/tools/marketing-match.ts +84 -0
- package/payload/platform/plugins/loop/mcp/src/tools/people-detail.ts +245 -0
- package/payload/platform/plugins/loop/mcp/src/tools/people-search.ts +180 -0
- package/payload/platform/plugins/loop/mcp/src/tools/property-detail.ts +145 -0
- package/payload/platform/plugins/loop/mcp/src/tools/property-listed.ts +88 -0
- package/payload/platform/plugins/loop/mcp/src/tools/property-request.ts +42 -0
- package/payload/platform/plugins/loop/mcp/src/tools/property-search.ts +92 -0
- package/payload/platform/plugins/loop/mcp/src/tools/supplier.ts +129 -0
- package/payload/platform/plugins/loop/mcp/src/tools/team-availability.ts +52 -0
- package/payload/platform/plugins/loop/mcp/src/tools/team-info.ts +95 -0
- package/payload/platform/plugins/loop/mcp/src/tools/viewing-create.ts +41 -0
- package/payload/platform/plugins/loop/mcp/src/tools/viewing-detail.ts +171 -0
- package/payload/platform/plugins/loop/mcp/src/tools/viewing-search.ts +92 -0
- package/payload/platform/plugins/loop/mcp/src/tools/viewing-update.ts +53 -0
- package/payload/platform/plugins/loop/mcp/tsconfig.json +20 -0
- package/payload/platform/plugins/loop/mcp/vitest.config.ts +9 -0
- package/payload/platform/plugins/loop/skills/compliance-flag-checker/SKILL.md +53 -0
- package/payload/platform/plugins/loop/skills/priority-ranker/SKILL.md +40 -0
- package/payload/platform/plugins/loop/skills/tone-matched-drafter/SKILL.md +53 -0
- package/payload/platform/plugins/loop/skills/variance-narrator/SKILL.md +50 -0
- package/payload/platform/plugins/loop/skills/vendor-research/SKILL.md +54 -0
- package/payload/platform/plugins/teaching/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/teaching/PLUGIN.md +57 -0
- package/payload/platform/plugins/teaching/skills/interactive-tutor/SKILL.md +59 -0
- package/payload/platform/plugins/teaching/skills/interactive-tutor/references/assessment.md +70 -0
- package/payload/platform/plugins/teaching/skills/interactive-tutor/references/classroom-conduct.md +43 -0
- package/payload/platform/plugins/teaching/skills/interactive-tutor/references/teaching-modes.md +83 -0
- package/payload/platform/plugins/teaching/skills/lesson-planner/SKILL.md +48 -0
- package/payload/platform/plugins/teaching/skills/lesson-planner/references/context-gathering.md +41 -0
- package/payload/platform/plugins/teaching/skills/lesson-planner/references/plan-structure.md +94 -0
- package/payload/platform/plugins/teaching/skills/study-pack-builder/SKILL.md +52 -0
- package/payload/platform/plugins/teaching/skills/study-pack-builder/references/disaggregation.md +49 -0
- package/payload/platform/plugins/teaching/skills/study-pack-builder/references/materials.md +116 -0
- package/payload/platform/plugins/vendors/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/vendors/PLUGIN.md +34 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/SKILL.md +42 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/fee-protection-and-agenda.md +28 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/listing-scripts.md +44 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/negotiation-deep-guide.md +70 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/price-alignment-scripts.md +33 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/price-alignment.md +34 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/scenario-scripts.md +38 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/seller-engagement.md +51 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/valuation-booking.md +76 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/vendor-scripts.md +63 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/vendor-updates.md +41 -0
- package/payload/platform/plugins/vendors/skills/vendor-updates/SKILL.md +153 -0
- package/payload/platform/plugins/writer-craft/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/writer-craft/PLUGIN.md +87 -0
- package/payload/platform/plugins/writer-craft/agents/writer-craft--manuscript-reviewer.md +92 -0
- package/payload/platform/plugins/writer-craft/skills/citation-style/SKILL.md +94 -0
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/book-and-chapter-models.md +77 -0
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/citation-rules.md +103 -0
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/journal-article-models.md +74 -0
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/other-source-models.md +146 -0
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/reference-list-rules.md +70 -0
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/SKILL.md +108 -0
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/copyediting.md +73 -0
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/developmental-editing.md +85 -0
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/genre-specific-editing.md +78 -0
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/line-editing.md +55 -0
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/self-editing.md +89 -0
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/SKILL.md +114 -0
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/audience-analysis.md +73 -0
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/crafting-persuasive-story.md +76 -0
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/persuasion-case-studies.md +67 -0
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/transformation-framework.md +86 -0
- package/payload/platform/plugins/writer-craft/skills/point-of-view/SKILL.md +97 -0
- package/payload/platform/plugins/writer-craft/skills/point-of-view/references/indirect-narration.md +72 -0
- package/payload/platform/plugins/writer-craft/skills/point-of-view/references/pov-types-and-voice.md +91 -0
- package/payload/platform/plugins/writer-craft/skills/point-of-view/references/protagonist-filter.md +71 -0
- package/payload/platform/plugins/writer-craft/skills/point-of-view/references/tense-and-person.md +85 -0
- package/payload/platform/plugins/writer-craft/skills/prose-craft/SKILL.md +100 -0
- package/payload/platform/plugins/writer-craft/skills/prose-craft/references/punctuation-and-grammar.md +72 -0
- package/payload/platform/plugins/writer-craft/skills/prose-craft/references/repetition.md +71 -0
- package/payload/platform/plugins/writer-craft/skills/prose-craft/references/sound-and-rhythm.md +64 -0
- package/payload/platform/plugins/writer-craft/skills/prose-craft/references/word-economy.md +93 -0
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/SKILL.md +100 -0
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/cause-effect-setup-payoff.md +79 -0
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/conflict-escalation.md +81 -0
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/hooking-readers.md +67 -0
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/neurochemistry-of-engagement.md +94 -0
- package/payload/platform/plugins/writer-craft/skills/review-manuscript/SKILL.md +111 -0
- package/payload/platform/plugins/writer-craft/skills/review-manuscript/references/review-manuscript-checklist.md +119 -0
- package/payload/platform/plugins/writer-craft/skills/review-prose/SKILL.md +99 -0
- package/payload/platform/plugins/writer-craft/skills/review-prose/references/prose-review-checklist.md +112 -0
- package/payload/platform/plugins/writer-craft/skills/review-scene/SKILL.md +99 -0
- package/payload/platform/plugins/writer-craft/skills/review-scene/references/scene-analysis-framework.md +95 -0
- package/payload/platform/plugins/writer-craft/skills/story-architecture/SKILL.md +106 -0
- package/payload/platform/plugins/writer-craft/skills/story-architecture/references/blueprinting-and-scene-cards.md +118 -0
- package/payload/platform/plugins/writer-craft/skills/story-architecture/references/inner-issue-and-protagonist-goal.md +66 -0
- package/payload/platform/plugins/writer-craft/skills/story-architecture/references/misbelief-desire-worldview.md +87 -0
- package/payload/platform/plugins/writer-craft/skills/story-architecture/references/origin-scenes-and-escalation.md +82 -0
- package/payload/platform/plugins/writer-craft/skills/story-blueprint/SKILL.md +133 -0
- package/payload/platform/plugins/writer-craft/skills/story-blueprint/references/blueprinting-exercises.md +118 -0
- package/payload/platform/plugins/writer-craft/skills/story-blueprint/references/blueprinting-process.md +128 -0
- package/payload/platform/services/claude-session-manager/dist/config.d.ts +6 -0
- package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/config.js +60 -1
- package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +9 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +34 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +12 -0
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/public-tool-audit.d.ts +33 -0
- package/payload/platform/services/claude-session-manager/dist/public-tool-audit.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/public-tool-audit.js +149 -0
- package/payload/platform/services/claude-session-manager/dist/public-tool-audit.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/spawn-rate-limiter.d.ts +28 -0
- package/payload/platform/services/claude-session-manager/dist/spawn-rate-limiter.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/spawn-rate-limiter.js +77 -0
- package/payload/platform/services/claude-session-manager/dist/spawn-rate-limiter.js.map +1 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: supplier-booker
|
|
3
|
+
description: "Draft and stage booking requests to photographer, floorplan supplier, and other property-prep suppliers from the agent's preferred-supplier list. Built for use inside new-instruction."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Supplier booker
|
|
7
|
+
|
|
8
|
+
A building-block skill called by `new-instruction`. Stages the booking emails that get the photographer and the floorplan supplier into the property in the first 48 hours after instruction.
|
|
9
|
+
|
|
10
|
+
## What it does
|
|
11
|
+
|
|
12
|
+
For each supplier the workflow needs to book (photographer, floorplan, and optionally a combined supplier when one provider handles both), the skill drafts an email to the agent's preferred supplier from the profile. The draft includes:
|
|
13
|
+
|
|
14
|
+
- Property full address with postcode
|
|
15
|
+
- Access details (vendor contact, key location, lockbox code, alarm code) read from the CRM record
|
|
16
|
+
- The agent's standard brief for that supplier (photography style preferences, number of shots, floorplan format)
|
|
17
|
+
- Preferred date range
|
|
18
|
+
- Reply-to address
|
|
19
|
+
|
|
20
|
+
If the photographer and floorplan supplier are the same provider, the skill combines them into one booking request rather than sending two emails.
|
|
21
|
+
|
|
22
|
+
## What it does not do
|
|
23
|
+
|
|
24
|
+
- It does not send. Sending requires the operator's approval.
|
|
25
|
+
- It does not book the supplier into the calendar. The supplier confirms back, then the calendar entry is created.
|
|
26
|
+
- It does not pay the supplier or set up an invoice. Supplier payment runs through `month-end-close`.
|
|
27
|
+
|
|
28
|
+
## Connectors
|
|
29
|
+
|
|
30
|
+
Read: profile (preferred suppliers, briefs), CRM (vendor contact, access details).
|
|
31
|
+
Write (staged only): email to each supplier.
|
|
32
|
+
|
|
33
|
+
## Profile keys
|
|
34
|
+
|
|
35
|
+
- `realagent.suppliers.photographer`
|
|
36
|
+
- `realagent.suppliers.floorplan`
|
|
37
|
+
- `realagent.suppliers.combined` (boolean, true if one provider handles both)
|
|
38
|
+
- `realagent.suppliers.brief.photography` (default brief, learned)
|
|
39
|
+
- `realagent.suppliers.brief.floorplan`
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: talk-track-composer
|
|
3
|
+
description: "Draft the talk-track block for the valuation prep pack: three questions for the vendor, two likely objections, the agent's USP in the agent's voice. Built for use inside valuation-prep."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Talk-track composer
|
|
7
|
+
|
|
8
|
+
A building-block skill called by `valuation-prep`. Produces the prompt the agent uses in the room.
|
|
9
|
+
|
|
10
|
+
## What it produces
|
|
11
|
+
|
|
12
|
+
Three sub-sections, in this order.
|
|
13
|
+
|
|
14
|
+
1. **Questions to ask the vendor.** Three open questions tailored to the property and the vendor's situation. Examples vary with context: timeline pressure, chain position, prior agent contact, fee sensitivity.
|
|
15
|
+
2. **Likely objections.** Two objections most likely to come up, given the comparables and the local stats. Each shown with a one-sentence acknowledgement and a one-sentence response in the agent's voice.
|
|
16
|
+
3. **The USP.** The agent's USP framed in the agent's words, from the profile's voice samples. The phrasing tightens over time as the workflow watches which phrasings get used versus edited.
|
|
17
|
+
|
|
18
|
+
## Voice source
|
|
19
|
+
|
|
20
|
+
The skill reads the profile's voice samples (three to five emails the agent has written) and prior successful talk-tracks. If voice samples are not yet seeded, the output uses a generic professional tone and flags the absence so the operator knows to add samples.
|
|
21
|
+
|
|
22
|
+
## What it does not do
|
|
23
|
+
|
|
24
|
+
- It does not draft messages to send. That is `tone-matched-drafter`.
|
|
25
|
+
- It does not write to anything.
|
|
26
|
+
- It does not pretend to know the vendor when the CRM record has no prior contact. If the vendor is new, the questions are designed to learn rather than to anchor.
|
|
27
|
+
|
|
28
|
+
## Connectors
|
|
29
|
+
|
|
30
|
+
Read: profile (voice samples), CRM (vendor history if any). No writes.
|
|
31
|
+
|
|
32
|
+
## Profile keys
|
|
33
|
+
|
|
34
|
+
- `realagent.voice_samples` (list of email bodies, used for tone extraction)
|
|
35
|
+
- `realagent.usp_phrases` (list, learned)
|
|
36
|
+
- `realagent.objection_responses` (map of common objections to preferred responses, learned)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: terms-of-business-drafter
|
|
3
|
+
description: "Populate the agency's terms of business template with the deal specifics for a new instruction and stage it in DocuSign with the vendor as recipient. Built for use inside new-instruction; the operator does not invoke it directly. Owned by the compliance specialist."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Terms of business drafter
|
|
7
|
+
|
|
8
|
+
A building-block skill called by `new-instruction`. Produces the terms document the vendor signs before any marketing begins.
|
|
9
|
+
|
|
10
|
+
## What it does
|
|
11
|
+
|
|
12
|
+
Reads the agency's terms-of-business template path from the profile, then populates it with:
|
|
13
|
+
|
|
14
|
+
- Property full address and tenure
|
|
15
|
+
- Vendor name(s) and contact details
|
|
16
|
+
- Fee structure (sole agency, multi agency, with-other-agents, or the agent's named variant)
|
|
17
|
+
- Fee amount or percentage
|
|
18
|
+
- Minimum fee where applicable
|
|
19
|
+
- Marketing period in weeks
|
|
20
|
+
- Withdrawal fee policy
|
|
21
|
+
- Notice period
|
|
22
|
+
- VAT inclusion and registration number
|
|
23
|
+
- CMP scheme membership, redress scheme membership, ICO registration (TPO code requires display)
|
|
24
|
+
- Effective date
|
|
25
|
+
|
|
26
|
+
The populated document is staged in DocuSign as a recipient envelope with the vendor as signatory. Nothing is sent until the operator approves.
|
|
27
|
+
|
|
28
|
+
## Compliance ground
|
|
29
|
+
|
|
30
|
+
The terms of business is the document the Estate Agents Act 1979 s.18 requires to be in writing before instruction is accepted. Failure to comply makes the contract unenforceable except by court order. The Consumer Rights Act 2015 fee transparency obligations also bear on this document. `compliance-flag-checker` runs against the populated draft before the operator sees it.
|
|
31
|
+
|
|
32
|
+
If the populated draft is missing any of the mandatory fields, the missing fields are listed at the top of the staged output so the operator can fill them before approving.
|
|
33
|
+
|
|
34
|
+
## What it does not do
|
|
35
|
+
|
|
36
|
+
- It does not send. Sending requires the operator's explicit approval.
|
|
37
|
+
- It does not amend the agency template. Template changes are made out-of-band.
|
|
38
|
+
- It does not negotiate fees with the vendor. The agreed fee is captured at the appointment.
|
|
39
|
+
|
|
40
|
+
## Connectors
|
|
41
|
+
|
|
42
|
+
Read: profile (template path, fee defaults), CRM (vendor and property records).
|
|
43
|
+
Write (staged only): DocuSign envelope creation.
|
|
44
|
+
|
|
45
|
+
## Profile keys
|
|
46
|
+
|
|
47
|
+
- `realagent.terms_template_path`
|
|
48
|
+
- `realagent.fee_structure.default`
|
|
49
|
+
- `realagent.fee_structure.minimum`
|
|
50
|
+
- `realagent.fee_structure.withdrawal_fee`
|
|
51
|
+
- `realagent.fee_structure.marketing_period_weeks`
|
|
52
|
+
- `realagent.compliance.cmp_scheme_membership`
|
|
53
|
+
- `realagent.compliance.redress_scheme`
|
|
54
|
+
- `realagent.compliance.ico_registration`
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: valuation-prep
|
|
3
|
+
description: "Produce the pre-appointment pack the agent reads on the walk from the car to a valuation or market appraisal. Six sections: property, comparables, local stats, vendor, pricing scenarios, talk-track. Triggers when the operator says 'prep my val at <address>', 'valuation pack for <name>', 'what should I take to the <name> appointment', 'I'm at the Smiths tomorrow, get me ready', 'anything I should know about <address> before tomorrow'. Also fires automatically the evening before any appointment in the calendar tagged as a valuation."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Valuation prep
|
|
7
|
+
|
|
8
|
+
The master workflow owned by the valuer specialist. Turns a 90-minute prep into a 60-second read. This is the workflow most likely to win new instructions; vendors notice when an agent walks in knowing more than they do.
|
|
9
|
+
|
|
10
|
+
## Inputs
|
|
11
|
+
|
|
12
|
+
- Address of the property to value, supplied by the operator or read from the calendar entry.
|
|
13
|
+
- The vendor's name if it is in the diary entry or the CRM.
|
|
14
|
+
- The customisation profile.
|
|
15
|
+
|
|
16
|
+
If the address is ambiguous, the workflow asks once for the postcode rather than guessing. Every other input is derived from connectors.
|
|
17
|
+
|
|
18
|
+
## Architecture principles encoded here
|
|
19
|
+
|
|
20
|
+
- Read before write. Read-only output; the post-appointment instruction pack is a separate workflow.
|
|
21
|
+
- Stage, don't send. Nothing to send.
|
|
22
|
+
- One screen of output. Six short sections, readable in two minutes.
|
|
23
|
+
- Cite the source. Every comparable cites the portal or Land Registry. Every vendor signal cites Land Registry, the title, or the CRM. Every stat cites the area data feed.
|
|
24
|
+
- Teach the profile. Learning hooks documented below.
|
|
25
|
+
- Reversible. Read-only.
|
|
26
|
+
|
|
27
|
+
## Output shape
|
|
28
|
+
|
|
29
|
+
Six sections in this order.
|
|
30
|
+
|
|
31
|
+
1. **Property.** Address, type, beds, baths, last sold price and date if available, EPC if available, last listed price if previously marketed, planning history. Sourced from Land Registry, the EPC register, the council planning portal, and prior portal listings.
|
|
32
|
+
2. **Comparables.** Three SSTC and three sold in the last 12 months within the profile's comparable radius (default 0.5 miles, learns). Each comparable: address, asking or sold price, beds, square footage, time on market, agent. Adds a price-per-square-foot column if at least four of the six have square footage. Built by `comparable-finder`.
|
|
33
|
+
3. **Local stats.** Three numbers maximum: average days on market in the immediate area, asking-to-sold ratio, current stock count. Context, not headline. Built by `local-market-stats`.
|
|
34
|
+
4. **Vendor.** How long they have owned, last purchase price, public signals worth knowing with the privacy line enforced. Built by `vendor-research`. Sensitive signals are flagged at the top of the section if suppressed, so the operator knows there is more if they want it.
|
|
35
|
+
5. **Pricing scenarios.** Three numbers by default: quick-sale (sub-30-day expectation), market (30 to 60 days), aspirational (90 days plus, marked "stretch"). Each with one sentence of reasoning. If the profile has corrected toward a single recommendation with a range, the workflow learns and presents that format instead. Built by `pricing-scenario-builder`.
|
|
36
|
+
6. **Talk-track.** Three questions to ask the vendor, two objections likely to come up, the agent's USP in the agent's voice. Built by `talk-track-composer` reading the profile's voice samples and prior successful talk-tracks.
|
|
37
|
+
|
|
38
|
+
## The privacy line
|
|
39
|
+
|
|
40
|
+
`vendor-research` will surface ownership changes, joint owners who appear and disappear, deaths registered against the address, and planning disputes. The profile holds a privacy preference, default: surface ownership and planning, flag-but-suppress death and dispute signals. The operator can adjust by saying "show me everything you find" or "drop the sensitive stuff".
|
|
41
|
+
|
|
42
|
+
The default is conservative because the agent's reputation is on the line if Claude blurts something inappropriate and the agent quotes it.
|
|
43
|
+
|
|
44
|
+
## Approval gates
|
|
45
|
+
|
|
46
|
+
None at the prep stage. The pack is information, not action. Approval gates appear in `new-instruction`, which runs after the appointment if the agent wins the business.
|
|
47
|
+
|
|
48
|
+
## Continuous learning hooks
|
|
49
|
+
|
|
50
|
+
- Comparable radius. "Wider comps" or "tighter comps" updates the default radius.
|
|
51
|
+
- Pricing format. Three scenarios versus single-with-range versus a single number. Learned from which version the agent screenshots, copies, or refers to in the appointment notes.
|
|
52
|
+
- Comparable preferences. "Ignore that one, it was a probate sale" feeds the exclude filters: distressed sales, off-market, agent-bought.
|
|
53
|
+
- Talk-track effectiveness. Won appointments tag the talk-track as successful. Lost appointments do not blame the talk-track (too noisy) but ask the agent for one-line feedback if offered.
|
|
54
|
+
- USP drift. The USP tightens as the workflow watches which phrasings get used versus edited out before the appointment.
|
|
55
|
+
|
|
56
|
+
All writes go through `profile-writer`.
|
|
57
|
+
|
|
58
|
+
## Connectors
|
|
59
|
+
|
|
60
|
+
Read: Rightmove, Zoopla, OnTheMarket data feeds; Land Registry; EPC register; council planning portal; CRM. No writes.
|
|
61
|
+
|
|
62
|
+
## Profile keys
|
|
63
|
+
|
|
64
|
+
- `realagent.comparable_radius_miles` (default 0.5)
|
|
65
|
+
- `realagent.pricing_format` ("three_scenarios" | "single_with_range" | "single_number")
|
|
66
|
+
- `realagent.comparable_exclude_filters` (list, learned)
|
|
67
|
+
- `realagent.privacy_line.surface` (list)
|
|
68
|
+
- `realagent.privacy_line.suppress` (list)
|
|
69
|
+
- `realagent.usp_phrases` (list, learned)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "real-agency-loop",
|
|
3
|
+
"description": "Loop CRM integration — full read/write access to all 8 resource groups: properties, people, viewings, feedback, team, marketing, customer preferences, and supplier operations. Cross-team aggregation with encrypted key storage.",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Rubytech LLC"
|
|
7
|
+
},
|
|
8
|
+
"mcpServers": {
|
|
9
|
+
"real-agency-loop": {
|
|
10
|
+
"type": "stdio",
|
|
11
|
+
"command": "node",
|
|
12
|
+
"args": [
|
|
13
|
+
"${CLAUDE_PLUGIN_ROOT}/mcp/dist/index.js"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: real-agency-loop
|
|
3
|
+
description: "Loop CRM integration — full read/write access to all 8 resource groups: properties, people, viewings, feedback, team, marketing, customer preferences, and supplier operations. Cross-team aggregation with encrypted key storage."
|
|
4
|
+
tools:
|
|
5
|
+
- loop-key-register
|
|
6
|
+
- loop-key-deregister
|
|
7
|
+
- loop-key-list
|
|
8
|
+
- loop-people-search
|
|
9
|
+
- loop-people-detail
|
|
10
|
+
- loop-property-search
|
|
11
|
+
- loop-property-detail
|
|
12
|
+
- loop-property-listed
|
|
13
|
+
- loop-property-request
|
|
14
|
+
- loop-viewing-search
|
|
15
|
+
- loop-viewing-detail
|
|
16
|
+
- loop-viewing-create
|
|
17
|
+
- loop-viewing-update
|
|
18
|
+
- loop-feedback-get
|
|
19
|
+
- loop-feedback-submit
|
|
20
|
+
- loop-team-info
|
|
21
|
+
- loop-team-availability
|
|
22
|
+
- loop-marketing-match
|
|
23
|
+
- loop-marketing-match-batch
|
|
24
|
+
- loop-marketing-match-request
|
|
25
|
+
- loop-marketing-enquiry
|
|
26
|
+
- loop-customer-preferences
|
|
27
|
+
- loop-supplier
|
|
28
|
+
skills:
|
|
29
|
+
- skills/tone-matched-drafter/SKILL.md
|
|
30
|
+
- skills/priority-ranker/SKILL.md
|
|
31
|
+
- skills/compliance-flag-checker/SKILL.md
|
|
32
|
+
- skills/vendor-research/SKILL.md
|
|
33
|
+
- skills/variance-narrator/SKILL.md
|
|
34
|
+
profileKeys:
|
|
35
|
+
- realagent.cause_phrases
|
|
36
|
+
- realagent.close.narrative_voice_samples
|
|
37
|
+
- realagent.compliance.aml_provider
|
|
38
|
+
- realagent.compliance.cmp_scheme_membership
|
|
39
|
+
- realagent.compliance.ico_registration
|
|
40
|
+
- realagent.compliance.mlro_designation
|
|
41
|
+
- realagent.compliance.propertymark_membership
|
|
42
|
+
- realagent.compliance.redress_scheme
|
|
43
|
+
- realagent.compliance.tpo_membership
|
|
44
|
+
- realagent.phrasing_pet_peeves
|
|
45
|
+
- realagent.priority_weights.fee_multiplier
|
|
46
|
+
- realagent.privacy_line.suppress
|
|
47
|
+
- realagent.privacy_line.surface
|
|
48
|
+
- realagent.voice_samples
|
|
49
|
+
always: false
|
|
50
|
+
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
# Real Agency — Loop CRM
|
|
54
|
+
|
|
55
|
+
Full integration with Loop CRM V2 API (api.loop.software). Covers all 73 endpoints across 8 resource groups — properties, people, viewings, feedback, team, marketing, customer preferences, and supplier operations. Supports both read and write operations.
|
|
56
|
+
|
|
57
|
+
## Capabilities
|
|
58
|
+
|
|
59
|
+
- **Key management** — register, deregister, and list Loop API keys per team
|
|
60
|
+
- **Cross-team aggregation** — query data across all registered teams in a single request
|
|
61
|
+
- **Read and write** — search data, view details, create viewings, record feedback, submit enquiries, manage supplier operations
|
|
62
|
+
- **Role-aware people search** — search buyers, sellers, renters, and landlords with role-specific filters (price, beds, areas, mortgage status)
|
|
63
|
+
- **Channel listings** — query properties listed on Rightmove, Zoopla, OnTheMarket, or the website
|
|
64
|
+
- **Marketing matching** — view matching property details, submit requests, manage auto-responders
|
|
65
|
+
- **Vertical scope** — each team key has configurable endpoint-group permissions (8 groups)
|
|
66
|
+
- **Encrypted storage** — API keys are AES-256-GCM encrypted in Neo4j, never stored in plaintext
|
|
67
|
+
|
|
68
|
+
## Permissions
|
|
69
|
+
|
|
70
|
+
Each registered team key controls access to 8 endpoint groups:
|
|
71
|
+
`properties`, `people`, `viewings`, `feedback`, `team`, `marketing`, `customer`, `supplier`
|
|
72
|
+
|
|
73
|
+
Keys default to all 8 groups. Restrict at registration time to limit what the agent can query for a given team.
|
|
74
|
+
|
|
75
|
+
## Security
|
|
76
|
+
|
|
77
|
+
Never include API key values in responses. Identify teams by name only. When the user asks for a key value, explain that keys are encrypted and cannot be retrieved — they must be re-registered from Loop's dashboard.
|
|
78
|
+
|
|
79
|
+
## When to use these tools
|
|
80
|
+
|
|
81
|
+
Use Loop tools when the user asks about CRM data: properties, people, viewings, feedback, team info, marketing matches, customer preferences, or supplier operations.
|
|
82
|
+
|
|
83
|
+
**Write triggers — invoke writes (not reads) when the user says:**
|
|
84
|
+
- "submit", "send", "log", "record" → `loop-feedback-submit`, `loop-marketing-enquiry`, `loop-property-request`
|
|
85
|
+
- "create", "book", "schedule", "set up" a viewing → `loop-viewing-create`
|
|
86
|
+
- "add a note", "leave feedback", "record what they said" → `loop-viewing-update`
|
|
87
|
+
- "request a callback", "request more info", "ask for a viewing" → `loop-property-request` or `loop-marketing-match-request`
|
|
88
|
+
- "update preferences", "save what they're looking for" → `loop-customer-preferences` (action=write)
|
|
89
|
+
- "mark complete", "close out", "finished the job" → `loop-supplier` (action=maintenance-complete or board-complete)
|
|
90
|
+
- "submit a quote" → `loop-supplier` (action=maintenance-submit-quote)
|
|
91
|
+
|
|
92
|
+
Default to writes when the user's intent is to *change* data in Loop, not just look it up. Reads return information; writes record the user's decision in Loop.
|
|
93
|
+
|
|
94
|
+
Write operations require specifying which team to act through. If no teams are registered, suggest using `loop-key-register` to add team API keys. If a write fails with a permission error (`Team "X" does not have <group> permission`), the registered key was scoped to fewer than 8 endpoint groups — re-register with the full permissions array (`["properties","people","viewings","feedback","team","marketing","customer","supplier"]`).
|
|
95
|
+
|
|
96
|
+
## Cross-cutting skills hosted here
|
|
97
|
+
|
|
98
|
+
This plugin also hosts the five cross-cutting skills that more than one Real Agent workflow composes. They live here rather than in a workflow-specific plugin because every workflow that produces a message, a ranking, a compliance check, a vendor lookup, or a narrative paragraph reuses them.
|
|
99
|
+
|
|
100
|
+
| Skill | Owner specialist | Purpose |
|
|
101
|
+
|-------|------------------|---------|
|
|
102
|
+
| `tone-matched-drafter` | negotiator | Drafts every outgoing message in the operator's voice per recipient type |
|
|
103
|
+
| `priority-ranker` | shared | Orders any list using the profile's urgency weights |
|
|
104
|
+
| `compliance-flag-checker` | compliance | Flags AML, GDPR, DMCCA material info, ASA standards, Equality Act risks |
|
|
105
|
+
| `vendor-research` | negotiator | Public-record and CRM-history lookup with the privacy line enforced |
|
|
106
|
+
| `variance-narrator` | compliance | Short prose summaries of numerical changes |
|
|
107
|
+
|
|
108
|
+
The cross-cutting skill `profile-writer` named in spec 00 §6 maps to the Maxy platform's existing `profile-update` tool; no new skill is shipped for it.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { initStderrTee } from "../../../../lib/mcp-stderr-tee/dist/index.js";
|
|
2
|
+
initStderrTee("loop");
|
|
3
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { keyRegister } from "./tools/key-register.js";
|
|
7
|
+
import { keyDeregister } from "./tools/key-deregister.js";
|
|
8
|
+
import { keyList } from "./tools/key-list.js";
|
|
9
|
+
import { propertySearch } from "./tools/property-search.js";
|
|
10
|
+
import { propertyDetail } from "./tools/property-detail.js";
|
|
11
|
+
import { propertyListed } from "./tools/property-listed.js";
|
|
12
|
+
import { propertyRequest } from "./tools/property-request.js";
|
|
13
|
+
import { peopleSearch } from "./tools/people-search.js";
|
|
14
|
+
import { peopleDetail } from "./tools/people-detail.js";
|
|
15
|
+
import { viewingSearch } from "./tools/viewing-search.js";
|
|
16
|
+
import { viewingDetail } from "./tools/viewing-detail.js";
|
|
17
|
+
import { viewingCreate } from "./tools/viewing-create.js";
|
|
18
|
+
import { viewingUpdate } from "./tools/viewing-update.js";
|
|
19
|
+
import { feedbackGet, feedbackSubmit } from "./tools/feedback.js";
|
|
20
|
+
import { teamInfo } from "./tools/team-info.js";
|
|
21
|
+
import { teamAvailability } from "./tools/team-availability.js";
|
|
22
|
+
import { marketingMatchDetail } from "./tools/marketing-match.js";
|
|
23
|
+
import { marketingMatchBatch } from "./tools/marketing-match-batch.js";
|
|
24
|
+
import { marketingMatchRequest } from "./tools/marketing-match-request.js";
|
|
25
|
+
import { marketingEnquiry } from "./tools/marketing-enquiry.js";
|
|
26
|
+
import { customerPreferences } from "./tools/customer-preferences.js";
|
|
27
|
+
import { supplier } from "./tools/supplier.js";
|
|
28
|
+
import { closeDriver } from "./lib/neo4j.js";
|
|
29
|
+
const accountId = process.env.ACCOUNT_ID;
|
|
30
|
+
if (!accountId) {
|
|
31
|
+
throw new Error("ACCOUNT_ID environment variable is required");
|
|
32
|
+
}
|
|
33
|
+
const server = new McpServer({
|
|
34
|
+
name: "maxy-loop",
|
|
35
|
+
version: "0.2.0",
|
|
36
|
+
});
|
|
37
|
+
const ALL_PERMISSIONS = z.enum([
|
|
38
|
+
"properties", "people", "viewings", "feedback", "team",
|
|
39
|
+
"marketing", "customer", "supplier",
|
|
40
|
+
]);
|
|
41
|
+
console.error(`[loop] server started, account=${accountId}`);
|
|
42
|
+
// Helper: wrap a tool function in standard error handling
|
|
43
|
+
function toolHandler(fn) {
|
|
44
|
+
return async (params) => {
|
|
45
|
+
try {
|
|
46
|
+
const text = await fn({ ...params, accountId });
|
|
47
|
+
return { content: [{ type: "text", text }] };
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
return {
|
|
51
|
+
content: [{
|
|
52
|
+
type: "text",
|
|
53
|
+
text: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
54
|
+
}],
|
|
55
|
+
isError: true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// ─────────────────────────────────────────────────────────────────
|
|
61
|
+
// Key Management Tools (3)
|
|
62
|
+
// ─────────────────────────────────────────────────────────────────
|
|
63
|
+
server.tool("loop-key-register", "Register a Loop CRM API key for a team. Validates the key against Loop's API, encrypts it, and stores it in the graph. Each key maps to one team.", {
|
|
64
|
+
teamName: z.string().min(1).describe("Human-readable name for this team (e.g. 'Muvin Main Office')"),
|
|
65
|
+
apiKey: z.string().min(10).describe("Loop API key (X-Api-Key header value)"),
|
|
66
|
+
permissions: z
|
|
67
|
+
.array(ALL_PERMISSIONS)
|
|
68
|
+
.optional()
|
|
69
|
+
.describe("Endpoint groups this key can access (default: all 8 groups)"),
|
|
70
|
+
}, async (params) => {
|
|
71
|
+
try {
|
|
72
|
+
const result = await keyRegister({ ...params, accountId });
|
|
73
|
+
let text = `Team "${params.teamName}" registered successfully.`;
|
|
74
|
+
if (result.warning)
|
|
75
|
+
text += `\n\nWarning: ${result.warning}`;
|
|
76
|
+
return { content: [{ type: "text", text }] };
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
return {
|
|
80
|
+
content: [{
|
|
81
|
+
type: "text",
|
|
82
|
+
text: `Failed to register key: ${err instanceof Error ? err.message : String(err)}`,
|
|
83
|
+
}],
|
|
84
|
+
isError: true,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
server.tool("loop-key-deregister", "Remove a registered Loop CRM team key. The key is permanently deleted from the graph.", { teamName: z.string().min(1).describe("Name of the team to remove") }, async ({ teamName }) => {
|
|
89
|
+
try {
|
|
90
|
+
await keyDeregister({ teamName, accountId });
|
|
91
|
+
return { content: [{ type: "text", text: `Team "${teamName}" deregistered.` }] };
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
return {
|
|
95
|
+
content: [{
|
|
96
|
+
type: "text",
|
|
97
|
+
text: `Failed to deregister: ${err instanceof Error ? err.message : String(err)}`,
|
|
98
|
+
}],
|
|
99
|
+
isError: true,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
server.tool("loop-key-list", "List all registered Loop CRM teams for this account. Shows team names, addresses, and permissions. Never reveals API key values.", {}, toolHandler(async (p) => keyList({ accountId: p.accountId })));
|
|
104
|
+
// ─────────────────────────────────────────────────────────────────
|
|
105
|
+
// People Tools (2) — permission: people
|
|
106
|
+
// ─────────────────────────────────────────────────────────────────
|
|
107
|
+
server.tool("loop-people-search", "Search people in Loop CRM. Without a role, searches all contacts. With a role (buyers/sellers/renters/landlords), returns role-specific results with rich filters.", {
|
|
108
|
+
role: z.enum(["buyers", "sellers", "renters", "landlords"]).optional().describe("Role to search (omit for all people)"),
|
|
109
|
+
searchTerm: z.string().optional().describe("Name or contact search"),
|
|
110
|
+
maxPrice: z.number().optional().describe("Max price (buyers) or max price filter (sellers)"),
|
|
111
|
+
minPrice: z.number().optional().describe("Min price (sellers)"),
|
|
112
|
+
minBeds: z.number().optional().describe("Min bedrooms (buyers/renters)"),
|
|
113
|
+
maxRent: z.number().optional().describe("Max rent (renters only)"),
|
|
114
|
+
searchAreas: z.string().optional().describe("Comma-separated outcodes e.g. 'SN7,OX12' (buyers/renters)"),
|
|
115
|
+
propertyTypes: z.string().optional().describe("Comma-separated property types (buyers/renters)"),
|
|
116
|
+
startDate: z.string().optional().describe("Start date filter (sellers/landlords)"),
|
|
117
|
+
endDate: z.string().optional().describe("End date filter (sellers/landlords)"),
|
|
118
|
+
teamName: z.string().optional().describe("Query a specific team only"),
|
|
119
|
+
limit: z.number().int().optional().describe("Max results (default 200)"),
|
|
120
|
+
}, toolHandler(async (p) => peopleSearch(p)));
|
|
121
|
+
server.tool("loop-people-detail", "Get full details for a specific person by ID. Optionally specify a role (buyers/sellers/renters/landlords) for role-specific detail.", {
|
|
122
|
+
personId: z.number().int().describe("Person ID"),
|
|
123
|
+
role: z.enum(["buyers", "sellers", "renters", "landlords"]).optional().describe("Role for role-specific detail view"),
|
|
124
|
+
teamName: z.string().optional().describe("Query a specific team only"),
|
|
125
|
+
}, toolHandler(async (p) => peopleDetail(p)));
|
|
126
|
+
// ─────────────────────────────────────────────────────────────────
|
|
127
|
+
// Property Tools (4) — permission: properties
|
|
128
|
+
// ─────────────────────────────────────────────────────────────────
|
|
129
|
+
server.tool("loop-property-search", "Search properties in Loop CRM. Queries /property/residential/sales and /property/residential/lettings. Use department to narrow to one type.", {
|
|
130
|
+
department: z.enum(["sales", "lettings", "both"]).optional().describe("Department (default: both)"),
|
|
131
|
+
searchTerm: z.string().optional().describe("Address or keyword search"),
|
|
132
|
+
minPrice: z.number().optional().describe("Minimum price"),
|
|
133
|
+
maxPrice: z.number().optional().describe("Maximum price"),
|
|
134
|
+
minBedrooms: z.number().int().optional().describe("Minimum bedrooms"),
|
|
135
|
+
maxBedrooms: z.number().int().optional().describe("Maximum bedrooms"),
|
|
136
|
+
propertyStatuses: z.string().optional().describe("Comma-separated statuses (e.g. 'forSale,underOffer')"),
|
|
137
|
+
propertyTypes: z.string().optional().describe("Comma-separated property types"),
|
|
138
|
+
teamName: z.string().optional().describe("Query a specific team only"),
|
|
139
|
+
limit: z.number().int().optional().describe("Max results (default 200)"),
|
|
140
|
+
}, toolHandler(async (p) => propertySearch(p)));
|
|
141
|
+
server.tool("loop-property-detail", "Get full details for a specific property by ID and department. Optionally include a preview hash for the public preview.", {
|
|
142
|
+
propertyId: z.number().int().describe("Property ID"),
|
|
143
|
+
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
144
|
+
previewHash: z.number().int().optional().describe("Preview hash for public preview URL"),
|
|
145
|
+
teamName: z.string().optional().describe("Query a specific team only"),
|
|
146
|
+
}, toolHandler(async (p) => propertyDetail(p)));
|
|
147
|
+
server.tool("loop-property-listed", "Get properties listed on a specific channel (Rightmove, Zoopla, OnTheMarket, website). Optionally include sold properties.", {
|
|
148
|
+
channel: z.enum(["rightmove", "onTheMarket", "zoopla", "website"]).describe("Listing channel"),
|
|
149
|
+
department: z.enum(["sales", "lettings", "both"]).optional().describe("Department (default: both)"),
|
|
150
|
+
includeSold: z.boolean().optional().describe("Include sold gallery (default: false)"),
|
|
151
|
+
teamName: z.string().optional().describe("Query a specific team only"),
|
|
152
|
+
limit: z.number().int().optional().describe("Max results (default 200)"),
|
|
153
|
+
}, toolHandler(async (p) => propertyListed(p)));
|
|
154
|
+
server.tool("loop-property-request", "Submit a viewing, callback, or information request for a property. Requires a specific team.", {
|
|
155
|
+
teamName: z.string().min(1).describe("Team to submit the request through"),
|
|
156
|
+
propertyId: z.number().int().describe("Property ID"),
|
|
157
|
+
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
158
|
+
action: z.enum(["viewing", "call-back", "information"]).describe("Request type"),
|
|
159
|
+
name: z.string().optional().describe("Requester name"),
|
|
160
|
+
email: z.string().optional().describe("Requester email"),
|
|
161
|
+
phone: z.string().optional().describe("Requester phone"),
|
|
162
|
+
message: z.string().optional().describe("Additional message"),
|
|
163
|
+
}, toolHandler(async (p) => propertyRequest(p)));
|
|
164
|
+
// ─────────────────────────────────────────────────────────────────
|
|
165
|
+
// Viewing Tools (4) — permission: viewings
|
|
166
|
+
// ─────────────────────────────────────────────────────────────────
|
|
167
|
+
server.tool("loop-viewing-search", "Search viewings in Loop CRM. Queries /residential/sales/viewings and /residential/lettings/viewings.", {
|
|
168
|
+
department: z.enum(["sales", "lettings", "both"]).optional().describe("Department (default: both)"),
|
|
169
|
+
searchTerm: z.string().optional().describe("Search viewings"),
|
|
170
|
+
appointmentStartDate: z.string().optional().describe("Filter from date (ISO format)"),
|
|
171
|
+
appointmentEndDate: z.string().optional().describe("Filter to date (ISO format)"),
|
|
172
|
+
status: z.string().optional().describe("Viewing status filter"),
|
|
173
|
+
teamName: z.string().optional().describe("Query a specific team only"),
|
|
174
|
+
limit: z.number().int().optional().describe("Max results (default 200)"),
|
|
175
|
+
}, toolHandler(async (p) => viewingSearch(p)));
|
|
176
|
+
server.tool("loop-viewing-detail", "Get full details for a specific viewing by ID and department.", {
|
|
177
|
+
viewingId: z.number().int().describe("Viewing ID"),
|
|
178
|
+
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
179
|
+
teamName: z.string().optional().describe("Query a specific team only"),
|
|
180
|
+
}, toolHandler(async (p) => viewingDetail(p)));
|
|
181
|
+
server.tool("loop-viewing-create", "Create a new viewing in Loop CRM. Creates the viewing and associated buyer/renter record.", {
|
|
182
|
+
teamName: z.string().min(1).describe("Team to create the viewing for"),
|
|
183
|
+
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
184
|
+
propertyId: z.number().int().describe("Property ID"),
|
|
185
|
+
date: z.string().describe("Viewing date (YYYY-MM-DD)"),
|
|
186
|
+
time: z.string().describe("Viewing time (HH:mm)"),
|
|
187
|
+
attendeeName: z.string().describe("Attendee full name"),
|
|
188
|
+
attendeeEmail: z.string().optional().describe("Attendee email"),
|
|
189
|
+
attendeePhone: z.string().optional().describe("Attendee phone"),
|
|
190
|
+
}, toolHandler(async (p) => viewingCreate(p)));
|
|
191
|
+
server.tool("loop-viewing-update", "Add a note or record feedback for a viewing. For feedback, specify the party: buyer/seller (sales) or renter/landlord (lettings).", {
|
|
192
|
+
teamName: z.string().min(1).describe("Team that owns the viewing"),
|
|
193
|
+
viewingId: z.number().int().describe("Viewing ID"),
|
|
194
|
+
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
195
|
+
action: z.enum(["note", "feedback"]).describe("note or feedback"),
|
|
196
|
+
text: z.string().describe("Note text or feedback content"),
|
|
197
|
+
feedbackParty: z.enum(["buyer", "seller", "renter", "landlord"]).optional().describe("Required for feedback: whose feedback"),
|
|
198
|
+
}, toolHandler(async (p) => viewingUpdate(p)));
|
|
199
|
+
// ─────────────────────────────────────────────────────────────────
|
|
200
|
+
// Feedback Tools (2) — permission: feedback
|
|
201
|
+
// ─────────────────────────────────────────────────────────────────
|
|
202
|
+
server.tool("loop-feedback-get", "Get feedback for a specific viewing. Reads from /feedback/residential/{department}/viewings/{id}.", {
|
|
203
|
+
teamName: z.string().min(1).describe("Team that owns the viewing"),
|
|
204
|
+
viewingId: z.number().int().describe("Viewing ID"),
|
|
205
|
+
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
206
|
+
}, toolHandler(async (p) => feedbackGet(p)));
|
|
207
|
+
server.tool("loop-feedback-submit", "Submit feedback for a viewing. Writes to /feedback/residential/{department}/viewings/{id}/feedback.", {
|
|
208
|
+
teamName: z.string().min(1).describe("Team that owns the viewing"),
|
|
209
|
+
viewingId: z.number().int().describe("Viewing ID"),
|
|
210
|
+
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
211
|
+
feedback: z.string().describe("Feedback text"),
|
|
212
|
+
}, toolHandler(async (p) => feedbackSubmit(p)));
|
|
213
|
+
// ─────────────────────────────────────────────────────────────────
|
|
214
|
+
// Team Tools (2) — permission: team
|
|
215
|
+
// ─────────────────────────────────────────────────────────────────
|
|
216
|
+
server.tool("loop-team-info", "Get team details from Loop CRM. Returns team name, address, phone, and email.", {
|
|
217
|
+
teamName: z.string().optional().describe("Query a specific team only (omit for all teams)"),
|
|
218
|
+
}, toolHandler(async (p) => teamInfo(p)));
|
|
219
|
+
server.tool("loop-team-availability", "Get available time slots for a specific agent on a given date.", {
|
|
220
|
+
agentId: z.string().describe("Agent GUID identifier"),
|
|
221
|
+
searchDate: z.string().describe("Date to check availability (YYYY-MM-DD)"),
|
|
222
|
+
teamName: z.string().optional().describe("Query a specific team only"),
|
|
223
|
+
}, toolHandler(async (p) => teamAvailability(p)));
|
|
224
|
+
// ─────────────────────────────────────────────────────────────────
|
|
225
|
+
// Marketing Tools (4) — permission: marketing
|
|
226
|
+
// ─────────────────────────────────────────────────────────────────
|
|
227
|
+
server.tool("loop-marketing-match", "Get matching property detail and optionally the team profile for that match.", {
|
|
228
|
+
propertyId: z.number().int().describe("Property ID"),
|
|
229
|
+
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
230
|
+
includeTeamProfile: z.boolean().optional().describe("Include the team profile for this match (default: false)"),
|
|
231
|
+
teamName: z.string().optional().describe("Query a specific team only"),
|
|
232
|
+
}, toolHandler(async (p) => marketingMatchDetail(p)));
|
|
233
|
+
server.tool("loop-marketing-match-batch", "Get batch matching results for multiple property IDs.", {
|
|
234
|
+
propertyIds: z.array(z.number().int()).describe("Array of property IDs to match"),
|
|
235
|
+
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
236
|
+
teamName: z.string().optional().describe("Query a specific team only"),
|
|
237
|
+
}, toolHandler(async (p) => marketingMatchBatch(p)));
|
|
238
|
+
server.tool("loop-marketing-match-request", "Submit a viewing, information, or callback request for a matching property.", {
|
|
239
|
+
teamName: z.string().min(1).describe("Team to submit the request through"),
|
|
240
|
+
propertyId: z.number().int().describe("Matching property ID"),
|
|
241
|
+
department: z.enum(["sales", "lettings"]).describe("sales or lettings"),
|
|
242
|
+
action: z.enum(["viewing", "information", "callback"]).describe("Request type"),
|
|
243
|
+
name: z.string().optional().describe("Requester name"),
|
|
244
|
+
email: z.string().optional().describe("Requester email"),
|
|
245
|
+
phone: z.string().optional().describe("Requester phone"),
|
|
246
|
+
message: z.string().optional().describe("Additional message"),
|
|
247
|
+
}, toolHandler(async (p) => marketingMatchRequest(p)));
|
|
248
|
+
server.tool("loop-marketing-enquiry", "Marketing enquiry operations: submit seller enquiries, manage auto-responder interactions.", {
|
|
249
|
+
teamName: z.string().min(1).describe("Team to submit through"),
|
|
250
|
+
action: z.enum([
|
|
251
|
+
"seller-enquiry", "autoresponder-get", "autoresponder-answers",
|
|
252
|
+
"autoresponder-details", "autoresponder-refer",
|
|
253
|
+
]).describe("Enquiry action"),
|
|
254
|
+
sellerEnquiryData: z.record(z.string(), z.unknown()).optional().describe("Seller enquiry request body (for seller-enquiry)"),
|
|
255
|
+
autoResponderId: z.number().int().optional().describe("Auto-responder enquiry ID"),
|
|
256
|
+
autoResponderKey: z.string().optional().describe("Auto-responder key (UUID)"),
|
|
257
|
+
answers: z.array(z.unknown()).optional().describe("Auto-responder answers array"),
|
|
258
|
+
details: z.record(z.string(), z.unknown()).optional().describe("Auto-responder details object"),
|
|
259
|
+
}, toolHandler(async (p) => marketingEnquiry(p)));
|
|
260
|
+
// ─────────────────────────────────────────────────────────────────
|
|
261
|
+
// Customer Tools (1) — permission: customer
|
|
262
|
+
// ─────────────────────────────────────────────────────────────────
|
|
263
|
+
server.tool("loop-customer-preferences", "Read or write customer preferences for a person. Action 'read' returns current preferences, 'write' updates them.", {
|
|
264
|
+
teamName: z.string().min(1).describe("Team for this operation"),
|
|
265
|
+
personCode: z.number().int().describe("Person code (ID)"),
|
|
266
|
+
action: z.enum(["read", "write"]).describe("read or write"),
|
|
267
|
+
preferences: z.record(z.string(), z.unknown()).optional().describe("Preferences object (required for write)"),
|
|
268
|
+
}, toolHandler(async (p) => customerPreferences(p)));
|
|
269
|
+
// ─────────────────────────────────────────────────────────────────
|
|
270
|
+
// Supplier Tools (1) — permission: supplier
|
|
271
|
+
// ─────────────────────────────────────────────────────────────────
|
|
272
|
+
server.tool("loop-supplier", "Supplier operations: maintenance jobs, quotes, board contractor jobs. Supports listing, completing, and quoting.", {
|
|
273
|
+
teamName: z.string().min(1).describe("Team for this operation"),
|
|
274
|
+
action: z.enum([
|
|
275
|
+
"maintenance-jobs", "maintenance-complete", "maintenance-quotes",
|
|
276
|
+
"maintenance-submit-quote", "board-jobs", "board-complete",
|
|
277
|
+
]).describe("Supplier action"),
|
|
278
|
+
code: z.string().describe("Unique code assigned to the contractor"),
|
|
279
|
+
jobId: z.number().int().optional().describe("Job ID (required for all actions except maintenance-submit-quote)"),
|
|
280
|
+
quoteId: z.number().int().optional().describe("Quote ID (for maintenance-submit-quote)"),
|
|
281
|
+
quoteData: z.record(z.string(), z.unknown()).optional().describe("Quote data (for maintenance-submit-quote)"),
|
|
282
|
+
completionData: z.record(z.string(), z.unknown()).optional().describe("Completion data (for board-complete)"),
|
|
283
|
+
}, toolHandler(async (p) => supplier(p)));
|
|
284
|
+
// ─────────────────────────────────────────────────────────────────
|
|
285
|
+
// Lifecycle
|
|
286
|
+
// ─────────────────────────────────────────────────────────────────
|
|
287
|
+
process.on("SIGINT", async () => {
|
|
288
|
+
await closeDriver();
|
|
289
|
+
process.exit(0);
|
|
290
|
+
});
|
|
291
|
+
const transport = new StdioServerTransport();
|
|
292
|
+
await server.connect(transport);
|
|
293
|
+
//# sourceMappingURL=index.js.map
|