mcpField
D
DealMachine

DealMachine

远程服务
github.com/DealMachine商业与营销11 天前更新
代码仓库

关于 DealMachine

DealMachine 是面向销售和潜在客户开发的命令行房产情报工具,也分发托管式 MCP 服务和 Agent 技能,支持房产、人员、数据补全、可比销售及账户任务。

主要功能

  1. 01搜索房产和人员
  2. 02数据补全与可比销售分析
  3. 03管理列表、潜在客户和标签
  4. 04OAuth 与 API 密钥认证
  5. 05Agent 指南和操作手册

适用场景

  1. 01查询房产所有者及联系信息
  2. 02查找房产的可比销售数据
  3. 03建立定向潜在客户列表
  4. 04在获取数据前估算积分消耗

MCP 相关

DealMachine 提供托管式 MCP 服务 https://mcp.dealmachine.com,开放房产、人员、数据补全、可比销售及账户工具。兼容客户端通过 Streamable HTTP 连接,并可使用 OAuth 2.1 或 DealMachine API 密钥认证。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://mcp.dealmachine.com
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

详细介绍

DealMachine CLI

维护者:Agent 指引、开发、当前命令参考和 npm 版本发布。

DealMachine CLI (dm)——在命令行中获取房产情报。

一个独立的 Commander.js CLI,可与 DealMachine REST API 通信。提供用于身份验证、房产和人员调查、数据丰富、列表、潜在客户、标签、webhook、邮件和开发者实用功能的命令。通过 tsc 编译为 ESM JavaScript。

