Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PROPSTACK_API_KEY | Yes | Propstack V1 API key |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_contacts | Search and filter contacts in Propstack CRM. Use this tool to:
The 'q' parameter searches across: first name, last name, all emails, all addresses, and all phone numbers. Phone search ('phone_number') ignores formatting — both 015712345678 and 0157-123-456-78 will match. Returns paginated results. Use expand=true for full details including custom fields. |
| get_contact | Get full details of a single contact by ID. Use this tool to:
Use 'include' to load related data in one request. |
| create_contact | Create a new contact in Propstack CRM. Use this tool to:
Auto-upserts: if a contact with the same email or old_crm_id already exists, it will be updated instead of creating a duplicate. Use get_contact_sources first to find valid source IDs. |
| update_contact | Update an existing contact in Propstack CRM. Use this tool to:
Tag management options:
Only provide the fields you want to change. |
| delete_contact | Delete a contact from Propstack CRM (soft delete). The contact is moved to a 30-day recycle bin and can be restored. Use this tool for:
|
| get_contact_sources | List all available contact/lead sources in Propstack. Returns the list of sources like "Immobilienscout 24", "Website", "Empfehlung", etc. with their IDs. Use this tool to look up valid source IDs before creating or updating contacts with client_source_id. |
| search_contacts_by_phone | Look up a contact by phone number. This is the go-to tool for voice agent caller identification. When a call comes in, use this tool with the caller's phone number to instantly find the matching contact. Phone matching ignores formatting — all of these find the same contact: 015712345678, 0157-123-456-78, +49 157 12345678 Returns the matching contact(s) with key details. If no match is found, the caller is unknown and you should create a new contact. |
| search_properties | Search and filter properties (Objekte) in Propstack CRM. Use this tool to:
The 'q' parameter searches: unit_id, street, zip code, city, district, exposé ID. Range filter pattern: 11 numeric fields each have _from and _to variants. For example, price_from=200000 & price_to=400000 finds properties priced 200–400k. Available range fields: price, base_rent, total_rent, property_space_value, living_space, plot_area, number_of_rooms, number_of_bed_rooms, number_of_bath_rooms, floor, construction_year. Common queries:
Always returns total count. Use expand=true for custom fields. |
| get_property | Get full details of a single property by ID. Use this tool to:
Always fetches with new=1 (extra fields) and expand=1 (custom fields). |
| create_property | Create a new property (Objekt) in Propstack CRM. Use this tool to:
Use get_property_statuses to look up valid status IDs. Use the relationships_attributes array to link an owner contact on creation. rs_type values: APARTMENT, HOUSE, TRADE_SITE, GARAGE, SHORT_TERM_ACCOMODATION, OFFICE, GASTRONOMY, INDUSTRY, STORE, SPECIAL_PURPOSE, INVESTMENT. rs_category provides sub-types (e.g. PENTHOUSE, VILLA, MAISONETTE for APARTMENT/HOUSE). |
| update_property | Update an existing property in Propstack CRM. Use this tool to:
Only provide the fields you want to change. Use get_property_statuses to look up valid status IDs. |
| get_property_statuses | List all available property statuses in Propstack. Returns statuses like "Verfügbar", "Reserviert", "Verkauft" with their IDs, colors, and sort positions. Use this tool to look up valid status IDs before:
|
| create_task | Create a task (note, to-do, appointment, or cancellation) in Propstack. This is the central write endpoint for ALL activity types. The mode is determined by which flags you set: MODE 1 — Note (Notiz): Just provide title + body. No special flags needed. Example: log a call note after a conversation. MODE 2 — To-do (Aufgabe): Set is_reminder: true + due_date. Example: "remind me to call Herr Müller back tomorrow" MODE 3 — Appointment (Termin): Set is_event: true + starts_at + ends_at. Example: "schedule a viewing at Musterstr 12 at 3pm" MODE 4 — Cancellation (Absage): Set reservation_reason_id to a valid reason. Example: "cancel deal — buyer withdrew financing" Always link tasks to contacts/properties/projects via the *_ids arrays so they appear in the correct activity feeds. The body field accepts HTML content. |
| update_task | Update an existing task in Propstack. Use this tool to:
Only provide the fields you want to change. |
| get_task | Get full details of a single task by ID. Returns the task with all linked entities expanded (contacts, properties, projects, viewings) by default. Use this tool to:
|
| search_deals | Search and filter deals (contact↔property relationships) in Propstack. Use this tool to:
A "deal" represents an interested contact linked to a property at a specific stage in a sales/rental pipeline (e.g. Anfrage → Besichtigung → Reserviert → Notartermin → Verkauft). Use include="client,property" to get expanded contact and property details in one request. Common queries:
|
| create_deal | Create a deal linking an interested contact to a property in Propstack. A deal represents a contact's interest in a property and tracks it through pipeline stages (e.g. Anfrage → Besichtigung → Reserviert → Notartermin → Verkauft). Use this tool after:
Requires client_id, property_id, and deal_stage_id. Use list_pipelines or get_pipeline to find valid pipeline and stage IDs. |
| update_deal | Update an existing deal in Propstack. Use this tool to:
Only provide the fields you want to change. |
| list_search_profiles | List search profiles (Suchprofile) in Propstack. A search profile captures what a buyer or renter is looking for — cities, price range, room count, features, etc. Every search profile belongs to a contact. Use this tool to:
Filter by contact ID to answer "What is this buyer looking for?" |
| create_search_profile | Create a search profile (Suchprofil) for a contact in Propstack. This is THE killer feature for an AI real estate assistant. When a buyer or renter describes what they're looking for in natural language, map it to structured search criteria: Example conversation: "Herr Weber sucht eine 3-Zimmer-Wohnung in Berlin oder Potsdam, Budget 300.000–400.000 €, muss einen Balkon haben" → client_id: <Herr Weber's ID> marketing_type: "BUY" rs_types: ["APARTMENT"] cities: ["Berlin", "Potsdam"] number_of_rooms: 3, number_of_rooms_to: 3 price: 300000, price_to: 400000 balcony: "true" Mapping guide:
Feature booleans use strings: "true" = required, "false" = excluded, omit = don't care. Use radius search (lat/lng/radius) for "within 5km of Alexanderplatz". |
| update_search_profile | Update an existing search profile in Propstack. Use this tool to:
Only provide the fields you want to change. |
| delete_search_profile | Delete a search profile from Propstack. Use this tool when:
|
| list_projects | List development projects in Propstack. A project is a "super-object" that groups multiple property units (e.g. a new-build apartment complex with 20 units). Use this tool to:
Use expand=true to include custom fields in the response. |
| get_project | Get full details of a single project by ID. Returns the complete project with all units, images, floorplans, documents, and links. Use this tool to:
|
| search_activities | Search the activity feed/timeline in Propstack. Activities are the read-only feed of everything that happened: emails sent, notes logged, tasks created, events scheduled, cancellations, GDPR policy changes, etc. Use this tool to:
Activity types:
Use list_activity_types to see all valid types for this account. |
| list_events | List calendar events (Termine) in Propstack. Events are appointments like property viewings, client meetings, notary appointments, etc. Use this tool to:
Event states:
|
| send_email | Send an email using a Propstack email template (snippet). Propstack sends emails through connected broker email accounts. The broker_id determines which account sends the email. The snippet_id selects the email template to use. Use this tool to:
Link the email to contacts, properties, and projects so it appears in the correct CRM activity feeds. Important:
|
| update_email | Update an email in Propstack. Use this tool to:
Only provide the fields you want to change. |
| list_documents | List documents attached to a property, project, or contact. Documents include floor plans (Grundrisse), exposés, contracts, photos, and any other uploaded files. Use this tool to:
Filter by exactly one of property_id, project_id, or client_id. |
| upload_document | Upload a document to a property, project, or contact in Propstack. The doc field must be a base64 data URI, e.g.: "data:application/pdf;base64,JVBERi0xLjQ..." "data:image/png;base64,iVBORw0KGgo..." Attach to exactly one entity: property_id, project_id, or client_id. Use the boolean flags to classify the document:
|
| create_ownership | Link a contact as the OWNER (Eigentümer) of a property. Use this tool to:
The ownership appears on both the contact's and the property's record. |
| create_partnership | Link a contact as a PARTNER (buyer, tenant, etc.) to a property. Use this tool to:
The name field describes the role (e.g. "Käufer", "Mieter", "Verwalter"). |
| list_pipelines | List all deal pipelines and their stages in Propstack. Returns each pipeline with its ordered stages, including stage IDs, names, positions, colors, and chance percentages. You NEED stage IDs from this tool to create or move deals. Call this before using create_deal or update_deal if you don't know the stage IDs. Typical pipelines: Sales (Verkauf), Acquisition (Akquise), Rental (Vermietung). Typical stages: Anfrage → Besichtigung → Reserviert → Notartermin → Verkauft. |
| get_pipeline | Get a single deal pipeline by ID with its stages. Returns the pipeline with all stages in order. Use this when you already know which pipeline you need and want its stage details. |
| list_tags | List all tags/labels (Merkmale/Gruppen) in Propstack. Use these IDs to filter contacts (search_contacts group param) or assign tags (create_contact/update_contact group_ids). Filter by entity to get tags for contacts, properties, or activities. Entity: for_clients (default), for_properties, for_activities. Returns flat list: Name (ID: 123). Use super_groups param to optionally try hierarchical view via /super_groups. |
| create_tag | Create a new tag/label (Merkmal) in Propstack. Tags are used to categorize contacts, properties, and activities. Optionally assign to a parent super-group (Obermerkmal) for hierarchy. Examples: "Penthouse-Käufer", "VIP", "Kapitalanleger", "Erstbezug". |
| list_custom_fields | List custom field definitions for an entity type in Propstack. IMPORTANT: Call this tool to discover what custom fields exist before reading or writing custom field values on contacts, properties, etc. Returns field groups, each containing field definitions with:
To READ custom fields: use expand=true on search or get tools. To WRITE custom fields: use partial_custom_fields: {"cf_field_name": "value"}. To FILTER by custom fields: add cf_fieldname=value as a search param. |
| list_users | List all brokers/agents (Nutzer) in the Propstack account. Returns team members with their IDs, names, email, phone, position, team, and department assignments. You need broker IDs for:
|
| list_teams | List all teams/departments in Propstack. Returns teams with their broker member assignments. Use for team-level filtering and to understand the organizational structure. |
| list_activity_types | List all activity/task types in Propstack. These are templates for creating notes, todos (reminders), events, and messages. Each has an id, name, and category. Use these IDs when creating tasks:
Categories map to search_activities filter: for_notes→note, for_reminders→reminder, for_events→event, message→message. |
| list_contact_statuses | List contact statuses (Kontaktstatus) in Propstack. Use these IDs for search_contacts (status param) and create_contact/update_contact (client_status_id). E.g. "Lead", "Kunde", "Archiviert". |
| list_reservation_reasons | List deal cancellation reasons (Reservierungsgründe/Absagegründe). Use when creating deal cancellations (create_task with reservation_reason_id) or filtering lost deals (search_deals reservation_reason_ids). |
| list_locations | List geographic areas/districts (Geolagen) in Propstack. Returns location IDs and names used for property and search profile location matching. Use location IDs when creating search profiles or filtering properties by area. |
| full_contact_360 | Get a complete 360° view of a contact — everything you need before calling a client. Combines 4 API calls in parallel:
Returns a complete contact dossier in one request. Use this when you need the full picture: "Tell me everything about Herr Weber." |
| property_performance_report | Performance report for a property — days on market, inquiry count, pipeline breakdown, and activity summary. Combines 3 API calls in parallel:
Calculates: days on market, total inquiries, deals by stage/category, and recent activity breakdown by type. Use when asked: "How is the Friedrichstr property doing?" |
| pipeline_summary | Pipeline overview — deals per stage, total values, and stale deals needing attention. Fetches all deal pipelines and deals, then aggregates:
Filter by pipeline_id and/or broker_id. Use when asked: "How's the pipeline looking?" or "Give me a sales overview." |
| smart_lead_intake | Complete lead intake workflow — dedup check, create/update contact, log notes, create deal if specific property, and set follow-up reminder. Perfect for post-call processing from a voice agent. Handles the entire intake in one tool call:
Returns what was done: created vs updated, IDs of all created records. |
| match_contacts_to_property | Find contacts whose search profiles match a property. Returns a ranked list with match scores. Use when a new listing comes in to find potential buyers/renters: "Who should I send this new listing to?" Logic:
|
| list_webhooks | List all configured webhooks in Propstack. Returns each webhook with its URL, subscribed events, active status, and HMAC secret. Use to review existing automation triggers. |
| create_webhook | Create a webhook to subscribe to Propstack CRM events. Propstack will POST a JSON payload to target_url whenever the event fires. Use HMAC verification (secret in response) to validate payloads. Common events:
Use this to set up automation triggers, e.g.: "Notify me when any property status changes" "Alert when a new contact is created" |
| delete_webhook | Delete a webhook subscription from Propstack. Removes the webhook so Propstack will stop sending events to its URL. |
| export_data | Bulk export an entire data table from Propstack as JSON. Useful for reporting, backup, migration, or analytics. Returns the full contents of the selected table. Available tables:
|
| get_contact_favorites | Get properties that a contact has favorited/bookmarked. Returns the list of properties the contact has marked as favorites in Propstack. Use to understand which listings a buyer is most interested in. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |