MCP Server

Connect AI agents to your Propstreet data using the Model Context Protocol.

The Propstreet MCP server lets AI assistants (Claude, Cursor, Windsurf, etc.) read and write your contacts, companies, links, properties, projects, prospects, and recorded deals (comps) directly. It uses the same data and permissions as the REST API, exposed over the Model Context Protocol standard.

Quick Reference

Property Value
Endpoint https://app.propstreet.com/mcp
Transport Streamable HTTP (stateless)
Protocol MCP 2026-07-28, with legacy client compatibility
Auth Bearer token (api:public scope)
Rate Limiting Same as REST API, varies by token type (see Limits)
Discovery GET /.well-known/oauth-protected-resource/mcp

How It Works

Your AI Agent  ──MCP protocol──▶  Propstreet MCP Server
                                        │
                                  Same services & tenant
                                  isolation as REST API
                                        │
                                  Your contacts, companies,
                                  links, properties,
                                  projects, prospects & comps

The MCP server is a thin layer over the same service layer that powers the REST API. Everything you can do via MCP respects the same permissions, rate limits, and data isolation as regular API calls.

Connecting Your AI Agent

Option 1: OAuth Auto-Connect (supported clients)

Many MCP clients support OAuth discovery + Dynamic Client Registration (DCR). Point your client at:

https://app.propstreet.com/mcp

