Onehome Mcp

io.github.chrischall由 GitHub 帳號 chrischall 發布v1.2.1更新於 Nov 7, 2026

OneHome (CoreLogic) real-estate access for Claude — search, property details, photos, saved homes

已驗證STDIO僅桌面位置與生活金融

概覽

AI 產生的概覽

讓助理搜尋房仲分享的 OneHome(CoreLogic)房源,取得物件詳情與照片、比較房屋,並在本機試算房貸與可負擔金額。

可以做什麼
  • 搜尋與解析房源:自由文字或 MLS 編號建議搜尋、單筆或批次地址解析為房源、依群組與已儲存搜尋列出房源
  • 讀取物件資料:依 id 或入口網址取得完整詳情、批次取得、含多尺寸圖片與房間描述的相簿
  • 並排比較多筆物件,並取得周邊資訊,例如附近學校與步行、大眾運輸、自行車便利度評分
  • 在本機試算房貸 PITI 明細與 28/36 可負擔房價,不發出網路請求
  • 管理工作階段:新增魔法連結或權杖工作階段、切換使用中的工作階段、檢視工作階段範圍、執行驗證健康檢查
  • 以唯讀原始 GraphQL 查詢作為進階入口
適用情境
適合買方或房仲在 OneHome 分享的房源中作業,希望助理彙整已儲存的房源、取得詳情與照片、比較候選物件或檢核可負擔性時使用。不適用於公開房源網站,因為 OneHome 的存取權限來自房仲發出的分享連結。
執行需求
以本機 Node.js 程序執行(npm 套件 onehome-mcp,或已發布的 Claude 外掛)。需要 OneHome 持有人憑證:ONEHOME_TOKEN(原始 JWT)或 ONEHOME_MAGIC_LINK(房仲的魔法連結網址),或透過 ContextMint Bridge 擴充功能搭配已登入的入口網站分頁進行瀏覽器擷取。選用:ONEHOME_COMMUNITIES_FILE、FETCHPROXY_IDENTITY_DIR、FETCHPROXY_WS_HOST、ONEHOME_WS_PORT。需要連線至 services.onehome.com 的網路。
安裝前請注意
ONEHOME_TOKEN 與 ONEHOME_MAGIC_LINK 是可存取分享房源的即時使用者憑證,應視為機密保存;魔法連結中的權杖會直接當作持有人權杖使用。瀏覽器擷取模式依賴第三方擴充功能截取 Authorization 標頭,請核對發行檔的雜湊值。請求會送往 services.onehome.com,原始 GraphQL 工具會揭露上游回應內容。README 說明本專案由 AI 開發,請自行斟酌使用。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Onehome Mcp,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

onehome-mcp

[CI] [npm] [license]

MCP server for OneHome (CoreLogic) — search the listings your real-estate agent curated for you, fetch property details + photos, compare houses side-by-side, and run mortgage / affordability math from within Claude.

Sister project to zillow-mcp, redfin-mcp, compass-mcp, and homes-mcp. Same tool ergonomics — different upstream auth model.

This project was developed and is maintained by AI (Claude). Use at your own discretion.

What's different about OneHome

OneHome isn't a public listings site. Buyers usually reach it through a magic link an agent emails them — https://portal.onehome.com/...?token=eyJ.... That token query param IS the per-user bearer that the portal SPA hands to every GraphQL request.

So instead of routing every fetch through your signed-in browser tab (like the other realty MCPs), onehome-mcp talks directly to services.onehome.com/graphql from Node, with Authorization: Bearer <jwt> attached. We support three ways to source that bearer:

ModeHow to enableNotes
env_tokenONEHOME_TOKEN=<jwt>Paste the raw bearer from devtools Network panel. Most direct.
magic_linkONEHOME_MAGIC_LINK=https://portal.onehome.com/...?token=...Paste the full URL your agent sent — we extract the token param.
fetchproxy_capture(no env) + ContextMint Bridge browser extension installed (Chrome: load the release's chrome zip unpacked; Safari isn't available yet — it will ship inside the ContextMint app, so use Chrome for now) + signed-in portal.onehome.com tabWe wait for your tab to fire any GraphQL request, snapshot the Authorization header, and reuse it.

