Skip to main content
Glama
gca-ltd

Qobrix CRM MCP Server

by gca-ltd

目录


它能做什么

连接到此服务器的 AI 助手可以浏览房源、甄别线索、跟踪带看、审阅报价与合同、审计跟进活动,并发现 CRM 字段结构 — 一切都通过自然语言完成。每个工具的描述都会教会 LLM 它属于哪个标准房地产工作流、映射到哪个 RESO 资源,以及下一步应串联哪些工具。

适用对象

  • 经纪公司与开发者:使用 Qobrix,希望让 Claude.aiDust.tt、ChatGPT 或 Cursor 基于实时 CRM 数据回答问题(而非复制粘贴的导出数据)。

  • 工程师:将 MCP 接入内部工具 — stdio 传输、类型化的 Zod 输入、无写入接口 — 可放心试验提示词和智能体。

  • 数据与运营团队:运行仪表盘时,可使用 qobrix_count / qobrix_top_values 实现同比(YoY)类指标而无需自定义脚本,并使用响应缓存来降低重复查询带来的 API 负载。

  • 企业 IT:为按用户身份认证做好准备 — 先从本包运行 Mode A/B,当每个用户都必须以本人身份进行身份验证时,再将 Mode C 与 SharpSir 的 Enterprise OAuth(SSO)产品搭配使用 — 参见 企业 OAuth

标准房地产工作流

本服务器围绕六个符合 RESO 标准的业务流程进行组织。LLM 会将这六个流程作为内置指令接收,从而无需事先训练即可在 CRM 中导航。

#

工作流

RESO 映射

关键工具

1

房源生命周期

Property.StandardStatus

search_properties, get_property, list_media, get_property_coordinates

2

线索-联系人生命周期

Contacts.ContactType 漏斗

search_opportunities, get_contact, search_tasks

3

销售管道

8 阶段买家旅程

get_leads_by_property, get_lead_properties, list_viewings, list_offers, list_contracts

4

带看 / 看房

ShowingAppointment

list_viewings, get_viewing, list_meetings

5

交易 / 报价

TransactionManagement

list_offers, get_offer, list_contracts, get_contract

6

活动 / 跟进

互动跟踪

list_calls, list_meetings, list_email_messages, search_tasks

状态映射

Qobrix 房源状态

RESO StandardStatus

available

Active

reserved

Pending / Under Contract

sold

Closed

withdrawn

Withdrawn / Canceled

Qobrix 机会状态

RESO 线索漏斗

new

MQL / Raw Lead

open

SQL / Active

won

Closed Won

closed_lost

Lost


工具一览

64 个工具 — CRM 实体、结构发现、分析qobrix_countqobrix_top_valuesqobrix_top_recordsqobrix_aggregate)、灵活的 deals 快捷方式(qobrix_deals)、报表qobrix_timeseriesqobrix_funnelqobrix_rep_scorecardqobrix_stale_leadsqobrix_win_lossqobrix_days_on_market)、客户智能(qobrix_cohort)、审计 / 变更历史(qobrix_get_changesqobrix_search_changesqobrix_field_change_historyqobrix_top_field_changers)、缓存辅助(qobrix_cache_statsqobrix_cache_clear),以及会话与身份qobrix_sign_inqobrix_sign_outqobrix_whoami):

实体组

工具

能力

属性

5

列表、获取、搜索、坐标(地图)、按线索获取属性

联系人

3

列表、获取、搜索

代理

3

列表、获取、搜索

机会 / 线索

5

列表、获取、搜索、按属性获取线索、线索属性

物业查看

3

列表、获取、搜索

任务

3

列表、获取、搜索

媒体

2

列表(带实体筛选)、获取(带尺寸变体)

项目

4

列表、获取、搜索、坐标

报价

3

列表、获取、搜索

合同

3

列表、获取、搜索

电话

2

列表、获取

会议

2

列表、获取

电子邮件

2

列表、获取

架构 / 元数据

3

获取架构(字段发现)、获取字段选项(枚举值)、搜索 DSL 帮助(完整语法 + 速查表)

分析

4

计数、前 N 个字段值、按数值/日期对前 N 条记录进行全量扫描,以及求和/平均值/最小值/最大值/计数聚合(支持单维或多维分组)。优先使用列表/搜索 sort 获取单页结果;需要全量扫描或处理可空字段时使用 top_records/aggregate

交易

1

对合同表的灵活领域快捷方式(销售、租赁、房源、管道),支持 kind / contract_types[] / contract_statuses[] / date_field / min_price / 参与方筛选 / 摘要块

报表

6

