@rubytech/create-maxy-code 0.1.58 → 0.1.60
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/package.json +1 -1
- package/payload/platform/plugins/admin/hooks/__tests__/turn-completed-graph-write.test.sh +30 -19
- package/payload/platform/plugins/admin/hooks/turn-completed-graph-write.sh +35 -90
- package/payload/platform/plugins/docs/references/admin-session.md +17 -16
- package/payload/platform/plugins/docs/references/platform.md +3 -3
- package/payload/platform/plugins/docs/references/plugins-guide.md +1 -1
- package/payload/platform/plugins/loop/PLUGIN.md +13 -1
- package/payload/platform/plugins/loop/mcp/dist/index.js +8 -7
- package/payload/platform/plugins/loop/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/loop/mcp/dist/lib/file-crypto.d.ts +3 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/file-crypto.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/file-crypto.js +48 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/file-crypto.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/key-store.d.ts +22 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/key-store.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/key-store.js +165 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/key-store.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.d.ts +1 -1
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.d.ts.map +1 -1
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.js +4 -39
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.js.map +1 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.d.ts.map +1 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.js +5 -15
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.js.map +1 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.d.ts.map +1 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.js +11 -28
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.js.map +1 -1
- package/payload/platform/plugins/loop/mcp/src/index.ts +10 -7
- package/payload/platform/plugins/loop/mcp/src/lib/file-crypto.ts +54 -0
- package/payload/platform/plugins/loop/mcp/src/lib/key-store.ts +221 -0
- package/payload/platform/plugins/loop/mcp/src/lib/loop-api.ts +5 -42
- package/payload/platform/plugins/loop/mcp/src/tools/key-deregister.ts +5 -20
- package/payload/platform/plugins/loop/mcp/src/tools/key-register.ts +14 -39
- package/payload/platform/plugins/preval/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/preval/PLUGIN.md +39 -0
- package/payload/platform/plugins/preval/skills/property-preval/SKILL.md +78 -0
- package/payload/platform/plugins/preval/skills/property-preval/references/render.py +265 -0
- package/payload/platform/plugins/preval/skills/property-preval/references/template-inputs.schema.json +143 -0
- package/payload/platform/plugins/preval/skills/property-preval/references/template.html +253 -0
- package/payload/platform/plugins/property-data/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/property-data/PLUGIN.md +60 -2
- package/payload/platform/plugins/property-data/mcp/dist/index.js +95 -12
- package/payload/platform/plugins/property-data/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/property-data/mcp/dist/lib/file-crypto.d.ts +3 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/file-crypto.d.ts.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/file-crypto.js +49 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/file-crypto.js.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/key-store.d.ts +15 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/key-store.d.ts.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/key-store.js +135 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/key-store.js.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.d.ts +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.d.ts.map +1 -1
- package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.js +11 -22
- package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.js.map +1 -1
- package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.d.ts +10 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.d.ts.map +1 -1
- package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.js +15 -2
- package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.js.map +1 -1
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.d.ts.map +1 -1
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.js +5 -15
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.js.map +1 -1
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.d.ts.map +1 -1
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.js +30 -23
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.js.map +1 -1
- package/payload/platform/plugins/property-data/mcp/src/__tests__/endpoints.test.ts +252 -0
- package/payload/platform/plugins/property-data/mcp/src/__tests__/schema-parity.test.ts +16 -2
- package/payload/platform/plugins/property-data/mcp/src/index.ts +171 -11
- package/payload/platform/plugins/property-data/mcp/src/lib/file-crypto.ts +55 -0
- package/payload/platform/plugins/property-data/mcp/src/lib/key-store.ts +181 -0
- package/payload/platform/plugins/property-data/mcp/src/lib/propertydata-api.ts +9 -24
- package/payload/platform/plugins/property-data/mcp/src/tools/endpoints.ts +22 -2
- package/payload/platform/plugins/property-data/mcp/src/tools/key-deregister.ts +5 -17
- package/payload/platform/plugins/property-data/mcp/src/tools/key-register.ts +29 -33
- package/payload/platform/plugins/property-data/skills/property-data/SKILL.md +19 -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 +25 -260
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.d.ts +3 -7
- package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.js +6 -32
- package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +6 -24
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +18 -91
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/reaper.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/reaper.js +0 -11
- package/payload/platform/services/claude-session-manager/dist/reaper.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts +0 -21
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-store.js.map +1 -1
- package/payload/platform/templates/agents/admin/IDENTITY.md +1 -1
- package/payload/platform/templates/agents/admin/SOUL.md +1 -1
- package/payload/premium-plugins/real-agent/BUNDLE.md +5 -3
- package/payload/premium-plugins/real-agent/agents/negotiator.md +1 -1
- package/payload/premium-plugins/real-agent/agents/valuer.md +1 -1
- package/payload/premium-plugins/real-agent/plugins/.claude-plugin/marketplace.json +5 -0
- package/payload/premium-plugins/real-agent/plugins/loop/PLUGIN.md +13 -1
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/index.js +8 -7
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/index.js.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/lib/file-crypto.d.ts +3 -0
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/lib/file-crypto.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/lib/file-crypto.js +48 -0
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/lib/file-crypto.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/lib/key-store.d.ts +22 -0
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/lib/key-store.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/lib/key-store.js +165 -0
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/lib/key-store.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/lib/loop-api.d.ts +1 -1
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/lib/loop-api.d.ts.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/lib/loop-api.js +4 -39
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/lib/loop-api.js.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/tools/key-deregister.d.ts.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/tools/key-deregister.js +5 -15
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/tools/key-deregister.js.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/tools/key-register.d.ts.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/tools/key-register.js +11 -28
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/dist/tools/key-register.js.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/src/index.ts +10 -7
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/src/lib/file-crypto.ts +54 -0
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/src/lib/key-store.ts +221 -0
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/src/lib/loop-api.ts +5 -42
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/src/tools/key-deregister.ts +5 -20
- package/payload/premium-plugins/real-agent/plugins/loop/mcp/src/tools/key-register.ts +14 -39
- package/payload/premium-plugins/real-agent/plugins/preval/.claude-plugin/plugin.json +8 -0
- package/payload/premium-plugins/real-agent/plugins/preval/PLUGIN.md +39 -0
- package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/SKILL.md +78 -0
- package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/references/render.py +265 -0
- package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/references/template-inputs.schema.json +143 -0
- package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/references/template.html +253 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/.claude-plugin/plugin.json +1 -1
- package/payload/premium-plugins/real-agent/plugins/property-data/PLUGIN.md +60 -2
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/index.js +95 -12
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/index.js.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/file-crypto.d.ts +3 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/file-crypto.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/file-crypto.js +49 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/file-crypto.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/key-store.d.ts +15 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/key-store.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/key-store.js +135 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/key-store.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/propertydata-api.d.ts +0 -1
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/propertydata-api.d.ts.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/propertydata-api.js +11 -22
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/propertydata-api.js.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/endpoints.d.ts +10 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/endpoints.d.ts.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/endpoints.js +15 -2
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/endpoints.js.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-deregister.d.ts.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-deregister.js +5 -15
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-deregister.js.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-register.d.ts.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-register.js +30 -23
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-register.js.map +1 -1
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/__tests__/endpoints.test.ts +252 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/__tests__/schema-parity.test.ts +16 -2
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/index.ts +171 -11
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/lib/file-crypto.ts +55 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/lib/key-store.ts +181 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/lib/propertydata-api.ts +9 -24
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/tools/endpoints.ts +22 -2
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/tools/key-deregister.ts +5 -17
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/tools/key-register.ts +29 -33
- package/payload/premium-plugins/real-agent/plugins/property-data/skills/property-data/SKILL.md +19 -0
- package/payload/server/public/assets/{admin-2ZJmzJ_g.js → admin-Bp-BjBCX.js} +51 -51
- package/payload/server/public/assets/{data-DlmoKxmN.js → data-BGUAGVkV.js} +1 -1
- package/payload/server/public/assets/{graph-BVvcFSEQ.js → graph-MvYxZOBF.js} +1 -1
- package/payload/server/public/assets/{graph-labels-cCvgu38Y.js → graph-labels-D865qb3K.js} +1 -1
- package/payload/server/public/assets/{page-BnAxPkmg.js → page--hOVRrgN.js} +1 -1
- package/payload/server/public/assets/{page-BnaN3u86.js → page-C2b1nlOc.js} +1 -1
- package/payload/server/public/data.html +3 -3
- package/payload/server/public/graph.html +3 -3
- package/payload/server/public/index.html +4 -4
- package/payload/server/server.js +18 -83
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.d.ts +0 -51
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.d.ts.map +0 -1
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.js +0 -196
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.js.map +0 -1
- package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/package.json +0 -7
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>Pre-valuation · <!-- REPLACE: address --> · <!-- REPLACE: generated --></title>
|
|
6
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
9
|
+
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;1,400;1,500;1,600&family=Lora:ital,wght@0,400;0,500;0,600;1,400&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
|
|
10
|
+
<style>
|
|
11
|
+
:root{
|
|
12
|
+
--teal-900:#064444;
|
|
13
|
+
--teal-950:#042D2D;
|
|
14
|
+
--gold-500:#B8945F;
|
|
15
|
+
--paper-0:#FFFFFF;
|
|
16
|
+
--paper-25:#FAF7F2;
|
|
17
|
+
--paper-50:#FBF8F8;
|
|
18
|
+
--paper-75:#F2EDE3;
|
|
19
|
+
--slate-500:#56605F; --slate-600:#6E6E6E;
|
|
20
|
+
--rule-300:#E3DCCE;
|
|
21
|
+
|
|
22
|
+
--text-default:var(--teal-900);
|
|
23
|
+
--text-muted:var(--slate-600);
|
|
24
|
+
--text-accent:var(--gold-500);
|
|
25
|
+
--text-on-dark:var(--paper-0);
|
|
26
|
+
--surface-page:var(--paper-25);
|
|
27
|
+
--surface-card:var(--paper-0);
|
|
28
|
+
--surface-banded:var(--paper-75);
|
|
29
|
+
--surface-deep:var(--teal-900);
|
|
30
|
+
--radius-md:4px; --radius-lg:8px; --radius-xl:16px;
|
|
31
|
+
|
|
32
|
+
--display:"Cormorant Garamond",Garamond,Georgia,serif;
|
|
33
|
+
--body:"Lora",Georgia,serif;
|
|
34
|
+
--sans:"Inter",system-ui,sans-serif;
|
|
35
|
+
}
|
|
36
|
+
*{box-sizing:border-box;margin:0;padding:0}
|
|
37
|
+
html,body{background:var(--rule-300);font-family:var(--body);color:var(--text-default);font-weight:400;-webkit-font-smoothing:antialiased}
|
|
38
|
+
.page{width:210mm;min-height:297mm;height:297mm;margin:8mm auto;background:var(--surface-page);position:relative;overflow:hidden;padding:18mm 16mm;page-break-after:always}
|
|
39
|
+
.page.dark{background:var(--surface-deep);color:var(--text-on-dark)}
|
|
40
|
+
@page{size:A4 portrait;margin:0}
|
|
41
|
+
@media print{html,body{background:transparent} .page{margin:0;box-shadow:none;page-break-after:always}}
|
|
42
|
+
|
|
43
|
+
h1,h2,h3,h4{font-family:var(--display);font-weight:500;line-height:1.15;color:inherit}
|
|
44
|
+
h1{font-family:var(--display);font-style:italic;font-weight:400;font-size:38pt;letter-spacing:-.6pt;line-height:1.05}
|
|
45
|
+
h2{font-size:24pt;font-style:italic;font-weight:400;margin-bottom:5mm;letter-spacing:-.3pt}
|
|
46
|
+
h3{font-size:14pt;font-weight:500}
|
|
47
|
+
h4{font-family:var(--sans);font-size:8.5pt;font-weight:600;letter-spacing:2.2pt;text-transform:uppercase;color:var(--text-accent)}
|
|
48
|
+
p{font-size:11pt;line-height:1.65;color:inherit;font-family:var(--body)}
|
|
49
|
+
.muted{color:var(--text-muted);font-size:9.5pt;line-height:1.55;font-family:var(--body)}
|
|
50
|
+
.eyebrow{font-family:var(--sans);font-weight:600;font-size:9pt;letter-spacing:3pt;text-transform:uppercase;color:var(--text-accent)}
|
|
51
|
+
|
|
52
|
+
.cover-frame{position:absolute;inset:0;padding:24mm 18mm;display:flex;flex-direction:column;justify-content:space-between;z-index:1;background:linear-gradient(180deg,var(--teal-900) 0%,var(--teal-950) 100%);color:var(--text-on-dark)}
|
|
53
|
+
.cover-eyebrow{font-family:var(--sans);font-weight:600;font-size:9pt;letter-spacing:3.5pt;text-transform:uppercase;color:var(--gold-500)}
|
|
54
|
+
.cover-rule{height:1px;background:var(--gold-500);width:30mm}
|
|
55
|
+
.pc-chip{display:inline-flex;align-items:center;padding:2.5mm 6mm;border:1px solid var(--gold-500);border-radius:50px;color:var(--gold-500);font-family:var(--sans);font-weight:600;font-size:10pt;letter-spacing:2.5pt}
|
|
56
|
+
.cover-meta{display:grid;grid-template-columns:repeat(3,1fr);gap:8mm;border-top:1px solid rgba(255,255,255,.22);padding-top:8mm}
|
|
57
|
+
.cover-meta dt{font-family:var(--sans);font-weight:600;font-size:8pt;letter-spacing:2pt;text-transform:uppercase;color:var(--gold-500);margin-bottom:3mm}
|
|
58
|
+
.cover-meta dd{font-family:var(--display);font-style:italic;font-weight:500;font-size:14pt;color:var(--text-on-dark)}
|
|
59
|
+
|
|
60
|
+
.doc-head{display:flex;justify-content:space-between;align-items:flex-end;padding-bottom:6mm;border-bottom:1px solid var(--rule-300);margin-bottom:7mm}
|
|
61
|
+
.doc-head .wm{font-family:var(--display);font-style:normal;font-weight:600;font-size:18pt;color:var(--teal-900);letter-spacing:-.4pt}
|
|
62
|
+
.doc-head .breadcrumb{font-family:var(--sans);font-weight:500;font-size:8pt;letter-spacing:2pt;text-transform:uppercase;color:var(--text-muted);text-align:right}
|
|
63
|
+
|
|
64
|
+
.kpis-4{display:grid;grid-template-columns:repeat(4,1fr);gap:4mm;margin-bottom:6mm}
|
|
65
|
+
.kpi{background:var(--surface-card);border-radius:var(--radius-lg);padding:5mm;border:1px solid var(--rule-300);position:relative;overflow:hidden}
|
|
66
|
+
.kpi::before{content:"";position:absolute;left:0;top:0;bottom:0;width:1.4mm;background:var(--gold-500)}
|
|
67
|
+
.kpi .label{font-family:var(--sans);font-weight:600;font-size:7pt;letter-spacing:1.7pt;text-transform:uppercase;color:var(--text-muted);margin-bottom:2mm}
|
|
68
|
+
.kpi .value{font-family:var(--display);font-style:italic;font-weight:500;font-size:20pt;color:var(--text-default);line-height:1;letter-spacing:-.3pt}
|
|
69
|
+
.kpi .sub{font-size:8pt;color:var(--text-muted);margin-top:2mm;font-family:var(--body);font-style:italic}
|
|
70
|
+
|
|
71
|
+
.two-col{display:grid;grid-template-columns:1fr 1fr;gap:6mm;align-items:start}
|
|
72
|
+
.panel{background:var(--surface-card);border-radius:var(--radius-lg);padding:5.5mm;border:1px solid var(--rule-300)}
|
|
73
|
+
.panel.banded{background:var(--surface-banded)}
|
|
74
|
+
.panel h4{margin-bottom:3mm}
|
|
75
|
+
|
|
76
|
+
table.cmp{width:100%;border-collapse:collapse;font-size:10pt;font-family:var(--body)}
|
|
77
|
+
table.cmp th,table.cmp td{padding:2.2mm 2mm;text-align:left;border-bottom:1px solid var(--rule-300)}
|
|
78
|
+
table.cmp th{font-family:var(--sans);font-weight:600;font-size:7.5pt;letter-spacing:1.8pt;text-transform:uppercase;color:var(--text-muted)}
|
|
79
|
+
table.cmp td.num{font-family:var(--display);font-style:italic;font-weight:500;text-align:right;font-size:11pt}
|
|
80
|
+
table.cmp tr:last-child td{border-bottom:none}
|
|
81
|
+
|
|
82
|
+
.ask-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:3mm}
|
|
83
|
+
.ask-tile{background:var(--surface-card);border:1px solid var(--rule-300);border-radius:var(--radius-md);padding:3mm}
|
|
84
|
+
.ask-tile .addr{font-family:var(--display);font-style:italic;font-weight:500;font-size:11pt;color:var(--text-default);line-height:1.15}
|
|
85
|
+
.ask-tile .price{font-family:var(--display);font-style:italic;font-weight:500;font-size:13pt;color:var(--teal-900);margin-top:1.5mm}
|
|
86
|
+
.ask-tile .meta{font-family:var(--sans);font-weight:500;font-size:6.5pt;letter-spacing:.5pt;color:var(--text-muted);margin-top:1.5mm;text-transform:uppercase}
|
|
87
|
+
|
|
88
|
+
.dist{display:flex;flex-direction:column;gap:2.5mm;margin-top:2mm}
|
|
89
|
+
.dist-row{display:grid;grid-template-columns:40mm 1fr 14mm;align-items:center;gap:3mm}
|
|
90
|
+
.dist-row .name{font-size:9.5pt;color:var(--text-default);font-family:var(--body)}
|
|
91
|
+
.dist-row .pct{font-family:var(--display);font-style:italic;font-weight:500;font-size:11pt;color:var(--text-default);text-align:right}
|
|
92
|
+
.bar{height:4mm;background:var(--paper-75);border-radius:var(--radius-md);overflow:hidden}
|
|
93
|
+
.bar > span{display:block;height:100%;background:var(--teal-900);border-radius:var(--radius-md)}
|
|
94
|
+
.bar > span.gold{background:var(--gold-500)}
|
|
95
|
+
|
|
96
|
+
.pill{display:inline-flex;align-items:center;gap:2.5mm;padding:1.5mm 4mm;border-radius:50px;background:var(--gold-500);color:var(--text-on-dark);font-family:var(--display);font-style:italic;font-weight:500;font-size:10pt;letter-spacing:.3pt}
|
|
97
|
+
.pill::before{content:"";width:2mm;height:2mm;border-radius:50%;background:#fff}
|
|
98
|
+
|
|
99
|
+
.spark{width:100%;height:38mm;display:block;background:var(--surface-card);border:1px solid var(--rule-300);border-radius:var(--radius-md)}
|
|
100
|
+
.spark .pl{fill:none;stroke:var(--teal-900);stroke-width:1.4}
|
|
101
|
+
.spark .pl-psf{fill:none;stroke:var(--gold-500);stroke-width:1.4;stroke-dasharray:2 1.5}
|
|
102
|
+
.spark .pt{fill:var(--teal-900)}
|
|
103
|
+
.spark .pt-psf{fill:var(--gold-500)}
|
|
104
|
+
.spark text{font-family:Inter,sans-serif;font-size:5pt;fill:#6E6E6E;letter-spacing:.4pt}
|
|
105
|
+
.spark .axis{stroke:var(--rule-300);stroke-width:.4}
|
|
106
|
+
|
|
107
|
+
.legend{display:flex;gap:6mm;font-family:var(--sans);font-weight:500;font-size:7pt;letter-spacing:1.3pt;text-transform:uppercase;color:var(--text-muted);margin-top:2mm}
|
|
108
|
+
.legend .sw{display:inline-block;width:6mm;height:1mm;vertical-align:middle;margin-right:2mm;background:var(--teal-900)}
|
|
109
|
+
.legend .sw.gold{background:var(--gold-500)}
|
|
110
|
+
|
|
111
|
+
.doc-foot{position:absolute;bottom:9mm;left:16mm;right:16mm;display:flex;justify-content:space-between;font-family:var(--sans);font-weight:500;font-size:8pt;letter-spacing:1.5pt;text-transform:uppercase;color:var(--text-muted)}
|
|
112
|
+
.page.dark .doc-foot{color:#7FA0A0}
|
|
113
|
+
|
|
114
|
+
.sources{margin-top:5mm;padding-top:5mm;border-top:1px solid var(--rule-300)}
|
|
115
|
+
.sources h4{margin-bottom:3mm}
|
|
116
|
+
.sources p{font-size:8pt;color:var(--text-muted);line-height:1.55;font-family:var(--body);font-style:italic}
|
|
117
|
+
.sources p + p{margin-top:2.5mm}
|
|
118
|
+
</style>
|
|
119
|
+
</head>
|
|
120
|
+
<body>
|
|
121
|
+
|
|
122
|
+
<!-- PAGE 1 — COVER -->
|
|
123
|
+
<section class="page dark">
|
|
124
|
+
<div class="cover-frame">
|
|
125
|
+
<div>
|
|
126
|
+
<div class="cover-eyebrow">Real Agent · Pre-valuation</div>
|
|
127
|
+
<div class="cover-rule" style="margin-top:6mm"></div>
|
|
128
|
+
</div>
|
|
129
|
+
<div>
|
|
130
|
+
<h4 style="color:var(--gold-500);margin-bottom:6mm">Pre-valuation pack</h4>
|
|
131
|
+
<h1 style="color:var(--text-on-dark);max-width:170mm"><!-- REPLACE: address --></h1>
|
|
132
|
+
<div style="margin-top:10mm"><span class="pc-chip"><!-- REPLACE: postcode --></span></div>
|
|
133
|
+
</div>
|
|
134
|
+
<dl class="cover-meta">
|
|
135
|
+
<div><dt>Report</dt><dd>Pre-valuation</dd></div>
|
|
136
|
+
<div><dt>Postcode</dt><dd><!-- REPLACE: postcode --></dd></div>
|
|
137
|
+
<div><dt>Generated</dt><dd><!-- REPLACE: generated --></dd></div>
|
|
138
|
+
</dl>
|
|
139
|
+
</div>
|
|
140
|
+
<div class="doc-foot" style="z-index:2"><span>Real Agent · Property Intelligence</span><span>01</span></div>
|
|
141
|
+
</section>
|
|
142
|
+
|
|
143
|
+
<!-- PAGE 2 — VALUATION -->
|
|
144
|
+
<section class="page">
|
|
145
|
+
<header class="doc-head">
|
|
146
|
+
<div class="wm">Real Agent</div>
|
|
147
|
+
<div class="breadcrumb">Valuation · <!-- REPLACE: postcode --> · <!-- REPLACE: generated --></div>
|
|
148
|
+
</header>
|
|
149
|
+
<div class="eyebrow">Valuation evidence</div>
|
|
150
|
+
<h2 style="margin-top:3mm">What this property is worth.</h2>
|
|
151
|
+
<div class="kpis-4">
|
|
152
|
+
<div class="kpi"><div class="label">Avg asking £</div><div class="value"><!-- REPLACE: kpi_avg_asking --></div><div class="sub">Live listings — <!-- REPLACE: postcode --></div></div>
|
|
153
|
+
<div class="kpi"><div class="label">Asking £/sqft</div><div class="value"><!-- REPLACE: kpi_asking_psf --></div><div class="sub">Mean listing PSF</div></div>
|
|
154
|
+
<div class="kpi"><div class="label">Avg sold £</div><div class="value"><!-- REPLACE: kpi_avg_sold --></div><div class="sub">Completed transactions</div></div>
|
|
155
|
+
<div class="kpi"><div class="label">Sold £/sqft</div><div class="value"><!-- REPLACE: kpi_sold_psf --></div><div class="sub">Achieved PSF</div></div>
|
|
156
|
+
</div>
|
|
157
|
+
<div class="two-col" style="grid-template-columns:1.15fr .85fr">
|
|
158
|
+
<div class="panel banded">
|
|
159
|
+
<h4>Nearest sold comparables</h4>
|
|
160
|
+
<table class="cmp" style="margin-top:3mm">
|
|
161
|
+
<tr><th>Date</th><th>Address</th><th>Type</th><th style="text-align:right">Price</th></tr>
|
|
162
|
+
<!-- REPLACE: sold_comps_rows -->
|
|
163
|
+
</table>
|
|
164
|
+
</div>
|
|
165
|
+
<div class="panel">
|
|
166
|
+
<h4>Live asking comparables</h4>
|
|
167
|
+
<div class="ask-grid" style="margin-top:3mm">
|
|
168
|
+
<!-- REPLACE: asking_comps_tiles -->
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
172
|
+
<div class="doc-foot"><span>Real Agent · Property Intelligence</span><span>02</span></div>
|
|
173
|
+
</section>
|
|
174
|
+
|
|
175
|
+
<!-- PAGE 3 — AREA -->
|
|
176
|
+
<section class="page">
|
|
177
|
+
<header class="doc-head">
|
|
178
|
+
<div class="wm">Real Agent</div>
|
|
179
|
+
<div class="breadcrumb">Area · <!-- REPLACE: postcode --> · <!-- REPLACE: generated --></div>
|
|
180
|
+
</header>
|
|
181
|
+
<div class="eyebrow">Area read</div>
|
|
182
|
+
<h2 style="margin-top:3mm"><!-- REPLACE: area_headline --></h2>
|
|
183
|
+
<div class="kpis-4">
|
|
184
|
+
<div class="kpi"><div class="label">Crime rating</div><div class="value"><!-- REPLACE: kpi_crime --></div><div class="sub">Area average</div></div>
|
|
185
|
+
<div class="kpi"><div class="label">Flood risk</div><div class="value"><!-- REPLACE: kpi_flood --></div><div class="sub">Postcode level</div></div>
|
|
186
|
+
<div class="kpi"><div class="label">Council tax · D</div><div class="value"><!-- REPLACE: kpi_band_d --></div><div class="sub">Annual at band D</div></div>
|
|
187
|
+
<div class="kpi"><div class="label">Population</div><div class="value"><!-- REPLACE: kpi_population --></div><div class="sub">Local area</div></div>
|
|
188
|
+
</div>
|
|
189
|
+
<div class="two-col">
|
|
190
|
+
<div class="panel">
|
|
191
|
+
<h4>Crime breakdown · 12-month</h4>
|
|
192
|
+
<div class="dist" style="margin-top:3mm">
|
|
193
|
+
<!-- REPLACE: crime_rows -->
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
<div class="panel banded">
|
|
197
|
+
<h4>Council-tax bands</h4>
|
|
198
|
+
<table class="cmp" style="margin-top:3mm">
|
|
199
|
+
<tr><th>Band</th><th style="text-align:right">Annual £</th></tr>
|
|
200
|
+
<!-- REPLACE: band_rows -->
|
|
201
|
+
</table>
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
<div class="doc-foot"><span>Real Agent · Property Intelligence</span><span>03</span></div>
|
|
205
|
+
</section>
|
|
206
|
+
|
|
207
|
+
<!-- PAGE 4 — DEMAND + TREND + SOURCES -->
|
|
208
|
+
<section class="page">
|
|
209
|
+
<header class="doc-head">
|
|
210
|
+
<div class="wm">Real Agent</div>
|
|
211
|
+
<div class="breadcrumb">Demand & trend · <!-- REPLACE: postcode --> · <!-- REPLACE: generated --></div>
|
|
212
|
+
</header>
|
|
213
|
+
<div class="eyebrow">Market posture</div>
|
|
214
|
+
<h2 style="margin-top:3mm">How the market is moving.</h2>
|
|
215
|
+
<div class="kpis-4">
|
|
216
|
+
<div class="kpi"><div class="label">Demand</div><div class="value" style="font-size:14pt"><!-- REPLACE: kpi_demand_rating --></div><div class="sub">Sales-side rating</div></div>
|
|
217
|
+
<div class="kpi"><div class="label">Days on market</div><div class="value"><!-- REPLACE: kpi_dom --></div><div class="sub">Average list-to-sale</div></div>
|
|
218
|
+
<div class="kpi"><div class="label">Turnover / mo</div><div class="value"><!-- REPLACE: kpi_turnover --></div><div class="sub">Stock churn</div></div>
|
|
219
|
+
<div class="kpi"><div class="label">For sale</div><div class="value"><!-- REPLACE: kpi_for_sale --></div><div class="sub">Live listings</div></div>
|
|
220
|
+
</div>
|
|
221
|
+
<div class="two-col" style="grid-template-columns:1.4fr .6fr">
|
|
222
|
+
<div class="panel">
|
|
223
|
+
<h4>7-year price trend · £ and £/sqft</h4>
|
|
224
|
+
<!-- REPLACE: spark_svg -->
|
|
225
|
+
<div class="legend"><span><span class="sw"></span>Average £</span><span><span class="sw gold"></span>£/sqft</span></div>
|
|
226
|
+
</div>
|
|
227
|
+
<div class="panel banded">
|
|
228
|
+
<h4>Rental side</h4>
|
|
229
|
+
<div style="margin-top:3mm"><span class="pill"><!-- REPLACE: rental_rating --></span></div>
|
|
230
|
+
<table class="cmp" style="margin-top:4mm">
|
|
231
|
+
<tr><td>Days on market</td><td class="num"><!-- REPLACE: rental_dom --></td></tr>
|
|
232
|
+
<tr><td>Turnover / month</td><td class="num"><!-- REPLACE: rental_turnover --></td></tr>
|
|
233
|
+
<tr><td>For rent</td><td class="num"><!-- REPLACE: rental_for_rent --></td></tr>
|
|
234
|
+
</table>
|
|
235
|
+
</div>
|
|
236
|
+
</div>
|
|
237
|
+
<div class="panel" style="margin-top:5mm">
|
|
238
|
+
<h4>Property-type mix</h4>
|
|
239
|
+
<div class="dist" style="margin-top:2mm">
|
|
240
|
+
<!-- REPLACE: type_dist_rows -->
|
|
241
|
+
</div>
|
|
242
|
+
</div>
|
|
243
|
+
<div class="sources">
|
|
244
|
+
<h4>Sources & methodology</h4>
|
|
245
|
+
<p><strong>Sources.</strong> PropertyData (asking, sold, demand, growth, crime, flood, council tax, property-type mix). HM Land Registry (sold transactions). Home Office (recorded crime). Environment Agency (flood risk). Valuation Office Agency (council-tax bands).</p>
|
|
246
|
+
<p><strong>Method.</strong> Twelve PropertyData endpoints called on the postcode derived from the address. £/sqft baselines from listing & transaction prices. 7-year trend from PropertyData growth series. Sample sizes vary by postcode density.</p>
|
|
247
|
+
<p><strong>Accuracy.</strong> Property data can change rapidly. Figures are estimates — obtain independent professional advice for specific decisions. This pack is not financial or investment advice.</p>
|
|
248
|
+
</div>
|
|
249
|
+
<div class="doc-foot"><span>Real Agent · Generated <!-- REPLACE: generated --> · <!-- REPLACE: postcode --></span><span>04</span></div>
|
|
250
|
+
</section>
|
|
251
|
+
|
|
252
|
+
</body>
|
|
253
|
+
</html>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "real-agent-property-data",
|
|
3
|
-
"description": "PropertyData UK market analytics — postcode-keyed valuation, asking prices, sold prices, demand, yields,
|
|
3
|
+
"description": "PropertyData UK market analytics — postcode-keyed valuation, asking prices, sold prices, £/sqft baselines and growth, demand (sales + rent), yields, area risk (crime, flood), council tax, planning precedent, UPRN resolution, property-type mix, national HPI. One encrypted API key per account.",
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Rubytech LLC"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: real-agent-property-data
|
|
3
|
-
description: "PropertyData UK market analytics — postcode-keyed valuation, asking prices, sold prices, demand, yields,
|
|
3
|
+
description: "PropertyData UK market analytics — postcode-keyed valuation, asking prices, sold prices, £/sqft baselines and growth, demand (sales + rent), yields, area risk (crime, flood), council tax, planning precedent, UPRN resolution, property-type mix, national HPI. One encrypted API key per account."
|
|
4
4
|
tools:
|
|
5
5
|
- name: property-data-key-register
|
|
6
6
|
publicAllowlist: false
|
|
@@ -26,6 +26,26 @@ tools:
|
|
|
26
26
|
publicAllowlist: false
|
|
27
27
|
- name: property-data-national-hpi
|
|
28
28
|
publicAllowlist: false
|
|
29
|
+
- name: property-data-prices-per-sqf
|
|
30
|
+
publicAllowlist: false
|
|
31
|
+
- name: property-data-sold-prices-per-sqf
|
|
32
|
+
publicAllowlist: false
|
|
33
|
+
- name: property-data-crime
|
|
34
|
+
publicAllowlist: false
|
|
35
|
+
- name: property-data-flood-risk
|
|
36
|
+
publicAllowlist: false
|
|
37
|
+
- name: property-data-council-tax
|
|
38
|
+
publicAllowlist: false
|
|
39
|
+
- name: property-data-planning-applications
|
|
40
|
+
publicAllowlist: false
|
|
41
|
+
- name: property-data-address-match-uprn
|
|
42
|
+
publicAllowlist: false
|
|
43
|
+
- name: property-data-growth-psf
|
|
44
|
+
publicAllowlist: false
|
|
45
|
+
- name: property-data-demand-rent
|
|
46
|
+
publicAllowlist: false
|
|
47
|
+
- name: property-data-property-types
|
|
48
|
+
publicAllowlist: false
|
|
29
49
|
skills:
|
|
30
50
|
- skills/property-data/SKILL.md
|
|
31
51
|
always: false
|
|
@@ -57,10 +77,30 @@ Local stdio MCP that proxies the PropertyData UK market-analytics HTTP API (prop
|
|
|
57
77
|
- **Rental yield** — gross yield estimates by postcode and bedroom count (`yields`).
|
|
58
78
|
- **Growth signals** — short and long-term price growth by postcode (`growth`).
|
|
59
79
|
- **National house-price index** — UK-wide HPI series (`national-hpi`).
|
|
80
|
+
- **£/sqft baselines** — asking and achieved £/sqft distributions for a postcode (`prices-per-sqf`, `sold-prices-per-sqf`), plus a 7-year £/sqft growth series with year-on-year percent change (`growth-psf`).
|
|
81
|
+
- **Area risk** — recent crime statistics with breakdown by type (`crime`); river and sea flood-risk rating for a full postcode (`flood-risk`).
|
|
82
|
+
- **Cost of occupancy** — council-tax authority, rating, and per-band charges (`council-tax`).
|
|
83
|
+
- **Planning precedent** — planning applications near a postcode with references, proposals, decisions, appeals, distance (`planning-applications`). Costs 2 credits per call; upstream-throttled to ~4 calls / 10 s.
|
|
84
|
+
- **Address resolution** — full address → UPRN, classification, lat/lng (`address-match-uprn`). Costs 10 credits per call — call once per address you actually need to resolve.
|
|
85
|
+
- **Rental demand signals** — for-rent count, lets per month, turnover, months of inventory, days on market, rating (`demand-rent`).
|
|
86
|
+
- **Property-type mix** — output-area distribution by property class (`property-types`).
|
|
60
87
|
|
|
61
88
|
## Security
|
|
62
89
|
|
|
63
|
-
The PropertyData API key is encrypted at rest with AES-256-GCM.
|
|
90
|
+
The PropertyData API key is encrypted at rest with AES-256-GCM. The encryption-key file lives at `~/<configDir>/.property-data-encryption-key` (platform mode) or `~/.claude/.realagent-property-data-encryption-key` (standalone mode), both with mode `0600`. Never include the key value in responses; identify the key by registration timestamp only. If the operator asks for the key value, explain that keys are encrypted and cannot be retrieved — they must be re-registered from the PropertyData dashboard.
|
|
91
|
+
|
|
92
|
+
## Standalone mode (`~/.claude/` spawn)
|
|
93
|
+
|
|
94
|
+
The same `mcp/dist/index.js` boots in two environments, selected by env flag:
|
|
95
|
+
|
|
96
|
+
| Env var | Platform mode | Standalone mode |
|
|
97
|
+
|---|---|---|
|
|
98
|
+
| `PROPERTY_DATA_STANDALONE` | unset | `"1"` |
|
|
99
|
+
| `ACCOUNT_ID` | platform tenant id | absent (defaults to `"local"`) |
|
|
100
|
+
| `NEO4J_URI` etc. | required | unused |
|
|
101
|
+
| `PROPERTY_DATA_API_KEY` | unused | optional one-shot bypass (skips the store entirely) |
|
|
102
|
+
|
|
103
|
+
In standalone mode keys live at `~/.claude/.realagent-property-data-key.enc`. See `.docs/realagent-mcps-standalone-mode.md` for the full contract.
|
|
64
104
|
|
|
65
105
|
## When to use these tools
|
|
66
106
|
|
|
@@ -81,10 +121,28 @@ The PropertyData API key is encrypted at rest with AES-256-GCM. Encryption key l
|
|
|
81
121
|
|
|
82
122
|
**Triggers** — operator says "demand in", "yield on", "growth", "is the market moving":
|
|
83
123
|
- `property-data-demand` — supply count + average days to sell-STC
|
|
124
|
+
- `property-data-demand-rent` — for-rent count, lets per month, months of inventory, days on market
|
|
84
125
|
- `property-data-yields` — gross rental yield by bedroom count
|
|
85
126
|
- `property-data-growth` — short and long-term price growth
|
|
127
|
+
- `property-data-growth-psf` — 7-year £/sqft series with YoY%
|
|
86
128
|
- `property-data-national-hpi` — national HPI context
|
|
87
129
|
|
|
130
|
+
### Pillar 4 — £/sqft baselines
|
|
131
|
+
|
|
132
|
+
**Triggers** — operator says "psf in", "price per square foot in", "£/sqft":
|
|
133
|
+
- `property-data-prices-per-sqf` — asking £/sqft distribution
|
|
134
|
+
- `property-data-sold-prices-per-sqf` — achieved £/sqft distribution
|
|
135
|
+
|
|
136
|
+
### Pillar 5 — Area risk + cost of occupancy + planning + UPRN + mix
|
|
137
|
+
|
|
138
|
+
**Triggers** — operator says "crime in", "flood risk for", "council tax band for", "planning applications near", "what's the UPRN of", "property-type mix in":
|
|
139
|
+
- `property-data-crime` — area-risk crime stats
|
|
140
|
+
- `property-data-flood-risk` — river/sea flood rating (full postcode only)
|
|
141
|
+
- `property-data-council-tax` — council, rating, A–H bands (full postcode only)
|
|
142
|
+
- `property-data-planning-applications` — planning precedent (2 credits/call, upstream-throttled)
|
|
143
|
+
- `property-data-address-match-uprn` — full address → UPRN (10 credits/call)
|
|
144
|
+
- `property-data-property-types` — output-area type distribution
|
|
145
|
+
|
|
88
146
|
### Key prerequisite
|
|
89
147
|
|
|
90
148
|
Every PropertyData tool requires a registered key. If `property-data-key-list` returns nothing for the account, surface the registration prompt before attempting any other call — every downstream tool will return `status=key-missing` otherwise.
|
|
@@ -1,23 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
// Logging-tee was a platform-wrapper concern: the platform's mcp-spawn-tee
|
|
2
|
+
// pipes our stderr where it wants. In standalone mode (Claude Code native
|
|
3
|
+
// spawn) the host owns the stderr pipe. Either way, we just write to stderr.
|
|
3
4
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
5
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
6
|
import { z } from "zod";
|
|
6
7
|
import { keyRegister } from "./tools/key-register.js";
|
|
7
8
|
import { keyDeregister } from "./tools/key-deregister.js";
|
|
8
9
|
import { keyList } from "./tools/key-list.js";
|
|
9
|
-
import { valuationSale, valuationRent, prices, pricesRent, soldPrices, demand, yields, growth, nationalHpi, } from "./tools/endpoints.js";
|
|
10
|
+
import { valuationSale, valuationRent, prices, pricesRent, soldPrices, demand, yields, growth, nationalHpi, pricesPerSqf, soldPricesPerSqf, crime, floodRisk, councilTax, planningApplications, addressMatchUprn, growthPsf, demandRent, propertyTypes, } from "./tools/endpoints.js";
|
|
10
11
|
import { closeDriver } from "./lib/neo4j.js";
|
|
11
12
|
import { KeyNotRegisteredError, PropertyDataError, BadResponseError, } from "./lib/propertydata-api.js";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
import { selectKeyStore } from "./lib/key-store.js";
|
|
14
|
+
// ACCOUNT_ID is the platform's tenant id; in standalone mode (Claude Code
|
|
15
|
+
// native spawn) there is no platform tenant, so "local" is the single-tenant
|
|
16
|
+
// stand-in. Same MCP body, env-selected backend.
|
|
17
|
+
const accountId = process.env.ACCOUNT_ID ?? "local";
|
|
16
18
|
const server = new McpServer({
|
|
17
19
|
name: "maxy-property-data",
|
|
18
20
|
version: "0.1.0",
|
|
19
21
|
});
|
|
20
|
-
|
|
22
|
+
const store = selectKeyStore();
|
|
23
|
+
console.error(`[property-data] server started, account=${accountId} backend=${store.backendName} path=${store.backendPath}`);
|
|
21
24
|
function errorEnvelope(err) {
|
|
22
25
|
let text;
|
|
23
26
|
if (err instanceof KeyNotRegisteredError) {
|
|
@@ -38,7 +41,7 @@ function errorEnvelope(err) {
|
|
|
38
41
|
function endpointHandler(fn) {
|
|
39
42
|
return async (params) => {
|
|
40
43
|
try {
|
|
41
|
-
const text = await fn({ ...params, accountId
|
|
44
|
+
const text = await fn({ ...params, accountId });
|
|
42
45
|
return { content: [{ type: "text", text }] };
|
|
43
46
|
}
|
|
44
47
|
catch (err) {
|
|
@@ -53,7 +56,7 @@ server.tool("property-data-key-register", "Register the account's PropertyData A
|
|
|
53
56
|
apiKey: z.string().min(8).describe("PropertyData API key from propertydata.co.uk dashboard"),
|
|
54
57
|
}, async ({ apiKey }) => {
|
|
55
58
|
try {
|
|
56
|
-
await keyRegister({ apiKey, accountId
|
|
59
|
+
await keyRegister({ apiKey, accountId });
|
|
57
60
|
return {
|
|
58
61
|
content: [
|
|
59
62
|
{
|
|
@@ -69,7 +72,7 @@ server.tool("property-data-key-register", "Register the account's PropertyData A
|
|
|
69
72
|
});
|
|
70
73
|
server.tool("property-data-key-deregister", "Remove the account's PropertyData API key. The encrypted key is permanently deleted from Neo4j.", {}, async () => {
|
|
71
74
|
try {
|
|
72
|
-
await keyDeregister({ accountId
|
|
75
|
+
await keyDeregister({ accountId });
|
|
73
76
|
return {
|
|
74
77
|
content: [{ type: "text", text: "PropertyData API key deregistered." }],
|
|
75
78
|
};
|
|
@@ -80,7 +83,7 @@ server.tool("property-data-key-deregister", "Remove the account's PropertyData A
|
|
|
80
83
|
});
|
|
81
84
|
server.tool("property-data-key-list", "Show whether a PropertyData API key is registered for this account. Never reveals the key value.", {}, async () => {
|
|
82
85
|
try {
|
|
83
|
-
const text = await keyList({ accountId
|
|
86
|
+
const text = await keyList({ accountId });
|
|
84
87
|
return { content: [{ type: "text", text }] };
|
|
85
88
|
}
|
|
86
89
|
catch (err) {
|
|
@@ -142,6 +145,86 @@ server.tool("property-data-yields", "Gross rental yield for a postcode and bedro
|
|
|
142
145
|
server.tool("property-data-growth", "Short-term and long-term price growth signals for a postcode.", { postcode: z.string().min(2).describe("UK postcode (outcode or full)") }, endpointHandler(growth));
|
|
143
146
|
server.tool("property-data-national-hpi", "UK national house-price index series. No postcode required.", {}, endpointHandler(nationalHpi));
|
|
144
147
|
// ─────────────────────────────────────────────────────────────────
|
|
148
|
+
// Task 144 — £/sqft baselines and growth
|
|
149
|
+
// ─────────────────────────────────────────────────────────────────
|
|
150
|
+
const pricesPerSqfSchema = {
|
|
151
|
+
postcode: z.string().min(2).describe("UK postcode (outcode or full)"),
|
|
152
|
+
type: z
|
|
153
|
+
.enum(["detached", "semi-detached", "terraced", "flat"])
|
|
154
|
+
.optional()
|
|
155
|
+
.describe("Filter by property type"),
|
|
156
|
+
bedrooms: z.number().int().min(0).optional().describe("Filter by bedroom count"),
|
|
157
|
+
};
|
|
158
|
+
server.tool("property-data-prices-per-sqf", "Asking £/sqft distribution for sale listings in a postcode — avg plus 70/80/90/100% percentile ranges, with the raw listings that have square-foot data. Use for the asking £/sqft KPI on a market report. Costs 1 credit per call.", pricesPerSqfSchema, endpointHandler(pricesPerSqf));
|
|
159
|
+
server.tool("property-data-sold-prices-per-sqf", "Land Registry sold £/sqft distribution for a postcode — avg plus percentile ranges, up to 20 raw sales with square-foot data and a sales-window date range. Use for the achieved £/sqft KPI. Costs 1 credit per call.", {
|
|
160
|
+
postcode: z.string().min(2).describe("UK postcode (outcode or full)"),
|
|
161
|
+
type: z
|
|
162
|
+
.enum(["detached", "semi-detached", "terraced", "flat"])
|
|
163
|
+
.optional()
|
|
164
|
+
.describe("Filter by property type"),
|
|
165
|
+
bedrooms: z.number().int().min(0).optional().describe("Filter by bedroom count"),
|
|
166
|
+
max_age: z.number().int().min(1).optional().describe("Max transaction age in months"),
|
|
167
|
+
}, endpointHandler(soldPricesPerSqf));
|
|
168
|
+
server.tool("property-data-growth-psf", "7-year £/sqft series with year-on-year percent change for a postcode. Use for the £/sqft growth chart on a market report. Costs 1 credit per call.", {
|
|
169
|
+
postcode: z.string().min(2).describe("UK postcode (outcode or full)"),
|
|
170
|
+
type: z
|
|
171
|
+
.enum(["detached", "semi-detached", "terraced", "flat"])
|
|
172
|
+
.optional()
|
|
173
|
+
.describe("Filter by property type"),
|
|
174
|
+
}, endpointHandler(growthPsf));
|
|
175
|
+
// ─────────────────────────────────────────────────────────────────
|
|
176
|
+
// Task 144 — Area risk and cost of occupancy
|
|
177
|
+
// ─────────────────────────────────────────────────────────────────
|
|
178
|
+
server.tool("property-data-crime", "Recent crime statistics for a postcode (or location / town) — per-1,000 rate, 12-month total, breakdown by crime type, and per-month observations. Use for the area-risk pillar. Costs 1 credit per call.", {
|
|
179
|
+
postcode: z.string().min(2).optional().describe("UK postcode (outcode or full)"),
|
|
180
|
+
location: z
|
|
181
|
+
.string()
|
|
182
|
+
.optional()
|
|
183
|
+
.describe("Latitude,longitude pair (e.g. '51.5074,-0.1278'). Alternative to postcode."),
|
|
184
|
+
town: z.string().optional().describe("UK town name. Alternative to postcode."),
|
|
185
|
+
}, endpointHandler(crime));
|
|
186
|
+
server.tool("property-data-flood-risk", "River and sea flood-risk rating for a full UK postcode. Use for area-risk reporting and lender-ready disclosures. Requires a full postcode (not outcode). Costs 1 credit per call.", {
|
|
187
|
+
postcode: z.string().min(5).describe("Full UK postcode (not outcode)"),
|
|
188
|
+
}, endpointHandler(floodRisk));
|
|
189
|
+
server.tool("property-data-council-tax", "Council-tax authority, rating, and per-band charges (A–H) for a full UK postcode, plus any per-property bands the API returns. Use for cost-of-occupancy disclosures. Requires a full postcode. Costs 1 credit per call.", {
|
|
190
|
+
postcode: z.string().min(5).describe("Full UK postcode (not outcode)"),
|
|
191
|
+
}, endpointHandler(councilTax));
|
|
192
|
+
// ─────────────────────────────────────────────────────────────────
|
|
193
|
+
// Task 144 — Planning precedent and address resolution
|
|
194
|
+
// ─────────────────────────────────────────────────────────────────
|
|
195
|
+
server.tool("property-data-planning-applications", "Planning applications within a radius of a postcode — references, proposals, decisions, appeals, distance. Use for development precedent and pre-purchase risk. Costs 2 credits per call. Throttled to ~4 calls per 10 seconds upstream — wrap in the preval skill for fan-out, do not loop directly.", {
|
|
196
|
+
postcode: z.string().min(2).describe("UK postcode (outcode or full)"),
|
|
197
|
+
decision_rating: z
|
|
198
|
+
.enum(["positive", "neutral", "negative"])
|
|
199
|
+
.optional()
|
|
200
|
+
.describe("Filter by decision sentiment"),
|
|
201
|
+
category: z.string().optional().describe("PropertyData planning category filter"),
|
|
202
|
+
max_age_decision: z
|
|
203
|
+
.number()
|
|
204
|
+
.int()
|
|
205
|
+
.min(1)
|
|
206
|
+
.optional()
|
|
207
|
+
.describe("Max age of decision in months"),
|
|
208
|
+
results: z.number().int().min(1).max(100).optional().describe("Max results to return"),
|
|
209
|
+
}, endpointHandler(planningApplications));
|
|
210
|
+
server.tool("property-data-address-match-uprn", "Resolve a full UK address string to its UPRN, address classification, and lat/lng. Use for CRM hygiene and unique-property identification. Costs 10 credits per call — do not fan out blindly; call once per address you actually need to resolve.", {
|
|
211
|
+
address: z.string().min(5).describe("Full UK address (line one + postcode)"),
|
|
212
|
+
}, endpointHandler(addressMatchUprn));
|
|
213
|
+
// ─────────────────────────────────────────────────────────────────
|
|
214
|
+
// Task 144 — Rental demand and property-type mix
|
|
215
|
+
// ─────────────────────────────────────────────────────────────────
|
|
216
|
+
server.tool("property-data-demand-rent", "Rental demand signals for a postcode — for-rent count, lets per month, turnover percent, months of inventory, days on market, and a rating. Use for the rental pillar on a market report. Costs 1 credit per call.", {
|
|
217
|
+
postcode: z.string().min(2).describe("UK postcode (outcode or full)"),
|
|
218
|
+
bedrooms: z.number().int().min(0).optional().describe("Filter by bedroom count"),
|
|
219
|
+
type: z
|
|
220
|
+
.enum(["detached", "semi-detached", "terraced", "flat"])
|
|
221
|
+
.optional()
|
|
222
|
+
.describe("Filter by property type"),
|
|
223
|
+
}, endpointHandler(demandRent));
|
|
224
|
+
server.tool("property-data-property-types", "Output-area property-type distribution (percent by class — detached, semi-detached, terraced, flat) for a postcode. Use for the property-type mix doughnut on a market report. Costs 1 credit per call.", {
|
|
225
|
+
postcode: z.string().min(2).describe("UK postcode (outcode or full)"),
|
|
226
|
+
}, endpointHandler(propertyTypes));
|
|
227
|
+
// ─────────────────────────────────────────────────────────────────
|
|
145
228
|
// Lifecycle
|
|
146
229
|
// ─────────────────────────────────────────────────────────────────
|
|
147
230
|
process.on("SIGINT", async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/file-crypto.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-crypto.d.ts","sourceRoot":"","sources":["../../src/lib/file-crypto.ts"],"names":[],"mappings":"AA8BA,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQzF;AAED,wBAAgB,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAc9F"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { randomBytes, createCipheriv, createDecipheriv } from "node:crypto";
|
|
2
|
+
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
3
|
+
// Standalone-mode crypto. Same AES-256-GCM envelope as crypto.ts, but the
|
|
4
|
+
// encryption-key file path is passed in (not derived from PLATFORM_ROOT /
|
|
5
|
+
// brand.json), so it can live under ~/.claude/ when the MCP is spawned by
|
|
6
|
+
// Claude Code natively.
|
|
7
|
+
const ALGORITHM = "aes-256-gcm";
|
|
8
|
+
const KEY_LENGTH = 32;
|
|
9
|
+
const IV_LENGTH = 12;
|
|
10
|
+
const AUTH_TAG_LENGTH = 16;
|
|
11
|
+
function loadOrGenerateKey(keyFilePath, label) {
|
|
12
|
+
if (existsSync(keyFilePath)) {
|
|
13
|
+
const hex = readFileSync(keyFilePath, "utf-8").trim();
|
|
14
|
+
const buf = Buffer.from(hex, "hex");
|
|
15
|
+
if (buf.length !== KEY_LENGTH) {
|
|
16
|
+
throw new Error(`[${label}] encryption key at ${keyFilePath} is ${buf.length} bytes, expected ${KEY_LENGTH}.`);
|
|
17
|
+
}
|
|
18
|
+
return buf;
|
|
19
|
+
}
|
|
20
|
+
const key = randomBytes(KEY_LENGTH);
|
|
21
|
+
writeFileSync(keyFilePath, key.toString("hex"), { mode: 0o600 });
|
|
22
|
+
console.error(`[${label}] encryption key generated at ${keyFilePath}`);
|
|
23
|
+
return key;
|
|
24
|
+
}
|
|
25
|
+
export function encryptWith(plaintext, keyFilePath, label) {
|
|
26
|
+
const key = loadOrGenerateKey(keyFilePath, label);
|
|
27
|
+
const iv = randomBytes(IV_LENGTH);
|
|
28
|
+
const cipher = createCipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });
|
|
29
|
+
let encrypted = cipher.update(plaintext, "utf-8", "hex");
|
|
30
|
+
encrypted += cipher.final("hex");
|
|
31
|
+
const authTag = cipher.getAuthTag().toString("hex");
|
|
32
|
+
return `${iv.toString("hex")}:${encrypted}:${authTag}`;
|
|
33
|
+
}
|
|
34
|
+
export function decryptWith(encryptedValue, keyFilePath, label) {
|
|
35
|
+
const parts = encryptedValue.split(":");
|
|
36
|
+
if (parts.length !== 3) {
|
|
37
|
+
throw new Error(`[${label}] bad encrypted envelope (expected iv:ct:tag)`);
|
|
38
|
+
}
|
|
39
|
+
const key = loadOrGenerateKey(keyFilePath, label);
|
|
40
|
+
const iv = Buffer.from(parts[0], "hex");
|
|
41
|
+
const ciphertext = parts[1];
|
|
42
|
+
const authTag = Buffer.from(parts[2], "hex");
|
|
43
|
+
const decipher = createDecipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });
|
|
44
|
+
decipher.setAuthTag(authTag);
|
|
45
|
+
let plaintext = decipher.update(ciphertext, "hex", "utf-8");
|
|
46
|
+
plaintext += decipher.final("utf-8");
|
|
47
|
+
return plaintext;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=file-crypto.js.map
|
package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/file-crypto.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-crypto.js","sourceRoot":"","sources":["../../src/lib/file-crypto.ts"],"names":[],"mappings":"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"}
|