Qobrix CRM MCP Server
目录
安装指南 — Sharp Matrix 内网、pm2、Apache、Claude.ai + Dust.tt 连接器
用户指南 — Mode A → Mode B → Mode C → Mode D(Claude.ai + Dust.tt)分步说明
它能做什么
连接到此服务器的 AI 助手可以浏览房源、甄别线索、跟踪带看、审阅报价与合同、审计跟进活动,并发现 CRM 字段结构 — 一切都通过自然语言完成。每个工具的描述都会教会 LLM 它属于哪个标准房地产工作流、映射到哪个 RESO 资源,以及下一步应串联哪些工具。
适用对象
经纪公司与开发者:使用 Qobrix,希望让 Claude.ai、Dust.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 | 房源生命周期 |
|
|
2 | 线索-联系人生命周期 |
|
|
3 | 销售管道 | 8 阶段买家旅程 |
|
4 | 带看 / 看房 |
|
|
5 | 交易 / 报价 |
|
|
6 | 活动 / 跟进 | 互动跟踪 |
|
状态映射
Qobrix 房源状态 | RESO StandardStatus |
| Active |
| Pending / Under Contract |
| Closed |
| Withdrawn / Canceled |
Qobrix 机会状态 | RESO 线索漏斗 |
| MQL / Raw Lead |
| SQL / Active |
| Closed Won |
| Lost |
工具一览
64 个工具 — CRM 实体、结构发现、分析(qobrix_count、qobrix_top_values、qobrix_top_records、qobrix_aggregate)、灵活的 deals 快捷方式(qobrix_deals)、报表(qobrix_timeseries、qobrix_funnel、qobrix_rep_scorecard、qobrix_stale_leads、qobrix_win_loss、qobrix_days_on_market)、客户智能(qobrix_cohort)、审计 / 变更历史(qobrix_get_changes、qobrix_search_changes、qobrix_field_change_history、qobrix_top_field_changers)、缓存辅助(qobrix_cache_stats、qobrix_cache_clear),以及会话与身份(qobrix_sign_in、qobrix_sign_out、qobrix_whoami):
实体组 | 工具 | 能力 |
属性 | 5 | 列表、获取、搜索、坐标(地图)、按线索获取属性 |
联系人 | 3 | 列表、获取、搜索 |
代理 | 3 | 列表、获取、搜索 |
机会 / 线索 | 5 | 列表、获取、搜索、按属性获取线索、线索属性 |
物业查看 | 3 | 列表、获取、搜索 |
任务 | 3 | 列表、获取、搜索 |
媒体 | 2 | 列表(带实体筛选)、获取(带尺寸变体) |
项目 | 4 | 列表、获取、搜索、坐标 |
报价 | 3 | 列表、获取、搜索 |
合同 | 3 | 列表、获取、搜索 |
电话 | 2 | 列表、获取 |
会议 | 2 | 列表、获取 |
电子邮件 | 2 | 列表、获取 |
架构 / 元数据 | 3 | 获取架构(字段发现)、获取字段选项(枚举值)、搜索 DSL 帮助(完整语法 + 速查表) |
分析 | 4 | 计数、前 N 个字段值、按数值/日期对前 N 条记录进行全量扫描,以及求和/平均值/最小值/最大值/计数聚合(支持单维或多维分组)。优先使用列表/搜索 |
交易 | 1 | 对合同表的灵活领域快捷方式(销售、租赁、房源、管道),支持 kind / contract_types[] / contract_statuses[] / date_field / min_price / 参与方筛选 / 摘要块 |
报表 | 6 | 带同比的时间序列( |
客户 | 1 | 重复买家 / 卖家 / 线索群体( |
审计 | 4 | 逐条记录变更日志( |
缓存 | 2 | 统计信息以及前缀或全量失效,用于更实时的读取 |
会话与身份 | 3 | 交互式登录( |
每个工具描述都包含其规范的工作流角色、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变量 | 必需 | 描述 |
| 是(模式 A) | Qobrix 实例基础 URL |
| 是(模式 A) |
|
| 是(模式 A) |
|
| 否 |
|
认证模式
克隆此包,运行模式 A 或 B,并将实时 Qobrix 数据置于 Claude、Cursor 或任何 MCP 客户端之前——Apache 2.0。
模式 | 在此包中? | 何时 | 凭据如何到达 |
A(默认) | 是 |
| 来自进程环境的共享 |
B | 是 |
| 每个请求的 |
C | 需要配套 AS |
| 自助式 OAuth:MCP 返回 |
D(可选) | 需要配套 AS |
| 远程 MCP OAuth(RFC 9728 PRM + |
模式 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 自认证——北向客户端不变):
工具在无会话状态下运行 → MCP 返回授权 URL:
URL 模式提示(
JSON-RPC -32042),当客户端支持elicitation.url时(Claude、Cursor 等)工具结果中的 Markdown
[登录 Qobrix](/connect?e=…)链接,用于不支持提示的客户端(如 ragchat / LangChain)——LLM 必须原样转发(唯一 / 一次性使用;切勿重复使用旧链接)
用户在此服务器上打开
/connect(反钓鱼间接跳转)→ 签名 Cookie + 重定向到企业 OAuth 登录页面登录 + 双重认证 + 同意后,AS 重定向到
/oauth/callback;此 MCP 交换代码(PKCE),获取 Qobrix 凭据,并将其存储在 加密会话保险库 中下一次工具调用即已认证。当 Qobrix 返回
401/403时,保险库被清空,并返回新的/connectURL代理还可以调用
qobrix_sign_in、qobrix_whoami和qobrix_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路径名;Expresstrust 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 startMode C 端点(企业 OAuth 解决方案配对后):
GET /connect?e=…— 启动授权(设置 Cookie,302 到 AS)GET /oauth/callback— PKCE 代码交换 + 每用户会话保险库写入GET /health— 包含connected和session_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(重定向 |
空间 → 工具 → 添加 MCP 服务器 | 优先自动;静态 OAuth 回退——参见 INSTALL — 连接 Dust |
用户将
https://intranet.sharpgroup.com/qobrix-crm/mcp粘贴到 Claude 或 Dust 中主机访问
/mcp→ 收到401+WWW-Authenticate: Bearer resource_metadata=…主机获取
/.well-known/oauth-protected-resource→ 发现QOBRIX_OAUTH_ISSUER主机完成 OAuth(DCR 或静态)+ 针对企业 OAuth AS 的 PKCE
后续
/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。
环境变量:
变量 | 默认值 | 说明 |
|
| 设为 |
|
| TTL 秒数;CRM 编辑在此窗口内可见 |
|
| 内存层的 LRU 上限 |
|
|
|
|
| 共享 Redis 实例时的命名空间 |
缓存工具(暴露给 LLM):
工具 | 用途 |
| 命中/未命中/大小/进行中/Redis 状态——验证缓存是否有效 |
| 使所有键或按 |
推荐的 Redis 服务器配置(针对专用纯缓存 Redis,依据 Redis 文档):
maxmemory 256mb
maxmemory-policy allkeys-lru
maxmemory-samples 10TTL 指南——Redis 文档建议对频繁变化的数据使用短 TTL(60–120 秒),对稳定数据使用较长 TTL(数小时)。对于混合了线索管道(分钟级变化)和房源列表(小时级变化)的 CRM,300 秒是保守的默认值。需要即时刷新时使用 qobrix_cache_clear。
权衡 / 已知限制: 单飞合并仅限进程内。共享一个 Redis 的多实例部署在冷键上仍可能出现适度惊群;分布式 SETNX 锁是未来工作,单用户 MCP 客户端不需要。
最佳实践对齐:
最佳实践 | 落实位置 |
旁路缓存 / 读透(Redis 文档、MCP 缓存指南) |
|
规范、带版本的缓存键 |
|
保守 TTL |
|
错误不缓存 | 包装仅在解析上游成功后存储 |
单飞防惊群 | 进程内 |
纯缓存 Redis 使用 | 上述已为自托管者记录 |
可观测性 + 手动失效 |
|
官方 Node.js Redis 客户端 |
|
Cursor IDE 设置
此服务器使用 stdio MCP(本地 node 进程)。Cursor 从项目或用户 mcp.json 发现服务器:您打开的文件夹内的 .cursor/mcp.json,或适用于所有工作区的 ~/.cursor/mcp.json。
1. 前置条件
运行 Cursor MCP 的机器(本地笔记本或远程 SSH 主机)上需有 Node.js 20+。
克隆此仓库,安装并构建(参见 快速开始)。
添加 MCP 条目前必须存在
dist/index.js(npm run build)。
2. 凭据
复制模板:
cp .env.example .env编辑
.env,至少设置QOBRIX_API_URL、QOBRIX_API_USER和QOBRIX_API_KEY(参见 配置)。将
.env保留在 git 之外;它已列在.gitignore中。
3. JSON 放置位置
位置 | 使用时机 |
| 您在 Cursor 中打开了该项目文件夹;团队成员可以提交模板(不含密钥),或您仅本地保留。 |
| 该机器上所有工作区使用相同的 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 之后
重新加载 MCP — 命令面板 → MCP 重启,或重新加载 Cursor 窗口。
检查日志 — 视图 → 输出 → 在下拉菜单中选择 “MCP” / “MCP Logs”;在此处修复路径或 Node 错误。
工具审批 — 默认情况下,Cursor 会在每次工具调用前询问;如果您愿意,可以在 Cursor 设置中允许受信任工具自动运行。
其他 MCP 主机
Claude.ai / Claude Desktop(模式 D) — 远程自定义连接器,地址为 https://intranet.sharpsir.group/qobrix-crm/mcp。参见模式 D和INSTALL — 连接 Claude。
Dust.tt(模式 D) — Spaces → Tools → 添加 MCP 服务器,使用相同的 URL。优先选择 Automatic 认证和个人账户。参见INSTALL — 连接 Dust。
Claude Desktop / Cursor(模式 A stdio) — 相同的 stdio 形式:command + args 指向 node,并在主机的 MCP 配置文件中使用 --env-file 或 env。
CI / 无头环境 — 使用 stdio MCP 客户端库运行 node --env-file=.env dist/index.js;确保 .env 通过密钥提供,而不是提交到仓库。
搜索表达式语法
接受 search 参数的工具使用 Qobrix 的 Symfony 表达式语言(OpenAPI SearchExpression)。调用 qobrix_search_dsl_help 获取完整语法 + 属性/项目字段速查表(可选地包含实时 schema 字段名)。
功能 | 语法 | 示例 |
相等 |
|
|
比较 |
|
|
包含 |
|
|
集合成员 |
|
|
范围 |
|
|
逻辑 |
|
|
日期辅助函数 |
|
|
时间快捷方式 |
|
|
当前用户 |
|
|
地理 / 其他 |
|
|
关联路径 |
|
|
提示: 在将自由语言需求组合成查询之前,先调用
qobrix_search_dsl_help({ resource: "Properties" })。使用qobrix_get_field_options获取枚举值,使用qobrix_get_schema获取完整字段列表。
所有资源上的相关搜索(F1)
每个 qobrix_search_* 工具(属性、项目、联系人、经纪人、机会、看房、任务、报价、合同)都采用两层设计,使自由语言需求既能映射到高精度又能映射到高召回率:
search— 硬性必须条件(服务端 DSL 过滤器 → 精度下限)。boost[]— 软性加权加分项,在进程内对候选池进行评分(召回率 + 排序)。limit— 返回的排序行数(默认 10,最大 100)。需要更多选项时调高;保持适度以避免上下文过载。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" })(或 opportunities、projects、…)刷新。
获取关联数据
解析外键的三种策略:
include[]参数 — 在一次调用中内联展开关联
qobrix_get_property({ id: "...", include: ["Agents", "PropertyViewings"] })单独的 get 调用 — 从外键字段获取 UUID 并调用相应的工具
// property.agent → UUID
qobrix_get_agent({ id: "<agent-uuid>" })按外键搜索 — 通过搜索表达式查找相关记录
qobrix_search_properties({ search: 'agent == "<agent-uuid>"' })只有工具描述中标记为已验证的 include[] 值保证可用。当某个关联不支持 include[] 时,使用按外键搜索。
负载默认值
为了保持工具输出足够简短以适应调用 LLM 的上下文窗口,列表 / 搜索 / 获取工具默认使用紧凑负载:
参数 | 默认值 | 默认时的效果 |
|
| 外键以 UUID 字符串形式返回,而不是展开为嵌套对象。按需使用相应的 get 工具或针对性的 |
|
| 内联媒体(照片、平面图、缩略图 URL)不会附加到列表行。实际需要媒体时,使用 |
仅在调用方确实需要更重负载时按调用覆盖:
// 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_rows、omitted_rows、original_chars、max_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 指令)。
当 boost 与 expand=true 或 media=true 一起使用时,max_scan 自动上限为 100,pagination.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 个自动化测试,分布在 63 个 describe 套件中(集成、多步骤场景、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 |
|
客户端排序 | 7 |
|
OAuth 模式 | 4 | 模式 B 请求头、模式 C |
架构
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 testsLLM 如何学习
服务器在三个层面教导 LLM:
服务器指令 — MCP
initialize响应中的顶层instructions字段提供完整数据模型、六个规范工作流及工具配方、搜索语法、外键解析策略和已知怪癖。工具描述 — 每个工具描述包含其规范工作流角色、RESO 对应项、已验证的
include[]选项、外键字段映射、响应形状和搜索示例。相关性搜索工具记录了search+boost两层配方;qobrix_search_dsl_help按需暴露完整 DSL。参数描述 — Zod schema 为每个参数提供帮助,包含具体示例、有效枚举值和跨工具引用。
技术
组件 | 技术 |
运行时 | Node.js ≥ 20 |
语言 | TypeScript 5.7 |
MCP SDK |
|
校验 | Zod 3.24 |
可选缓存 | 设置 |
传输方式 | stdio(默认) · Streamable HTTP(模式 B / C) |
API 认证 | 模式 A/B: |
测试 | Node.js 内置测试运行器( |
许可证
Apache License 2.0 — 版权所有 2025–2026 SharpSir Group
模式 A 和模式 B 包含在此开源软件包中。模式 C 与 SharpSir 的 企业 OAuth 授权服务器(SSO / 按用户身份)配合使用——这是一款按需交付的独立商业产品——sharpsir.group · dev@sharpsir.group。
Maintenance
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
- AlicenseNot gradedqualityAmaintenanceA 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.52AGPL 3.0
- AlicenseAqualityCmaintenanceRead-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.451MIT
- AlicenseCqualityDmaintenanceEnterprise-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.42MIT
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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