带同比的时间序列(qobrix_timeseries)、标准销售漏斗 + 转化率(qobrix_funnel)、按代表计分卡 / 代理排行榜(qobrix_rep_scorecard)、静默线索检测(qobrix_stale_leads)、赢率分析(qobrix_win_loss)、上市天数(qobrix_days_on_market

客户

1

重复买家 / 卖家 / 线索群体(qobrix_cohort)——查找出现在多个已成交交易或机会中的联系人

审计

4

逐条记录变更日志(qobrix_get_changes)、跨资源变更搜索(qobrix_search_changes)、字段级历史(qobrix_field_change_history)、字段变更最多的用户(qobrix_top_field_changers

缓存

2

统计信息以及前缀或全量失效,用于更实时的读取

会话与身份

3

交互式登录(qobrix_sign_in)、完全撤销登出(qobrix_sign_out)、当前用户资料(qobrix_whoami)——模式 C;在模式 A/B 中为合理的空操作

每个工具描述都包含其规范的工作流角色、RESO 等价物、已验证的 include[] 选项、外键解析指南以及搜索表达式示例。

分析与交易使用示例

服务端 sort(OpenAPI sort[])适用于大多数字段——例如 sort: "-list_selling_price_amount" 用于属性。当需要全数据集扫描,或当可空 字段(例如 opportunities.budget)在服务端排序下不返回任何行时,请使用 qobrix_top_records / qobrix_aggregate。 "已成交交易"并非属性标志——它们是 Contracts 表中的行。分析/交易工具消除了客户端脚本的需求:

// 1) Top 5 closed 2026 sales, sorted by final_selling_price_amount,
//    with property + agent + lawyers resolved to readable names.
{
  "tool": "qobrix_top_records",
  "args": {
    "resource": "contracts",
    "sort_by": "final_selling_price_amount",
    "search": "contract_type == \"cos\" and contract_status == \"agreed\" and date_of_contract >= \"2026-01-01\" and date_of_contract < \"2027-01-01\"",
    "top": 5
  }
}

// 2) 2026 sales volume, plus an agent leaderboard in one extra call.
{
  "tool": "qobrix_aggregate",
  "args": {
    "resource": "contracts",
    "field": "final_selling_price_amount",
    "op": "sum",
    "search": "contract_type == \"cos\" and contract_status == \"agreed\" and date_of_contract >= \"2026-01-01\" and date_of_contract < \"2027-01-01\"",
    "group_by": "commission_to_2",
    "top": 10
  }
}

// 3) Flexible "deals" shortcut — same answer as (1) with one default-laden call,
//    plus a full-set summary block (by_status, by_type, totals, median).
{ "tool": "qobrix_deals", "args": { "year": 2026, "top": 5 } }

// 4) Best 2026 rental contracts by final rental price.
{ "tool": "qobrix_deals", "args": { "kind": "rental", "year": 2026, "top": 5 } }

// 5) Under-contract reservations + closed sales together (pipeline + actuals).
{
  "tool": "qobrix_deals",
  "args": { "contract_statuses": ["reserved", "agreed"], "year": 2026 }
}

// 6) "My deals this year": uses the CURRENT_USER special var.
{
  "tool": "qobrix_deals",
  "args": { "assigned_to": "CURRENT_USER", "year": 2026 }
}

// 7) Monthly 2026 closed-sale volume with prior-year YoY %.
{
  "tool": "qobrix_timeseries",
  "args": {
    "resource": "contracts",
    "bucket": "month",
    "metric": "sum",
    "field": "final_selling_price_amount",
    "year": 2026,
    "search": "contract_type == \"cos\" and contract_status == \"agreed\"",
    "compare_to_prior": true
  }
}

// 8) Full 2026 sales funnel (Leads → Qualified → Viewing → Offer → Reserved → Closed).
{ "tool": "qobrix_funnel", "args": { "year": 2026 } }

// 9) 2026 agent leaderboard by volume (omit `user` for leaderboard mode).
{ "tool": "qobrix_rep_scorecard", "args": { "year": 2026, "sort_by": "volume", "top": 10 } }

// 10) Silent leads — open opportunities with no activity in 30 days.
{ "tool": "qobrix_stale_leads", "args": { "since_days": 30 } }

// 11) Multi-dim pivot: 2026 closed-sale volume by city × property_type.
{
  "tool": "qobrix_aggregate",
  "args": {
    "resource": "contracts",
    "field": "final_selling_price_amount",
    "op": "sum",
    "search": "contract_type == \"cos\" and contract_status == \"agreed\" and date_of_contract >= \"2026-01-01\" and date_of_contract < \"2027-01-01\"",
    "group_by": ["property_id", "contract_type"],
    "top": 10
  }
}

// 12) Repeat buyers — contacts behind 2+ closed sales in 2026.
{ "tool": "qobrix_cohort", "args": { "kind": "buyers", "year": 2026, "min_count": 2 } }

// 13) Win-rate by lead source in 2026, with top loss reasons resolved.
{
  "tool": "qobrix_win_loss",
  "args": { "year": 2026, "group_by": "source", "include_top_losses": true }
}

// 14) 2026 days-on-market by property type, with longest/shortest outliers.
{
  "tool": "qobrix_days_on_market",
  "args": { "kind": "sold", "year": 2026, "group_by": "property_type", "include_outliers": true }
}

快速开始

git clone https://github.com/gca-ltd/qobrix-crm-mcp.git
cd qobrix-crm-mcp
npm install
npm run build

配置

在项目根目录创建 .env 文件:

QOBRIX_API_URL=https://yourcrm.qobrix.com
QOBRIX_API_USER=your-api-user-uuid
QOBRIX_API_KEY=your-api-key
QOBRIX_LOCALE=en-US          # optional

变量

必需

描述

QOBRIX_API_URL

是(模式 A)

Qobrix 实例基础 URL

QOBRIX_API_USER

是(模式 A)

X-Api-User 请求头值(UUID)

QOBRIX_API_KEY

是(模式 A)

X-Api-Key 请求头值

QOBRIX_LOCALE

X-Locale 请求头(例如 en-USel-GR

认证模式

克隆此包,运行模式 A 或 B,并将实时 Qobrix 数据置于 Claude、Cursor 或任何 MCP 客户端之前——Apache 2.0。

模式

在此包中?

何时

凭据如何到达

A(默认)

QOBRIX_MCP_TRANSPORT=stdio(或未设置)

来自进程环境的共享 QOBRIX_API_*

B

TRANSPORT=http + QOBRIX_MCP_AUTH=headers

每个请求的 X-Api-User / X-Api-Key(受信任的调用方;绑定 localhost)

C

需要配套 AS

TRANSPORT=http + QOBRIX_MCP_AUTH=oauth

自助式 OAuth:MCP 返回 /connect URL;用户在 SharpSir 的 Enterprise OAuth 授权服务器上登录;该服务器持有会话

D(可选)

需要配套 AS

TRANSPORT=http + QOBRIX_MCP_AUTH=oauth-claude

远程 MCP OAuth(RFC 9728 PRM + /mcp 上的 Bearer)用于 Claude.ai / Desktop 自定义连接器 以及 Dust.tt Spaces 工具——相同的资源 URL,按用户登录

模式 A 和 B 完全由本包支持。模式 C 和 D 需要 SharpSir 的单独 Enterprise OAuth / SSO 产品——不随本仓库分发。模式 D 不会改变模式 A/B/C——当您希望远程主机(如 Claude.ai 或 Dust.tt)自行驱动 OAuth 时选择它。

Enterprise OAuth

需要代理以已登录的 Qobrix 用户身份工作——而不是共享 API 密钥? 模式 C 正是为此设计的。它需要 SharpSir 的 Enterprise OAuth 解决方案:一个托管的授权服务器包(登录 + 2FA + 同意、按用户 API 密钥铸造、加密凭据库、受众绑定令牌),仅与此 MCP 服务器配对使用。

模式 C 的工作原理(MCP 自认证——北向客户端不变):

  1. 工具在无会话状态下运行 → MCP 返回授权 URL:

    • URL 模式提示JSON-RPC -32042),当客户端支持 elicitation.url 时(Claude、Cursor 等)

    • 工具结果中的 Markdown [登录 Qobrix](/connect?e=…) 链接,用于不支持提示的客户端(如 ragchat / LangChain)——LLM 必须原样转发(唯一 / 一次性使用;切勿重复使用旧链接)

  2. 用户在此服务器上打开 /connect(反钓鱼间接跳转)→ 签名 Cookie + 重定向到企业 OAuth 登录页面

  3. 登录 + 双重认证 + 同意后,AS 重定向到 /oauth/callback;此 MCP 交换代码(PKCE),获取 Qobrix 凭据,并将其存储在 加密会话保险库

  4. 下一次工具调用即已认证。当 Qobrix 返回 401/403 时,保险库被清空,并返回新的 /connect URL

  5. 代理还可以调用 qobrix_sign_inqobrix_whoamiqobrix_sign_out(通过 AS /disconnect + Qobrix API 密钥删除实现完全撤销)

  • 不提供公开下载,不能从 GitHub 克隆。

  • 由我们的团队按需提供,作为企业解决方案包交付。

  • 无第三方 OAuth 服务器——Mode C 仅绑定此企业 OAuth 解决方案。

  • 安全性: Mode C 使用每用户加密会话保险库(以聊天身份头为键),并让 /mcp 不携带客户端令牌。将 QOBRIX_MCP_HOST=127.0.0.1 绑定,并设置 QOBRIX_MCP_IDENTITY_SECRET(仅与受信任的 MCP 主机如 ragchat 共享),以防止身份头被伪造。将保险库加密密钥保存在 QOBRIX_MCP_STATE_SECRET(仅 MCP 使用)。如果为浏览器配置反向代理,仅发布 /connect/oauth/callback——拒绝公开 /mcp/health。本地代理(ragchat)调用 http://127.0.0.1:<port>/mcp。当 ALLOWED_HOSTS 仅列出公共主机名时,如果服务器绑定到回环地址,则自动添加回环 Host 值(127.0.0.1 / localhost / ::1)。连接 Cookie 的 Path 跟随 PUBLIC_URL 路径名;Express trust proxy 在 Cloudflare→Apache 之后设为 2。仅向单个用户发送 /connect 链接——切勿发送到共享/群组线程中。

准备升级? 联系 SharpSir Group · dev@sharpsir.group,索取 Qobrix CRM MCP 企业 OAuth 套餐。

交付后,将服务器指向您收到的签发方:

export QOBRIX_MCP_TRANSPORT=http
export QOBRIX_MCP_AUTH=oauth
export QOBRIX_MCP_HOST=127.0.0.1
export QOBRIX_MCP_PORT=3502
export QOBRIX_MCP_PUBLIC_URL=http://127.0.0.1:3502
export QOBRIX_MCP_RESOURCE_URL=http://127.0.0.1:3502/mcp
export QOBRIX_OAUTH_ISSUER=<issuer-from-enterprise-bundle>
export QOBRIX_OAUTH_INTROSPECTION_SECRET=<shared-secret-from-bundle>
export QOBRIX_MCP_STATE_SECRET=<16+-char-secret>
export QOBRIX_MCP_IDENTITY_SECRET=<16+-char-secret-shared-with-ragchat>
export QOBRIX_MCP_DATA_DIR=./data/mcp-oauth
export QOBRIX_MCP_ALLOWED_HOSTS=qobrix-mcp.example.com   # loopback Hosts auto-added when HOST is 127.0.0.1
npm start

Mode C 端点(企业 OAuth 解决方案配对后):

  • GET /connect?e=… — 启动授权(设置 Cookie,302 到 AS)

  • GET /oauth/callback — PKCE 代码交换 + 每用户会话保险库写入

  • GET /health — 包含 connectedsession_vaults 计数

  • 未认证的 /mcp 是刻意的,供北向客户端使用:工具在需要时提供连接 URL——生产环境中将 /mcp 保留在 localhost

参见 docs/USER_GUIDE.md 了解 Mode A → B → C 的分步说明、反向代理和 Host 白名单详情。

对于 ragchat / Mode C,将远程 MCP URL(…/mcp)注册为普通的 Streamable HTTP 服务器(无需客户端 OAuth 提供方);MCP 通过 /connect 处理认证。在该拓扑中将 /mcp 保留在 localhost 上。

Mode D — Claude.ai 和 Dust.tt 远程 MCP(共享资源)

使用独立的 MCP 进程(或主机),设置 QOBRIX_MCP_AUTH=oauth-claude。远程主机自行驱动 OAuth,使用相同的 HTTPS /mcp URL:

主机

连接方式

认证方式

Claude.ai / Claude Desktop

设置 → 连接器 → 添加自定义连接器

自动 DCR + PKCE(重定向 https://claude.ai/api/mcp/auth_callback

Dust.tt

空间 → 工具 → 添加 MCP 服务器

优先自动;静态 OAuth 回退——参见 INSTALL — 连接 Dust

  1. 用户将 https://intranet.sharpgroup.com/qobrix-crm/mcp 粘贴到 Claude 或 Dust 中

  2. 主机访问 /mcp → 收到 401 + WWW-Authenticate: Bearer resource_metadata=…

  3. 主机获取 /.well-known/oauth-protected-resource → 发现 QOBRIX_OAUTH_ISSUER

  4. 主机完成 OAuth(DCR 或静态)+ 针对企业 OAuth AS 的 PKCE

  5. 后续 /mcp 调用发送 Authorization: Bearer <access_token>;此服务器解析令牌,并以该 Qobrix 用户的身份运行工具

Claude 和 Dust 共享一个 Mode D 栈(同一个 MCP 资源 + 同一个授权服务器)。每个主机注册自己的 OAuth 客户端;每个成员以自己的身份登录 Qobrix。

export QOBRIX_MCP_TRANSPORT=http
export QOBRIX_MCP_AUTH=oauth-claude
export QOBRIX_MCP_HOST=127.0.0.1
export QOBRIX_MCP_PORT=3502
export QOBRIX_MCP_ALLOWED_HOSTS=intranet.sharpsir.group
export QOBRIX_MCP_PUBLIC_URL=https://intranet.sharpsir.group/qobrix-crm
export QOBRIX_MCP_RESOURCE_URL=https://intranet.sharpsir.group/qobrix-crm/mcp
export QOBRIX_OAUTH_ISSUER=https://intranet.sharpsir.group/qobrix-crm/mcp-oauth
export QOBRIX_OAUTH_INTROSPECTION_SECRET=<shared-secret-from-bundle>
npm start

在 AS 上,使用重定向白名单时,保留 Claude 的回调地址,并追加精确的 Dust 完成 URL(切勿替换 Claude 的条目):

export QOBRIX_OAUTH_REDIRECT_ALLOWLIST=https://claude.ai/api/mcp/auth_callback,http://127.0.0.1,http://localhost,cursor://,https://eu.dust.tt/oauth/mcp/finalize,https://eu.dust.tt/oauth/mcp_static/finalize,https://dust.tt/oauth/mcp/finalize,https://dust.tt/oauth/mcp_static/finalize,https://app.dust.tt/oauth/mcp/finalize,https://app.dust.tt/oauth/mcp_static/finalize

发布 HTTPS /mcp + PRM(以及 AS)到公共互联网;如果使用 WAF,将 Anthropic 出口 160.79.104.0/21 加入白名单,并额外允许 Dust 出口——不要移除 Claude 的白名单条目。Mode C 的回环/deny public /mcp 指南对 ragchat 部署仍然有效——不要为 Mode C 进程翻转该拓扑。

完整步骤:INSTALL — 连接 Claude · INSTALL — 连接 Dust · Dust:添加 MCP 服务器

缓存

所有 MCP 工具都是只读 GET 请求,因此响应缓存不会破坏 CRM 状态。服务器在单一瓶颈点QobrixClient.request())包装了读透缓存,因此每个列表/获取/搜索/模式调用——包括相关性 max_scan 的每一页——都会被缓存。提升评分在获取之后进行,不会改变缓存键,因此使用不同的 boost[] 重新排序会复用相同的候选页面。

设计——旁路缓存 + 单飞合并:

  • 第一层——内存 LRU(始终开启,零依赖):每进程、带 TTL、有容量上限。

  • 第二层——Redis(可选,通过动态 import() 懒加载):设置 QOBRIX_REDIS_URL 以启用;任何 Redis 错误时服务器回退到仅内存模式。

  • 单飞:当 LLM 发起并发的工具调用,命中同一个冷缓存键时(常见于 qobrix_top_values),所有进程内调用方共享一次上游请求。

  • 错误永不缓存——瞬时 5xx 不会被卡住。

  • 仅 TTL,v1 中无 stale-while-revalidate。

环境变量:

变量

默认值

说明

QOBRIX_CACHE_ENABLED

true

设为 false 可完全绕过缓存

QOBRIX_CACHE_TTL

300

TTL 秒数;CRM 编辑在此窗口内可见

QOBRIX_CACHE_MAX_ENTRIES

5000

内存层的 LRU 上限

QOBRIX_REDIS_URL

(空)

redis:// / rediss:// URL;空 = 仅内存

QOBRIX_REDIS_KEY_PREFIX

qobrix:

共享 Redis 实例时的命名空间

缓存工具(暴露给 LLM):

工具

用途

qobrix_cache_stats

命中/未命中/大小/进行中/Redis 状态——验证缓存是否有效

qobrix_cache_clear

使所有键或按 prefix(如 v1:request:opportunities)失效,在 TTL 到期前即时刷新

推荐的 Redis 服务器配置(针对专用纯缓存 Redis,依据 Redis 文档):

maxmemory 256mb
maxmemory-policy allkeys-lru
maxmemory-samples 10

TTL 指南——Redis 文档建议对频繁变化的数据使用短 TTL(60–120 秒),对稳定数据使用较长 TTL(数小时)。对于混合了线索管道(分钟级变化)和房源列表(小时级变化)的 CRM,300 秒是保守的默认值。需要即时刷新时使用 qobrix_cache_clear

权衡 / 已知限制: 单飞合并仅限进程内。共享一个 Redis 的多实例部署在冷键上仍可能出现适度惊群;分布式 SETNX 锁是未来工作,单用户 MCP 客户端不需要。

最佳实践对齐:

最佳实践

落实位置

旁路缓存 / 读透(Redis 文档、MCP 缓存指南)

QobrixClient.request() 包装

规范、带版本的缓存键

cacheKey("v1", ...) 带排序参数

保守 TTL

300s 默认,可通过环境变量覆盖

错误不缓存

包装仅在解析上游成功后存储

单飞防惊群

进程内 inflight 映射

纯缓存 Redis 使用 allkeys-lru

上述已为自托管者记录

可观测性 + 手动失效

qobrix_cache_statsqobrix_cache_clear

官方 Node.js Redis 客户端

redis(node-redis),作为 optionalDependencies

Cursor IDE 设置

此服务器使用 stdio MCP(本地 node 进程)。Cursor 从项目或用户 mcp.json 发现服务器:您打开的文件夹内的 .cursor/mcp.json,或适用于所有工作区的 ~/.cursor/mcp.json

1. 前置条件

  • 运行 Cursor MCP 的机器(本地笔记本或远程 SSH 主机)上需有 Node.js 20+

  • 克隆此仓库,安装并构建(参见 快速开始)。

  • 添加 MCP 条目前必须存在 dist/index.jsnpm run build)。

2. 凭据

  1. 复制模板:cp .env.example .env

  2. 编辑 .env,至少设置 QOBRIX_API_URLQOBRIX_API_USERQOBRIX_API_KEY(参见 配置)。

  3. .env 保留在 git 之外;它已列在 .gitignore 中。

3. JSON 放置位置

位置

使用时机

<项目>/.cursor/mcp.json

您在 Cursor 中打开了该项目文件夹;团队成员可以提交模板(不含密钥),或您仅本地保留。

~/.cursor/mcp.json

该机器上所有工作区使用相同的 MCP。

将您的条目合并到现有的 "mcpServers" 对象中;如果您已有其他服务器,请勿替换整个文件。

4. 推荐:node --env-file(Node 20+)

使用绝对路径,这样无论工作区根目录是本仓库还是父文件夹,都能以相同方式工作(并且 SSH 远程路径也能正确解析)。

{
  "mcpServers": {
    "qobrix-crm-mcp": {
      "command": "node",
      "args": [
        "--env-file=/absolute/path/to/qobrix-crm-mcp/.env",
        "/absolute/path/to/qobrix-crm-mcp/dist/index.js"
      ],
      "description": "Read-only Qobrix CRM MCP"
    }
  }
}

为什么采用此模式:

  • 凭据保留在 .env 中,而非 JSON 中。

  • Node 在服务器启动之前加载该文件,因此即使主机的 envFile 字段被忽略或对 stdio 服务器行为不一致,process.env 也能被填充。

5. 备选:内联 env

当您无法使用 --env-file(较旧版本的 Node)时很有用。密钥存在于 mcp.json——请限制文件权限且不要提交。

{
  "mcpServers": {
    "qobrix-crm-mcp": {
      "command": "node",
      "args": ["/absolute/path/to/qobrix-crm-mcp/dist/index.js"],
      "env": {
        "QOBRIX_API_URL": "https://yourcrm.qobrix.com",
        "QOBRIX_API_USER": "your-api-user-uuid",
        "QOBRIX_API_KEY": "your-api-key",
        "QOBRIX_LOCALE": "en-US"
      }
    }
  }
}

您还可以使用 Cursor 的配置插值(例如 ${env:QOBRIX_API_KEY}),这样值会从您的操作系统环境中注入,而不是使用字面量。

6. 可选:MCP JSON 中的 envFile

Cursor 支持 stdio 服务器的 envFile 属性。某些配置无法可靠地将这些变量传递给子进程;如果工具报错“缺少必需的环境变量”,请改用第 4 步中的 --env-file 方式。

7. 编辑 mcp.json.env 之后

  1. 重新加载 MCP — 命令面板 → MCP 重启,或重新加载 Cursor 窗口。

  2. 检查日志 — 视图 → 输出 → 在下拉菜单中选择 “MCP” / “MCP Logs”;在此处修复路径或 Node 错误。

  3. 工具审批 — 默认情况下,Cursor 会在每次工具调用前询问;如果您愿意,可以在 Cursor 设置中允许受信任工具自动运行。

其他 MCP 主机

Claude.ai / Claude Desktop(模式 D) — 远程自定义连接器,地址为 https://intranet.sharpsir.group/qobrix-crm/mcp。参见模式 DINSTALL — 连接 Claude

Dust.tt(模式 D) — Spaces → Tools → 添加 MCP 服务器,使用相同的 URL。优先选择 Automatic 认证和个人账户。参见INSTALL — 连接 Dust

Claude Desktop / Cursor(模式 A stdio) — 相同的 stdio 形式:command + args 指向 node,并在主机的 MCP 配置文件中使用 --env-fileenv

CI / 无头环境 — 使用 stdio MCP 客户端库运行 node --env-file=.env dist/index.js;确保 .env 通过密钥提供,而不是提交到仓库。


搜索表达式语法

接受 search 参数的工具使用 Qobrix 的 Symfony 表达式语言(OpenAPI SearchExpression)。调用 qobrix_search_dsl_help 获取完整语法 + 属性/项目字段速查表(可选地包含实时 schema 字段名)。

功能

语法

示例

相等

==!=<>

status == "available"

比较

<><=>=

list_selling_price_amount <= 500000

包含

containsstarts withends with

city contains "Limas"

集合成员

in [...]not in [...]

property_type in ["villa","house"]

范围

in min..max

bedrooms in 2..4

逻辑

andornot、括号

status == "available" and sale_rent == "for_sale"

日期辅助函数

DAYS_AGO(n)MONTHS_AGO(n)DAYS_FROM_NOW(n)、…

created >= DAYS_AGO(30)

时间快捷方式

NOWTODAYTHIS_WEEKLAST_MONTHTHIS_YEAR、…

created >= LAST_MONTH

当前用户

CURRENT_USER

assigned_to == CURRENT_USER

地理 / 其他

DISTANCE_FROMIN_POLYGONTRANSLATEDMIN/MAX

DISTANCE_FROM(coordinates, "34.43,32.13") <= 5000

关联路径

Entity.field

SalespersonUsers.Contacts.country == "CY"

提示: 在将自由语言需求组合成查询之前,先调用 qobrix_search_dsl_help({ resource: "Properties" })。使用 qobrix_get_field_options 获取枚举值,使用 qobrix_get_schema 获取完整字段列表。

所有资源上的相关搜索(F1)

每个 qobrix_search_* 工具(属性、项目、联系人、经纪人、机会、看房、任务、报价、合同)都采用两层设计,使自由语言需求既能映射到高精度能映射到高召回率:

  1. search — 硬性必须条件(服务端 DSL 过滤器 → 精度下限)。

  2. boost[] — 软性加权加分项,在进程内对候选池进行评分(召回率 + 排序)。

  3. limit — 返回的排序行数(默认 10,最大 100)。需要更多选项时调高;保持适度以避免上下文过载。

  4. max_scan — 使用 boost 时的候选池(默认 100,硬上限 500)。调高可提高召回率;每个扫描的页面都会响应缓存

使用 boost 时,每行包含 _relevance(分数)和 _matched(命中了哪些子句);pagination.mode"ranked"。不使用 boost 时,返回单个缓存列表页(mode: "fast")。

qobrix_search_properties({
  search: 'status == "available" and sale_rent == "for_sale"',
  boost: [
    { field: "sea_view", op: "==", value: true, weight: 3 },
    { field: "bedrooms", op: ">=", value: 3, weight: 2 },
    { field: "list_selling_price_amount", op: "in", value: "200000..600000", weight: 2 },
  ],
  limit: 15,
  max_scan: 200,
});

通过搜索进行线索 ↔ 房源匹配(双向)

  • 需求 → 供给:获取线索的条件 → 使用 search+boost 调用 qobrix_search_properties / qobrix_search_projects。原生方式:qobrix_get_properties_by_lead / qobrix_get_lead_properties

  • 供给 → 需求:使用开放线索的 search + boost 针对房源调用 qobrix_search_opportunities(也适用于项目)。仅属性支持原生方式:qobrix_get_leads_by_property

// Who wants a Limassol 3-bed ~€400k listing?
qobrix_search_opportunities({
  search: 'status in ["new","open"] and buy_rent == "buy"',
  boost: [
    { field: "area_of_interest", op: "contains", value: "Limassol", weight: 3 },
    { field: "bedrooms_from", op: "<=", value: 3, weight: 2 },
    { field: "list_selling_price_to", op: ">=", value: 400000, weight: 2 },
  ],
  limit: 15,
  max_scan: 200,
});

Boost 运算符:== != < > <= >= in contains starts_with ends_with。范围使用 op: "in" 搭配 value: "min..max"

搜索(以及所有其他列表/获取操作)共享全局缓存 TTL(QOBRIX_CACHE_TTL,默认 300 秒)。CRM 编辑后,使用 qobrix_cache_clear({ prefix: "v1:request:properties" })(或 opportunitiesprojects、…)刷新。


获取关联数据

解析外键的三种策略:

  1. include[] 参数 — 在一次调用中内联展开关联

qobrix_get_property({ id: "...", include: ["Agents", "PropertyViewings"] })
  1. 单独的 get 调用 — 从外键字段获取 UUID 并调用相应的工具

// property.agent → UUID
qobrix_get_agent({ id: "<agent-uuid>" })
  1. 按外键搜索 — 通过搜索表达式查找相关记录

qobrix_search_properties({ search: 'agent == "<agent-uuid>"' })

只有工具描述中标记为已验证include[] 值保证可用。当某个关联不支持 include[] 时,使用按外键搜索。


负载默认值

为了保持工具输出足够简短以适应调用 LLM 的上下文窗口,列表 / 搜索 / 获取工具默认使用紧凑负载:

参数

默认值

默认时的效果

expand

false

外键以 UUID 字符串形式返回,而不是展开为嵌套对象。按需使用相应的 get 工具或针对性的 include[] 来解析它们。

media

false

内联媒体(照片、平面图、缩略图 URL)不会附加到列表行。实际需要媒体时,使用 qobrix_list_media({ related_model: 'Properties', related_id: '<uuid>' })

仅在调用方确实需要更重负载时按调用覆盖:

// Cheap browse — recommended for most reporting / pipeline calls
qobrix_list_properties({ limit: 10 });

// Heavy detail — only when the LLM truly needs nested FKs + media URLs
qobrix_list_properties({ limit: 5, expand: true, media: true });

// Prefer surgical include[] over full expand=true:
qobrix_get_property({ id: "...", include: ["AgentAgents", "ProjectProjects"] });

此更改通常可将 qobrix_list_properties({ limit: 10 }) 从约 300 KB 缩小到约 5–10 KB。


输出上限

每个工具结果都被限制在 QOBRIX_MCP_MAX_RESULT_CHARS 个渲染 JSON 字符内(默认 30 000,约 7.5 K token)。行为:

  • 分页负载{ data: [...], pagination: {...} }):截断为能容纳的 data[] 最大前缀,并附加 _truncated 块,包含 kept_rowsomitted_rowsoriginal_charsmax_chars 以及告诉 LLM 如何缩小下一次调用范围的 hint。如果嵌套的 expand/media 对象单独就超出上限,行会被压缩为标量_truncated.compacted: true),以确保至少返回一行可用数据。

  • 严重超限(默认:原始大小 > 8 × 上限,可通过 QOBRIX_MCP_REFINE_MULTIPLIER 覆盖):返回 status: "result_too_large",附带 _refine_required(助手指令 + 建议的缩小方式 + 小的 returned_sample),让 LLM 请用户重新表述 — 而不是倾倒数据。

  • 非分页负载(单个 get、自定义分析形状):JSON 在上限处截断,并附加 QOBRIX_MCP TRUNCATED 尾部标记(或严重超限时使用相同的 refine 指令)。