此软件包没有 @dealmachine/* 依赖——它是一个独立的二进制程序,仅通过公开 API 通信。


AI Agent 集成

此代码库也是 DealMachine MCP 服务和 DealMachine 技能的公开分发软件包。

  • 托管 MCP 服务:https://mcp.dealmachine.com
  • API 文档:https://api.docs.dealmachine.com
  • 账户和 API 密钥:https://dealmachine.com/settings/developer
  • 隐私政策:https://dealmachine.com/privacy-policy
  • 服务条款:https://dealmachine.com/terms-of-service
  • 支持:[email protected]

MCP 服务支持 ChatGPT、Claude、Cursor、Codex 和其他兼容客户端使用 OAuth 2.1。它也可在支持 bearer token 配置的开发者客户端中使用 DealMachine API 密钥。

插件软件包包含:

  • 用于房产、人员、数据丰富、可比销售和账户工具的托管 MCP 连接
  • 一项注重额度的技能,可发现筛选条件和字段、先计数,并在执行大量付费操作前进行确认
  • 适用于兼容客户端的可移植 Agent Plugins 软件包
  • OpenAI、Claude、Cursor、GitHub Copilot 和 Gemini 的清单
  • server.json 中的官方 MCP Registry 元数据

可移植软件包遵循 Agent Plugins 1.0.0:

dealmachine-cli/
├── plugin.json
├── mcp.json
└── skills/
    └── dealmachine/
        ├── SKILL.md
        ├── REFERENCE.md
        └── SETUP.md

兼容客户端会从 skills/dealmachine/ 发现 DealMachine 技能,并连接到 mcp.json 中声明的托管 Streamable HTTP MCP 服务。代码库中保留了特定于客户端的清单,以确保兼容性、提供市场元数据和更丰富的展示效果。

请求示例:

  • “查找 Austin 的高净值、非自住业主房产,并先估算额度成本。”
  • “查询此房产的业主,并查找可用的联系数据。”
  • “查找此房产的可比销售。”
  • “调查符合这些条件的人员,以创建有针对性的潜在客户名单。”

直接安装技能:

npx skills add DealMachine/dealmachine-cli

目录


安装

从 npm 全局安装
npm install -g dealmachine
dm login

规范实现包是 @dealmachine/cli。dealmachine 包是简短的安装别名,并提供相同的 dm 命令。

从源码安装
cd dealmachine-cli
npm run build
node dist/index.js whoami
链接以供本地开发
cd dealmachine-cli
npm link
dm --version

二进制入口为 dist/index.js,在 package.json 的 bin.dm 中声明。需要 Node.js >= 18。


身份验证

CLI 支持两种身份验证方式。

设备身份验证流程(RFC 8628)

默认的 dm login 命令使用 OAuth 2.0 设备授权许可(RFC 8628)。这是交互式使用的推荐流程:

dm login
  1. CLI 使用客户端 ID dealmachine-next-cli 和你机器的主机名,向 POST /v1/auth/device/code 请求设备代码。
  2. 屏幕会显示验证 URL 和用户代码。浏览器会自动打开(除非指定 --no-browser)。
  3. 在浏览器中输入用户代码,以授权设备。
  4. CLI 按照服务器指定的时间间隔轮询 POST /v1/auth/device/token。
  5. 成功后,API 密钥、密钥 ID 和组织详情会保存到 ~/.dealmachine/config.json。

轮询会处理 RFC 8628 的所有响应:authorization_pending、slow_down(延迟 5 秒后重试)、access_denied 和 expired_token。

# Skip auto-opening the browser
dm login --no-browser

# Target a specific environment
dm login --env local
dm login --env staging
直接使用 API 密钥登录

对于 CI 流水线、脚本或本地开发,可直接传入 API 密钥:

dm login --key dm_sk_live_abc123...

密钥会在保存前通过 GET /v1/account 验证。如果验证失败,CLI 会以非零代码退出。

如果你还没有 API 密钥,请使用 dm signup <email> --login 或 dm login。免费账户可以在付费前统计匹配项并估算费用。公开方案结账仅接受共享方案目录中的自助式 Basic 和 Pro 价格,且每月数据积分上限为 60,000。

切换环境

如果你已经登录,可以切换目标 API 环境,而无需退出登录:

dm login --env local       # Switch to http://localhost:3001/v1
dm login --env staging     # Switch to https://api-staging.v2.dealmachine.com/v1
dm login --env production  # Switch to https://api.v2.dealmachine.com/v1
退出登录
dm logout

移除 ~/.dealmachine/config.json 配置文件。


配置

凭据保存在 ~/.dealmachine/config.json,文件权限为 0600(仅所有者可读写)。配置目录 ~/.dealmachine/ 创建时的权限为 0700。

配置文件架构
{
  "apiKey": "dm_sk_live_...",
  "keyId": "key_abc123",
  "organizationId": 42,
  "organizationName": "Acme Corp",
  "organizationSlug": "acme-corp",
  "apiEnvironment": "production"
}
环境变量

CLI 按以下优先级检查这些环境变量,以解析 API URL:

变量用途示例
DM_API_URL / DEALMACHINE_API_URL直接覆盖 URLhttp://localhost:3001/v1
DM_ENV / DEALMACHINE_ENVIRONMENT环境名称local、staging 或 production

如果均未设置,CLI 会回退到配置文件中的 apiEnvironment 字段,然后默认使用 production。

API 环境
环境URL
localhttp://localhost:3001/v1
staginghttps://api-staging.v2.dealmachine.com/v1
productionhttps://api.v2.dealmachine.com/v1

命令

Agent 命令
dm agents

为使用 CLI 的 Agent 输出简明指南。如果 Agent 可以使用 dm,但尚未加载 DealMachine Playbook,这是建议优先运行的命令。

dm agents
dm agents --json

该指南会指导 Agent 使用 --json 和 --quiet、验证身份验证、在搜索前获取实时筛选条件和字段、在消耗积分的操作前先统计数量,并在获取记录或导出之前确认预期的积分用量。

dm agents guide

显式输出相同的简明 Agent 指南。

dm agents guide
dm agents guide --json
dm agents playbook

打印随附的 DealMachine Playbook Markdown。Agent 应在将有关房产、人员、联系人、数据增强、列表、导出、可比房产或额度用量的自然语言请求转换为 CLI 命令之前加载此文件。

dm agents playbook
dm agents playbook --json
dm agents skill        # alias

公开 CLI 源代码将随附的 Playbook 保存在 playbook/PLAYBOOK.md。构建过程会将选定的源文件写入 dist/agents/dealmachine-playbook.md,因此该命令在已发布的 CLI 软件包和本地源代码检出中均可使用。

dm agents install claude-code

将 Playbook 安装为原生 Claude Code 技能。默认使用个人范围。项目范围会安装到当前仓库中。

dm agents install claude-code
dm agents install claude-code --project
dm agents permissions

打印用于免费发现和计数命令的精简 Claude Code 允许列表。付费和修改类命令不会预先获准。

dm agents permissions
dm agents permissions --json

身份验证命令
dm signup

创建公开 API 账户并获取 API 密钥。使用 --login 时,凭据会保存在本地且不会出现在输出中(包括 JSON);Agent 请使用此形式:

dm signup [email protected] --first-name Ada --last-name Lovelace --phone-number +15551234567
dm signup [email protected] --login
dm plans

列出当前可自助使用的套餐、包含的额度、功能和免费 API 访问权限。已连接的客户会看到其工作区价格:

dm plans
dm plans --json
dm checkout

使用 dm plans 中当前的价格 ID 预览周期性条款。客户批准确切的价格、计费间隔和数量后,添加 --yes 以创建 Stripe 结账链接:

dm checkout --price-id price_xxx_monthly --quantity 1 --json
# Only after approval:
dm checkout --price-id price_xxx_monthly --quantity 1 --yes --json

付款通过 Stripe 完成。创建结账不会激活套餐;付款后,请检查 dm account --json 和 dm usage,再重试数据增强。计数不会发放额度。免费操作仍需身份验证,并受权限和速率限制约束。

dm login

使用你的 DealMachine 账户进行身份验证。

dm login                            # Device auth flow (opens browser)
dm login --no-browser               # Device auth, manual code entry
dm login --key dm_sk_live_abc123    # Direct API key
dm login --env local                # Target local API
选项说明
--no-browser不自动打开浏览器
--key <api-key>直接使用 API 密钥登录(跳过浏览器)
--env <environment>API 环境:local、staging 或 production
dm logout

删除已存储的凭据。

dm logout
dm whoami

显示当前身份验证状态。

dm whoami               # Show stored credentials
dm whoami --verify      # Verify credentials against the API
选项说明
--verify使用 API 验证凭据

配置命令
dm config get [key]

获取配置值;若未提供键,则显示所有值。

dm config get                   # Show all config values
dm config get apiEnvironment    # Show specific value
dm config get apiKey            # Shows truncated key (first 20 chars)

可用键:organizationName、organizationSlug、organizationId、apiEnvironment、keyId、apiKey。

dm config set <key> <value>

设置配置值。只有 apiEnvironment 可编辑。

dm config set apiEnvironment local
dm config set apiEnvironment staging
dm config set apiEnvironment production
dm config path

打印配置文件的绝对路径。

dm config path
# /Users/you/.dealmachine/config.json

账户命令
dm account

显示账户信息,包括组织名称、ID、创建日期和身份验证类型。

dm account

输出:

Account
────────────────────────────────────────
Organization:  Acme Corp
Org ID:        42
Created:       Jan 15, 2025
Auth Type:     api_key

用量命令
dm usage

显示当前计费周期的额度用量。

dm usage           # Human-readable table
dm usage --json    # Machine-readable JSON

输出:

Credit Usage
──────────────────────────────────────────────────
  Plan:         Pro
  Cycle:        Mar 1, 2026 : Mar 31, 2026

  Credits:      4,200 / 10,000 (42%)
  Remaining:    5,800

  Breakdown:
    Properties: 3,100
    People:     1,100

房产命令
dm properties search

按筛选条件和地点搜索房产。

# Inline JSON body
dm properties search --body '{
  "locations": [{"type": "zip_code", "code": "78704"}],
  "filters": [{"filter_id": "property_type", "operator": "is_any_of", "value": ["single_family"]}]
}'

# From a file
dm properties search -f search.json

# Pipe from stdin
cat search.json | dm properties search

# Machine-readable output
dm properties search -f search.json --json              # Free estimate for scripts and agents
dm properties search -f search.json --json --yes        # Run after approval

# Explicit free estimate
dm properties search -f search.json --estimate-cost

# Query Builder protocol filters
dm properties search --include-lists 123,456 --exclude-previously-exported --body '{"locations":[]}'
选项描述
--body <json>以 JSON 字符串形式提供请求正文
-f, --file <path>从 JSON 文件读取请求正文
--include-lists <ids>要包含的列表 ID,以逗号分隔
--exclude-lists <ids>要排除的列表 ID,以逗号分隔
--exclude-previously-exported排除组织已导出的记录
--bigquery-data-environment <n>Query Builder 数据环境(1 生产环境、2 暂存环境、3 开发环境)
--estimate-cost预览数量和积分费用,不消耗积分
--yes在非交互式执行中确认已批准的积分支出
--json以 JSON 格式输出
dm properties count

统计符合筛选条件的房产数量,不消耗积分。

dm properties count --body '{"locations": [{"type": "state", "code": "TX"}]}'
dm properties count -f filters.json --json
dm properties get <id>

根据 DealMachine ID 获取单个房产。

dm properties get prop_12345
dm properties get prop_12345 --contact-audience owners_and_family
dm properties get prop_12345 --contact-audience none
dm properties get prop_12345 --fields estimated_value,equity
dm properties get prop_12345 --json
选项描述
--contact-audience <audience>owners、owners_and_family、renters、residents、all、none
--fields <csv>从 dm fields 获取的房产字段 ID,以逗号分隔
--json以 JSON 格式输出

房产查询默认使用 owners。如果只需要房产数据,请使用 --contact-audience none。这样会省略联系人信息,并避免消耗人员积分。

dm properties ids [ids...]

通过单个批量请求,根据多个 ID 获取房产。

# Positional arguments
dm properties ids prop_111 prop_222 prop_333

# Via JSON body
dm properties ids --body '{"ids": ["prop_111", "prop_222"]}'

# From file
dm properties ids -f ids.json --contact-audience owners
dm properties ids -f ids.json --contact-audience none
选项描述
--body <json>以 JSON 字符串形式提供请求正文
-f, --file <path>从 JSON 文件读取请求正文
--contact-audience <audience>包含联系人:owners、owners_and_family、renters、residents、all、none
--json以 JSON 格式输出
dm properties export

将属性导出为 CSV(最多 1,000,000 条记录)。返回签名下载 URL。

dm properties export -f search.json
dm properties export -f search.json --require-phone --scrub-dnc
dm properties export --body '{"locations": [...]}' --mobile-only --json
选项说明
--body <json>将请求正文作为 JSON 字符串传入
-f, --file <path>从 JSON 文件读取请求正文
--require-phone仅包含联系人有电话号码的记录
--require-email仅包含联系人有电子邮件地址的记录
--mobile-only仅包含无线电话号码
--landline-only仅包含固定电话号码
--scrub-dnc排除列入勿致电登记名单的联系人
--json以 JSON 格式输出

人员命令
dm people search

按筛选条件和地点搜索人员。

dm people search --body '{
  "locations": [{"type": "zip_code", "code": "78704"}],
  "filters": [{"filter_id": "age", "operator": "between", "value": [30, 50]}]
}'
dm people search -f people-search.json --json
dm people search -f people-search.json --estimate-cost
dm people search -f people-search.json --json --yes
dm people search --include-lists 123 --exclude-lists 456 --exclude-previously-exported --body '{"locations":[]}'

非交互式人员搜索会返回免费估算,除非提供 --yes。按姓名查找特定人员时,请使用 dm enrich name,而非人员搜索。

dm people count

统计符合筛选条件的人员数量,不消耗额度。

dm people count -f filters.json
dm people get <id>

通过 DealMachine ID 获取单个人员的信息。

dm people get per_12345
dm people get per_12345 --include-properties --property-limit 20
dm people get per_12345 --fields estimated_household_income,estimated_value
dm people get per_12345 --json
选项说明
--include-properties包含关联属性
--property-limit <n>返回的关联属性上限,范围为 1 到 100
--fields <csv>来自 dm fields 的逗号分隔字段 ID
--json以 JSON 格式输出
dm people ids [ids...]

通过单个批量请求,按 ID 获取多个人员的信息。

dm people ids per_111 per_222 per_333
dm people ids --body '{"ids": ["per_111", "per_222"]}' --include-properties --property-limit 20
dm people ids per_111 per_222 --fields estimated_household_income,estimated_value
选项说明
--include-properties包含关联属性
--property-limit <n>每个人员返回的关联属性上限,最多为 100
--fields <csv>来自 dm fields 的逗号分隔字段 ID
dm people export

将人员导出为 CSV(最多 1,000,000 条记录)。返回签名下载 URL。

dm people export -f search.json --require-email
dm people export -f search.json --mobile-only --scrub-dnc --json

联系人筛选选项与 dm properties export 相同。


丰富信息命令

所有丰富信息命令都支持三种输入模式:使用位置参数进行单项查找,使用 --body/-f 传入 JSON 负载,以及使用 -f 指定 .csv 文件以从 CSV 批量丰富信息。超过 250 项的批次会自动分块。每个丰富信息命令都接受 --fields <csv>,并将所选字段 ID 发送至 API。电子邮件、电话和姓名匹配也会附带免费的 property_count;如需获取属性记录本身,请使用 --include-properties。

dm enrich address [address]

按街道地址查询房产。

# Single address
dm enrich address "123 Main St, Austin, TX 78704"
dm enrich address "123 Main St, Austin, TX 78704" --contact-audience none
dm enrich address "123 Main St, Austin, TX 78704" --fields estimated_value,equity

# Batch from JSON
dm enrich address --body '{"data": [{"full_address": "123 Main St, Austin, TX"}]}'

# Batch from CSV (auto-detected by .csv extension)
dm enrich address -f addresses.csv --contact-audience owners

# CSV columns: full_address (or street, city, state, zip)
选项说明
--body <json>JSON 字符串形式的请求正文
-f, --file <path>从 JSON 或 CSV 文件读取
--contact-audience <audience>owners、owners_and_family、renters、residents、none
--fields <csv>来自 dm fields 的逗号分隔字段 ID
--json以 JSON 格式输出

如果只需要房产信息,请使用 --contact-audience none。响应中不会包含联系人,也不会消耗人员额度。

dm enrich latlng [coords]

按纬度/经度坐标查询房产。

dm enrich latlng 30.25,-97.75
dm enrich latlng -f coordinates.csv --fields estimated_value,equity --contact-audience none
# CSV columns: latitude, longitude (or lat, lng/lon/long)
dm enrich apn [apn]

按评估员地块编号查询房产。使用 --state 或 --zip 缩小结果范围。

dm enrich apn "0123-456-789" --state TX
dm enrich apn -f parcels.csv --zip 78704 --fields estimated_value,equity
# CSV columns: apn (or parcel_id, parcel_number)
选项说明
--state <code>按州缩小范围(例如 TX)
--zip <code>按 ZIP 邮政编码缩小范围
--contact-audience <audience>owners、owners_and_family、renters、residents、none
--fields <csv>来自 dm fields 的逗号分隔字段 ID
dm enrich email [email]

按电子邮件地址查询人员。

dm enrich email [email protected]
dm enrich email [email protected] --include-properties
dm enrich email -f emails.csv --fields estimated_household_income,estimated_value --json
# CSV columns: email (or email_address)
选项说明
--include-properties包含关联房产
--fields <csv>来自 dm fields 的逗号分隔字段 ID
dm enrich phone [phone]

按电话号码查询人员。

dm enrich phone 5125551234
dm enrich phone -f phones.csv --include-properties --fields estimated_value
# CSV columns: phone (or phone_number)
选项说明
--include-properties包含关联房产
--fields <csv>来自 dm fields 的逗号分隔字段 ID
dm enrich name [name]

按姓名查询人员。支持“名 姓”或仅“姓”的格式。

dm enrich name "Jane Doe" --state TX --estimate-cost
dm enrich name "Jane Doe" --state TX --json --yes
dm enrich name "Doe" --state TX --page 2
dm enrich name "Jane Doe" --zip 78704 --include-properties
dm enrich name "Jane Doe" --fields estimated_household_income,estimated_value
选项说明
--state <code>按州缩小范围
--zip <code>按 ZIP 邮政编码缩小范围
--include-properties包含关联房产
--fields <csv>来自 dm fields 的字段 ID
--estimate-cost预览数量和额度
--yes确认已批准的额度支出
--page <n>页码
--per-page <n>每页结果数

可比项命令
dm comps [property_ids...]

查找一个或多个房产的可比房产(销售可比数据)。

# Single property with defaults
dm comps prop_12345

# Multiple properties with options
dm comps prop_12345 prop_67890 --radius 2 --timeframe 12months --limit 50

# Full control via JSON body
dm comps --body '{
  "property_ids": ["prop_12345"],
  "location": {"type": "radius", "radius_miles": 1.5},
  "criteria": {"timeframe": "6months", "sort_by": "match", "limit": 25}
}'
OptionDescription
--body <json>JSON 字符串格式的请求正文
-f, --file <path>从 JSON 文件读取请求正文
--radius <miles>搜索半径(英里,默认值:1)
--timeframe <period>3months、6months、12months、all(默认值:6months)
--limit <n>每个房产的可比数据上限(默认值:25,最大值:100)
--sort-by <field>distance、price、date、match(默认值:match)
--sort-direction <dir>asc、desc(默认值:desc)
--include-foreclosures包含止赎销售
--json以 JSON 格式输出

输出包含目标房产详情、带置信区间的价值估算、汇总统计信息(平均/中位价格、每平方英尺价格)以及可比房产表格。


列表命令
dm lists search

搜索并列出所有已保存的列表。

dm lists search
dm lists search --search "Austin" --source-type properties --sort newest
dm lists search --page 2 --per-page 50 --json
OptionDescription
--search <term>按名称搜索列表
--source-type <type>properties 或 people
--sort <order>newest、oldest、name、count
-p, --page <n>页码
--per-page <n>每页结果数
dm lists create

创建新列表。

# Empty list
dm lists create --name "Austin Leads"

# Pre-populated with record IDs (max 250)
dm lists create --name "Hot Leads" --source-type properties --ids 123,456,789

# With search filters for a list build
dm lists create --name "TX SFR" -f search-filters.json
OptionDescription
--name <name>列表名称(必填)
--source-type <type>properties 或 people
--ids <csv>以逗号分隔的记录 ID,用于预先填充(最多 250 个)
--body <json>JSON 格式的请求正文(筛选条件/位置)
-f, --file <path>从 JSON 文件读取请求正文
dm lists get <id>

获取指定列表的详情,包括状态、进度和错误状态。

dm lists get list_abc123
dm lists update <id>

重命名列表。

dm lists update list_abc123 --name "New Name"
dm lists delete <id>

删除列表及其所有项目。

dm lists delete list_abc123
dm lists build <id>

根据搜索筛选条件构建列表。这是异步操作——使用 dm lists get 轮询状态。

dm lists build list_abc123 -f search-filters.json
dm lists import <id>

将记录 ID 导入现有列表。

dm lists import list_abc123 --ids 111,222,333 --source-type properties
dm lists import list_abc123 -f import-payload.json
dm lists items <id>

分页列出列表中的项目。

dm lists items list_abc123
dm lists items list_abc123 --page 2 --per-page 100 --json
dm lists add <id>

按 ID 将项目添加到列表。

dm lists add list_abc123 --ids 111,222,333
dm lists add list_abc123 --ids 111,222 --id-type internal_property_id
OptionDescription
--ids <csv>以逗号分隔的待添加 ID 列表(必填)
--id-type <type>internal_property_id 或 internal_person_id
dm lists remove <id>

按 ID 从列表中移除项目。

dm lists remove list_abc123 --ids 111,222,333
dm lists export <id>

导出列表项目。每条记录都会扣除积分。

dm lists export list_abc123
dm lists export list_abc123 --fields "full_address,estimated_value,owner_name" --anchor property
OptionDescription
--fields <csv>以逗号分隔的待导出字段列表
--anchor <type>property 或 person

筛选命令
dm filters

列出可用的搜索筛选条件及其类型、运算符和分组。

dm filters
dm filters --source-type properties --search "bed"
dm filters --group-id building_information --json
选项描述
--source-type <type>properties 或 people
--group-id <id>按组 ID 筛选
--search <term>按名称搜索筛选条件
--page <n>页码
--per-page <n>每页结果数

Fields Commands
dm fields

列出可用的数据字段及其可筛选/可排序标记。

dm fields
dm fields --source-type people --search "phone"
dm fields --group-id contact_info --json
选项描述
--source-type <type>properties 或 people
--group-id <id>按组 ID 筛选
--search <term>按名称搜索字段
--page <n>页码
--per-page <n>每页结果数

Locations Commands

搜索并检索 DealMachine 位置。

dm locations search -q "Harris" --type county --state TX --json
dm locations get loc_city_48106 --json

dm locations autocomplete 仍可作为已弃用的 dm addresses autocomplete 别名使用。


Activity Commands
dm activity search

按类型筛选条件和自由文本搜索,搜索过去的 API 活动。

dm activity search -t search_properties enrich_address
dm activity search -q "Austin" --page 2
dm activity search --body '{"types": ["search_properties"], "page": 1}'
选项描述
--body <json>以 JSON 字符串形式提供请求正文
-f, --file <path>从 JSON 文件读取请求正文
-t, --types <types...>按活动类型筛选(以空格分隔)
-q, --query <text>在活动中进行自由文本搜索
--page <n>页码
--per-page <n>每页结果数
dm activity get <id>

获取特定活动记录的完整详情,包括原始请求、结果摘要以及实体 ID(人员和房产)。

dm activity get act_abc123
dm activity get act_abc123 --json

Addresses Commands
dm addresses autocomplete <query>

返回免费的、有数量限制的地址及标准化位置建议。

dm addresses autocomplete "1200 Barton Springs" --state TX
dm addresses autocomplete "saint louis 63101" --scope location --limit 5 --json
选项描述
--scope <scope>all、address 或 location,默认值为 all
--state <code>优先使用两个字母的州缩写
--limit <n>建议结果的最大数量,默认值为 5,最大值为 10
--latitude <number>用于附近结果排序的纬度;需要提供经度
--longitude <number>用于附近结果排序的经度;需要提供纬度
--json输出原始 JSON 响应

自动补全不会请求字段、执行数据增强或消耗数据额度。

dm addresses validate [address]

通过 USPS 验证并规范化地址。

# Single address
dm addresses validate "123 Main St, Austin, TX 78704"

# Batch via JSON
dm addresses validate --body '{"data": [{"full_address": "123 Main St, Austin TX"}]}'

# From file
dm addresses validate -f addresses.json --json

输出会将每个地址标记为有效、已更正(并列出更正内容)或无效(并说明原因)。


Dev Commands

可直接对 Docker MySQL 容器(dealmachine-next-mysql)进行操作的本地开发实用工具。使用这些工具需要本地数据库正在运行(在仓库根目录执行 npm run db:start)。

dm dev license add <key_id>

向本地数据库中的 API 密钥添加许可证。

dm dev license add key_abc123 --type state --code TX
dm dev license add key_abc123 --type zip_code --code 78704
dm dev license add key_abc123 --type unlimited
dm dev license add key_abc123 --type county --code 48453 --expires 2026-12-31
选项描述
--type <type>state、county、zip_code 或 unlimited(必填)
--code <code>位置代码:州缩写、FIPS 代码或 ZIP
--expires <date>ISO 格式的到期日期
dm dev license list [key_id]

列出所有许可证,可选择按密钥 ID 筛选。

dm dev license list
dm dev license list key_abc123
dm dev license remove <license_id>

根据数字 ID 移除许可证。

dm dev license remove 42

全局选项

每条命令都支持以下标志:

标志说明
--json输出机器可读的 JSON(用于脚本和管道)
--quiet为 Agent/脚本隐藏加载动画和装饰性输出
--help显示任意命令的用法信息
--version显示 CLI 版本

输入方式

接受请求正文的命令支持三种输入方式,并按以下顺序检查:

  1. --body <json> —— 内联 JSON 字符串。
  2. -f, --file <path> —— 从 JSON 文件读取。数据增强命令也接受 .csv 文件进行批量处理。
  3. 标准输入管道 —— 从管道输入读取 JSON(当标准输入不是 TTY 时检测)。
# Inline
dm properties search --body '{"locations": [...]}'

# File
dm properties search -f query.json

# Pipe
cat query.json | dm properties search

# CSV enrichment (enrich commands only)
dm enrich address -f addresses.csv
CSV 批量数据增强

enrich 命令会根据扩展名检测 .csv 文件并自动解析。各命令所需的列名如下:

命令必需列可选列名
enrich addressfull_address或 street + city、state、zip
enrich latlnglatitude、longitudelat、lng/lon/long
enrich apnapnparcel_id、parcel_number
enrich emailemailemail_address
enrich phonephonephone_number

超过 250 项的批次会自动分块处理,并显示进度动画。如果批次处理中途达到导出限制,CLI 会停止并返回已收集的结果。


项目结构

dealmachine-cli/
  scripts/
    copy-agent-assets.mjs      # Bundles the Playbook Markdown into dist/agents
  src/
    index.ts                  # Program entrypoint -- registers all 17 command groups
    lib/
      config.ts               # Read/write ~/.dealmachine/config.json (mode 0600)
      client.ts               # HTTP client wrapper (apiRequest, formatDate, getApiKey)
      api.ts                  # Device auth flow client (requestDeviceCode, pollForToken, verifyCredentials)
      output.ts               # Formatting helpers (printTable, printJson, printKeyValue, parseRequestBody)
    commands/
      agents.ts               # dm agents    -- agent guide and Playbook output
      login.ts                # dm login     -- device auth + API key login
      logout.ts               # dm logout    -- remove credentials
      whoami.ts               # dm whoami    -- show/verify auth status
      config.ts               # dm config    -- get, set, path
      account.ts              # dm account   -- show account info
      usage.ts                # dm usage     -- credit usage
      properties.ts           # dm properties -- search, count, get, ids, export
      people.ts               # dm people    -- search, count, get, ids, export
      enrich.ts               # dm enrich    -- address, latlng, apn, email, phone, name
      comps.ts                # dm comps     -- comparable properties
      lists.ts                # dm lists     -- full CRUD + build, import, export
      filters.ts              # dm filters   -- list available filters
      fields.ts               # dm fields    -- list available fields
      activity.ts             # dm activity  -- search, get
      addresses.ts            # dm addresses -- validate
      dev.ts                  # dm dev       -- local license management
  dist/                       # Compiled output (ESM)
  package.json
  tsconfig.json
关键模块
模块职责
lib/config.ts管理 ~/.dealmachine/config.json。强制要求文件权限为 0600、目录权限为 0700。提供带类型的读取、写入和删除辅助函数。
lib/client.ts集中式 HTTP 客户端。从环境变量、配置或默认值解析 API 基础 URL。添加 Authorization: Bearer 标头和带版本号的 User-Agent。发生 HTTP 错误时以非零代码退出。
lib/api.ts设备授权流程的实现。处理 POST /v1/auth/device/code 和 POST /v1/auth/device/token,支持符合 RFC 8628 的轮询和错误映射。还提供用于密钥验证的 verifyCredentials。
lib/output.ts所有输出格式化功能:printTable(自动调整列宽)、printJson、printKeyValue、printPagination、printCredits、printTotals、printWarning、printHeader。还导出用于处理 --body、-f 和标准输入的 parseRequestBody。

构建

npm run build      # Compile TypeScript and bundle agent Playbook assets to dist/
npm run dev        # Watch mode (tsc --watch)
npm run eval:cold-start:local      # Verify a clean local install and routing contract
npm run eval:cold-start:published  # Verify the latest public npm artifact
npm run eval:cold-start:deployed   # Verify deployed documentation and skill assets

已发布检查和部署检查是发布门禁。预计在发布版本或文档部署进入生产环境之前,这些检查会失败。场景目录存储在 evals/claude-code-name-lookup.json 中,因此相同的提示词变体始终清晰可见且便于审查。

测试
npm test           # Unit and behavioral tests with a mocked API (no credentials)
npm run check      # Typecheck, build, tests and the public artifact guard
DM_API_URL=https://api-staging.v2.dealmachine.com/v1 DM_API_KEY=<key> npm run smoke:live:coverage

npm test 不会调用任何 API。smoke:live:coverage 会构建 CLI,并使用 DM_API_KEY 进行身份验证,通过真实的 dm 二进制文件访问 DM_API_URL 指定的 API。这两个变量都必须设置;密钥绝不会被打印。每个命令都会使用临时主目录运行,因此烟雾测试不会读取或更改你自己的 dm login 凭据。测试只运行只读且不消耗额度的命令:

命令检查
dm --version无需网络请求即可打印软件包版本
dm account --json已提供组织、用户身份验证类型和套餐
dm filters --source-type properties --per-page 5 --json筛选器包含 ID、名称、运算符和分页信息
dm fields --source-type properties --per-page 5 --json字段包含 ID、名称和分页信息
dm properties search --body <ZIP 78704> --estimate-cost --json返回估算结果,不含记录且不消耗额度

请求会经过本地中继;中继会拒绝所有不属于这些只读端点的请求(属性搜索必须携带 estimate_cost: true),并确认每个请求都发送了 X-DealMachine-Source: cli 和 CLI User-Agent。烟雾测试会为每条命令打印一行 PASS 或 FAIL,并且只有在所有命令都通过时才以 0 退出。

独立二进制文件

编译后的 dist/index.js 包含 #!/usr/bin/env node shebang,并在 package.json 的 bin.dm 下声明。通过 npm 全局安装后,它会以 dm 的名称添加到 PATH 中。

如需将其作为独立二进制文件分发,而不使用 npm:

# Build
cd dealmachine-cli
npm run build

# The entire dist/ directory is the distributable artifact
# dist/index.js is the entrypoint (requires Node.js >= 18 on the target machine)

package.json 中的 files 数组可确保发布的软件包仅包含 dist/。

TypeScript 配置
  • 目标版本:ES2022
  • 模块:NodeNext(ESM)
  • 已启用严格模式
  • 输出声明文件、声明映射文件和源映射文件
  • 无项目引用(独立编译)

添加新命令

第 1 步:创建命令文件

创建 src/commands/mycommand.ts:

/**
 * MyCommand -- description of what this command does
 */

