{
  "markdown": "# onehome-mcp\n\n[![CI](https://github.com/chrischall/onehome-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/chrischall/onehome-mcp/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/onehome-mcp)](https://www.npmjs.com/package/onehome-mcp)\n[![license](https://img.shields.io/npm/l/onehome-mcp)](LICENSE)\n\nMCP server for [OneHome](https://www.onehome.com/) (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.\n\nSister project to [zillow-mcp](https://github.com/chrischall/zillow-mcp), [redfin-mcp](https://github.com/chrischall/redfin-mcp), [compass-mcp](https://github.com/chrischall/compass-mcp), and [homes-mcp](https://github.com/chrischall/homes-mcp). Same tool ergonomics — different upstream auth model.\n\n> This project was developed and is maintained by AI (Claude). Use at your own discretion.\n\n## What's different about OneHome\n\nOneHome 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.\n\nSo 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:\n\n| Mode | How to enable | Notes |\n| --- | --- | --- |\n| `env_token` | `ONEHOME_TOKEN=<jwt>` | Paste the raw bearer from devtools Network panel. Most direct. |\n| `magic_link` | `ONEHOME_MAGIC_LINK=https://portal.onehome.com/...?token=...` | Paste the full URL your agent sent — we extract the `token` param. |\n| `fetchproxy_capture` | (no env) + [fetchproxy extension](https://github.com/chrischall/fetchproxy) installed + signed-in `portal.onehome.com` tab | We wait for your tab to fire any GraphQL request, snapshot the Authorization header, and reuse it. |\n\n## Tools\n\n| Tool | What it does |\n| --- | --- |\n| `onehome_get_user` | Smallest auth probe — returns your OneHome profile (name, email) and the groups your agent shared. |\n| `onehome_get_groups` | List the OneHome \"groups\" your agent has shared with you (each one a market / curated listing bucket). |\n| `onehome_get_saved_search` | Fetch an agent-curated saved search by id — name, filter criteria, polygon, and the OSK listing ids that compose the share. |\n| `onehome_get_saved_search_with_listings` | The \"show me my saved homes\" flow in one round trip — saved search plus its inflated listings. |\n| `onehome_search_properties` | Listings within a group; optionally scoped to a saved search. |\n| `onehome_search_suggestions` | Free-text suggestion search (address, MLS #) across all feeds. |\n| `onehome_get_by_address` | Resolve a single free-text street address to a listing's portal URL + id. |\n| `onehome_resolve_addresses` | Bulk-resolve up to 100 structured addresses to portal URLs + listing ids; concurrent, per-row error capture. |\n| `onehome_get_property` | Full property record by listing id or portal URL. |\n| `onehome_bulk_get` | Fetch up to N listings in one call — one structured row per id, per-row error capture. |\n| `onehome_get_property_photos` | Full media gallery — Thumbnail / Medium / Large variants + room descriptions. |\n| `onehome_compare_properties` | 2-8 listings side-by-side. Per-row error capture; calls are concurrent. |\n| `onehome_get_schools` | Local-Logic primary + high schools near a lat/lng. |\n| `onehome_get_walk_score` | Local-Logic walk / transit / bike / car friendliness scores. |\n| `onehome_graphql` | Power-user escape hatch — send a raw GraphQL document with variables. |\n| `onehome_calculate_mortgage` | Local PITI calculator. Same math as the other realty MCPs. |\n| `onehome_calculate_affordability` | Local 28/36 DTI solver — max home price you can afford. |\n| `onehome_set_auth` | Add another authenticated session at runtime (magic link / JWT / email-token) for buyers holding shares across multiple agents. |\n| `onehome_set_active_session` | Force a specific registered session to be the active one (overrides MLS-suffix routing). |\n| `onehome_get_session_context` | List every registered session — auth mode, token expiry, and the group / saved-search / agent scope each bootstrapped. |\n| `onehome_healthcheck` | End-to-end auth + GraphQL smoke check with token-expiry diagnostics. |\n\n## Install\n\nThe simplest path is the published Claude plugin (`.mcpb` install). For local dev:\n\n```bash\ngit clone https://github.com/chrischall/onehome-mcp\ncd onehome-mcp\nnpm install\nnpm run build\n```\n\nThen point your MCP host at `node /abs/path/to/onehome-mcp/dist/bundle.js` with one of:\n\n```jsonc\n// claude_desktop_config.json\n{\n  \"mcpServers\": {\n    \"onehome-mcp\": {\n      \"command\": \"node\",\n      \"args\": [\"/abs/path/to/onehome-mcp/dist/bundle.js\"],\n      \"env\": {\n        \"ONEHOME_MAGIC_LINK\": \"https://portal.onehome.com/en-US/properties/map?token=eyJ...\"\n      }\n    }\n  }\n}\n```\n\n## Development\n\n```bash\nnpm test               # vitest, mocked transport, no network\nnpm run test:watch\nnpm run test:coverage\nnpx tsc --noEmit\nnpm run build          # tsc --noEmit + esbuild → dist/bundle.js\n```\n\nTests 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.\n\n## License\n\nMIT.\n",
  "bytes": 5692,
  "sha": "ba9026fb5dd7f434599116b6a49dabe788554ea41772c023c6bf16261fa3820d",
  "repo_slug": "chrischall/onehome-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_chrischall_onehome_mcp_b16f4508/readme"
}