boostexpand=truemedia=true 一起使用时,max_scan 自动上限为 100pagination.scan_capped_reason 可能为 "expand/media"

覆盖上限 / refine 阈值:

QOBRIX_MCP_MAX_RESULT_CHARS=60000
QOBRIX_MCP_REFINE_MULTIPLIER=8

如果您经常触发上限或 refine 保护,请使用 fields[](白名单列)、更精确的 search 表达式、更小的 limit,或保持 expand=false / media=false


测试

项目包含 226 个自动化测试,分布在 63describe 套件中(集成、多步骤场景、RESO 工作流、缓存、相关性、输出上限、客户端排序和 OAuth 模式冒烟测试):

# Integration tests — individual tool mechanics
npm test

# Scenario tests — multi-step tool chains (19 real-world scenarios)
npm run test:scenarios

# Workflow tests — canonical RE business processes (8 RESO-aligned suites)
npm run test:workflows

# Cache tests — read-through, single-flight, LRU eviction, search-page keys (no API needed)
npm run test:cache

# Relevance tests — boost scoring, DSL help, search cache keys (no API needed)
npm run test:relevance

# Format tests — output cap + truncation behaviour (no API needed)
npm run test:format

# OAuth modes smoke — Mode B header rejection + Mode C /connect elicitation path
npm run test:oauth-modes