import chalk from 'chalk';
import ora from 'ora';
import { apiRequest } from '../lib/client.js';
import { printJson, printHeader, printKeyValue } from '../lib/output.js';

interface MyResponse {
  data: { id: string; name: string };
}

export async function myCommand(options: { json?: boolean }): Promise<void> {
  const spinner = ora('Doing something...').start();
  const data = await apiRequest<MyResponse>('/my-endpoint');
  spinner.stop();

  if (options.json) {
    printJson(data);
    return;
  }

  printHeader('My Command');
  printKeyValue({
    ID: data.data.id,
    Name: data.data.name,
  });
  console.log();
}
第 2 步:在 index.ts 中注册

在 src/index.ts 中导入并接入命令:

import { myCommand } from './commands/mycommand.js';

// Top-level command
program
  .command('mycommand')
  .description('Description shown in --help')
  .option('--json', 'Output as JSON')
  .action(async (options) => {
    await myCommand(options);
  });

// Or as a subcommand group
const myGroup = program.command('mygroup').description('Group description');

myGroup
  .command('sub1')
  .description('Subcommand description')
  .action(async (options) => {
    await mySub1(options);
  });
第 3 步:构建并测试
npm run build
node dist/index.js mycommand --json
约定
  • 在 src/commands/ 中为每个命令组创建一个文件。
  • 始终支持 --json,以便输出机器可读的内容。
  • 在调用 API 时使用 ora 显示加载动画。
  • 使用 chalk 为终端输出添加颜色。
  • 所有 API 调用都使用 lib/client.ts 中的 apiRequest<T>——它会处理身份验证、错误和退出。
  • 命令接受 --body、-f 或 stdin 输入时,使用 lib/output.ts 中的 parseRequestBody。
  • 使用 printHeader、printTable、printKeyValue、printCredits、printPagination,确保输出格式一致。
  • 所有导入都必须使用 .js 扩展名(NodeNext 解析下的 ESM 要求)。

