propstack-mcp-server 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,355 +1,370 @@
1
- # Propstack MCP Server
2
-
3
- Connect AI assistants (Claude, ChatGPT) to your Propstack real estate CRM.
4
-
5
- > **Verbinden Sie KI-Assistenten mit Ihrem Propstack-CRM** — Kontakte verwalten, Objekte durchsuchen, Deals pflegen, Besichtigungen planen und Suchprofile erstellen, alles per Sprache oder Chat.
6
-
7
- ## What you can do / Was Sie damit machen koennen
8
-
9
- - **Contact management** — search, create, update, and tag contacts with GDPR tracking
10
- - **Property search & management** — filter by price, rooms, area, status; create and update listings
11
- - **Deal pipeline** — create deals, move through stages, track win/loss rates
12
- - **Buyer matching** — create search profiles from natural language ("3-Zimmer in Berlin, bis 400k, mit Balkon") and auto-match to new listings
13
- - **Task & calendar** — log call notes, set follow-up reminders, schedule viewings
14
- - **Email** — send templated emails linked to contacts and properties
15
- - **360-degree contact view** — get a complete briefing before every call
16
- - **Pipeline dashboards** — deal counts and values per stage, stale deal alerts
17
- - **Lead intake** — one-call workflow: dedup, create contact, log notes, create deal, set reminder
18
-
19
- > **Data protection (DSGVO):** Using this server sends personal data from your Propstack CRM into the LLM you connect (Claude, ChatGPT, …). You — the Propstack customer — remain the data controller. See [Datenschutz (DSGVO)](#datenschutz-dsgvo) for responsibility, legal basis, the `fields` data-minimization parameter, and notes on automated decisions.
20
-
21
- ## Quick Start
22
-
23
- ### 1. Set your API key
24
-
25
- ```bash
26
- export PROPSTACK_API_KEY=your_api_key_here
27
- ```
28
-
29
- ### 2a. Claude Desktop
30
-
31
- Add to your Claude Desktop config (`claude_desktop_config.json`):
32
-
33
- ```json
34
- {
35
- "mcpServers": {
36
- "propstack": {
37
- "command": "npx",
38
- "args": ["-y", "propstack-mcp-server"],
39
- "env": {
40
- "PROPSTACK_API_KEY": "your_api_key_here"
41
- }
42
- }
43
- }
44
- }
45
- ```
46
-
47
- ### 2b. Claude Code (CLI)
48
-
49
- Add to your project's `.mcp.json`:
50
-
51
- ```json
52
- {
53
- "mcpServers": {
54
- "propstack": {
55
- "command": "npx",
56
- "args": ["-y", "propstack-mcp-server"],
57
- "env": {
58
- "PROPSTACK_API_KEY": "your_api_key_here"
59
- }
60
- }
61
- }
62
- }
63
- ```
64
-
65
- ### 2c. ChatGPT
66
-
67
- 1. Go to **Settings > Connectors > Developer Mode**
68
- 2. Add a new MCP connector
69
- 3. Set the command to `npx -y propstack-mcp-server`
70
- 4. Add environment variable `PROPSTACK_API_KEY`
71
-
72
- ### 2d. Cursor IDE
73
-
74
- 1. Open **Settings** (Ctrl+,) → search "MCP"
75
- 2. Edit **MCP Servers** JSON, or add `mcp.json` in project root / `.cursor/`
76
-
77
- **Option A — local project** (after `npm run build`):
78
-
79
- ```json
80
- {
81
- "mcpServers": {
82
- "propstack": {
83
- "command": "node",
84
- "args": ["./dist/index.js"],
85
- "cwd": "C:/Users/you/path/to/propstack_mcp",
86
- "env": {
87
- "PROPSTACK_API_KEY": "your_api_key_here"
88
- }
89
- }
90
- }
91
- }
92
- ```
93
-
94
- Or use `.env` in project root — the server loads it automatically; you can omit the `env` block.
95
-
96
- **Option B — npx** (published package or `npx` from local):
97
-
98
- ```json
99
- {
100
- "mcpServers": {
101
- "propstack": {
102
- "command": "npx",
103
- "args": ["-y", "propstack-mcp-server"],
104
- "env": {
105
- "PROPSTACK_API_KEY": "your_api_key_here"
106
- }
107
- }
108
- }
109
- }
110
- ```
111
-
112
- ### 2e. Run directly
113
-
114
- ```bash
115
- npm install propstack-mcp-server
116
- PROPSTACK_API_KEY=your_key npx propstack-mcp-server
117
- ```
118
-
119
- ## API Key / API-Schluessel
120
-
121
- Get your Propstack API key:
122
-
123
- 1. Log in to [crm.propstack.de](https://crm.propstack.de)
124
- 2. Go to **Verwaltung > API-Schluessel** (Administration > API Keys)
125
- 3. Create or copy your V1 API key
126
-
127
- > **Hinweis:** Der API-Schluessel bestimmt die Berechtigungen. Stellen Sie sicher, dass Lese- und Schreibzugriff fuer die benoetigten Endpunkte aktiviert ist.
128
-
129
- ## Available Tools (49)
130
-
131
- ### Contacts (Kontakte)
132
-
133
- | Tool | Description |
134
- |---|---|
135
- | `search_contacts` | Search and filter contacts by name, email, phone, status, tags, broker, GDPR status, custom fields |
136
- | `get_contact` | Get full details of a single contact with related data |
137
- | `create_contact` | Create a new contact (auto-dedup by email) |
138
- | `update_contact` | Update contact details, tags, GDPR status, broker assignment |
139
- | `delete_contact` | Soft-delete a contact (30-day recycle bin) |
140
- | `get_contact_sources` | List lead sources (ImmoScout24, Website, Empfehlung, etc.) |
141
- | `search_contacts_by_phone` | Look up a contact by phone number (formatting-insensitive) |
142
-
143
- ### Properties (Objekte)
144
-
145
- | Tool | Description |
146
- |---|---|
147
- | `search_properties` | Search properties with 11 range filters, 17 sort fields, custom-field filters |
148
- | `get_property` | Get full property details including media and custom fields |
149
- | `create_property` | Create a new property listing |
150
- | `update_property` | Update price, status, description, broker assignment |
151
- | `get_property_statuses` | List property statuses (Verfuegbar, Reserviert, Verkauft, etc.) |
152
-
153
- ### Tasks (Aufgaben & Notizen)
154
-
155
- | Tool | Description |
156
- |---|---|
157
- | `create_task` | Create a note, to-do, appointment, or cancellation (polymorphic) |
158
- | `update_task` | Mark done, reschedule, update notes |
159
- | `get_task` | Get task details with linked contacts, properties, projects |
160
-
161
- ### Deals (Pipeline)
162
-
163
- | Tool | Description |
164
- |---|---|
165
- | `search_deals` | Search deals by stage, pipeline, category, broker, feeling score |
166
- | `create_deal` | Link a contact to a property at a pipeline stage |
167
- | `update_deal` | Move deal through pipeline stages, update price/notes |
168
-
169
- ### Search Profiles (Suchprofile)
170
-
171
- | Tool | Description |
172
- |---|---|
173
- | `list_search_profiles` | List what buyers/renters are looking for |
174
- | `create_search_profile` | Capture buyer criteria from natural language |
175
- | `update_search_profile` | Adjust budget, cities, room count, features |
176
- | `delete_search_profile` | Remove a search profile |
177
-
178
- ### Projects (Projekte)
179
-
180
- | Tool | Description |
181
- |---|---|
182
- | `list_projects` | List development projects with unit counts |
183
- | `get_project` | Get project details with all units, media, documents |
184
-
185
- ### Activities & Events (Aktivitaeten & Termine)
186
-
187
- | Tool | Description |
188
- |---|---|
189
- | `search_activities` | Full activity timeline for a contact, property, or project |
190
- | `list_events` | Calendar events — viewings, meetings, filtered by date/state |
191
-
192
- ### Emails (E-Mails)
193
-
194
- | Tool | Description |
195
- |---|---|
196
- | `send_email` | Send email using a Propstack template (snippet) |
197
- | `update_email` | Mark read/archived, categorize, link to CRM records |
198
-
199
- ### Documents (Dokumente)
200
-
201
- | Tool | Description |
202
- |---|---|
203
- | `list_documents` | List files attached to a property, project, or contact |
204
- | `upload_document` | Upload a document (base64 data URI) |
205
-
206
- ### Relationships (Beziehungen)
207
-
208
- | Tool | Description |
209
- |---|---|
210
- | `create_ownership` | Link a contact as property owner (Eigentuemer) |
211
- | `create_partnership` | Link a contact as buyer, tenant, etc. (Kaeufer, Mieter) |
212
-
213
- ### Lookups (Konfiguration)
214
-
215
- | Tool | Description |
216
- |---|---|
217
- | `list_pipelines` | Get deal pipelines with stages (IDs, names, positions) |
218
- | `get_pipeline` | Get a single pipeline with stage details |
219
- | `list_tags` | List tags/groups (Merkmale) — filter contacts by group IDs |
220
- | `create_tag` | Create a new tag for contacts, properties, or activities |
221
- | `list_activity_types` | List note/todo/event templates for create_task |
222
- | `list_contact_statuses` | List contact statuses for search/assign |
223
- | `list_reservation_reasons` | List deal cancellation reasons |
224
- | `list_custom_fields` | Discover custom field definitions (names, types, options) |
225
- | `list_users` | List all brokers/agents with contact info |
226
- | `list_teams` | List teams/departments with member assignments |
227
- | `list_locations` | List geographic areas (Geolagen) for location matching |
228
-
229
- ### Smart Composites (Intelligente Workflows)
230
-
231
- | Tool | Description |
232
- |---|---|
233
- | `full_contact_360` | Complete contact dossier — info, search profiles, deals, activity |
234
- | `property_performance_report` | Days on market, inquiry count, pipeline breakdown, activity summary |
235
- | `pipeline_summary` | Deals per stage, total values, stale deals needing attention |
236
- | `smart_lead_intake` | Full lead workflow: dedup, create/update, log notes, deal, reminder |
237
- | `match_contacts_to_property` | Find buyers whose search profiles match a property |
238
-
239
- ### Admin (Verwaltung)
240
-
241
- | Tool | Description |
242
- |---|---|
243
- | `list_webhooks` | List all configured webhook subscriptions |
244
- | `create_webhook` | Subscribe to CRM events (CLIENT_CREATED, PROPERTY_UPDATED, etc.) |
245
- | `delete_webhook` | Remove a webhook subscription |
246
- | `get_contact_favorites` | Get properties a contact has favorited |
247
-
248
- ## Example Conversations / Beispiel-Konversationen
249
-
250
- ### Morning Briefing / Morgen-Briefing
251
-
252
- > **You:** What's on my calendar today?
253
- >
254
- > **AI:** *calls `list_events` with today's date range* — You have 3 viewings scheduled...
255
-
256
- > **Du:** Gibt es neue Leads seit gestern?
257
- >
258
- > **KI:** *ruft `search_contacts` mit created_at_from=gestern auf* — 5 neue Kontakte...
259
-
260
- ### Lead Intake / Leaderfassung
261
-
262
- > **You:** I just got off the phone with Maria Schmidt, +49 157 1234 5678. She's looking for a 3-room apartment in Berlin, budget 300-400k, must have a balcony. She found us on ImmoScout.
263
- >
264
- > **AI:** *calls `smart_lead_intake`* — Contact created (ID: 4521), call note logged, follow-up reminder set for tomorrow 9:00. Would you like me to create a search profile for her criteria?
265
-
266
- ### Property Matching / Objekt-Matching
267
-
268
- > **Du:** Wir haben ein neues Listing: 3-Zimmer-Wohnung in Charlottenburg, 385.000 EUR. Wer kommt als Kaeufer in Frage?
269
- >
270
- > **KI:** *ruft `match_contacts_to_property` auf* — 12 passende Suchprofile gefunden. Top 3: Herr Weber (Score 95%), Frau Mueller (Score 88%), Herr Kim (Score 85%)...
271
-
272
- ### Pipeline Review
273
-
274
- > **You:** How's our sales pipeline looking? Any stale deals?
275
- >
276
- > **AI:** *calls `pipeline_summary`* — 47 active deals, total value 12.3M EUR. 5 deals haven't been updated in 14+ days...
277
-
278
- ### Pre-Call Briefing / Vor dem Anruf
279
-
280
- > **Du:** Gib mir alles ueber Kontakt 3847 — ich rufe gleich an.
281
- >
282
- > **KI:** *ruft `full_contact_360` auf* — Herr Weber, Rating 3 Sterne, sucht 3-Zimmer in Berlin/Potsdam bis 400k. 2 aktive Deals, letzte Aktivitaet vor 3 Tagen...
283
-
284
- ## Datenschutz (DSGVO)
285
-
286
- > **English summary:** Using this MCP server sends personal data from your Propstack CRM into whichever LLM you connect. You (the Propstack customer) are the data controller (Verantwortlicher) under Art. 4(7) GDPR — the tool author hosts and processes nothing. The German section below covers controller responsibility, the legal basis your LLM processing needs, the `fields` parameter for data minimization, automated-decision notes for `match_contacts_to_property`, and audit logging. These points apply to any LLM tool handling customer data; they are stated here because they are easy to overlook.
287
-
288
- ### Verantwortlichkeit
289
-
290
- Dies ist ein quelloffenes Werkzeug (Open Source). Jeder Nutzer verbindet es über seinen eigenen API-Schluessel mit seinem eigenen Propstack-Konto. Der Server ist zustandslos, laeuft lokal beim jeweiligen Nutzer und speichert keine Daten. Es werden keine Daten durch den Autor des Werkzeugs gehostet oder verarbeitet. Der Propstack-Kunde, der dieses Werkzeug einsetzt, ist der **Verantwortliche** im Sinne von Art. 4 Nr. 7 DSGVO.
291
-
292
- ### Verarbeitung durch das LLM
293
-
294
- Bei der Nutzung dieses Werkzeugs werden personenbezogene Daten (Namen, Adressen, Kontaktdaten sowie je nach Tool auch Finanz- bzw. Deal-Daten) in das Kontextfenster des jeweils verbundenen LLM (Claude, ChatGPT usw.) uebertragen. Dies stellt einen **Verarbeitungsvorgang** im Sinne von Art. 4 Nr. 2 DSGVO dar. Der Verantwortliche benoetigt hierfuer:
295
-
296
- - eine **Rechtsgrundlage** nach Art. 6 DSGVO,
297
- - eine entsprechende Angabe in der eigenen **Datenschutzerklaerung** (Transparenzpflichten nach Art. 13/14 DSGVO gegenueber den betroffenen Personen),
298
- - gegebenenfalls einen **Auftragsverarbeitungsvertrag (AVV)** mit dem LLM-Anbieter.
299
-
300
- Dies gilt fuer jedes LLM-gestuetzte Werkzeug, das Kundendaten verarbeitet, und ist nicht spezifisch fuer diesen MCP-Server — es wird hier dennoch ausdruecklich genannt, da es leicht uebersehen wird.
301
-
302
- ### Hinweis zu automatisierten Entscheidungen (`match_contacts_to_property`)
303
-
304
- Das Tool `match_contacts_to_property` erzeugt einen Uebereinstimmungs-Score (Ranking) zwischen Kontakten und einem Objekt — zur Vorlage fuer eine menschliche Pruefung. Es ist als **Entscheidungsunterstuetzung** konzipiert, nicht als autonomer Entscheider: Der Makler prueft die Ergebnisse und handelt manuell. Dadurch faellt die Nutzung nicht unter Art. 22 DSGVO (der ausschliesslich automatisierte Entscheidungen mit rechtlicher oder aehnlich erheblicher Wirkung betrifft). Der Verantwortliche sollte jedoch sicherstellen, dass das Tool auch tatsaechlich so eingesetzt wird — also nicht ohne menschliche Pruefung in eine vollstaendig automatisierte Ansprache eingebunden wird.
305
-
306
- ### Datenminimierung (`fields`-Parameter)
307
-
308
- Die Tools, die personenbezogene Daten in groesserem Umfang zurueckgeben — `search_contacts`, `search_properties`, `search_deals` und `full_contact_360` — unterstuetzen einen optionalen `fields`-Parameter. Damit lassen sich gezielt nur die benoetigten Felder abrufen (z. B. `["first_name", "last_name", "email"]`). Ohne `fields` bleibt das Verhalten unveraendert (alle Felder werden zurueckgegeben). Es wird empfohlen, dass Verantwortliche `fields` nutzen, um nur die fuer den jeweiligen Zweck erforderlichen Daten zu verarbeiten — im Sinne von **Datenschutz durch Technikgestaltung** (Art. 25 DSGVO).
309
-
310
- ### Audit-Logging / Zugriffskontrolle
311
-
312
- Protokollierung von Zugriffen und Zugriffskontrolle liegen in der Verantwortung des Verantwortlichen — etwa ueber die Berechtigungssteuerung von Propstack (API-Schluessel-Berechtigungen) oder ueber Protokollierung auf Client- bzw. Sitzungsebene. Da der Server zustandslos ist und lokal beim jeweiligen Nutzer laeuft, ist eine solche Protokollierung nicht im Werkzeug selbst enthalten.
313
-
314
- ## Development
315
-
316
- ```bash
317
- git clone <repo-url>
318
- cd propstack-mcp-server
319
- npm install
320
- npm run build # tsc → dist/
321
- npm start # requires PROPSTACK_API_KEY
322
- ```
323
-
324
- ### Project Structure
325
-
326
- ```
327
- src/
328
- index.ts # Server entry point (stdio transport)
329
- propstack-client.ts # HTTP client with auth, retry, error handling
330
- types/
331
- propstack.ts # TypeScript interfaces for all API responses
332
- tools/
333
- helpers.ts # Shared formatting utilities
334
- contacts.ts # 7 contact tools
335
- properties.ts # 5 property tools
336
- tasks.ts # 3 task tools (polymorphic: note/todo/event/cancel)
337
- deals.ts # 3 deal pipeline tools
338
- search-profiles.ts # 4 search profile tools
339
- projects.ts # 2 project tools
340
- activities.ts # 2 activity/event tools
341
- emails.ts # 2 email tools
342
- documents.ts # 2 document tools
343
- relationships.ts # 2 relationship tools (ownership/partnership)
344
- lookups.ts # 8 lookup/config tools
345
- composites.ts # 5 smart composite tools
346
- admin.ts # 5 admin tools (webhooks, export, favorites)
347
- ```
348
-
349
- ## License
350
-
351
- MIT
352
-
353
- <a href="https://glama.ai/mcp/servers/@ashev87/propstack-mcp">
354
- <img width="380" height="200" src="https://glama.ai/mcp/servers/@ashev87/propstack-mcp/badge" />
355
- </a>
1
+ # Propstack MCP Server
2
+
3
+ Connect AI assistants (Claude, ChatGPT) to your Propstack real estate CRM.
4
+
5
+ > **Verbinden Sie KI-Assistenten mit Ihrem Propstack-CRM** — Kontakte verwalten, Objekte durchsuchen, Deals pflegen, Besichtigungen planen und Suchprofile erstellen, alles per Sprache oder Chat.
6
+
7
+ ## What you can do / Was Sie damit machen koennen
8
+
9
+ - **Contact management** — search, create, update, and tag contacts with GDPR tracking
10
+ - **Property search & management** — filter by price, rooms, area, status; create and update listings
11
+ - **Deal pipeline** — create deals, move through stages, track win/loss rates
12
+ - **Buyer matching** — create search profiles from natural language ("3-Zimmer in Berlin, bis 400k, mit Balkon") and auto-match to new listings
13
+ - **Task & calendar** — log call notes, set follow-up reminders, schedule viewings
14
+ - **Email** — send templated emails linked to contacts and properties
15
+ - **360-degree contact view** — get a complete briefing before every call
16
+ - **Pipeline dashboards** — deal counts and values per stage, stale deal alerts
17
+ - **Lead intake** — one-call workflow: dedup, create contact, log notes, create deal, set reminder
18
+
19
+ > **Data protection (DSGVO):** Using this server sends personal data from your Propstack CRM into the LLM you connect (Claude, ChatGPT, …). You — the Propstack customer — remain the data controller. See [Datenschutz (DSGVO)](#datenschutz-dsgvo) for responsibility, legal basis, the `fields` data-minimization parameter, and notes on automated decisions.
20
+
21
+ ## Quick Start
22
+
23
+ ### 1. Set your API key
24
+
25
+ ```bash
26
+ export PROPSTACK_API_KEY=your_api_key_here
27
+ ```
28
+
29
+ ### 2a. Claude Desktop
30
+
31
+ Add to your Claude Desktop config (`claude_desktop_config.json`):
32
+
33
+ ```json
34
+ {
35
+ "mcpServers": {
36
+ "propstack": {
37
+ "command": "npx",
38
+ "args": ["-y", "propstack-mcp-server"],
39
+ "env": {
40
+ "PROPSTACK_API_KEY": "your_api_key_here"
41
+ }
42
+ }
43
+ }
44
+ }
45
+ ```
46
+
47
+ ### 2b. Claude Code (CLI)
48
+
49
+ Add to your project's `.mcp.json`:
50
+
51
+ ```json
52
+ {
53
+ "mcpServers": {
54
+ "propstack": {
55
+ "command": "npx",
56
+ "args": ["-y", "propstack-mcp-server"],
57
+ "env": {
58
+ "PROPSTACK_API_KEY": "your_api_key_here"
59
+ }
60
+ }
61
+ }
62
+ }
63
+ ```
64
+
65
+ ### 2c. ChatGPT and claude.ai (web / mobile)
66
+
67
+ These clients only connect to **remote** MCP servers over an HTTPS URL. They
68
+ cannot start a local `npx` command, so this server can't be added to them
69
+ directly — use Claude Desktop, Claude Code, Cursor or another local client
70
+ instead.
71
+
72
+ If you need ChatGPT or the claude.ai apps, the server has to run behind an
73
+ authenticated HTTPS endpoint. **Do not** expose it through an open tunnel or
74
+ an unauthenticated stdio-to-HTTP bridge: anyone with the URL would get full
75
+ read/write access to your CRM with your API key. Open an issue if you need a
76
+ hosted setup.
77
+
78
+ ### 2d. Cursor IDE
79
+
80
+ 1. Open **Settings** (Ctrl+,) → search "MCP"
81
+ 2. Edit **MCP Servers** JSON, or add `mcp.json` in project root / `.cursor/`
82
+
83
+ **Option A — local project** (after `npm run build`):
84
+
85
+ ```json
86
+ {
87
+ "mcpServers": {
88
+ "propstack": {
89
+ "command": "node",
90
+ "args": ["./dist/index.js"],
91
+ "cwd": "C:/Users/you/path/to/propstack_mcp",
92
+ "env": {
93
+ "PROPSTACK_API_KEY": "your_api_key_here"
94
+ }
95
+ }
96
+ }
97
+ }
98
+ ```
99
+
100
+ Or use `.env` in project root — the server loads it automatically; you can omit the `env` block.
101
+
102
+ **Option B — npx** (published package or `npx` from local):
103
+
104
+ ```json
105
+ {
106
+ "mcpServers": {
107
+ "propstack": {
108
+ "command": "npx",
109
+ "args": ["-y", "propstack-mcp-server"],
110
+ "env": {
111
+ "PROPSTACK_API_KEY": "your_api_key_here"
112
+ }
113
+ }
114
+ }
115
+ }
116
+ ```
117
+
118
+ ### 2e. Run directly
119
+
120
+ ```bash
121
+ npm install propstack-mcp-server
122
+ PROPSTACK_API_KEY=your_key npx propstack-mcp-server
123
+ ```
124
+
125
+ ## API Key / API-Schluessel
126
+
127
+ Get your Propstack API key:
128
+
129
+ 1. Log in to [crm.propstack.de](https://crm.propstack.de)
130
+ 2. Go to **Verwaltung > API-Schluessel** (Administration > API Keys)
131
+ 3. Create or copy your V1 API key
132
+
133
+ > **Hinweis:** Der API-Schluessel bestimmt die Berechtigungen. Stellen Sie sicher, dass Lese- und Schreibzugriff fuer die benoetigten Endpunkte aktiviert ist.
134
+
135
+ ## Available Tools (56)
136
+
137
+ ### Contacts (Kontakte)
138
+
139
+ | Tool | Description |
140
+ |---|---|
141
+ | `search_contacts` | Search and filter contacts by name, email, phone, status, tags, broker, GDPR status, custom fields |
142
+ | `get_contact` | Get full details of a single contact with related data |
143
+ | `create_contact` | Create a new contact (auto-dedup by email) |
144
+ | `update_contact` | Update contact details, tags, GDPR status, broker assignment |
145
+ | `delete_contact` | Soft-delete a contact (30-day recycle bin) |
146
+ | `get_contact_sources` | List lead sources (ImmoScout24, Website, Empfehlung, etc.) |
147
+ | `search_contacts_by_phone` | Look up a contact by phone number (formatting-insensitive) |
148
+
149
+ ### Properties (Objekte)
150
+
151
+ | Tool | Description |
152
+ |---|---|
153
+ | `search_properties` | Search properties with 11 range filters, 17 sort fields, custom-field filters |
154
+ | `get_property` | Get full property details including media, custom fields, energy certificate, equipment, layout, cost, and marketing fields |
155
+ | `create_property` | Create a new property listing, including German residential exposé fields (energy certificate, equipment, costs) |
156
+ | `update_property` | Update price, status, description, broker assignment, and German residential exposé fields |
157
+ | `get_property_statuses` | List property statuses (Verfuegbar, Reserviert, Verkauft, etc.) |
158
+
159
+ ### Tasks (Aufgaben & Notizen)
160
+
161
+ | Tool | Description |
162
+ |---|---|
163
+ | `create_task` | Create a note, to-do, appointment, or cancellation (polymorphic) |
164
+ | `update_task` | Mark done, reschedule, update notes |
165
+ | `get_task` | Get task details with linked contacts, properties, projects |
166
+
167
+ ### Deals (Pipeline)
168
+
169
+ | Tool | Description |
170
+ |---|---|
171
+ | `search_deals` | Search deals by stage, pipeline, category, broker, feeling score |
172
+ | `create_deal` | Link a contact to a property at a pipeline stage |
173
+ | `update_deal` | Move deal through pipeline stages, update price/notes |
174
+
175
+ ### Search Profiles (Suchprofile)
176
+
177
+ | Tool | Description |
178
+ |---|---|
179
+ | `list_search_profiles` | List what buyers/renters are looking for |
180
+ | `create_search_profile` | Capture buyer criteria from natural language |
181
+ | `update_search_profile` | Adjust budget, cities, room count, features |
182
+ | `delete_search_profile` | Remove a search profile |
183
+
184
+ ### Projects (Projekte)
185
+
186
+ | Tool | Description |
187
+ |---|---|
188
+ | `list_projects` | List development projects with unit counts |
189
+ | `get_project` | Get project details with all units, media, documents |
190
+
191
+ ### Activities & Events (Aktivitaeten & Termine)
192
+
193
+ | Tool | Description |
194
+ |---|---|
195
+ | `search_activities` | Full activity timeline for a contact, property, or project |
196
+ | `list_events` | Calendar events — viewings, meetings, filtered by date/state |
197
+
198
+ ### Emails (E-Mails)
199
+
200
+ | Tool | Description |
201
+ |---|---|
202
+ | `send_email` | Send email using a Propstack template (snippet) |
203
+ | `update_email` | Mark read/archived, categorize, link to CRM records |
204
+
205
+ ### Documents (Dokumente)
206
+
207
+ | Tool | Description |
208
+ |---|---|
209
+ | `list_documents` | List files attached to a property, project, or contact |
210
+ | `upload_document` | Upload a document (base64 data URI) |
211
+
212
+ ### Images (Bilder)
213
+
214
+ | Tool | Description |
215
+ |---|---|
216
+ | `list_property_images` | List a property's images and floor plans in portal order (IDs, titles, flags) |
217
+ | `upload_image` | Upload an image to a property or project (base64 data URI, portal visibility) |
218
+ | `update_image` | Change an image's title (incl. `title_de` / `title_en`) or portal visibility |
219
+
220
+ ### Relationships (Beziehungen)
221
+
222
+ | Tool | Description |
223
+ |---|---|
224
+ | `create_ownership` | Link a contact as property owner (Eigentuemer) |
225
+ | `create_partnership` | Link a contact as buyer, tenant, etc. (Kaeufer, Mieter) |
226
+
227
+ ### Lookups (Konfiguration)
228
+
229
+ | Tool | Description |
230
+ |---|---|
231
+ | `list_pipelines` | Get deal pipelines with stages (IDs, names, positions) |
232
+ | `get_pipeline` | Get a single pipeline with stage details |
233
+ | `list_tags` | List tags/groups (Merkmale) — filter contacts by group IDs |
234
+ | `create_tag` | Create a new tag for contacts, properties, or activities |
235
+ | `list_activity_types` | List note/todo/event templates for create_task |
236
+ | `list_contact_statuses` | List contact statuses for search/assign |
237
+ | `list_reservation_reasons` | List deal cancellation reasons |
238
+ | `list_custom_fields` | Discover custom field definitions (names, types, options) |
239
+ | `list_users` | List all brokers/agents with contact info |
240
+ | `list_teams` | List teams/departments with member assignments |
241
+ | `list_locations` | List geographic areas (Geolagen) for location matching |
242
+
243
+ ### Smart Composites (Intelligente Workflows)
244
+
245
+ | Tool | Description |
246
+ |---|---|
247
+ | `full_contact_360` | Complete contact dossier — info, search profiles, deals, activity |
248
+ | `property_performance_report` | Days on market, inquiry count, pipeline breakdown, activity summary |
249
+ | `pipeline_summary` | Deals per stage, total values, stale deals needing attention |
250
+ | `smart_lead_intake` | Full lead workflow: dedup, create/update, log notes, deal, reminder |
251
+ | `match_contacts_to_property` | Find buyers whose search profiles match a property |
252
+ | `match_properties_to_contact` | Reverse matching: find properties that fit a contact's search profiles |
253
+
254
+ ### Admin (Verwaltung)
255
+
256
+ | Tool | Description |
257
+ |---|---|
258
+ | `list_webhooks` | List all configured webhook subscriptions |
259
+ | `create_webhook` | Subscribe to CRM events (CLIENT_CREATED, PROPERTY_UPDATED, etc.) |
260
+ | `delete_webhook` | Remove a webhook subscription |
261
+ | `get_contact_favorites` | Get properties a contact has favorited |
262
+
263
+ ## Example Conversations / Beispiel-Konversationen
264
+
265
+ ### Morning Briefing / Morgen-Briefing
266
+
267
+ > **You:** What's on my calendar today?
268
+ >
269
+ > **AI:** *calls `list_events` with today's date range* — You have 3 viewings scheduled...
270
+
271
+ > **Du:** Gibt es neue Leads seit gestern?
272
+ >
273
+ > **KI:** *ruft `search_contacts` mit created_at_from=gestern auf* — 5 neue Kontakte...
274
+
275
+ ### Lead Intake / Leaderfassung
276
+
277
+ > **You:** I just got off the phone with Maria Schmidt, +49 157 1234 5678. She's looking for a 3-room apartment in Berlin, budget 300-400k, must have a balcony. She found us on ImmoScout.
278
+ >
279
+ > **AI:** *calls `smart_lead_intake`* — Contact created (ID: 4521), call note logged, follow-up reminder set for tomorrow 9:00. Would you like me to create a search profile for her criteria?
280
+
281
+ ### Property Matching / Objekt-Matching
282
+
283
+ > **Du:** Wir haben ein neues Listing: 3-Zimmer-Wohnung in Charlottenburg, 385.000 EUR. Wer kommt als Kaeufer in Frage?
284
+ >
285
+ > **KI:** *ruft `match_contacts_to_property` auf* — 12 passende Suchprofile gefunden. Top 3: Herr Weber (Score 95%), Frau Mueller (Score 88%), Herr Kim (Score 85%)...
286
+
287
+ ### Pipeline Review
288
+
289
+ > **You:** How's our sales pipeline looking? Any stale deals?
290
+ >
291
+ > **AI:** *calls `pipeline_summary`* — 47 active deals, total value 12.3M EUR. 5 deals haven't been updated in 14+ days...
292
+
293
+ ### Pre-Call Briefing / Vor dem Anruf
294
+
295
+ > **Du:** Gib mir alles ueber Kontakt 3847 — ich rufe gleich an.
296
+ >
297
+ > **KI:** *ruft `full_contact_360` auf* — Herr Weber, Rating 3 Sterne, sucht 3-Zimmer in Berlin/Potsdam bis 400k. 2 aktive Deals, letzte Aktivitaet vor 3 Tagen...
298
+
299
+ ## Datenschutz (DSGVO)
300
+
301
+ > **English summary:** Using this MCP server sends personal data from your Propstack CRM into whichever LLM you connect. You (the Propstack customer) are the data controller (Verantwortlicher) under Art. 4(7) GDPR — the tool author hosts and processes nothing. The German section below covers controller responsibility, the legal basis your LLM processing needs, the `fields` parameter for data minimization, automated-decision notes for `match_contacts_to_property`, and audit logging. These points apply to any LLM tool handling customer data; they are stated here because they are easy to overlook.
302
+
303
+ ### Verantwortlichkeit
304
+
305
+ Dies ist ein quelloffenes Werkzeug (Open Source). Jeder Nutzer verbindet es über seinen eigenen API-Schluessel mit seinem eigenen Propstack-Konto. Der Server ist zustandslos, laeuft lokal beim jeweiligen Nutzer und speichert keine Daten. Es werden keine Daten durch den Autor des Werkzeugs gehostet oder verarbeitet. Der Propstack-Kunde, der dieses Werkzeug einsetzt, ist der **Verantwortliche** im Sinne von Art. 4 Nr. 7 DSGVO.
306
+
307
+ ### Verarbeitung durch das LLM
308
+
309
+ Bei der Nutzung dieses Werkzeugs werden personenbezogene Daten (Namen, Adressen, Kontaktdaten sowie je nach Tool auch Finanz- bzw. Deal-Daten) in das Kontextfenster des jeweils verbundenen LLM (Claude, ChatGPT usw.) uebertragen. Dies stellt einen **Verarbeitungsvorgang** im Sinne von Art. 4 Nr. 2 DSGVO dar. Der Verantwortliche benoetigt hierfuer:
310
+
311
+ - eine **Rechtsgrundlage** nach Art. 6 DSGVO,
312
+ - eine entsprechende Angabe in der eigenen **Datenschutzerklaerung** (Transparenzpflichten nach Art. 13/14 DSGVO gegenueber den betroffenen Personen),
313
+ - gegebenenfalls einen **Auftragsverarbeitungsvertrag (AVV)** mit dem LLM-Anbieter.
314
+
315
+ Dies gilt fuer jedes LLM-gestuetzte Werkzeug, das Kundendaten verarbeitet, und ist nicht spezifisch fuer diesen MCP-Server — es wird hier dennoch ausdruecklich genannt, da es leicht uebersehen wird.
316
+
317
+ ### Hinweis zu automatisierten Entscheidungen (`match_contacts_to_property`)
318
+
319
+ Das Tool `match_contacts_to_property` erzeugt einen Uebereinstimmungs-Score (Ranking) zwischen Kontakten und einem Objekt — zur Vorlage fuer eine menschliche Pruefung. Es ist als **Entscheidungsunterstuetzung** konzipiert, nicht als autonomer Entscheider: Der Makler prueft die Ergebnisse und handelt manuell. Dadurch faellt die Nutzung nicht unter Art. 22 DSGVO (der ausschliesslich automatisierte Entscheidungen mit rechtlicher oder aehnlich erheblicher Wirkung betrifft). Der Verantwortliche sollte jedoch sicherstellen, dass das Tool auch tatsaechlich so eingesetzt wird — also nicht ohne menschliche Pruefung in eine vollstaendig automatisierte Ansprache eingebunden wird.
320
+
321
+ ### Datenminimierung (`fields`-Parameter)
322
+
323
+ Die Tools, die personenbezogene Daten in groesserem Umfang zurueckgeben — `search_contacts`, `search_properties`, `search_deals` und `full_contact_360` — unterstuetzen einen optionalen `fields`-Parameter. Damit lassen sich gezielt nur die benoetigten Felder abrufen (z. B. `["first_name", "last_name", "email"]`). Ohne `fields` bleibt das Verhalten unveraendert (alle Felder werden zurueckgegeben). Es wird empfohlen, dass Verantwortliche `fields` nutzen, um nur die fuer den jeweiligen Zweck erforderlichen Daten zu verarbeiten — im Sinne von **Datenschutz durch Technikgestaltung** (Art. 25 DSGVO).
324
+
325
+ ### Audit-Logging / Zugriffskontrolle
326
+
327
+ Protokollierung von Zugriffen und Zugriffskontrolle liegen in der Verantwortung des Verantwortlichen — etwa ueber die Berechtigungssteuerung von Propstack (API-Schluessel-Berechtigungen) oder ueber Protokollierung auf Client- bzw. Sitzungsebene. Da der Server zustandslos ist und lokal beim jeweiligen Nutzer laeuft, ist eine solche Protokollierung nicht im Werkzeug selbst enthalten.
328
+
329
+ ## Development
330
+
331
+ ```bash
332
+ git clone <repo-url>
333
+ cd propstack-mcp-server
334
+ npm install
335
+ npm run build # tsc → dist/
336
+ npm start # requires PROPSTACK_API_KEY
337
+ ```
338
+
339
+ ### Project Structure
340
+
341
+ ```
342
+ src/
343
+ index.ts # Server entry point (stdio transport)
344
+ propstack-client.ts # HTTP client with auth, retry, error handling
345
+ types/
346
+ propstack.ts # TypeScript interfaces for all API responses
347
+ tools/
348
+ helpers.ts # Shared formatting utilities
349
+ contacts.ts # 7 contact tools
350
+ properties.ts # 5 property tools
351
+ tasks.ts # 3 task tools (polymorphic: note/todo/event/cancel)
352
+ deals.ts # 3 deal pipeline tools
353
+ search-profiles.ts # 4 search profile tools
354
+ projects.ts # 2 project tools
355
+ activities.ts # 2 activity/event tools
356
+ emails.ts # 2 email tools
357
+ documents.ts # 2 document tools
358
+ relationships.ts # 2 relationship tools (ownership/partnership)
359
+ lookups.ts # 8 lookup/config tools
360
+ composites.ts # 5 smart composite tools
361
+ admin.ts # 5 admin tools (webhooks, export, favorites)
362
+ ```
363
+
364
+ ## License
365
+
366
+ MIT
367
+
368
+ <a href="https://glama.ai/mcp/servers/@ashev87/propstack-mcp">
369
+ <img width="380" height="200" src="https://glama.ai/mcp/servers/@ashev87/propstack-mcp/badge" />
370
+ </a>