# Run everything
npm run test:all

套件

测试数

覆盖范围

集成

70

每个工具、分页边界情况、include/fields 机制、分析和报告工具

场景

55

经纪人晨间简报、买家搜索、线索分类、外键链、管道报告

工作流

39

房源生命周期、线索漏斗、销售管道、看房、交易、媒体、活动、schema

缓存

22

读穿缓存、单飞合并、LRU 淘汰、键规范化、搜索页键(无实时 API)

相关性

23

Boost 评估/评分/排序(包括机会/联系人形状)、fields[]+boost 联合、DSL 帮助文本、搜索缓存键稳定性(无实时 API)

格式

7

formatResult 输出上限、分页截断、expand/media 压缩(kept_rows>=1)、result_too_large refine 保护、回退尾部标记、环境变量覆盖(无实时 API)

客户端排序

7

normalizeSort + buildQobrixUrl 生成 OpenAPI sort[]=(而非 Qobrix 忽略的标量 sort=

OAuth 模式

4

模式 B 请求头、模式 C /connect、模式 D PRM/401/Bearer


架构

src/
├── index.ts          # MCP server entry point + RESO workflow instructions
├── http.ts           # Streamable HTTP transport (Modes B / C)
├── modes.ts          # Auth mode resolution (env / headers / oauth / oauth-claude)
├── client.ts         # QobrixClient — HTTP + read-through response cache
├── auth-context.ts   # AsyncLocalStorage per-request credentials
├── oauth-client.ts   # Mode C self-service OAuth client + session vault
├── oauth-rs.ts       # Companion AS metadata + introspection helpers
├── request-context.ts# ALS for McpServer (elicitation capability detection)
├── cache.ts          # LRU memory tier, optional Redis, single-flight coalescing
├── relevance.ts      # Boost scoring + cached candidate pager for search
├── search-dsl.ts     # Full SearchExpression DSL reference + field cheatsheets
├── types.ts          # TypeScript interfaces
├── schemas.ts        # Zod schemas with rich LLM-facing descriptions
└── tools/
    ├── index.ts      # Tool registration hub + formatResult / errorResult
    ├── properties.ts # Listing Lifecycle + relevance search
    ├── contacts.ts   # Lead-Contact Lifecycle tools
    ├── agents.ts     # RESO Member tools
    ├── opportunities.ts # Sales Pipeline tools
    ├── viewings.ts   # Showing Lifecycle tools
    ├── tasks.ts      # Follow-up & Pipeline Management tools
    ├── media.ts      # Media Lifecycle tools
    ├── projects.ts   # Project/Development + relevance search
    ├── offers.ts     # Transaction Lifecycle tools
    ├── contracts.ts  # Transaction close tools
    ├── activities.ts # Activity Tracking (calls, meetings, emails)
    ├── analytics.ts  # qobrix_count, qobrix_top_values, qobrix_top_records, qobrix_aggregate
    ├── deals.ts      # qobrix_deals (flexible Contracts shortcut)
    ├── reports.ts    # qobrix_timeseries (bucketed metric + YoY), qobrix_days_on_market
    ├── pipeline.ts   # qobrix_funnel, qobrix_stale_leads, qobrix_win_loss
    ├── productivity.ts # qobrix_rep_scorecard
    ├── customers.ts  # qobrix_cohort (repeat buyers/sellers/leads)
    ├── cache.ts      # qobrix_cache_stats, qobrix_cache_clear
    ├── audit.ts      # change log / field history / top changers
    └── meta.ts       # Schema discovery + qobrix_search_dsl_help
test-suite/
├── integration.test.mjs  # Live API smoke tests
├── scenarios.test.mjs    # Multi-step CRM scenarios
├── workflows.test.mjs    # RESO workflow coverage
├── cache.test.mjs        # Cache unit tests (incl. search-page keys)
├── relevance.test.mjs    # Boost scoring + DSL help unit tests
├── format.test.mjs       # Output-cap / truncation tests
└── oauth-modes.test.mjs  # Mode B/C auth smoke tests

LLM 如何学习

服务器在三个层面教导 LLM:

  1. 服务器指令 — MCP initialize 响应中的顶层 instructions 字段提供完整数据模型、六个规范工作流及工具配方、搜索语法、外键解析策略和已知怪癖。

  2. 工具描述 — 每个工具描述包含其规范工作流角色、RESO 对应项、已验证的 include[] 选项、外键字段映射、响应形状和搜索示例。相关性搜索工具记录了 search + boost 两层配方;qobrix_search_dsl_help 按需暴露完整 DSL。

  3. 参数描述 — Zod schema 为每个参数提供帮助,包含具体示例、有效枚举值和跨工具引用。


技术

组件

技术

运行时

Node.js ≥ 20

语言

TypeScript 5.7

MCP SDK

@modelcontextprotocol/sdk 1.26

校验

Zod 3.24

可选缓存

设置 QOBRIX_REDIS_URL 时使用 redis 4.x (node-redis)

传输方式

stdio(默认) · Streamable HTTP(模式 B / C)

API 认证

模式 A/B:X-Api-User + X-Api-Key · 模式 C:自助企业 OAuth(/connect URL)

测试

Node.js 内置测试运行器(node:test

许可证

Apache License 2.0 — 版权所有 2025–2026 SharpSir Group

模式 A 和模式 B 包含在此开源软件包中。模式 C 与 SharpSir 的 企业 OAuth 授权服务器(SSO / 按用户身份)配合使用——这是一款按需交付的独立商业产品——sharpsir.group · dev@sharpsir.group


Install Server
A
license - permissive license
A
quality
A
maintenance

Maintenance

Maintainers
Response time
4dRelease cycle
8Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    A comprehensive Model Context Protocol server for real estate data management that provides tools and resources for property listings, agent management, market analysis, client relationships, and area intelligence.
    52
    AGPL 3.0
  • A
    license
    A
    quality
    C
    maintenance
    Read-only MCP server for the Daktela contact center REST API, providing 40 tools to access tickets, calls, emails, chats, contacts, CRM records, campaigns, and real-time agent status.
    45
    1
    MIT
  • A
    license
    C
    quality
    D
    maintenance
    Enterprise-level MCP server integrating with Vista CRM (Loft Edition) for real estate operations, offering 40+ tools for property search, pipeline management, lead capture, and agenda control.
    42
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    MCP server for Moody's Commercial Real Estate API, providing 37 tools for property lookups, market analytics, comps, CMBS data, tax records, and more.

View all related MCP servers

Related MCP Connectors

  • RealEstateAPI MCP — property search, detail, and skip-trace (realestateapi.com)

  • Read-only MCP server for ClassQuill, a tutoring-business-management platform.

  • 350+ production-ready APIs through one MCP server — weather, geocoding, validation, financial data.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/gca-ltd/qobrix-crm-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server