依赖项

运行时
软件包版本用途
commander^12.1.0CLI 框架——命令注册、选项解析、帮助生成
chalk^5.3.0终端字符串样式(颜色、粗体、暗淡)
ora^8.1.0异步操作的加载动画
open^10.1.0为设备身份验证流程打开浏览器
开发
软件包版本用途
typescript^5.6.3TypeScript 编译器
@types/node^22.0.0Node.js 类型定义
内部包依赖

无。 此包是完全独立的二进制文件,不依赖任何 @dealmachine/*。它仅通过公开 REST API 进行通信。

使用方

packages/playbooks/playbook/ 中的 Playbook 使用 dm 命令执行房产情报工作流。CLI 是 Playbook 与 DealMachine 数据交互的主要接口。Agent 可以通过 dm agents playbook 直接加载捆绑的 Playbook。

工厂暂存工作跟踪

factory-release-intake.yml 工作流在 master 上维护,并从 staging 读取已合并的 PR。它会向 Factory Releases 报告来源;如果已登记,还会报告确切的 staging 部署;同时复用 Linear 链接,或创建一个可配置的试点跟踪问题。定期协调会重试遗漏的事件,且不会创建重复问题。它不会部署此仓库、运行 QA 或批准生产发布。

此收集器由 Factory 生成。有关配置、来源所有权、重新生成和恢复,请参阅自动暂存接入。尽管报告工作流位于 master 上,staging 仍是正在检查的分支。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。