ContextMint Bridge is the fetchproxy browser extension under its new name, from the same maintainer — fetchproxy's own README (fetchproxy#extension) points to it. Its source is public at nullnet-app/contextmint-bridge: build it yourself, or check a release zip against the .sha256 file published beside it (shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256).

Tools

ToolWhat it does
onehome_get_userSmallest auth probe — returns your OneHome profile (name, email) and the groups your agent shared.
onehome_get_groupsList the OneHome "groups" your agent has shared with you (each one a market / curated listing bucket).
onehome_get_saved_searchFetch an agent-curated saved search by id — name, filter criteria, polygon, and the OSK listing ids that compose the share.
onehome_get_saved_search_with_listingsThe "show me my saved homes" flow in one round trip — saved search plus its inflated listings.
onehome_search_propertiesListings within a group; optionally scoped to a saved search.
onehome_search_suggestionsFree-text suggestion search (address, MLS #) across all feeds.
onehome_get_by_addressResolve a single free-text street address to a listing's portal URL + id.
onehome_resolve_addressesBulk-resolve up to 100 structured addresses to portal URLs + listing ids; concurrent, per-row error capture.
onehome_get_propertyFull property record by listing id or portal URL.
onehome_bulk_getFetch up to N listings in one call — one structured row per id, per-row error capture.
onehome_get_property_photosFull media gallery — Thumbnail / Medium / Large variants + room descriptions.
onehome_compare_properties2-8 listings side-by-side. Per-row error capture; calls are concurrent.
onehome_get_schoolsLocal-Logic primary + high schools near a lat/lng.
onehome_get_walk_scoreLocal-Logic walk / transit / bike / car friendliness scores.
onehome_graphqlPower-user escape hatch — send a raw read-only GraphQL document (queries only; mutations and subscriptions are refused) with variables.
onehome_calculate_mortgageLocal PITI calculator. Same math as the other realty MCPs.
onehome_calculate_affordabilityLocal 28/36 DTI solver — max home price you can afford.
onehome_set_authAdd another authenticated session at runtime (magic link / JWT / email-token) for buyers holding shares across multiple agents.
onehome_set_active_sessionForce a specific registered session to be the active one (overrides MLS-suffix routing).
onehome_get_session_contextList every registered session — auth mode, token expiry, and the group / saved-search / agent scope each bootstrapped.
onehome_healthcheckEnd-to-end auth + GraphQL smoke check with token-expiry diagnostics.

Install

The simplest path is the published Claude plugin (.mcpb install). Its settings take an optional OneHome magic link or bearer token (both stored as sensitive values); leave both blank to use browser-bridge capture instead. For local dev:

bash
git clone https://github.com/chrischall/onehome-mcpcd onehome-mcpnpm installnpm run build

Then point your MCP host at node /abs/path/to/onehome-mcp/dist/bundle.js with one of:

jsonc
// claude_desktop_config.json{  "mcpServers": {    "onehome-mcp": {      "command": "node",      "args": ["/abs/path/to/onehome-mcp/dist/bundle.js"],      "env": {        "ONEHOME_MAGIC_LINK": "https://portal.onehome.com/en-US/properties/map?token=eyJ..."      }    }  }}

Development

bash
npm test               # vitest, mocked transport, no networknpm run test:watchnpm run test:coveragenpx tsc --noEmitnpm run build          # tsc --noEmit + esbuild → dist/bundle.js

Tests use a FakeTransport (in tests/helpers.ts) that registers per-operationName handlers — there's no live network in the test suite. The tests/index.test.ts smoke check loads the same tool registrations src/index.ts uses against an in-memory MCP client/server pair, so "I wrote the tool file but forgot to wire it up" mistakes fail loudly.

License

MIT.

來源:README.md,提交 874f305

工具

21

onehome_get_user

Get the signed-in OneHome user profile

Returns the OneHome user profile + the consumer-share groups attached. Share member e-mails and the agent's e-mail/phones are omitted unless `include_contacts: true`. For full agent / registered users, queries the GraphQL `user` endpoint. For magic-link consumer-share sessions (where `user { }` is access-denied), falls back to the data captured during the `checkToken` exchange — email, contact id, group/savedSearch ids, and the agent who shared with you.

輸入參數viewinclude_contacts

onehome_get_groups

List my OneHome agent groups

List the OneHome groups your agent has shared with you. Share member e-mails and the agent's e-mail/phones are omitted unless `include_contacts: true`. For full agent / registered users, returns the GraphQL `user.groups` list. For magic-link consumer-share sessions (a single shared group), synthesizes a one-entry list from the `checkToken` session context.

輸入參數include_contacts

onehome_get_session_context

Inspect every registered OneHome session

Returns one entry per registered session — its `session_id`, auth_mode, token expiry, and session scope (group_id / saved_search_id / agent_id / contact_id / mls_id) the MCP bootstrapped from each checkToken exchange. `active_session_id` flags which session answers by default; per-listing routing uses the active session when its `mls_id` matches the listing's `~MLS` suffix, else the one session that matches (several matches error — pick one with `onehome_set_active_session`). Tools default unspecified `group_id` / `saved_search_id` arguments from the active session's context, so this is the easiest way to see what they'll default to. Single-session use (the common case) returns a one-entry `sessions[]`.

無需輸入參數。

onehome_get_saved_search_with_listings

Fetch a saved search and inflate its listings in one call

Combo tool: the "show me my saved homes" flow in a single round trip. Internally runs `GetSavedSearchBySearchId` to fetch the saved search (name, filters, polygon, listingIds) and then `GetSavedListings` to inflate those listingIds into full property records — the same two-call sequence as calling `onehome_get_saved_search` followed by `onehome_search_properties(saved_search_id=...)`, but exposed as one tool so the magic-link-to-listings consumer flow is a single MCP call. Returns `{ saved_search, listings, count, page_info }`. Both `saved_search_id` and `group_id` default to the magic-link session context. Sort defaults to `property.MajorChangeTimestamp DESC` (Newest). Listings are returned via the GraphQL listing-card projection (`buildGetSavedListings`), which does NOT include `PublicRemarks` — so there is no raw `description` to opt back into here. Use `onehome_get_property(listing_id)` per row when you need the full description for a specific listing. `view: "brief"` answers one line per listing instead: `address · price — date of its last change — status, change` (e.g. a new listing or a price decrease), inside the untrusted-data envelope as `data: string[]`, with `-- none` for an empty saved search and `-- N of M shown` when the page holds fewer listings than the search.

輸入參數viewgroup_idpage_numpage_sizesort_fieldsort_ordersaved_search_idinclude_dislikes

onehome_search_properties

Search listings inside a OneHome group / saved share

Fetch listings inside a OneHome consumer-share. Two modes: - With `saved_search_id`: fetch the agent-curated collection (the standard 'Homes at <name>' view). The MCP first resolves the saved search's listingIds and then inflates them via listingsBySavedSearchId — this is the only mode that works for non-agent consumer accounts. - With just `group_id` and no `saved_search_id`: try the raw `listings(groupId, browseParameter)` endpoint. If page 0 comes back empty with no reported results (the access-restricted shape consumer-shares hit) AND the session context has a `savedSearchId` for that same group, the tool falls back to the saved-search path and marks the response `fell_back_to_saved_search: true`. If there's no fallback target it raises a clear error rather than silently returning empty. An empty later page (paging past the end) is returned as an empty page, never swapped for the saved-search collection. Both args default from the MCP's bootstrapped session context (the magic-link checkToken response) when neither is passed explicitly. Sort is `MajorChangeTimestamp DESC` ('Newest') unless overridden. `include_dislikes: false` by default — flip it on to include listings you've thumbs-downed in OneHome. Listings here are returned via the GraphQL listing-card projection, which does NOT include `PublicRemarks` — so there is no `description` field on search results and no `include_description` flag to opt into one. Each listing carries the structured `extracted_features` object instead. Use `onehome_get_property(listing_id)` per row when you need the full description for a specific listing.

輸入參數group_idpage_numpage_sizesort_fieldsort_ordersaved_search_idinclude_dislikes

onehome_search_suggestions

Free-text suggestion search across MLS feeds

Cross-feed suggestion search by address, MLS number, or partial query. Bypasses the group/saved-search structure and hits the global suggestion endpoint — useful for "find an address" or "look up by MLS number". Returns id, address parts, beds/baths, list price, thumbnail per match. Inflate any result with `onehome_get_property`. Optional `group_id` scopes suggestions to one OneHome market.

輸入參數query必填group_id

onehome_get_property

Fetch full details for a OneHome listing

Fetch full details for a single OneHome listing by id or portal URL. Returns address, list / close / previous price, $/sqft, beds/baths/sqft, lot size (raw `lot_size` {area, units} plus the derived `lot_size_acres` — null, never 0, for condos / lotless listings), year built, lat/lng, status, HOA fee, annual tax, virtual-tour URL, the primary photo, and an `extracted_features` block (lake_front, hot_tub, basement, furnished, dock, community) keyword-parsed from the description. The raw `description` (PublicRemarks) is omitted by default — pass `include_description: true` to keep it; in most cases the extracted features cover what callers need. OneHome scopes every listing to a group/market — `group_id` defaults to the magic-link session context; pass it explicitly only if you need to query a different group.

輸入參數urlgroup_idlisting_idsaved_search_idinclude_description

onehome_get_property_photos

Full photo gallery for a OneHome listing

Fetch the full media gallery for a OneHome listing. Returns one entry per image with Thumbnail / Medium / Large CDN URLs, dimensions, the listing-room description (LongDescription), and display order. Pass either `listing_id` or a portal URL.

輸入參數urlgroup_idlisting_id

onehome_compare_properties

Compare OneHome listings side-by-side

Fetch 2 or more OneHome listings and align their facts side-by-side. Each target may supply `listing_id` (preferred) or `url` (a portal URL). Returns the full per-property record (with `extracted_features` populated) per row. Per-target errors are captured per-row — one bad target will not fail the whole call. Calls are concurrent. The raw `description` is omitted from each row by default (`include_description: true` to keep it). The redundant `summary` table is also opt-in via `include_summary: true` — by default only `rows[]` is returned, which already carries every fact.

輸入參數viewtargets必填group_idinclude_summaryinclude_description

onehome_bulk_get

Bulk-fetch OneHome listings by id

Fetch up to 200 OneHome listings in a single call. Returns one structured row per input id (no side-by-side summary table — use `onehome_compare_properties` for that). Each row is either `{ listing_id, status: "ok", property }` on success or `{ listing_id, status, error_kind, retryable, error }` on failure (`status` = `error_kind`: `timeout` / `bridge_down` / `pending` are retryable, `protocol` / `other` are real misses) — one bad id never fails the whole call. Calls fan out concurrently against `ListingById`, capped at 6 in flight to avoid swamping the bridge; transient timeouts are retried once per row before being captured as an error. The whole call is bounded by an overall deadline: any row still unsettled comes back `status: "pending"` with a top-level `pending` count — re-run just those ids. The envelope reports `count` / `ok` / `errored`. `extracted_features` is populated per row automatically. The raw `description` (PublicRemarks) is omitted by default — pass `include_description: true` to keep it. `group_id` defaults to the magic-link session context.

輸入參數group_idlisting_ids必填saved_search_idinclude_description

onehome_get_schools

Local-Logic primary + high schools near a lat/lng

Fetch the Local-Logic school data for a coordinate — separate primary and high-school lists, each entry with name, attributes (types/grades/programs/levels), and proximity (walking distance + straight-line distance). Returns an `error` field with HTTP details if the consumer session does not have access (the schools endpoint is sometimes agent-only). lat/lng usually come from `onehome_get_property` (`latitude` / `longitude`).

輸入參數lat必填lng必填language

onehome_get_walk_score

Local-Logic location scores near a lat/lng

Local-Logic location scores for a coordinate — pedestrian / car / cycling / transit friendliness, plus proximity summaries for groceries, restaurants, parks, primary + high schools. Each score is a `{ value, text }` pair (value 0-5, text a one-line description). Returns an `error` field with HTTP details if the upstream rejected the request.

輸入參數lat必填lng必填language

onehome_graphql

Send a raw GraphQL document to services.onehome.com

Power-user escape hatch — send a raw GraphQL document with variables. Returns the whole `{ data, errors, status, url }` envelope, unprojected, so you can read upstream schema errors directly. Note the default: `view` is `compact`, which strips image/avatar URLs out of `data` (every envelope key and every non-media field is kept). Pass `view: 'full'` when you need the envelope byte for byte — worth doing if you are here because a payload is not what you expected, so a missing field is never this server's doing. Operation names live in the portal bundle; common ones include `GetOneHomeUser`, `GetListings`, `GetPins`, `ListingById`, `MediaListingById`, `GetSavedSearches`, `ListingSuggestionsSearch`. (LocalLogic schools/walk-score are REST endpoints, not GraphQL operations — use `onehome_get_schools` / `onehome_get_walk_score`.) Pass `query` (the full document body), an `operation_name` matching the document, and any `variables` as JSON. Read-only: documents containing a `mutation` or `subscription` operation — or that cannot be parsed as a read-only `query` document — are refused.

輸入參數viewquery必填variablesoperation_name必填

onehome_calculate_mortgage

Calculate mortgage payment (local)

Local-only mortgage payment calculator. Returns a full PITI breakdown (principal + interest, property tax, insurance, HOA, PMI) and total interest over the life of the loan. No network call — fully deterministic, safe to use for scenario comparison without burning a fetch. Provide either `down_payment` OR `down_payment_percent`; defaults to 20%. Property tax can be given as `property_tax_annual` or `property_tax_rate` (% of home price). PMI applies automatically when LTV > 80% and `pmi_rate` is provided.

輸入參數pmi_ratehome_price必填hoa_monthlydown_paymentinterest_rate必填loan_term_yearsinsurance_annualproperty_tax_rateproperty_tax_annualdown_payment_percent

onehome_calculate_affordability

Calculate max affordable home price

Solve for the maximum home price you can afford under the standard 28/36 DTI rule. Inputs: monthly income, recurring monthly debts (car loans, student loans, etc.), down payment, interest rate, and optional property-tax rate / insurance / HOA / loan term. Output: max home price, the binding constraint (front-end vs back-end), and the full PITI breakdown at that price. Same math across the realty MCP cohort (@chrischall/realty-core). No network — pure local math.

輸入參數hoa_monthlyback_end_dtidown_payment必填front_end_dtiinterest_rate必填monthly_debtsmonthly_income必填loan_term_yearsinsurance_annualproperty_tax_rate

onehome_healthcheck

Verify OneHome auth + GraphQL reachability

Round-trip a minimal authenticated query through the configured transport. Picks `GetSavedSearchBySearchId` for magic-link consumer-shares (works for them) or `GetOneHomeUser` for agent/registered sessions. Returns the auth mode, token expiry, fetchproxy bridge role (when applicable), elapsed time, and any error detail. Run this first when a tool fails — it isolates "is auth wired up?" from "is the API itself misbehaving?".

無需輸入參數。

onehome_get_by_address

Resolve a OneHome listing by street address

Resolve a free-text street address (with optional city/state/zip) to a OneHome listing's canonical portal URL and id in one call. Walks a 2-rung ladder: (1) `ListingSuggestionsSearch` against the magic-link saved-search scope; (2) when that misses, search-fallback — page-walks the broader saved-search (or raw `listings(groupId)`) pool bounded by the same `groupId` and fuzzy-matches input address tokens. Returns `{ url, listing_id, address, resolved, matched_via }` where `matched_via: "suggestions" | "search_fallback"` reports which rung produced the hit. When no listing matches, returns `{ resolved: false, error: "no listing found" }` rather than throwing. Read-only; safe to call repeatedly.

輸入參數zipcityviewstateaddress必填group_id

onehome_resolve_addresses

Bulk-resolve street addresses to OneHome URLs + listing_ids

Resolve up to 100 structured addresses to OneHome canonical portal URLs + listing OSK ids in one call. Each input is a `{address, city?, state?, zip?}` object. Output preserves input order; one row per input, either `{resolved: true, url, listing_id, address}` or `{resolved: false, error, query}`; a row that failed (rather than genuinely missed) also carries `status` = `error_kind` and `retryable` — `timeout` / `bridge_down` / `pending` mean retry it, not "no listing". The whole call is bounded by an overall deadline; unsettled rows come back `status: "pending"` with a top-level `pending` count. Walks the exact same 2-rung ladder as `onehome_get_by_address` via the shared helper (rung 1: `ListingSuggestionsSearch` against the magic-link saved-search scope; rung 2: search-fallback page-walking the broader saved-search / raw-listings pool bounded by `groupId`) — bulk and single cannot diverge. Each row surfaces `matched_via: "suggestions" | "search_fallback"` so callers see which rung produced the hit. Concurrent fan-out capped at 6 in flight to avoid swamping the upstream. Per-row errors captured — one bad address never fails the whole batch. `group_id` defaults to the magic-link session context. Read-only; safe to call repeatedly.

輸入參數group_idaddresses必填

onehome_set_auth

Register an additional OneHome session at runtime

Provide a magic-link URL, a raw JWT bearer, or an email-token to ADD another authenticated session to the MCP — useful when a buyer holds shares across multiple agents/MLSes (one magic link per share). The MCP detects the input shape (URL → extract `?token=`; 3-segment JWT → use directly; otherwise → treat as email-token and exchange via `/api/authentication/checkToken`), registers a new direct-bearer transport, and marks it active. Previously-registered sessions stay registered — switch back with `onehome_set_active_session(session_id)`, or let MLS-suffix routing (`~CANOPY`, `~HCAOR`, …) pick automatically per listing. The response includes the assigned `session_id`, the new `active_session_id`, the auth_mode/status, the session_context the checkToken response yielded, and a `bearer_fingerprint` of the resolved JWT (first 8 + `…` + last 4 chars) — never the full bearer. SECURITY: the input itself sits in your chat history; treat magic links as short-lived credentials.

輸入參數input必填

onehome_set_active_session

Switch which registered OneHome session is active

Force a specific registered session to be the active one. Useful when MLS-suffix routing picks the wrong session (e.g. two shares in the same MLS, a free-text search across multiple MLSes, or a listing without a `~MLS` suffix). Pass a `session_id` previously returned by `onehome_set_auth` or surfaced in `onehome_get_session_context`. The active session answers any request without a `~MLS`-suffixed listing id AND any `~MLS` request whose MLS matches its own; a `~MLS` id matching several other sessions errors until you pick one here.

輸入參數session_id必填

版本歷史

14
  1. v1.2.1最新Nov 4, 2026
  2. v1.1.10Oct 17, 2026
  3. v1.1.9Oct 16, 2026
  4. v1.1.8Oct 10, 2026
  5. v1.1.7Oct 7, 2026
  6. v1.1.6Oct 5, 2026
  7. v1.1.5Oct 3, 2026
  8. v1.1.4Sep 28, 2026
  9. v1.1.3Sep 25, 2026
  10. v1.1.2Sep 23, 2026
  11. v1.1.1Sep 23, 2026
  12. v1.1.0Sep 20, 2026
  13. v1.0.0Sep 19, 2026
  14. v0.15.7Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分