If the client supports this flow, it will:

  1. Discover auth endpoints via /.well-known/oauth-protected-resource/mcp (the 401 from /mcp points there; the resource it names is https://app.propstreet.com/mcp)
  2. Register itself automatically (Dynamic Client Registration)
  3. Redirect you to Propstreet to approve access
  4. Start making tool calls

Claude (Web/Desktop)

Add the connector via Settings → Connectors and use:

  • URL: https://app.propstreet.com/mcp

[!note] For remote servers, Claude Desktop uses the Connectors UI. Remote MCP entries in claude_desktop_config.json are ignored.

Cursor / Windsurf

Add an MCP server with:

  • Type: Streamable HTTP
  • URL: https://app.propstreet.com/mcp

The editor will prompt you to authenticate on first use.

Option 2: Personal Access Token

For quick testing or scripts, use a PAT:

  1. Generate a token at Settings → Personal Settings → Personal Access Tokens
  2. Configure your MCP client with a Bearer token header

Claude Code (CLI)

claude mcp add --transport http propstreet \
  https://app.propstreet.com/mcp \
  --header "Authorization: Bearer YOUR_PAT_TOKEN"

[!note] In Claude Code CLI, remote Streamable HTTP servers use --transport http.

curl (legacy compatibility testing)

Current MCP clients should connect to the endpoint directly and handle discovery and request metadata. The raw request below only verifies compatibility with older clients that negotiate through initialize:

curl -X POST https://app.propstreet.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Authorization: Bearer YOUR_PAT_TOKEN" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}'

[!warning] PATs have lower rate limits than OAuth clients. For production use, set up a Bot User with Client Credentials. See the Authentication Guide and Limits for details.

Option 3: Bot User + Client Credentials

For production integrations:

  1. Create a Bot User and OAuth Client at Settings → Company Settings → Client Registrations
  2. Obtain an access token via Client Credentials flow (see Authentication Guide)
  3. Use the access token as a Bearer token in your MCP client configuration

Available Tools

Once connected, your AI agent can use up to 100 tools. Visibility is role-scoped: 40 tools are common to all accounts; broker accounts add 50 project, prospect, room, teaser and comps tools; counterparty accounts add up to 10 mandate, offer, and pre-market-teaser tools, depending on verification and visible invitations. Cross-role accounts see the union.

Discovery

Tool Description
find Exact field-based search (field:value) across contacts, companies, and (broker) projects
search_network Semantic search across the user's Network — contacts and companies, ranked by embedding similarity
search_properties Spatial + asset-type search across properties the caller owns (tenant-scoped, not market comparables)
search_projects (broker) Spatial + filter search across projects, including linked-property attributes
search_mandates (investor) Spatial + filter search across investment strategies

Contacts

Tool Description
list_contacts List contacts with optional country and tag filters
get_contact Get by smart ID (ID, email, name, or external ref)
create_contact Create with name, email, phone, tags, language, company, photo
update_contact Partial update (name, email, phone, tags, language, photo)
delete_contact Permanently delete (cannot be undone). Use preview=true for dry run
add_contact_task Add a follow-up task (call, meeting or email with a due date; optional assignee and note)
complete_contact_task Complete one task on the contact (the task's id or its list_activities row id)

Companies

Tool Description
list_companies List companies with optional country and tag filters
get_company Get by smart ID (ID, name, or external ref)
create_company Create with name, country, domain, tags, strategy, logo
update_company Partial update (name, country, website, domain, tags, strategy, logo)
delete_company Permanently delete (cannot be undone). Use preview=true for dry run
add_company_task Add a follow-up task (call, meeting or email with a due date; optional assignee and note)
complete_company_task Complete one task on the company (the task's id or its list_activities row id)
Tool Description
create_link Create or reuse a contact-company relationship using smart contact/company refs; a job title you give replaces the link's current one
delete_link Remove a contact-company relationship with optional preview=true dry run

Properties

These tools reach your organisation's own properties only. A property recorded for a deal — somebody else's building — is read with get_comp and changed with update_comp_facts, move_comp and set_comp_property_picture; its id answers not_found here, with a message that says so.

Tool Description
list_properties List properties with optional country and asset-type filters
get_property Get by smart ID (ID or name)
create_property Create a property with description, location, tenure, and idempotency support
update_property Partial update (name, description, country, locality, coordinates, tenure)
delete_property Permanently delete (cannot be undone). Use preview=true for dry run

Comps (broker)

Market transactions — the deals of your own closed projects and the deals your team recorded from the press and market contacts, each anchored on a property with a map location. A Professional-plan module: every tool answers plan_required in plain words for an organisation on another plan. The write tools run in conversations only; a scheduled run can read deals but never records or changes one.

Tool Description
list_comps List deals with the Transactions page's filters (property type or sub-type such as retail/grocery, period, source channel, place, point + radius, price, yield, party, advisor, project, free text) plus the analysis of the selection and a scope block; each row's property carries its pictureUrl; sort takes an axis with - for descending, as the public API does
get_comp One deal in full — property facts as of the deal and its picture (property.pictureId, property.pictureUrl), parties, sources, what it is missing, its etag and the last 20 history rows; a deal hidden from the list is found by its name too
create_comp Record a deal on an existing property record or a new one (a text address is geocoded), with price, yield, dates, parties, sources; a likely duplicate is a conflict listing the existing deals, and force=true records it anyway
update_comp Change a deal's own fields through a {set, clear} patch; honours ifMatchEtag
move_comp Move a deal to another property record, or to a new one for somebody else's building (a text address is geocoded); honours ifMatchEtag
update_comp_facts Correct a deal's property facts as of the deal (types and areas, land, building rights, year built, lease term, income, costs), restated in full. A deal's facts are locked when it is recorded, so update_property never changes them. On somebody else's building the facts are restated for this deal only; on one of your own properties only its owner or an admin may correct them (access_denied otherwise), and the correction applies to every deal recorded with the same facts; honours ifMatchEtag
set_comp_property_picture Set or remove the picture of a deal's property from a public https pictureUrl (fetched and stored) or a REST-uploaded pictureFileId; an empty pictureFileId removes it. Every deal on the property shows it; on one of your own properties only its owner or an admin may change it; honours ifMatchEtag
add_comp_party Add a seller, buyer or advisor — a contact or company in the network, or the organisation itself (ownFirm)
remove_comp_party Remove a party by its id; the history keeps it. preview=true for a dry run
add_comp_source Add an article, an activity-log note (optionally filed on a contact or company in the same call) or a contact/company as a source
remove_comp_source Remove a source by its id; the history keeps it. preview=true for a dry run
add_comp_note Add a note to the deal's history
delete_comp Delete a recorded deal, restorable with restore_comp; a deal from a closed project is corrected on the project instead. preview=true for a dry run
restore_comp Bring a deleted deal back with its parties, sources and history; a deal merged into another cannot be restored
hide_comp Hide a closed project's deal from the team's list and analysis (the project's owner or an admin)
unhide_comp Show a hidden deal again
merge_comps Merge two deals that are one: the kept deal takes the named fields and the other's parties and sources; the other is deleted for good (when the other is a closed project's deal, that one is kept). preview=true for a dry run

Files

Uploaded documents and images, scoped to what the caller can access.

Tool Description
search_files Semantic search over uploaded documents and images; optional projectRef / prospectRef / roomRef / offerRef narrow the scope
list_files List uploaded documents (newest first) within an optional scope, without searching their contents

Projects (broker)

Sell-side deals — open a project, add prospects, track stage, close on outcome.

A closed project's transaction carries the deal the closing became — its compId, parties and dates — wherever the project is read (find, list_projects, get_project, search_projects).

Tool Description
list_projects List with status/stage/teaser filters
get_project Get by smart ID (ID, name, or external ref)
create_project Create project with optional smart price, count and cover
update_project Update name, mandate notes, smart price, or cover
close_project Close as sold/withdrawn with smart deal fields; buyerCompanyRef, sellerRef, sellerAdvisorRef, buyerAdvisorRef, signedOn, completedOn and completedIsPlanned go on the deal the closing becomes (advisors may be a person or a company), dealName names it (the project's name when omitted, unless the project is still untitled), priceCertainty / yieldCertainty (confirmed, reported, estimated) and priceApproximate / yieldApproximate ("ca") qualify the figures, and the answer carries the deal's compId (empty on a plan without comps or for a closing without a sale); priceUnknown records a sale whose price was not disclosed (no price with it; none of these with buyerType: none)
correct_project_close Correct a closed project's outcome through a {set, clear} patch — price, yield, priceUnknown, their certainty and "ca", buyer type, the buyer (buyerCompanyRef, buyerContactRef, as close_project names it), seller and advisors, dates, property, portfolio and its property count; the deal it became follows; honours ifMatchEtag. preview=true for a dry run
delete_project Delete a draft project; restorable for 30 days with restore_project. Use preview=true for dry run
restore_project Restore a project deleted within the last 30 days, with the prospects and external refs the delete removed

Prospects (broker)

The prospect list: the contacts and companies a broker is courting on a project.

Tool Description
list_prospects List prospects on a project with pipeline stage filters
get_prospect Get prospect by smart ID within smart project scope
add_prospect Add contacts/companies via smart identifiers (max 100)
update_prospect Update owner, room-access expiry, tags, or external refs; owner and project tags on up to 100 prospects at once with prospectRefs
set_prospect_interest Record the broker's judgement (interested, maybe, not_interested) on one or many prospects, or clear it with none
override_prospect_stage Correct the process stage of one or many prospects, with a reason
remove_prospect Remove one or up to 100 prospect-list entries (prospectRefs), history kept, with optional preview=true
restore_prospect Put one or many removed prospects back on the prospect list, with their history; optional preview=true
classify_prospects Classify one or many prospects by pipeline stage (optional note, logged on each prospect as its own note entry)
set_prospect_contact_person Designate a contact person on a company-only prospect
add_prospect_task Add a follow-up task to one or many prospects (max 100; per-prospect results)
complete_prospect_task Complete one task on a prospect (its nextTask id or its list_activities row id)
list_prospect_projects List projects where a contact or company is a prospect

Rooms (broker)

Case Rooms — the secure workspaces a broker opens for external participants (Case Rooms and Seller Portals), with document folders, access requests, reports, and — on Case Rooms — the per-prospect Q&A desk.

Tool Description
list_rooms List the broker's rooms (Case Rooms + Seller Portals) on a project, with open-question counts
get_room Room context in one shot — members, folders/files, access requests, reports, engagement, and a Q&A rollup
create_room Open a new Case Room on a project
list_questions List a room's Q&A threads (subject, status, category, priority, assignee, prospect), with optional filters
get_question Read one Q&A thread in full — every post, including internal drafts not yet released to the prospect
draft_answer Write an internal draft answer on a thread — never sent to the prospect; a broker reviews and releases it
update_question Triage a thread — set category and/or priority, or route it to a team member

Teasers (broker)

Curated, anonymised views of a project or its post-NDA Case Rooms. See the Teasers guide for the field model and lifecycle.

Tool Description
get_project_teaser Read the broker-authored teaser for a project — stage, timestamps, per-field display
update_project_teaser Update a project teaser — set or clear fields, with optional ifMatchEtag concurrency
get_room_teaser Read the broker-authored per-room teaser inside a Case Room
update_room_teaser Update a room teaser — set or clear fields, with optional ifMatchEtag concurrency

Mandates (investor)

The investor's acquisition criteria — target geography, asset types, ticket size. Used to match incoming offers.

Tool Description
list_mandates List the caller's mandates
get_mandate Get by smart ID (ID, name, or external ref)
create_mandate Create a mandate with target geography, asset types, ticket size, and idempotency
update_mandate Partial update via set / clear patch semantics
delete_mandate Permanently delete (cannot be undone). Use preview=true for dry run

Offers (counterparty)

Read-only inbox of visible offers for the caller: broker-shared buying opportunities, pending invitations, and accepted Seller Portal offers where the caller is the seller. list_offers rows include category (buying, invitation, selling) plus lifecycle status so agents do not need to infer the workflow from missing fields.

Tool Description
list_offers List offers with optional category and status filters
get_offer Get an offer by smart ID — lifecycle detail, or a pending invitation envelope before acceptance

Property Teasers (investor)

The investor-authored pre-market teaser on a property the caller owns — what brokers see before a property goes to market. See the Teasers guide.

Tool Description
get_property_teaser Read the pre-market teaser on a property, or a status code when none exists yet
update_property_teaser Update the pre-market teaser — set or clear fields, with optional ifMatchEtag concurrency

Activities

Tool Description
log_activity Log a note, meeting, call or email against a contact, company, prospect, or offer. Scopes are mutually exclusive: networkRef, projectRef+prospectRef, projectRef alone (a project-level note, type note only), or offerRef. News only on a contact or company (networkRef)
list_activities Read activities (notes, news, meetings, calls, emails, audit events) across contacts, companies, projects, prospects, and offers; a note or news item that is a source of a deal names it in sourceOfComps (id, name)
list_tasks List follow-up tasks across contacts, companies and prospects — yours by default; due windows overdue, today, next_7_days, later, done7; narrow by kind (types) or to one contact, company or project (contactRef, companyRef, projectRef)
cancel_task Cancel one follow-up task on a contact, company or prospect, named by its record and its id. A canceled task cannot be reopened
reopen_task Reopen one completed follow-up task on a contact, company or prospect, so the task is open again
move_task Move one open follow-up task to another contact, company or prospect. Answers with the task under a new id
edit_task Edit one follow-up task: restate its type, due date, assignee or note. Answers with the task under a new id
archive_activity Archive one row on a contact, company, project, prospect, or offer. Name the record with the same scope axes as log_activity; the id is looked up on that record only. Notes, follow-up tasks, task completions and stage corrections can be archived
unarchive_activity Restore one archived row — the undo of archive_activity
revise_note Replace a note with a new revision; the new revision has a new id and the old one expires

Profile

Tool Description
get_me The caller's identity, capability statuses (broker/investor: active/pending/inactive), and team membership
update_me Update the caller's own user profile (name, job title, languages, theme) — for onboarding and business-card edits
update_team Update the caller's primary team profile. Requires team-admin; investor-values fields are atomic

Tags

Tool Description
list_tags List distinct tags across contacts/companies

Preview Mode

The delete tools (delete_contact, delete_company, delete_project, delete_property, delete_mandate, delete_link), remove_prospect, close_project, correct_project_close, delete_comp, remove_comp_party, remove_comp_source, merge_comps and restore_prospect accept preview=true. When set, the tool returns an impact summary (linked prospects, activity count, blockers) without executing the action. Other tools marked destructive — the update_* tools, move_comp, hide_comp, set_comp_property_picture, set_prospect_contact_person, cancel_task, move_task, edit_task, archive_activity, revise_note, create_link and the prospect judgement and stage tools — do not take preview.

Prompts (Guided Workflows)

The MCP server includes pre-built prompts that guide your AI agent through common multi-step workflows:

Prompt Description
prospect_review Review all prospects on a project with pipeline analysis
pipeline_summary Overview of pipeline health across all active projects
reconcile_contacts Compare Propstreet contacts against external CRM data

Use these as slash commands in your AI client (e.g., /prospect_review in Claude).

Resources

The server exposes a domain guide resource that MCP clients can read on connection:

Resource Description
propstreet://api/schema Domain terminology, classifications, search operators

This helps the agent understand Propstreet concepts (projects, prospects, pipeline stages, etc.) before making tool calls.

Example Conversations

Once connected, you can ask your AI agent things like:

  • "Show me all contacts tagged 'investor' that were updated this month"
  • "Create a new project called 'Oslo Office Portfolio' with exclusive mandate"
  • "Create a property called 'Antwerp Logistics Park' with country BE and locality Antwerp"
  • "Add these 5 contacts as prospects to project 123"
  • "What's the pipeline status across all my active projects?"
  • "Find companies focused on logistics real estate in Sweden"
  • "Show me all properties in Sweden and clear the coordinates on property 123"
  • "Log a meeting note on contact 456 about the Q1 pipeline review"

Troubleshooting

"Unauthorized" or 401 errors

  • Verify your token is valid and not expired
  • Ensure the token has api:public scope
  • PATs expire after 30 days — regenerate if needed
  • A token must be issued for the MCP server (https://app.propstreet.com/mcp) or for Propstreet as a whole; one that is neither — such as a connection made before October 2026 — gets 401. Your MCP client signs in again on its own; if it does not, reconnect it
  • Use the server URL exactly as https://app.propstreet.com/mcp, without a trailing slash: the OAuth resource is matched exactly

"Forbidden" or 403 errors

  • Your account may lack the required permissions
  • Contact your organization admin to verify your role

Rate limit errors (429)

  • See Limits for current rate limits by token type

Tools not appearing

  • Ensure the MCP endpoint URL is exactly https://app.propstreet.com/mcp
  • Check that your client supports Streamable HTTP transport
  • Try disconnecting and reconnecting the MCP server

Safety reminder

  • Only connect AI clients to MCP servers you trust
  • Review requested OAuth scopes before approving access
  • Keep only the tools enabled that your workflow requires